diff --git a/doc/source/conf.py b/doc/source/conf.py
index d75a939..33c2cc3 100755
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -38,7 +38,7 @@
 
 # General information about the project.
 project = u'patrole'
-copyright = u'2016, OpenStack Foundation'
+copyright = u'2017, Patrole Developers'
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
 add_function_parentheses = True
@@ -68,7 +68,7 @@
     ('index',
      '%s.tex' % project,
      u'%s Documentation' % project,
-     u'OpenStack Foundation', 'manual'),
+     u'Patrole Developers', 'manual'),
 ]
 
 # Example configuration for intersphinx: refer to the Python standard library.
diff --git a/doc/source/installation.rst b/doc/source/installation.rst
index b0a6f33..00cc57b 100644
--- a/doc/source/installation.rst
+++ b/doc/source/installation.rst
@@ -25,7 +25,7 @@
 tempest.conf
 ++++++++++++
 
-To run the RBAC tempest api test you have to make the following changes to
+To run the RBAC tempest api test, you have to make the following changes to
 the tempest.conf file.
 
 #. [auth] section updates ::
@@ -49,11 +49,8 @@
 
        # The role that you want the RBAC tests to use for RBAC testing
        # This needs to be edited to run the test as a different role. 
-       rbac_test_role=_member_
+       rbac_test_role = _member_
 
-       # The list of roles that your system contains.
-       # This needs to be updated as new roles are added.
-       rbac_roles=admin,_member_
-
-       # Tell standard RBAC test cases to run other wise it they are skipped.
-       rbac_flag=true
+       # Enables RBAC Tempest tests if set to True. Otherwise, they are
+       # skipped.
+       rbac_flag = True
diff --git a/patrole_tempest_plugin/config.py b/patrole_tempest_plugin/config.py
index 2b20391..6ee1528 100644
--- a/patrole_tempest_plugin/config.py
+++ b/patrole_tempest_plugin/config.py
@@ -1,4 +1,4 @@
-#    Copyright (c) 2016 AT&T inc.
+#    Copyright 2017 AT&T Corporation.
 #    All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -26,8 +26,4 @@
     cfg.BoolOpt('rbac_flag',
                 default=False,
                 help="Enables RBAC tests."),
-    cfg.ListOpt('rbac_roles',
-                default=['admin'],
-                help="List of RBAC roles found in the policy files "
-                     "under testing."),
 ]
diff --git a/patrole_tempest_plugin/plugin.py b/patrole_tempest_plugin/plugin.py
index 1bc4d04..3abf4aa 100644
--- a/patrole_tempest_plugin/plugin.py
+++ b/patrole_tempest_plugin/plugin.py
@@ -1,4 +1,4 @@
-#    Copyright (c) 2016 AT&T inc.
+#    Copyright 2017 AT&T Corporation.
 #    All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_auth.py b/patrole_tempest_plugin/rbac_auth.py
index 78cc951..1afc7ae 100644
--- a/patrole_tempest_plugin/rbac_auth.py
+++ b/patrole_tempest_plugin/rbac_auth.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_exceptions.py b/patrole_tempest_plugin/rbac_exceptions.py
index 94e6bdd..c6165ff 100644
--- a/patrole_tempest_plugin/rbac_exceptions.py
+++ b/patrole_tempest_plugin/rbac_exceptions.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_role_converter.py b/patrole_tempest_plugin/rbac_role_converter.py
index 65e3f27..bc6e006 100644
--- a/patrole_tempest_plugin/rbac_role_converter.py
+++ b/patrole_tempest_plugin/rbac_role_converter.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -17,6 +17,7 @@
 import os
 
 from oslo_log import log as logging
+from oslo_policy import generator
 from oslo_policy import policy
 from tempest import config
 
@@ -39,51 +40,73 @@
     def __init__(self, tenant_id, service, path=None):
         """Initialization of Policy Converter.
 
-        Parse policy files to create dictionary mapping policy actions to
-        roles.
+        Parses a policy file to create a dictionary, mapping policy actions to
+        roles. If a policy file does not exist, checks whether the policy file
+        is registered as a namespace under oslo.policy.policies. Nova, for
+        example, doesn't use a policy.json file by default; its policy is
+        implemented in code and registered as 'nova' under
+        oslo.policy.policies.
+
+        If the policy file is not found in either place, raises an exception.
+
+        Additionally, if the policy file exists in both code and as a
+        policy.json (for example, by creating a custom nova policy.json file),
+        the custom policy file over the default policy implementation is
+        prioritized.
 
         :param tenant_id: type uuid
         :param service: type string
         :param path: type string
         """
+        service = service.lower().strip()
         if path is None:
             self.path = '/etc/{0}/policy.json'.format(service)
         else:
             self.path = path
 
-        if not os.path.isfile(self.path):
-            raise rbac_exceptions.RbacResourceSetupFailed(
-                'Policy file for service: {0}, {1} not found.'
-                .format(service, self.path))
+        policy_data = "{}"
 
+        # First check whether policy file exists.
+        if os.path.isfile(self.path):
+            policy_data = open(self.path, 'r').read()
+        # Otherwise use oslo_policy to fetch the rules for provided service.
+        else:
+            policy_generator = generator._get_policies_dict([service])
+            if policy_generator and service in policy_generator:
+                policy_data = "{\n"
+                for r in policy_generator[service]:
+                    policy_data = policy_data + r.__str__() + ",\n"
+                policy_data = policy_data[:-2] + "\n}"
+            # Otherwise raise an exception.
+            else:
+                raise rbac_exceptions.RbacResourceSetupFailed(
+                    'Policy file for service: {0}, {1} not found.'
+                    .format(service, self.path))
+
+        self.rules = policy.Rules.load(policy_data, "default")
         self.tenant_id = tenant_id
 
     def allowed(self, rule_name, role):
-        policy_file = open(self.path, 'r')
-        access_token = self._get_access_token(role)
-
+        is_admin_context = self._is_admin_context(role)
         is_allowed = self._allowed(
-            policy_file=policy_file,
-            access=access_token,
+            access=self._get_access_token(role),
             apply_rule=rule_name,
-            is_admin=False)
+            is_admin=is_admin_context)
 
-        policy_file = open(self.path, 'r')
-        access_token = self._get_access_token(role)
-        allowed_as_admin_context = self._allowed(
-            policy_file=policy_file,
-            access=access_token,
-            apply_rule=rule_name,
-            is_admin=True)
+        return is_allowed
 
-        if allowed_as_admin_context and is_allowed:
-            return True
-        if allowed_as_admin_context and not is_allowed:
-            return False
-        if not allowed_as_admin_context and is_allowed:
-            return True
-        if not allowed_as_admin_context and not is_allowed:
-            return False
+    def _is_admin_context(self, role):
+        """Checks whether a role has admin context.
+
+        If context_is_admin is contained in the policy file, then checks
+        whether the given role is contained in context_is_admin. If it is not
+        in the policy file, then default to context_is_admin: admin.
+        """
+        if 'context_is_admin' in self.rules.keys():
+            return self._allowed(
+                access=self._get_access_token(role),
+                apply_rule='context_is_admin')
+        return role == 'admin'
 
     def _get_access_token(self, role):
         access_token = {
@@ -93,45 +116,50 @@
                         "name": role
                     }
                 ],
-                "project": {
-                    "id": self.tenant_id
-                }
+                "project_id": self.tenant_id,
+                "tenant_id": self.tenant_id
             }
         }
         return access_token
 
-    def _allowed(self, policy_file, access, apply_rule, is_admin=False):
+    def _allowed(self, access, apply_rule, is_admin=False):
         """Checks if a given rule in a policy is allowed with given access.
 
         Adapted from oslo_policy.shell.
 
-        :param policy file: type string: path to policy file
         :param access: type dict: dictionary from ``_get_access_token``
         :param apply_rule: type string: rule to be checked
         :param is_admin: type bool: whether admin context is used
         """
         access_data = copy.copy(access['token'])
         access_data['roles'] = [role['name'] for role in access_data['roles']]
-        access_data['project_id'] = access_data['project']['id']
         access_data['is_admin'] = is_admin
-        policy_data = policy_file.read()
-        rules = policy.Rules.load(policy_data, "default")
+        # TODO(felipemonteiro): Dynamically calculate is_admin_project rather
+        # than hard-coding it to True. is_admin_project cannot be determined
+        # from the role, but rather from project and domain names. See
+        # _populate_is_admin_project in keystone.token.providers.common
+        # for more information.
+        access_data['is_admin_project'] = True
 
         class Object(object):
             pass
         o = Object()
-        o.rules = rules
+        o.rules = self.rules
 
-        target = {"project_id": access_data['project_id']}
+        target = {"project_id": access_data['project_id'],
+                  "tenant_id": access_data['project_id'],
+                  "network:tenant_id": access_data['project_id']}
 
-        key = apply_rule
-        rule = rules[apply_rule]
-        result = self._try_rule(key, rule, target, access_data, o)
+        result = self._try_rule(apply_rule, target, access_data, o)
         return result
 
-    def _try_rule(self, key, rule, target, access_data, o):
+    def _try_rule(self, apply_rule, target, access_data, o):
         try:
+            rule = self.rules[apply_rule]
             return rule(target, access_data, o)
+        except KeyError as e:
+            LOG.debug("{0} not found in policy file.".format(apply_rule))
+            return False
         except Exception as e:
-            LOG.debug("Exception: {0} for rule: {1}".format(e, rule))
+            LOG.debug("Exception: {0} for rule: {1}.".format(e, rule))
             return False
diff --git a/patrole_tempest_plugin/rbac_rule_validation.py b/patrole_tempest_plugin/rbac_rule_validation.py
index ee32f78..4b85187 100644
--- a/patrole_tempest_plugin/rbac_rule_validation.py
+++ b/patrole_tempest_plugin/rbac_rule_validation.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_utils.py b/patrole_tempest_plugin/rbac_utils.py
index 1150416..48d5b4c 100644
--- a/patrole_tempest_plugin/rbac_utils.py
+++ b/patrole_tempest_plugin/rbac_utils.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/compute/rbac_base.py b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
index 030ee5c..ca24204 100644
--- a/patrole_tempest_plugin/tests/api/compute/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
@@ -18,7 +18,6 @@
 
 
 class BaseV2ComputeRbacTest(compute_base.BaseV2ComputeTest):
-
     credentials = ['primary', 'admin']
 
     @classmethod
@@ -36,3 +35,24 @@
         super(BaseV2ComputeRbacTest, cls).setup_clients()
         cls.admin_client = cls.os_admin.agents_client
         cls.auth_provider = cls.os.auth_provider
+
+
+class BaseV2ComputeAdminRbacTest(compute_base.BaseV2ComputeAdminTest):
+
+    credentials = ['primary', 'admin']
+
+    @classmethod
+    def skip_checks(cls):
+        super(BaseV2ComputeAdminRbacTest, cls).skip_checks()
+        if not CONF.rbac.rbac_flag:
+            raise cls.skipException(
+                '%s skipped as RBAC flag not enabled' % cls.__name__)
+        if 'admin' not in CONF.auth.tempest_roles:
+            raise cls.skipException(
+                "%s skipped because tempest roles is not admin" % cls.__name__)
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseV2ComputeAdminRbacTest, cls).setup_clients()
+        cls.admin_client = cls.os_admin.agents_client
+        cls.auth_provider = cls.os.auth_provider
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
index 3da3bd8..8e1f6ee 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
@@ -11,30 +11,31 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
+class AbsoluteLimitsRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     def tearDown(self):
         rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+        super(AbsoluteLimitsRbacTest, self).tearDown()
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
+        super(AbsoluteLimitsRbacTest, cls).setup_clients()
         cls.identity_client = cls.os_adm.identity_client
         cls.tenants_client = cls.os_adm.tenants_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(AbsoluteLimitsRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
diff --git a/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
new file mode 100644
index 0000000..ffeebc9
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
@@ -0,0 +1,45 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class AccessIpsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        super(AccessIpsRbacTest, self).tearDown()
+
+    @classmethod
+    def skip_checks(cls):
+        super(AccessIpsRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @rbac_rule_validation.action(service="nova",
+                                 rule="os_compute_api:os-access-ips")
+    @decorators.idempotent_id('f5811ed1-95d4-4085-a69e-87e6bd958738')
+    def test_access_ip(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        ipv4 = '127.0.0.1'
+        self.create_test_server(accessIPv4=ipv4)
diff --git a/patrole_tempest_plugin/tests/api/compute/test_rescue_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_rescue_rbac.py
new file mode 100644
index 0000000..88997b2
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_rescue_rbac.py
@@ -0,0 +1,55 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class RescueRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(RescueRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(RescueRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(RescueRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(RescueRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-rescue")
+    @decorators.idempotent_id('fbbb2afc-ed0e-4552-887d-ac00fb5d436e')
+    def test_rescue_server(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.rescue_server(self.server['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_diagnostics_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_diagnostics_rbac.py
new file mode 100644
index 0000000..390dae5
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_diagnostics_rbac.py
@@ -0,0 +1,55 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServerDiagnosticsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServerDiagnosticsRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServerDiagnosticsRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServerDiagnosticsRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerDiagnosticsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-diagnostics")
+    @decorators.idempotent_id('5dabfcc4-bedb-417b-8247-b3ee7c5c0f3e')
+    def test_show_server_diagnostics(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_server_diagnostics(self.server['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_groups_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_groups_rbac.py
new file mode 100644
index 0000000..8e47b59
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_groups_rbac.py
@@ -0,0 +1,81 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServerGroupsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServerGroupsRbacTest, cls).setup_clients()
+        cls.client = cls.server_groups_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServerGroupsRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServerGroupsRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerGroupsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:create")
+    @decorators.idempotent_id('7f3eae94-6130-47e9-81ac-34009f55be2f')
+    def test_create_server_group(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_test_server_group()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:delete")
+    @decorators.idempotent_id('832d9be3-632e-47b2-93d2-5897db43e3e2')
+    def test_delete_server_group(self):
+        server_group = self.create_test_server_group()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.delete_server_group(server_group['id'])
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:index")
+    @decorators.idempotent_id('5eccd67f-5945-483b-b1c8-de851ebfc1c1')
+    def test_list_server_groups(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_server_groups()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:show")
+    @decorators.idempotent_id('62534e3f-7e99-4a3d-a08e-33e056460cf2')
+    def test_show_server_group(self):
+        server_group = self.create_test_server_group()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_server_group(server_group['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_usage_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_usage_rbac.py
new file mode 100644
index 0000000..486a023
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_usage_rbac.py
@@ -0,0 +1,55 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServerUsageRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServerUsageRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServerUsageRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServerUsageRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerUsageRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-usage")
+    @decorators.idempotent_id('f0437ead-b9fb-462a-9f3d-ce53fac9d57a')
+    def test_show_server_diagnostics(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_server(self.server['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
new file mode 100644
index 0000000..d5897d3
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
@@ -0,0 +1,131 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServerVolumeAttachmentRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServerVolumeAttachmentRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
+        cls.volumes_client = cls.os.volumes_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServerVolumeAttachmentRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServerVolumeAttachmentRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    @classmethod
+    def resource_cleanup(cls):
+        test_utils.call_and_ignore_notfound_exc(cls.delete_server,
+                                                cls.server['id'])
+        super(ServerVolumeAttachmentRbacTest, cls).resource_cleanup()
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerVolumeAttachmentRbacTest, self).tearDown()
+
+    def _create_and_attach(self):
+        self.volume = self.create_volume()
+        self.attachment = self._attach(self.server, self.volume)
+
+    def _attach(self, server, volume):
+        attachment = self.client.attach_volume(
+            server['id'],
+            volumeId=volume['id'])['volumeAttachment']
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self._detach, server['id'], volume['id'])
+        waiters.wait_for_volume_status(self.volumes_client, volume['id'],
+                                       'in-use')
+        return attachment
+
+    def _detach(self, server_id, volume_id):
+        # For test_update_volume_attachment, an addCleanup is called with
+        # a stale volume, because a new volume is attached, so only detach
+        # the new volume to avoid a bad request error.
+        if hasattr(self, 'volume') and self.volume['id'] == volume_id:
+            self.client.detach_volume(server_id, volume_id)
+            waiters.wait_for_volume_status(self.volumes_client, volume_id,
+                                           'available')
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:index")
+    @decorators.idempotent_id('529b668b-6edb-41d5-8886-d7dbd0614678')
+    def test_list_volume_attachments(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_volume_attachments(self.server['id'])
+        ['volumeAttachments']
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:create")
+    @decorators.idempotent_id('21c2c3fd-fbe8-41b1-8ef8-115ec47d54c1')
+    def test_create_volume_attachment(self):
+        self.volume = self.create_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._attach(self.server, self.volume)
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:show")
+    @decorators.idempotent_id('997df9c2-6e54-47b6-ab74-e4fdb500f385')
+    def test_show_volume_attachment(self):
+        self._create_and_attach()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_volume_attachment(
+            self.server['id'], self.attachment['id'])
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:update")
+    @decorators.idempotent_id('bd667186-eca6-4b78-ab6a-3e2fabcb971f')
+    def test_update_volume_attachment(self):
+        self._create_and_attach()
+        self.volume = self.create_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.update_attached_volume(
+            self.server['id'], self.attachment['id'],
+            volumeId=self.volume['id'])
+        self.addCleanup(self._detach, self.server['id'], self.volume['id'])
+        waiters.wait_for_volume_status(self.volumes_client, self.volume['id'],
+                                       'in-use')
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:delete")
+    @decorators.idempotent_id('12b03e90-d087-46af-9c4d-507d021c4984')
+    def test_delete_volume_attachment(self):
+        self._create_and_attach()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._detach(self.server['id'], self.volume['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
new file mode 100644
index 0000000..a2f6409
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
@@ -0,0 +1,50 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServicesAdminRbacTest(rbac_base.BaseV2ComputeAdminRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServicesAdminRbacTest, cls).setup_clients()
+        cls.client = cls.services_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServicesAdminRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServicesAdminRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-services")
+    @decorators.idempotent_id('7472261b-9c6d-453a-bcb3-aecaa29ad281')
+    def test_list_services(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_services()['services']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_simple_tenant_usage_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_simple_tenant_usage_rbac.py
new file mode 100644
index 0000000..eb7a91f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_simple_tenant_usage_rbac.py
@@ -0,0 +1,62 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class SimpleTenantUsageRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(SimpleTenantUsageRbacTest, self).tearDown()
+
+    @classmethod
+    def setup_clients(cls):
+        super(SimpleTenantUsageRbacTest, cls).setup_clients()
+        cls.client = cls.os.tenant_usages_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(SimpleTenantUsageRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-simple-tenant-usage:list")
+    @decorators.idempotent_id('2aef094f-0452-4df6-a66a-0ec22a92b16e')
+    def test_simple_tenant_usage_list(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_tenant_usages()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-simple-tenant-usage:show")
+    @decorators.idempotent_id('fe7eacda-15c4-4bf7-93ef-1091c4546a9d')
+    def test_simple_tenant_usage_show(self):
+        # A server must be created in order for usage activity to exist; else
+        # the validation method in the API call throws an error.
+        self.create_test_server(wait_until='ACTIVE')['id']
+        tenant_id = self.auth_provider.credentials.tenant_id
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_tenant_usage(tenant_id=tenant_id)
diff --git a/patrole_tempest_plugin/tests/api/image/rbac_base.py b/patrole_tempest_plugin/tests/api/image/rbac_base.py
index 786927f..5a9731a 100644
--- a/patrole_tempest_plugin/tests/api/image/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/image/rbac_base.py
@@ -1,4 +1,4 @@
-# Copyright 2017 at&t
+#    Copyright 2017 AT&T Corporation.
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
 #    a copy of the License at
@@ -18,6 +18,27 @@
 CONF = config.CONF
 
 
+class BaseV1ImageRbacTest(image_base.BaseV1ImageTest):
+
+    credentials = ['primary', 'admin']
+
+    @classmethod
+    def skip_checks(cls):
+        super(BaseV1ImageRbacTest, cls).skip_checks()
+        if not CONF.rbac.rbac_flag:
+            raise cls.skipException(
+                "%s skipped as RBAC Flag not enabled" % cls.__name__)
+        if 'admin' not in CONF.auth.tempest_roles:
+            raise cls.skipException(
+                "%s skipped because tempest roles is not admin" % cls.__name__)
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseV1ImageRbacTest, cls).setup_clients()
+        cls.auth_provider = cls.os.auth_provider
+        cls.admin_client = cls.os_adm.image_client
+
+
 class BaseV2ImageRbacTest(image_base.BaseV2ImageTest):
 
     credentials = ['primary', 'admin']
diff --git a/patrole_tempest_plugin/tests/api/image/v1/__init__.py b/patrole_tempest_plugin/tests/api/image/v1/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v1/__init__.py
diff --git a/patrole_tempest_plugin/tests/api/image/v1/test_images_member_rbac.py b/patrole_tempest_plugin/tests/api/image/v1/test_images_member_rbac.py
new file mode 100644
index 0000000..97c218a
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v1/test_images_member_rbac.py
@@ -0,0 +1,85 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base as base
+
+CONF = config.CONF
+
+
+class ImagesMemberRbacTest(base.BaseV1ImageRbacTest):
+
+    credentials = ['primary', 'alt', 'admin']
+
+    @classmethod
+    def setup_clients(cls):
+        super(ImagesMemberRbacTest, cls).setup_clients()
+        cls.image_member_client = cls.os.image_member_client
+        cls.alt_image_member_client = cls.os_alt.image_member_client
+
+    @classmethod
+    def resource_setup(cls):
+        super(ImagesMemberRbacTest, cls).resource_setup()
+        cls.alt_tenant_id = cls.alt_image_member_client.tenant_id
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImagesMemberRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance", rule="add_member")
+    @decorators.idempotent_id('bda2bb78-e6ec-4b87-ba6d-1eaf1b28fa8b')
+    def test_add_image_member(self):
+        """Add image member
+
+        RBAC test for the glance add_member policy
+        """
+        image = self.create_image()
+        # Toggle role and add image member
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.image_member_client.create_image_member(image['id'],
+                                                     self.alt_tenant_id)
+
+    @rbac_rule_validation.action(service="glance", rule="delete_member")
+    @decorators.idempotent_id('9beaf28c-62b7-4c30-bbe5-4283aed1201c')
+    def test_delete_image_member(self):
+        """Delete image member
+
+        RBAC test for the glance delete_member policy
+        """
+        image = self.create_image()
+        self.image_member_client.create_image_member(image['id'],
+                                                     self.alt_tenant_id)
+        # Toggle role and delete image member
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.image_member_client.delete_image_member(image['id'],
+                                                     self.alt_tenant_id)
+
+    @rbac_rule_validation.action(service="glance", rule="get_members")
+    @decorators.idempotent_id('a0fcd855-31ef-458c-97e0-14a448cdd6da')
+    def test_list_image_members(self):
+        """List image members
+
+        RBAC test for the glance get_members policy
+        """
+        image = self.create_image()
+        self.image_member_client.create_image_member(image['id'],
+                                                     self.alt_tenant_id)
+        # Toggle role and delete image member
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.image_member_client.list_image_members(image['id'])
diff --git a/patrole_tempest_plugin/tests/api/image/v1/test_images_rbac.py b/patrole_tempest_plugin/tests/api/image/v1/test_images_rbac.py
new file mode 100644
index 0000000..ee6a2eb
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v1/test_images_rbac.py
@@ -0,0 +1,156 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from six import moves
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class BasicOperationsImagesRbacTest(rbac_base.BaseV1ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(BasicOperationsImagesRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance", rule="add_image")
+    @decorators.idempotent_id('33248a04-6527-11e6-be0f-080027d0d606')
+    def test_create_image(self):
+        """Create Image Test
+
+        RBAC test for the glance add_image policy.
+        """
+        properties = {'prop1': 'val1'}
+        image_name = data_utils.rand_name('image')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_image(name=image_name,
+                          container_format='bare',
+                          disk_format='raw',
+                          is_public=False,
+                          properties=properties)
+
+    @rbac_rule_validation.action(service="glance", rule="delete_image")
+    @decorators.idempotent_id('731c8c81-6c63-413b-a61a-050ce9ca16ad')
+    def test_delete_image(self):
+        """Delete Image Test
+
+        RBAC test for the glance delete_image policy.
+        """
+        image_name = data_utils.rand_name('image')
+        properties = {'prop1': 'val1'}
+        body = self.create_image(name=image_name,
+                                 container_format='bare',
+                                 disk_format='raw',
+                                 is_public=False,
+                                 properties=properties)
+        image_id = body['id']
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.delete_image(image_id)
+
+    @rbac_rule_validation.action(service="glance", rule="download_image")
+    @decorators.idempotent_id('a22bf112-5a3a-419e-9cd6-9562d1a3a458')
+    def test_download_image(self):
+        """Download Image Test
+
+        RBAC test for the glance download_image policy.
+        """
+        image_name = data_utils.rand_name('image')
+        properties = {'prop1': 'val1'}
+        body = self.create_image(name=image_name,
+                                 container_format='bare',
+                                 disk_format='raw',
+                                 is_public=False,
+                                 properties=properties)
+        image_id = body['id']
+        # Now try uploading an image file
+        image_file = moves.cStringIO(data_utils.random_bytes())
+        self.client.update_image(image_id, data=image_file)
+        # Toggle role and get created image
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_image(image_id)
+
+    @rbac_rule_validation.action(service="glance", rule="get_image")
+    @decorators.idempotent_id('110257aa-6fa3-4cc0-b8dd-d93d43acd45c')
+    def test_get_image(self):
+        """Get Image Test
+
+        RBAC test for the glance get_image policy.
+        """
+        image_name = data_utils.rand_name('image')
+        properties = {'prop1': 'val1'}
+        body = self.create_image(name=image_name,
+                                 container_format='bare',
+                                 disk_format='raw',
+                                 is_public=False,
+                                 properties=properties)
+        image_id = body['id']
+        # Now try uploading an image file
+        image_file = moves.cStringIO(data_utils.random_bytes())
+        self.client.update_image(image_id, data=image_file)
+        # Toggle role and get created image
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.check_image(image_id)
+
+    @rbac_rule_validation.action(service="glance", rule="get_images")
+    @decorators.idempotent_id('37662238-0fe9-4dff-8d90-e02f31e7e3fb')
+    def test_list_images(self):
+        """Get Image Test
+
+        RBAC test for the glance get_images policy.
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_images()
+
+    @rbac_rule_validation.action(service="glance", rule="modify_image")
+    @decorators.idempotent_id('3a391a19-d756-4c96-a346-72cc02f6106e')
+    def test_update_image(self):
+        """Update Image Test
+
+        RBAC test for the glance modify_image policy.
+        """
+        image_name = data_utils.rand_name('image')
+        properties = {'prop1': 'val1'}
+        body = self.create_image(name=image_name,
+                                 container_format='bare',
+                                 disk_format='raw',
+                                 is_public=False,
+                                 properties=properties)
+        image_id = body.get('id')
+        properties = {'prop1': 'val2'}
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.update_image(image_id, headers=properties)
+
+    @rbac_rule_validation.action(service="glance", rule="publicize_image")
+    @decorators.idempotent_id('d5b1d09f-ba47-4d56-913e-4f38733a9a5c')
+    def test_publicize_image(self):
+        """Publicize Image Test
+
+        RBAC test for the glance publicize_image policy.
+        """
+        image_name = data_utils.rand_name('image')
+        properties = {'prop1': 'val1'}
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_image(name=image_name,
+                          container_format='bare',
+                          disk_format='raw',
+                          is_public=True,
+                          properties=properties)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_objects_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_objects_rbac.py
new file mode 100644
index 0000000..324543e
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_objects_rbac.py
@@ -0,0 +1,111 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class ImageNamespacesObjectsRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImageNamespacesObjectsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="add_metadef_object")
+    @decorators.idempotent_id("772156f2-e33d-432e-8521-12385746c2f0")
+    def test_create_metadef_object_in_namespace(self):
+        """Create Metadef Object Namespace Test
+
+        RBAC test for the glance add_metadef_object policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # create a md object, it will be cleaned automatically after
+        # cleanup of namespace
+        object_name = data_utils.rand_name('test-object')
+        self.namespace_objects_client.create_namespace_object(
+            namespace['namespace'],
+            name=object_name)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.namespace_objects_client.delete_namespace_object,
+                        namespace['namespace'], object_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_objects")
+    @decorators.idempotent_id("48b50ecb-237d-4909-be62-b6a05c47b64d")
+    def test_list_metadef_objects_in_namespace(self):
+        """List Metadef Object Namespace Test
+
+        RBAC test for the glance get_metadef_objects policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # list md objects
+        self.namespace_objects_client.list_namespace_objects(
+            namespace['namespace'])
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="modify_metadef_object")
+    @decorators.idempotent_id("cd130b1d-89fa-479c-a90e-498d895fb455")
+    def test_update_metadef_object_in_namespace(self):
+        """Update Metadef Object Namespace Test
+
+        RBAC test for the glance modify_metadef_object policy
+        """
+        namespace = self.create_namespace()
+        object_name = data_utils.rand_name('test-object')
+        self.namespace_objects_client.create_namespace_object(
+            namespace['namespace'],
+            name=object_name)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.namespace_objects_client.delete_namespace_object,
+                        namespace['namespace'], object_name)
+
+        # Toggle role and modify object
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        new_name = "Object New Name"
+        self.namespace_objects_client.update_namespace_object(
+            namespace['namespace'], object_name, name=new_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_object")
+    @decorators.idempotent_id("93c61420-5b80-4a0e-b6f3-4ccc6e90b865")
+    def test_show_metadef_object_in_namespace(self):
+        """Show Metadef Object Namespace Test
+
+        RBAC test for the glance get_metadef_object policy
+        """
+        namespace = self.create_namespace()
+        object_name = data_utils.rand_name('test-object')
+        self.namespace_objects_client.create_namespace_object(
+            namespace['namespace'],
+            name=object_name)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.namespace_objects_client.delete_namespace_object,
+                        namespace['namespace'], object_name)
+        # Toggle role and get object
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_objects_client.show_namespace_object(
+            namespace['namespace'],
+            object_name)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_property_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_property_rbac.py
new file mode 100644
index 0000000..6804fa3
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_property_rbac.py
@@ -0,0 +1,102 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class NamespacesPropertyRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    @classmethod
+    def resource_setup(cls):
+        super(NamespacesPropertyRbacTest, cls).resource_setup()
+        body = cls.resource_types_client.list_resource_types()
+        cls.resource_name = body['resource_types'][0]['name']
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(NamespacesPropertyRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="add_metadef_property")
+    @decorators.idempotent_id('383555ca-677b-43e9-b809-acc2b5a0176c')
+    def test_add_md_properties(self):
+        """Create Image Metadef Namespace Property Test
+
+        RBAC test for the glance add_metadef_property policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        property_name = data_utils.rand_name('test-ns-property')
+        self.namespace_properties_client.create_namespace_property(
+            namespace=namespace['namespace'], type="string",
+            title=property_name, name=self.resource_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_properties")
+    @decorators.idempotent_id('d5177611-c2b5-4000-bd9c-1987af9222ea')
+    def test_get_md_properties(self):
+        """List Image Metadef Namespace Properties Test
+
+        RBAC test for the glance get_metadef_properties policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_properties_client.list_namespace_properties(
+            namespace=namespace['namespace'])
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_property")
+    @decorators.idempotent_id('cfeda2af-bcab-433e-80c7-4b40c774aed5')
+    def test_get_md_property(self):
+        """Get Image Metadef Namespace Property Test
+
+        RBAC test for the glance get_metadef_property policy
+        """
+        namespace = self.create_namespace()
+        property_name = data_utils.rand_name('test-ns-property')
+        self.namespace_properties_client.create_namespace_property(
+            namespace=namespace['namespace'], type="string",
+            title=property_name, name=self.resource_name)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_properties_client.show_namespace_properties(
+            namespace['namespace'], self.resource_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="modify_metadef_property")
+    @decorators.idempotent_id('fdaf9363-4010-4f2f-8192-1b28f6b22e69')
+    def test_modify_md_properties(self):
+        """Modify Image Metadef Namespace Policy Test
+
+        RBAC test for the glance modify_metadef_property policy
+        """
+        namespace = self.create_namespace()
+        property_name = data_utils.rand_name('test-ns-property')
+        self.namespace_properties_client.create_namespace_property(
+            namespace=namespace['namespace'], type="string",
+            title=property_name, name=self.resource_name)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_properties_client.update_namespace_properties(
+            namespace['namespace'], self.resource_name, type="string",
+            title=property_name, name=self.resource_name)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_rbac.py
new file mode 100644
index 0000000..6396f4f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_rbac.py
@@ -0,0 +1,82 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class ImageNamespacesRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImageNamespacesRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="add_metadef_namespace")
+    @decorators.idempotent_id('e0730ead-b824-4ffc-b774-9469df0e4da6')
+    def test_create_metadef_namespace(self):
+        """Create Image Metadef Namespace Test
+
+        RBAC test for the glance add_metadef_namespace policy
+        """
+        namespace_name = data_utils.rand_name('test-ns')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespaces_client.create_namespace(
+            namespace=namespace_name,
+            protected=False)
+        self.addCleanup(
+            test_utils.call_and_ignore_notfound_exc,
+            self.namespaces_client.delete_namespace,
+            namespace_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_namespaces")
+    @decorators.idempotent_id('f0b12538-9047-489e-98a5-2d78f48ce789')
+    def test_list_metadef_namespaces(self):
+        """List Image Metadef Namespace Test
+
+        RBAC test for the glance get_metadef_namespaces policy
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespaces_client.list_namespaces()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="modify_metadef_namespace")
+    @decorators.idempotent_id('72c14a7e-927d-4f1a-9e1f-25475552922b')
+    def test_modify_metadef_namespace(self):
+        """Modify Image Metadef Namespace Test
+
+        RBAC test for the glance modify_metadef_namespace policy
+        """
+        namespace_name = data_utils.rand_name('test-ns')
+        body = self.namespaces_client.create_namespace(
+            namespace=namespace_name,
+            protected=False)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespaces_client.update_namespace(body['namespace'],
+                                                description="My new "
+                                                            "description")
+        self.addCleanup(
+            test_utils.call_and_ignore_notfound_exc,
+            self.namespaces_client.delete_namespace,
+            namespace_name)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py
index bcfeea7..d6a6d62 100644
--- a/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 ATT Corporation.
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py
index 39b4cd9..5e20612 100644
--- a/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 ATT Corporation.
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_test_image_namespace_resource_type.py b/patrole_tempest_plugin/tests/api/image/v2/test_test_image_namespace_resource_type.py
new file mode 100644
index 0000000..f7e76c1
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_test_image_namespace_resource_type.py
@@ -0,0 +1,64 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class ImageNamespacesResourceTypeRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImageNamespacesResourceTypeRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="list_metadef_resource_types")
+    @decorators.idempotent_id('0416fc4d-cfdc-447b-88b6-d9f1dd0382f7')
+    def test_list_metadef_resource_types(self):
+        """List Metadef Resource Type Image Test
+
+        RBAC test for the glance list_metadef_resource_type policy.
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.resource_types_client.list_resource_types()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_resource_type")
+    @decorators.idempotent_id('3698d53c-71ae-4803-a2c3-c272c054f25c')
+    def test_get_metadef_resource_type(self):
+        """Get Metadef Resource Type Image Test
+
+        RBAC test for the glance get_metadef_resource_type policy.
+        """
+        namespace_name = data_utils.rand_name('test-ns')
+        self.namespaces_client.create_namespace(
+            namespace=namespace_name,
+            protected=False)
+        self.addCleanup(
+            test_utils.call_and_ignore_notfound_exc,
+            self.namespaces_client.delete_namespace,
+            namespace_name)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.resource_types_client.list_resource_type_association(
+            namespace_name)
diff --git a/patrole_tempest_plugin/tests/api/network/rbac_base.py b/patrole_tempest_plugin/tests/api/network/rbac_base.py
index 3bbe8b6..18a80a1 100644
--- a/patrole_tempest_plugin/tests/api/network/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/network/rbac_base.py
@@ -1,4 +1,6 @@
-# Copyright 2017 at&t
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
 #    a copy of the License at
diff --git a/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py b/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
index 77d042d..eb5c42a 100644
--- a/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
+++ b/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/admin/test_qos_rbac.py b/patrole_tempest_plugin/tests/api/volume/admin/test_qos_rbac.py
new file mode 100644
index 0000000..197cbf6
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/admin/test_qos_rbac.py
@@ -0,0 +1,163 @@
+# Copyright 2017 AT&T Corp
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumeQOSRbacTest(rbac_base.BaseVolumeAdminRbacTest):
+    @classmethod
+    def setup_clients(cls):
+        super(VolumeQOSRbacTest, cls).setup_clients()
+        cls.admin_client = cls.os_adm.volume_qos_client
+        cls.auth_provider = cls.os.auth_provider
+        cls.client = cls.admin_volume_qos_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumeQOSRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:create")
+    @decorators.idempotent_id('4f9f45f0-b379-4577-a279-cec3e917cbec')
+    def test_create_qos_with_consumer(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Create a qos
+        self.create_test_qos_specs()
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:delete")
+    @decorators.idempotent_id('fbc8a77e-6b6d-45ae-bebe-c496eb8f06f7')
+    def test_delete_qos_with_consumer(self):
+        # Create a qos
+        qos = self.create_test_qos_specs()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Delete a qos
+        self.client.delete_qos(qos['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume_extension:qos_specs_manage:read")
+    @decorators.idempotent_id('22aff0dd-0343-408d-ae80-e77551956e14')
+    def test_get_qos(self):
+        # Create a qos
+        qos = self.create_test_qos_specs()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Get a qos
+        self.client.show_qos(qos['id'])['qos_specs']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume_extension:qos_specs_manage:read")
+    @decorators.idempotent_id('546b8bb1-04a4-4387-9506-a538a7f3cd6a')
+    def test_list_qos(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # list all qos
+        self.client.list_qos()['qos_specs']
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:update")
+    @decorators.idempotent_id('89b630b7-c170-47c3-ac80-50ed425c2d98')
+    def test_set_qos_key(self):
+        # Create a qos
+        qos = self.create_test_qos_specs()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # set key
+        self.client.set_qos_key(qos['id'], iops_bytes='500')['qos_specs']
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:update")
+    @decorators.idempotent_id('6c50c837-de77-4dae-a2ec-30e05c62969c')
+    def test_unset_qos_key(self):
+        # Create a qos
+        qos = self.create_test_qos_specs()
+        # Set key
+        self.client.set_qos_key(qos['id'], iops_bytes='500')['qos_specs']
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Unset key
+        keys = ['iops_bytes']
+        self.client.unset_qos_key(qos['id'], keys)
+        operation = 'qos-key-unset'
+        waiters.wait_for_qos_operations(self.client, qos['id'],
+                                        operation, args=keys)
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:update")
+    @decorators.idempotent_id('2047b347-8bbe-405e-bf5a-c75a0d7e3930')
+    def test_associate_qos(self):
+        # Create a qos
+        qos = self.create_test_qos_specs()
+        # create a test volume-type
+        vol_type = self.create_volume_type()['id']
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # associate the qos-specs with volume-types
+        self.client.associate_qos(qos['id'], vol_type)
+        self.addCleanup(self.client.disassociate_qos, qos['id'], vol_type)
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume_extension:qos_specs_manage:read")
+    @decorators.idempotent_id('ff1e98f3-d456-40a9-96d4-c7e4a55dcffa')
+    def test_get_association_qos(self):
+        # create a test volume-type
+        qos = self.create_test_qos_specs()
+        vol_type = self.create_volume_type()['id']
+        # associate the qos-specs with volume-types
+        self.client.associate_qos(qos['id'], vol_type)
+        self.addCleanup(self.client.disassociate_qos, qos['id'], vol_type)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # get the association of the qos-specs
+        self.client.show_association_qos(qos['id'])
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:update")
+    @decorators.idempotent_id('f12aeca1-0c02-4f33-b805-014171e5b2d4')
+    def test_disassociate_qos(self):
+        # create a test volume-type
+        qos = self.create_test_qos_specs()
+        vol_type = self.create_volume_type()['id']
+        # associate the qos-specs with volume-types
+        self.client.associate_qos(qos['id'], vol_type)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.client.disassociate_qos, qos['id'], vol_type)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # disassociate a volume-type with qos-specs
+        self.client.disassociate_qos(qos['id'], vol_type)
+        operation = 'disassociate'
+        waiters.wait_for_qos_operations(self.client, qos['id'],
+                                        operation, args=vol_type)
+
+    @rbac_rule_validation.action(
+        service="cinder", rule="volume_extension:qos_specs_manage:update")
+    @decorators.idempotent_id('9f6e664d-a5d9-4e71-b122-73a3086be1b9')
+    def test_disassociate_all_qos(self):
+        qos = self.create_test_qos_specs()
+        # create a test volume-type
+        vol_type = self.create_volume_type()['id']
+        # associate the qos-specs with volume-types
+        self.client.associate_qos(qos['id'], vol_type)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.client.disassociate_qos, qos['id'], vol_type)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # disassociate all volume-types from qos-specs
+        self.client.disassociate_all_qos(qos['id'])
+        operation = 'disassociate-all'
+        waiters.wait_for_qos_operations(self.client, qos['id'],
+                                        operation)
diff --git a/patrole_tempest_plugin/tests/api/volume/admin/test_volume_quotas_rbac.py b/patrole_tempest_plugin/tests/api/volume/admin/test_volume_quotas_rbac.py
index 851dec3..c4bd578 100644
--- a/patrole_tempest_plugin/tests/api/volume/admin/test_volume_quotas_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/admin/test_volume_quotas_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py b/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
new file mode 100644
index 0000000..e36d684
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
@@ -0,0 +1,72 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesBackupsAdminRbacTest(rbac_base.BaseVolumeAdminRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesBackupsAdminRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.backup:
+            raise cls.skipException("Cinder backup feature disabled")
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesBackupsAdminRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesBackupsAdminRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:backup-export")
+    @decorators.idempotent_id('e984ec8d-e8eb-485c-98bc-f1856020303c')
+    def test_volume_backup_export(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Export Backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.export_backup(
+            backup['id'])['backup-record']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:backup-import")
+    @decorators.idempotent_id('1e70f039-4556-44cc-9cc1-edf2b7ed648b')
+    def test_volume_backup_import(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Export a temp backup
+        export_backup = self.backups_client.export_backup(
+            backup['id'])['backup-record']
+        # Import the temp backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        import_backup = self.backups_client.import_backup(
+            backup_service=export_backup['backup_service'],
+            backup_url=export_backup['backup_url'])['backup']
+        self.addCleanup(self.backups_client.delete_backup, import_backup['id'])
+
+
+class VolumesBackupsAdminV3RbacTest(VolumesBackupsAdminRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/rbac_base.py b/patrole_tempest_plugin/tests/api/volume/rbac_base.py
index e92b980..67953ee 100644
--- a/patrole_tempest_plugin/tests/api/volume/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/volume/rbac_base.py
@@ -1,4 +1,4 @@
-# Copyright 2017 at&t
+# Copyright 2017 AT&T Corporation.
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
 #    a copy of the License at
diff --git a/patrole_tempest_plugin/tests/api/volume/test_availability_zone_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_availability_zone_rbac.py
new file mode 100644
index 0000000..d6426dd
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_availability_zone_rbac.py
@@ -0,0 +1,42 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class AvailabilityZoneRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(AvailabilityZoneRbacTest, cls).setup_clients()
+        cls.client = cls.availability_zone_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(AvailabilityZoneRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:availability_zone_list")
+    @decorators.idempotent_id('8cfd920c-4b6c-402d-b6e2-ede86bedc702')
+    def test_get_availability_zone_list(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_availability_zones()
diff --git a/patrole_tempest_plugin/tests/api/volume/test_extensions_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_extensions_rbac.py
new file mode 100644
index 0000000..a0ff55f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_extensions_rbac.py
@@ -0,0 +1,41 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class ExtensionsRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ExtensionsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:list_extensions")
+    @decorators.idempotent_id('7f2dcc41-e850-493f-a400-82db4e2b50c0')
+    def test_list_extensions(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.volumes_extension_client.list_extensions()
+
+
+class ExtensionsV3RbacTest(ExtensionsRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_snapshots_actions_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_snapshots_actions_rbac.py
index 703b284..c321400 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_snapshots_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_snapshots_actions_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/test_snapshots_metadata_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_snapshots_metadata_rbac.py
new file mode 100644
index 0000000..d650177
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_snapshots_metadata_rbac.py
@@ -0,0 +1,90 @@
+# Copyright 2016 AT&T Corp
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class SnapshotMetadataRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(SnapshotMetadataRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.snapshot:
+            raise cls.skipException("Cinder snapshot feature disabled")
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(SnapshotMetadataRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(SnapshotMetadataRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+        # Create a snapshot
+        cls.snapshot = cls.create_snapshot(volume_id=cls.volume['id'])
+        cls.snapshot_id = cls.snapshot['id']
+
+    @classmethod
+    def _create_test_snapshot_metadata(self):
+        # Create test snapshot metadata
+        metadata = {"key1": "value1",
+                    "key2": "value2",
+                    "key3": "value3"}
+        self.snapshots_client.create_snapshot_metadata(
+            self.snapshot_id, metadata)['metadata']
+
+    @rbac_rule_validation.action(
+        service="cinder",
+        rule="volume_extension:extended_snapshot_attributes")
+    @decorators.idempotent_id('c9cbec1c-edfe-46b8-825b-7b6ac0a58c25')
+    def test_create_snapshot_metadata(self):
+        # Create metadata for the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._create_test_snapshot_metadata()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_volume_image_metadata")
+    @decorators.idempotent_id('f6912bb1-62e6-483d-bcd0-e98c1641f4c3')
+    def test_get_snapshot_metadata(self):
+        # Create volume and snapshot metadata
+        self._create_test_snapshot_metadata()
+        # Get metadata for the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.snapshots_client.show_snapshot_metadata(
+            self.snapshot_id)
+
+    @rbac_rule_validation.action(
+        service="cinder",
+        rule="volume_extension:volume_tenant_attribute")
+    @decorators.idempotent_id('e2c73b00-0c19-4bb7-8c61-d84b1a223ed1')
+    def test_get_snapshot_metadata_for_volume_tenant(self):
+        # Create volume and snapshot metadata
+        self._create_test_snapshot_metadata()
+        # Get metadata for the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Get the metadata of the snapshot
+        self.snapshots_client.show_snapshot_metadata(
+            self.snapshot_id)['metadata']
+
+
+class SnapshotMetadataV3RbacTest(SnapshotMetadataRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
new file mode 100644
index 0000000..b15eb3f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
@@ -0,0 +1,121 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesActionsRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesActionsRbacTest, cls).skip_checks()
+        # Nova is needed to create a server
+        if not CONF.service_available.nova:
+            skip_msg = ("%s skipped as nova is not available" % cls.__name__)
+            raise cls.skipException(skip_msg)
+        # Glance is needed to create an image
+        if not CONF.service_available.glance:
+            skip_msg = ("%s skipped as glance is not available" % cls.__name__)
+            raise cls.skipException(skip_msg)
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesActionsRbacTest, cls).setup_clients()
+        cls.client = cls.os.volumes_client
+        cls.image_client = cls.os.image_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesActionsRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesActionsRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    def _attach_volume(self):
+        server = self.create_server(wait_until='ACTIVE')
+        self.servers_client.attach_volume(
+            server['id'], volumeId=self.volume['id'],
+            device='/dev/%s' % CONF.compute.volume_device_name)
+        waiters.wait_for_volume_status(self.client,
+                                       self.volume['id'], 'in-use')
+        self.addCleanup(self._detach_volume)
+
+    def _detach_volume(self):
+        self.client.detach_volume(self.volume['id'])
+        waiters.wait_for_volume_status(self.client, self.volume['id'],
+                                       'available')
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:attach")
+    @decorators.idempotent_id('f97b10e4-2eed-4f8b-8632-71c02cb9fe42')
+    def test_attach_volume_to_instance(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Attach the volume
+        self._attach_volume()
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:detach")
+    @decorators.idempotent_id('5a042f6a-688b-42e6-a02e-fe5c47b89b07')
+    def test_detach_volume_to_instance(self):
+        # Attach the volume
+        self._attach_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Detach the volume
+        self._detach_volume()
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:get")
+    @decorators.idempotent_id('c4c3fdd5-b1b1-49c3-b977-a9f40ee9257a')
+    def test_get_volume_attachment(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Get attachment
+        self.client.show_volume(self.volume['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:copy_volume_to_image")
+    @decorators.idempotent_id('b0d0da46-903c-4445-893e-20e680d68b50')
+    def test_volume_upload(self):
+        image_name = data_utils.rand_name('image')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        body = self.client.upload_volume(
+            self.volume['id'], image_name=image_name,
+            disk_format=CONF.volume.disk_format)['os-volume_upload_image']
+        image_id = body['image_id']
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.image_client.delete_image,
+                        image_id)
+        waiters.wait_for_image_status(self.image_client, image_id, 'active')
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:update_readonly_flag")
+    @decorators.idempotent_id('2750717a-f250-4e41-9e09-02624aad6ff8')
+    def test_volume_readonly_update(self):
+        volume = self.create_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Update volume readonly
+        self.client.update_volume_readonly(volume['id'], readonly=True)
+
+
+class VolumesActionsV3RbacTest(VolumesActionsRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_create_delete_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_create_delete_rbac.py
index 7d4fe30..4814fa7 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volume_create_delete_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_create_delete_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_metadata_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_metadata_rbac.py
index e266827..234865c 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volume_metadata_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_metadata_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
new file mode 100644
index 0000000..f88d44f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
@@ -0,0 +1,96 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesTransfersRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    credentials = ['primary', 'alt', 'admin']
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesTransfersRbacTest, cls).setup_clients()
+        cls.client = cls.volumes_client
+        cls.alt_client = cls.os_alt.volumes_client
+        cls.alt_tenant_id = cls.alt_client.tenant_id
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesTransfersRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesTransfersRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    def _delete_transfer(self, transfer):
+        # Volume from create_volume_transfer test may get stuck in
+        # 'awaiting-transfer' state, preventing cleanup and causing
+        # the test to fail
+        test_utils.call_and_ignore_notfound_exc(
+            self.client.delete_volume_transfer, transfer['id'])
+        waiters.wait_for_volume_status(self.client, self.volume['id'],
+                                       'available')
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:create_transfer")
+    @decorators.idempotent_id('25413af4-468d-48ff-94ca-4436f8526b3e')
+    def test_create_volume_transfer(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        transfer = self.client.create_volume_transfer(
+            volume_id=self.volume['id'])['transfer']
+        self.addCleanup(self._delete_transfer, transfer)
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_all_transfers")
+    @decorators.idempotent_id('7a0925d3-ed97-4c25-8299-e5cdabe2eb55')
+    def test_get_volume_transfer(self):
+        transfer = self.client.create_volume_transfer(
+            volume_id=self.volume['id'])['transfer']
+        self.addCleanup(self._delete_transfer, transfer)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_volume_transfer(transfer['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_all_transfers")
+    @decorators.idempotent_id('02a06f2b-5040-49e2-b2b7-619a7db59603')
+    def test_list_volume_transfers(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_volume_transfers()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:accept_transfer")
+    @decorators.idempotent_id('987f2a11-d657-4984-a6c9-28f06c1cd014')
+    def test_accept_volume_transfer(self):
+        transfer = self.client.create_volume_transfer(
+            volume_id=self.volume['id'])['transfer']
+        self.addCleanup(self._delete_transfer, transfer)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.accept_volume_transfer(transfer['id'],
+                                           auth_key=transfer['auth_key'])
+
+
+class VolumesTransfersV3RbacTest(VolumesTransfersRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
new file mode 100644
index 0000000..32a1566
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
@@ -0,0 +1,101 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesBackupsRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesBackupsRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.backup:
+            raise cls.skipException("Cinder backup feature disabled")
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesBackupsRbacTest, self).tearDown()
+
+    def create_backup(self, volume_id):
+        backup_name = data_utils.rand_name(
+            self.__class__.__name__ + '-Backup')
+        backup = self.backups_client.create_backup(
+            volume_id=volume_id, name=backup_name)['backup']
+        self.addCleanup(self.backups_client.delete_backup, backup['id'])
+        waiters.wait_for_backup_status(self.backups_client, backup['id'],
+                                       'available')
+        return backup
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesBackupsRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:create")
+    @decorators.idempotent_id('6887ec94-0bcf-4ab7-b30f-3808a4b5a2a5')
+    def test_volume_backup_create(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_backup(volume_id=self.volume['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:get")
+    @decorators.idempotent_id('abd92bdd-b0fb-4dc4-9cfc-de9e968f8c8a')
+    def test_volume_backup_get(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Get a given backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.show_backup(backup['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:get_all")
+    @decorators.idempotent_id('4d18f0f0-7e01-4007-b622-dedc859b22f6')
+    def test_volume_backup_list(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.list_backups()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:restore")
+    @decorators.idempotent_id('9c794bf9-2446-4f41-8fe0-80b71e757f9d')
+    def test_volume_backup_restore(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Restore backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.restore_backup(backup['id'])['restore']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:delete")
+    @decorators.idempotent_id('d5d0c6a2-413d-437e-a73f-4bf2b41a20ed')
+    def test_volume_backup_delete(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Delete backup
+        self.backups_client.delete_backup(backup['id'])
+
+
+class VolumesBackupsV3RbacTest(VolumesBackupsRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py
new file mode 100644
index 0000000..87e98e2
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py
@@ -0,0 +1,52 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesExtendRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesExtendRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesExtendRbacTest, cls).resource_setup()
+        # Create a test shared volume for tests
+        cls.volume = cls.create_volume()
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:extend")
+    @decorators.idempotent_id('1627b065-4081-4e14-8340-8e4fb02ceaf2')
+    def test_volume_extend(self):
+        # Extend volume test
+        extend_size = int(self.volume['size']) + 1
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.volumes_client.extend_volume(self.volume['id'],
+                                          new_size=extend_size)
+        waiters.wait_for_volume_status(self.volumes_client, self.volume['id'],
+                                       'available')
+
+
+class VolumesExtendV3RbacTest(VolumesExtendRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_list_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_list_rbac.py
new file mode 100644
index 0000000..90e238c
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_list_rbac.py
@@ -0,0 +1,56 @@
+# Copyright 2017 AT&T Corp
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesListRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesListRbacTest, cls).setup_clients()
+        cls.client = cls.os.volumes_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesListRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_all")
+    @decorators.idempotent_id('e3ab7906-b04b-4c45-aa11-1104d302f940')
+    def test_volume_list(self):
+        # Get a list of Volumes
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_volumes()
+
+    @rbac_rule_validation.action(
+        service="cinder",
+        rule="volume_extension:get_volumes_image_metadata")
+    @decorators.idempotent_id('3d48ca91-f02b-4616-a69d-4a8b296c8529')
+    def test_volume_list_image_metadata(self):
+        # Get a list of Volumes
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_volumes(detail=True)
+
+
+class VolumeListV3RbacTest(VolumesListRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_rbac.py
index 3e21444..5d889e8 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volumes_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_snapshots_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_snapshots_rbac.py
new file mode 100644
index 0000000..2fb8885
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_snapshots_rbac.py
@@ -0,0 +1,114 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesSnapshotRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesSnapshotRbacTest, cls).setup_clients()
+        cls.client = cls.snapshots_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesSnapshotRbacTest, self).tearDown()
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesSnapshotRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.snapshot:
+            raise cls.skipException("Cinder volume snapshots are disabled")
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesSnapshotRbacTest, cls).resource_setup()
+        # Create a test shared volume for tests
+        cls.name_field = cls.special_fields['name_field']
+        cls.descrip_field = cls.special_fields['descrip_field']
+        cls.volume = cls.create_volume()
+        # Create a test shared snapshot for tests
+        cls.snapshot = cls.create_snapshot(cls.volume['id'])
+
+    def _list_by_param_values(self, params, with_detail=False):
+        # Perform list or list_details action with given params
+        # and validates result.
+
+        if with_detail:
+            self.snapshots_client.list_snapshots(
+                detail=True, params=params)['snapshots']
+        else:
+            self.snapshots_client.list_snapshots(
+                params=params)['snapshots']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:create_snapshot")
+    @decorators.idempotent_id('ac7b2ee5-fbc0-4360-afc2-de8fa4881ede')
+    def test_snapshot_create(self):
+        # Create a temp snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_snapshot(self.volume['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_snapshot")
+    @decorators.idempotent_id('93a11b40-1ba8-44d6-a196-f8d97220f796')
+    def test_snapshot_get(self):
+        # Get the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_snapshot(self.snapshot
+                                  ['id'])['snapshot']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:update_snapshot")
+    @decorators.idempotent_id('53fe8ee3-3bea-4ae8-a979-3c98ea72f620')
+    def test_snapshot_update(self):
+        new_desc = 'This is the new description of snapshot.'
+        params = {self.descrip_field: new_desc}
+        # Updates snapshot with new values
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.update_snapshot(
+            self.snapshot['id'], **params)['snapshot']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_all_snapshots")
+    @decorators.idempotent_id('e4edf0c0-2cd3-420f-b8ab-4d98a0718608')
+    def test_snapshots_get_all(self):
+        """list snapshots with params."""
+        # Verify list snapshots by display_name filter
+        params = {self.name_field: self.snapshot[self.name_field]}
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._list_by_param_values(params)
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:delete_snapshot")
+    @decorators.idempotent_id('c7fe54ec-3b70-4772-ba11-f166d95888a3')
+    def test_snapshot_delete(self):
+        # Create a temp snapshot
+        temp_snapshot = self.create_snapshot(self.volume['id'])
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Delete the snapshot
+        self.client.delete_snapshot(temp_snapshot['id'])
+
+
+class VolumesSnapshotV3RbacTest(VolumesSnapshotRbacTest):
+    _api_version = 3
diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py
index 0fe31a5..d86d91c 100644
--- a/releasenotes/source/conf.py
+++ b/releasenotes/source/conf.py
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Glance Release Notes documentation build configuration file, created by
-# sphinx-quickstart on Tue Nov  3 17:40:50 2015.
+# Patrole Release Notes documentation build configuration file, created by
+# sphinx-quickstart on Tue Jan 5 17:40:50 2017.
 #
 # This file is execfile()d with the current directory set to its
 # containing dir.
@@ -56,7 +56,7 @@
 
 # General information about the project.
 project = u'patrole Release Notes'
-copyright = u'2016, OpenStack Foundation'
+copyright = u'2017, Patrole Developers'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
@@ -189,7 +189,7 @@
 # html_file_suffix = None
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = 'GlanceReleaseNotesdoc'
+htmlhelp_basename = 'PatroleReleaseNotesdoc'
 
 
 # -- Options for LaTeX output ---------------------------------------------
@@ -209,8 +209,9 @@
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-    ('index', 'GlanceReleaseNotes.tex', u'Glance Release Notes Documentation',
-     u'Glance Developers', 'manual'),
+    ('index', 'PatroleReleaseNotes.tex',
+     u'Patrole Release Notes Documentation',
+     u'Patrole Developers', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -239,8 +240,8 @@
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    ('index', 'glancereleasenotes', u'Glance Release Notes Documentation',
-     [u'Glance Developers'], 1)
+    ('index', 'patrolereleasenotes', u'Patrole Release Notes Documentation',
+     [u'Patrole Developers'], 1)
 ]
 
 # If true, show URL addresses after external links.
@@ -253,8 +254,8 @@
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    ('index', 'GlanceReleaseNotes', u'Glance Release Notes Documentation',
-     u'Glance Developers', 'GlanceReleaseNotes',
+    ('index', 'PatroleReleaseNotes', u'Patrole Release Notes Documentation',
+     u'Patrole Developers', 'PatroleReleaseNotes',
      'One line description of project.',
      'Miscellaneous'),
 ]
diff --git a/setup.py b/setup.py
index 3dccac1..f730546 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,5 @@
-# Copyright (c) 2016 AT&T inc.
+# Copyright 2017 ATT Corporation.
+# All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/tests/base.py b/tests/base.py
index 14872ac..d73ff43 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -1,6 +1,6 @@
 # Copyright 2010-2011 OpenStack Foundation
 # Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
-# Copyright (c) 2016 AT&T Inc
+# Copyright 2017 AT&T Corporation.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
diff --git a/tests/resources/alt_admin_rbac_policy.json b/tests/resources/alt_admin_rbac_policy.json
new file mode 100644
index 0000000..bf07182
--- /dev/null
+++ b/tests/resources/alt_admin_rbac_policy.json
@@ -0,0 +1,5 @@
+{
+	"context_is_admin": "role:super_admin",
+	"admin_rule": "role:super_admin",
+	"non_admin_rule": "role:fake_admin"
+}
diff --git a/tests/resources/tenant_rbac_policy.json b/tests/resources/tenant_rbac_policy.json
new file mode 100644
index 0000000..2647e4d
--- /dev/null
+++ b/tests/resources/tenant_rbac_policy.json
@@ -0,0 +1,6 @@
+{
+	"rule1": "tenant_id:%(network:tenant_id)s",
+	"rule2": "tenant_id:%(tenant_id)s",
+	"rule3": "project_id:%(project_id)s",
+	"admin_rule": "role:admin and tenant_id:%(tenant_id)s"
+}
\ No newline at end of file
diff --git a/tests/test_patrole.py b/tests/test_patrole.py
index 3e85142..d374e20 100644
--- a/tests/test_patrole.py
+++ b/tests/test_patrole.py
@@ -1,4 +1,5 @@
-# Copyright (c) 2016 AT&T Inc
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
diff --git a/tests/test_rbac_role_converter.py b/tests/test_rbac_role_converter.py
index dadab88..09fa081 100644
--- a/tests/test_rbac_role_converter.py
+++ b/tests/test_rbac_role_converter.py
@@ -1,4 +1,5 @@
-#    Copyright 2017 AT&T Inc.
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
@@ -12,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import mock
 import os
 
 from tempest import config
@@ -34,12 +36,17 @@
         self.admin_policy_file = os.path.join(current_directory,
                                               'resources',
                                               'admin_rbac_policy.json')
+        self.alt_admin_policy_file = os.path.join(current_directory,
+                                                  'resources',
+                                                  'alt_admin_rbac_policy.json')
+        self.tenant_policy_file = os.path.join(current_directory,
+                                               'resources',
+                                               'tenant_rbac_policy.json')
 
-    def test_custom_policy(self):
+    @mock.patch.object(rbac_role_converter, 'LOG', autospec=True)
+    def test_custom_policy(self, m_log):
         default_roles = ['zero', 'one', 'two', 'three', 'four',
                          'five', 'six', 'seven', 'eight', 'nine']
-        CONF.set_override('rbac_roles', default_roles, group='rbac',
-                          enforce_type=True)
 
         converter = rbac_role_converter.RbacPolicyConverter(
             None, "test", self.custom_policy_file)
@@ -57,7 +64,10 @@
         fake_rule = 'fake_rule'
 
         for role in default_roles:
-            self.assertRaises(KeyError, converter.allowed, fake_rule, role)
+            self.assertFalse(converter.allowed(fake_rule, role))
+            m_log.debug.assert_called_once_with(
+                "{0} not found in policy file.".format('fake_rule'))
+            m_log.debug.reset_mock()
 
         for rule, role_list in expected.items():
             for role in role_list:
@@ -66,19 +76,14 @@
                 self.assertFalse(converter.allowed(rule, role))
 
     def test_admin_policy_file_with_admin_role(self):
-        default_roles = ['admin', 'Member']
-        CONF.set_override('rbac_roles', default_roles, group='rbac',
-                          enforce_type=True)
-
         converter = rbac_role_converter.RbacPolicyConverter(
             None, "test", self.admin_policy_file)
 
         role = 'admin'
         allowed_rules = [
-            'admin_rule'
+            'admin_rule', 'is_admin_rule', 'alt_admin_rule'
         ]
-        disallowed_rules = [
-            'is_admin_rule', 'alt_admin_rule', 'non_admin_rule']
+        disallowed_rules = ['non_admin_rule']
 
         for rule in allowed_rules:
             allowed = converter.allowed(rule, role)
@@ -89,10 +94,6 @@
             self.assertFalse(allowed)
 
     def test_admin_policy_file_with_member_role(self):
-        default_roles = ['admin', 'Member']
-        CONF.set_override('rbac_roles', default_roles, group='rbac',
-                          enforce_type=True)
-
         converter = rbac_role_converter.RbacPolicyConverter(
             None, "test", self.admin_policy_file)
 
@@ -110,3 +111,72 @@
         for rule in disallowed_rules:
             allowed = converter.allowed(rule, role)
             self.assertFalse(allowed)
+
+    def test_admin_policy_file_with_context_is_admin(self):
+        converter = rbac_role_converter.RbacPolicyConverter(
+            None, "test", self.alt_admin_policy_file)
+
+        role = 'fake_admin'
+        allowed_rules = ['non_admin_rule']
+        disallowed_rules = ['admin_rule']
+
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertTrue(allowed)
+
+        for rule in disallowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertFalse(allowed)
+
+        role = 'super_admin'
+        allowed_rules = ['admin_rule']
+        disallowed_rules = ['non_admin_rule']
+
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertTrue(allowed)
+
+        for rule in disallowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertFalse(allowed)
+
+    def test_tenant_policy(self):
+        """Test whether rules with format tenant_id:%(tenant_id)s work.
+
+        Test whether Neutron rules that contain project_id, tenant_id, and
+        network:tenant_id pass.
+        """
+        test_tenant_id = mock.sentinel.tenant_id
+        converter = rbac_role_converter.RbacPolicyConverter(
+            test_tenant_id, "test", self.tenant_policy_file)
+
+        # Check whether Member role can perform expected actions.
+        allowed_rules = ['rule1', 'rule2', 'rule3']
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, 'Member')
+            self.assertTrue(allowed)
+        self.assertFalse(converter.allowed('admin_rule', 'Member'))
+
+        # Check whether admin role can perform expected actions.
+        allowed_rules.append('admin_rule')
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, 'admin')
+            self.assertTrue(allowed)
+
+        # Check whether _try_rule is called with the correct target dictionary.
+        with mock.patch.object(converter, '_try_rule', autospec=True) \
+            as mock_try_rule:
+            mock_try_rule.return_value = True
+
+            expected_target = {
+                "project_id": test_tenant_id,
+                "tenant_id": test_tenant_id,
+                "network:tenant_id": test_tenant_id
+            }
+
+            for rule in allowed_rules:
+                allowed = converter.allowed(rule, 'Member')
+                self.assertTrue(allowed)
+                mock_try_rule.assert_called_once_with(
+                    rule, expected_target, mock.ANY, mock.ANY)
+                mock_try_rule.reset_mock()
diff --git a/tests/test_rbac_utils.py b/tests/test_rbac_utils.py
index 657b389..3c645f8 100644
--- a/tests/test_rbac_utils.py
+++ b/tests/test_rbac_utils.py
@@ -1,4 +1,5 @@
-#    Copyright 2017 AT&T Inc.
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
