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 7f9d4d2..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
@@ -28,8 +28,14 @@
 def action(service, rule):
     def decorator(func):
         def wrapper(*args, **kwargs):
-            authority = rbac_auth.RbacAuthority(
-                args[0].auth_provider.credentials.tenant_id, service)
+            try:
+                tenant_id = args[0].auth_provider.credentials.tenant_id
+            except (IndexError, AttributeError) as e:
+                msg = ("{0}: tenant_id not found in "
+                       "cls.auth_provider.credentials".format(e))
+                LOG.error(msg)
+                raise rbac_exceptions.RbacResourceSetupFailed(msg)
+            authority = rbac_auth.RbacAuthority(tenant_id, service)
             allowed = authority.get_permission(rule, CONF.rbac.rbac_test_role)
 
             try:
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/__init__.py b/patrole_tempest_plugin/tests/api/compute/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/__init__.py
diff --git a/patrole_tempest_plugin/tests/api/compute/rbac_base.py b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
new file mode 100644
index 0000000..030ee5c
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
@@ -0,0 +1,38 @@
+# 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
+#
+#         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.api.compute import base as compute_base
+from tempest import config
+
+CONF = config.CONF
+
+
+class BaseV2ComputeRbacTest(compute_base.BaseV2ComputeTest):
+
+    credentials = ['primary', 'admin']
+
+    @classmethod
+    def skip_checks(cls):
+        super(BaseV2ComputeRbacTest, 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(BaseV2ComputeRbacTest, 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
new file mode 100644
index 0000000..3da3bd8
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
@@ -0,0 +1,47 @@
+# 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
+#
+#         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 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):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+
+    @classmethod
+    def setup_clients(cls):
+        super(RBACAbsoluteLimitsTestJSON, 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()
+        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-used-limits")
+    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
+    def test_used_limits_for_admin_rbac(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.limits_client.show_limits()
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/__init__.py b/patrole_tempest_plugin/tests/api/image/v2/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/__init__.py
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_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/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_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..aec39b4
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
@@ -0,0 +1,96 @@
+# 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.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_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/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
