From c10edf3198cda970331bdf6b60166aa8fb611888 Mon Sep 17 00:00:00 2001
From: WuKong <rebirthmonkey@gmail.com>
Date: Wed, 15 Jul 2015 18:40:14 +0200
Subject: review core.py

Change-Id: Icbeed742bdaabefe443696003e74b1a6c4587ae3
Signed-off-by: WuKong <rebirthmonkey@gmail.com>
---
 .../keystone/contrib/moon/backends/sql.py          |   90 +-
 keystone-moon/keystone/contrib/moon/controllers.py |  186 +-
 keystone-moon/keystone/contrib/moon/core.py        | 2035 ++++++++++----------
 keystone-moon/keystone/contrib/moon/exception.py   |  134 +-
 keystone-moon/keystone/contrib/moon/routers.py     |  130 +-
 5 files changed, 1289 insertions(+), 1286 deletions(-)

(limited to 'keystone-moon/keystone/contrib')

diff --git a/keystone-moon/keystone/contrib/moon/backends/sql.py b/keystone-moon/keystone/contrib/moon/backends/sql.py
index 35884a93..39b52ce6 100644
--- a/keystone-moon/keystone/contrib/moon/backends/sql.py
+++ b/keystone-moon/keystone/contrib/moon/backends/sql.py
@@ -310,7 +310,7 @@ __all_objects__ = (
 
 class IntraExtensionConnector(IntraExtensionDriver):
 
-    def get_intra_extension_list(self):
+    def get_intra_extension_dict(self):
         with sql.transaction() as session:
             query = session.query(IntraExtension.id)
             intraextensions = query.all()
@@ -334,7 +334,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 raise exception.NotFound
             return ref.to_dict()
 
-    def delete_intra_extension(self, intra_extension_id):
+    def del_intra_extension(self, intra_extension_id):
         with sql.transaction() as session:
             ref = session.query(IntraExtension).get(intra_extension_id)
             # Must delete all references to that IntraExtension
@@ -374,6 +374,8 @@ class IntraExtensionConnector(IntraExtensionDriver):
     def set_description(self, uuid, args):
         raise exception.NotImplemented()  # pragma: no cover
 
+    # Perimeter
+
     def get_subject_dict(self, extension_uuid):
         with sql.transaction() as session:
             query = session.query(Subject)
@@ -426,7 +428,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def remove_subject(self, extension_uuid, subject_uuid):
+    def del_subject(self, extension_uuid, subject_uuid):
         with sql.transaction() as session:
             query = session.query(Subject)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -504,7 +506,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def remove_object(self, extension_uuid, object_uuid):
+    def del_object(self, extension_uuid, object_uuid):
         with sql.transaction() as session:
             query = session.query(Object)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -582,7 +584,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def remove_action(self, extension_uuid, action_uuid):
+    def del_action(self, extension_uuid, action_uuid):
         with sql.transaction() as session:
             query = session.query(Action)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -640,7 +642,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def add_subject_category_dict(self, extension_uuid, subject_category_uuid, subject_category_name):
+    def add_subject_category(self, extension_uuid, subject_category_uuid, subject_category_name):
         with sql.transaction() as session:
             query = session.query(SubjectCategory)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -662,7 +664,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def remove_subject_category(self, extension_uuid, subject_category_uuid):
+    def del_subject_category(self, extension_uuid, subject_category_uuid):
         with sql.transaction() as session:
             query = session.query(SubjectCategory)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -721,7 +723,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def add_object_category_dict(self, extension_uuid, object_category_uuid, object_category_name):
+    def add_object_category(self, extension_uuid, object_category_uuid, object_category_name):
         with sql.transaction() as session:
             query = session.query(ObjectCategory)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -743,7 +745,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def remove_object_category(self, extension_uuid, object_category_uuid):
+    def del_object_category(self, extension_uuid, object_category_uuid):
         with sql.transaction() as session:
             query = session.query(ObjectCategory)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -802,7 +804,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def add_action_category_dict(self, extension_uuid, action_category_uuid, action_category_name):
+    def add_action_category(self, extension_uuid, action_category_uuid, action_category_name):
         with sql.transaction() as session:
             query = session.query(ActionCategory)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -824,7 +826,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def remove_action_category(self, extension_uuid, action_category_uuid):
+    def del_action_category(self, extension_uuid, action_category_uuid):
         with sql.transaction() as session:
             query = session.query(ActionCategory)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -865,7 +867,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 raise SubjectScopeUnknown()
             return result
 
-    def set_subject_category_scope_dict(self, extension_uuid, subject_category, scope):
+    def set_subject_scope_dict(self, extension_uuid, subject_category, scope):
         with sql.transaction() as session:
             query = session.query(SubjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -887,7 +889,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 session.add(new_ref)
             return new_ref.to_dict()
 
-    def add_subject_category_scope_dict(self, extension_uuid, subject_category, scope_uuid, scope_name):
+    def add_subject_scope(self, extension_uuid, subject_category, scope_uuid, scope_name):
         with sql.transaction() as session:
             query = session.query(SubjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -899,9 +901,9 @@ class IntraExtensionConnector(IntraExtensionDriver):
             if subject_category not in scope.keys():
                 scope[subject_category] = dict()
             scope[subject_category][scope_uuid] = scope_name
-            return self.set_subject_category_scope_dict(extension_uuid, subject_category, scope[subject_category])
+            return self.set_subject_scope_dict(extension_uuid, subject_category, scope[subject_category])
 
-    def remove_subject_category_scope_dict(self, extension_uuid, subject_category, scope_uuid):
+    def del_subject_scope(self, extension_uuid, subject_category, scope_uuid):
         with sql.transaction() as session:
             query = session.query(SubjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -930,7 +932,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
 
     # Getter and Setter for object_category_scope
 
-    def get_object_category_scope_dict(self, extension_uuid, object_category):
+    def get_object_scope_dict(self, extension_uuid, object_category):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -942,7 +944,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 raise ObjectScopeUnknown()
             return result
 
-    def set_object_category_scope_dict(self, extension_uuid, object_category, scope):
+    def set_object_scope_dict(self, extension_uuid, object_category, scope):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -964,7 +966,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 session.add(new_ref)
             return new_ref.to_dict()
 
-    def add_object_category_scope_dict(self, extension_uuid, object_category, scope_uuid, scope_name):
+    def add_object_scope(self, extension_uuid, object_category, scope_uuid, scope_name):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -976,9 +978,9 @@ class IntraExtensionConnector(IntraExtensionDriver):
             if object_category not in scope:
                 scope[object_category] = dict()
             scope[object_category][scope_uuid] = scope_name
-            return self.set_object_category_scope_dict(extension_uuid, object_category, scope[object_category])
+            return self.set_object_scope_dict(extension_uuid, object_category, scope[object_category])
 
-    def remove_object_category_scope_dict(self, extension_uuid, object_category, scope_uuid):
+    def del_object_scope(self, extension_uuid, object_category, scope_uuid):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1007,7 +1009,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
 
     # Getter and Setter for action_category_scope
  
-    def get_action_category_scope_dict(self, extension_uuid, action_category):
+    def get_action_scope_dict(self, extension_uuid, action_category):
         with sql.transaction() as session:
             query = session.query(ActionCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1019,7 +1021,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 raise ActionScopeUnknown()
             return result
 
-    def set_action_category_scope_dict(self, extension_uuid, action_category, scope):
+    def set_action_scope_dict(self, extension_uuid, action_category, scope):
         with sql.transaction() as session:
             query = session.query(ActionCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1041,7 +1043,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 session.add(new_ref)
             return new_ref.to_dict()
 
-    def add_action_category_scope_dict(self, extension_uuid, action_category, scope_uuid, scope_name):
+    def add_action_scope(self, extension_uuid, action_category, scope_uuid, scope_name):
         with sql.transaction() as session:
             query = session.query(ActionCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1053,9 +1055,9 @@ class IntraExtensionConnector(IntraExtensionDriver):
             if action_category not in scope:
                 scope[action_category] = dict()
             scope[action_category][scope_uuid] = scope_name
-            return self.set_action_category_scope_dict(extension_uuid, action_category, scope[action_category])
+            return self.set_action_scope_dict(extension_uuid, action_category, scope[action_category])
 
-    def remove_action_category_scope_dict(self, extension_uuid, action_category, scope_uuid):
+    def del_action_scope(self, extension_uuid, action_category, scope_uuid):
         with sql.transaction() as session:
             query = session.query(ActionCategoryScope)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1084,7 +1086,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
 
     # Getter and Setter for subject_category_assignment
 
-    def get_subject_category_assignment_dict(self, extension_uuid, subject_uuid):
+    def get_subject_assignment_dict(self, extension_uuid, subject_uuid):
         """ From a subject_uuid, return a dictionary of (category: scope for that subject)
 
         :param extension_uuid: intra extension UUID
@@ -1107,7 +1109,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 _ref["subject_category_assignments"][subject_uuid] = dict()
             return _ref
 
-    def set_subject_category_assignment_dict(self, extension_uuid, subject_uuid=None, assignment_dict={}):
+    def set_subject_assignment_dict(self, extension_uuid, subject_uuid=None, assignment_dict={}):
         with sql.transaction() as session:
             query = session.query(SubjectCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1138,7 +1140,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def add_subject_category_assignment_dict(self, extension_uuid, subject_uuid, category_uuid, scope_uuid):
+    def add_subject_assignment(self, extension_uuid, subject_uuid, category_uuid, scope_uuid):
         with sql.transaction() as session:
             query = session.query(SubjectCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1152,12 +1154,12 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 assignments[subject_uuid][category_uuid] = list()
             if scope_uuid not in assignments[subject_uuid][category_uuid]:
                 assignments[subject_uuid][category_uuid].append(scope_uuid)
-            return self.set_subject_category_assignment_dict(
+            return self.set_subject_assignment_dict(
                 extension_uuid,
                 subject_uuid,
                 assignments[subject_uuid])
 
-    def remove_subject_category_assignment(self, extension_uuid, subject_uuid, category_uuid, scope_uuid):
+    def del_subject_assignment(self, extension_uuid, subject_uuid, category_uuid, scope_uuid):
         with sql.transaction() as session:
             query = session.query(SubjectCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1173,19 +1175,19 @@ class IntraExtensionConnector(IntraExtensionDriver):
                     if not old_ref["subject_category_assignments"][subject_uuid]:
                         old_ref["subject_category_assignments"].pop(subject_uuid)
             try:
-                self.set_subject_category_assignment_dict(
+                self.set_subject_assignment_dict(
                     extension_uuid,
                     subject_uuid,
                     old_ref["subject_category_assignments"][subject_uuid])
             except KeyError:
-                self.set_subject_category_assignment_dict(
+                self.set_subject_assignment_dict(
                     extension_uuid,
                     subject_uuid,
                     {})
 
     # Getter and Setter for object_category_assignment
 
-    def get_object_category_assignment_dict(self, extension_uuid, object_uuid):
+    def get_object_assignment_dict(self, extension_uuid, object_uuid):
         """ From a object_uuid, return a dictionary of (category: scope for that object)
 
         :param extension_uuid: intra extension UUID
@@ -1208,7 +1210,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 _ref["object_category_assignments"][object_uuid] = dict()
             return _ref
 
-    def set_object_category_assignment_dict(self, extension_uuid, object_uuid=None, assignment_dict={}):
+    def set_object_assignment_dict(self, extension_uuid, object_uuid=None, assignment_dict={}):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1235,7 +1237,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def add_object_category_assignment_dict(self, extension_uuid, object_uuid, category_uuid, scope_uuid):
+    def add_object_assignment(self, extension_uuid, object_uuid, category_uuid, scope_uuid):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1249,12 +1251,12 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 assignments[object_uuid][category_uuid] = list()
             if scope_uuid not in assignments[object_uuid][category_uuid]:
                 assignments[object_uuid][category_uuid].append(scope_uuid)
-            return self.set_object_category_assignment_dict(
+            return self.set_object_assignment_dict(
                 extension_uuid,
                 object_uuid,
                 assignments[object_uuid])
 
-    def remove_object_category_assignment(self, extension_uuid, object_uuid, category_uuid, scope_uuid):
+    def del_object_assignment(self, extension_uuid, object_uuid, category_uuid, scope_uuid):
         with sql.transaction() as session:
             query = session.query(ObjectCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1269,14 +1271,14 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         old_ref["object_category_assignments"][object_uuid].pop(category_uuid)
                     if not old_ref["object_category_assignments"][object_uuid]:
                         old_ref["object_category_assignments"].pop(object_uuid)
-            self.set_object_category_assignment_dict(
+            self.set_object_assignment_dict(
                 extension_uuid,
                 object_uuid,
                 old_ref["object_category_assignments"][object_uuid])
 
     # Getter and Setter for action_category_assignment
 
-    def get_action_category_assignment_dict(self, extension_uuid, action_uuid):
+    def get_action_assignment_dict(self, extension_uuid, action_uuid):
         """ From a action_uuid, return a dictionary of (category: scope for that action)
 
         :param extension_uuid: intra extension UUID
@@ -1299,7 +1301,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 _ref["action_category_assignments"][action_uuid] = dict()
             return _ref
 
-    def set_action_category_assignment_dict(self, extension_uuid, action_uuid=None, assignment_dict={}):
+    def set_action_assignment_dict(self, extension_uuid, action_uuid=None, assignment_dict={}):
         with sql.transaction() as session:
             query = session.query(ActionCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1326,7 +1328,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         setattr(ref, attr, getattr(new_ref, attr))
             return ref.to_dict()
 
-    def add_action_category_assignment_dict(self, extension_uuid, action_uuid, category_uuid, scope_uuid):
+    def add_action_assignment(self, extension_uuid, action_uuid, category_uuid, scope_uuid):
         with sql.transaction() as session:
             query = session.query(ActionCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1340,12 +1342,12 @@ class IntraExtensionConnector(IntraExtensionDriver):
                 assignments[action_uuid][category_uuid] = list()
             if scope_uuid not in assignments[action_uuid][category_uuid]:
                 assignments[action_uuid][category_uuid].append(scope_uuid)
-            return self.set_action_category_assignment_dict(
+            return self.set_action_assignment_dict(
                 extension_uuid,
                 action_uuid,
                 assignments[action_uuid])
 
-    def remove_action_category_assignment(self, extension_uuid, action_uuid, category_uuid, scope_uuid):
+    def del_action_assignment(self, extension_uuid, action_uuid, category_uuid, scope_uuid):
         with sql.transaction() as session:
             query = session.query(ActionCategoryAssignment)
             query = query.filter_by(intra_extension_uuid=extension_uuid)
@@ -1360,7 +1362,7 @@ class IntraExtensionConnector(IntraExtensionDriver):
                         old_ref["action_category_assignments"][action_uuid].pop(category_uuid)
                     if not old_ref["action_category_assignments"][action_uuid]:
                         old_ref["action_category_assignments"].pop(action_uuid)
-            self.set_action_category_assignment_dict(
+            self.set_action_assignment_dict(
                 extension_uuid,
                 action_uuid,
                 old_ref["action_category_assignments"][action_uuid])
diff --git a/keystone-moon/keystone/contrib/moon/controllers.py b/keystone-moon/keystone/contrib/moon/controllers.py
index a514fcd4..592aa699 100644
--- a/keystone-moon/keystone/contrib/moon/controllers.py
+++ b/keystone-moon/keystone/contrib/moon/controllers.py
@@ -246,7 +246,7 @@ class IntraExtensions(controller.V3Controller):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get('intra_extension_id', None)
         action_category_name = kw["action_category_name"]
-        return self.admin_api.add_action_category_dict(user_id, ie_id, action_category_name)
+        return self.admin_api.add_action_category(user_id, ie_id, action_category_name)
 
     @controller.protected()
     def get_action_category(self, context, **kw):
@@ -274,7 +274,7 @@ class IntraExtensions(controller.V3Controller):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get('intra_extension_id', None)
         subject_name = kw["subject_name"]
-        return self.admin_api.add_subject_dict(user_id, ie_id, subject_name)
+        return self.admin_api.add_subject(user_id, ie_id, subject_name)
 
     @controller.protected()
     def get_subject(self, context, **kw):
@@ -301,7 +301,7 @@ class IntraExtensions(controller.V3Controller):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         object_name = kw["object_name"]
-        return self.admin_api.add_object_dict(user_id, ie_id, object_name)
+        return self.admin_api.add_object(user_id, ie_id, object_name)
 
     @controller.protected()
     def get_object(self, context, **kw):
@@ -328,7 +328,7 @@ class IntraExtensions(controller.V3Controller):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_name = kw["action_name"]
-        return self.admin_api.add_action_dict(user_id, ie_id, action_name)
+        return self.admin_api.add_action(user_id, ie_id, action_name)
 
     @controller.protected()
     def get_action(self, context, **kw):
@@ -346,121 +346,121 @@ class IntraExtensions(controller.V3Controller):
 
     # Scope functions
     @controller.protected()
-    def get_subject_category_scopes(self, context, **kw):
+    def get_subject_scopes(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         subject_category_id = kw["subject_category_id"]
-        return self.admin_api.get_subject_category_scope_dict(user_id, ie_id, subject_category_id)
+        return self.admin_api.get_subject_scope_dict(user_id, ie_id, subject_category_id)
 
     @controller.protected()
-    def add_subject_category_scope(self, context, **kw):
+    def add_subject_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         subject_category_id = kw["subject_category_id"]
-        subject_category_scope_name = kw["subject_category_scope_name"]
-        return self.admin_api.add_subject_category_scope_dict(
+        subject_scope_name = kw["subject_scope_name"]
+        return self.admin_api.add_subject_scope(
             user_id,
             ie_id,
             subject_category_id,
-            subject_category_scope_name)
+            subject_scope_name)
 
     @controller.protected()
-    def get_subject_category_scope(self, context, **kw):
+    def get_subject_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         subject_category_id = kw["subject_category_id"]
-        subject_category_scope_id = kw["subject_category_scope_id"]
-        return self.admin_api.get_subject_category_scope_dict(user_id, ie_id, subject_category_id)[subject_category_scope_id]
+        subject_scope_id = kw["subject_scope_id"]
+        return self.admin_api.get_subject_scope(user_id, ie_id, subject_category_id, subject_scope_id)
 
     @controller.protected()
-    def del_subject_category_scope(self, context, **kw):
+    def del_subject_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         subject_category_id = kw["subject_category_id"]
-        subject_category_scope_id = kw["subject_category_scope_id"]
-        return self.admin_api.del_subject_category_scope(
+        subject_scope_id = kw["subject_scope_id"]
+        return self.admin_api.del_subject_scope(
             user_id,
             ie_id,
             subject_category_id,
-            subject_category_scope_id)
+            subject_scope_id)
 
     @controller.protected()
-    def get_object_category_scopes(self, context, **kw):
+    def get_object_scopes(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         object_category_id = kw["object_category_id"]
-        return self.admin_api.get_object_category_scope_dict(user_id, ie_id, object_category_id)
+        return self.admin_api.get_object_scope_dict(user_id, ie_id, object_category_id)
 
     @controller.protected()
-    def add_object_category_scope(self, context, **kw):
+    def add_object_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         object_category_id = kw["object_category_id"]
-        object_category_scope_name = kw["object_category_scope_name"]
-        return self.admin_api.add_object_category_scope_dict(
+        object_scope_name = kw["object_scope_name"]
+        return self.admin_api.add_object_scope(
             user_id,
             ie_id,
             object_category_id,
-            object_category_scope_name)
+            object_scope_name)
 
     @controller.protected()
-    def get_object_category_scope(self, context, **kw):
+    def get_object_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         object_category_id = kw["object_category_id"]
-        object_category_scope_id = kw["object_category_scope_id"]
-        return self.admin_api.get_object_category_scope_dict(user_id, ie_id, object_category_id)[object_category_scope_id]
+        object_scope_id = kw["object_scope_id"]
+        return self.admin_api.get_object_category_scope(user_id, ie_id, object_category_id, object_scope_id)
 
     @controller.protected()
-    def del_object_category_scope(self, context, **kw):
+    def del_object_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         object_category_id = kw["object_category_id"]
-        object_category_scope_id = kw["object_category_scope_id"]
-        return self.admin_api.del_object_category_scope(
+        object_scope_id = kw["object_scope_id"]
+        return self.admin_api.del_object_scope(
             user_id,
             ie_id,
             object_category_id,
-            object_category_scope_id)
+            object_scope_id)
 
     @controller.protected()
-    def get_action_category_scopes(self, context, **kw):
+    def get_action_scopes(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_category_id = kw["action_category_id"]
-        return self.admin_api.get_action_category_scope_dict(user_id, ie_id, action_category_id)
+        return self.admin_api.get_action_scope_dict(user_id, ie_id, action_category_id)
 
     @controller.protected()
-    def add_action_category_scope(self, context, **kw):
+    def add_action_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_category_id = kw["action_category_id"]
-        action_category_scope_name = kw["action_category_scope_name"]
-        return self.admin_api.add_action_category_scope_dict(
+        action_scope_name = kw["action_scope_name"]
+        return self.admin_api.add_action_scope(
             user_id,
             ie_id,
             action_category_id,
-            action_category_scope_name)
+            action_scope_name)
 
     @controller.protected()
-    def get_action_category_scope(self, context, **kw):
+    def get_action_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_category_id = kw["action_category_id"]
-        action_category_scope_id = kw["action_category_scope_id"]
-        return self.admin_api.get_action_category_scope_dict(user_id, ie_id, action_category_id)[action_category_scope_id]
+        action_scope_id = kw["action_scope_id"]
+        return self.admin_api.get_action_scope_dict(user_id, ie_id, action_category_id)[action_scope_id]
 
     @controller.protected()
-    def del_action_category_scope(self, context, **kw):
+    def del_action_scope(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_category_id = kw["action_category_id"]
-        action_category_scope_id = kw["action_category_scope_id"]
-        return self.admin_api.del_action_category_scope(
+        action_scope_id = kw["action_scope_id"]
+        return self.admin_api.del_action_scope(
             user_id,
             ie_id,
             action_category_id,
-            action_category_scope_id)
+            action_scope_id)
 
     # Assignment functions
     @controller.protected()
@@ -468,7 +468,7 @@ class IntraExtensions(controller.V3Controller):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         subject_id = kw["subject_id"]
-        return self.admin_api.get_subject_category_assignment_dict(user_id, ie_id, subject_id)
+        return self.admin_api.get_subject_assignment_dict(user_id, ie_id, subject_id)
 
     @controller.protected()
     def add_subject_assignment(self, context, **kw):
@@ -476,13 +476,13 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         subject_id = kw["subject_id"]
         subject_category_id = kw["subject_category_id"]
-        subject_category_scope_id = kw["subject_category_scope_id"]
-        return self.admin_api.add_subject_category_assignment(
+        subject_scope_id = kw["subject_scope_id"]
+        return self.admin_api.add_subject_assignment(
             user_id,
             ie_id,
             subject_id,
             subject_category_id,
-            subject_category_scope_id)
+            subject_scope_id)
 
     @controller.protected()
     def get_subject_assignment(self, context, **kw):
@@ -490,7 +490,7 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         subject_id = kw["subject_id"]
         subject_category_id = kw["subject_category_id"]
-        return self.admin_api.get_subject_category_assignment_dict(user_id, ie_id, subject_id)[subject_category_id]
+        return self.admin_api.get_subject_assignment_dict(user_id, ie_id, subject_id)[subject_category_id]
 
     @controller.protected()
     def del_subject_assignment(self, context, **kw):
@@ -498,20 +498,20 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         subject_id = kw["subject_id"]
         subject_category_id = kw["subject_category_id"]
-        subject_category_scope_id = kw["subject_category_scope_id"]
-        return self.admin_api.del_subject_category_assignment(
+        subject_scope_id = kw["subject_scope_id"]
+        return self.admin_api.del_subject_assignment(
             user_id,
             ie_id,
             subject_id,
             subject_category_id,
-            subject_category_scope_id)
+            subject_scope_id)
 
     @controller.protected()
     def get_object_assignments(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         object_id = kw["object_id"]
-        return self.admin_api.get_object_category_assignment_dict(user_id, ie_id, object_id)
+        return self.admin_api.get_object_assignment_dict(user_id, ie_id, object_id)
 
     @controller.protected()
     def add_object_assignment(self, context, **kw):
@@ -519,13 +519,13 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         object_id = kw["object_id"]
         object_category_id = kw["object_category_id"]
-        object_category_scope_id = kw["object_category_scope_id"]
-        return self.admin_api.add_object_category_assignment(
+        object_scope_id = kw["object_scope_id"]
+        return self.admin_api.add_objecty_assignment(
             user_id,
             ie_id,
             object_id,
             object_category_id,
-            object_category_scope_id)
+            object_scope_id)
 
     @controller.protected()
     def get_object_assignment(self, context, **kw):
@@ -533,7 +533,7 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         object_id = kw["object_id"]
         object_category_id = kw["object_category_id"]
-        return self.admin_api.get_object_category_assignment_dict(user_id, ie_id, object_id)[object_category_id]
+        return self.admin_api.get_object_assignment_dict(user_id, ie_id, object_id, object_category_id)
 
     @controller.protected()
     def del_object_assignment(self, context, **kw):
@@ -541,34 +541,34 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         object_id = kw["object_id"]
         object_category_id = kw["object_category_id"]
-        object_category_scope_id = kw["object_category_scope_id"]
-        return self.admin_api.del_object_category_assignment(
+        object_scope_id = kw["object_scope_id"]
+        return self.admin_api.del_object_assignment(
             user_id,
             ie_id,
             object_id,
             object_category_id,
-            object_category_scope_id)
+            object_scope_id)
 
     @controller.protected()
     def get_action_assignments(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_id = kw["action_id"]
-        return self.admin_api.get_action_category_assignment_dict(user_id, ie_id, action_id)
+        return self.admin_api.get_action_assignment_dict(user_id, ie_id, action_id)
 
     @controller.protected()
     def add_action_assignment(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         action_id = kw["action_id"]
-        action_category_id = kw["action_category"]
-        action_category_scope_id = kw["action_category_scope"]
-        return self.admin_api.add_action_category_assignment(
+        action_category_id = kw["action_category_id"]
+        action_scope_id = kw["action_scope_id"]
+        return self.admin_api.add_action_assignment(
             user_id,
             ie_id,
             action_id,
             action_category_id,
-            action_category_scope_id)
+            action_scope_id)
 
     @controller.protected()
     def get_action_assignment(self, context, **kw):
@@ -576,7 +576,7 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         action_id = kw["action_id"]
         action_category_id = kw["action_category_id"]
-        return self.admin_api.del_object_category_assignment_dict(user_id, ie_id, action_id)[action_category_id]
+        return self.admin_api.get_action_assignment_dict(user_id, ie_id, action_id, action_category_id)
 
     @controller.protected()
     def del_action_assignment(self, context, **kw):
@@ -584,13 +584,13 @@ class IntraExtensions(controller.V3Controller):
         ie_id = kw.get("intra_extension_id", None)
         action_id = kw["action_id"]
         action_category_id = kw["action_category_id"]
-        action_category_scope_id = kw["action_category_scope_id"]
-        return self.admin_api.del_object_category_assignment(
+        action_scope_id = kw["action_scope_id"]
+        return self.admin_api.del_action_assignment(
             user_id,
             ie_id,
             action_id,
             action_category_id,
-            action_category_scope_id)
+            action_scope_id)
 
     # Metarule functions
     @controller.protected()
@@ -629,32 +629,35 @@ class IntraExtensions(controller.V3Controller):
     def add_sub_meta_rule(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
-        sub_meta_rule_dict = dict()
-        sub_meta_rule_dict['subject_categories'] = kw["subject_categories"]
-        sub_meta_rule_dict['object_categories'] = kw["object_categories"]
-        sub_meta_rule_dict['action_categories'] = kw["action_categories"]
-        sub_meta_rule_dict['aggregation_algorithm_id'] = kw["aggregation_algorithm_id"]
+        sub_meta_rule_name = kw["sub_meta_rule_name"]
+        subject_category_list = kw["subject_categories"]
+        object_category_list = kw["object_categories"]
+        action_category_list = kw["action_categories"]
+        sub_meta_rule_algorithm = kw["sub_meta_rule_algorithm"]
+
         return self.admin_api.add_sub_meta_rule_dict(
             user_id,
             ie_id,
-            sub_meta_rule_dict)
+            sub_meta_rule_name,
+            subject_category_list,
+            object_category_list,
+            action_category_list,
+            sub_meta_rule_algorithm
+        )
 
     @controller.protected()
     def get_sub_meta_rule(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
         sub_meta_rule_id = kw["sub_meta_rule_id"]
-        return self.admin_api.get_sub_meta_rule_dict(user_id, ie_id)[sub_meta_rule_id]
+        return self.admin_api.get_sub_meta_rule(user_id, ie_id, sub_meta_rule_id)
 
     @controller.protected()
     def del_sub_meta_rule(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
-        ie_id = kw.pop("intra_extension_id")
+        ie_id = kw.get("intra_extension_id")
         sub_meta_rule_id = kw["sub_meta_rule_id"]
-        return self.admin_api.del_sub_meta_rule(
-            user_id,
-            ie_id,
-            sub_meta_rule_id)
+        return self.admin_api.del_sub_meta_rule(user_id, ie_id, sub_meta_rule_id)
 
     # Rules functions
     @controller.protected()
@@ -668,28 +671,21 @@ class IntraExtensions(controller.V3Controller):
     def add_rule(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
-        sub_meta_rule_id = kw["sub_meta_rule_id"]
-
+        sub_meta_rule_id = kw.get("sub_meta_rule_id")
         rule_list = list()
-        subject_categories_dict = kw['subject_categories']
-        for _subject_category in subject_categories_dict:
-            rule_list.append(subject_categories_dict[_subject_category])
-        action_categories_dict = kw['action_categories']
-        for _action_category in action_categories_dict:
-            rule_list.append(action_categories_dict[_action_category])
-        object_categories_dict = kw['object_categories']
-        for _object_category in object_categories_dict:
-            rule_list.append(object_categories_dict[_object_category])
-
+        subject_category_list = kw.get('subject_categories')
+        object_category_list = kw.get('object_categories')
+        action_category_list = kw.get('action_categories')
+        rule_list = subject_category_list + object_category_list + action_category_list
         return self.admin_api.add_rule_list(user_id, ie_id, sub_meta_rule_id, rule_list)
 
     @controller.protected()
     def get_rule(self, context, **kw):
         user_id = self._get_user_id_from_token(context["token_id"])
         ie_id = kw.get("intra_extension_id", None)
-        sub_meta_rule_id = kw["sub_meta_rule_id"]
-        rule_id = kw["rule_id"]
-        return self.admin_api.get_rule_dict(user_id, ie_id, sub_meta_rule_id)[rule_id]
+        sub_meta_rule_id = kw.get("sub_meta_rule_id")
+        rule_id = kw.get("rule_id")
+        return self.admin_api.get_rule(user_id, ie_id, sub_meta_rule_id, rule_id)
 
     @controller.protected()
     def del_rule(self, context, **kw):
diff --git a/keystone-moon/keystone/contrib/moon/core.py b/keystone-moon/keystone/contrib/moon/core.py
index d5d2e100..205f7a7b 100644
--- a/keystone-moon/keystone/contrib/moon/core.py
+++ b/keystone-moon/keystone/contrib/moon/core.py
@@ -24,6 +24,8 @@ from keystone.contrib.moon.algorithms import *
 
 CONF = config.CONF
 LOG = log.getLogger(__name__)
+DEFAULT_USER = uuid4().hex()  # default user_id for internal invocation
+
 
 _OPTS = [
     cfg.StrOpt('configuration_driver',
@@ -254,7 +256,7 @@ class TenantManager(manager.Manager):
                 return tenant_id
         return None
 
-    def get_tenant_intra_extension_id(self, tenant_id, genre="authz"):
+    def get_tenant_intra_extension_id(self, user_id, tenant_id, genre="authz"):
         """
         Return the UUID of the scoped extension for a particular tenant.
         :param tenant_id: UUID of the tenant
@@ -262,6 +264,7 @@ class TenantManager(manager.Manager):
         :return (str): the UUID of the scoped extension
         """
         # 1 tenant only with 1 authz extension and 1 admin extension
+        # TODO: check user right with user_id in SuperExtension
         tenant_dict = self.__get_tenant_dict()
         if tenant_id not in tenant_dict:
             raise TenantIDNotFound(_("Tenant UUID ({}) was not found.".format(tenant_id)))
@@ -298,11 +301,10 @@ class TenantManager(manager.Manager):
             authz_extension_uuid)))
 
 
-@dependency.requires('identity_api', 'tenant_api', 'authz_api', 'admin_api', 'moonlog_api')
+@dependency.requires('identity_api', 'tenant_api', 'configuration_api', 'authz_api', 'admin_api', 'moonlog_api')
 class IntraExtensionManager(manager.Manager):
 
     __genre__ = None
-    __default_user = uuid4().hex()  # default user_id for internal invocation
 
     def __init__(self):
         driver = CONF.moon.intraextension_driver
@@ -329,46 +331,47 @@ class IntraExtensionManager(manager.Manager):
         }
         """
 
+        # TODO(dthom) move exception raise to driver
         if not self.driver.get_intra_extension(intra_extension_id):
             raise IntraExtensionNotFound()
 
-        _authz_buffer = dict()
-        _authz_buffer['subject_id'] = subject_id
-        _authz_buffer['object_id'] = object_id
-        _authz_buffer['action_id'] = action_id
+        authz_buffer = dict()
+        authz_buffer['subject_id'] = subject_id
+        authz_buffer['object_id'] = object_id
+        authz_buffer['action_id'] = action_id
 
-        _meta_data_dict = {}
-        _meta_data_dict["subject_categories"] = self.driver.get_subject_category_dict(intra_extension_id)["subject_categories"]
-        _meta_data_dict["object_categories"] = self.driver.get_object_category_dict(intra_extension_id)["object_categories"]
-        _meta_data_dict["action_categories"] = self.driver.get_action_category_dict(intra_extension_id)["action_categories"]
+        meta_data_dict = {}
+        meta_data_dict["subject_categories"] = self.driver.get_subject_category_dict(intra_extension_id)["subject_categories"]
+        meta_data_dict["object_categories"] = self.driver.get_object_category_dict(intra_extension_id)["object_categories"]
+        meta_data_dict["action_categories"] = self.driver.get_action_category_dict(intra_extension_id)["action_categories"]
 
-        _subject_assignment_dict = dict()
-        for category in _meta_data_dict["subject_categories"]:
-            _subject_assignment_dict[category] = self.driver.get_subject_category_assignment_dict(
+        subject_assignment_dict = dict()
+        for category in meta_data_dict["subject_categories"]:
+            subject_assignment_dict[category] = self.driver.get_subject_assignment_dict(
                 intra_extension_id, category)["subject_category_assignments"]
 
-        _object_assignment_dict = dict()
-        for category in _meta_data_dict["object_categories"]:
-            _object_assignment_dict[category] = self.driver.get_object_category_assignment_dict(
+        object_assignment_dict = dict()
+        for category in meta_data_dict["object_categories"]:
+            object_assignment_dict[category] = self.driver.get_object_assignment_dict(
                 intra_extension_id, category)["object_category_assignments"]
 
-        _action_assignment_dict = dict()
-        for category in _meta_data_dict["action_categories"]:
-            _action_assignment_dict[category] = self.driver.get_action_category_assignment_dict(
+        action_assignment_dict = dict()
+        for category in meta_data_dict["action_categories"]:
+            action_assignment_dict[category] = self.driver.get_action_assignment_dict(
                 intra_extension_id, category)["action_category_assignments"]
 
-        _authz_buffer['subject_attributes'] = dict()
-        _authz_buffer['object_attributes'] = dict()
-        _authz_buffer['action_attributes'] = dict()
+        authz_buffer['subject_attributes'] = dict()
+        authz_buffer['object_attributes'] = dict()
+        authz_buffer['action_attributes'] = dict()
 
-        for _subject_category in _meta_data_dict['subject_categories']:
-            _authz_buffer['subject_attributes'][_subject_category] = _subject_assignment_dict[_subject_category]
-        for _object_category in _meta_data_dict['object_categories']:
-            _authz_buffer['object_attributes'][_object_category] = _object_assignment_dict[_object_category]
-        for _action_category in _meta_data_dict['action_categories']:
-            _authz_buffer['action_attributes'][_action_category] = _action_assignment_dict[_action_category]
+        for _subject_category in meta_data_dict['subject_categories']:
+            authz_buffer['subject_attributes'][_subject_category] = subject_assignment_dict[_subject_category]
+        for _object_category in meta_data_dict['object_categories']:
+            authz_buffer['object_attributes'][_object_category] = object_assignment_dict[_object_category]
+        for _action_category in meta_data_dict['action_categories']:
+            authz_buffer['action_attributes'][_action_category] = action_assignment_dict[_action_category]
 
-        return _authz_buffer
+        return authz_buffer
 
     def authz(self, intra_extension_id, subject_id, object_id, action_id):
         """Check authorization for a particular action.
@@ -388,71 +391,40 @@ class IntraExtensionManager(manager.Manager):
             ActionCategoryAssignmentUnknown
         """
 
-        _authz_buffer = self.__get_authz_buffer(intra_extension_id, subject_id, object_id, action_id)
-        _decision_buffer = dict()
+        authz_buffer = self.__get_authz_buffer(intra_extension_id, subject_id, object_id, action_id)
+        decision_buffer = dict()
 
-        _meta_rule_dict = self.driver.get_meta_rule_dict(intra_extension_id)
-        _rule_dict = self.driver.get_rule_dict(intra_extension_id)
+        meta_rule_dict = self.driver.get_meta_rule_dict(intra_extension_id)
+        rule_dict = self.driver.get_rule_dict(intra_extension_id)
 
-        for _rule in _meta_rule_dict['sub_meta_rules']:
-            if _meta_rule_dict['sub_meta_rules'][_rule]['algorithm'] == 'inclusion':
-                _decision_buffer[_rule] = algo_inclusion(
-                    _authz_buffer,
-                    _meta_rule_dict['sub_meta_rules'][_rule],
-                    _rule_dict['rules'][_rule])
-            elif _meta_rule_dict['sub_meta_rules'][_rule]['algorithm'] == 'comparison':
-                _decision_buffer[_rule] = algo_comparison(
-                    _authz_buffer,
-                    _meta_rule_dict['sub_meta_rules'][_rule],
-                    _rule_dict['rules'][_rule])
+        for _rule in meta_rule_dict['sub_meta_rules']:
+            if meta_rule_dict['sub_meta_rules'][_rule]['algorithm'] == 'inclusion':
+                decision_buffer[_rule] = inclusion(
+                    authz_buffer,
+                    meta_rule_dict['sub_meta_rules'][_rule],
+                    rule_dict['rules'][_rule])
+            elif meta_rule_dict['sub_meta_rules'][_rule]['algorithm'] == 'comparison':
+                decision_buffer[_rule] = comparison(
+                    authz_buffer,
+                    meta_rule_dict['sub_meta_rules'][_rule],
+                    rule_dict['rules'][_rule])
 
-        if _meta_rule_dict['aggregation'] == 'all_true':
-            return aggr_all_true(_decision_buffer)
+        if meta_rule_dict['aggregation'] == 'all_true':
+            return all_true(decision_buffer)
 
         return False
 
-    def get_intra_extension_list(self):
+    def get_intra_extension_dict(self, user_id):
         # TODO: check will be done through super_extension later
-        return self.driver.get_intra_extension_list()
-
-    def get_intra_extension_id_for_tenant(self, tenant_id):
-        for intra_extension_id in self.driver.get_intra_extension_list():
-            if self.driver.get_intra_extension(intra_extension_id)["tenant"] == tenant_id:
-                return intra_extension_id
-        LOG.error("IntraExtension not found for tenant {}".format(tenant_id))
-        raise exception.NotFound
-
-    def get_intra_extension(self, uuid):
-        return self.driver.get_intra_extension(uuid)
-
-    def set_perimeter_values(self, ie, policy_dir):
-
-        perimeter_path = os.path.join(policy_dir, 'perimeter.json')
-        f = open(perimeter_path)
-        json_perimeter = json.load(f)
-
-        subject_dict = dict()
-        # We suppose that all subjects can be mapped to a true user in Keystone
-        for _subject in json_perimeter['subjects']:
-            user = self.identity_api.get_user_by_name(_subject, "default")
-            subject_dict[user["id"]] = user
-        self.driver.set_subject_dict(ie["id"], subject_dict)
-        ie["subjects"] = subject_dict
+        return self.driver.get_intra_extension_dict()
 
-        # Copy all values for objects and subjects
-        object_dict = dict()
-        for _object in json_perimeter['objects']:
-            object_dict[uuid4().hex] = {"name": _object}
-        self.driver.set_object_dict(ie["id"], object_dict)
-        ie["objects"] = object_dict
+    def get_intra_extension(self, user_id, intra_extension_id):
+        # TODO: check will be done through super_extension later
+        return self.driver.get_intra_extension(intra_extension_id)
 
-        action_dict = dict()
-        for _action in json_perimeter['actions']:
-            action_dict[uuid4().hex] = {"name": _action}
-        self.driver.set_action_dict(ie["id"], action_dict)
-        ie["ations"] = action_dict
+    # load policy from policy directory
 
-    def set_metadata_values(self, ie, policy_dir):
+    def __load_metadata_file(self, intra_extension, policy_dir):
 
         metadata_path = os.path.join(policy_dir, 'metadata.json')
         f = open(metadata_path)
@@ -461,133 +433,160 @@ class IntraExtensionManager(manager.Manager):
         subject_categories_dict = dict()
         for _cat in json_perimeter['subject_categories']:
             subject_categories_dict[uuid4().hex] = {"name": _cat}
-        self.driver.set_subject_category_dict(ie["id"], subject_categories_dict)
+        self.driver.set_subject_category_dict(intra_extension["id"], subject_categories_dict)
         # Initialize scope categories
         for _cat in subject_categories_dict.keys():
-            self.driver.set_subject_category_scope_dict(ie["id"], _cat, {})
-        ie['subject_categories'] = subject_categories_dict
+            self.driver.set_subject_scope_dict(intra_extension["id"], _cat, {})
+        intra_extension['subject_categories'] = subject_categories_dict
 
         object_categories_dict = dict()
         for _cat in json_perimeter['object_categories']:
             object_categories_dict[uuid4().hex] = {"name": _cat}
-        self.driver.set_object_category_dict(ie["id"], object_categories_dict)
+        self.driver.set_object_category_dict(intra_extension["id"], object_categories_dict)
         # Initialize scope categories
         for _cat in object_categories_dict.keys():
-            self.driver.set_object_category_scope_dict(ie["id"], _cat, {})
-        ie['object_categories'] = object_categories_dict
+            self.driver.set_object_scope_dict(intra_extension["id"], _cat, {})
+        intra_extension['object_categories'] = object_categories_dict
 
         action_categories_dict = dict()
         for _cat in json_perimeter['action_categories']:
             action_categories_dict[uuid4().hex] = {"name": _cat}
-        self.driver.set_action_category_dict(ie["id"], action_categories_dict)
+        self.driver.set_action_category_dict(intra_extension["id"], action_categories_dict)
         # Initialize scope categories
         for _cat in action_categories_dict.keys():
-            self.driver.set_action_category_scope_dict(ie["id"], _cat, {})
-        ie['action_categories'] = action_categories_dict
+            self.driver.set_action_scope_dict(intra_extension["id"], _cat, {})
+        intra_extension['action_categories'] = action_categories_dict
+
+    def __load_perimeter_file(self, intra_extension, policy_dir):
 
-    def set_scope_values(self, ie, policy_dir):
+        perimeter_path = os.path.join(policy_dir, 'perimeter.json')
+        f = open(perimeter_path)
+        json_perimeter = json.load(f)
+
+        subject_dict = dict()
+        # We suppose that all subjects can be mapped to a true user in Keystone
+        for _subject in json_perimeter['subjects']:
+            user = self.identity_api.get_user_by_name(_subject, "default")
+            subject_dict[user["id"]] = user
+        self.driver.set_subject_dict(intra_extension["id"], subject_dict)
+        intra_extension["subjects"] = subject_dict
+
+        # Copy all values for objects and subjects
+        object_dict = dict()
+        for _object in json_perimeter['objects']:
+            object_dict[uuid4().hex] = {"name": _object}
+        self.driver.set_object_dict(intra_extension["id"], object_dict)
+        intra_extension["objects"] = object_dict
+
+        action_dict = dict()
+        for _action in json_perimeter['actions']:
+            action_dict[uuid4().hex] = {"name": _action}
+        self.driver.set_action_dict(intra_extension["id"], action_dict)
+        intra_extension["ations"] = action_dict
+
+    def __load_scope_file(self, intra_extension, policy_dir):
 
         metadata_path = os.path.join(policy_dir, 'scope.json')
         f = open(metadata_path)
         json_perimeter = json.load(f)
 
-        ie['subject_category_scope'] = dict()
+        intra_extension['subject_category_scope'] = dict()
         for category, scope in json_perimeter["subject_category_scope"].iteritems():
-            category = self.driver.get_uuid_from_name(ie["id"], category, self.driver.SUBJECT_CATEGORY)
+            category = self.driver.get_uuid_from_name(intra_extension["id"], category, self.driver.SUBJECT_CATEGORY)
             _scope_dict = dict()
             for _scope in scope:
                 _scope_dict[uuid4().hex] = {"name": _scope}
-            self.driver.set_subject_category_scope_dict(ie["id"], category, _scope_dict)
-            ie['subject_category_scope'][category] = _scope_dict
+            self.driver.set_subject_scope_dict(intra_extension["id"], category, _scope_dict)
+            intra_extension['subject_category_scope'][category] = _scope_dict
 
-        ie['object_category_scope'] = dict()
+        intra_extension['object_category_scope'] = dict()
         for category, scope in json_perimeter["object_category_scope"].iteritems():
-            category = self.driver.get_uuid_from_name(ie["id"], category, self.driver.OBJECT_CATEGORY)
+            category = self.driver.get_uuid_from_name(intra_extension["id"], category, self.driver.OBJECT_CATEGORY)
             _scope_dict = dict()
             for _scope in scope:
                 _scope_dict[uuid4().hex] = {"name": _scope}
-            self.driver.set_object_category_scope_dict(ie["id"], category, _scope_dict)
-            ie['object_category_scope'][category] = _scope_dict
+            self.driver.set_object_scope_dict(intra_extension["id"], category, _scope_dict)
+            intra_extension['object_category_scope'][category] = _scope_dict
 
-        ie['action_category_scope'] = dict()
+        intra_extension['action_category_scope'] = dict()
         for category, scope in json_perimeter["action_category_scope"].iteritems():
-            category = self.driver.get_uuid_from_name(ie["id"], category, self.driver.ACTION_CATEGORY)
+            category = self.driver.get_uuid_from_name(intra_extension["id"], category, self.driver.ACTION_CATEGORY)
             _scope_dict = dict()
             for _scope in scope:
                 _scope_dict[uuid4().hex] = {"name": _scope}
-            self.driver.set_action_category_scope_dict(ie["id"], category, _scope_dict)
-            ie['action_category_scope'][category] = _scope_dict
+            self.driver.set_action_scope_dict(intra_extension["id"], category, _scope_dict)
+            intra_extension['action_category_scope'][category] = _scope_dict
 
-    def set_assignments_values(self, ie, policy_dir):
+    def __load_assignment_file(self, intra_extension, policy_dir):
 
         f = open(os.path.join(policy_dir, 'assignment.json'))
         json_assignments = json.load(f)
 
         subject_assignments = dict()
         for category_name, value in json_assignments['subject_assignments'].iteritems():
-            category = self.driver.get_uuid_from_name(ie["id"], category_name, self.driver.SUBJECT_CATEGORY)
+            category = self.driver.get_uuid_from_name(intra_extension["id"], category_name, self.driver.SUBJECT_CATEGORY)
             for user_name in value:
-                user_id = self.driver.get_uuid_from_name(ie["id"], user_name, self.driver.SUBJECT)
+                user_id = self.driver.get_uuid_from_name(intra_extension["id"], user_name, self.driver.SUBJECT)
                 if user_id not in subject_assignments:
                     subject_assignments[user_id] = dict()
                 if category not in subject_assignments[user_id]:
                     subject_assignments[user_id][category] = \
-                        map(lambda x: self.driver.get_uuid_from_name(ie["id"], x, self.driver.SUBJECT_SCOPE, category_name),
+                        map(lambda x: self.driver.get_uuid_from_name(intra_extension["id"], x, self.driver.SUBJECT_SCOPE, category_name),
                             value[user_name])
                 else:
                     subject_assignments[user_id][category].extend(
-                        map(lambda x: self.driver.get_uuid_from_name(ie["id"], x, self.driver.SUBJECT_SCOPE, category_name),
+                        map(lambda x: self.driver.get_uuid_from_name(intra_extension["id"], x, self.driver.SUBJECT_SCOPE, category_name),
                             value[user_name])
                     )
         # Note (dthom): subject_category_assignment must be initialized because when there is no data in json
         # we will not go through the for loop
-        self.driver.set_subject_category_assignment_dict(ie["id"])
+        self.driver.set_subject_assignment_dict(intra_extension["id"])
         for subject in subject_assignments:
-            self.driver.set_subject_category_assignment_dict(ie["id"], subject, subject_assignments[subject])
+            self.driver.set_subject_assignment_dict(intra_extension["id"], subject, subject_assignments[subject])
 
         object_assignments = dict()
         for category_name, value in json_assignments["object_assignments"].iteritems():
-            category = self.driver.get_uuid_from_name(ie["id"], category_name, self.driver.OBJECT_CATEGORY)
+            category = self.driver.get_uuid_from_name(intra_extension["id"], category_name, self.driver.OBJECT_CATEGORY)
             for object_name in value:
                 if object_name not in object_assignments:
                     object_assignments[object_name] = dict()
                 if category not in object_assignments[object_name]:
                     object_assignments[object_name][category] = \
-                        map(lambda x: self.driver.get_uuid_from_name(ie["id"], x, self.driver.OBJECT_SCOPE, category_name),
+                        map(lambda x: self.driver.get_uuid_from_name(intra_extension["id"], x, self.driver.OBJECT_SCOPE, category_name),
                             value[object_name])
                 else:
                     object_assignments[object_name][category].extend(
-                        map(lambda x: self.driver.get_uuid_from_name(ie["id"], x, self.driver.OBJECT_SCOPE, category_name),
+                        map(lambda x: self.driver.get_uuid_from_name(intra_extension["id"], x, self.driver.OBJECT_SCOPE, category_name),
                             value[object_name])
                     )
         # Note (dthom): object_category_assignment must be initialized because when there is no data in json
         # we will not go through the for loop
-        self.driver.set_object_category_assignment_dict(ie["id"])
+        self.driver.set_object_assignment_dict(intra_extension["id"])
         for object in object_assignments:
-            self.driver.set_object_category_assignment_dict(ie["id"], object, object_assignments[object])
+            self.driver.set_object_assignment_dict(intra_extension["id"], object, object_assignments[object])
 
         action_assignments = dict()
         for category_name, value in json_assignments["action_assignments"].iteritems():
-            category = self.driver.get_uuid_from_name(ie["id"], category_name, self.driver.ACTION_CATEGORY)
+            category = self.driver.get_uuid_from_name(intra_extension["id"], category_name, self.driver.ACTION_CATEGORY)
             for action_name in value:
                 if action_name not in action_assignments:
                     action_assignments[action_name] = dict()
                 if category not in action_assignments[action_name]:
                     action_assignments[action_name][category] = \
-                        map(lambda x: self.driver.get_uuid_from_name(ie["id"], x, self.driver.ACTION_SCOPE, category_name),
+                        map(lambda x: self.driver.get_uuid_from_name(intra_extension["id"], x, self.driver.ACTION_SCOPE, category_name),
                             value[action_name])
                 else:
                     action_assignments[action_name][category].extend(
-                        map(lambda x: self.driver.get_uuid_from_name(ie["id"], x, self.driver.ACTION_SCOPE, category_name),
+                        map(lambda x: self.driver.get_uuid_from_name(intra_extension["id"], x, self.driver.ACTION_SCOPE, category_name),
                             value[action_name])
                     )
         # Note (dthom): action_category_assignment must be initialized because when there is no data in json
         # we will not go through the for loop
-        self.driver.set_action_category_assignment_dict(ie["id"])
+        self.driver.set_action_assignment_dict(intra_extension["id"])
         for action in action_assignments:
-            self.driver.set_action_category_assignment_dict(ie["id"], action, action_assignments[action])
+            self.driver.set_action_assignment_dict(intra_extension["id"], action, action_assignments[action])
 
-    def set_metarule_values(self, ie, policy_dir):
+    def __load_metarule_file(self, intra_extension, policy_dir):
 
         metadata_path = os.path.join(policy_dir, 'metarule.json')
         f = open(metadata_path)
@@ -605,23 +604,23 @@ class IntraExtensionManager(manager.Manager):
             for item in ("subject_categories", "object_categories", "action_categories"):
                 metarule[relation][item] = list()
                 for element in json_metarule["sub_meta_rules"][relation][item]:
-                    metarule[relation][item].append(self.driver.get_uuid_from_name(ie["id"], element, categories[item]))
+                    metarule[relation][item].append(self.driver.get_uuid_from_name(intra_extension["id"], element, categories[item]))
             metarule[relation]["algorithm"] = json_metarule["sub_meta_rules"][relation]["algorithm"]
         submetarules = {
             "aggregation": json_metarule["aggregation"],
             "sub_meta_rules": metarule
         }
-        self.driver.set_meta_rule_dict(ie["id"], submetarules)
+        self.driver.set_meta_rule_dict(intra_extension["id"], submetarules)
 
-    def set_subrules_values(self, ie, policy_dir):
+    def __load_rule_file(self, intra_extension, policy_dir):
 
-        metadata_path = os.path.join(policy_dir, 'rules.json')
+        metadata_path = os.path.join(policy_dir, 'rule.json')
         f = open(metadata_path)
         json_rules = json.load(f)
-        ie["sub_rules"] = {"rules": copy.deepcopy(json_rules)}
+        intra_extension["rule"] = {"rule": copy.deepcopy(json_rules)}
         # Translate value from JSON file to UUID for Database
         rules = dict()
-        sub_meta_rules = self.driver.get_meta_rule_dict(ie["id"])
+        sub_meta_rules = self.driver.get_meta_rule_dict(intra_extension["id"])
         for relation in json_rules:
             # print(relation)
             # print(self.get_sub_meta_rule_relations("admin", ie["id"]))
@@ -631,23 +630,23 @@ class IntraExtensionManager(manager.Manager):
             for rule in json_rules[relation]:
                 subrule = list()
                 _rule = list(rule)
-                for category_uuid in sub_meta_rules["sub_meta_rules"][relation]["subject_categories"]:
+                for category_uuid in sub_meta_rules["rule"][relation]["subject_categories"]:
                     scope_name = _rule.pop(0)
-                    scope_uuid = self.driver.get_uuid_from_name(ie["id"],
+                    scope_uuid = self.driver.get_uuid_from_name(intra_extension["id"],
                                                                 scope_name,
                                                                 self.driver.SUBJECT_SCOPE,
                                                                 category_uuid=category_uuid)
                     subrule.append(scope_uuid)
-                for category_uuid in sub_meta_rules["sub_meta_rules"][relation]["action_categories"]:
+                for category_uuid in sub_meta_rules["rule"][relation]["action_categories"]:
                     scope_name = _rule.pop(0)
-                    scope_uuid = self.driver.get_uuid_from_name(ie["id"],
+                    scope_uuid = self.driver.get_uuid_from_name(intra_extension["id"],
                                                                 scope_name,
                                                                 self.driver.ACTION_SCOPE,
                                                                 category_uuid=category_uuid)
                     subrule.append(scope_uuid)
-                for category_uuid in sub_meta_rules["sub_meta_rules"][relation]["object_categories"]:
+                for category_uuid in sub_meta_rules["rule"][relation]["object_categories"]:
                     scope_name = _rule.pop(0)
-                    scope_uuid = self.driver.get_uuid_from_name(ie["id"],
+                    scope_uuid = self.driver.get_uuid_from_name(intra_extension["id"],
                                                                 scope_name,
                                                                 self.driver.OBJECT_SCOPE,
                                                                 category_uuid=category_uuid)
@@ -674,9 +673,10 @@ class IntraExtensionManager(manager.Manager):
                     # if value doesn't exist add a default value
                     subrule.append(True)
                 rules[relation].append(subrule)
-        self.driver.set_rule_dict(ie["id"], rules)
+        self.driver.set_rule_dict(intra_extension["id"], rules)
 
-    def load_intra_extension(self, intra_extension):
+    def load_intra_extension(self, user_id, intra_extension):
+        # TODO: check will be done through super_extension later
         ie = dict()
         # TODO: clean some values
         ie['id'] = uuid4().hex
@@ -687,565 +687,641 @@ class IntraExtensionManager(manager.Manager):
         self.moonlog_api.debug("Creation of IE: {}".format(ref))
         # read the profile given by "policymodel" and populate default variables
         policy_dir = os.path.join(CONF.moon.policy_directory, ie["model"])
-        self.set_perimeter_values(ie, policy_dir)
-        self.set_metadata_values(ie, policy_dir)
-        self.set_scope_values(ie, policy_dir)
-        self.set_assignments_values(ie, policy_dir)
-        self.set_metarule_values(ie, policy_dir)
-        self.set_subrules_values(ie, policy_dir)
+        self.__load_perimeter_file(ie, policy_dir)
+        self.__load_metadata_file(ie, policy_dir)
+        self.__load_scope_file(ie, policy_dir)
+        self.__load_assignment_file(ie, policy_dir)
+        self.__load_metarule_file(ie, policy_dir)
+        self.__load_rule_file(ie, policy_dir)
         return ref
 
-    def delete_intra_extension(self, intra_extension_id):
-        ref = self.driver.delete_intra_extension(intra_extension_id)
+    def del_intra_extension(self, user_id, intra_extension_id):
+        # TODO: check will be done through super_extension later
+        ref = self.driver.del_intra_extension(intra_extension_id)
         return ref
 
-    # Perimeter functions
+    # Metadata functions
 
     @filter_args
-    @enforce("read", "subjects")
-    def get_subject_dict(self, user_id, intra_extension_uuid):
-        return self.driver.get_subject_dict(intra_extension_uuid)
+    @enforce("read", "subject_categories")
+    def get_subject_category_dict(self, user_id, intra_extension_id):
+        return self.driver.get_subject_category_dict(intra_extension_id)
 
     @filter_args
-    @enforce(("read", "write"), "subjects")
-    def set_subject_dict(self, user_id, intra_extension_uuid, subject_list):
-        subject_dict = {}
-        for _user in subject_list:
-            # Next line will raise an error if user is not present in Keystone database
-            user = self.identity_api.get_user_by_name(_user["name"], "default")
-            subject_dict[user["id"]] = dict()
-            for key in user.keys():
-                subject_dict[user["id"]][key] = user[key]
-        return self.driver.set_subject_dict(intra_extension_uuid, subject_dict)
+    @enforce("read", "subject_categories")
+    @enforce(("read", "write"), "subject_category_scope")
+    def set_subject_category_dict(self, user_id, intra_extension_id, subject_category_list):
+        subject_category = {uuid4().hex: item for item in subject_category_list}
+        subject_category_dict = self.driver.set_subject_category_dict(intra_extension_id, subject_category)
+        # if we add a new category, we must add it to the subject_category_scope
+        for _cat in subject_category.keys():
+            try:
+                _ = self.driver.get_subject_scope_dict(intra_extension_id, _cat)
+            except SubjectScopeUnknown:
+                self.driver.set_subject_scope_dict(intra_extension_id, _cat, {})
+        return subject_category_dict
 
     @filter_args
-    @enforce(("read", "write"), "subjects")
-    def add_subject_dict(self, user_id, intra_extension_uuid, subject_name):
-        # Next line will raise an error if user is not present in Keystone database
-        user = self.identity_api.get_user_by_name(subject_name, "default")
-        subjects = self.driver.add_subject(intra_extension_uuid, user["id"], user)
-        return subjects
+    @enforce(("read", "write"), "subject_categories")
+    @enforce(("read", "write"), "subject_category_scope")
+    def add_subject_category(self, user_id, intra_extension_id, subject_category_name):
+        # TODO (asteroide): we must check input here.
+        # TODO: add category to scope
+        subject_category_id = uuid4().hex
+        return self.driver.add_subject_category(intra_extension_id, subject_category_id, subject_category_name)
 
     @filter_args
-    @enforce("read", "subjects")
-    @enforce("write", "subjects")
-    def del_subject(self, user_id, intra_extension_uuid, subject_uuid):
-        self.driver.remove_subject(intra_extension_uuid, subject_uuid)
+    @enforce(("read", "write"), "subject_categories")
+    @enforce(("read", "write"), "subject_category_scope")
+    def del_subject_category(self, user_id, intra_extension_id, subject_category_id):
+        # TODO: del category from scope
+        return self.driver.del_subject_category(intra_extension_id, subject_category_id)
 
     @filter_args
-    @enforce("read", "objects")
-    def get_object_dict(self, user_id, intra_extension_uuid):
-        return self.driver.get_object_dict(intra_extension_uuid)
+    @enforce("read", "object_categories")
+    def get_object_category_dict(self, user_id, intra_extension_id):
+        return self.driver.get_object_category_dict(intra_extension_id)
 
     @filter_args
-    @enforce(("read", "write"), "objects")
-    def set_object_dict(self, user_id, intra_extension_uuid, object_list):
+    @enforce("read", "object_categories")
+    @enforce(("read", "write"), "object_category_scope")
+    def set_object_category_dict(self, user_id, intra_extension_id, object_category_list):
         # TODO (asteroide): we must check input here.
-        object_dict = {uuid4().hex: item for item in object_list}
-        return self.driver.set_object_dict(intra_extension_uuid, object_dict)
+        object_category = {uuid4().hex: item for item in object_category_list}
+        object_category_dict = self.driver.set_object_category_dict(intra_extension_id, object_category)
+        # if we add a new category, we must add it to the object_category_scope
+        for _cat in object_category.keys():
+            try:
+                _ = self.driver.get_object_scope_dict(intra_extension_id, _cat)
+            except ObjectScopeUnknown:
+                self.driver.set_object_scope_dict(intra_extension_id, _cat, {})
+        return object_category_dict
 
     @filter_args
-    @enforce(("read", "write"), "objects")
-    def add_object_dict(self, user_id, intra_extension_uuid, object_dict):
+    @enforce(("read", "write"), "object_categories")
+    @enforce(("read", "write"), "object_category_scope")
+    def add_object_category(self, user_id, intra_extension_id, object_category_name):
         # TODO (asteroide): we must check input here.
-        object_uuid = uuid4().hex
-        return self.driver.add_object(intra_extension_uuid, object_uuid, object_dict)
+        # TODO: add category to scope
+        object_category_id = uuid4().hex
+        return self.driver.add_object_category(intra_extension_id, object_category_id, object_category_name)
 
     @filter_args
-    @enforce("read", "objects")
-    @enforce("write", "objects")
-    def del_object(self, user_id, intra_extension_uuid, object_uuid):
-        self.driver.remove_object(intra_extension_uuid, object_uuid)
+    @enforce(("read", "write"), "object_categories")
+    @enforce(("read", "write"), "object_category_scope")
+    def del_object_category(self, user_id, intra_extension_id, object_id):
+        # TODO: add category to scope
+        return self.driver.del_object_category(intra_extension_id, object_id)
 
     @filter_args
-    @enforce("read", "actions")
-    def get_action_dict(self, user_id, intra_extension_uuid):
-        return self.driver.get_action_dict(intra_extension_uuid)
+    @enforce("read", "action_categories")
+    def get_action_category_dict(self, user_id, intra_extension_id):
+        return self.driver.get_action_category_dict(intra_extension_id)
 
     @filter_args
-    @enforce(("read", "write"), "actions")
-    def set_action_dict(self, user_id, intra_extension_uuid, action_list):
+    @enforce(("read", "write"), "action_categories")
+    @enforce(("read", "write"), "action_category_scope")
+    def set_action_category_dict(self, user_id, intra_extension_id, action_category_list):
         # TODO (asteroide): we must check input here.
-        action_dict = {uuid4().hex: item for item in action_list}
-        return self.driver.set_action_dict(intra_extension_uuid, action_dict)
+        action_category = {uuid4().hex: item for item in action_category_list}
+        action_category_dict = self.driver.set_action_category_dict(intra_extension_id, action_category)
+        # if we add a new category, we must add it to the action_category_scope
+        for _cat in action_category.keys():
+            try:
+                _ = self.driver.get_action_scope_dict(intra_extension_id, _cat)
+            except ActionScopeUnknown:
+                self.driver.set_action_scope_dict(intra_extension_id, _cat, {})
+        return action_category_dict
 
     @filter_args
-    @enforce(("read", "write"), "actions")
-    def add_action_dict(self, user_id, intra_extension_uuid, action_dict):
+    @enforce(("read", "write"), "action_categories")
+    @enforce(("read", "write"), "action_category_scope")
+    def add_action_category(self, user_id, intra_extension_id, action_category_name):
         # TODO (asteroide): we must check input here.
-        action_uuid = uuid4().hex
-        return self.driver.add_action(intra_extension_uuid, action_uuid, action_dict)
+        # TODO: add category in scope
+        action_category_id = uuid4().hex
+        return self.driver.add_action_category(intra_extension_id, action_category_id, action_category_name)
 
     @filter_args
-    @enforce("read", "actions")
-    @enforce("write", "actions")
-    def del_action(self, user_id, intra_extension_uuid, action_uuid):
-        self.driver.remove_action(intra_extension_uuid, action_uuid)
+    @enforce(("read", "write"), "action_categories")
+    @enforce(("read", "write"), "action_category_scope")
+    def del_action_category(self, user_id, intra_extension_id, action_id):
+        return self.driver.del_action_category(intra_extension_id, action_id)
 
-    # Metadata functions
+    # Perimeter functions
 
     @filter_args
-    @enforce("read", "subject_categories")
-    def get_subject_category_dict(self, user_id, intra_extension_uuid):
-        return self.driver.get_subject_category_dict(intra_extension_uuid)
+    @enforce("read", "subjects")
+    def get_subject_dict(self, user_id, intra_extension_id):
+        return self.driver.get_subject_dict(intra_extension_id)
 
     @filter_args
-    @enforce("read", "subject_categories")
-    @enforce("read", "subject_category_scope")
-    @enforce("write", "subject_category_scope")
-    def set_subject_category_dict(self, user_id, intra_extension_uuid, subject_category_list):
-        subject_category = {uuid4().hex: item for item in subject_category_list}
-        subject_category_dict = self.driver.set_subject_category_dict(intra_extension_uuid, subject_category)
-        # if we add a new category, we must add it to the subject_category_scope
-        for _cat in subject_category.keys():
-            try:
-                _ = self.driver.get_subject_category_scope_dict(intra_extension_uuid, _cat)
-            except SubjectScopeUnknown:
-                self.driver.set_subject_category_scope_dict(intra_extension_uuid, _cat, {})
-        return subject_category_dict
+    @enforce(("read", "write"), "subjects")
+    def set_subject_dict(self, user_id, intra_extension_id, subject_list):
+        # TODO: propose to remove this
+        subject_dict = {}
+        for _user in subject_list:
+            # Next line will raise an error if user is not present in Keystone database
+            user = self.identity_api.get_user_by_name(_user["name"], "default")
+            subject_dict[user["id"]] = dict()
+            for key in user.keys():
+                subject_dict[user["id"]][key] = user[key]
+        return self.driver.set_subject_dict(intra_extension_id, subject_dict)
 
     @filter_args
-    @enforce("read", "subject_categories")
-    @enforce("write", "subject_categories")
-    def add_subject_category_dict(self, user_id, intra_extension_uuid, subject_category_dict):
-        # TODO (asteroide): we must check input here.
-        subject_category_uuid = uuid4().hex
-        subject_categories = self.driver.add_subject_category_dict(
-            intra_extension_uuid, subject_category_uuid, subject_category_dict)
-        return subject_categories
+    @enforce(("read", "write"), "subjects")
+    def add_subject(self, user_id, intra_extension_id, subject_name):
+        # Next line will raise an error if user is not present in Keystone database
+        subject_dict = self.identity_api.get_user_by_name(subject_name, "default")
+        subjects = self.driver.add_subject(intra_extension_id, subject_dict["id"], subject_name)
+        return subjects
 
     @filter_args
-    @enforce("write", "subject_categories")
-    def del_subject_category(self, user_id, intra_extension_uuid, subject_uuid):
-        return self.driver.remove_subject_category(intra_extension_uuid, subject_uuid)
+    @enforce(("read", "write"), "subjects")
+    def del_subject(self, user_id, intra_extension_id, subject_id):
+        self.driver.del_subject(intra_extension_id, subject_id)
 
     @filter_args
-    @enforce("read", "object_categories")
-    def get_object_category_dict(self, user_id, intra_extension_uuid):
-        return self.driver.get_object_category_dict(intra_extension_uuid)
+    @enforce("read", "objects")
+    def get_object_dict(self, user_id, intra_extension_id):
+        return self.driver.get_object_dict(intra_extension_id)
 
     @filter_args
-    @enforce("read", "object_categories")
-    @enforce("read", "object_category_scope")
-    @enforce("write", "object_category_scope")
-    def set_object_category_dict(self, user_id, intra_extension_uuid, object_category_list):
+    @enforce(("read", "write"), "objects")
+    def set_object_dict(self, user_id, intra_extension_id, object_list):
+        # TODO: propose to remove this
         # TODO (asteroide): we must check input here.
-        object_category = {uuid4().hex: item for item in object_category_list}
-        object_category_dict = self.driver.set_object_category_dict(intra_extension_uuid, object_category)
-        # if we add a new category, we must add it to the object_category_scope
-        for _cat in object_category.keys():
-            try:
-                _ = self.driver.get_object_category_scope_dict(intra_extension_uuid, _cat)
-            except ObjectScopeUnknown:
-                self.driver.set_object_category_scope_dict(intra_extension_uuid, _cat, {})
-        return object_category_dict
+        object_dict = {uuid4().hex: item for item in object_list}
+        return self.driver.set_object_dict(intra_extension_id, object_dict)
 
     @filter_args
-    @enforce("read", "object_categories")
-    @enforce("write", "object_categories")
-    def add_object_category_dict(self, user_id, intra_extension_uuid, object_category_dict):
+    @enforce(("read", "write"), "objects")
+    def add_object(self, user_id, intra_extension_id, object_name):
         # TODO (asteroide): we must check input here.
-        object_category_uuid = uuid4().hex
-        object_categories = self.driver.add_object_category_dict(
-            intra_extension_uuid, object_category_uuid, object_category_dict)
-        return object_categories
+        object_id = uuid4().hex
+        return self.driver.add_object(intra_extension_id, object_id, object_name)
 
     @filter_args
-    @enforce("write", "object_categories")
-    def del_object_category(self, user_id, intra_extension_uuid, object_uuid):
-        return self.driver.remove_object_category(intra_extension_uuid, object_uuid)
+    @enforce(("read", "write"), "objects")
+    def del_object(self, user_id, intra_extension_id, object_id):
+        self.driver.del_object(intra_extension_id, object_id)
 
     @filter_args
-    @enforce("read", "action_categories")
-    def get_action_category_dict(self, user_id, intra_extension_uuid):
-        return self.driver.get_action_category_dict(intra_extension_uuid)
+    @enforce("read", "actions")
+    def get_action_dict(self, user_id, intra_extension_id):
+        # TODO: check will be done through super_extension later
+        return self.driver.get_action_dict(intra_extension_id)
 
     @filter_args
-    @enforce("read", "action_categories")
-    @enforce("read", "action_category_scope")
-    @enforce("write", "action_category_scope")
-    def set_action_category_dict(self, user_id, intra_extension_uuid, action_category_list):
+    @enforce(("read", "write"), "actions")
+    def set_action_dict(self, user_id, intra_extension_id, action_list):
+        # TODO: propose to remove this
         # TODO (asteroide): we must check input here.
-        action_category = {uuid4().hex: item for item in action_category_list}
-        action_category_dict = self.driver.set_action_category_dict(intra_extension_uuid, action_category)
-        # if we add a new category, we must add it to the action_category_scope
-        for _cat in action_category.keys():
-            try:
-                _ = self.driver.get_action_category_scope_dict(intra_extension_uuid, _cat)
-            except ActionScopeUnknown:
-                self.driver.set_action_category_scope_dict(intra_extension_uuid, _cat, {})
-        return action_category_dict
+        action_dict = {uuid4().hex: item for item in action_list}
+        return self.driver.set_action_dict(intra_extension_id, action_dict)
 
     @filter_args
-    @enforce("read", "action_categories")
-    @enforce("write", "action_categories")
-    def add_action_category_dict(self, user_id, intra_extension_uuid, action_category_dict):
+    @enforce(("read", "write"), "actions")
+    def add_action(self, user_id, intra_extension_id, action_name):
         # TODO (asteroide): we must check input here.
-        action_category_uuid = uuid4().hex
-        action_categories = self.driver.add_action_category_dict(
-            intra_extension_uuid, action_category_uuid, action_category_dict)
-        return action_categories
+        action_id = uuid4().hex
+        return self.driver.add_action(intra_extension_id, action_id, action_name)
 
     @filter_args
-    @enforce("write", "action_categories")
-    def del_action_category(self, user_id, intra_extension_uuid, action_uuid):
-        return self.driver.remove_action_category(intra_extension_uuid, action_uuid)
+    @enforce(("read", "write"), "actions")
+    def del_action(self, user_id, intra_extension_id, action_id):
+        self.driver.del_action(intra_extension_id, action_id)
 
     # Scope functions
+
     @filter_args
-    @enforce("read", "subject_category_scope")
-    @enforce("read", "subject_category")
-    def get_subject_category_scope_dict(self, user_id, intra_extension_uuid, category):
-        if category not in self.get_subject_category_dict(user_id, intra_extension_uuid)["subject_categories"]:
+    @enforce("read", "subject_scopes")
+    @enforce("read", "subject_categories")
+    def get_subject_scope_dict(self, user_id, intra_extension_id, subject_category_id):
+        if subject_category_id not in self.get_subject_category_dict(user_id, intra_extension_id)["subject_categories"]:
             raise SubjectCategoryUnknown()
-        return self.driver.get_subject_category_scope_dict(intra_extension_uuid, category)
+        return self.driver.get_subject_scope_dict(intra_extension_id, subject_category_id)
 
     @filter_args
-    @enforce("read", "subject_category_scope")
-    @enforce("read", "subject_category")
-    def set_subject_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid, scope_list):
+    @enforce(("read", "write"), "subject_scopes")
+    @enforce("read", "subject_categorys")
+    def set_subject_scope_dict(self, user_id, intra_extension_id, subject_category_id, subject_scope_name_list):
         # TODO (asteroide): we must check input here.
-        scope_dict = {uuid4().hex: item for item in scope_list}
-        return self.driver.set_subject_category_scope_dict(intra_extension_uuid, category_uuid, scope_dict)
+        if subject_category_id not in self.get_subject_category_dict(user_id, intra_extension_id)["subject_categories"]:
+            raise SubjectCategoryUnknown()
+        subject_scope_dict = {uuid4().hex: item for item in subject_scope_name_list}
+        return self.driver.set_subject_scope_dict(intra_extension_id, subject_category_id, subject_scope_dict)
 
     @filter_args
-    @enforce(("read", "write"), "subject_category_scope")
-    @enforce("read", "subject_category")
-    def add_subject_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid, scope_dict):
+    @enforce(("read", "write"), "subject_scopes")
+    @enforce("read", "subject_categories")
+    def add_subject_scope(self, user_id, intra_extension_id, subject_category_id, subject_scope_name):
         # TODO (asteroide): we must check input here.
-        scope_uuid = uuid4().hex
-        return self.driver.add_subject_category_scope_dict(
-            intra_extension_uuid,
-            category_uuid,
-            scope_uuid,
-            scope_dict)
+        if subject_category_id not in self.get_subject_category_dict(user_id, intra_extension_id)["subject_categories"]:
+            raise SubjectCategoryUnknown()
+        subject_scope_id = uuid4().hex
+        return self.driver.add_subject_scope(
+            intra_extension_id,
+            subject_category_id,
+            subject_scope_id,
+            subject_scope_name)
 
     @filter_args
-    @enforce("write", "subject_category_scope")
-    @enforce("read", "subject_category")
-    def del_subject_category_scope(self, user_id, intra_extension_uuid, category_uuid, scope_uuid):
-        self.driver.remove_subject_category_scope_dict(
-            intra_extension_uuid,
-            category_uuid,
-            scope_uuid)
+    @enforce(("read", "write"), "subject_scopes")
+    @enforce("read", "subject_categories")
+    def del_subject_scope(self, user_id, intra_extension_id, subject_category_id, subject_scope_id):
+        if subject_category_id not in self.get_subject_category_dict(user_id, intra_extension_id)["subject_categories"]:
+            raise SubjectCategoryUnknown()
+        self.driver.del_subject_scope(intra_extension_id, subject_category_id, subject_scope_id)
 
     @filter_args
-    @enforce("read", "object_category_scope")
-    @enforce("read", "object_category")
-    def get_object_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid):
-        return self.driver.get_object_category_scope_dict(intra_extension_uuid, category_uuid)
+    @enforce("read", "object_category_scopes")
+    @enforce("read", "object_categorys")
+    def get_object_scope_dict(self, user_id, intra_extension_id, object_category_id):
+        return self.driver.get_object_scope_dict(intra_extension_id, object_category_id)
 
     @filter_args
-    @enforce("read", "object_category_scope")
-    @enforce("read", "object_category")
-    def set_object_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid, scope_list):
+    @enforce(("read", "write"), "object_scopes")
+    @enforce("read", "object_categories")
+    def set_object_scope_dict(self, user_id, intra_extension_id, object_category_id, object_scope_name_list):
         # TODO (asteroide): we must check input here.
-        scope_dict = {uuid4().hex: item for item in scope_list}
-        return self.driver.set_object_category_scope_dict(intra_extension_uuid, category_uuid, scope_dict)
+        if object_category_id not in self.get_object_category_dict(user_id, intra_extension_id)["object_categories"]:
+            raise ObjectCategoryUnknown()
+        object_scope_dict = {uuid4().hex: item for item in object_scope_name_list}
+        return self.driver.set_object_scope_dict(intra_extension_id, object_category_id, object_scope_dict)
 
     @filter_args
-    @enforce(("read", "write"), "object_category_scope")
-    @enforce("read", "object_category")
-    def add_object_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid, scope_dict):
+    @enforce(("read", "write"), "object_scopes")
+    @enforce("read", "object_categories")
+    def add_object_scope(self, user_id, intra_extension_id, object_category_id, object_scope_name):
         # TODO (asteroide): we must check input here.
-        scope_uuid = uuid4().hex
-        return self.driver.add_subject_category_scope_dict(
-            intra_extension_uuid,
-            category_uuid,
-            scope_uuid,
-            scope_dict)
+        if object_category_id not in self.get_object_category_dict(user_id, intra_extension_id)["object_categories"]:
+            raise ObjectCategoryUnknown()
+        object_scope_id = uuid4().hex
+        return self.driver.add_subject_scope(
+            intra_extension_id,
+            object_category_id,
+            object_scope_id,
+            object_scope_name)
 
     @filter_args
-    @enforce("write", "object_category_scope")
-    @enforce("read", "object_category")
-    def del_object_category_scope(self, user_id, intra_extension_uuid, category_uuid, scope_uuid):
-        self.driver.remove_object_category_scope_dict(
-            intra_extension_uuid,
-            category_uuid,
-            scope_uuid)
+    @enforce(("read", "write"), "object_scopes")
+    @enforce("read", "object_categories")
+    def del_object_scope(self, user_id, intra_extension_id, object_category_id, object_scope_id):
+        if object_category_id not in self.get_object_category_dict(user_id, intra_extension_id)["object_categories"]:
+            raise ObjectCategoryUnknown()
+        self.driver.del_object_scope(
+            intra_extension_id,
+            object_category_id,
+            object_scope_id)
 
     @filter_args
-    @enforce("read", "action_category_scope")
-    @enforce("read", "action_category")
-    def get_action_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid):
-        return self.driver.get_action_category_scope_dict(intra_extension_uuid, category_uuid)
+    @enforce("read", "action_category_scopes")
+    @enforce("read", "action_categories")
+    def get_action_scope_dict(self, user_id, intra_extension_id, action_category_id):
+        if action_category_id not in self.get_action_category_dict(user_id, intra_extension_id)["action_categories"]:
+            raise ActionCategoryUnknown()
+        return self.driver.get_action_scope_dict(intra_extension_id, action_category_id)
 
     @filter_args
-    @enforce(("read", "write"), "action_category_scope")
-    @enforce("read", "action_category")
-    def set_action_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid, scope_list):
+    @enforce(("read", "write"), "action_scopes")
+    @enforce("read", "action_categories")
+    def set_action_scope_dict(self, user_id, intra_extension_id, action_category_id, action_scope_name_list):
         # TODO (asteroide): we must check input here.
-        scope_dict = {uuid4().hex: item for item in scope_list}
-        return self.driver.set_action_category_scope_dict(intra_extension_uuid, category_uuid, scope_dict)
+        if action_category_id not in self.get_action_category_dict(user_id, intra_extension_id)["action_categories"]:
+            raise ActionCategoryUnknown()
+        action_scope_dict = {uuid4().hex: item for item in action_scope_name_list}
+        return self.driver.set_action_scope_dict(intra_extension_id, action_category_id, action_scope_dict)
 
     @filter_args
-    @enforce(("read", "write"), "action_category_scope")
-    @enforce("read", "action_category")
-    def add_action_category_scope_dict(self, user_id, intra_extension_uuid, category_uuid, scope_dict):
+    @enforce(("read", "write"), "action_scopes")
+    @enforce("read", "action_categories")
+    def add_action_scope(self, user_id, intra_extension_id, action_category_id, action_scope_name):
         # TODO (asteroide): we must check input here.
-        scope_uuid = uuid4().hex
-        return self.driver.add_action_category_scope_dict(
-            intra_extension_uuid,
-            category_uuid,
-            scope_uuid,
-            scope_dict)
+        if action_category_id not in self.get_action_category_dict(user_id, intra_extension_id)["action_categories"]:
+            raise ActionCategoryUnknown()
+        action_scope_id = uuid4().hex
+        return self.driver.add_action_scope(
+            intra_extension_id,
+            action_category_id,
+            action_scope_id,
+            action_scope_name)
 
     @filter_args
-    @enforce("write", "action_category_scope")
-    @enforce("read", "action_category")
-    def del_action_category_scope(self, user_id, intra_extension_uuid, category_uuid, scope_uuid):
-        self.driver.remove_action_category_scope_dict(
-            intra_extension_uuid,
-            category_uuid,
-            scope_uuid)
+    @enforce(("read", "write"), "action_scopes")
+    @enforce("read", "action_categories")
+    def del_action_scope(self, user_id, intra_extension_id, action_category_id, action_scope_id):
+        if action_category_id not in self.get_action_category_dict(user_id, intra_extension_id)["action_categories"]:
+            raise ActionCategoryUnknown()
+        self.driver.del_action_scope(intra_extension_id, action_category_id, action_scope_id)
 
     # Assignment functions
 
     @filter_args
-    @enforce("read", "subject_category_assignment")
+    @enforce("read", "subject_assignments")
     @enforce("read", "subjects")
-    def get_subject_category_assignment_dict(self, user_id, intra_extension_uuid, subject_uuid):
-        return self.driver.get_subject_category_assignment_dict(intra_extension_uuid, subject_uuid)
+    def get_subject_assignment_dict(self, user_id, intra_extension_id, subject_id):
+        if subject_id not in self.get_subject_dict(user_id, intra_extension_id):
+            raise SubjectUnknown()
+        return self.driver.get_subject_assignment_dict(intra_extension_id, subject_id)
 
     @filter_args
-    @enforce("read", "subject_category_assignment")
-    @enforce("write", "subject_category_assignment")
+    @enforce(("read", "write"), "subject_assignments")
     @enforce("read", "subjects")
-    def set_subject_category_assignment_dict(self, user_id, intra_extension_uuid, subject_uuid, assignment_dict):
-        # TODO (asteroide): we must check input here.
-        return self.driver.set_subject_category_assignment_dict(intra_extension_uuid, subject_uuid, assignment_dict)
+    def set_subject_assignment_dict(self, user_id, intra_extension_id, subject_id, subject_assignment_dict):
+        if subject_id not in self.get_subject_dict(user_id, intra_extension_id):
+            raise SubjectUnknown()
+        return self.driver.set_subject_assignment_dict(intra_extension_id, subject_id, subject_assignment_dict)
 
     @filter_args
-    @enforce("read", "subject_category_assignment")
-    @enforce("write", "subject_category_assignment")
+    @enforce(("read", "write"), "subject_assignments")
     @enforce("read", "subjects")
-    @enforce("read", "subject_category")
-    @enforce("read", "subject_scope")
-    def del_subject_category_assignment(self, user_id, intra_extension_uuid, subject_uuid, category_uuid, scope_uuid):
-        self.driver.remove_subject_category_assignment(intra_extension_uuid, subject_uuid, category_uuid, scope_uuid)
+    @enforce("read", "subject_categories")
+    def add_subject_assignment(self, user_id, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
+        if subject_id not in self.get_subject_dict(user_id, intra_extension_id):
+            raise SubjectUnknown()
+        elif subject_category_id not in self.get_subject_category_dict(user_id, intra_extension_id):
+            raise SubjectCategoryUnknown()
+        elif subject_scope_id not in self.get_subject_scope_dict(user_id, intra_extension_id, subject_category_id):
+            raise SubjectAssignmentOutOfScope()
+        # TODO: raise SubjectAssignmentExisting() for the below func
+        return self.driver.add_subject_assignment(intra_extension_id, subject_id, subject_category_id, subject_scope_id)
 
     @filter_args
-    @enforce("write", "subject_category_assignment")
+    @enforce(("read", "write"), "subject_assignments")
     @enforce("read", "subjects")
-    @enforce("read", "subject_category")
-    def add_subject_category_assignment_dict(self,
-                                             user_id,
-                                             intra_extension_uuid,
-                                             subject_uuid,
-                                             category_uuid,
-                                             scope_uuid):
-        return self.driver.add_subject_category_assignment_dict(
-            intra_extension_uuid, subject_uuid, category_uuid, scope_uuid)
+    @enforce("read", "subject_categories")
+    @enforce("read", "subject_scopes")
+    def del_subject_assignment(self, user_id, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
+        if subject_id not in self.get_subject_dict(user_id, intra_extension_id):
+            raise SubjectUnknown()
+        elif subject_category_id not in self.get_subject_category_dict(user_id, intra_extension_id):
+            raise SubjectCategoryUnknown()
+        elif subject_scope_id not in self.get_subject_scope_dict(user_id, intra_extension_id, subject_category_id):
+            raise SubjectAssignmentOutOfScope
+        # TODO: raise SubjectAssignmentUnknown() for the below func
+        return self.driver.del_subject_category_assignment(intra_extension_id, subject_id, subject_category_id, subject_scope_id)
 
     @filter_args
-    @enforce("read", "object_category_assignment")
+    @enforce("read", "object_assignments")
     @enforce("read", "objects")
-    def get_object_category_assignment_dict(self, user_id, intra_extension_uuid, object_uuid):
-        return self.driver.get_object_category_assignment_dict(intra_extension_uuid, object_uuid)
+    def get_object_assignment_dict(self, user_id, intra_extension_id, object_id):
+        if object_id not in self.get_object_dict(user_id, intra_extension_id):
+            raise ObjectUnknown()
+        return self.driver.get_object_assignment_dict(intra_extension_id, object_id)
 
     @filter_args
-    @enforce("read", "object_category_assignment")
-    @enforce("write", "object_category_assignment")
+    @enforce(("read", "write"), "object_assignments")
     @enforce("read", "objects")
-    def set_object_category_assignment_dict(self, user_id, intra_extension_uuid, object_uuid, assignment_dict):
-        # TODO (asteroide): we must check input here.
-        return self.driver.set_object_category_assignment_dict(intra_extension_uuid, object_uuid, assignment_dict)
+    def set_object_category_assignment_dict(self, user_id, intra_extension_id, object_id, object_assignment_dict):
+        if object_id not in self.get_object_dict(user_id, intra_extension_id):
+            raise ObjectUnknown()
+        return self.driver.set_object_assignment_dict(intra_extension_id, object_id, object_assignment_dict)
 
     @filter_args
-    @enforce("read", "object_category_assignment")
-    @enforce("write", "object_category_assignment")
+    @enforce(("read", "write"), "object_assignments")
     @enforce("read", "objects")
     @enforce("read", "object_category")
-    def del_object_category_assignment(self, user_id, intra_extension_uuid, object_uuid, category_uuid, scope_uuid):
-        self.driver.remove_object_category_assignment(intra_extension_uuid, object_uuid, category_uuid, scope_uuid)
+    def add_object_assignment(self, user_id, intra_extension_id, object_id, object_category_id, object_scope_id):
+        if object_id not in self.get_object_dict(user_id, intra_extension_id):
+            raise ObjectUnknown()
+        elif object_category_id not in self.get_object_category_dict(user_id, intra_extension_id):
+            raise ObjectCategoryUnknown()
+        elif object_scope_id not in self.get_object_scope_dict(user_id, intra_extension_id, object_category_id):
+            raise ObjectAssignmentOutOfScope()
+        # TODO: raise ObjectAssignmentExisting() for the below func
+        return self.driver.add_object_assignment(intra_extension_id, object_id, object_category_id, object_scope_id)
 
     @filter_args
-    @enforce("write", "object_category_assignment")
+    @enforce(("read", "write"), "object_assignments")
     @enforce("read", "objects")
-    @enforce("read", "object_category")
-    def add_object_category_assignment_dict(self,
-                                            user_id,
-                                            intra_extension_uuid,
-                                            object_uuid,
-                                            category_uuid,
-                                            scope_uuid):
-        return self.driver.add_object_category_assignment_dict(
-            intra_extension_uuid, object_uuid, category_uuid, scope_uuid)
+    @enforce("read", "object_categories")
+    def del_object_assignment(self, user_id, intra_extension_id, object_id, object_category_id, object_scope_id):
+        if object_id not in self.get_object_dict(user_id, intra_extension_id):
+            raise ObjectUnknown()
+        elif object_category_id not in self.get_object_category_dict(user_id, intra_extension_id):
+            raise ObjectCategoryUnknown()
+        elif object_scope_id not in self.get_object_scope_dict(user_id, intra_extension_id, object_category_id):
+            raise ObjectAssignmentOutOfScope()
+        # TODO: raise SubjectAssignmentUnknown() for the below func
+        return self.driver.del_object_assignment(intra_extension_id, object_id, object_category_id, object_scope_id)
 
     @filter_args
-    @enforce("read", "action_category_assignment")
+    @enforce("read", "action_assignments")
     @enforce("read", "actions")
-    def get_action_category_assignment_dict(self, user_id, intra_extension_uuid, action_uuid):
-        return self.driver.get_action_category_assignment_dict(intra_extension_uuid, action_uuid)
+    def get_action_assignment_dict(self, user_id, intra_extension_id, action_id):
+        if action_id not in self.get_action_dict(user_id, intra_extension_id):
+            raise ActionUnknown()
+        return self.driver.get_action_assignment_dict(intra_extension_id, action_id)
 
     @filter_args
-    @enforce("read", "action_category_assignment")
-    @enforce("write", "action_category_assignment")
+    @enforce(("read", "write"), "action_assignments")
     @enforce("read", "actions")
-    def set_action_category_assignment_dict(self, user_id, intra_extension_uuid, action_uuid, assignment_dict):
-        # TODO (asteroide): we must check input here.
-        return self.driver.set_action_category_assignment_dict(intra_extension_uuid, action_uuid, assignment_dict)
+    def set_action_assignment_dict(self, user_id, intra_extension_id, action_id, action_assignment_dict):
+        if action_id not in self.get_action_dict(user_id, intra_extension_id):
+            raise ActionUnknown()
+        return self.driver.set_action_assignment_dict(intra_extension_id, action_id, action_assignment_dict)
 
     @filter_args
-    @enforce("read", "action_category_assignment")
-    @enforce("write", "action_category_assignment")
+    @enforce(("read", "write"), "action_assignments")
     @enforce("read", "actions")
-    @enforce("read", "action_category")
-    def del_action_category_assignment(self, user_id, intra_extension_uuid, action_uuid, category_uuid, scope_uuid):
-        self.driver.remove_action_category_assignment(intra_extension_uuid, action_uuid, category_uuid, scope_uuid)
+    @enforce("read", "action_categories")
+    def add_action_assignment(self, user_id, intra_extension_id, action_id, action_category_id, action_scope_id):
+        if action_id not in self.get_action_dict(user_id, intra_extension_id):
+            raise ActionUnknown()
+        elif action_category_id not in self.get_action_category_dict(user_id, intra_extension_id):
+            raise ActionCategoryUnknown()
+        elif action_scope_id not in self.get_action_scope_dict(user_id, intra_extension_id, action_category_id):
+            raise ActionAssignmentOutOfScope()
+        # TODO: raise ActionAssignmentExisting() for the below func
+        return self.driver.add_action_assignment(intra_extension_id, action_id, action_category_id, action_scope_id)
 
     @filter_args
-    @enforce("write", "action_category_assignment")
+    @enforce(("read", "write"), "action_assignments")
     @enforce("read", "actions")
-    @enforce("read", "action_category")
-    def add_action_category_assignment_dict(self,
-                                            user_id,
-                                            intra_extension_uuid,
-                                            action_uuid,
-                                            category_uuid,
-                                            scope_uuid):
-        return self.driver.add_action_category_assignment_dict(
-            intra_extension_uuid,
-            action_uuid,
-            category_uuid,
-            scope_uuid
-        )
+    @enforce("read", "action_categories")
+    def del_action_assignment(self, user_id, intra_extension_id, action_id, action_category_id, action_scope_id):
+        if action_id not in self.get_action_dict(user_id, intra_extension_id):
+            raise ActionUnknown()
+        elif action_category_id not in self.get_action_category_dict(user_id, intra_extension_id):
+            raise ActionCategoryUnknown()
+        elif action_scope_id not in self.get_action_scope_dict(user_id, intra_extension_id, action_category_id):
+            raise ActionAssignmentUnknown()
+        # TODO: raise ActionAssignmentUnknown() for the below func
+        return self.driver.del_action_assignment(intra_extension_id, action_id, action_category_id, action_scope_id)
 
     # Metarule functions
+
     @filter_args
-    @enforce("read", "aggregation_algorithms")
-    def get_aggregation_algorithm(self, user_id, intra_extension_uuid):
-        return self.driver.get_meta_rule_dict(intra_extension_uuid)
+    @enforce("write", "aggregation_algorithm")
+    def add_aggregation_algorithm(self, user_id, intra_extension_id, aggregation_algorithm_id):
+        if aggregation_algorithm_id is not self.dirver.get_aggregation_algorithm(intra_extension_id):
+            raise AggregationAlgorithmNotExisting()
+        elif aggregation_algorithm_id not in self.configuration_api.get_aggregation_algorithms:
+            raise AggregationAlgorithmOutOfScope()
+        return self.driver.add_aggregation_algorithm(intra_extension_id, aggregation_algorithm_id)
 
     @filter_args
-    @enforce("read", "aggregation_algorithms")
-    @enforce("write", "aggregation_algorithms")
-    def set_aggregation_algorithm(self, user_id, intra_extension_uuid, aggregation_algorithm):
-        if aggregation_algorithm not in self.get_aggregation_algorithms(
-                user_id, intra_extension_uuid)["aggregation_algorithms"]:
-            raise IntraExtensionError("Unknown aggregation_algorithm: {}".format(aggregation_algorithm))
-        meta_rule = self.driver.get_meta_rule_dict(intra_extension_uuid)
-        meta_rule["aggregation"] = aggregation_algorithm
-        return self.driver.set_meta_rule_dict(intra_extension_uuid, meta_rule)
+    @enforce("read", "aggregation_algorithm")
+    def get_aggregation_algorithm(self, user_id, intra_extension_id):
+        return self.driver.get_aggregation_algorithm(intra_extension_id)
+
+    @filter_args
+    @enforce("write", "aggregation_algorithm")
+    def del_aggregation_algorithm(self, user_id, intra_extension_id, aggregation_algorithm_id):
+        if aggregation_algorithm_id is not self.dirver.get_aggregation_algorithm(intra_extension_id):
+            raise AggregationAlgorithmNotExisting()
+        return self.driver.del_aggregation_algorithm(intra_extension_id, aggregation_algorithm_id)
 
     @filter_args
-    @enforce("read", "sub_meta_rule")
-    def get_sub_meta_rule(self, user_id, intra_extension_uuid):
-        return self.driver.get_meta_rule_dict(intra_extension_uuid)
+    @enforce("read", "sub_meta_rules")
+    def get_sub_meta_rule_dict(self, user_id, intra_extension_id):
+        return self.driver.get_meta_rule_dict(intra_extension_id)
 
     @filter_args
-    @enforce("read", "sub_meta_rule")
-    @enforce("write", "sub_meta_rule")
-    def set_sub_meta_rule(self, user_id, intra_extension_uuid, sub_meta_rules):
-        # TODO: check which algorithms are really usable
+    @enforce(("read", "write"), "sub_meta_rules")
+    def add_sub_meta_rule_dict(self, user_id,
+                               intra_extension_id,
+                               sub_meta_rule_name,
+                               subject_category_list,
+                               object_category_list,
+                               action_category_list,
+                               sub_meta_rule_algorithm):
+        for sub_meta_rule_id in sub_meta_rule_dict:
+            if sub_meta_rule_id not in self.get_sub_meta_rule_dict(user_id, intra_extension_id):
+                raise SubMetaRuleOutOfScope()
+            # for cat in ("subject_categories", "object_categories", "action_categories"):
+            #     if cat not in sub_meta_rule_dict[sub_meta_rule_id]:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} missed".format(cat))
+            #     if type(sub_meta_rule_dict[sub_meta_rule_id][cat]) is not list:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not a list".format(cat))
+            # subject_categories = self.get_subject_category_dict(user_id, intra_extension_id)["subject_categories"]
+            # for data in list(sub_meta_rule_dict[sub_meta_rule_id]["subject_categories"]):
+            #     if data not in subject_categories:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not part of subject_categories {}".format(
+            #             data, subject_categories))
+            # object_categories = self.get_object_category_dict(user_id, intra_extension_id)["object_categories"]
+            # for data in sub_meta_rule_dict[sub_meta_rule_id]["object_categories"]:
+            #     if data not in object_categories:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not part of object_categories {}".format(
+            #             data, object_categories))
+            # action_categories = self.get_action_category_dict(user_id, intra_extension_id)["actions_categories"]
+            # for data in sub_meta_rule_dict[sub_meta_rule_id]["action_categories"]:
+            #     if data not in action_categories:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not part of action_categories {}".format(
+            #             data, action_categories))
+        
+        return self.driver.set_meta_rule_dict(intra_extension_id,sub_meta_rule_dict)
+
+    @filter_args
+    @enforce(("read", "write"), "sub_meta_rules")
+    def set_sub_meta_rule_dict(self, user_id, intra_extension_id, sub_meta_rule_dict):
         # TODO (dthom): When sub_meta_rule is set, all rules must be dropped
-        # because the previous rules cannot be mapped to the new sub_meta_rule.
-        for relation in sub_meta_rules.keys():
-            if relation not in self.get_sub_meta_rule_relations(user_id, intra_extension_uuid)["sub_meta_rule_relations"]:
-                raise IntraExtensionError("set_sub_meta_rule unknown MetaRule relation {}".format(relation))
-            for cat in ("subject_categories", "object_categories", "action_categories"):
-                if cat not in sub_meta_rules[relation]:
-                    raise IntraExtensionError("set_sub_meta_rule category {} missed".format(cat))
-                if type(sub_meta_rules[relation][cat]) is not list:
-                    raise IntraExtensionError("set_sub_meta_rule category {} is not a list".format(cat))
-            subject_categories = self.get_subject_category_dict(user_id, intra_extension_uuid)["subject_categories"]
-            for data in list(sub_meta_rules[relation]["subject_categories"]):
-                if data not in subject_categories:
-                    raise IntraExtensionError("set_sub_meta_rule category {} is not part of subject_categories {}".format(
-                        data, subject_categories))
-            object_categories = self.get_object_category_dict(user_id, intra_extension_uuid)["object_categories"]
-            for data in sub_meta_rules[relation]["object_categories"]:
-                if data not in object_categories:
-                    raise IntraExtensionError("set_sub_meta_rule category {} is not part of object_categories {}".format(
-                        data, object_categories))
-            action_categories = self.get_action_category_dict(user_id, intra_extension_uuid)["actions_categories"]
-            for data in sub_meta_rules[relation]["action_categories"]:
-                if data not in action_categories:
-                    raise IntraExtensionError("set_sub_meta_rule category {} is not part of action_categories {}".format(
-                        data, action_categories))
-        aggregation = self.driver.get_meta_rule_dict(intra_extension_uuid)["aggregation"]
-        return self.driver.set_meta_rule_dict(
-            intra_extension_uuid,
-            {
-                "aggregation": aggregation,
-                "sub_meta_rules": sub_meta_rules
-            })
-
-    # Sub-rules functions
+        for sub_meta_rule_id in sub_meta_rule_dict:
+            if sub_meta_rule_id not in self.get_sub_meta_rule_dict(user_id, intra_extension_id):
+                raise SubMetaRuleOutOfScope()
+            # for cat in ("subject_categories", "object_categories", "action_categories"):
+            #     if cat not in sub_meta_rule_dict[sub_meta_rule_id]:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} missed".format(cat))
+            #     if type(sub_meta_rule_dict[sub_meta_rule_id][cat]) is not list:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not a list".format(cat))
+            # subject_categories = self.get_subject_category_dict(user_id, intra_extension_id)["subject_categories"]
+            # for data in list(sub_meta_rule_dict[sub_meta_rule_id]["subject_categories"]):
+            #     if data not in subject_categories:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not part of subject_categories {}".format(
+            #             data, subject_categories))
+            # object_categories = self.get_object_category_dict(user_id, intra_extension_id)["object_categories"]
+            # for data in sub_meta_rule_dict[sub_meta_rule_id]["object_categories"]:
+            #     if data not in object_categories:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not part of object_categories {}".format(
+            #             data, object_categories))
+            # action_categories = self.get_action_category_dict(user_id, intra_extension_id)["actions_categories"]
+            # for data in sub_meta_rule_dict[sub_meta_rule_id]["action_categories"]:
+            #     if data not in action_categories:
+            #         raise IntraExtensionError("set_sub_meta_rule category {} is not part of action_categories {}".format(
+            #             data, action_categories))
+        return self.driver.set_meta_rule_dict(intra_extension_id,sub_meta_rule_dict)
+
+    # Rule functions
     @filter_args
-    @enforce("read", "sub_rules")
-    def get_rules(self, user_id, intra_extension_uuid):
-        return self.driver.get_rules(intra_extension_uuid)
+    @enforce("read", "rule")
+    def get_rule_dict(self, user_id, intra_extension_id):
+        return self.driver.get_rule_dict(intra_extension_id)
 
     @filter_args
-    @enforce("read", "sub_rules")
-    @enforce("write", "sub_rules")
-    def set_rule(self, user_id, intra_extension_uuid, relation, sub_rule):
-        for item in sub_rule:
-            if type(item) not in (str, unicode, bool):
-                raise IntraExtensionError("Bad input data (sub_rule).")
-        ref_rules = self.driver.get_rules(intra_extension_uuid)
-        _sub_rule = list(sub_rule)
-        if relation not in self.get_sub_meta_rule_relations(user_id, intra_extension_uuid)["sub_meta_rule_relations"]:
-            raise IntraExtensionError("Bad input data (rules).")
-        # filter strings in sub_rule
-        sub_rule = [filter_input(x) for x in sub_rule]
-        # check if length of sub_rule is correct from metadata_sub_rule
-        metadata_sub_rule = self.get_sub_meta_rule(user_id, intra_extension_uuid)
-        metadata_sub_rule_length = len(metadata_sub_rule['sub_meta_rules'][relation]["subject_categories"]) + \
-                                   len(metadata_sub_rule['sub_meta_rules'][relation]["action_categories"]) + \
-                                   len(metadata_sub_rule['sub_meta_rules'][relation]["object_categories"]) + 1
-        if metadata_sub_rule_length != len(sub_rule):
-            raise IntraExtensionError("Bad number of argument in sub_rule {}/{}".format(sub_rule,
-                                                                                        metadata_sub_rule_length))
-        # check if each item in sub_rule match a corresponding scope value
-        for category in metadata_sub_rule['sub_meta_rules'][relation]["subject_categories"]:
-            item = _sub_rule.pop(0)
-            if item not in self.get_subject_category_scope_dict(
-                    user_id,
-                    intra_extension_uuid, category)["subject_category_scope"][category].keys():
-                raise IntraExtensionError("Bad subject value in sub_rule {}/{}".format(category, item))
-        for category in metadata_sub_rule['sub_meta_rules'][relation]["action_categories"]:
-            action_categories = self.get_action_category_scope_dict(
-                        user_id,
-                        intra_extension_uuid, category)["action_category_scope"][category]
-            item = _sub_rule.pop(0)
-            if item not in action_categories.keys():
-                self.moonlog_api.warning("set_sub_rule bad action value in sub_rule {}/{}".format(category, item))
-                raise IntraExtensionError("Bad input data.")
-        for category in metadata_sub_rule['sub_meta_rules'][relation]["object_categories"]:
-            item = _sub_rule.pop(0)
-            if item not in self.get_object_category_scope_dict(
-                    user_id,
-                    intra_extension_uuid, category)["object_category_scope"][category].keys():
-                raise IntraExtensionError("Bad object value in sub_rule {}/{}".format(category, item))
-        # check if relation is already there
-        if relation not in ref_rules["rules"]:
-            ref_rules["rules"][relation] = list()
+    @enforce(("read", "write"), "rule")
+    def set_rule_dict(self, user_id, intra_extension_id, sub_meta_rule_id, rule_dict):
+        # for item in rule_dict:
+        #     if type(item) not in (str, unicode, bool):
+        #         raise IntraExtensionError("Bad input data (sub_rule).")
+        # ref_rules = self.driver.get_rule_dict(intra_extension_id)
+        # _sub_rule = list(rule_dict)
+        # if sub_meta_rule_id not in self.get_sub_meta_rule_relations(user_id, intra_extension_id)["sub_meta_rule_relations"]:
+        #     raise IntraExtensionError("Bad input data (rules).")
+        # # filter strings in sub_rule
+        # rule_dict = [filter_input(x) for x in rule_dict]
+        # # check if length of sub_rule is correct from metadata_sub_rule
+        # metadata_sub_rule = self.get_sub_meta_rule_dict(user_id, intra_extension_id)
+        # metadata_sub_rule_length = len(metadata_sub_rule['sub_meta_rules'][sub_meta_rule_id]["subject_categories"]) + \
+        #                            len(metadata_sub_rule['sub_meta_rules'][sub_meta_rule_id]["action_categories"]) + \
+        #                            len(metadata_sub_rule['sub_meta_rules'][sub_meta_rule_id]["object_categories"]) + 1
+        # if metadata_sub_rule_length != len(rule_dict):
+        #     raise IntraExtensionError("Bad number of argument in sub_rule {}/{}".format(rule_dict,
+        #                                                                                 metadata_sub_rule_length))
+        # # check if each item in sub_rule match a corresponding scope value
+        # for category in metadata_sub_rule['sub_meta_rules'][sub_meta_rule_id]["subject_categories"]:
+        #     item = _sub_rule.pop(0)
+        #     if item not in self.get_subject_scope_dict(
+        #             user_id,
+        #             intra_extension_id, category)["subject_category_scope"][category].keys():
+        #         raise IntraExtensionError("Bad subject value in sub_rule {}/{}".format(category, item))
+        # for category in metadata_sub_rule['sub_meta_rules'][sub_meta_rule_id]["action_categories"]:
+        #     action_categories = self.get_action_scope_dict(
+        #                 user_id,
+        #                 intra_extension_id, category)["action_category_scope"][category]
+        #     item = _sub_rule.pop(0)
+        #     if item not in action_categories.keys():
+        #         self.moonlog_api.warning("set_sub_rule bad action value in sub_rule {}/{}".format(category, item))
+        #         raise IntraExtensionError("Bad input data.")
+        # for category in metadata_sub_rule['sub_meta_rules'][sub_meta_rule_id]["object_categories"]:
+        #     item = _sub_rule.pop(0)
+        #     if item not in self.get_object_scope_dict(
+        #             user_id,
+        #             intra_extension_id, category)["object_category_scope"][category].keys():
+        #         raise IntraExtensionError("Bad object value in sub_rule {}/{}".format(category, item))
+        # # check if relation is already there
+        # if sub_meta_rule_id not in ref_rules["rules"]:
+        #     ref_rules["rules"][sub_meta_rule_id] = list()
         # add sub_rule
-        ref_rules["rules"][relation].append(sub_rule)
-        return self.driver.set_rules(intra_extension_uuid, ref_rules["rules"])
+        ref_rules["rules"][sub_meta_rule_id].append(rule_dict)
+        return self.driver.set_rules(intra_extension_id, ref_rules["rules"])
+
+    @filter_args
+    @enforce(("read", "write"), "rule")
+    def add_rule(self, user_id, intra_extension_id, sub_meta_rule_id, rule_list):
+        # TODO: self.driver.set_rules ???
+        return self.driver.add_rule(intra_extension_id, sub_meta_rule_id, rule_list)
 
     @filter_args
-    @enforce("read", "sub_rules")
-    @enforce("write", "sub_rules")
-    def del_rule(self, user_id, intra_extension_uuid, relation_name, sub_rule):
-        ref_rules = self.driver.get_rules(intra_extension_uuid)
-        sub_rule = sub_rule.split("+")
-        for index, _item in enumerate(sub_rule):
+    @enforce(("read", "write"), "rule")
+    def del_rule(self, user_id, intra_extension_id, sub_meta_rule_id, rule_id):
+        ref_rules = self.driver.get_rule_dict(intra_extension_id)
+        rule_id = rule_id.split("+")
+        for index, _item in enumerate(rule_id):
             if "True" in _item:
-                sub_rule[index] = True
+                rule_id[index] = True
             if "False" in _item:
-                sub_rule[index] = False
+                rule_id[index] = False
         if relation_name in ref_rules["rules"]:
-            if sub_rule in ref_rules["rules"][relation_name]:
-                ref_rules["rules"][relation_name].remove(sub_rule)
+            if rule_id in ref_rules["rules"][relation_name]:
+                ref_rules["rules"][relation_name].remove(rule_id)
             else:
                 raise RuleUnknown()
         else:
             raise IntraExtensionError("Unknown relation name for rules: {}".format(relation_name))
-        self.driver.set_rules(intra_extension_uuid, ref_rules["rules"])
-
+        self.driver.set_rules(intra_extension_id, ref_rules["rules"])
+        ref_rules["rules"][sub_meta_rule_id].append(rule_dict)
+        return self.driver.set_rules(intra_extension_id, ref_rules["rules"])
 
 @dependency.provider('authz_api')
 @dependency.requires('identity_api', 'tenant_api', 'moonlog_api')
@@ -1254,22 +1330,23 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
     __genre__ = "authz"
 
     def authz(self, tenant_name, subject_name, object_name, action_name):
+        # TODO (dthom) add moon log
         """Check authorization for a particular action.
         :return: True or False or raise an exception
         """
-        tenant_id = self.tenant_api.get_tenant_id_from_name(self.__default_user, tenant_name)
-        intra_extension_id = self.tenant_api.get_extension_id(tenant_id, self.__genre__)
-        subject_dict = self.get_subject_dict(self.__default_user, intra_extension_id)
+        tenant_id = self.tenant_api.get_tenant_id_from_name(DEFAULT_USER, tenant_name)
+        intra_extension_id = self.tenant_api.get_tenant_intra_extension_id(DEFAULT_USER, tenant_id, self.__genre__)
+        subject_dict = self.get_subject_dict(DEFAULT_USER, intra_extension_id)
         subject_id = None
         for _subject_id in subject_dict:
             if subject_dict[_subject_id] is subject_name:
                 subject_id = _subject_id
-        object_dict = self.get_object_dict(self.__default_user, intra_extension_id)
+        object_dict = self.get_object_dict(DEFAULT_USER, intra_extension_id)
         object_id = None
         for _object_id in object_dict:
             if object_dict[_object_id] is object_name:
                 object_id = _object_id
-        action_dict = self.get_action_dict(self.__default_user, intra_extension_id)
+        action_dict = self.get_action_dict(DEFAULT_USER, intra_extension_id)
         action_id = None
         for _action_id in action_dict:
             if action_dict[_action_id] is action_name:
@@ -1277,13 +1354,13 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
 
         return super(IntraExtensionAuthzManager, self).authz(intra_extension_id, subject_id, object_id, action_id)
 
-    def delete_intra_extension(self, intra_extension_id):
+    def del_intra_extension(self, intra_extension_id):
         raise AdminException()
 
     def set_subject_dict(self, user_id, intra_extension_uuid, subject_dict):
         raise SubjectAddNotAuthorized()
 
-    def add_subject_dict(self, user_id, intra_extension_uuid, subject_name):
+    def add_subject(self, user_id, intra_extension_uuid, subject_name):
         raise SubjectAddNotAuthorized()
 
     def del_subject(self, user_id, intra_extension_uuid, subject_name):
@@ -1292,7 +1369,7 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
     def set_object_dict(self, user_id, intra_extension_uuid, object_dict):
         raise ObjectAddNotAuthorized()
 
-    def add_object_dict(self, user_id, intra_extension_uuid, object_name):
+    def add_object(self, user_id, intra_extension_uuid, object_name):
         raise ObjectAddNotAuthorized()
 
     def del_object(self, user_id, intra_extension_uuid, object_uuid):
@@ -1301,7 +1378,7 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
     def set_action_dict(self, user_id, intra_extension_uuid, action_dict):
         raise ActionAddNotAuthorized()
 
-    def add_action_dict(self, user_id, intra_extension_uuid, action_dict):
+    def add_action(self, user_id, intra_extension_uuid, action_dict):
         raise ActionAddNotAuthorized()
 
     def del_action(self, user_id, intra_extension_uuid, action_uuid):
@@ -1310,7 +1387,7 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
     def set_subject_category_dict(self, user_id, intra_extension_uuid, subject_category):
         raise SubjectCategoryAddNotAuthorized()
 
-    def add_subject_category_dict(self, user_id, intra_extension_uuid, subject_category_name):
+    def add_subject_category(self, user_id, intra_extension_uuid, subject_category_name):
         raise SubjectCategoryAddNotAuthorized()
 
     def del_subject_category(self, user_id, intra_extension_uuid, subject_uuid):
@@ -1319,7 +1396,7 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
     def set_object_category_dict(self, user_id, intra_extension_uuid, object_category):
         raise ObjectCategoryAddNotAuthorized()
 
-    def add_object_category_dict(self, user_id, intra_extension_uuid, object_category_name):
+    def add_object_category(self, user_id, intra_extension_uuid, object_category_name):
         raise ObjectCategoryAddNotAuthorized()
 
     def del_object_category(self, user_id, intra_extension_uuid, object_uuid):
@@ -1328,70 +1405,70 @@ class IntraExtensionAuthzManager(IntraExtensionManager):
     def set_action_category_dict(self, user_id, intra_extension_uuid, action_category):
         raise ActionCategoryAddNotAuthorized()
 
-    def add_action_category_dict(self, user_id, intra_extension_uuid, action_category_name):
+    def add_action_category(self, user_id, intra_extension_uuid, action_category_name):
         raise ActionCategoryAddNotAuthorized()
 
     def del_action_category(self, user_id, intra_extension_uuid, action_uuid):
         raise ActionCategoryDelNotAuthorized()
 
-    def set_subject_category_scope_dict(self, user_id, intra_extension_uuid, category, scope):
+    def set_subject_scope_dict(self, user_id, intra_extension_uuid, category, scope):
         raise SubjectCategoryScopeAddNotAuthorized()
 
-    def add_subject_category_scope_dict(self, user_id, intra_extension_uuid, subject_category, scope_name):
+    def add_subject_scope(self, user_id, intra_extension_uuid, subject_category, scope_name):
         raise SubjectCategoryScopeAddNotAuthorized()
 
-    def del_subject_category_scope(self, user_id, intra_extension_uuid, subject_category, subject_category_scope):
+    def del_subject_scope(self, user_id, intra_extension_uuid, subject_category, subject_category_scope):
         raise SubjectCategoryScopeDelNotAuthorized()
 
-    def set_object_category_scope_dict(self, user_id, intra_extension_uuid, category, scope):
+    def set_object_scope_dict(self, user_id, intra_extension_uuid, category, scope):
         raise ObjectCategoryScopeAddNotAuthorized()
 
-    def add_object_category_scope_dict(self, user_id, intra_extension_uuid, object_category, scope_name):
+    def add_object_scope(self, user_id, intra_extension_uuid, object_category, scope_name):
         raise ObjectCategoryScopeAddNotAuthorized()
 
-    def del_object_category_scope(self, user_id, intra_extension_uuid, object_category, object_category_scope):
+    def del_object_scope(self, user_id, intra_extension_uuid, object_category, object_category_scope):
         raise ObjectCategoryScopeDelNotAuthorized()
 
-    def set_action_category_scope_dict(self, user_id, intra_extension_uuid, category, scope):
+    def set_action_scope_dict(self, user_id, intra_extension_uuid, category, scope):
         raise ActionCategoryScopeAddNotAuthorized()
 
-    def add_action_category_scope_dict(self, user_id, intra_extension_uuid, action_category, scope_name):
+    def add_action_scope(self, user_id, intra_extension_uuid, action_category, scope_name):
         raise ActionCategoryScopeAddNotAuthorized()
 
-    def del_action_category_scope(self, user_id, intra_extension_uuid, action_category, action_category_scope):
+    def del_action_scope(self, user_id, intra_extension_uuid, action_category, action_category_scope):
         raise ActionCategoryScopeDelNotAuthorized()
 
-    def set_subject_category_assignment_dict(self, user_id, intra_extension_uuid, subject_uuid, assignment_dict):
+    def set_subject_assignment_dict(self, user_id, intra_extension_uuid, subject_uuid, assignment_dict):
         raise SubjectCategoryAssignmentAddNotAuthorized()
 
-    def del_subject_category_assignment(self, user_id, intra_extension_uuid, subject_uuid, category_uuid, scope_uuid):
+    def del_subject_assignment(self, user_id, intra_extension_uuid, subject_uuid, category_uuid, scope_uuid):
         raise SubjectCategoryAssignmentAddNotAuthorized()
 
-    def add_subject_category_assignment_dict(self, user_id, intra_extension_uuid, subject_uuid, category_uuid, scope_uuid):
+    def add_subject_assignment(self, user_id, intra_extension_uuid, subject_uuid, category_uuid, scope_uuid):
         raise SubjectCategoryAssignmentDelNotAuthorized()
 
     def set_object_category_assignment_dict(self, user_id, intra_extension_uuid, object_uuid, assignment_dict):
         raise ObjectCategoryAssignmentAddNotAuthorized()
 
-    def del_object_category_assignment(self, user_id, intra_extension_uuid, object_uuid, category_uuid, scope_uuid):
+    def del_object_assignment(self, user_id, intra_extension_uuid, object_uuid, category_uuid, scope_uuid):
         raise ObjectCategoryAssignmentAddNotAuthorized()
 
-    def add_object_category_assignment_dict(self, user_id, intra_extension_uuid, object_uuid, category_uuid, scope_uuid):
+    def add_object_assignment(self, user_id, intra_extension_uuid, object_uuid, category_uuid, scope_uuid):
         raise ObjectCategoryAssignmentDelNotAuthorized()
 
-    def set_action_category_assignment_dict(self, user_id, intra_extension_uuid, action_uuid, assignment_dict):
+    def set_action_assignment_dict(self, user_id, intra_extension_uuid, action_uuid, assignment_dict):
         raise ActionCategoryAssignmentAddNotAuthorized()
 
-    def del_action_category_assignment(self, user_id, intra_extension_uuid, action_uuid, category_uuid, scope_uuid):
+    def del_action_assignment(self, user_id, intra_extension_uuid, action_uuid, category_uuid, scope_uuid):
         raise ActionCategoryAssignmentAddNotAuthorized()
 
-    def add_action_category_assignment_dict(self, user_id, intra_extension_uuid, action_uuid, category_uuid, scope_uuid):
+    def add_action_assignment(self, user_id, intra_extension_uuid, action_uuid, category_uuid, scope_uuid):
         raise ActionCategoryAssignmentDelNotAuthorized()
 
     def set_aggregation_algorithm(self, user_id, intra_extension_uuid, aggregation_algorithm):
         raise MetaRuleAddNotAuthorized()
 
-    def set_sub_meta_rule(self, user_id, intra_extension_uuid, sub_meta_rules):
+    def set_sub_meta_rule_dict(self, user_id, intra_extension_uuid, sub_meta_rules):
         raise MetaRuleAddNotAuthorized()
 
     def set_sub_rule(self, user_id, intra_extension_uuid, relation, sub_rule):
@@ -1527,33 +1604,6 @@ class TenantDriver(object):
         raise exception.NotImplemented()  # pragma: no cover
 
 
-class AuthzDriver(object):
-
-    def get_subject_category_list(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_object_category_list(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_action_category_list(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_subject_category_value_dict(self, extension_uuid, subject_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_object_category_value_dict(self, extension_uuid, object_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_action_category_value_dict(self, extension_uuid, action_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_meta_rule(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_rules(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-
 class IntraExtensionDriver(object):
 
     SUBJECT = 'subject'
@@ -1625,7 +1675,7 @@ class IntraExtensionDriver(object):
         elif data_name == self.OBJECT_SCOPE:
             if not category_uuid:
                 category_uuid = self.get_uuid_from_name(intra_extension_uuid, category_name, self.OBJECT_CATEGORY)
-            data_values = self.get_object_category_scope_dict(intra_extension_uuid,
+            data_values = self.get_object_scope_dict(intra_extension_uuid,
                                                               category_uuid)["object_category_scope"]
             if (name and name not in extract_name(data_values)) or \
                 (uuid and uuid not in data_values.keys()):
@@ -1633,7 +1683,7 @@ class IntraExtensionDriver(object):
         elif data_name == self.ACTION_SCOPE:
             if not category_uuid:
                 category_uuid = self.get_uuid_from_name(intra_extension_uuid, category_name, self.ACTION_CATEGORY)
-            data_values = self.get_action_category_scope_dict(intra_extension_uuid,
+            data_values = self.get_action_scope_dict(intra_extension_uuid,
                                                               category_uuid)["action_category_scope"]
             if (name and name not in extract_name(data_values)) or \
                     (uuid and uuid not in data_values.keys()):
@@ -1641,7 +1691,7 @@ class IntraExtensionDriver(object):
         if category_uuid:
             return data_values[category_uuid]
         return data_values
-    # zzzzzzzzzzzzzzzzzz
+
     def get_uuid_from_name(self, intra_extension_uuid, name, data_name, category_name=None, category_uuid=None):
         data_values = self.__get_data_from_type(
             intra_extension_uuid=intra_extension_uuid,
@@ -1664,26 +1714,26 @@ class IntraExtensionDriver(object):
 
     # Getter and Setter for intra_extension
 
-    def get_intra_extension_list(self):
-        """Get a list of IntraExtension UUIDs
-        :return: a list of IntraExtension UUIDs ["uuid1", "uuid2"]
+    def get_intra_extension_dict(self):
+        """Get a list of IntraExtension
+        :return: {"intra_extension_id": "intra_extension_name", }
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def get_intra_extension_dict(self, intra_extension_id):
+    def get_intra_extension(self, intra_extension_id):
         """Get a description of an IntraExtension
         :param intra_extension_id: the IntraExtension UUID
         :return: {intra_extension_id: intra_extension_name, ...}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_intra_extension(self, extension_uuid, extension_dict):
+    def set_intra_extension(self, intra_extension_id, intra_extension_dict):
         """Set a new IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param extension_dict: a dictionary withe the description of the IntraExtension (see below)
-        :type extension_dict: dict
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param intra_extension_dict: a dictionary withe the description of the IntraExtension (see below)
+        :type intra_extension_dict: dict
         :return: the IntraExtension dictionary, example:
         {
             "id": "uuid1",
@@ -1694,619 +1744,603 @@ class IntraExtensionDriver(object):
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def delete_intra_extension(self, extension_uuid):
+    def del_intra_extension(self, intra_extension_id):
         """Delete an IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter ad Setter for subjects
+    # Metadata functions
 
-    def get_subject_dict(self, extension_uuid):
-        """Get the list of subject for that IntraExtension
+    def get_subject_category_dict(self, intra_extension_id):
+        """Get a list of all subject categories
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :return: a dictionary containing all subjects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :return: a dictionary containing all subject categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_subject_dict(self, extension_uuid, subject_dict):
-        """Set the list of subject for that IntraExtension
+    def set_subject_category_dict(self, intra_extension_id, subject_category_dict):
+        """Set the list of all subject categories
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_dict: dict of subject: {"uuid1": "name1", "uuid2": "name2"}
-        :type subject_dict: dict
-        :return: a dictionary containing all subjects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_dict: dict of subject categories {"uuid1": "name1", "uuid2": "name2"}
+        :type subject_category_dict: dict
+        :return: a dictionary containing all subject categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_subject(self, extension_uuid, subject_uuid, subject_name):
-        """Add a subject
+    def add_subject_category(self, intra_extension_id, subject_category_id, subject_category_name):
+        """Add a subject category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_uuid: Subject UUID
-        :type subject_uuid: string
-        :param subject_name: Subject name
-        :type subject_name: string
-        :return: the added subject {"uuid1": "name1"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_id: the UUID of the subject category
+        :type subject_category_id: string
+        :param subject_category_name: the name of the subject category
+        :type subject_category_name: string
+        :return: a dictionnary with the subject catgory added {"uuid1": "name1"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_subject(self, extension_uuid, subject_uuid):
-        """Remove a subject
+    def del_subject_category(self, intra_extension_id, subject_category_id):
+        """Remove one subject category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_uuid: Subject UUID
-        :type subject_uuid: string
-        :return: None
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_id: the UUID of subject category to remove
+        :type subject_category_id: string
+        :return: a dictionary containing all subject categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter ad Setter for objects
-
-    def get_object_dict(self, extension_uuid):
-        """Get the list of object for that IntraExtension
+    def get_object_category_dict(self, intra_extension_id):
+        """Get a list of all object categories
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :return: a dictionary containing all objects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :return: a dictionary containing all object categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_object_dict(self, extension_uuid, object_dict):
-        """Set the list of object for that IntraExtension
+    def set_object_category_dict(self, intra_extension_id, object_category_dict):
+        """Set the list of all object categories
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_dict: dict of object: {"uuid1": "name1", "uuid2": "name2"}
-        :type object_dict: dict
-        :return: a dictionary containing all objects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_dict: dict of object categories {"uuid1": "name1", "uuid2": "name2"}
+        :type object_category_dict: dict
+        :return: a dictionary containing all object categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_object(self, extension_uuid, object_uuid, object_name):
-        """Ad an object
+    def add_object_category(self, intra_extension_id, object_category_id, object_category_name):
+        """Add a object category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_uuid: Object UUID
-        :type object_uuid: string
-        :param object_name: Object name
-        :type object_name: string
-        :return: the added object {"uuid1": "name1"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_id: the UUID of the object category
+        :type object_category_id: string
+        :param object_category_name: the name of the object category
+        :type object_category_name: string
+        :return: a dictionnary with the object catgory added {"uuid1": "name1"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_object(self, extension_uuid, object_uuid):
-        """Remove an object
+    def del_object_category(self, intra_extension_id, object_category_id):
+        """Remove one object category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_uuid: Object UUID
-        :type object_uuid: string
-        :return: None
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_id: the UUID of object category to remove
+        :type object_category_id: string
+        :return: a dictionary containing all object categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter ad Setter for actions
-
-    def get_action_dict(self, extension_uuid):
-        """ Get the list of action for that IntraExtension
+    def get_action_category_dict(self, intra_extension_id):
+        """Get a list of all action categories
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :return: a dictionary containing all actions for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :return: a dictionary containing all action categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_action_dict(self, extension_uuid, action_dict):
-        """ Set the list of action for that IntraExtension
+    def set_action_category_dict(self, intra_extension_id, action_category_dict):
+        """Set the list of all action categories
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_dict: dict of actions: {"uuid1": "name1", "uuid2": "name2"}
-        :type action_dict: dict
-        :return: a dictionary containing all actions for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_dict: dict of action categories {"uuid1": "name1", "uuid2": "name2"}
+        :type action_category_dict: dict
+        :return: a dictionary containing all action categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_action(self, extension_uuid, action_uuid, action_name):
-        """Ad an action
+    def add_action_category(self, intra_extension_id, action_category_id, action_category_name):
+        """Add a action category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_uuid: Action UUID
-        :type action_uuid: string
-        :param action_name: Action name
-        :type action_name: string
-        :return: the added action {"uuid1": "name1"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_id: the UUID of the action category
+        :type action_category_id: string
+        :param action_category_name: the name of the action category
+        :type action_category_name: string
+        :return: a dictionnary with the action catgory added {"uuid1": "name1"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_action(self, extension_uuid, action_uuid):
-        """Remove an action
+    def del_action_category(self, intra_extension_id, action_category_id):
+        """Remove one action category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_uuid: Action UUID
-        :type action_uuid: string
-        :return: None
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_id: the UUID of action category to remove
+        :type action_category_id: string
+        :return: a dictionary containing all action categories {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter ad Setter for subject_category
+    #  Perimeter functions
 
-    def get_subject_category_dict(self, extension_uuid):
-        """Get a list of all subject categories
+    def get_subject_dict(self, intra_extension_id):
+        """Get the list of subject for that IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :return: a dictionary containing all subject categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :return: a dictionary containing all subjects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_subject_category_dict(self, extension_uuid, subject_categories):
-        """Set the list of all subject categories
+    def set_subject_dict(self, intra_extension_id, subject_dict):
+        """Set the list of subject for that IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_categories: dict of subject categories {"uuid1": "name1", "uuid2": "name2"}
-        :type subject_categories: dict
-        :return: a dictionary containing all subject categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_dict: dict of subject: {"uuid1": "name1", "uuid2": "name2"}
+        :type subject_dict: dict
+        :return: a dictionary containing all subjects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_subject_category_dict(self, extension_uuid, subject_category_uuid, subject_category_name):
-        """Add a subject category
+    def add_subject(self, intra_extension_id, subject_id, subject_name):
+        """Add a subject
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_category_uuid: the UUID of the subject category
-        :type subject_category_uuid: string
-        :param subject_category_name: the name of the subject category
-        :type subject_category_name: string
-        :return: a dictionnary with the subject catgory added {"uuid1": "name1"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_id: Subject UUID
+        :type subject_id: string
+        :param subject_name: Subject name
+        :type subject_name: string
+        :return: the added subject {"uuid1": "name1"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_subject_category(self, extension_uuid, subject_category_uuid):
-        """Remove one subject category
+    def del_subject(self, intra_extension_id, subject_id):
+        """Remove a subject
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_category_uuid: the UUID of subject category to remove
-        :type subject_category_uuid: string
-        :return: a dictionary containing all subject categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_id: Subject UUID
+        :type subject_id: string
+        :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter ad Setter for object_category
-
-    def get_object_category_dict(self, extension_uuid):
-        """Get a list of all object categories
+    def get_object_dict(self, intra_extension_id):
+        """Get the list of object for that IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :return: a dictionary containing all object categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :return: a dictionary containing all objects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_object_category_dict(self, extension_uuid, object_categories):
-        """Set the list of all object categories
+    def set_object_dict(self, intra_extension_id, object_dict):
+        """Set the list of object for that IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_categories: dict of object categories {"uuid1": "name1", "uuid2": "name2"}
-        :type object_categories: dict
-        :return: a dictionary containing all object categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_dict: dict of object: {"uuid1": "name1", "uuid2": "name2"}
+        :type object_dict: dict
+        :return: a dictionary containing all objects for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_object_category_dict(self, extension_uuid, object_category_uuid, object_category_name):
-        """Add a object category
+    def add_object(self, intra_extension_id, object_id, object_name):
+        """Ad an object
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_category_uuid: the UUID of the object category
-        :type object_category_uuid: string
-        :param object_category_name: the name of the object category
-        :type object_category_name: string
-        :return: a dictionnary with the object catgory added {"uuid1": "name1"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_id: Object UUID
+        :type object_id: string
+        :param object_name: Object name
+        :type object_name: string
+        :return: the added object {"uuid1": "name1"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_object_category(self, extension_uuid, object_category_uuid):
-        """Remove one object category
+    def del_object(self, intra_extension_id, object_id):
+        """Remove an object
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_category_uuid: the UUID of object category to remove
-        :type object_category_uuid: string
-        :return: a dictionary containing all object categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_id: Object UUID
+        :type object_id: string
+        :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter ad Setter for action_category
-
-    def get_action_category_dict(self, extension_uuid):
-        """Get a list of all action categories
+    def get_action_dict(self, intra_extension_id):
+        """ Get the list of action for that IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :return: a dictionary containing all action categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :return: a dictionary containing all actions for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_action_category_dict(self, extension_uuid, action_categories):
-        """Set the list of all action categories
+    def set_action_dict(self, intra_extension_id, action_dict):
+        """ Set the list of action for that IntraExtension
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_categories: dict of action categories {"uuid1": "name1", "uuid2": "name2"}
-        :type action_categories: dict
-        :return: a dictionary containing all action categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_dict: dict of actions: {"uuid1": "name1", "uuid2": "name2"}
+        :type action_dict: dict
+        :return: a dictionary containing all actions for that IntraExtension, eg. {"uuid1": "name1", "uuid2": "name2"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_action_category_dict(self, extension_uuid, action_category_uuid, action_category_name):
-        """Add a action category
+    def add_action(self, intra_extension_id, action_id, action_name):
+        """Ad an action
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_category_uuid: the UUID of the action category
-        :type action_category_uuid: string
-        :param action_category_name: the name of the action category
-        :type action_category_name: string
-        :return: a dictionnary with the action catgory added {"uuid1": "name1"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_id: Action UUID
+        :type action_id: string
+        :param action_name: Action name
+        :type action_name: string
+        :return: the added action {"uuid1": "name1"}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_action_category(self, extension_uuid, action_category_uuid):
-        """Remove one action category
+    def del_action(self, intra_extension_id, action_id):
+        """Remove an action
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_category_uuid: the UUID of action category to remove
-        :type action_category_uuid: string
-        :return: a dictionary containing all action categories {"uuid1": "name1", "uuid2": "name2"}
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_id: Action UUID
+        :type action_id: string
+        :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for subject_category_value_scope
+    # Scope functions
 
-    def get_subject_category_scope_dict(self, extension_uuid, category):
+    def get_subject_scope_dict(self, intra_extension_id, subject_category_id):
         """Get a list of all subject category scope
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param category: the category UUID where the scope values are
-        :type category: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_id: the category UUID where the scope values are
+        :type subject_category_id: string
         :return: a dictionary containing all subject category scope {"category1": {"scope_uuid1": "scope_name1}}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_subject_category_scope_dict(self, extension_uuid, subject_category, scope):
+    def set_subject_scope_dict(self, intra_extension_id, subject_category_id, subject_scope_dict):
         """Set the list of all scope for that subject category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_category: the UUID of the subject category where this scope will be set
-        :type subject_category: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_id: the UUID of the subject category where this scope will be set
+        :type subject_category_id: string
         :return: a dictionary containing all scope {"scope_uuid1": "scope_name1, "scope_uuid2": "scope_name2}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_subject_category_scope_dict(self, extension_uuid, subject_category, scope_uuid, scope_name):
+    def add_subject_scope(self, intra_extension_id, subject_category_id, subject_scope_id, subject_scope_name):
         """Add a subject category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_category: the subject category UUID where the scope will be added
-        :type subject_category: string
-        :param scope_uuid: the UUID of the subject category
-        :type scope_uuid: string
-        :param scope_name: the name of the subject category
-        :type scope_name: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_id: the subject category UUID where the scope will be added
+        :type subject_category_id: string
+        :param subject_scope_id: the UUID of the subject category
+        :type subject_scope_id: string
+        :param subject_scope_name: the name of the subject category
+        :type subject_scope_name: string
         :return: a dictionary containing the subject category scope added {"category1": {"scope_uuid1": "scope_name1}}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_subject_category_scope_dict(self, extension_uuid, subject_category, scope_uuid):
+    def del_subject_scope(self, intra_extension_id, subject_category_id, subject_scope_id):
         """Remove one scope belonging to a subject category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_category: the UUID of subject categorywhere we can find the scope to remove
-        :type subject_category: string
-        :param scope_uuid: the UUID of the scope to remove
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_category_id: the UUID of subject categorywhere we can find the scope to remove
+        :type subject_category_id: string
+        :param subject_scope_id: the UUID of the scope to remove
+        :type subject_scope_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for object_category_scope
-
-    def get_object_category_scope_dict(self, extension_uuid, category):
+    def get_object_scope_dict(self, intra_extension_id, object_category_id):
         """Get a list of all object category scope
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param category: the category UUID where the scope values are
-        :type category: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_id: the category UUID where the scope values are
+        :type object_category_id: string
         :return: a dictionary containing all object category scope {"category1": {"scope_uuid1": "scope_name1}}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_object_category_scope_dict(self, extension_uuid, object_category, scope):
+    def set_object_scope_dict(self, intra_extension_id, object_category_id, object_scope_dict):
         """Set the list of all scope for that object category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_category: the UUID of the object category where this scope will be set
-        :type object_category: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_id: the UUID of the object category where this scope will be set
+        :type object_category_id: string
         :return: a dictionary containing all scope {"scope_uuid1": "scope_name1, "scope_uuid2": "scope_name2}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_object_category_scope_dict(self, extension_uuid, object_category, scope_uuid, scope_name):
+    def add_object_scope(self, intra_extension_id, object_category_id, object_scope_id, object_scope_name):
         """Add a object category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_category: the object category UUID where the scope will be added
-        :type object_category: string
-        :param scope_uuid: the UUID of the object category
-        :type scope_uuid: string
-        :param scope_name: the name of the object category
-        :type scope_name: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_id: the object category UUID where the scope will be added
+        :type object_category_id: string
+        :param object_scope_id: the UUID of the object category
+        :type object_scope_id: string
+        :param object_scope_name: the name of the object category
+        :type object_scope_name: string
         :return: a dictionary containing the object category scope added {"category1": {"scope_uuid1": "scope_name1}}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_object_category_scope_dict(self, extension_uuid, object_category, scope_uuid):
+    def del_object_scope(self, intra_extension_id, object_category_id, object_scope_id):
         """Remove one scope belonging to a object category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_category: the UUID of object categorywhere we can find the scope to remove
-        :type object_category: string
-        :param scope_uuid: the UUID of the scope to remove
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_category_id: the UUID of object categorywhere we can find the scope to remove
+        :type object_category_id: string
+        :param object_scope_id: the UUID of the scope to remove
+        :type object_scope_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for action_category_scope
-
-    def get_action_category_scope_dict(self, extension_uuid, category):
+    def get_action_scope_dict(self, intra_extension_id, action_category_id):
         """Get a list of all action category scope
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param category: the category UUID where the scope values are
-        :type category: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_id: the category UUID where the scope values are
+        :type action_category_id: string
         :return: a dictionary containing all action category scope {"category1": {"scope_uuid1": "scope_name1}}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_action_category_scope_dict(self, extension_uuid, action_category, scope):
+    def set_action_scope_dict(self, intra_extension_id, action_category_id, action_scope_id):
         """Set the list of all scope for that action category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_category: the UUID of the action category where this scope will be set
-        :type action_category: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_id: the UUID of the action category where this scope will be set
+        :type action_category_id: string
         :return: a dictionary containing all scope {"scope_uuid1": "scope_name1, "scope_uuid2": "scope_name2}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_action_category_scope_dict(self, extension_uuid, action_category, scope_uuid, scope_name):
+    def add_action_scope(self, intra_extension_id, action_category_id, action_scope_id, action_scope_name):
         """Add a action category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_category: the action category UUID where the scope will be added
-        :type action_category: string
-        :param scope_uuid: the UUID of the action category
-        :type scope_uuid: string
-        :param scope_name: the name of the action category
-        :type scope_name: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_id: the action category UUID where the scope will be added
+        :type action_category_id: string
+        :param action_scope_id: the UUID of the action category
+        :type action_scope_id: string
+        :param action_scope_name: the name of the action category
+        :type action_scope_name: string
         :return: a dictionary containing the action category scope added {"category1": {"scope_uuid1": "scope_name1}}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_action_category_scope_dict(self, extension_uuid, action_category, scope_uuid):
+    def del_action_scope(self, intra_extension_id, action_category_id, action_scope_id):
         """Remove one scope belonging to a action category
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_category: the UUID of action categorywhere we can find the scope to remove
-        :type action_category: string
-        :param scope_uuid: the UUID of the scope to remove
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_category_id: the UUID of action categorywhere we can find the scope to remove
+        :type action_category_id: string
+        :param action_scope_id: the UUID of the scope to remove
+        :type action_scope_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for subject_category_assignment
+    # Assignment functions
 
-    def get_subject_category_assignment_dict(self, extension_uuid, subject_uuid):
+    def get_subject_assignment_dict(self, intra_extension_id, subject_id):
         """Get the assignment for a given subject_uuid
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_uuid: subject UUID
-        :type subject_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_id: subject UUID
+        :type subject_id: string
         :return: a dictionary of assignment for the given subject {"cat1": ["scope_uuid1", "scope_uuid2"]}
         :raises: IntraExtensionNotFound, SubjectUnknown, SubjectCategoryAssignmentUnknown, SubjectCategoryAssignmentOutOfScope
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_subject_category_assignment_dict(self, extension_uuid, subject_uuid, assignment_dict):
+    def set_subject_assignment_dict(self, intra_extension_id, subject_id, subject_assignment_dict):
         """Set the assignment for a given subject_uuid
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_uuid: subject UUID
-        :type subject_uuid: string
-        :param assignment_dict: the assignment dictionary {"cat1": ["scope_uuid1", "scope_uuid2"]}
-        :type assignment_dict: dict
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_id: subject UUID
+        :type subject_id: string
+        :param subject_assignment_dict: the assignment dictionary {"cat1": ["scope_uuid1", "scope_uuid2"]}
+        :type subject_assignment_dict: dict
         :return: a dictionary of assignment for the given subject {"cat1": ["scope_uuid1", "scope_uuid2"]}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_subject_category_assignment_dict(self, extension_uuid, subject_uuid, category_uuid, scope_uuid):
+    def add_subject_assignment(self, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
         """Add a scope to a category and to a subject
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_uuid: the subject UUID
-        :type subject_uuid: string
-        :param category_uuid: the category UUID
-        :type category_uuid: string
-        :param scope_uuid: the scope UUID
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_id: the subject UUID
+        :type subject_id: string
+        :param subject_category_id: the category UUID
+        :type subject_category_id: string
+        :param subject_scope_id: the scope UUID
+        :type subject_scope_id: string
         :return: a dictionary of assignment for the given subject {"cat1": ["scope_uuid1", "scope_uuid2"]}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_subject_category_assignment(self, extension_uuid, subject_uuid, category_uuid, scope_uuid):
+    def del_subject_assignment(self, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
         """Remove a scope from a category and from a subject
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param subject_uuid: the subject UUID
-        :type subject_uuid: string
-        :param category_uuid: the category UUID
-        :type category_uuid: string
-        :param scope_uuid: the scope UUID
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param subject_id: the subject UUID
+        :type subject_id: string
+        :param subject_category_id: the category UUID
+        :type subject_category_id: string
+        :param subject_scope_id: the scope UUID
+        :type subject_scope_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for object_category_assignment
-
-    def get_object_category_assignment_dict(self, extension_uuid, object_uuid):
+    def get_object_assignment_dict(self, intra_extension_id, object_id):
         """Get the assignment for a given object_uuid
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_uuid: object UUID
-        :type object_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_id: object UUID
+        :type object_id: string
         :return: a dictionary of assignment for the given object {"cat1": ["scope_uuid1", "scope_uuid2"]}
         :raises: IntraExtensionNotFound, ObjectUnknown, ObjectCategoryAssignmentUnknown, ObjectCategoryAssignmentOutOfScope
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_object_category_assignment_dict(self, extension_uuid, object_uuid, assignment_dict):
+    def set_object_assignment_dict(self, intra_extension_id, object_id, object_assignment_dict):
         """Set the assignment for a given object_uuid
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_uuid: object UUID
-        :type object_uuid: string
-        :param assignment_dict: the assignment dictionary {"cat1": ["scope_uuid1", "scope_uuid2"]}
-        :type assignment_dict: dict
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_id: object UUID
+        :type object_id: string
+        :param object_assignment_dict: the assignment dictionary {"cat1": ["scope_uuid1", "scope_uuid2"]}
+        :type object_assignment_dict: dict
         :return: a dictionary of assignment for the given object {"cat1": ["scope_uuid1", "scope_uuid2"]}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_object_category_assignment_dict(self, extension_uuid, object_uuid, category_uuid, scope_uuid):
+    def add_object_assignment(self, intra_extension_id, object_id, object_category_id, object_scope_id):
         """Add a scope to a category and to a object
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_uuid: the object UUID
-        :type object_uuid: string
-        :param category_uuid: the category UUID
-        :type category_uuid: string
-        :param scope_uuid: the scope UUID
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_id: the object UUID
+        :type object_id: string
+        :param object_category_id: the category UUID
+        :type object_category_id: string
+        :param object_scope_id: the scope UUID
+        :type object_scope_id: string
         :return: a dictionary of assignment for the given object {"cat1": ["scope_uuid1", "scope_uuid2"]}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_object_category_assignment(self, extension_uuid, object_uuid, category_uuid, scope_uuid):
+    def del_object_assignment(self, intra_extension_id, object_id, object_category_id, object_scope_id):
         """Remove a scope from a category and from a object
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param object_uuid: the object UUID
-        :type object_uuid: string
-        :param category_uuid: the category UUID
-        :type category_uuid: string
-        :param scope_uuid: the scope UUID
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param object_id: the object UUID
+        :type object_id: string
+        :param object_category_id: the category UUID
+        :type object_category_id: string
+        :param object_scope_id: the scope UUID
+        :type object_scope_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for action_category_assignment
-
-    def get_action_category_assignment_dict(self, extension_uuid, action_uuid):
+    def get_action_assignment_dict(self, intra_extension_id, action_id):
         """Get the assignment for a given action_uuid
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_uuid: action UUID
-        :type action_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_id: action UUID
+        :type action_id: string
         :return: a dictionary of assignment for the given action {"cat1": ["scope_uuid1", "scope_uuid2"]}
         :raises: IntraExtensionNotFound, ActionUnknown, ActionCategoryAssignmentUnknown, ActionCategoryAssignmentOutOfScope
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def set_action_category_assignment_dict(self, extension_uuid, action_uuid, assignment_dict):
+    def set_action_assignment_dict(self, intra_extension_id, action_id, action_assignment_dict):
         """Set the assignment for a given action_uuid
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_uuid: action UUID
-        :type action_uuid: string
-        :param assignment_dict: the assignment dictionary {"cat1": ["scope_uuid1", "scope_uuid2"]}
-        :type assignment_dict: dict
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_id: action UUID
+        :type action_id: string
+        :param action_assignment_dict: the assignment dictionary {"cat1": ["scope_uuid1", "scope_uuid2"]}
+        :type action_assignment_dict: dict
         :return: a dictionary of assignment for the given action {"cat1": ["scope_uuid1", "scope_uuid2"]}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def add_action_category_assignment_dict(self, extension_uuid, action_uuid, category_uuid, scope_uuid):
+    def add_action_assignment(self, intra_extension_id, action_id, action_category_id, action_scope_id):
         """Add a scope to a category and to a action
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_uuid: the action UUID
-        :type action_uuid: string
-        :param category_uuid: the category UUID
-        :type category_uuid: string
-        :param scope_uuid: the scope UUID
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_id: the action UUID
+        :type action_id: string
+        :param action_category_id: the category UUID
+        :type action_category_id: string
+        :param action_scope_id: the scope UUID
+        :type action_scope_id: string
         :return: a dictionary of assignment for the given action {"cat1": ["scope_uuid1", "scope_uuid2"]}
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    def remove_action_category_assignment(self, extension_uuid, action_uuid, category_uuid, scope_uuid):
+    def del_action_assignment(self, intra_extension_id, action_id, action_category_id, action_scope_id):
         """Remove a scope from a category and from a action
 
-        :param extension_uuid: IntraExtension UUID
-        :type extension_uuid: string
-        :param action_uuid: the action UUID
-        :type action_uuid: string
-        :param category_uuid: the category UUID
-        :type category_uuid: string
-        :param scope_uuid: the scope UUID
-        :type scope_uuid: string
+        :param intra_extension_id: IntraExtension UUID
+        :type intra_extension_id: string
+        :param action_id: the action UUID
+        :type action_id: string
+        :param action_category_id: the category UUID
+        :type action_category_id: string
+        :param action_scope_id: the scope UUID
+        :type action_scope_id: string
         :return: None
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for meta_rule
+    # Meta_rule functions
 
     def get_meta_rule_dict(self, extension_uuid):
         """Get the Meta rule
@@ -2353,7 +2387,7 @@ class IntraExtensionDriver(object):
         """
         raise exception.NotImplemented()  # pragma: no cover
 
-    # Getter and Setter for rules
+    # Rule functions
 
     def get_rule_dict(self, extension_uuid):
         """Get all rules
@@ -2394,61 +2428,6 @@ class IntraExtensionDriver(object):
         raise exception.NotImplemented()  # pragma: no cover
 
 
-class UpdateDriver(object):
-
-    def get_intra_extensions(self):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def get_intra_extension(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def create_intra_extensions(self, extension_uuid, intra_extension):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def delete_intra_extensions(self, extension_uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    # Getter and setter for tenant
-
-    def get_tenant(self, uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def set_tenant(self, uuid, tenant_id):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    # Getter and setter for name
-
-    def get_name(self, uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def set_name(self, uuid, name):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    # Getter and setter for model
-
-    def get_model(self, uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def set_model(self, uuid, model):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    # Getter and setter for genre
-
-    def get_genre(self, uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def set_genre(self, uuid, genre):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    # Getter and setter for description
-
-    def get_description(self, uuid):
-        raise exception.NotImplemented()  # pragma: no cover
-
-    def set_description(self, uuid, args):
-        raise exception.NotImplemented()  # pragma: no cover
-
-
 class LogDriver(object):
 
     def authz(self, message):
diff --git a/keystone-moon/keystone/contrib/moon/exception.py b/keystone-moon/keystone/contrib/moon/exception.py
index 21cf666d..3108b7c2 100644
--- a/keystone-moon/keystone/contrib/moon/exception.py
+++ b/keystone-moon/keystone/contrib/moon/exception.py
@@ -126,6 +126,11 @@ class AuthzAssignment(AuthzException):
     title = 'Assignment Exception'
 
 
+class AuthzMetaRule(AuthzException):
+    code = 400
+    title = 'Aggregation Algorithm Exception'
+
+
 class AuthzRule(AuthzException):
     code = 400
     title = 'Rule Exception'
@@ -194,45 +199,66 @@ class ActionScopeUnknown(AuthzScope):
     logger = "ERROR"
 
 
-class SubjectCategoryAssignmentOutOfScope(AuthzScope):
-    message_format = _("The given subject category scope value is out of scope.")
+class SubjectAssignmentOutOfScope(AuthzScope):
+    message_format = _("The given subject scope value is out of scope.")
     code = 400
-    title = 'Subject Category Assignment Out Of Scope'
+    title = 'Subject Assignment Out Of Scope'
     logger = "WARNING"
 
 
-class ActionCategoryAssignmentOutOfScope(AuthzScope):
-    message_format = _("The given action category scope value is out of scope.")
+class ActionAssignmentOutOfScope(AuthzScope):
+    message_format = _("The given action scope value is out of scope.")
     code = 400
-    title = 'Action Category Assignment Out Of Scope'
+    title = 'Action Assignment Out Of Scope'
     logger = "WARNING"
 
 
-class ObjectCategoryAssignmentOutOfScope(AuthzScope):
-    message_format = _("The given object category scope value is out of scope.")
+class ObjectAssignmentOutOfScope(AuthzScope):
+    message_format = _("The given object scope value is out of scope.")
     code = 400
-    title = 'Object Category Assignment Out Of Scope'
+    title = 'Object Assignment Out Of Scope'
     logger = "WARNING"
 
 
-class SubjectCategoryAssignmentUnknown(AuthzAssignment):
-    message_format = _("The given subject category assignment value is unknown.")
+class SubjectAssignmentUnknown(AuthzAssignment):
+    message_format = _("The given subject assignment value is unknown.")
+    code = 400
+    title = 'Subject Assignment Unknown'
+    logger = "ERROR"
+
+
+class ObjectAssignmentUnknown(AuthzAssignment):
+    message_format = _("The given object assignment value is unknown.")
+    code = 400
+    title = 'Object Assignment Unknown'
+    logger = "ERROR"
+
+
+class ActionAssignmentUnknown(AuthzAssignment):
+    message_format = _("The given action assignment value is unknown.")
+    code = 400
+    title = 'Action Assignment Unknown'
+    logger = "ERROR"
+
+
+class AggregationAlgorithmNotExisting(AuthzMetadata):
+    message_format = _("The given aggregation algorithm is not exsiting.")
     code = 400
-    title = 'Subject Category Assignment Unknown'
+    title = 'Aggregation Algorithm Not Existing'
     logger = "ERROR"
 
 
-class ObjectCategoryAssignmentUnknown(AuthzAssignment):
-    message_format = _("The given object category assignment value is unknown.")
+class AggregationAlgorithmOutOfScope(AuthzMetadata):
+    message_format = _("The given aggregation algorithm is out of scope.")
     code = 400
-    title = 'Object Category Assignment Unknown'
+    title = 'Aggregation Algorithm Out Of Scope'
     logger = "ERROR"
 
 
-class ActionCategoryAssignmentUnknown(AuthzAssignment):
-    message_format = _("The given action category assignment value is unknown.")
+class SubMetaRuleOutOfScope(AuthzMetadata):
+    message_format = _("The given sub meta rule is out of scope.")
     code = 400
-    title = 'Action Category Assignment Unknown'
+    title = 'Sub Meta Rule Out Of Scope'
     logger = "ERROR"
 
 
@@ -326,40 +352,40 @@ class ActionDelNotAuthorized(AdminPerimeter):
     title = 'Action Del Not Authorized'
 
 
-class SubjectCategoryScopeReadNotAuthorized(AuthzException):
-    title = 'Subject Category Scope Read Not Authorized'
+class SubjectScopeReadNotAuthorized(AuthzException):
+    title = 'Subject Scope Read Not Authorized'
 
 
-class SubjectCategoryScopeAddNotAuthorized(AuthzException):
-    title = 'Subject Category Scope Add Not Authorized'
+class SubjectScopeAddNotAuthorized(AuthzException):
+    title = 'Subject Scope Add Not Authorized'
 
 
-class SubjectCategoryScopeDelNotAuthorized(AuthzException):
-    title = 'Subject Category Scope Del Not Authorized'
+class SubjectScopeDelNotAuthorized(AuthzException):
+    title = 'Subject Scope Del Not Authorized'
 
 
-class ObjectCategoryScopeReadNotAuthorized(AuthzException):
-    title = 'Object Category Scope Read Not Authorized'
+class ObjectScopeReadNotAuthorized(AuthzException):
+    title = 'Object Scope Read Not Authorized'
 
 
-class ObjectCategoryScopeAddNotAuthorized(AuthzException):
-    title = 'Object Category Scope Add Not Authorized'
+class ObjectScopeAddNotAuthorized(AuthzException):
+    title = 'Object Scope Add Not Authorized'
 
 
-class ObjectCategoryScopeDelNotAuthorized(AuthzException):
-    title = 'Object Category Scope Del Not Authorized'
+class ObjectScopeDelNotAuthorized(AuthzException):
+    title = 'Object Scope Del Not Authorized'
 
 
-class ActionCategoryScopeReadNotAuthorized(AuthzException):
-    title = 'Action Category Scope Read Not Authorized'
+class ActionScopeReadNotAuthorized(AuthzException):
+    title = 'Action Scope Read Not Authorized'
 
 
-class ActionCategoryScopeAddNotAuthorized(AuthzException):
-    title = 'Action Category Scope Add Not Authorized'
+class ActionScopeAddNotAuthorized(AuthzException):
+    title = 'Action Scope Add Not Authorized'
 
 
-class ActionCategoryScopeDelNotAuthorized(AuthzException):
-    title = 'Action Category Scope Del Not Authorized'
+class ActionScopeDelNotAuthorized(AuthzException):
+    title = 'Action Scope Del Not Authorized'
 
 
 class SubjectCategoryReadNotAuthorized(AdminMetadata):
@@ -399,40 +425,40 @@ class ActionCategoryDelNotAuthorized(AdminMetadata):
     title = 'Action Category Del Not Authorized'
 
 
-class SubjectCategoryAssignmentReadNotAuthorized(AdminAssignment):
-    title = 'Subject Category Assignment Read Not Authorized'
+class SubjectAssignmentReadNotAuthorized(AdminAssignment):
+    title = 'Subject Assignment Read Not Authorized'
 
 
-class SubjectCategoryAssignmentAddNotAuthorized(AdminAssignment):
-    title = 'Subject Category Assignment Add Not Authorized'
+class SubjectAssignmentAddNotAuthorized(AdminAssignment):
+    title = 'Subject Assignment Add Not Authorized'
 
 
-class SubjectCategoryAssignmentDelNotAuthorized(AdminAssignment):
-    title = 'Subject Category Assignment Del Not Authorized'
+class SubjectAssignmentDelNotAuthorized(AdminAssignment):
+    title = 'Subject Assignment Del Not Authorized'
 
 
-class ObjectCategoryAssignmentReadNotAuthorized(AdminAssignment):
-    title = 'Object Category Assignment Read Not Authorized'
+class ObjectAssignmentReadNotAuthorized(AdminAssignment):
+    title = 'Object Assignment Read Not Authorized'
 
 
-class ObjectCategoryAssignmentAddNotAuthorized(AdminAssignment):
-    title = 'Object Category Assignment Add Not Authorized'
+class ObjectAssignmentAddNotAuthorized(AdminAssignment):
+    title = 'Object Assignment Add Not Authorized'
 
 
-class ObjectCategoryAssignmentDelNotAuthorized(AdminAssignment):
-    title = 'Object Category Assignment Del Not Authorized'
+class ObjectAssignmentDelNotAuthorized(AdminAssignment):
+    title = 'Object Assignment Del Not Authorized'
 
 
-class ActionCategoryAssignmentReadNotAuthorized(AdminAssignment):
-    title = 'Action Category Assignment Read Not Authorized'
+class ActionAssignmentReadNotAuthorized(AdminAssignment):
+    title = 'Action Assignment Read Not Authorized'
 
 
-class ActionCategoryAssignmentAddNotAuthorized(AdminAssignment):
-    title = 'Action Category Assignment Add Not Authorized'
+class ActionAssignmentAddNotAuthorized(AdminAssignment):
+    title = 'Action Assignment Add Not Authorized'
 
 
-class ActionCategoryAssignmentDelNotAuthorized(AdminAssignment):
-    title = 'Action Category Assignment Del Not Authorized'
+class ActionAssignmentDelNotAuthorized(AdminAssignment):
+    title = 'Action Assignment Del Not Authorized'
 
 
 class RuleReadNotAuthorized(AdminRule):
diff --git a/keystone-moon/keystone/contrib/moon/routers.py b/keystone-moon/keystone/contrib/moon/routers.py
index 28409136..0aa71ff8 100644
--- a/keystone-moon/keystone/contrib/moon/routers.py
+++ b/keystone-moon/keystone/contrib/moon/routers.py
@@ -32,19 +32,6 @@ class Routers(wsgi.RoutersBase):
         logs_controller = controllers.Logs()
         inter_ext_controller = controllers.InterExtensions()
 
-        # Authz route
-        self._add_resource(
-            mapper, authz_controller,
-            path=self.PATH_PREFIX+'/authz/{tenant_id}/{subject_id}/{object_id}/{action_id}',
-            get_action='get_authz',
-            rel=self._get_rel('authz'),
-            path_vars={
-                'tenant_id': self._get_path('tenants'),
-                'subject_id': self._get_path('subjects'),
-                'object_id': self._get_path('objects'),
-                'action_id': self._get_path('actions'),
-            })
-
         # Configuration route
         self._add_resource(
             mapper, configuration_controller,
@@ -65,7 +52,38 @@ class Routers(wsgi.RoutersBase):
             rel=self._get_rel('sub_meta_rule_algorithms'),
             path_vars={})
 
-        # IntraExtensions route
+        # Tenants route
+        self._add_resource(
+            mapper, tenants_controller,
+            path=self.PATH_PREFIX+'/tenants',
+            get_action='get_tenants',
+            post_action='add_tenant',
+            rel=self._get_rel('tenants'),
+            path_vars={})
+        self._add_resource(
+            mapper, tenants_controller,
+            path=self.PATH_PREFIX+'/tenant/{tenant_uuid}',
+            get_action='get_tenant',
+            delete_action='del_tenant',
+            rel=self._get_rel('tenants'),
+            path_vars={
+                'tenant_uuid': self._get_path('tenants'),
+            })
+
+        # Authz route
+        self._add_resource(
+            mapper, authz_controller,
+            path=self.PATH_PREFIX+'/authz/{tenant_id}/{subject_id}/{object_id}/{action_id}',
+            get_action='get_authz',
+            rel=self._get_rel('authz'),
+            path_vars={
+                'tenant_id': self._get_path('tenants'),
+                'subject_id': self._get_path('subjects'),
+                'object_id': self._get_path('objects'),
+                'action_id': self._get_path('actions'),
+            })
+
+        # IntraExtensions/Admin route
         self._add_resource(
             mapper, intra_ext_controller,
             path=self.PATH_PREFIX+'/intra_extensions',
@@ -198,55 +216,55 @@ class Routers(wsgi.RoutersBase):
         # Scope route
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_category_scopes/{subject_category_id}',
-            get_action='get_subject_category_scopes',
-            post_action='add_subject_category_scope',
-            rel=self._get_rel('subject_category_scope'),
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}',
+            get_action='get_subject_scopes',
+            post_action='add_subject_scope',
+            rel=self._get_rel('subject_scope'),
             path_vars={
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_category_scopes/{subject_category_id}/{subject_category_scope_id}',
-            get_action='get_subject_category_scope',
-            delete_action='del_subject_category_scope',
-            rel=self._get_rel('subject_category_scope'),
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}',
+            get_action='get_subject_scope',
+            delete_action='del_subject_scope',
+            rel=self._get_rel('subject_scope'),
             path_vars={
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_category_scopes/{object_category_id}',
-            get_action='get_object_category_scopes',
-            post_action='add_object_category_scope',
-            rel=self._get_rel('object_category_scope'),
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}',
+            get_action='get_object_scopes',
+            post_action='add_object_scope',
+            rel=self._get_rel('object_scope'),
             path_vars={
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_category_scopes/{object_category_id}/{object_category_scope_id}',
-            get_action='get_object_category_scope',
-            delete_action='del_object_category_scope',
-            rel=self._get_rel('object_category_scope'),
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}',
+            get_action='get_object_scope',
+            delete_action='del_object_scope',
+            rel=self._get_rel('object_scope'),
             path_vars={
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_category_scopes/{action_category_id}',
-            get_action='get_action_category_scopes',
-            post_action='add_action_category_scope',
-            rel=self._get_rel('action_category_scope'),
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}',
+            get_action='get_action_scopes',
+            post_action='add_action_scope',
+            rel=self._get_rel('action_scope'),
             path_vars={
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_category_scopes/{action_category_id}/{action_category_scope_id}',
-            get_action='get_action_category_scope',
-            delete_action='del_action_category_scope',
-            rel=self._get_rel('action_category_scope'),
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}',
+            get_action='get_action_scope',
+            delete_action='del_action_scope',
+            rel=self._get_rel('action_scope'),
             path_vars={
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
@@ -280,7 +298,7 @@ class Routers(wsgi.RoutersBase):
         self._add_resource(
             mapper, intra_ext_controller,
             path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
-                                  'subject_assignments/{subject_id}/{subject_category_id}/{subject_category_scope_id}',
+                                  'subject_assignments/{subject_id}/{subject_category_id}/{subject_scope_id}',
             delete_action='del_subject_assignment',
             rel=self._get_rel('subject_assignments'),
             path_vars={
@@ -305,7 +323,7 @@ class Routers(wsgi.RoutersBase):
         self._add_resource(
             mapper, intra_ext_controller,
             path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
-                                  'object_assignments/{object_id}/{object_category}',
+                                  'object_assignments/{object_id}/{object_category_id}',
             get_action='get_object_assignment',
             rel=self._get_rel('object_assignments'),
             path_vars={
@@ -314,7 +332,7 @@ class Routers(wsgi.RoutersBase):
         self._add_resource(
             mapper, intra_ext_controller,
             path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
-                                  'object_assignments/{object_id}/{object_category}/{object_category_scope}',
+                                  'object_assignments/{object_id}/{object_category_id}/{object_scope_id}',
             delete_action='del_object_assignment',
             rel=self._get_rel('object_assignments'),
             path_vars={
@@ -339,7 +357,7 @@ class Routers(wsgi.RoutersBase):
         self._add_resource(
             mapper, intra_ext_controller,
             path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
-                                  'action_assignments/{action_id}/{action_category}',
+                                  'action_assignments/{action_id}/{action_category_id}',
             get_action='get_action_assignment',
             rel=self._get_rel('action_assignments'),
             path_vars={
@@ -348,7 +366,7 @@ class Routers(wsgi.RoutersBase):
         self._add_resource(
             mapper, intra_ext_controller,
             path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
-                                  'action_assignments/{action_id}/{action_category}/{action_category_scope}',
+                                  'action_assignments/{action_id}/{action_category_id}/{action_scope_id}',
             delete_action='del_action_assignment',
             rel=self._get_rel('action_assignments'),
             path_vars={
@@ -358,7 +376,7 @@ class Routers(wsgi.RoutersBase):
         # Metarule route
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithms',
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithm',
             post_action='add_aggregation_algorithm',
             rel=self._get_rel('aggregation_algorithms'),
             path_vars={
@@ -366,7 +384,7 @@ class Routers(wsgi.RoutersBase):
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithms/{aggregation_algorithm_id}',
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithm/{aggregation_algorithm_id}',
             get_action='get_aggregation_algorithm',
             delete_action='del_aggregation_algorithm',
             rel=self._get_rel('aggregation_algorithms'),
@@ -395,7 +413,7 @@ class Routers(wsgi.RoutersBase):
         # Rules route
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rules/{sub_meta_rule_id}',
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}',
             get_action='get_rules',
             post_action='add_rule',
             rel=self._get_rel('rules'),
@@ -404,7 +422,7 @@ class Routers(wsgi.RoutersBase):
             })
         self._add_resource(
             mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rules/{sub_meta_rule_id}/{rule_id}',
+            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}',
             get_action='get_rule',
             delete_action='del_rule',
             rel=self._get_rel('rules'),
@@ -412,24 +430,6 @@ class Routers(wsgi.RoutersBase):
                 'intra_extension_id': self._get_path('intra_extensions'),
             })
 
-        # Tenants route
-        self._add_resource(
-            mapper, tenants_controller,
-            path=self.PATH_PREFIX+'/tenants',
-            get_action='get_tenants',
-            post_action='add_tenant',
-            rel=self._get_rel('tenants'),
-            path_vars={})
-        self._add_resource(
-            mapper, tenants_controller,
-            path=self.PATH_PREFIX+'/tenant/{tenant_uuid}',
-            get_action='get_tenant',
-            delete_action='del_tenant',
-            rel=self._get_rel('tenants'),
-            path_vars={
-                'tenant_uuid': self._get_path('tenants'),
-            })
-
         # Logs route
         self._add_resource(
             mapper, logs_controller,
-- 
cgit