diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py
index 3cf70b4..18562e5 100755
--- a/manila_tempest_tests/tests/api/base.py
+++ b/manila_tempest_tests/tests/api/base.py
@@ -760,7 +760,7 @@
         share_network_subnet = client.create_subnet(
             **kwargs)['share_network_subnet']
         resource = {
-            "type": "share-network-subnet",
+            "type": "share_network_subnet",
             "id": share_network_subnet["id"],
             "extra_params": {
                 "share_network_id": share_network_subnet["share_network_id"]
diff --git a/manila_tempest_tests/tests/api/test_share_servers_multiple_subnet_negative.py b/manila_tempest_tests/tests/api/test_share_servers_multiple_subnet_negative.py
index 522f34e..a230163 100644
--- a/manila_tempest_tests/tests/api/test_share_servers_multiple_subnet_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_servers_multiple_subnet_negative.py
@@ -32,13 +32,17 @@
         super(ShareServerMultipleSubNegativeTest, cls).skip_checks()
         if not CONF.share.multitenancy_enabled:
             raise cls.skipException('Multitenancy tests are disabled.')
+        if not CONF.share.run_share_server_multiple_subnet_tests:
+            raise cls.skipException(
+                'Share server multiple subnets and network allocation '
+                'update tests are disabled.')
         utils.check_skip_if_microversion_not_supported("2.70")
 
     @classmethod
     def resource_setup(cls):
         super(ShareServerMultipleSubNegativeTest, cls).resource_setup()
-        cls.share_network = cls.alt_shares_v2_client.get_share_network(
-            cls.alt_shares_v2_client.share_network_id)['share_network']
+        cls.share_network = cls.shares_v2_client.get_share_network(
+            cls.shares_v2_client.share_network_id)['share_network']
 
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @decorators.idempotent_id('1e2a9415-b02f-4c02-812d-bedc361f92ce')
@@ -53,9 +57,9 @@
         zones = self.get_availability_zones_matching_share_type(
             share_type)
         if not pools or not zones:
-            raise self.skipException("At least one backend that supports "
-                                     "adding multiple subnets into a share "
-                                     "network is needed for this test.")
+            raise self.skipException("At least one backend that does not "
+                                     "support adding multiple subnets into a "
+                                     "share network is needed for this test.")
         extra_specs = {'pool_name': pools[0]['pool'],
                        'availability_zone': zones[0]}
         self.admin_shares_v2_client.update_share_type_extra_specs(
diff --git a/manila_tempest_tests/tests/rbac/base.py b/manila_tempest_tests/tests/rbac/base.py
index b1eba9b..06759ff 100644
--- a/manila_tempest_tests/tests/rbac/base.py
+++ b/manila_tempest_tests/tests/rbac/base.py
@@ -53,7 +53,7 @@
             'sn': 'share_network',
         }
         key, resource_id = list(kwargs.items())[0]
-        key = key.split('_')[0]
+        key = key.rsplit('_', 1)[0]
         resource_name = key_names[key] if key in key_names else key
 
         del_action = getattr(client, 'delete_{}'.format(resource_name))
@@ -116,6 +116,19 @@
         return share_type
 
     @classmethod
+    def create_share_group_type(cls, share_types, is_public=True,
+                                group_specs=None):
+        name = data_utils.rand_name('share-group-type')
+        share_group_type = (
+            cls.admin_shares_v2_client.create_share_group_type(
+                name=name, share_types=share_types, is_public=is_public,
+                group_specs=group_specs))['share_group_type']
+        cls.addClassResourceCleanup(
+            cls.delete_resource, cls.admin_shares_v2_client,
+            share_group_type_id=share_group_type['id'])
+        return share_group_type
+
+    @classmethod
     def get_share_type(cls):
         return cls.shares_v2_client.get_default_share_type()['share_type']
 
diff --git a/manila_tempest_tests/tests/rbac/test_share_group_types.py b/manila_tempest_tests/tests/rbac/test_share_group_types.py
new file mode 100644
index 0000000..ac2f54b
--- /dev/null
+++ b/manila_tempest_tests/tests/rbac/test_share_group_types.py
@@ -0,0 +1,372 @@
+# Copyright 2022 Red Hat, Inc.
+# 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.
+
+import abc
+
+from tempest import config
+from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+from testtools import testcase as tc
+
+from manila_tempest_tests.common import constants
+from manila_tempest_tests.tests.api import base
+from manila_tempest_tests.tests.rbac import base as rbac_base
+from manila_tempest_tests import utils
+
+CONF = config.CONF
+
+
+class ShareRbacShareGroupTypesTests(rbac_base.ShareRbacBaseTests,
+                                    metaclass=abc.ABCMeta):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ShareRbacShareGroupTypesTests, cls).setup_clients()
+        cls.persona = getattr(cls, 'os_%s' % cls.credentials[0])
+        cls.client = cls.persona.share_v2.SharesV2Client()
+        cls.admin_shares_v2_client = (
+            cls.os_project_admin.share_v2.SharesV2Client())
+
+    @classmethod
+    def skip_checks(cls):
+        super(ShareRbacShareGroupTypesTests, cls).skip_checks()
+        if not CONF.share.run_share_group_tests:
+            raise cls.skipException('Share Group tests disabled.')
+
+        utils.check_skip_if_microversion_not_supported(
+            constants.MIN_SHARE_GROUP_MICROVERSION)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ShareRbacShareGroupTypesTests, cls).resource_setup()
+        cls.group_specs1 = {u'key1': u'value1'}
+        cls.group_specs2 = {u'key2': u'value2'}
+        cls.share_type = cls.create_share_type()
+        cls.share_group_type = cls.create_share_group_type(
+            cls.share_type['id'], group_specs=cls.group_specs1)
+        cls.private_share_group_type = cls.create_share_group_type(
+            cls.share_type['id'], is_public=False)
+
+    @abc.abstractmethod
+    def test_create_share_group_type(self):
+        pass
+
+    @abc.abstractmethod
+    def test_get_share_group_type(self):
+        pass
+
+    @abc.abstractmethod
+    def test_list_share_group_types(self):
+        pass
+
+    @abc.abstractmethod
+    def test_delete_share_group_type(self):
+        pass
+
+    @abc.abstractmethod
+    def test_create_share_group_type_extra_specs(self):
+        pass
+
+    @abc.abstractmethod
+    def test_update_share_group_type_extra_spec(self):
+        pass
+
+    @abc.abstractmethod
+    def test_delete_share_group_type_extra_spec(self):
+        pass
+
+    @abc.abstractmethod
+    def test_add_share_group_type_access(self):
+        pass
+
+    @abc.abstractmethod
+    def test_list_share_group_type_access(self):
+        pass
+
+    @abc.abstractmethod
+    def test_remove_share_group_type_access(self):
+        pass
+
+
+class ProjectAdminTests(ShareRbacShareGroupTypesTests, base.BaseSharesTest):
+
+    credentials = ['project_admin']
+
+    @decorators.idempotent_id('9ea9954a-ae09-4d02-a082-9a72b80009fc')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_create_share_group_type(self):
+        share_group_type = self.do_request(
+            'create_share_group_type', expected_status=200,
+            name='gt', share_types=self.share_type['id'])['share_group_type']
+        self.addCleanup(self.delete_resource, self.client,
+                        share_group_type_id=share_group_type['id'])
+
+    @decorators.idempotent_id('fcad2b86-ca43-42b0-82bd-37e6f760e4d2')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_get_share_group_type(self):
+        self.do_request(
+            'get_share_group_type', expected_status=200,
+            share_group_type_id=self.share_group_type['id'])
+
+    @decorators.idempotent_id('7871b1b5-610a-425c-9363-d0bcf2beff72')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_list_share_group_types(self):
+        share_group_type_list = self.do_request(
+            'list_share_group_types', expected_status=200)['share_group_types']
+        share_group_type_id_list = [
+            sgt['id'] for sgt in share_group_type_list
+        ]
+        self.assertIn(self.share_group_type['id'], share_group_type_id_list)
+
+    @decorators.idempotent_id('c23da121-8b1f-4443-80cc-11881745a1c3')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_delete_share_group_type(self):
+        share_group_type = self.create_share_group_type(
+            share_types=self.share_type['id'])
+        self.do_request(
+            'delete_share_group_type', expected_status=204,
+            share_group_type_id=share_group_type['id'])
+
+    @decorators.idempotent_id('80eb22cb-846a-4b51-a71d-ceef0b804901')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_create_share_group_type_extra_specs(self):
+        self.do_request(
+            'create_share_group_type_specs', expected_status=200,
+            share_group_type_id=self.share_group_type['id'],
+            group_specs_dict=self.group_specs2)
+        self.addCleanup(
+            self.admin_shares_v2_client.delete_share_group_type_spec,
+            self.share_group_type['id'], group_spec_key='key2')
+
+    @decorators.idempotent_id('fe29877d-2226-42ca-b492-4be0dacd6eaf')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_update_share_group_type_extra_spec(self):
+        self.do_request(
+            'update_share_group_type_spec', expected_status=200,
+            share_group_type_id=self.share_group_type['id'],
+            group_spec_key='key', group_spec_value='value_updated')
+
+    @decorators.idempotent_id('743c18dc-8c3a-4934-9ef8-8b342daffe7c')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_delete_share_group_type_extra_spec(self):
+        self.admin_shares_v2_client.create_share_group_type_specs(
+            self.share_group_type['id'], self.group_specs2)
+        self.do_request(
+            'delete_share_group_type_spec', expected_status=204,
+            share_group_type_id=self.share_group_type['id'],
+            group_spec_key='key2')
+
+    @decorators.idempotent_id('89876c46-1167-450d-8b98-746d97fff388')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_add_share_group_type_access(self):
+        self.do_request(
+            'add_access_to_share_group_type', expected_status=202,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+        self.addCleanup(
+            self.client.remove_access_from_share_group_type,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+
+    @decorators.idempotent_id('64a7be53-d1af-40c3-950b-743a2704ac97')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_list_share_group_type_access(self):
+        self.client.add_access_to_share_group_type(
+            self.private_share_group_type['id'], self.client.project_id)
+        self.addCleanup(
+            self.client.remove_access_from_share_group_type,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+        access_list = self.do_request(
+            'list_access_to_share_group_type', expected_status=200,
+            share_group_type_id=self.private_share_group_type['id']
+        )['share_group_type_access']
+
+        project_id_list = [
+            access['project_id'] for access in access_list
+        ]
+
+        self.assertIn(self.client.project_id, project_id_list)
+
+    @decorators.idempotent_id('fc67ba18-78e9-4c02-9b37-2bd49c8a4470')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_remove_share_group_type_access(self):
+        self.client.add_access_to_share_group_type(
+            self.private_share_group_type['id'], self.client.project_id)
+        self.do_request(
+            'remove_access_from_share_group_type', expected_status=202,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+
+
+class ProjectMemberTests(ShareRbacShareGroupTypesTests, base.BaseSharesTest):
+
+    credentials = ['project_member', 'project_admin']
+
+    @decorators.idempotent_id('f9e6f2fd-7c1a-4eee-817c-bf1988904515')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_create_share_group_type(self):
+        self.do_request(
+            'create_share_group_type', expected_status=lib_exc.Forbidden,
+            name='gt', share_types=self.share_type['id'])
+
+    @decorators.idempotent_id('8eaf4a99-9706-41c9-8b12-40856d0900f4')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_get_share_group_type(self):
+        self.do_request(
+            'get_share_group_type', expected_status=200,
+            share_group_type_id=self.share_group_type['id'])
+
+    @decorators.idempotent_id('d2dd61f4-c763-49f9-9c93-8b587879f554')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_list_share_group_types(self):
+        share_group_type_list = self.do_request(
+            'list_share_group_types', expected_status=200)['share_group_types']
+        share_group_type_id_list = [
+            sgt['id'] for sgt in share_group_type_list
+        ]
+        self.assertIn(self.share_group_type['id'], share_group_type_id_list)
+
+    @decorators.idempotent_id('8f45798f-717d-41b0-acba-a80dd647cddf')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_delete_share_group_type(self):
+        share_group_type = self.create_share_group_type(
+            share_types=self.share_type['id'])
+        self.do_request(
+            'delete_share_group_type', expected_status=lib_exc.Forbidden,
+            share_group_type_id=share_group_type['id'])
+
+    @decorators.idempotent_id('2fa2f953-f068-4c60-ab52-eeb1bd69a7a4')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_create_share_group_type_extra_specs(self):
+        self.do_request(
+            'create_share_group_type_specs', expected_status=lib_exc.Forbidden,
+            share_group_type_id=self.share_group_type['id'],
+            group_specs_dict=self.group_specs2)
+
+    @decorators.idempotent_id('30c73c94-b7bc-4e1f-8172-192335997879')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_update_share_group_type_extra_spec(self):
+        self.do_request(
+            'update_share_group_type_spec', expected_status=lib_exc.Forbidden,
+            share_group_type_id=self.share_group_type['id'],
+            group_spec_key='key', group_spec_value='value_updated')
+
+    @decorators.idempotent_id('95aa1fbf-3eaf-4d65-96b5-4554b0fb0937')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_delete_share_group_type_extra_spec(self):
+        self.admin_shares_v2_client.create_share_group_type_specs(
+            self.share_group_type['id'], self.group_specs2)
+        self.do_request(
+            'delete_share_group_type_spec', expected_status=lib_exc.Forbidden,
+            share_group_type_id=self.share_group_type['id'],
+            group_spec_key='key2')
+
+    @decorators.idempotent_id('85b69e26-9c67-45c4-80e0-2ce212977c2a')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_add_share_group_type_access(self):
+        self.do_request(
+            'add_access_to_share_group_type',
+            expected_status=lib_exc.Forbidden,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+
+    @decorators.idempotent_id('027314a9-6b14-4ae9-83f2-471e84ccaa01')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_list_share_group_type_access(self):
+        self.admin_shares_v2_client.add_access_to_share_group_type(
+            self.private_share_group_type['id'], self.client.project_id)
+        self.addCleanup(
+            self.admin_shares_v2_client.remove_access_from_share_group_type,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+        self.do_request(
+            'list_access_to_share_group_type',
+            expected_status=lib_exc.Forbidden,
+            share_group_type_id=self.private_share_group_type['id'])
+
+    @decorators.idempotent_id('d8518122-dabd-4d2d-8b6a-4eed975e19ee')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_remove_share_group_type_access(self):
+        self.admin_shares_v2_client.add_access_to_share_group_type(
+            self.private_share_group_type['id'], self.client.project_id)
+        self.addCleanup(
+            self.admin_shares_v2_client.remove_access_from_share_group_type,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+        self.do_request(
+            'remove_access_from_share_group_type',
+            expected_status=lib_exc.Forbidden,
+            share_group_type_id=self.private_share_group_type['id'],
+            project_id=self.client.project_id)
+
+
+class ProjectReaderTests(ProjectMemberTests):
+
+    credentials = ['project_reader', 'project_member', 'project_admin']
+
+    @decorators.idempotent_id('8c47bbe9-f3f1-419e-b00b-97c9c942a48a')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_create_share_group_type(self):
+        super(ProjectReaderTests, self).test_create_share_group_type()
+
+    @decorators.idempotent_id('fe3b28a3-6980-4782-8eaa-518bbd3913d1')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_get_share_group_type(self):
+        super(ProjectReaderTests, self).test_get_share_group_type()
+
+    @decorators.idempotent_id('47f92f0b-424e-4685-a742-8a4e00cc6901')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+    def test_list_share_group_types(self):
+        super(ProjectReaderTests, self).test_list_share_group_types()
+
+    @decorators.idempotent_id('e853fd60-8906-4e38-b0b4-ec5723696518')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_delete_share_group_type(self):
+        super(ProjectReaderTests, self).test_delete_share_group_type()
+
+    @decorators.idempotent_id('caa6d960-4f34-4dff-9cc0-9a0cde44c2ae')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_create_share_group_type_extra_specs(self):
+        super(
+            ProjectReaderTests,
+            self).test_create_share_group_type_extra_specs()
+
+    @decorators.idempotent_id('2782c329-2447-49f7-95e7-0c4c766cfda3')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_update_share_group_type_extra_spec(self):
+        super(
+            ProjectReaderTests, self).test_update_share_group_type_extra_spec()
+
+    @decorators.idempotent_id('003a0eee-0075-47b0-ba8a-8e57e958c1d3')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_delete_share_group_type_extra_spec(self):
+        super(
+            ProjectReaderTests, self).test_delete_share_group_type_extra_spec()
+
+    @decorators.idempotent_id('93bba264-104c-48af-af91-5a79ec3e695e')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_add_share_group_type_access(self):
+        super(ProjectReaderTests, self).test_add_share_group_type_access()
+
+    @decorators.idempotent_id('176b280c-7a46-43ae-8164-3bdd945d2dd4')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_list_share_group_type_access(self):
+        super(ProjectReaderTests, self).test_list_share_group_type_access()
+
+    @decorators.idempotent_id('00caa020-3805-4322-aac1-86d4552268a2')
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
+    def test_remove_share_group_type_access(self):
+        super(ProjectReaderTests, self).test_remove_share_group_type_access()
diff --git a/manila_tempest_tests/tests/scenario/manager.py b/manila_tempest_tests/tests/scenario/manager.py
index a73ab44..fe2833a 100644
--- a/manila_tempest_tests/tests/scenario/manager.py
+++ b/manila_tempest_tests/tests/scenario/manager.py
@@ -16,7 +16,6 @@
 
 from oslo_log import log
 from oslo_utils import uuidutils
-from tempest.common import image as common_image
 from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
@@ -45,24 +44,16 @@
             'name': name,
             'container_format': fmt,
             'disk_format': disk_format or fmt,
+            'visibility': 'private'
         }
-        if CONF.image_feature_enabled.api_v1:
-            params['is_public'] = 'False'
-            params['properties'] = properties
-            params = {'headers': common_image.image_meta_to_headers(**params)}
-        else:
-            params['visibility'] = 'private'
-            # Additional properties are flattened out in the v2 API.
-            params.update(properties)
+        # Additional properties are flattened out in the v2 API.
+        params.update(properties)
         body = self.image_client.create_image(**params)
         image = body['image'] if 'image' in body else body
         self.addCleanup(self.image_client.delete_image, image['id'])
         self.assertEqual("queued", image['status'])
         with open(path, 'rb') as image_file:
-            if CONF.image_feature_enabled.api_v1:
-                self.image_client.update_image(image['id'], data=image_file)
-            else:
-                self.image_client.store_image_file(image['id'], image_file)
+            self.image_client.store_image_file(image['id'], image_file)
         return image['id']
 
     def glance_image_create(self):
diff --git a/playbooks/manila-tempest-plugin-standalone/run.yaml b/playbooks/manila-tempest-plugin-standalone/run.yaml
index 8df9205..26ad69a 100644
--- a/playbooks/manila-tempest-plugin-standalone/run.yaml
+++ b/playbooks/manila-tempest-plugin-standalone/run.yaml
@@ -5,7 +5,6 @@
 - hosts: tempest
   roles:
     - setup-tempest-run-dir
-    - set-tempest-config
     - setup-tempest-data-dir
     - acl-devstack-files
     - run-tempest
diff --git a/roles/set-tempest-config/README.rst b/roles/set-tempest-config/README.rst
deleted file mode 100644
index 9402d3c..0000000
--- a/roles/set-tempest-config/README.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-set-tempest-config
-==================
-
-This is a workaround for the `merge_config_file <https://opendev
-.org/openstack/devstack/src/commit/76d7d7c90c3979c72404fddd31ee884c8bfdb1ec
-/inc/meta-config#L82>`_ routine that doesn't working correctly on jobs based on
-the "devstack-minimal" profile.
-
-**Role Variables**
-
-.. zuul:rolevar:: devstack_base_dir
-   :default: /opt/stack
-
-   The devstack base directory.
-
-.. zuul:rolevar:: devstack_local_conf_path
-   :default: "{{ devstack_base_dir }}/devstack/local.conf"
-
-   Where to find the local.conf file
diff --git a/roles/set-tempest-config/defaults/main.yml b/roles/set-tempest-config/defaults/main.yml
deleted file mode 100644
index 5cc7ca6..0000000
--- a/roles/set-tempest-config/defaults/main.yml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-devstack_base_dir: /opt/stack
-devstack_local_conf_path: "{{ devstack_base_dir }}/devstack/local.conf"
diff --git a/roles/set-tempest-config/tasks/main.yml b/roles/set-tempest-config/tasks/main.yml
deleted file mode 100644
index 3572ff5..0000000
--- a/roles/set-tempest-config/tasks/main.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- name: Install required pip packages
-  pip:
-    name: devstack-tools
-    state: "latest"
-    virtualenv: /var/tmp/venv
-
-- name: Copy tempest config
-  shell: >-
-    . /var/tmp/venv/bin/activate && \
-    dsconf extract {{ devstack_local_conf_path }} \
-      test-config \
-      '$TEMPEST_CONFIG' \
-      {{ devstack_base_dir }}/tempest/etc/tempest.conf
-  become: yes
diff --git a/setup.py b/setup.py
index 566d844..cd35c3c 100644
--- a/setup.py
+++ b/setup.py
@@ -13,17 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
 import setuptools
 
-# In python < 2.7.4, a lazy loading of package `pbr` will break
-# setuptools if some other modules registered functions in `atexit`.
-# solution from: http://bugs.python.org/issue15881#msg170215
-try:
-    import multiprocessing  # noqa
-except ImportError:
-    pass
-
 setuptools.setup(
     setup_requires=['pbr>=2.0.0'],
     pbr=True)
