diff --git a/neutron_tempest_plugin/api/admin/test_agent_availability_zone.py b/neutron_tempest_plugin/api/admin/test_agent_availability_zone.py
new file mode 100644
index 0000000..245715f
--- /dev/null
+++ b/neutron_tempest_plugin/api/admin/test_agent_availability_zone.py
@@ -0,0 +1,53 @@
+#    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 neutron_lib import constants
+from tempest.lib import decorators
+import testtools
+
+from neutron_tempest_plugin.api import base
+from neutron_tempest_plugin import config
+
+AZ_SUPPORTED_AGENTS = [constants.AGENT_TYPE_DHCP, constants.AGENT_TYPE_L3]
+CONF = config.CONF
+
+
+class AgentAvailabilityZoneTestCase(base.BaseAdminNetworkTest):
+
+    required_extensions = ['agent', 'availability_zone']
+
+    @classmethod
+    def resource_setup(cls):
+        super(AgentAvailabilityZoneTestCase, cls).resource_setup()
+        body = cls.admin_client.list_agents()
+        agents = body['agents']
+        agents_type = [agent.get('agent_type') for agent in agents]
+        for az_agent in AZ_SUPPORTED_AGENTS:
+            if az_agent in agents_type:
+                return
+        msg = 'availability_zone supported agent not found.'
+        raise cls.skipException(msg)
+
+    @decorators.idempotent_id('3ffa661e-cfcc-417d-8b63-1c5ec4a22e54')
+    @testtools.skipUnless(CONF.neutron_plugin_options.agent_availability_zone,
+                          "Need a single availability_zone assumption.")
+    def test_agents_availability_zone(self):
+        """
+        Test list agents availability_zone, only L3 and DHCP agent support
+        availability_zone, default availability_zone is "nova".
+        """
+        body = self.admin_client.list_agents()
+        agents = body['agents']
+        for agent in agents:
+            if agent.get('agent_type') in AZ_SUPPORTED_AGENTS:
+                self.assertEqual(
+                    CONF.neutron_plugin_options.agent_availability_zone,
+                    agent.get('availability_zone'))
diff --git a/neutron_tempest_plugin/api/admin/test_external_network_extension.py b/neutron_tempest_plugin/api/admin/test_external_network_extension.py
index cc1b2c2..b59d10e 100644
--- a/neutron_tempest_plugin/api/admin/test_external_network_extension.py
+++ b/neutron_tempest_plugin/api/admin/test_external_network_extension.py
@@ -30,7 +30,7 @@
         cls.client2 = cls.os_alt.network_client
 
     def _create_network(self, external=True):
-        post_body = {'name': data_utils.rand_name('network-')}
+        post_body = {'name': data_utils.rand_name('network')}
         if external:
             post_body['router:external'] = external
         body = self.admin_client.create_network(**post_body)
@@ -49,7 +49,7 @@
         networks_list = [n['id'] for n in body['networks']]
         self.assertIn(net['id'], networks_list)
         r = self.client2.create_router(
-            data_utils.rand_name('router-'),
+            data_utils.rand_name('router'),
             external_gateway_info={'network_id': net['id']})['router']
         self.addCleanup(self.admin_client.delete_router, r['id'])
 
@@ -92,7 +92,7 @@
             object_id=net_id, action='access_as_external',
             target_tenant='*')['rbac_policies'][0]
         r = self.client2.create_router(
-            data_utils.rand_name('router-'),
+            data_utils.rand_name('router'),
             external_gateway_info={'network_id': net_id})['router']
         self.addCleanup(self.admin_client.delete_router, r['id'])
         # changing wildcard to specific tenant should be okay since its the
@@ -139,7 +139,7 @@
             action='access_as_external',
             target_tenant=self.client2.tenant_id)
         r = self.client2.create_router(
-            data_utils.rand_name('router-'),
+            data_utils.rand_name('router'),
             external_gateway_info={'network_id': net['id']})['router']
         self.addCleanup(self.admin_client.delete_router, r['id'])
 
@@ -152,7 +152,7 @@
             action='access_as_external',
             target_tenant='*')['rbac_policy']
         r = self.client2.create_router(
-            data_utils.rand_name('router-'),
+            data_utils.rand_name('router'),
             external_gateway_info={'network_id': net['id']})['router']
         # delete should fail because the wildcard is required for the tenant's
         # access
@@ -181,7 +181,7 @@
         # there are no policies allowing it
         with testtools.ExpectedException(lib_exc.NotFound):
             self.client2.create_router(
-                data_utils.rand_name('router-'),
+                data_utils.rand_name('router'),
                 external_gateway_info={'network_id': net['id']})
 
     @decorators.idempotent_id('7041cec7-d8fe-4c78-9b04-b51b2fd49dc9')
diff --git a/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py b/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py
index b0c5d41..7601e7a 100644
--- a/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py
+++ b/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py
@@ -36,7 +36,7 @@
         cls.alt_client = cls.os_alt.network_client
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
-        cls.router = cls.create_router(data_utils.rand_name('router-'),
+        cls.router = cls.create_router(data_utils.rand_name('router'),
                                        external_network_id=cls.ext_net_id)
         cls.create_router_interface(cls.router['id'], cls.subnet['id'])
         cls.port = cls.create_port(cls.network)
@@ -47,12 +47,7 @@
         body = self.client.create_floatingip(
             floating_network_id=self.ext_net_id)
         floating_ip = body['floatingip']
-        test_project = data_utils.rand_name('test_project_')
-        test_description = data_utils.rand_name('desc_')
-        project = self.identity_admin_client.create_project(
-            name=test_project, description=test_description)['project']
-        project_id = project['id']
-        self.addCleanup(self.identity_admin_client.delete_project, project_id)
+        project_id = self.create_project()['id']
 
         port = self.admin_client.create_port(network_id=self.network['id'],
                                              project_id=project_id)
diff --git a/neutron_tempest_plugin/api/admin/test_networks.py b/neutron_tempest_plugin/api/admin/test_networks.py
index e57a7e8..bb7ac24 100644
--- a/neutron_tempest_plugin/api/admin/test_networks.py
+++ b/neutron_tempest_plugin/api/admin/test_networks.py
@@ -12,9 +12,9 @@
 import testtools
 
 from oslo_utils import uuidutils
+from tempest.common import utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin import config
@@ -23,7 +23,7 @@
 class NetworksTestAdmin(base.BaseAdminNetworkTest):
 
     @decorators.idempotent_id('d3c76044-d067-4cb0-ae47-8cdd875c7f67')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_admin_create_network_keystone_v3(self):
         project_id = self.client.tenant_id  # non-admin
 
@@ -41,7 +41,7 @@
         self.assertEqual(project_id, lookup_net['tenant_id'])
 
     @decorators.idempotent_id('8d21aaca-4364-4eb9-8b79-44b4fff6373b')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_admin_create_network_keystone_v3_and_tenant(self):
         project_id = self.client.tenant_id  # non-admin
 
@@ -59,7 +59,7 @@
         self.assertEqual(project_id, lookup_net['tenant_id'])
 
     @decorators.idempotent_id('08b92179-669d-45ee-8233-ef6611190809')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_admin_create_network_keystone_v3_and_other_tenant(self):
         project_id = self.client.tenant_id  # non-admin
         other_tenant = uuidutils.generate_uuid()
@@ -76,7 +76,7 @@
     @testtools.skipUnless("vxlan" in config.CONF.neutron_plugin_options.
                           available_type_drivers,
                           'VXLAN type_driver is not enabled')
-    @test.requires_ext(extension="provider", service="network")
+    @utils.requires_ext(extension="provider", service="network")
     def test_create_tenant_network_vxlan(self):
         network = self.admin_client.create_network(
             **{"provider:network_type": "vxlan"})['network']
diff --git a/neutron_tempest_plugin/api/admin/test_quotas.py b/neutron_tempest_plugin/api/admin/test_quotas.py
index 5c92be0..1acfc18 100644
--- a/neutron_tempest_plugin/api/admin/test_quotas.py
+++ b/neutron_tempest_plugin/api/admin/test_quotas.py
@@ -14,10 +14,9 @@
 #    under the License.
 
 import six
-from tempest.lib.common.utils import data_utils
+from tempest.common import utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin import config
@@ -33,17 +32,6 @@
     def resource_setup(cls):
         super(QuotasTestBase, cls).resource_setup()
 
-    def _create_tenant(self):
-        # Add a tenant to conduct the test
-        test_tenant = data_utils.rand_name('test_tenant_')
-        test_description = data_utils.rand_name('desc_')
-        project = self.identity_admin_client.create_project(
-            name=test_tenant,
-            description=test_description)['project']
-        self.addCleanup(
-            self.identity_admin_client.delete_project, project['id'])
-        return project
-
     def _setup_quotas(self, project_id, **new_quotas):
         # Change quotas for tenant
         quota_set = self.admin_client.update_quotas(project_id,
@@ -96,7 +84,7 @@
     @decorators.attr(type='gate')
     @decorators.idempotent_id('2390f766-836d-40ef-9aeb-e810d78207fb')
     def test_quotas(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'network': 0, 'security_group': 0}
 
         # Change quotas for tenant
@@ -127,9 +115,9 @@
 
     @decorators.idempotent_id('e974b5ba-090a-452c-a578-f9710151d9fc')
     @decorators.attr(type='gate')
-    @test.requires_ext(extension="quota_details", service="network")
+    @utils.requires_ext(extension="quota_details", service="network")
     def test_detail_quotas(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'network': {'used': 1, 'limit': 2, 'reserved': 0},
                       'port': {'used': 1, 'limit': 2, 'reserved': 0}}
 
diff --git a/neutron_tempest_plugin/api/admin/test_quotas_negative.py b/neutron_tempest_plugin/api/admin/test_quotas_negative.py
index 8960f5f..2267313 100644
--- a/neutron_tempest_plugin/api/admin/test_quotas_negative.py
+++ b/neutron_tempest_plugin/api/admin/test_quotas_negative.py
@@ -10,10 +10,10 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api.admin import test_quotas
 from neutron_tempest_plugin import config
@@ -26,7 +26,7 @@
     @decorators.attr(type='negative')
     @decorators.idempotent_id('952f9b24-9156-4bdc-90f3-682a3d4302f0')
     def test_create_network_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'network': 1}
         self._setup_quotas(tenant_id, **new_quotas)
 
@@ -40,7 +40,7 @@
     @decorators.attr(type='negative')
     @decorators.idempotent_id('0b7f99e3-9f77-45ce-9a89-b39a184de618')
     def test_create_subnet_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'subnet': 1}
         self._setup_quotas(tenant_id, **new_quotas)
 
@@ -62,7 +62,7 @@
     @decorators.attr(type='negative')
     @decorators.idempotent_id('fe20d9f9-346c-4a20-bbfa-d9ca390f4dc6')
     def test_create_port_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'port': 1}
         self._setup_quotas(tenant_id, **new_quotas)
 
@@ -88,13 +88,13 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('bb1e9c3c-7e6f-41f1-b579-63dbc655ecb7')
-    @test.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="router", service="network")
     def test_create_router_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'router': 1}
         self._setup_quotas(tenant_id, **new_quotas)
 
-        name = data_utils.rand_name('test_router_')
+        name = data_utils.rand_name('test_router')
         router_args = {'tenant_id': tenant_id}
         router = self.admin_client.create_router(
             name, True, **router_args)['router']
@@ -106,9 +106,9 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('5c924ff7-b7a9-474f-92a3-dbe0f976ec13')
-    @test.requires_ext(extension="security-group", service="network")
+    @utils.requires_ext(extension="security-group", service="network")
     def test_create_security_group_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         sg_args = {'tenant_id': tenant_id}
         # avoid a number that is made by default
         sg_list = self.admin_client.list_security_groups(
@@ -127,9 +127,9 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('b7143480-6118-4ed4-be38-1b6f15f30d05')
-    @test.requires_ext(extension="security-group", service="network")
+    @utils.requires_ext(extension="security-group", service="network")
     def test_create_security_group_rule_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         sg_args = {'tenant_id': tenant_id}
 
         sg = self.admin_client.create_security_group(
@@ -159,9 +159,9 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('d00fe5bb-9db8-4e1a-9c31-490f52897e6f')
-    @test.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="router", service="network")
     def test_create_floatingip_when_quotas_is_full(self):
-        tenant_id = self._create_tenant()['id']
+        tenant_id = self.create_project()['id']
         new_quotas = {'floatingip': 1}
         self._setup_quotas(tenant_id, **new_quotas)
 
diff --git a/neutron_tempest_plugin/api/admin/test_security_groups.py b/neutron_tempest_plugin/api/admin/test_security_groups.py
new file mode 100644
index 0000000..de7e7d2
--- /dev/null
+++ b/neutron_tempest_plugin/api/admin/test_security_groups.py
@@ -0,0 +1,43 @@
+# 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.lib import decorators
+
+from neutron_tempest_plugin.api import base_security_groups as base
+
+
+class SecGroupAdminTest(base.BaseSecGroupTest):
+    required_extensions = ['security-group']
+    credentials = ['primary', 'admin']
+
+    @classmethod
+    def setup_clients(cls):
+        super(SecGroupAdminTest, cls).setup_clients()
+        cls.admin_client = cls.os_admin.network_client
+        cls.identity_admin_client = cls.os_admin.projects_client
+
+    @decorators.idempotent_id('44f1e1c4-af10-4aa0-972f-87c1c8fa25cc')
+    def test_security_group_recreated_on_port_update(self):
+        network = self.create_network()
+        self.create_subnet(network)
+        port = self.create_port(network, security_groups=[])
+        for sg in self.client.list_security_groups()['security_groups']:
+            if sg['name'] == 'default':
+                self.admin_client.delete_security_group(sg['id'])
+        self.update_port(port, name='update')
+        names = [
+            sg['name']
+            for sg in self.client.list_security_groups()['security_groups']
+        ]
+        self.assertIn('default', names)
diff --git a/neutron_tempest_plugin/api/admin/test_shared_network_extension.py b/neutron_tempest_plugin/api/admin/test_shared_network_extension.py
index e2198bd..876bd32 100644
--- a/neutron_tempest_plugin/api/admin/test_shared_network_extension.py
+++ b/neutron_tempest_plugin/api/admin/test_shared_network_extension.py
@@ -15,10 +15,10 @@
 #    under the License.
 
 from oslo_utils import uuidutils
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 import testtools
 
 from neutron_tempest_plugin.api import base
@@ -186,7 +186,7 @@
 
     def _make_admin_net_and_subnet_shared_to_tenant_id(self, tenant_id):
         net = self.admin_client.create_network(
-            name=data_utils.rand_name('test-network-'))['network']
+            name=data_utils.rand_name('test-network'))['network']
         self.addCleanup(self.admin_client.delete_network, net['id'])
         subnet = self.create_subnet(net, client=self.admin_client)
         # network is shared to first unprivileged client by default
@@ -384,13 +384,13 @@
                 action='access_as_shared', target_tenant=self.client.tenant_id)
 
     @decorators.idempotent_id('c5f8f785-ce8d-4430-af7e-a236205862fb')
-    @test.requires_ext(extension="quotas", service="network")
+    @utils.requires_ext(extension="quotas", service="network")
     def test_rbac_policy_quota(self):
         quota = self.client.show_quotas(self.client.tenant_id)['quota']
         max_policies = quota['rbac_policy']
         self.assertGreater(max_policies, 0)
         net = self.client.create_network(
-            name=data_utils.rand_name('test-network-'))['network']
+            name=data_utils.rand_name('test-network'))['network']
         self.addCleanup(self.client.delete_network, net['id'])
         with testtools.ExpectedException(lib_exc.Conflict):
             for i in range(0, max_policies + 1):
@@ -426,7 +426,7 @@
                                        target_tenant=self.client2.tenant_id)
         self.client.delete_port(port['id'])
 
-    @test.requires_ext(extension="standard-attr-revisions", service="network")
+    @utils.requires_ext(extension="standard-attr-revisions", service="network")
     @decorators.idempotent_id('86c3529b-1231-40de-1234-89664291a4cb')
     def test_rbac_bumps_network_revision(self):
         resp = self._make_admin_net_and_subnet_shared_to_tenant_id(
diff --git a/neutron_tempest_plugin/api/admin/test_tag.py b/neutron_tempest_plugin/api/admin/test_tag.py
new file mode 100644
index 0000000..05db644
--- /dev/null
+++ b/neutron_tempest_plugin/api/admin/test_tag.py
@@ -0,0 +1,516 @@
+#    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 utils
+from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+
+from neutron_tempest_plugin.api import base
+from neutron_tempest_plugin import config
+
+
+class TagTestJSON(base.BaseAdminNetworkTest):
+
+    required_extensions = ['tag']
+
+    @classmethod
+    def resource_setup(cls):
+        super(TagTestJSON, cls).resource_setup()
+        cls.res_id = cls._create_resource()
+
+    def _get_and_compare_tags(self, tags):
+        res_body = self.client.get_tags(self.resource, self.res_id)
+        self.assertItemsEqual(tags, res_body['tags'])
+
+    def _test_tag_operations(self):
+        # create and get tags
+        tags = ['red', 'blue']
+        res_body = self.client.update_tags(self.resource, self.res_id, tags)
+        self.assertItemsEqual(tags, res_body['tags'])
+        self._get_and_compare_tags(tags)
+
+        # add a tag
+        self.client.update_tag(self.resource, self.res_id, 'green')
+        self._get_and_compare_tags(['red', 'blue', 'green'])
+
+        # update tag exist
+        self.client.update_tag(self.resource, self.res_id, 'red')
+        self._get_and_compare_tags(['red', 'blue', 'green'])
+
+        # add a tag with a dot
+        self.client.update_tag(self.resource, self.res_id, 'black.or.white')
+        self._get_and_compare_tags(['red', 'blue', 'green', 'black.or.white'])
+
+        # replace tags
+        tags = ['red', 'yellow', 'purple']
+        res_body = self.client.update_tags(self.resource, self.res_id, tags)
+        self.assertItemsEqual(tags, res_body['tags'])
+        self._get_and_compare_tags(tags)
+
+        # get tag
+        self.client.get_tag(self.resource, self.res_id, 'red')
+
+        # get tag not exist
+        self.assertRaises(lib_exc.NotFound, self.client.get_tag,
+                          self.resource, self.res_id, 'green')
+
+        # delete tag
+        self.client.delete_tag(self.resource, self.res_id, 'red')
+        self._get_and_compare_tags(['yellow', 'purple'])
+
+        # delete tag not exist
+        self.assertRaises(lib_exc.NotFound, self.client.delete_tag,
+                          self.resource, self.res_id, 'green')
+
+        # delete tags
+        self.client.delete_tags(self.resource, self.res_id)
+        self._get_and_compare_tags([])
+
+
+class TagNetworkTestJSON(TagTestJSON):
+    resource = 'networks'
+
+    @classmethod
+    def _create_resource(cls):
+        network = cls.create_network()
+        return network['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('5621062d-fbfb-4437-9d69-138c78ea4188')
+    def test_network_tags(self):
+        self._test_tag_operations()
+
+
+class TagSubnetTestJSON(TagTestJSON):
+    resource = 'subnets'
+
+    @classmethod
+    def _create_resource(cls):
+        network = cls.create_network()
+        subnet = cls.create_subnet(network)
+        return subnet['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('2805aabf-a94c-4e70-a0b2-9814f06beb03')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_subnet_tags(self):
+        self._test_tag_operations()
+
+
+class TagPortTestJSON(TagTestJSON):
+    resource = 'ports'
+
+    @classmethod
+    def _create_resource(cls):
+        network = cls.create_network()
+        port = cls.create_port(network)
+        return port['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('c7c44f2c-edb0-4ebd-a386-d37cec155c34')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_port_tags(self):
+        self._test_tag_operations()
+
+
+class TagSubnetPoolTestJSON(TagTestJSON):
+    resource = 'subnetpools'
+
+    @classmethod
+    @utils.requires_ext(extension="subnet_allocation", service="network")
+    def _create_resource(cls):
+        subnetpool = cls.create_subnetpool('subnetpool', default_prefixlen=24,
+                                           prefixes=['10.0.0.0/8'])
+        return subnetpool['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('bdc1c24b-c0b5-4835-953c-8f67dc11edfe')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_subnetpool_tags(self):
+        self._test_tag_operations()
+
+
+class TagRouterTestJSON(TagTestJSON):
+    resource = 'routers'
+
+    @classmethod
+    @utils.requires_ext(extension="router", service="network")
+    def _create_resource(cls):
+        router = cls.create_router(router_name='test')
+        return router['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('b898ff92-dc33-4232-8ab9-2c6158c80d28')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_router_tags(self):
+        self._test_tag_operations()
+
+
+class TagSecGroupTestJSON(TagTestJSON):
+    resource = 'security-groups'
+
+    @classmethod
+    @utils.requires_ext(extension="security-group", service="network")
+    def _create_resource(cls):
+        sec_group = cls.create_security_group(name='test')
+        return sec_group['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('0f1a78eb-c5be-42cf-919d-2ce3621a51c2')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_security_group_tags(self):
+        self._test_tag_operations()
+
+
+class TagFloatingIpTestJSON(TagTestJSON):
+    resource = 'floatingips'
+
+    @classmethod
+    @utils.requires_ext(extension="router", service="network")
+    def _create_resource(cls):
+        cls.ext_net_id = config.CONF.network.public_network_id
+        floatingip = cls.create_floatingip(cls.ext_net_id)
+        return floatingip['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('53f6c2bf-e272-4e9e-b9a9-b165eb7be807')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_floatingip_tags(self):
+        self._test_tag_operations()
+
+
+class TagQosPolicyTestJSON(TagTestJSON):
+    resource = 'policies'
+
+    @classmethod
+    @utils.requires_ext(extension="qos", service="network")
+    def _create_resource(cls):
+        qos_policy = cls.create_qos_policy(name='test-policy', shared=True)
+        return qos_policy['id']
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('e9bac15e-c8bc-4317-8295-4bf1d8d522b8')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_qos_policy_tags(self):
+        self._test_tag_operations()
+
+
+class TagTrunkTestJSON(TagTestJSON):
+    resource = 'trunks'
+
+    @classmethod
+    @utils.requires_ext(extension="trunk", service="network")
+    def _create_resource(cls):
+        network = cls.create_network()
+        parent_port = cls.create_port(network)
+        trunk = cls.client.create_trunk(parent_port['id'], None)
+        return trunk['trunk']['id']
+
+    @classmethod
+    def resource_cleanup(cls):
+        cls.client.delete_trunk(cls.res_id)
+        super(TagTrunkTestJSON, cls).resource_cleanup()
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('4c63708b-c4c3-407c-8101-7a9593882f5f')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_trunk_tags(self):
+        self._test_tag_operations()
+
+
+class TagFilterTestJSON(base.BaseAdminNetworkTest):
+    credentials = ['primary', 'alt', 'admin']
+    required_extensions = ['tag']
+
+    @classmethod
+    def resource_setup(cls):
+        super(TagFilterTestJSON, cls).resource_setup()
+
+        cls.res_ids = []
+        for i in range(5):
+            cls.res_ids.append(cls._create_resource())
+
+        cls.client.update_tags(cls.resource, cls.res_ids[0], ['red'])
+        cls.client.update_tags(cls.resource, cls.res_ids[1], ['red', 'blue'])
+        cls.client.update_tags(cls.resource, cls.res_ids[2],
+                               ['red', 'blue', 'green'])
+        cls.client.update_tags(cls.resource, cls.res_ids[3], ['green'])
+        # 5th resource: no tags
+
+    @classmethod
+    def setup_clients(cls):
+        super(TagFilterTestJSON, cls).setup_clients()
+        cls.client = cls.os_alt.network_client
+
+    def _assertEqualResources(self, expected, res):
+        expected = [self.res_ids[i] for i in expected]
+        actual = [n['id'] for n in res if n['id'] in self.res_ids]
+        self.assertEqual(set(expected), set(actual))
+
+    def _test_filter_tags(self):
+        # tags single
+        filters = {'tags': 'red'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([0, 1, 2], res)
+
+        # tags multi
+        filters = {'tags': 'red,blue'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([1, 2], res)
+
+        # tags-any single
+        filters = {'tags-any': 'blue'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([1, 2], res)
+
+        # tags-any multi
+        filters = {'tags-any': 'red,blue'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([0, 1, 2], res)
+
+        # not-tags single
+        filters = {'not-tags': 'red'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([3, 4], res)
+
+        # not-tags multi
+        filters = {'not-tags': 'red,blue'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([0, 3, 4], res)
+
+        # not-tags-any single
+        filters = {'not-tags-any': 'blue'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([0, 3, 4], res)
+
+        # not-tags-any multi
+        filters = {'not-tags-any': 'red,blue'}
+        res = self._list_resource(filters)
+        self._assertEqualResources([3, 4], res)
+
+
+class TagFilterNetworkTestJSON(TagFilterTestJSON):
+    resource = 'networks'
+
+    @classmethod
+    def _create_resource(cls):
+        res = cls.create_network()
+        return res['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_networks(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('a66b5cca-7db2-40f5-a33d-8ac9f864e53e')
+    def test_filter_network_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterSubnetTestJSON(TagFilterTestJSON):
+    resource = 'subnets'
+
+    @classmethod
+    def _create_resource(cls):
+        network = cls.create_network()
+        res = cls.create_subnet(network)
+        return res['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_subnets(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('dd8f9ba7-bcf6-496f-bead-714bd3daac10')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_filter_subnet_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterPortTestJSON(TagFilterTestJSON):
+    resource = 'ports'
+
+    @classmethod
+    def _create_resource(cls):
+        network = cls.create_network()
+        res = cls.create_port(network)
+        return res['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_ports(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('09c036b8-c8d0-4bee-b776-7f4601512898')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_filter_port_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterSubnetpoolTestJSON(TagFilterTestJSON):
+    resource = 'subnetpools'
+
+    @classmethod
+    @utils.requires_ext(extension="subnet_allocation", service="network")
+    def _create_resource(cls):
+        res = cls.create_subnetpool('subnetpool', default_prefixlen=24,
+                                    prefixes=['10.0.0.0/8'])
+        return res['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_subnetpools(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('16ae7ad2-55c2-4821-9195-bfd04ab245b7')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_filter_subnetpool_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterRouterTestJSON(TagFilterTestJSON):
+    resource = 'routers'
+
+    @classmethod
+    @utils.requires_ext(extension="router", service="network")
+    def _create_resource(cls):
+        res = cls.create_router(router_name='test')
+        return res['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_routers(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('cdd3f3ea-073d-4435-a6cb-826a4064193d')
+    @utils.requires_ext(extension="tag-ext", service="network")
+    def test_filter_router_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterSecGroupTestJSON(TagFilterTestJSON):
+    resource = 'security-groups'
+
+    @classmethod
+    @utils.requires_ext(extension="security-group", service="network")
+    def _create_resource(cls):
+        sec_group = cls.create_security_group(name='test')
+        return sec_group['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_security_groups(**filters)
+        resource_key = self.resource.replace('-', '_')
+        return res[resource_key]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('d4d1d681-0116-4800-9725-16cb88f8171a')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_filter_security_group_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterFloatingIpTestJSON(TagFilterTestJSON):
+    resource = 'floatingips'
+
+    @classmethod
+    @utils.requires_ext(extension="router", service="network")
+    def _create_resource(cls):
+        cls.ext_net_id = config.CONF.network.public_network_id
+        floatingip = cls.create_floatingip(cls.ext_net_id)
+        return floatingip['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_floatingips(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('01f00afc-dbec-432a-bfee-2a1f0510e7a8')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_filter_floatingip_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterQosPolicyTestJSON(TagFilterTestJSON):
+    resource = 'policies'
+
+    @classmethod
+    @utils.requires_ext(extension="qos", service="network")
+    def _create_resource(cls):
+        qos_policy = cls.create_qos_policy(name='test-policy', shared=True)
+        return qos_policy['id']
+
+    def _list_resource(self, filters):
+        res = self.client.list_qos_policies(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('c2f9a6ae-2529-4cb9-a44b-b16f8ba27832')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_filter_qos_policy_tags(self):
+        self._test_filter_tags()
+
+
+class TagFilterTrunkTestJSON(TagFilterTestJSON):
+    resource = 'trunks'
+
+    @classmethod
+    @utils.requires_ext(extension="trunk", service="network")
+    def _create_resource(cls):
+        network = cls.create_network()
+        parent_port = cls.create_port(network)
+        trunk = cls.client.create_trunk(parent_port['id'], None)
+        return trunk['trunk']['id']
+
+    @classmethod
+    def resource_cleanup(cls):
+        for res_id in cls.res_ids:
+            cls.client.delete_trunk(res_id)
+        super(TagFilterTrunkTestJSON, cls).resource_cleanup()
+
+    def _list_resource(self, filters):
+        res = self.client.list_trunks(**filters)
+        return res[self.resource]
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('3fb3ca3a-8e3a-4565-ba73-16413d445e25')
+    @utils.requires_ext(extension="standard-attr-tag", service="network")
+    def test_filter_trunk_tags(self):
+        self._test_filter_tags()
+
+
+class UpdateTagsTest(base.BaseAdminNetworkTest):
+
+    required_extensions = ['tag']
+
+    def _get_and_compare_tags(self, tags, res_id):
+        # nothing specific about networks here, just a resource that is
+        # available in all setups
+        res_body = self.client.get_tags('networks', res_id)
+        self.assertItemsEqual(tags, res_body['tags'])
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('74c56fb1-a3b1-4a62-a8d2-d04dca6bd4cd')
+    def test_update_tags_affects_only_updated_resource(self):
+        res1 = self.create_network()
+        res2 = self.create_network()
+
+        self.client.update_tags('networks', res1['id'], ['red', 'blue'])
+        self._get_and_compare_tags(['red', 'blue'], res1['id'])
+
+        self.client.update_tags('networks', res2['id'], ['red'])
+        self._get_and_compare_tags(['red'], res2['id'])
+
+        self.client.update_tags('networks', res2['id'], [])
+        self._get_and_compare_tags([], res2['id'])
+
+        # check that updates on res2 hasn't dropped tags from res1
+        self._get_and_compare_tags(['red', 'blue'], res1['id'])
diff --git a/neutron_tempest_plugin/api/base.py b/neutron_tempest_plugin/api/base.py
index b122ce8..8db5108 100644
--- a/neutron_tempest_plugin/api/base.py
+++ b/neutron_tempest_plugin/api/base.py
@@ -17,6 +17,8 @@
 import math
 
 import netaddr
+from neutron_lib import constants as const
+from tempest.common import utils as tutils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import exceptions as lib_exc
 from tempest import test
@@ -77,7 +79,7 @@
         if cls._ip_version == 6 and not CONF.network_feature_enabled.ipv6:
             raise cls.skipException("IPv6 Tests are disabled.")
         for req_ext in getattr(cls, 'required_extensions', []):
-            if not test.is_extension_enabled(req_ext, 'network'):
+            if not tutils.is_extension_enabled(req_ext, 'network'):
                 msg = "%s extension not enabled." % req_ext
                 raise cls.skipException(msg)
 
@@ -115,6 +117,7 @@
         cls.subnetpools = []
         cls.admin_subnetpools = []
         cls.security_groups = []
+        cls.projects = []
 
     @classmethod
     def resource_cleanup(cls):
@@ -191,6 +194,11 @@
                     cls.admin_client.delete_address_scope,
                     address_scope['id'])
 
+            for project in cls.projects:
+                cls._try_delete_resource(
+                    cls.identity_admin_client.delete_project,
+                    project['id'])
+
             # Clean up QoS rules
             for qos_rule in cls.qos_rules:
                 cls._try_delete_resource(cls.admin_client.delete_qos_rule,
@@ -395,7 +403,7 @@
     @classmethod
     def create_qos_bandwidth_limit_rule(cls, policy_id, max_kbps,
                                         max_burst_kbps,
-                                        direction=constants.EGRESS_DIRECTION):
+                                        direction=const.EGRESS_DIRECTION):
         """Wrapper utility that returns a test QoS bandwidth limit rule."""
         body = cls.admin_client.create_bandwidth_limit_rule(
             policy_id, max_kbps, max_burst_kbps, direction)
@@ -406,7 +414,8 @@
     @classmethod
     def delete_router(cls, router):
         body = cls.client.list_router_interfaces(router['id'])
-        interfaces = body['ports']
+        interfaces = [port for port in body['ports']
+                      if port['device_owner'] in const.ROUTER_INTERFACE_OWNERS]
         for i in interfaces:
             try:
                 cls.client.remove_router_interface_with_subnet_id(
@@ -435,6 +444,22 @@
             cls.subnetpools.append(body['subnetpool'])
         return body['subnetpool']
 
+    @classmethod
+    def create_project(cls, name=None, description=None):
+        test_project = name or data_utils.rand_name('test_project_')
+        test_description = description or data_utils.rand_name('desc_')
+        project = cls.identity_admin_client.create_project(
+            name=test_project,
+            description=test_description)['project']
+        cls.projects.append(project)
+        return project
+
+    @classmethod
+    def create_security_group(cls, name, **kwargs):
+        body = cls.client.create_security_group(name=name, **kwargs)
+        cls.security_groups.append(body['security_group'])
+        return body['security_group']
+
 
 class BaseAdminNetworkTest(BaseNetworkTest):
 
@@ -542,7 +567,7 @@
 def _require_sorting(f):
     @functools.wraps(f)
     def inner(self, *args, **kwargs):
-        if not test.is_extension_enabled("sorting", "network"):
+        if not tutils.is_extension_enabled("sorting", "network"):
             self.skipTest('Sorting feature is required')
         return f(self, *args, **kwargs)
     return inner
@@ -551,7 +576,7 @@
 def _require_pagination(f):
     @functools.wraps(f)
     def inner(self, *args, **kwargs):
-        if not test.is_extension_enabled("pagination", "network"):
+        if not tutils.is_extension_enabled("pagination", "network"):
             self.skipTest('Pagination feature is required')
         return f(self, *args, **kwargs)
     return inner
diff --git a/neutron_tempest_plugin/api/base_security_groups.py b/neutron_tempest_plugin/api/base_security_groups.py
index e2736f3..cda18b8 100644
--- a/neutron_tempest_plugin/api/base_security_groups.py
+++ b/neutron_tempest_plugin/api/base_security_groups.py
@@ -13,11 +13,25 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from neutron_lib import constants
 from tempest.lib.common.utils import data_utils
 
 from neutron_tempest_plugin.api import base
 
 
+V4_PROTOCOL_NAMES = set(key for key in constants.IP_PROTOCOL_MAP if
+                        'v6' not in key)
+V4_PROTOCOL_INTS = set(v for k, v in constants.IP_PROTOCOL_MAP.items()
+                       if 'v6' not in k)
+V6_PROTOCOL_LEGACY = set([constants.PROTO_NAME_IPV6_ICMP_LEGACY])
+V6_PROTOCOL_NAMES = (
+    set(key for key in constants.IP_PROTOCOL_MAP if 'v6' in key) -
+    V6_PROTOCOL_LEGACY
+)
+V6_PROTOCOL_INTS = set(v for k, v in constants.IP_PROTOCOL_MAP.items() if
+                       'v6' in k)
+
+
 class BaseSecGroupTest(base.BaseNetworkTest):
 
     def _create_security_group(self, **kwargs):
@@ -39,3 +53,41 @@
         for secgroup in list_body['security_groups']:
             secgroup_list.append(secgroup['id'])
         self.assertNotIn(secgroup_id, secgroup_list)
+
+    def _create_security_group_rule(self, **kwargs):
+        rule_create_body = self.client.create_security_group_rule(**kwargs)
+        # List rules and verify created rule is in response
+        rule_list_body = (
+            self.client.list_security_group_rules())
+        rule_list = [rule['id']
+                     for rule in rule_list_body['security_group_rules']]
+        self.assertIn(rule_create_body['security_group_rule']['id'],
+                      rule_list)
+        self.addCleanup(self._delete_security_group_rule,
+                        rule_create_body['security_group_rule']['id'])
+        return rule_create_body
+
+    def _show_security_group_rule(self, **kwargs):
+        show_rule_body = self.client.show_security_group_rule(kwargs['id'])
+        for key, value in kwargs.items():
+            self.assertEqual(value,
+                             show_rule_body['security_group_rule'][key],
+                             "%s does not match." % key)
+
+    def _delete_security_group_rule(self, secgroup_rule_id):
+        self.client.delete_security_group_rule(secgroup_rule_id)
+        rule_list_body = self.client.list_security_group_rules()
+        rule_list = [rule['id']
+                     for rule in rule_list_body['security_group_rules']]
+        self.assertNotIn(secgroup_rule_id, rule_list)
+
+    def _test_create_show_delete_security_group_rule(self, **kwargs):
+        # The security group rule is deleted by the cleanup call in
+        # _create_security_group_rule.
+        rule_create_body = (
+            self._create_security_group_rule(**kwargs)['security_group_rule'])
+        self._show_security_group_rule(
+            id=rule_create_body['id'],
+            protocol=rule_create_body['protocol'],
+            direction=rule_create_body['direction'],
+            ethertype=rule_create_body['ethertype'])
diff --git a/neutron_tempest_plugin/api/test_address_scopes.py b/neutron_tempest_plugin/api/test_address_scopes.py
index e9575b4..6cf0885 100644
--- a/neutron_tempest_plugin/api/test_address_scopes.py
+++ b/neutron_tempest_plugin/api/test_address_scopes.py
@@ -12,10 +12,10 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 
@@ -78,7 +78,7 @@
         self.assertFalse(returned_address_scope['shared'])
 
     @decorators.idempotent_id('bbd57364-6d57-48e4-b0f1-8b9a998f5e06')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_show_address_scope_project_id(self):
         address_scope = self._create_address_scope(ip_version=4)
         body = self.client.show_address_scope(address_scope['id'])
diff --git a/neutron_tempest_plugin/api/test_dhcp_ipv6.py b/neutron_tempest_plugin/api/test_dhcp_ipv6.py
index f408c97..3a7db96 100644
--- a/neutron_tempest_plugin/api/test_dhcp_ipv6.py
+++ b/neutron_tempest_plugin/api/test_dhcp_ipv6.py
@@ -33,6 +33,7 @@
 
     @classmethod
     def skip_checks(cls):
+        super(NetworksTestDHCPv6, cls).skip_checks()
         msg = None
         if not CONF.network_feature_enabled.ipv6:
             msg = "IPv6 is not enabled"
diff --git a/neutron_tempest_plugin/api/test_extension_driver_port_security.py b/neutron_tempest_plugin/api/test_extension_driver_port_security.py
index 7a8cf0e..8a8c4f2 100644
--- a/neutron_tempest_plugin/api/test_extension_driver_port_security.py
+++ b/neutron_tempest_plugin/api/test_extension_driver_port_security.py
@@ -14,9 +14,9 @@
 #    under the License.
 
 import ddt
+from tempest.common import utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin.api import base_security_groups as base_security
@@ -30,7 +30,7 @@
                   base.BaseNetworkTest):
 
     @decorators.idempotent_id('7c338ddf-e64e-4118-bd33-e49a1f2f1495')
-    @test.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='port-security', service='network')
     def test_port_sec_default_value(self):
         # Default port-sec value is True, and the attr of the port will inherit
         # from the port-sec of the network when it not be specified in API
@@ -41,7 +41,7 @@
         self.assertTrue(port['port_security_enabled'])
 
     @decorators.idempotent_id('e60eafd2-31de-4c38-8106-55447d033b57')
-    @test.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='port-security', service='network')
     @ddt.unpack
     @ddt.data({'port_sec_net': False, 'port_sec_port': True, 'expected': True},
               {'port_sec_net': True, 'port_sec_port': False,
@@ -55,7 +55,7 @@
         self.assertEqual(port['port_security_enabled'], expected)
 
     @decorators.idempotent_id('fe7c27b9-f320-4daf-b977-b1547c43daf6')
-    @test.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='port-security', service='network')
     def test_create_port_sec_with_security_group(self):
         network = self.create_network(port_security_enabled=True)
         self.create_subnet(network)
@@ -71,7 +71,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('ff11226c-a5ff-4ad4-8480-0840e36e47a9')
-    @test.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='port-security', service='network')
     def test_port_sec_update_port_failed(self):
         network = self.create_network()
         self.create_subnet(network)
@@ -98,7 +98,7 @@
         self.update_port(port, security_groups=[])
 
     @decorators.idempotent_id('05642059-1bfc-4581-9bc9-aaa5db08dd60')
-    @test.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='port-security', service='network')
     def test_port_sec_update_pass(self):
         network = self.create_network()
         self.create_subnet(network)
@@ -122,7 +122,7 @@
         self.assertFalse(port['port_security_enabled'])
 
     @decorators.idempotent_id('2df6114b-b8c3-48a1-96e8-47f08159d35c')
-    @test.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='port-security', service='network')
     def test_delete_with_port_sec(self):
         network = self.create_network(port_security_enabled=True)
         port = self.create_port(network=network,
@@ -135,9 +135,9 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('ed93e453-3f8d-495e-8e7e-b0e268c2ebd9')
-    @test.requires_ext(extension='port-security', service='network')
-    @test.requires_ext(extension='allowed-address-pairs', service='network')
-    def test_allow_address_pairs(self):
+    @utils.requires_ext(extension='port-security', service='network')
+    @utils.requires_ext(extension='allowed-address-pairs', service='network')
+    def test_allowed_address_pairs(self):
         network = self.create_network()
         self.create_subnet(network)
         port = self.create_port(network=network, port_security_enabled=False)
diff --git a/neutron_tempest_plugin/api/test_extensions.py b/neutron_tempest_plugin/api/test_extensions.py
index 4659ba9..1462ae1 100644
--- a/neutron_tempest_plugin/api/test_extensions.py
+++ b/neutron_tempest_plugin/api/test_extensions.py
@@ -10,8 +10,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib import decorators
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 
@@ -22,7 +22,7 @@
         body = self.client.list_extensions()
         extensions = {ext_['alias'] for ext_ in body['extensions']}
         self.assertNotEmpty(extensions, "Extension list returned is empty")
-        ext_enabled = test.is_extension_enabled(ext, "network")
+        ext_enabled = utils.is_extension_enabled(ext, "network")
         if ext_enabled:
             self.assertIn(ext, extensions)
         else:
diff --git a/neutron_tempest_plugin/api/test_floating_ips.py b/neutron_tempest_plugin/api/test_floating_ips.py
index 3b283cb..19d8e2a 100644
--- a/neutron_tempest_plugin/api/test_floating_ips.py
+++ b/neutron_tempest_plugin/api/test_floating_ips.py
@@ -13,9 +13,9 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin import config
@@ -35,7 +35,7 @@
         # Create network, subnet, router and add interface
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
-        cls.router = cls.create_router(data_utils.rand_name('router-'),
+        cls.router = cls.create_router(data_utils.rand_name('router'),
                                        external_network_id=cls.ext_net_id)
         cls.create_router_interface(cls.router['id'], cls.subnet['id'])
         cls.port = list()
@@ -58,7 +58,7 @@
         self.assertFalse(body['port_id'])
 
     @decorators.idempotent_id('c72c1c0c-2193-4aca-eeee-b1442641ffff')
-    @test.requires_ext(extension="standard-attr-description",
+    @utils.requires_ext(extension="standard-attr-description",
                        service="network")
     def test_create_update_floatingip_description(self):
         body = self.client.create_floatingip(
@@ -80,7 +80,7 @@
         self.assertEqual('d2', body['floatingip']['description'])
 
     @decorators.idempotent_id('fd7161e1-2167-4686-a6ff-0f3df08001bb')
-    @test.requires_ext(extension="standard-attr-description",
+    @utils.requires_ext(extension="standard-attr-description",
                        service="network")
     def test_floatingip_update_extra_attributes_port_id_not_changed(self):
         port_id = self.ports[1]['id']
diff --git a/neutron_tempest_plugin/api/test_metering_extensions.py b/neutron_tempest_plugin/api/test_metering_extensions.py
index 186b024..745a8d0 100644
--- a/neutron_tempest_plugin/api/test_metering_extensions.py
+++ b/neutron_tempest_plugin/api/test_metering_extensions.py
@@ -12,6 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+from neutron_lib.api.definitions import metering as metering_apidef
 from neutron_lib.db import constants as db_const
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
@@ -31,7 +32,7 @@
         List, Show, Create, Delete Metering labels rules
     """
 
-    required_extensions = ['metering']
+    required_extensions = [metering_apidef.ALIAS]
 
     @classmethod
     def resource_setup(cls):
@@ -72,7 +73,7 @@
     @decorators.idempotent_id('ec8e15ff-95d0-433b-b8a6-b466bddb1e50')
     def test_create_delete_metering_label_with_filters(self):
         # Creates a label
-        name = data_utils.rand_name('metering-label-')
+        name = data_utils.rand_name('metering-label')
         description = "label created by tempest"
         body = self.admin_client.create_metering_label(name=name,
                                                        description=description)
diff --git a/neutron_tempest_plugin/api/test_metering_negative.py b/neutron_tempest_plugin/api/test_metering_negative.py
index 175f314..a02e2b3 100644
--- a/neutron_tempest_plugin/api/test_metering_negative.py
+++ b/neutron_tempest_plugin/api/test_metering_negative.py
@@ -12,6 +12,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from neutron_lib.api.definitions import metering as metering_apidef
 from neutron_lib.db import constants as db_const
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
@@ -23,7 +24,7 @@
 
 class MeteringNegativeTestJSON(base.BaseAdminNetworkTest):
 
-    required_extensions = ['metering']
+    required_extensions = [metering_apidef.ALIAS]
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('8b3f7c84-9d37-4771-8681-bfd2c07f3c2d')
diff --git a/neutron_tempest_plugin/api/test_network_ip_availability.py b/neutron_tempest_plugin/api/test_network_ip_availability.py
index fe83a77..0b8ac23 100644
--- a/neutron_tempest_plugin/api/test_network_ip_availability.py
+++ b/neutron_tempest_plugin/api/test_network_ip_availability.py
@@ -15,11 +15,11 @@
 
 import netaddr
 
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin import config
@@ -50,7 +50,7 @@
     """
 
     @classmethod
-    @test.requires_ext(extension="network-ip-availability", service="network")
+    @utils.requires_ext(extension="network-ip-availability", service="network")
     def skip_checks(cls):
         super(NetworksIpAvailabilityTest, cls).skip_checks()
 
@@ -111,7 +111,7 @@
 
     @decorators.idempotent_id('0f33cc8c-1bf6-47d1-9ce1-010618240599')
     def test_admin_network_availability_before_subnet(self):
-        net_name = data_utils.rand_name('network-')
+        net_name = data_utils.rand_name('network')
         network = self.create_network(network_name=net_name)
         self.addCleanup(self.client.delete_network, network['id'])
         net_availability = self.admin_client.list_network_ip_availabilities()
@@ -119,7 +119,7 @@
 
     @decorators.idempotent_id('3aecd3b2-16ed-4b87-a54a-91d7b3c2986b')
     def test_net_ip_availability_after_subnet_and_ports(self):
-        net_name = data_utils.rand_name('network-')
+        net_name = data_utils.rand_name('network')
         network = self.create_network(network_name=net_name)
         self.addCleanup(self.client.delete_network, network['id'])
         subnet, prefix = self._create_subnet(network, self._ip_version)
@@ -138,7 +138,7 @@
 
     @decorators.idempotent_id('9f11254d-757b-492e-b14b-f52144e4ee7b')
     def test_net_ip_availability_after_port_delete(self):
-        net_name = data_utils.rand_name('network-')
+        net_name = data_utils.rand_name('network')
         network = self.create_network(network_name=net_name)
         self.addCleanup(self.client.delete_network, network['id'])
         subnet, prefix = self._create_subnet(network, self._ip_version)
diff --git a/neutron_tempest_plugin/api/test_networks.py b/neutron_tempest_plugin/api/test_networks.py
index b991993..19f4fcb 100644
--- a/neutron_tempest_plugin/api/test_networks.py
+++ b/neutron_tempest_plugin/api/test_networks.py
@@ -13,8 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib import decorators
-from tempest import test
 import testtools
 
 from neutron_tempest_plugin.api import base
@@ -45,17 +45,17 @@
         body = self.client.show_network(self.network['id'])
         network = body['network']
         fields = ['id', 'name']
-        if test.is_extension_enabled('net-mtu', 'network'):
+        if utils.is_extension_enabled('net-mtu', 'network'):
             fields.append('mtu')
         for key in fields:
             self.assertEqual(network[key], self.network[key])
         project_id = self.client.tenant_id
         self.assertEqual(project_id, network['tenant_id'])
-        if test.is_extension_enabled('project-id', 'network'):
+        if utils.is_extension_enabled('project-id', 'network'):
             self.assertEqual(project_id, network['project_id'])
 
     @decorators.idempotent_id('26f2b7a5-2cd1-4f3a-b11f-ad259b099b11')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_show_network_fields_keystone_v3(self):
 
         def _check_show_network_fields(fields, expect_project_id,
@@ -74,7 +74,7 @@
         _check_show_network_fields(['project_id', 'tenant_id'], True, True)
 
     @decorators.idempotent_id('0cc0552f-afaf-4231-b7a7-c2a1774616da')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_create_network_keystone_v3(self):
         project_id = self.client.tenant_id
 
@@ -95,7 +95,7 @@
         self.assertEqual(project_id, new_net['tenant_id'])
 
     @decorators.idempotent_id('94e2a44c-3367-4253-8c2a-22deaf59e96c')
-    @test.requires_ext(extension="dns-integration",
+    @utils.requires_ext(extension="dns-integration",
                        service="network")
     def test_create_update_network_dns_domain(self):
         domain1 = 'test.org.'
@@ -111,7 +111,7 @@
         self.assertEqual(domain2, body['dns_domain'])
 
     @decorators.idempotent_id('a23186b9-aa6f-4b08-b877-35ca3b9cd54c')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_list_networks_fields_keystone_v3(self):
         def _check_list_networks_fields(fields, expect_project_id,
                                         expect_tenant_id):
diff --git a/neutron_tempest_plugin/api/test_ports.py b/neutron_tempest_plugin/api/test_ports.py
index c68f4e3..5a01798 100644
--- a/neutron_tempest_plugin/api/test_ports.py
+++ b/neutron_tempest_plugin/api/test_ports.py
@@ -13,8 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib import decorators
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 
@@ -44,7 +44,7 @@
         self.assertEqual(ip, dns_assignment['ip_address'])
 
     @decorators.idempotent_id('c72c1c0c-2193-4aca-bbb4-b1442640bbbb')
-    @test.requires_ext(extension="standard-attr-description",
+    @utils.requires_ext(extension="standard-attr-description",
                        service="network")
     def test_create_update_port_description(self):
         body = self.create_port(self.network,
@@ -59,7 +59,7 @@
         self.assertEqual('d2', body['description'])
 
     @decorators.idempotent_id('539fbefe-fb36-48aa-9a53-8c5fbd44e492')
-    @test.requires_ext(extension="dns-integration",
+    @utils.requires_ext(extension="dns-integration",
                        service="network")
     def test_create_update_port_with_dns_name(self):
         # NOTE(manjeets) dns_domain is set to openstackgate.local
@@ -80,7 +80,7 @@
         self._confirm_dns_assignment(body)
 
     @decorators.idempotent_id('435e89df-a8bb-4b41-801a-9f20d362d777')
-    @test.requires_ext(extension="dns-integration",
+    @utils.requires_ext(extension="dns-integration",
                        service="network")
     def test_create_update_port_with_no_dns_name(self):
         self.create_subnet(self.network)
@@ -92,7 +92,7 @@
         self._confirm_dns_assignment(port_body['port'])
 
     @decorators.idempotent_id('dfe8cc79-18d9-4ae8-acef-3ec6bb719aa7')
-    @test.requires_ext(extension="dns-domain-ports",
+    @utils.requires_ext(extension="dns-domain-ports",
                        service="network")
     def test_create_update_port_with_dns_domain(self):
         self.create_subnet(self.network)
diff --git a/neutron_tempest_plugin/api/test_qos.py b/neutron_tempest_plugin/api/test_qos.py
index a075b67..ae0a420 100644
--- a/neutron_tempest_plugin/api/test_qos.py
+++ b/neutron_tempest_plugin/api/test_qos.py
@@ -12,16 +12,17 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from neutron_lib.api.definitions import qos as qos_apidef
+from neutron_lib.services.qos import constants as qos_consts
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions
-from tempest import test
 
 import testscenarios
 import testtools
 
 from neutron_tempest_plugin.api import base
-from neutron_tempest_plugin.common import qos_consts
 
 
 load_tests = testscenarios.load_tests_apply_scenarios
@@ -29,7 +30,7 @@
 
 class QosTestJSON(base.BaseAdminNetworkTest):
 
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @staticmethod
     def _get_driver_details(rule_type_details, driver_name):
@@ -37,17 +38,6 @@
             if driver['name'] == driver_name:
                 return driver
 
-    def _create_project(self):
-        # Add a project to conduct the test
-        test_project = data_utils.rand_name('test_project_')
-        test_description = data_utils.rand_name('desc_')
-        project = self.identity_admin_client.create_project(
-            name=test_project,
-            description=test_description)['project']
-        self.addCleanup(
-            self.identity_admin_client.delete_project, project['id'])
-        return project
-
     @decorators.idempotent_id('108fbdf7-3463-4e47-9871-d07f3dcf5bbb')
     def test_create_policy(self):
         policy = self.create_qos_policy(name='test-policy',
@@ -67,7 +57,7 @@
         self.assertIn(policy['id'], policies_ids)
 
     @decorators.idempotent_id('606a48e2-5403-4052-b40f-4d54b855af76')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_show_policy_has_project_id(self):
         policy = self.create_qos_policy(name='test-policy', shared=False)
         body = self.admin_client.show_qos_policy(policy['id'])
@@ -371,7 +361,7 @@
 
     @decorators.idempotent_id('18d94f22-b9d5-4390-af12-d30a0cfc4cd3')
     def test_default_policy_creating_network_without_policy(self):
-        project_id = self._create_project()['id']
+        project_id = self.create_project()['id']
         policy = self.create_qos_policy(name='test-policy',
                                         tenant_id=project_id,
                                         is_default=True)
@@ -383,7 +373,7 @@
 
     @decorators.idempotent_id('807cce45-38e5-482d-94db-36e1796aba73')
     def test_default_policy_creating_network_with_policy(self):
-        project_id = self._create_project()['id']
+        project_id = self.create_project()['id']
         self.create_qos_policy(name='test-policy',
                                tenant_id=project_id,
                                is_default=True)
@@ -400,7 +390,7 @@
 class QosBandwidthLimitRuleTestJSON(base.BaseAdminNetworkTest):
 
     direction = None
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @classmethod
     @base.require_qos_rule_type(qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)
@@ -598,7 +588,7 @@
 
     force_tenant_isolation = True
     credentials = ['primary', 'alt', 'admin']
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @classmethod
     def resource_setup(cls):
@@ -852,7 +842,7 @@
     VALID_DSCP_MARK1 = 56
     VALID_DSCP_MARK2 = 48
 
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @classmethod
     @base.require_qos_rule_type(qos_consts.RULE_TYPE_DSCP_MARKING)
@@ -986,7 +976,7 @@
     DIRECTION_INGRESS = "ingress"
     RULE_NAME = qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH + "_rule"
     RULES_NAME = RULE_NAME + "s"
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @classmethod
     @base.require_qos_rule_type(qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH)
@@ -1148,7 +1138,7 @@
     list_kwargs = {'description': 'search-criteria-test'}
     list_as_admin = True
 
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @classmethod
     def resource_setup(cls):
diff --git a/neutron_tempest_plugin/api/test_qos_negative.py b/neutron_tempest_plugin/api/test_qos_negative.py
index e26a536..ada0efa 100644
--- a/neutron_tempest_plugin/api/test_qos_negative.py
+++ b/neutron_tempest_plugin/api/test_qos_negative.py
@@ -10,6 +10,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from neutron_lib.api.definitions import qos as qos_apidef
 from neutron_lib.db import constants as db_const
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
@@ -23,7 +24,7 @@
 
 class QosNegativeTestJSON(base.BaseAdminNetworkTest):
 
-    required_extensions = ['qos']
+    required_extensions = [qos_apidef.ALIAS]
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('b9dce555-d3b3-11e5-950a-54ee757c77da')
diff --git a/neutron_tempest_plugin/api/test_revisions.py b/neutron_tempest_plugin/api/test_revisions.py
index 1d860ca..eb32560 100644
--- a/neutron_tempest_plugin/api/test_revisions.py
+++ b/neutron_tempest_plugin/api/test_revisions.py
@@ -12,9 +12,9 @@
 
 import netaddr
 
+from tempest.common import utils
 from tempest.lib import decorators
 from tempest.lib import exceptions
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin.api import base_security_groups as bsg
@@ -109,7 +109,7 @@
                            updated['network']['revision_number'])
 
     @decorators.idempotent_id('6c256f71-c929-4200-b3dc-4e1843506be5')
-    @test.requires_ext(extension="security-group", service="network")
+    @utils.requires_ext(extension="security-group", service="network")
     def test_update_sg_group_bumps_revision(self):
         sg, name = self._create_security_group()
         self.assertIn('revision_number', sg['security_group'])
@@ -119,7 +119,7 @@
                            sg['security_group']['revision_number'])
 
     @decorators.idempotent_id('6489632f-8550-4453-a674-c98849742967')
-    @test.requires_ext(extension="security-group", service="network")
+    @utils.requires_ext(extension="security-group", service="network")
     def test_update_port_sg_binding_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -136,7 +136,7 @@
                            updated['port']['revision_number'])
 
     @decorators.idempotent_id('29c7ab2b-d1d8-425d-8cec-fcf632960f22')
-    @test.requires_ext(extension="security-group", service="network")
+    @utils.requires_ext(extension="security-group", service="network")
     def test_update_sg_rule_bumps_sg_revision(self):
         sg, name = self._create_security_group()
         rule = self.client.create_security_group_rule(
@@ -153,7 +153,7 @@
                            updated['security_group']['revision_number'])
 
     @decorators.idempotent_id('db70c285-0365-4fac-9f55-2a0ad8cf55a8')
-    @test.requires_ext(extension="allowed-address-pairs", service="network")
+    @utils.requires_ext(extension="allowed-address-pairs", service="network")
     def test_update_allowed_address_pairs_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -169,7 +169,7 @@
                            updated['port']['revision_number'])
 
     @decorators.idempotent_id('a21ec3b4-3569-4b77-bf29-4177edaa2df5')
-    @test.requires_ext(extension="extra_dhcp_opt", service="network")
+    @utils.requires_ext(extension="extra_dhcp_opt", service="network")
     def test_update_extra_dhcp_opt_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -186,7 +186,7 @@
                            updated['port']['revision_number'])
 
     @decorators.idempotent_id('40ba648f-f374-4c29-a5b7-489dd5a38a4e')
-    @test.requires_ext(extension="dns-integration", service="network")
+    @utils.requires_ext(extension="dns-integration", service="network")
     def test_update_dns_domain_bumps_revision(self):
         net = self.create_network(dns_domain='example.test.')
         self.addCleanup(self.client.delete_network, net['id'])
@@ -205,8 +205,8 @@
                            updated['port']['revision_number'])
 
     @decorators.idempotent_id('8482324f-cf59-4d73-b98e-d37119255300')
-    @test.requires_ext(extension="router", service="network")
-    @test.requires_ext(extension="extraroute", service="network")
+    @utils.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="extraroute", service="network")
     def test_update_router_extra_routes_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -230,7 +230,7 @@
                            updated['router']['revision_number'])
 
     @decorators.idempotent_id('6bd18702-e25a-4b4b-8c0c-680113533511')
-    @test.requires_ext(extension="subnet-service-types", service="network")
+    @utils.requires_ext(extension="subnet-service-types", service="network")
     def test_update_subnet_service_types_bumps_revisions(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -246,7 +246,7 @@
                            updated['subnet']['revision_number'])
 
     @decorators.idempotent_id('9c83105c-9973-45ff-9ca2-e66d64700abe')
-    @test.requires_ext(extension="port-security", service="network")
+    @utils.requires_ext(extension="port-security", service="network")
     def test_update_port_security_bumps_revisions(self):
         net = self.create_network(port_security_enabled=False)
         self.addCleanup(self.client.delete_network, net['id'])
@@ -270,7 +270,7 @@
                            updated['port']['revision_number'])
 
     @decorators.idempotent_id('68d5ac3a-11a1-4847-8e2e-5843c043d89b')
-    @test.requires_ext(extension="binding", service="network")
+    @utils.requires_ext(extension="binding", service="network")
     def test_portbinding_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -284,7 +284,7 @@
                            port['revision_number'])
 
     @decorators.idempotent_id('4a37bde9-1975-47e0-9b8c-2c9ca36415b0')
-    @test.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="router", service="network")
     def test_update_router_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -307,8 +307,8 @@
                            router['revision_number'])
 
     @decorators.idempotent_id('9de71ebc-f5df-4cd0-80bc-60299fce3ce9')
-    @test.requires_ext(extension="router", service="network")
-    @test.requires_ext(extension="standard-attr-description",
+    @utils.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="standard-attr-description",
                        service="network")
     def test_update_floatingip_bumps_revision(self):
         ext_id = config.CONF.network.public_network_id
@@ -339,8 +339,8 @@
         self.client.update_floatingip(b2['floatingip']['id'], port_id=None)
 
     @decorators.idempotent_id('afb6486c-41b5-483e-a500-3c506f4deb49')
-    @test.requires_ext(extension="router", service="network")
-    @test.requires_ext(extension="l3-ha", service="network")
+    @utils.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="l3-ha", service="network")
     def test_update_router_extra_attributes_bumps_revision(self):
         # updates from CVR to CVR-HA are supported on every release,
         # but only the admin can forcibly create a non-HA router
@@ -360,10 +360,10 @@
                            router['revision_number'])
 
     @decorators.idempotent_id('90743b00-b0e2-40e4-9524-1c884fe3ef23')
-    @test.requires_ext(extension="external-net", service="network")
-    @test.requires_ext(extension="auto-allocated-topology", service="network")
-    @test.requires_ext(extension="subnet_allocation", service="network")
-    @test.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="external-net", service="network")
+    @utils.requires_ext(extension="auto-allocated-topology", service="network")
+    @utils.requires_ext(extension="subnet_allocation", service="network")
+    @utils.requires_ext(extension="router", service="network")
     def test_update_external_network_bumps_revision(self):
         net = self.create_network()
         self.addCleanup(self.client.delete_network, net['id'])
@@ -374,7 +374,7 @@
                            net['revision_number'])
 
     @decorators.idempotent_id('5af6450a-0f61-49c3-b628-38db77c7b856')
-    @test.requires_ext(extension="qos", service="network")
+    @utils.requires_ext(extension="qos", service="network")
     def test_update_qos_port_policy_binding_bumps_revision(self):
         policy = self.create_qos_policy(name='port-policy', shared=False)
         net = self.create_network()
@@ -387,7 +387,7 @@
                            port['revision_number'])
 
     @decorators.idempotent_id('817da343-c6e4-445c-9519-a621f124dfbe')
-    @test.requires_ext(extension="qos", service="network")
+    @utils.requires_ext(extension="qos", service="network")
     def test_update_qos_network_policy_binding_bumps_revision(self):
         policy = self.create_qos_policy(name='network-policy', shared=False)
         network = self.create_network()
diff --git a/neutron_tempest_plugin/api/test_routers.py b/neutron_tempest_plugin/api/test_routers.py
index 11fdecf..bc657e0 100644
--- a/neutron_tempest_plugin/api/test_routers.py
+++ b/neutron_tempest_plugin/api/test_routers.py
@@ -14,9 +14,9 @@
 #    under the License.
 
 import netaddr
+from tempest.common import utils as tutils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin.api import base_routers
@@ -39,7 +39,7 @@
             config.safe_get_config_value('network', 'project_network_v6_cidr'))
 
     @decorators.idempotent_id('c72c1c0c-2193-4aca-eeee-b1442640eeee')
-    @test.requires_ext(extension="standard-attr-description",
+    @tutils.requires_ext(extension="standard-attr-description",
                        service="network")
     def test_create_update_router_description(self):
         body = self.create_router(description='d1', router_name='test')
@@ -52,7 +52,7 @@
         self.assertEqual('d2', body['description'])
 
     @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
-    @test.requires_ext(extension='ext-gw-mode', service='network')
+    @tutils.requires_ext(extension='ext-gw-mode', service='network')
     def test_create_router_with_default_snat_value(self):
         # Create a router with default snat rule
         name = data_utils.rand_name('router')
@@ -63,7 +63,7 @@
                            'enable_snat': True})
 
     @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
-    @test.requires_ext(extension='ext-gw-mode', service='network')
+    @tutils.requires_ext(extension='ext-gw-mode', service='network')
     def test_create_router_with_snat_explicit(self):
         name = data_utils.rand_name('snat-router')
         # Create a router enabling snat attributes
@@ -100,14 +100,15 @@
         self.assertGreaterEqual(len(fixed_ips), 1)
         public_net_body = self.admin_client.show_network(
             CONF.network.public_network_id)
-        public_subnet_id = public_net_body['network']['subnets'][0]
-        self.assertIn(public_subnet_id,
-                      [x['subnet_id'] for x in fixed_ips])
+        public_subnet_ids = public_net_body['network']['subnets']
+        for fixed_ip in fixed_ips:
+            self.assertIn(fixed_ip['subnet_id'],
+                          public_subnet_ids)
 
     @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
-    @test.requires_ext(extension='ext-gw-mode', service='network')
+    @tutils.requires_ext(extension='ext-gw-mode', service='network')
     def test_update_router_set_gateway_with_snat_explicit(self):
-        router = self._create_router(data_utils.rand_name('router-'))
+        router = self._create_router(data_utils.rand_name('router'))
         self.admin_client.update_router_with_snat_gw_info(
             router['id'],
             external_gateway_info={
@@ -120,9 +121,9 @@
         self._verify_gateway_port(router['id'])
 
     @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
-    @test.requires_ext(extension='ext-gw-mode', service='network')
+    @tutils.requires_ext(extension='ext-gw-mode', service='network')
     def test_update_router_set_gateway_without_snat(self):
-        router = self._create_router(data_utils.rand_name('router-'))
+        router = self._create_router(data_utils.rand_name('router'))
         self.admin_client.update_router_with_snat_gw_info(
             router['id'],
             external_gateway_info={
@@ -135,10 +136,10 @@
         self._verify_gateway_port(router['id'])
 
     @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
-    @test.requires_ext(extension='ext-gw-mode', service='network')
+    @tutils.requires_ext(extension='ext-gw-mode', service='network')
     def test_update_router_reset_gateway_without_snat(self):
         router = self._create_router(
-            data_utils.rand_name('router-'),
+            data_utils.rand_name('router'),
             external_network_id=CONF.network.public_network_id)
         self.admin_client.update_router_with_snat_gw_info(
             router['id'],
@@ -156,14 +157,14 @@
         network = self.create_network()
         subnet = self.create_subnet(network)
         # Add router interface with subnet id
-        router = self._create_router(data_utils.rand_name('router-'), True)
+        router = self._create_router(data_utils.rand_name('router'), True)
         intf = self.create_router_interface(router['id'], subnet['id'])
         status_active = lambda: self.client.show_port(
             intf['port_id'])['port']['status'] == 'ACTIVE'
         utils.wait_until_true(status_active, exception=AssertionError)
 
     @decorators.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
-    @test.requires_ext(extension='extraroute', service='network')
+    @tutils.requires_ext(extension='extraroute', service='network')
     def test_update_extra_route(self):
         self.network = self.create_network()
         self.name = self.network['name']
diff --git a/neutron_tempest_plugin/api/test_security_groups.py b/neutron_tempest_plugin/api/test_security_groups.py
index 46e00f7..299a62e 100644
--- a/neutron_tempest_plugin/api/test_security_groups.py
+++ b/neutron_tempest_plugin/api/test_security_groups.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from neutron_lib import constants
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
@@ -34,7 +35,7 @@
             secgroup_list.append(secgroup['id'])
         self.assertIn(group_create_body['security_group']['id'], secgroup_list)
         # Update the security group
-        new_name = data_utils.rand_name('security-')
+        new_name = data_utils.rand_name('security')
         new_description = data_utils.rand_name('security-description')
         update_body = self.client.update_security_group(
             group_create_body['security_group']['id'],
@@ -64,3 +65,60 @@
                             secgrp['id'])
             self.assertIn(secgrp['name'], sec_nm)
             self.assertIsNotNone(secgrp['id'])
+
+
+class SecGroupProtocolTest(base.BaseSecGroupTest):
+
+    @decorators.idempotent_id('282e3681-aa6e-42a7-b05c-c341aa1e3cdf')
+    def test_create_show_delete_security_group_rule_names(self):
+        group_create_body, _ = self._create_security_group()
+        for protocol in base.V4_PROTOCOL_NAMES:
+            self._test_create_show_delete_security_group_rule(
+                security_group_id=group_create_body['security_group']['id'],
+                protocol=protocol,
+                direction=constants.INGRESS_DIRECTION,
+                ethertype=self.ethertype)
+
+    @decorators.idempotent_id('66e47f1f-20b6-4417-8839-3cc671c7afa3')
+    def test_create_show_delete_security_group_rule_integers(self):
+        group_create_body, _ = self._create_security_group()
+        for protocol in base.V4_PROTOCOL_INTS:
+            self._test_create_show_delete_security_group_rule(
+                security_group_id=group_create_body['security_group']['id'],
+                protocol=protocol,
+                direction=constants.INGRESS_DIRECTION,
+                ethertype=self.ethertype)
+
+
+class SecGroupProtocolIPv6Test(SecGroupProtocolTest):
+    _ip_version = constants.IP_VERSION_6
+
+    @decorators.idempotent_id('1f7cc9f5-e0d5-487c-8384-3d74060ab530')
+    def test_create_security_group_rule_with_ipv6_protocol_names(self):
+        group_create_body, _ = self._create_security_group()
+        for protocol in base.V6_PROTOCOL_NAMES:
+            self._test_create_show_delete_security_group_rule(
+                security_group_id=group_create_body['security_group']['id'],
+                protocol=protocol,
+                direction=constants.INGRESS_DIRECTION,
+                ethertype=self.ethertype)
+
+    @decorators.idempotent_id('c7d17b41-3b4e-4add-bb3b-6af59baaaffa')
+    def test_create_security_group_rule_with_ipv6_protocol_legacy_names(self):
+        group_create_body, _ = self._create_security_group()
+        for protocol in base.V6_PROTOCOL_LEGACY:
+            self._test_create_show_delete_security_group_rule(
+                security_group_id=group_create_body['security_group']['id'],
+                protocol=protocol,
+                direction=constants.INGRESS_DIRECTION,
+                ethertype=self.ethertype)
+
+    @decorators.idempotent_id('bcfce0b7-bc96-40ae-9b08-3f6774ee0260')
+    def test_create_security_group_rule_with_ipv6_protocol_integers(self):
+        group_create_body, _ = self._create_security_group()
+        for protocol in base.V6_PROTOCOL_INTS:
+            self._test_create_show_delete_security_group_rule(
+                security_group_id=group_create_body['security_group']['id'],
+                protocol=protocol,
+                direction=constants.INGRESS_DIRECTION,
+                ethertype=self.ethertype)
diff --git a/neutron_tempest_plugin/api/test_security_groups_negative.py b/neutron_tempest_plugin/api/test_security_groups_negative.py
index fd54a5c..c427691 100644
--- a/neutron_tempest_plugin/api/test_security_groups_negative.py
+++ b/neutron_tempest_plugin/api/test_security_groups_negative.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from neutron_lib import constants
 from neutron_lib.db import constants as db_const
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
@@ -26,6 +27,11 @@
 
     required_extensions = ['security-group']
 
+    @classmethod
+    def resource_setup(cls):
+        super(NegativeSecGroupTest, cls).resource_setup()
+        cls.network = cls.create_network()
+
     @decorators.attr(type='negative')
     @decorators.idempotent_id('594edfa8-9a5b-438e-9344-49aece337d49')
     def test_create_security_group_with_too_long_name(self):
@@ -66,6 +72,47 @@
                           self.client.update_security_group,
                           sg['id'], name=True)
 
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('3200b1a8-d73b-48e9-b03f-e891a4abe2d3')
+    def test_delete_in_use_sec_group(self):
+        sgroup = self.os_primary.network_client.create_security_group(
+            name='sgroup')
+        self.security_groups.append(sgroup['security_group'])
+        port = self.client.create_port(
+            network_id=self.network['id'],
+            security_groups=[sgroup['security_group']['id']])
+        self.ports.append(port['port'])
+        self.assertRaises(lib_exc.Conflict,
+                          self.os_primary.network_client.delete_security_group,
+                          security_group_id=sgroup['security_group']['id'])
+
 
 class NegativeSecGroupIPv6Test(NegativeSecGroupTest):
-    _ip_version = 6
+    _ip_version = constants.IP_VERSION_6
+
+
+class NegativeSecGroupProtocolTest(base.BaseSecGroupTest):
+
+    def _test_create_security_group_rule_with_bad_protocols(self, protocols):
+        group_create_body, _ = self._create_security_group()
+
+        # bad protocols can include v6 protocols because self.ethertype is v4
+        for protocol in protocols:
+            self.assertRaises(
+                lib_exc.BadRequest,
+                self.client.create_security_group_rule,
+                security_group_id=group_create_body['security_group']['id'],
+                protocol=protocol, direction=constants.INGRESS_DIRECTION,
+                ethertype=self.ethertype)
+
+    @decorators.attr(type=['negative'])
+    @decorators.idempotent_id('cccbb0f3-c273-43ed-b3fc-1efc48833810')
+    def test_create_security_group_rule_with_ipv6_protocol_names(self):
+        self._test_create_security_group_rule_with_bad_protocols(
+            base.V6_PROTOCOL_NAMES)
+
+    @decorators.attr(type=['negative'])
+    @decorators.idempotent_id('8aa636bd-7060-4fdf-b722-cdae28e2f1ef')
+    def test_create_security_group_rule_with_ipv6_protocol_integers(self):
+        self._test_create_security_group_rule_with_bad_protocols(
+            base.V6_PROTOCOL_INTS)
diff --git a/neutron_tempest_plugin/api/test_subnetpools.py b/neutron_tempest_plugin/api/test_subnetpools.py
index 5da0ad8..dc822e3 100644
--- a/neutron_tempest_plugin/api/test_subnetpools.py
+++ b/neutron_tempest_plugin/api/test_subnetpools.py
@@ -13,9 +13,9 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 
@@ -105,7 +105,7 @@
                       "Created subnetpool name should be in the list")
 
     @decorators.idempotent_id('c72c1c0c-2193-4aca-ddd4-b1442640bbbb')
-    @test.requires_ext(extension="standard-attr-description",
+    @utils.requires_ext(extension="standard-attr-description",
                        service="network")
     def test_create_update_subnetpool_description(self):
         body = self._create_subnetpool(description='d1')
@@ -135,7 +135,7 @@
         self.assertFalse(subnetpool['shared'])
 
     @decorators.idempotent_id('5bf9f1e2-efc8-4195-acf3-d12b2bd68dd3')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_show_subnetpool_has_project_id(self):
         subnetpool = self._create_subnetpool()
         body = self.client.show_subnetpool(subnetpool['id'])
@@ -259,7 +259,7 @@
         self.assertTrue(cidr.endswith(str(self.max_prefixlen)))
 
     @decorators.idempotent_id('49b44c64-1619-4b29-b527-ffc3c3115dc4')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_create_subnetpool_associate_address_scope(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
@@ -271,7 +271,7 @@
                          body['subnetpool']['address_scope_id'])
 
     @decorators.idempotent_id('910b6393-db24-4f6f-87dc-b36892ad6c8c')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_associate_address_scope(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
@@ -287,7 +287,7 @@
                          body['subnetpool']['address_scope_id'])
 
     @decorators.idempotent_id('18302e80-46a3-4563-82ac-ccd1dd57f652')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_associate_another_address_scope(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
@@ -308,7 +308,7 @@
                          body['subnetpool']['address_scope_id'])
 
     @decorators.idempotent_id('f8970048-e41b-42d6-934b-a1297b07706a')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_disassociate_address_scope(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
@@ -325,7 +325,7 @@
         self.assertIsNone(body['subnetpool']['address_scope_id'])
 
     @decorators.idempotent_id('4c6963c2-f54c-4347-b288-75d18421c4c4')
-    @test.requires_ext(extension='default-subnetpools', service='network')
+    @utils.requires_ext(extension='default-subnetpools', service='network')
     def test_tenant_create_non_default_subnetpool(self):
         """
         Test creates a subnetpool, the "is_default" attribute is False.
@@ -334,69 +334,6 @@
         self.assertFalse(created_subnetpool['is_default'])
 
 
-class DefaultSubnetPoolsTest(SubnetPoolsTestBase):
-
-    def setUp(self):
-        self.addCleanup(self.resource_cleanup)
-        super(DefaultSubnetPoolsTest, self).setUp()
-
-    @classmethod
-    def resource_setup(cls):
-        super(DefaultSubnetPoolsTest, cls).resource_setup()
-        body = cls.admin_client.list_subnetpools()
-        subnetpools = body['subnetpools']
-        for subnetpool in subnetpools:
-            if subnetpool.get('is_default'):
-                msg = 'Default subnetpool already exists. Only one is allowed.'
-                raise cls.skipException(msg)
-
-    @decorators.idempotent_id('cb839106-6184-4332-b292-5d07c074de4f')
-    @test.requires_ext(extension='default-subnetpools', service='network')
-    def test_admin_create_default_subnetpool(self):
-        """
-        Test uses administrative credentials to create a default subnetpool,
-        using the is_default=True.
-        """
-        created_subnetpool = self._create_subnetpool(is_admin=True,
-                                                     is_default=True)
-        self.assertTrue(created_subnetpool['is_default'])
-
-    @decorators.idempotent_id('9e79730c-29b6-44a4-9504-bf3c7cedc56c')
-    @test.requires_ext(extension='default-subnetpools', service='network')
-    def test_convert_subnetpool_to_default_subnetpool(self):
-        """
-        Test creates a subnetpool, which is non default subnetpool.
-        Then it will update to a default subnetpool, by setting "is_default"
-        attribute to True.
-        """
-        created_subnetpool = self._create_subnetpool()
-        subnetpool_id = created_subnetpool['id']
-        self.assertFalse(created_subnetpool['is_default'])
-        subnetpool_data = {'is_default': True}
-        self.admin_client.update_subnetpool(subnetpool_id,
-                                            **subnetpool_data)
-        show_body = self.client.show_subnetpool(subnetpool_id)
-        self.assertTrue(show_body['subnetpool']['is_default'])
-
-    @decorators.idempotent_id('39687561-7a37-47b8-91ce-f9143ae26969')
-    @test.requires_ext(extension='default-subnetpools', service='network')
-    def test_convert_default_subnetpool_to_non_default(self):
-        """
-        Test uses administrative credentials to create a default subnetpool,
-        using the is_default=True.
-        Then it will update "is_default" attribute to False.
-        """
-        created_subnetpool = self._create_subnetpool(is_admin=True,
-                                                     is_default=True)
-        subnetpool_id = created_subnetpool['id']
-        self.assertTrue(created_subnetpool['is_default'])
-        subnetpool_data = {'is_default': False}
-        self.admin_client.update_subnetpool(subnetpool_id,
-                                            **subnetpool_data)
-        show_body = self.admin_client.show_subnetpool(subnetpool_id)
-        self.assertFalse(show_body['subnetpool']['is_default'])
-
-
 class SubnetPoolsTestV6(SubnetPoolsTest):
 
     min_prefixlen = '48'
diff --git a/neutron_tempest_plugin/api/test_subnetpools_negative.py b/neutron_tempest_plugin/api/test_subnetpools_negative.py
index 950b57e..214a012 100644
--- a/neutron_tempest_plugin/api/test_subnetpools_negative.py
+++ b/neutron_tempest_plugin/api/test_subnetpools_negative.py
@@ -15,10 +15,10 @@
 
 import netaddr
 from oslo_utils import uuidutils
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import test_subnetpools
 
@@ -61,7 +61,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('6ae09d8f-95be-40ed-b1cf-8b850d45bab5')
-    @test.requires_ext(extension='default-subnetpools', service='network')
+    @utils.requires_ext(extension='default-subnetpools', service='network')
     def test_tenant_create_default_subnetpool(self):
         # 'default' subnetpool can only be created by admin.
         self.assertRaises(lib_exc.Forbidden, self._create_subnetpool,
@@ -113,21 +113,21 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('9589e332-638e-476e-81bd-013d964aa3cb')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_create_subnetpool_associate_invalid_address_scope(self):
         self.assertRaises(lib_exc.BadRequest, self._create_subnetpool,
                           address_scope_id='foo-addr-scope')
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('3b6c5942-485d-4964-a560-55608af020b5')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_create_subnetpool_associate_non_exist_address_scope(self):
         self.assertRaises(lib_exc.NotFound, self._create_subnetpool,
                           address_scope_id=uuidutils.generate_uuid())
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('2dfb4269-8657-485a-a053-b022e911456e')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_create_subnetpool_associate_address_scope_prefix_intersect(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
@@ -143,7 +143,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('83a19a13-5384-42e2-b579-43fc69c80914')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_create_sp_associate_address_scope_multiple_prefix_intersect(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
@@ -161,7 +161,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('f06d8e7b-908b-4e94-b570-8156be6a4bf1')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_create_subnetpool_associate_address_scope_of_other_owner(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'), is_admin=True,
@@ -171,7 +171,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('3396ec6c-cb80-4ebe-b897-84e904580bdf')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_tenant_create_subnetpool_associate_shared_address_scope(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'), is_admin=True,
@@ -181,7 +181,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('6d3d9ad5-32d4-4d63-aa00-8c62f73e2881')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_associate_address_scope_of_other_owner(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'), is_admin=True,
@@ -214,7 +214,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('96006292-7214-40e0-a471-153fb76e6b31')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_prefix_intersect(self):
         pool_1_prefix = [u'20.0.0.0/18']
         pool_2_prefix = [u'20.10.0.0/24']
@@ -224,7 +224,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('4d3f8a79-c530-4e59-9acf-6c05968adbfe')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_multiple_prefix_intersect(self):
         pool_1_prefixes = [u'20.0.0.0/18', u'30.0.0.0/18']
         pool_2_prefixes = [u'20.10.0.0/24', u'40.0.0.0/18', '50.0.0.0/18']
@@ -235,7 +235,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('7438e49e-1351-45d8-937b-892059fb97f5')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_tenant_update_sp_prefix_associated_with_shared_addr_scope(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'), is_admin=True,
@@ -266,7 +266,7 @@
 
     @decorators.attr(type='negative')
     @decorators.idempotent_id('648fee7d-a909-4ced-bad3-3a169444c0a8')
-    @test.requires_ext(extension='address-scope', service='network')
+    @utils.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_associate_address_scope_wrong_ip_version(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
diff --git a/neutron_tempest_plugin/api/test_tag.py b/neutron_tempest_plugin/api/test_tag.py
deleted file mode 100644
index c56d611..0000000
--- a/neutron_tempest_plugin/api/test_tag.py
+++ /dev/null
@@ -1,351 +0,0 @@
-#    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.lib import decorators
-from tempest.lib import exceptions as lib_exc
-from tempest import test
-
-from neutron_tempest_plugin.api import base
-
-
-class TagTestJSON(base.BaseAdminNetworkTest):
-
-    required_extensions = ['tag']
-
-    @classmethod
-    def resource_setup(cls):
-        super(TagTestJSON, cls).resource_setup()
-        cls.res_id = cls._create_resource()
-
-    def _get_and_compare_tags(self, tags):
-        res_body = self.client.get_tags(self.resource, self.res_id)
-        self.assertItemsEqual(tags, res_body['tags'])
-
-    def _test_tag_operations(self):
-        # create and get tags
-        tags = ['red', 'blue']
-        res_body = self.client.update_tags(self.resource, self.res_id, tags)
-        self.assertItemsEqual(tags, res_body['tags'])
-        self._get_and_compare_tags(tags)
-
-        # add a tag
-        self.client.update_tag(self.resource, self.res_id, 'green')
-        self._get_and_compare_tags(['red', 'blue', 'green'])
-
-        # update tag exist
-        self.client.update_tag(self.resource, self.res_id, 'red')
-        self._get_and_compare_tags(['red', 'blue', 'green'])
-
-        # add a tag with a dot
-        self.client.update_tag(self.resource, self.res_id, 'black.or.white')
-        self._get_and_compare_tags(['red', 'blue', 'green', 'black.or.white'])
-
-        # replace tags
-        tags = ['red', 'yellow', 'purple']
-        res_body = self.client.update_tags(self.resource, self.res_id, tags)
-        self.assertItemsEqual(tags, res_body['tags'])
-        self._get_and_compare_tags(tags)
-
-        # get tag
-        self.client.get_tag(self.resource, self.res_id, 'red')
-
-        # get tag not exist
-        self.assertRaises(lib_exc.NotFound, self.client.get_tag,
-                          self.resource, self.res_id, 'green')
-
-        # delete tag
-        self.client.delete_tag(self.resource, self.res_id, 'red')
-        self._get_and_compare_tags(['yellow', 'purple'])
-
-        # delete tag not exist
-        self.assertRaises(lib_exc.NotFound, self.client.delete_tag,
-                          self.resource, self.res_id, 'green')
-
-        # delete tags
-        self.client.delete_tags(self.resource, self.res_id)
-        self._get_and_compare_tags([])
-
-
-class TagNetworkTestJSON(TagTestJSON):
-    resource = 'networks'
-
-    @classmethod
-    def _create_resource(cls):
-        network = cls.create_network()
-        return network['id']
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('5621062d-fbfb-4437-9d69-138c78ea4188')
-    def test_network_tags(self):
-        self._test_tag_operations()
-
-
-class TagSubnetTestJSON(TagTestJSON):
-    resource = 'subnets'
-
-    @classmethod
-    def _create_resource(cls):
-        network = cls.create_network()
-        subnet = cls.create_subnet(network)
-        return subnet['id']
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('2805aabf-a94c-4e70-a0b2-9814f06beb03')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_subnet_tags(self):
-        self._test_tag_operations()
-
-
-class TagPortTestJSON(TagTestJSON):
-    resource = 'ports'
-
-    @classmethod
-    def _create_resource(cls):
-        network = cls.create_network()
-        port = cls.create_port(network)
-        return port['id']
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('c7c44f2c-edb0-4ebd-a386-d37cec155c34')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_port_tags(self):
-        self._test_tag_operations()
-
-
-class TagSubnetPoolTestJSON(TagTestJSON):
-    resource = 'subnetpools'
-
-    @classmethod
-    def _create_resource(cls):
-        subnetpool = cls.create_subnetpool('subnetpool', default_prefixlen=24,
-                                           prefixes=['10.0.0.0/8'])
-        return subnetpool['id']
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('bdc1c24b-c0b5-4835-953c-8f67dc11edfe')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_subnetpool_tags(self):
-        self._test_tag_operations()
-
-
-class TagRouterTestJSON(TagTestJSON):
-    resource = 'routers'
-
-    @classmethod
-    def _create_resource(cls):
-        router = cls.create_router(router_name='test')
-        return router['id']
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('b898ff92-dc33-4232-8ab9-2c6158c80d28')
-    @test.requires_ext(extension="router", service="network")
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_router_tags(self):
-        self._test_tag_operations()
-
-
-class TagFilterTestJSON(base.BaseAdminNetworkTest):
-    credentials = ['primary', 'alt', 'admin']
-    required_extensions = ['tag']
-
-    @classmethod
-    def resource_setup(cls):
-        super(TagFilterTestJSON, cls).resource_setup()
-
-        res1_id = cls._create_resource('tag-res1')
-        res2_id = cls._create_resource('tag-res2')
-        res3_id = cls._create_resource('tag-res3')
-        res4_id = cls._create_resource('tag-res4')
-        # tag-res5: a resource without tags
-        cls._create_resource('tag-res5')
-
-        cls.client.update_tags(cls.resource, res1_id, ['red'])
-        cls.client.update_tags(cls.resource, res2_id, ['red', 'blue'])
-        cls.client.update_tags(cls.resource, res3_id,
-                               ['red', 'blue', 'green'])
-        cls.client.update_tags(cls.resource, res4_id, ['green'])
-
-    @classmethod
-    def setup_clients(cls):
-        super(TagFilterTestJSON, cls).setup_clients()
-        cls.client = cls.os_alt.network_client
-
-    def _assertEqualResources(self, expected, res):
-        actual = [n['name'] for n in res if n['name'].startswith('tag-res')]
-        self.assertEqual(set(expected), set(actual))
-
-    def _test_filter_tags(self):
-        # tags single
-        filters = {'tags': 'red'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res1', 'tag-res2', 'tag-res3'], res)
-
-        # tags multi
-        filters = {'tags': 'red,blue'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res2', 'tag-res3'], res)
-
-        # tags-any single
-        filters = {'tags-any': 'blue'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res2', 'tag-res3'], res)
-
-        # tags-any multi
-        filters = {'tags-any': 'red,blue'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res1', 'tag-res2', 'tag-res3'], res)
-
-        # not-tags single
-        filters = {'not-tags': 'red'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res4', 'tag-res5'], res)
-
-        # not-tags multi
-        filters = {'not-tags': 'red,blue'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res1', 'tag-res4', 'tag-res5'], res)
-
-        # not-tags-any single
-        filters = {'not-tags-any': 'blue'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res1', 'tag-res4', 'tag-res5'], res)
-
-        # not-tags-any multi
-        filters = {'not-tags-any': 'red,blue'}
-        res = self._list_resource(filters)
-        self._assertEqualResources(['tag-res4', 'tag-res5'], res)
-
-
-class TagFilterNetworkTestJSON(TagFilterTestJSON):
-    resource = 'networks'
-
-    @classmethod
-    def _create_resource(cls, name):
-        res = cls.create_network(network_name=name)
-        return res['id']
-
-    def _list_resource(self, filters):
-        res = self.client.list_networks(**filters)
-        return res[self.resource]
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('a66b5cca-7db2-40f5-a33d-8ac9f864e53e')
-    def test_filter_network_tags(self):
-        self._test_filter_tags()
-
-
-class TagFilterSubnetTestJSON(TagFilterTestJSON):
-    resource = 'subnets'
-
-    @classmethod
-    def _create_resource(cls, name):
-        network = cls.create_network()
-        res = cls.create_subnet(network, name=name)
-        return res['id']
-
-    def _list_resource(self, filters):
-        res = self.client.list_subnets(**filters)
-        return res[self.resource]
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('dd8f9ba7-bcf6-496f-bead-714bd3daac10')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_filter_subnet_tags(self):
-        self._test_filter_tags()
-
-
-class TagFilterPortTestJSON(TagFilterTestJSON):
-    resource = 'ports'
-
-    @classmethod
-    def _create_resource(cls, name):
-        network = cls.create_network()
-        res = cls.create_port(network, name=name)
-        return res['id']
-
-    def _list_resource(self, filters):
-        res = self.client.list_ports(**filters)
-        return res[self.resource]
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('09c036b8-c8d0-4bee-b776-7f4601512898')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_filter_port_tags(self):
-        self._test_filter_tags()
-
-
-class TagFilterSubnetpoolTestJSON(TagFilterTestJSON):
-    resource = 'subnetpools'
-
-    @classmethod
-    def _create_resource(cls, name):
-        res = cls.create_subnetpool(name, default_prefixlen=24,
-                                    prefixes=['10.0.0.0/8'])
-        return res['id']
-
-    def _list_resource(self, filters):
-        res = self.client.list_subnetpools(**filters)
-        return res[self.resource]
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('16ae7ad2-55c2-4821-9195-bfd04ab245b7')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_filter_subnetpool_tags(self):
-        self._test_filter_tags()
-
-
-class TagFilterRouterTestJSON(TagFilterTestJSON):
-    resource = 'routers'
-
-    @classmethod
-    def _create_resource(cls, name):
-        res = cls.create_router(router_name=name)
-        return res['id']
-
-    def _list_resource(self, filters):
-        res = self.client.list_routers(**filters)
-        return res[self.resource]
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('cdd3f3ea-073d-4435-a6cb-826a4064193d')
-    @test.requires_ext(extension="tag-ext", service="network")
-    def test_filter_router_tags(self):
-        self._test_filter_tags()
-
-
-class UpdateTagsTest(base.BaseAdminNetworkTest):
-
-    required_extensions = ['tag']
-
-    def _get_and_compare_tags(self, tags, res_id):
-        # nothing specific about networks here, just a resource that is
-        # available in all setups
-        res_body = self.client.get_tags('networks', res_id)
-        self.assertItemsEqual(tags, res_body['tags'])
-
-    @decorators.attr(type='smoke')
-    @decorators.idempotent_id('74c56fb1-a3b1-4a62-a8d2-d04dca6bd4cd')
-    def test_update_tags_affects_only_updated_resource(self):
-        res1 = self.create_network()
-        res2 = self.create_network()
-
-        self.client.update_tags('networks', res1['id'], ['red', 'blue'])
-        self._get_and_compare_tags(['red', 'blue'], res1['id'])
-
-        self.client.update_tags('networks', res2['id'], ['red'])
-        self._get_and_compare_tags(['red'], res2['id'])
-
-        self.client.update_tags('networks', res2['id'], [])
-        self._get_and_compare_tags([], res2['id'])
-
-        # check that updates on res2 hasn't dropped tags from res1
-        self._get_and_compare_tags(['red', 'blue'], res1['id'])
diff --git a/neutron_tempest_plugin/api/test_timestamp.py b/neutron_tempest_plugin/api/test_timestamp.py
index 20d5703..4d2d32a 100644
--- a/neutron_tempest_plugin/api/test_timestamp.py
+++ b/neutron_tempest_plugin/api/test_timestamp.py
@@ -42,7 +42,7 @@
         cls._subnetpool_data = {'min_prefixlen': '29', 'prefixes': prefixes}
 
     def _create_subnetpool(self, is_admin=False, **kwargs):
-        name = data_utils.rand_name('subnetpool-')
+        name = data_utils.rand_name('subnetpool')
         subnetpool_data = copy.deepcopy(self._subnetpool_data)
         for key in subnetpool_data.keys():
             kwargs[key] = subnetpool_data[key]
diff --git a/neutron_tempest_plugin/api/test_trunk.py b/neutron_tempest_plugin/api/test_trunk.py
index 965b248..6c781ab 100644
--- a/neutron_tempest_plugin/api/test_trunk.py
+++ b/neutron_tempest_plugin/api/test_trunk.py
@@ -12,11 +12,11 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common import utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-from tempest import test
 
 from neutron_tempest_plugin.api import base
 from neutron_tempest_plugin import config
@@ -95,7 +95,7 @@
         self.assertRaises(lib_exc.NotFound, self._show_trunk, trunk_id)
 
     @decorators.idempotent_id('8d83a6ca-662d-45b8-8062-d513077296aa')
-    @test.requires_ext(extension="project-id", service="network")
+    @utils.requires_ext(extension="project-id", service="network")
     def test_show_trunk_has_project_id(self):
         trunk = self._create_trunk_with_network_and_parent(None)
         body = self._show_trunk(trunk['trunk']['id'])
@@ -228,7 +228,7 @@
 
     def create_provider_network(self):
         foo_net = config.CONF.neutron_plugin_options.provider_vlans[0]
-        post_body = {'network_name': data_utils.rand_name('vlan-net-'),
+        post_body = {'network_name': data_utils.rand_name('vlan-net'),
                      'provider:network_type': 'vlan',
                      'provider:physical_network': foo_net}
         return self.create_shared_network(**post_body)
@@ -276,11 +276,11 @@
         super(TrunkTestMtusJSONBase, self).setUp()
 
         # VXLAN autocomputed MTU (1450) is smaller than that of GRE (1458)
-        vxlan_kwargs = {'network_name': data_utils.rand_name('vxlan-net-'),
+        vxlan_kwargs = {'network_name': data_utils.rand_name('vxlan-net'),
                         'provider:network_type': 'vxlan'}
         self.smaller_mtu_net = self.create_shared_network(**vxlan_kwargs)
 
-        gre_kwargs = {'network_name': data_utils.rand_name('gre-net-'),
+        gre_kwargs = {'network_name': data_utils.rand_name('gre-net'),
                       'provider:network_type': 'gre'}
         self.larger_mtu_net = self.create_shared_network(**gre_kwargs)
 
diff --git a/neutron_tempest_plugin/common/qos_consts.py b/neutron_tempest_plugin/common/qos_consts.py
deleted file mode 100644
index e4a14cf..0000000
--- a/neutron_tempest_plugin/common/qos_consts.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright (c) 2015 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.
-
-RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth_limit'
-RULE_TYPE_DSCP_MARKING = 'dscp_marking'
-RULE_TYPE_MINIMUM_BANDWIDTH = 'minimum_bandwidth'
-VALID_RULE_TYPES = [RULE_TYPE_BANDWIDTH_LIMIT,
-                    RULE_TYPE_DSCP_MARKING,
-                    RULE_TYPE_MINIMUM_BANDWIDTH,
-                    ]
-
-# Names of rules' attributes
-MAX_KBPS = "max_kbps"
-MAX_BURST = "max_burst_kbps"
-MIN_KBPS = "min_kbps"
-DIRECTION = "direction"
-DSCP_MARK = "dscp_mark"
-
-QOS_POLICY_ID = 'qos_policy_id'
-
-QOS_PLUGIN = 'qos_plugin'
-
-# NOTE(slaweq): Value used to calculate burst value for egress bandwidth limit
-# if burst is not given by user. In such case burst value will be calculated
-# as 80% of bw_limit to ensure that at least limits for TCP traffic will work
-# fine.
-DEFAULT_BURST_RATE = 0.8
-
-# Method names for QoSDriver
-PRECOMMIT_POSTFIX = '_precommit'
-CREATE_POLICY = 'create_policy'
-CREATE_POLICY_PRECOMMIT = CREATE_POLICY + PRECOMMIT_POSTFIX
-UPDATE_POLICY = 'update_policy'
-UPDATE_POLICY_PRECOMMIT = UPDATE_POLICY + PRECOMMIT_POSTFIX
-DELETE_POLICY = 'delete_policy'
-DELETE_POLICY_PRECOMMIT = DELETE_POLICY + PRECOMMIT_POSTFIX
-
-QOS_CALL_METHODS = (
-    CREATE_POLICY,
-    CREATE_POLICY_PRECOMMIT,
-    UPDATE_POLICY,
-    UPDATE_POLICY_PRECOMMIT,
-    DELETE_POLICY,
-    DELETE_POLICY_PRECOMMIT, )
diff --git a/neutron_tempest_plugin/config.py b/neutron_tempest_plugin/config.py
index 6830b18..804fece 100644
--- a/neutron_tempest_plugin/config.py
+++ b/neutron_tempest_plugin/config.py
@@ -34,6 +34,10 @@
                 default=False,
                 help='Image that supports features that cirros does not, like'
                      ' Ubuntu or CentOS supporting advanced features'),
+    cfg.StrOpt('agent_availability_zone',
+               help='The availability zone for all agents in the deployment. '
+                    'Configure this only when the single value is used by '
+                    'all agents in the deployment.'),
 ]
 
 # TODO(amuller): Redo configuration options registration as part of the planned
diff --git a/neutron_tempest_plugin/scenario/base.py b/neutron_tempest_plugin/scenario/base.py
index e810490..5cc085f 100644
--- a/neutron_tempest_plugin/scenario/base.py
+++ b/neutron_tempest_plugin/scenario/base.py
@@ -12,6 +12,7 @@
 #    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 subprocess
 
 import netaddr
 from oslo_log import log
@@ -173,7 +174,7 @@
         LOG.debug("Created subnet %s", self.subnet['id'])
 
         secgroup = self.os_primary.network_client.create_security_group(
-            name=data_utils.rand_name('secgroup-'))
+            name=data_utils.rand_name('secgroup'))
         LOG.debug("Created security group %s",
                   secgroup['security_group']['name'])
         self.security_groups.append(secgroup['security_group'])
@@ -276,3 +277,41 @@
                                   nic=None, mtu=None, fragmentation=True):
         self.assertTrue(self._check_remote_connectivity(
             source, dest, should_succeed, nic, mtu, fragmentation))
+
+    def ping_ip_address(self, ip_address, should_succeed=True,
+                        ping_timeout=None, mtu=None):
+        # the code is taken from tempest/scenario/manager.py in tempest git
+        timeout = ping_timeout or CONF.validation.ping_timeout
+        cmd = ['ping', '-c1', '-w1']
+
+        if mtu:
+            cmd += [
+                # don't fragment
+                '-M', 'do',
+                # ping receives just the size of ICMP payload
+                '-s', str(net_utils.get_ping_payload_size(mtu, 4))
+            ]
+        cmd.append(ip_address)
+
+        def ping():
+            proc = subprocess.Popen(cmd,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.PIPE)
+            proc.communicate()
+
+            return (proc.returncode == 0) == should_succeed
+
+        caller = test_utils.find_test_caller()
+        LOG.debug('%(caller)s begins to ping %(ip)s in %(timeout)s sec and the'
+                  ' expected result is %(should_succeed)s', {
+                      'caller': caller, 'ip': ip_address, 'timeout': timeout,
+                      'should_succeed':
+                      'reachable' if should_succeed else 'unreachable'
+                  })
+        result = test_utils.call_until_true(ping, timeout, 1)
+        LOG.debug('%(caller)s finishes ping %(ip)s in %(timeout)s sec and the '
+                  'ping result is %(result)s', {
+                      'caller': caller, 'ip': ip_address, 'timeout': timeout,
+                      'result': 'expected' if result else 'unexpected'
+                  })
+        return result
diff --git a/neutron_tempest_plugin/scenario/test_dvr.py b/neutron_tempest_plugin/scenario/test_dvr.py
index 3da0694..b1cba5a 100644
--- a/neutron_tempest_plugin/scenario/test_dvr.py
+++ b/neutron_tempest_plugin/scenario/test_dvr.py
@@ -12,8 +12,8 @@
 #    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 utils
 from tempest.lib import decorators
-from tempest import test
 
 from neutron_lib import constants
 from neutron_tempest_plugin import config
@@ -49,7 +49,7 @@
     force_tenant_isolation = False
 
     @classmethod
-    @test.requires_ext(extension="dvr", service="network")
+    @utils.requires_ext(extension="dvr", service="network")
     def skip_checks(cls):
         super(NetworkDvrTest, cls).skip_checks()
 
diff --git a/neutron_tempest_plugin/scenario/test_floatingip.py b/neutron_tempest_plugin/scenario/test_floatingip.py
index 97bfcc5..5fcbdc0 100644
--- a/neutron_tempest_plugin/scenario/test_floatingip.py
+++ b/neutron_tempest_plugin/scenario/test_floatingip.py
@@ -14,10 +14,10 @@
 #    under the License.
 
 import netaddr
+from tempest.common import utils
 from tempest.common import waiters
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
-from tempest import test
 import testscenarios
 from testscenarios.scenarios import multiply_scenarios
 
@@ -37,7 +37,7 @@
     credentials = ['primary', 'admin']
 
     @classmethod
-    @test.requires_ext(extension="router", service="network")
+    @utils.requires_ext(extension="router", service="network")
     def resource_setup(cls):
         super(FloatingIpTestCasesMixin, cls).resource_setup()
         cls.network = cls.create_network()
@@ -47,7 +47,7 @@
         cls.keypair = cls.create_keypair()
 
         cls.secgroup = cls.os_primary.network_client.create_security_group(
-            name=data_utils.rand_name('secgroup-'))['security_group']
+            name=data_utils.rand_name('secgroup'))['security_group']
         cls.security_groups.append(cls.secgroup)
         cls.create_loginable_secgroup_rule(secgroup_id=cls.secgroup['id'])
         cls.create_pingable_secgroup_rule(secgroup_id=cls.secgroup['id'])
diff --git a/neutron_tempest_plugin/scenario/test_migration.py b/neutron_tempest_plugin/scenario/test_migration.py
index 291611c..62c3642 100644
--- a/neutron_tempest_plugin/scenario/test_migration.py
+++ b/neutron_tempest_plugin/scenario/test_migration.py
@@ -13,9 +13,14 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest.lib import decorators
-from tempest import test
+import functools
 
+from neutron_lib.api.definitions import portbindings as pb
+from neutron_lib import constants as const
+from tempest.common import utils
+from tempest.lib import decorators
+
+from neutron_tempest_plugin.common import utils as common_utils
 from neutron_tempest_plugin.scenario import base
 from neutron_tempest_plugin.scenario import test_dvr
 
@@ -26,8 +31,8 @@
     force_tenant_isolation = False
 
     @classmethod
-    @test.requires_ext(extension="dvr", service="network")
-    @test.requires_ext(extension="l3-ha", service="network")
+    @utils.requires_ext(extension="dvr", service="network")
+    @utils.requires_ext(extension="l3-ha", service="network")
     def skip_checks(cls):
         super(NetworkMigrationTestBase, cls).skip_checks()
 
@@ -36,12 +41,77 @@
         self.assertEqual(is_dvr, router['router']['distributed'])
         self.assertEqual(is_ha, router['router']['ha'])
 
+    def _wait_until_port_deleted(self, router_id, device_owner):
+        common_utils.wait_until_true(
+            functools.partial(
+                self._is_port_deleted,
+                router_id,
+                device_owner),
+            timeout=300, sleep=5)
+
+    def _is_port_deleted(self, router_id, device_owner):
+        ports = self.os_admin.network_client.list_ports(
+            device_id=router_id,
+            device_owner=device_owner)
+        return not ports.get('ports')
+
+    def _wait_until_port_ready(self, router_id, device_owner):
+        common_utils.wait_until_true(
+            functools.partial(
+                self._is_port_active,
+                router_id,
+                device_owner),
+            timeout=300, sleep=5)
+
+    def _is_port_active(self, router_id, device_owner):
+        ports = self.os_admin.network_client.list_ports(
+            device_id=router_id,
+            device_owner=device_owner,
+            status=const.ACTIVE).get('ports')
+        if ports:
+            if ports[0][pb.VIF_TYPE] not in [pb.VIF_TYPE_UNBOUND,
+                                             pb.VIF_TYPE_BINDING_FAILED]:
+                return True
+        return False
+
+    def _wait_until_router_ports_ready(self, router_id, dvr, ha):
+        if dvr:
+            self._wait_until_port_ready(
+                router_id, const.DEVICE_OWNER_DVR_INTERFACE)
+        if ha:
+            self._wait_until_port_ready(
+                router_id, const.DEVICE_OWNER_ROUTER_HA_INTF)
+            if dvr:
+                self._wait_until_port_ready(
+                    router_id, const.DEVICE_OWNER_ROUTER_SNAT)
+            else:
+                self._wait_until_port_ready(
+                    router_id, const.DEVICE_OWNER_HA_REPLICATED_INT)
+        self._wait_until_port_ready(
+            router_id, const.DEVICE_OWNER_ROUTER_GW)
+
+    def _wait_until_router_ports_migrated(
+            self, router_id, before_dvr, before_ha, after_dvr, after_ha):
+        if before_ha and not after_ha:
+            self._wait_until_port_deleted(
+                router_id, const.DEVICE_OWNER_ROUTER_HA_INTF)
+            self._wait_until_port_deleted(
+                    router_id, const.DEVICE_OWNER_HA_REPLICATED_INT)
+        if before_dvr and not after_dvr:
+            self._wait_until_port_deleted(
+                router_id, const.DEVICE_OWNER_DVR_INTERFACE)
+            self._wait_until_port_deleted(
+                router_id, const.DEVICE_OWNER_ROUTER_SNAT)
+        self._wait_until_router_ports_ready(router_id, after_dvr, after_ha)
+
     def _test_migration(self, before_dvr, before_ha, after_dvr, after_ha):
         router = self.create_router_by_client(
             distributed=before_dvr, ha=before_ha,
             tenant_id=self.client.tenant_id, is_admin=True)
 
         self.setup_network_and_server(router=router)
+        self._wait_until_router_ports_ready(
+            router['id'], before_dvr, before_ha)
         self._check_connectivity()
 
         self.os_admin.network_client.update_router(
@@ -52,6 +122,9 @@
 
         self.os_admin.network_client.update_router(
             router_id=router['id'], admin_state_up=True)
+
+        self._wait_until_router_ports_migrated(
+            router['id'], before_dvr, before_ha, after_dvr, after_ha)
         self._check_connectivity()
 
 
diff --git a/neutron_tempest_plugin/scenario/test_mtu.py b/neutron_tempest_plugin/scenario/test_mtu.py
new file mode 100644
index 0000000..9cbb4d8
--- /dev/null
+++ b/neutron_tempest_plugin/scenario/test_mtu.py
@@ -0,0 +1,134 @@
+# Copyright 2016 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 netaddr
+
+from neutron_lib.api.definitions import provider_net
+from tempest.common import utils
+from tempest.common import waiters
+from tempest.lib import decorators
+
+from neutron_tempest_plugin.common import ssh
+from neutron_tempest_plugin import config
+from neutron_tempest_plugin.scenario import base
+from neutron_tempest_plugin.scenario import constants
+
+CONF = config.CONF
+
+
+class NetworkMtuBaseTest(base.BaseTempestTestCase):
+    credentials = ['primary', 'admin']
+    servers = []
+    networks = []
+
+    @classmethod
+    def skip_checks(cls):
+        super(NetworkMtuBaseTest, cls).skip_checks()
+        if ("vxlan" not in
+                config.CONF.neutron_plugin_options.available_type_drivers
+            or "gre" not in
+                config.CONF.neutron_plugin_options.available_type_drivers):
+            raise cls.skipException("GRE or VXLAN type_driver is not enabled")
+
+    @classmethod
+    @utils.requires_ext(extension=provider_net.ALIAS, service="network")
+    def resource_setup(cls):
+        super(NetworkMtuBaseTest, cls).resource_setup()
+        # setup basic topology for servers we can log into it
+        cls.router = cls.create_router_by_client()
+        cls.keypair = cls.create_keypair()
+        cls.secgroup = cls.os_primary.network_client.create_security_group(
+            name='secgroup_mtu')
+        cls.security_groups.append(cls.secgroup['security_group'])
+        cls.create_loginable_secgroup_rule(
+            secgroup_id=cls.secgroup['security_group']['id'])
+        cls.create_pingable_secgroup_rule(
+            secgroup_id=cls.secgroup['security_group']['id'])
+
+    def _create_setup(self):
+        self.admin_client = self.os_admin.network_client
+        net_kwargs = {'tenant_id': self.client.tenant_id}
+        for sub, net_type in (
+                ('10.100.0.0/16', 'vxlan'), ('10.200.0.0/16', 'gre')):
+            net_kwargs['name'] = '-'.join([net_type, 'net'])
+            net_kwargs['provider:network_type'] = net_type
+            network = self.admin_client.create_network(**net_kwargs)[
+                'network']
+            self.networks.append(network)
+            self.addCleanup(self.admin_client.delete_network, network['id'])
+            cidr = netaddr.IPNetwork(sub)
+            subnet = self.create_subnet(network, cidr=cidr)
+            self.create_router_interface(self.router['id'], subnet['id'])
+            self.addCleanup(self.client.remove_router_interface_with_subnet_id,
+                            self.router['id'], subnet['id'])
+        # check that MTUs are different for 2 networks
+        self.assertNotEqual(self.networks[0]['mtu'], self.networks[1]['mtu'])
+        self.networks.sort(key=lambda net: net['mtu'])
+        server1, fip1 = self.create_pingable_vm(self.networks[0])
+        server_ssh_client1 = ssh.Client(
+            self.floating_ips[0]['floating_ip_address'],
+            CONF.validation.image_ssh_user,
+            pkey=self.keypair['private_key'])
+        server2, fip2 = self.create_pingable_vm(self.networks[1])
+        server_ssh_client2 = ssh.Client(
+            self.floating_ips[0]['floating_ip_address'],
+            CONF.validation.image_ssh_user,
+            pkey=self.keypair['private_key'])
+        for fip in (fip1, fip2):
+            self.check_connectivity(fip['floating_ip_address'],
+                                    CONF.validation.image_ssh_user,
+                                    self.keypair['private_key'])
+        return server_ssh_client1, fip1, server_ssh_client2, fip2
+
+    def create_pingable_vm(self, net):
+        server = self.create_server(
+            flavor_ref=CONF.compute.flavor_ref,
+            image_ref=CONF.compute.image_ref,
+            key_name=self.keypair['name'],
+            networks=[{'uuid': net['id']}],
+            security_groups=[{'name': self.secgroup[
+                'security_group']['name']}])
+        waiters.wait_for_server_status(
+            self.os_primary.servers_client, server['server']['id'],
+            constants.SERVER_STATUS_ACTIVE)
+        port = self.client.list_ports(
+            network_id=net['id'], device_id=server['server']['id'])['ports'][0]
+        fip = self.create_and_associate_floatingip(port['id'])
+        return server, fip
+
+    @decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a273d9d344')
+    def test_connectivity_min_max_mtu(self):
+        server_ssh_client, _, _, fip2 = self._create_setup()
+        # ping with min mtu of 2 networks succeeds even when
+        # fragmentation is disabled
+        self.check_remote_connectivity(
+            server_ssh_client, fip2['fixed_ip_address'],
+            mtu=self.networks[0]['mtu'], fragmentation=False)
+
+        # ping with the size above min mtu of 2 networks
+        # fails when fragmentation is disabled
+        self.check_remote_connectivity(
+            server_ssh_client, fip2['fixed_ip_address'], should_succeed=False,
+            mtu=self.networks[0]['mtu'] + 1, fragmentation=False)
+
+        # ping with max mtu of 2 networks succeeds when
+        # fragmentation is enabled
+        self.check_remote_connectivity(
+            server_ssh_client, fip2['fixed_ip_address'],
+            mtu=self.networks[1]['mtu'])
+
+        # ping with max mtu of 2 networks fails when fragmentation is disabled
+        self.check_remote_connectivity(
+            server_ssh_client, fip2['fixed_ip_address'], should_succeed=False,
+            mtu=self.networks[1]['mtu'], fragmentation=False)
diff --git a/neutron_tempest_plugin/scenario/test_qos.py b/neutron_tempest_plugin/scenario/test_qos.py
index d93f57f..67c00c2 100644
--- a/neutron_tempest_plugin/scenario/test_qos.py
+++ b/neutron_tempest_plugin/scenario/test_qos.py
@@ -16,13 +16,13 @@
 import socket
 import time
 
+from neutron_lib.services.qos import constants as qos_consts
 from oslo_log import log as logging
+from tempest.common import utils as tutils
 from tempest.lib import decorators
 from tempest.lib import exceptions
-from tempest import test
 
 from neutron_tempest_plugin.api import base as base_api
-from neutron_tempest_plugin.common import qos_consts
 from neutron_tempest_plugin.common import ssh
 from neutron_tempest_plugin.common import utils
 from neutron_tempest_plugin import config
@@ -80,7 +80,7 @@
     FILE_PATH = "/tmp/img"
 
     @classmethod
-    @test.requires_ext(extension="qos", service="network")
+    @tutils.requires_ext(extension="qos", service="network")
     @base_api.require_qos_rule_type(qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)
     def resource_setup(cls):
         super(QoSTest, cls).resource_setup()
@@ -154,9 +154,9 @@
                                 CONF.validation.image_ssh_user,
                                 pkey=self.keypair['private_key'])
         policy = self.os_admin.network_client.create_qos_policy(
-                                       name='test-policy',
-                                       description='test-qos-policy',
-                                       shared=True)
+                                        name='test-policy',
+                                        description='test-qos-policy',
+                                        shared=True)
         policy_id = policy['policy']['id']
         self.os_admin.network_client.create_bandwidth_limit_rule(
             policy_id, max_kbps=constants.LIMIT_KILO_BITS_PER_SECOND,
diff --git a/neutron_tempest_plugin/scenario/test_security_groups.py b/neutron_tempest_plugin/scenario/test_security_groups.py
new file mode 100644
index 0000000..faaeb84
--- /dev/null
+++ b/neutron_tempest_plugin/scenario/test_security_groups.py
@@ -0,0 +1,200 @@
+# Copyright 2016 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.
+from neutron_lib import constants
+
+from tempest.common import waiters
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from neutron_tempest_plugin.common import ssh
+from neutron_tempest_plugin import config
+from neutron_tempest_plugin.scenario import base
+from neutron_tempest_plugin.scenario import constants as const
+
+CONF = config.CONF
+
+
+class NetworkDefaultSecGroupTest(base.BaseTempestTestCase):
+    credentials = ['primary', 'admin']
+    required_extensions = ['router', 'security-group']
+
+    @classmethod
+    def resource_setup(cls):
+        super(NetworkDefaultSecGroupTest, cls).resource_setup()
+        # setup basic topology for servers we can log into it
+        cls.network = cls.create_network()
+        cls.subnet = cls.create_subnet(cls.network)
+        router = cls.create_router_by_client()
+        cls.create_router_interface(router['id'], cls.subnet['id'])
+        cls.keypair = cls.create_keypair()
+
+    def create_vm_testing_sec_grp(self, num_servers=2, security_groups=None):
+        servers, fips, server_ssh_clients = ([], [], [])
+        for i in range(num_servers):
+            servers.append(self.create_server(
+                flavor_ref=CONF.compute.flavor_ref,
+                image_ref=CONF.compute.image_ref,
+                key_name=self.keypair['name'],
+                networks=[{'uuid': self.network['id']}],
+                security_groups=security_groups))
+        for i, server in enumerate(servers):
+            waiters.wait_for_server_status(
+                self.os_primary.servers_client, server['server']['id'],
+                const.SERVER_STATUS_ACTIVE)
+            port = self.client.list_ports(
+                network_id=self.network['id'], device_id=server['server'][
+                    'id'])['ports'][0]
+            fips.append(self.create_and_associate_floatingip(port['id']))
+            server_ssh_clients.append(ssh.Client(
+                fips[i]['floating_ip_address'], CONF.validation.image_ssh_user,
+                pkey=self.keypair['private_key']))
+        return server_ssh_clients, fips, servers
+
+    @decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d764')
+    def test_default_sec_grp_scenarios(self):
+        server_ssh_clients, fips, _ = self.create_vm_testing_sec_grp()
+        # Check ssh connectivity when you add sec group rule, enabling ssh
+        self.create_loginable_secgroup_rule(
+            self.os_primary.network_client.list_security_groups()[
+                'security_groups'][0]['id']
+        )
+        self.check_connectivity(fips[0]['floating_ip_address'],
+                                CONF.validation.image_ssh_user,
+                                self.keypair['private_key'])
+
+        # make sure ICMP connectivity still fails as only ssh rule was added
+        self.ping_ip_address(fips[0]['floating_ip_address'],
+                             should_succeed=False)
+
+        # Check ICMP connectivity between VMs without specific rule for that
+        # It should work though the rule is not configured
+        self.check_remote_connectivity(
+            server_ssh_clients[0], fips[1]['fixed_ip_address'])
+
+        # Check ICMP connectivity from VM to external network
+        subnets = self.os_admin.network_client.list_subnets(
+            network_id=CONF.network.public_network_id)['subnets']
+        ext_net_ip = None
+        for subnet in subnets:
+            if subnet['ip_version'] == 4:
+                ext_net_ip = subnet['gateway_ip']
+                break
+        self.assertTrue(ext_net_ip)
+        self.check_remote_connectivity(server_ssh_clients[0], ext_net_ip)
+
+    @decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d864')
+    def test_protocol_number_rule(self):
+        # protocol number is added instead of str in security rule creation
+        server_ssh_clients, fips, _ = self.create_vm_testing_sec_grp(
+            num_servers=1)
+        self.ping_ip_address(fips[0]['floating_ip_address'],
+                             should_succeed=False)
+        rule_list = [{'protocol': constants.PROTO_NUM_ICMP,
+                      'direction': constants.INGRESS_DIRECTION,
+                      'remote_ip_prefix': '0.0.0.0/0'}]
+        secgroup_id = self.os_primary.network_client.list_security_groups()[
+            'security_groups'][0]['id']
+        self.create_secgroup_rules(rule_list, secgroup_id=secgroup_id)
+        self.ping_ip_address(fips[0]['floating_ip_address'])
+
+    @decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d964')
+    def test_two_sec_groups(self):
+        # add 2 sec groups to VM and test rules of both are working
+        ssh_secgrp_name = data_utils.rand_name('ssh_secgrp')
+        icmp_secgrp_name = data_utils.rand_name('icmp_secgrp')
+        ssh_secgrp = self.os_primary.network_client.create_security_group(
+            name=ssh_secgrp_name)
+        self.create_loginable_secgroup_rule(
+            secgroup_id=ssh_secgrp['security_group']['id'])
+        icmp_secgrp = self.os_primary.network_client.create_security_group(
+            name=icmp_secgrp_name)
+        self.create_pingable_secgroup_rule(
+            secgroup_id=icmp_secgrp['security_group']['id'])
+        for sec_grp in (ssh_secgrp, icmp_secgrp):
+            self.security_groups.append(sec_grp['security_group'])
+        security_groups_list = [{'name': ssh_secgrp_name},
+                                {'name': icmp_secgrp_name}]
+        server_ssh_clients, fips, servers = self.create_vm_testing_sec_grp(
+            num_servers=1, security_groups=security_groups_list)
+        # make sure ssh connectivity works
+        self.check_connectivity(fips[0]['floating_ip_address'],
+                                CONF.validation.image_ssh_user,
+                                self.keypair['private_key'])
+        # make sure ICMP connectivity works
+        self.ping_ip_address(fips[0]['floating_ip_address'],
+                             should_succeed=True)
+        ports = self.client.list_ports(device_id=servers[0]['server']['id'])
+        port_id = ports['ports'][0]['id']
+
+        # update port with ssh security group only
+        self.os_primary.network_client.update_port(
+            port_id, security_groups=[ssh_secgrp['security_group']['id']])
+
+        # make sure ssh connectivity works
+        self.check_connectivity(fips[0]['floating_ip_address'],
+                                CONF.validation.image_ssh_user,
+                                self.keypair['private_key'])
+
+        # make sure ICMP connectivity doesn't work
+        self.ping_ip_address(fips[0]['floating_ip_address'],
+                             should_succeed=False)
+
+        # update port with ssh and ICMP security groups
+        self.os_primary.network_client.update_port(
+            port_id, security_groups=[
+                icmp_secgrp['security_group']['id'],
+                ssh_secgrp['security_group']['id']])
+
+        # make sure ssh connectivity  works after update
+        self.check_connectivity(fips[0]['floating_ip_address'],
+                                CONF.validation.image_ssh_user,
+                                self.keypair['private_key'])
+
+        # make sure ICMP connectivity works after update
+        self.ping_ip_address(fips[0]['floating_ip_address'])
+
+    @decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d664')
+    def test_ip_prefix(self):
+        # Add specific remote prefix to VMs and check connectivity
+        ssh_secgrp_name = data_utils.rand_name('ssh_secgrp')
+        icmp_secgrp_name = data_utils.rand_name('icmp_secgrp_with_cidr')
+        cidr = self.subnet['cidr']
+        ssh_secgrp = self.os_primary.network_client.create_security_group(
+            name=ssh_secgrp_name)
+        self.create_loginable_secgroup_rule(
+            secgroup_id=ssh_secgrp['security_group']['id'])
+
+        rule_list = [{'protocol': constants.PROTO_NUM_ICMP,
+                      'direction': constants.INGRESS_DIRECTION,
+                      'remote_ip_prefix': cidr}]
+        icmp_secgrp = self.os_primary.network_client.create_security_group(
+            name=icmp_secgrp_name)
+        self.create_secgroup_rules(
+            rule_list, secgroup_id=icmp_secgrp['security_group']['id'])
+        for sec_grp in (ssh_secgrp, icmp_secgrp):
+            self.security_groups.append(sec_grp['security_group'])
+        security_groups_list = [{'name': ssh_secgrp_name},
+                                {'name': icmp_secgrp_name}]
+        server_ssh_clients, fips, servers = self.create_vm_testing_sec_grp(
+            security_groups=security_groups_list)
+
+        # make sure ssh connectivity works
+        self.check_connectivity(fips[0]['floating_ip_address'],
+                                CONF.validation.image_ssh_user,
+                                self.keypair['private_key'])
+
+        # make sure ICMP connectivity works
+        self.check_remote_connectivity(server_ssh_clients[0], fips[1][
+            'fixed_ip_address'])
diff --git a/neutron_tempest_plugin/scenario/test_trunk.py b/neutron_tempest_plugin/scenario/test_trunk.py
index 95906a0..0008b0a 100644
--- a/neutron_tempest_plugin/scenario/test_trunk.py
+++ b/neutron_tempest_plugin/scenario/test_trunk.py
@@ -14,10 +14,10 @@
 
 import netaddr
 from oslo_log import log as logging
+from tempest.common import utils as tutils
 from tempest.common import waiters
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
-from tempest import test
 import testtools
 
 from neutron_tempest_plugin.common import ssh
@@ -47,7 +47,7 @@
     force_tenant_isolation = False
 
     @classmethod
-    @test.requires_ext(extension="trunk", service="network")
+    @tutils.requires_ext(extension="trunk", service="network")
     def resource_setup(cls):
         super(TrunkTest, cls).resource_setup()
         # setup basic topology for servers we can log into
@@ -57,7 +57,7 @@
         cls.create_router_interface(router['id'], cls.subnet['id'])
         cls.keypair = cls.create_keypair()
         cls.secgroup = cls.os_primary.network_client.create_security_group(
-            name=data_utils.rand_name('secgroup-'))
+            name=data_utils.rand_name('secgroup'))
         cls.security_groups.append(cls.secgroup['security_group'])
         cls.create_loginable_secgroup_rule(
             secgroup_id=cls.secgroup['security_group']['id'])
