diff --git a/heat_tempest_plugin/config.py b/heat_tempest_plugin/config.py
index 6d2ead6..d658a98 100644
--- a/heat_tempest_plugin/config.py
+++ b/heat_tempest_plugin/config.py
@@ -122,9 +122,6 @@
                default=60,
                help="Timeout in seconds to wait for output from ssh "
                     "channel."),
-    cfg.IntOpt('tenant_network_mask_bits',
-               default=28,
-               help="The mask bits for tenant ipv4 subnets"),
     cfg.BoolOpt('skip_scenario_tests',
                 default=False,
                 help="Skip all scenario tests"),
@@ -153,15 +150,6 @@
                default=120,
                help="Timeout in seconds to wait for connectivity to "
                     "server."),
-    cfg.IntOpt('sighup_timeout',
-               default=120,
-               help="Timeout in seconds to wait for adding or removing child "
-                    "process after receiving of sighup signal"),
-    cfg.IntOpt('sighup_config_edit_retries',
-               default=10,
-               help='Count of retries to edit config file during sighup. If '
-                    'another worker already edit config file, file can be '
-                    'busy, so need to wait and try edit file again.'),
     cfg.StrOpt('heat_config_notify_script',
                default=('heat-config-notify'),
                help="Path to the script heat-config-notify"),
diff --git a/heat_tempest_plugin/tests/functional/test_admin_actions.py b/heat_tempest_plugin/tests/functional/test_admin_actions.py
deleted file mode 100644
index 757b03c..0000000
--- a/heat_tempest_plugin/tests/functional/test_admin_actions.py
+++ /dev/null
@@ -1,101 +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 heat_tempest_plugin.tests.functional import functional_base
-
-# Simple stack
-test_template = {
-    'heat_template_version': '2013-05-23',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1'
-            }
-        }
-    }
-}
-
-# Nested stack
-rsg_template = {
-    'heat_template_version': '2013-05-23',
-    'resources': {
-        'random_group': {
-            'type': 'OS::Heat::ResourceGroup',
-            'properties': {
-                'count': 2,
-                'resource_def': {
-                    'type': 'OS::Heat::RandomString',
-                    'properties': {
-                        'length': 30,
-                        'salt': 'initial'
-                    }
-                }
-            }
-        }
-    }
-}
-
-
-class AdminActionsTest(functional_base.FunctionalTestsBase):
-
-    def setUp(self):
-        super(AdminActionsTest, self).setUp()
-        if not self.conf.admin_username or not self.conf.admin_password:
-            self.skipTest('No admin creds found, skipping')
-
-    def create_stack_setup_admin_client(self, template=test_template):
-        # Create the stack with the default user
-        self.stack_identifier = self.stack_create(template=template)
-
-        # Setup admin clients
-        self.setup_clients_for_admin()
-
-    def test_admin_simple_stack_actions(self):
-        self.create_stack_setup_admin_client()
-
-        updated_template = test_template.copy()
-        props = updated_template['resources']['test1']['properties']
-        props['value'] = 'new_value'
-
-        # Update, suspend and resume stack
-        self.update_stack(self.stack_identifier,
-                          template=updated_template)
-        self.stack_suspend(self.stack_identifier)
-        self.stack_resume(self.stack_identifier)
-
-        # List stack resources
-        initial_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(self.stack_identifier))
-        # Delete stack
-        self._stack_delete(self.stack_identifier)
-
-    def test_admin_complex_stack_actions(self):
-        self.create_stack_setup_admin_client(template=rsg_template)
-
-        updated_template = rsg_template.copy()
-        props = updated_template['resources']['random_group']['properties']
-        props['count'] = 3
-
-        # Update, suspend and resume stack
-        self.update_stack(self.stack_identifier,
-                          template=updated_template)
-        self.stack_suspend(self.stack_identifier)
-        self.stack_resume(self.stack_identifier)
-
-        # List stack resources
-        resources = {'random_group': 'OS::Heat::ResourceGroup'}
-        self.assertEqual(resources,
-                         self.list_resources(self.stack_identifier))
-        # Delete stack
-        self._stack_delete(self.stack_identifier)
diff --git a/heat_tempest_plugin/tests/functional/test_autoscaling.py b/heat_tempest_plugin/tests/functional/test_autoscaling.py
deleted file mode 100644
index d266646..0000000
--- a/heat_tempest_plugin/tests/functional/test_autoscaling.py
+++ /dev/null
@@ -1,752 +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.
-
-import copy
-import json
-
-from heatclient import exc
-from oslo_log import log as logging
-import six
-from testtools import matchers
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-LOG = logging.getLogger(__name__)
-
-
-class AutoscalingGroupTest(functional_base.FunctionalTestsBase):
-
-    template = '''
-{
-  "AWSTemplateFormatVersion" : "2010-09-09",
-  "Description" : "Template to create multiple instances.",
-  "Parameters" : {"size": {"Type": "String", "Default": "1"},
-                  "AZ": {"Type": "String", "Default": "nova"},
-                  "image": {"Type": "String"},
-                  "flavor": {"Type": "String"},
-                  "user_data": {"Type": "String", "Default": "jsconfig data"}},
-  "Resources": {
-    "JobServerGroup": {
-      "Type" : "AWS::AutoScaling::AutoScalingGroup",
-      "Properties" : {
-        "AvailabilityZones" : [{"Ref": "AZ"}],
-        "LaunchConfigurationName" : { "Ref" : "JobServerConfig" },
-        "MinSize" : {"Ref": "size"},
-        "MaxSize" : "20"
-      }
-    },
-
-    "JobServerConfig" : {
-      "Type" : "AWS::AutoScaling::LaunchConfiguration",
-      "Metadata": {"foo": "bar"},
-      "Properties": {
-        "ImageId"           : {"Ref": "image"},
-        "InstanceType"      : {"Ref": "flavor"},
-        "SecurityGroups"    : [ "sg-1" ],
-        "UserData"          : {"Ref": "user_data"}
-      }
-    }
-  },
-  "Outputs": {
-    "InstanceList": {"Value": {
-      "Fn::GetAtt": ["JobServerGroup", "InstanceList"]}},
-    "JobServerConfigRef": {"Value": {
-      "Ref": "JobServerConfig"}}
-  }
-}
-'''
-
-    instance_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  ImageId: {type: string}
-  InstanceType: {type: string}
-  SecurityGroups: {type: comma_delimited_list}
-  UserData: {type: string}
-  Tags: {type: comma_delimited_list, default: "x,y"}
-
-resources:
-  random1:
-    type: OS::Heat::RandomString
-    properties:
-      salt: {get_param: UserData}
-outputs:
-  PublicIp: {value: {get_attr: [random1, value]}}
-  AvailabilityZone: {value: 'not-used11'}
-  PrivateDnsName: {value: 'not-used12'}
-  PublicDnsName: {value: 'not-used13'}
-  PrivateIp: {value: 'not-used14'}
-'''
-
-    # This is designed to fail.
-    bad_instance_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  ImageId: {type: string}
-  InstanceType: {type: string}
-  SecurityGroups: {type: comma_delimited_list}
-  UserData: {type: string}
-  Tags: {type: comma_delimited_list, default: "x,y"}
-
-resources:
-  random1:
-    type: OS::Heat::RandomString
-    depends_on: waiter
-  ready_poster:
-    type: AWS::CloudFormation::WaitConditionHandle
-  waiter:
-    type: AWS::CloudFormation::WaitCondition
-    properties:
-      Handle: {get_resource: ready_poster}
-      Timeout: 1
-outputs:
-  PublicIp:
-    value: {get_attr: [random1, value]}
-'''
-
-    def setUp(self):
-        super(AutoscalingGroupTest, self).setUp()
-        if not self.conf.minimal_image_ref:
-            raise self.skipException("No minimal image configured to test")
-        if not self.conf.instance_type:
-            raise self.skipException("No flavor configured to test")
-
-    def assert_instance_count(self, stack, expected_count):
-        inst_list = self._stack_output(stack, 'InstanceList')
-        self.assertEqual(expected_count, len(inst_list.split(',')))
-
-    def _assert_instance_state(self, nested_identifier,
-                               num_complete, num_failed):
-        for res in self.client.resources.list(nested_identifier):
-            if 'COMPLETE' in res.resource_status:
-                num_complete = num_complete - 1
-            elif 'FAILED' in res.resource_status:
-                num_failed = num_failed - 1
-        self.assertEqual(0, num_failed)
-        self.assertEqual(0, num_complete)
-
-
-class AutoscalingGroupBasicTest(AutoscalingGroupTest):
-
-    def test_basic_create_works(self):
-        """Make sure the working case is good.
-
-        Note this combines test_override_aws_ec2_instance into this test as
-        well, which is:
-        If AWS::EC2::Instance is overridden, AutoScalingGroup will
-        automatically use that overridden resource type.
-        """
-
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 4,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files, environment=env)
-        initial_resources = {
-            'JobServerConfig': 'AWS::AutoScaling::LaunchConfiguration',
-            'JobServerGroup': 'AWS::AutoScaling::AutoScalingGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 4)
-
-    def test_size_updates_work(self):
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 2,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files,
-                                             environment=env)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 2)
-
-        # Increase min size to 5
-        env2 = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-                'parameters': {'size': 5,
-                               'image': self.conf.minimal_image_ref,
-                               'flavor': self.conf.instance_type}}
-        self.update_stack(stack_identifier, self.template,
-                          environment=env2, files=files)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 5)
-
-    def test_update_group_replace(self):
-        """Test case for ensuring non-updatable props case a replacement.
-
-        Make sure that during a group update the non-updatable
-        properties cause a replacement.
-        """
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry':
-               {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': '1',
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files,
-                                             environment=env)
-        rsrc = self.client.resources.get(stack_identifier, 'JobServerGroup')
-        orig_asg_id = rsrc.physical_resource_id
-
-        env2 = {'resource_registry':
-                {'AWS::EC2::Instance': 'provider.yaml'},
-                'parameters': {'size': '1',
-                               'AZ': 'wibble',
-                               'image': self.conf.minimal_image_ref,
-                               'flavor': self.conf.instance_type,
-                               'user_data': 'new data'}}
-        self.update_stack(stack_identifier, self.template,
-                          environment=env2, files=files)
-
-        # replacement will cause the resource physical_resource_id to change.
-        rsrc = self.client.resources.get(stack_identifier, 'JobServerGroup')
-        self.assertNotEqual(orig_asg_id, rsrc.physical_resource_id)
-
-    def test_create_instance_error_causes_group_error(self):
-        """Test create failing a resource in the instance group.
-
-        If a resource in an instance group fails to be created, the instance
-        group itself will fail and the broken inner resource will remain.
-        """
-        stack_name = self._stack_rand_name()
-        files = {'provider.yaml': self.bad_instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 2,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        self.client.stacks.create(
-            stack_name=stack_name,
-            template=self.template,
-            files=files,
-            disable_rollback=True,
-            parameters={},
-            environment=env
-        )
-        self.addCleanup(self._stack_delete, stack_name)
-        stack = self.client.stacks.get(stack_name)
-        stack_identifier = '%s/%s' % (stack_name, stack.id)
-        self._wait_for_stack_status(stack_identifier, 'CREATE_FAILED')
-        initial_resources = {
-            'JobServerConfig': 'AWS::AutoScaling::LaunchConfiguration',
-            'JobServerGroup': 'AWS::AutoScaling::AutoScalingGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        self._assert_instance_state(nested_ident, 0, 2)
-
-    def test_update_instance_error_causes_group_error(self):
-        """Test update failing a resource in the instance group.
-
-        If a resource in an instance group fails to be created during an
-        update, the instance group itself will fail and the broken inner
-        resource will remain.
-        """
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 2,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files,
-                                             environment=env)
-        initial_resources = {
-            'JobServerConfig': 'AWS::AutoScaling::LaunchConfiguration',
-            'JobServerGroup': 'AWS::AutoScaling::AutoScalingGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 2)
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        self._assert_instance_state(nested_ident, 2, 0)
-        initial_list = [res.resource_name
-                        for res in self.client.resources.list(nested_ident)]
-
-        env['parameters']['size'] = 3
-        files2 = {'provider.yaml': self.bad_instance_template}
-        self.client.stacks.update(
-            stack_id=stack_identifier,
-            template=self.template,
-            files=files2,
-            disable_rollback=True,
-            parameters={},
-            environment=env
-        )
-        self._wait_for_stack_status(stack_identifier, 'UPDATE_FAILED')
-
-        # assert that there are 3 bad instances
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-
-        # 2 resources should be in update failed, and one create failed.
-        for res in self.client.resources.list(nested_ident):
-            if res.resource_name in initial_list:
-                self._wait_for_resource_status(nested_ident,
-                                               res.resource_name,
-                                               'UPDATE_FAILED')
-            else:
-                self._wait_for_resource_status(nested_ident,
-                                               res.resource_name,
-                                               'CREATE_FAILED')
-
-    def test_group_suspend_resume(self):
-
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 4,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files, environment=env)
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-
-        self.stack_suspend(stack_identifier)
-        self._wait_for_all_resource_status(nested_ident, 'SUSPEND_COMPLETE')
-
-        self.stack_resume(stack_identifier)
-        self._wait_for_all_resource_status(nested_ident, 'RESUME_COMPLETE')
-
-
-class AutoscalingGroupUpdatePolicyTest(AutoscalingGroupTest):
-
-    def ig_tmpl_with_updt_policy(self):
-        templ = json.loads(copy.deepcopy(self.template))
-        up = {"AutoScalingRollingUpdate": {
-            "MinInstancesInService": "1",
-            "MaxBatchSize": "2",
-            "PauseTime": "PT1S"}}
-        templ['Resources']['JobServerGroup']['UpdatePolicy'] = up
-        return templ
-
-    def update_instance_group(self, updt_template,
-                              num_updates_expected_on_updt,
-                              num_creates_expected_on_updt,
-                              num_deletes_expected_on_updt):
-
-        # setup stack from the initial template
-        files = {'provider.yaml': self.instance_template}
-        size = 10
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': size,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-        stack_name = self._stack_rand_name()
-        stack_identifier = self.stack_create(
-            stack_name=stack_name,
-            template=self.ig_tmpl_with_updt_policy(),
-            files=files,
-            environment=env)
-        stack = self.client.stacks.get(stack_identifier)
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-
-        # test that physical resource name of launch configuration is used
-        conf_name = self._stack_output(stack, 'JobServerConfigRef')
-        conf_name_pattern = '%s-JobServerConfig-[a-zA-Z0-9]+$' % stack_name
-        self.assertThat(conf_name,
-                        matchers.MatchesRegex(conf_name_pattern))
-
-        # test the number of instances created
-        self.assert_instance_count(stack, size)
-        # saves info from initial list of instances for comparison later
-        init_instances = self.client.resources.list(nested_ident)
-        init_names = [inst.resource_name for inst in init_instances]
-
-        # test stack update
-        self.update_stack(stack_identifier, updt_template,
-                          environment=env, files=files)
-        updt_stack = self.client.stacks.get(stack_identifier)
-
-        # test that the launch configuration is replaced
-        updt_conf_name = self._stack_output(updt_stack, 'JobServerConfigRef')
-        self.assertThat(updt_conf_name,
-                        matchers.MatchesRegex(conf_name_pattern))
-        self.assertNotEqual(conf_name, updt_conf_name)
-
-        # test that the group size are the same
-        updt_instances = self.client.resources.list(nested_ident)
-        updt_names = [inst.resource_name for inst in updt_instances]
-        self.assertEqual(len(init_names), len(updt_names))
-        for res in updt_instances:
-            self.assertEqual('UPDATE_COMPLETE', res.resource_status)
-
-        # test that the appropriate number of instance names are the same
-        matched_names = set(updt_names) & set(init_names)
-        self.assertEqual(num_updates_expected_on_updt, len(matched_names))
-
-        # test that the appropriate number of new instances are created
-        self.assertEqual(num_creates_expected_on_updt,
-                         len(set(updt_names) - set(init_names)))
-
-        # test that the appropriate number of instances are deleted
-        self.assertEqual(num_deletes_expected_on_updt,
-                         len(set(init_names) - set(updt_names)))
-
-        # test that the older instances are the ones being deleted
-        if num_deletes_expected_on_updt > 0:
-            deletes_expected = init_names[:num_deletes_expected_on_updt]
-            self.assertNotIn(deletes_expected, updt_names)
-
-    def test_instance_group_update_replace(self):
-        """Test simple update replace.
-
-        Test update replace with no conflict in batch size and minimum
-        instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        grp = updt_template['Resources']['JobServerGroup']
-        policy = grp['UpdatePolicy']['AutoScalingRollingUpdate']
-        policy['MinInstancesInService'] = '1'
-        policy['MaxBatchSize'] = '3'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=10,
-                                   num_creates_expected_on_updt=0,
-                                   num_deletes_expected_on_updt=0)
-
-    def test_instance_group_update_replace_with_adjusted_capacity(self):
-        """Test update replace with capacity adjustment.
-
-        Test update replace with capacity adjustment due to conflict in batch
-        size and minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        grp = updt_template['Resources']['JobServerGroup']
-        policy = grp['UpdatePolicy']['AutoScalingRollingUpdate']
-        policy['MinInstancesInService'] = '8'
-        policy['MaxBatchSize'] = '4'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=8,
-                                   num_creates_expected_on_updt=2,
-                                   num_deletes_expected_on_updt=2)
-
-    def test_instance_group_update_replace_huge_batch_size(self):
-        """Test update replace with a huge batch size."""
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['AutoScalingRollingUpdate']
-        policy['MinInstancesInService'] = '0'
-        policy['MaxBatchSize'] = '20'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=10,
-                                   num_creates_expected_on_updt=0,
-                                   num_deletes_expected_on_updt=0)
-
-    def test_instance_group_update_replace_huge_min_in_service(self):
-        """Update replace with huge number of minimum instances in service."""
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['AutoScalingRollingUpdate']
-        policy['MinInstancesInService'] = '20'
-        policy['MaxBatchSize'] = '1'
-        policy['PauseTime'] = 'PT0S'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=9,
-                                   num_creates_expected_on_updt=1,
-                                   num_deletes_expected_on_updt=1)
-
-    def test_instance_group_update_no_replace(self):
-        """Test simple update only and no replace.
-
-        Test simple update only and no replace (i.e. updated instance flavor
-        in Launch Configuration) with no conflict in batch size and
-        minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['AutoScalingRollingUpdate']
-        policy['MinInstancesInService'] = '1'
-        policy['MaxBatchSize'] = '3'
-        policy['PauseTime'] = 'PT0S'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['InstanceType'] = self.conf.minimal_instance_type
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=10,
-                                   num_creates_expected_on_updt=0,
-                                   num_deletes_expected_on_updt=0)
-
-    def test_instance_group_update_no_replace_with_adjusted_capacity(self):
-        """Test update only and no replace with capacity adjustment.
-
-        Test update only and no replace (i.e. updated instance flavor in
-        Launch Configuration) with capacity adjustment due to conflict in
-        batch size and minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['AutoScalingRollingUpdate']
-        policy['MinInstancesInService'] = '8'
-        policy['MaxBatchSize'] = '4'
-        policy['PauseTime'] = 'PT0S'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['InstanceType'] = self.conf.minimal_instance_type
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=8,
-                                   num_creates_expected_on_updt=2,
-                                   num_deletes_expected_on_updt=2)
-
-
-class AutoScalingSignalTest(AutoscalingGroupTest):
-
-    template = '''
-{
-  "AWSTemplateFormatVersion" : "2010-09-09",
-  "Description" : "Template to create multiple instances.",
-  "Parameters" : {"size": {"Type": "String", "Default": "1"},
-                  "AZ": {"Type": "String", "Default": "nova"},
-                  "image": {"Type": "String"},
-                  "flavor": {"Type": "String"}},
-  "Resources": {
-    "custom_lb": {
-      "Type": "AWS::EC2::Instance",
-      "Properties": {
-        "ImageId": {"Ref": "image"},
-        "InstanceType": {"Ref": "flavor"},
-        "UserData": "foo",
-        "SecurityGroups": [ "sg-1" ],
-        "Tags": []
-      },
-      "Metadata": {
-        "IPs": {"Fn::GetAtt": ["JobServerGroup", "InstanceList"]}
-      }
-    },
-    "JobServerGroup": {
-      "Type" : "AWS::AutoScaling::AutoScalingGroup",
-      "Properties" : {
-        "AvailabilityZones" : [{"Ref": "AZ"}],
-        "LaunchConfigurationName" : { "Ref" : "JobServerConfig" },
-        "DesiredCapacity" : {"Ref": "size"},
-        "MinSize" : "0",
-        "MaxSize" : "20"
-      }
-    },
-    "JobServerConfig" : {
-      "Type" : "AWS::AutoScaling::LaunchConfiguration",
-      "Metadata": {"foo": "bar"},
-      "Properties": {
-        "ImageId"           : {"Ref": "image"},
-        "InstanceType"      : {"Ref": "flavor"},
-        "SecurityGroups"    : [ "sg-1" ],
-        "UserData"          : "jsconfig data"
-      }
-    },
-    "ScaleUpPolicy" : {
-      "Type" : "AWS::AutoScaling::ScalingPolicy",
-      "Properties" : {
-        "AdjustmentType" : "ChangeInCapacity",
-        "AutoScalingGroupName" : { "Ref" : "JobServerGroup" },
-        "Cooldown" : "0",
-        "ScalingAdjustment": "1"
-      }
-    },
-    "ScaleDownPolicy" : {
-      "Type" : "AWS::AutoScaling::ScalingPolicy",
-      "Properties" : {
-        "AdjustmentType" : "ChangeInCapacity",
-        "AutoScalingGroupName" : { "Ref" : "JobServerGroup" },
-        "Cooldown" : "0",
-        "ScalingAdjustment" : "-2"
-      }
-    }
-  },
-  "Outputs": {
-    "InstanceList": {"Value": {
-      "Fn::GetAtt": ["JobServerGroup", "InstanceList"]}}
-  }
-}
-'''
-
-    lb_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  ImageId: {type: string}
-  InstanceType: {type: string}
-  SecurityGroups: {type: comma_delimited_list}
-  UserData: {type: string}
-  Tags: {type: comma_delimited_list, default: "x,y"}
-
-resources:
-outputs:
-  PublicIp: {value: "not-used"}
-  AvailabilityZone: {value: 'not-used1'}
-  PrivateDnsName: {value: 'not-used2'}
-  PublicDnsName: {value: 'not-used3'}
-  PrivateIp: {value: 'not-used4'}
-
-'''
-
-    def setUp(self):
-        super(AutoScalingSignalTest, self).setUp()
-        self.build_timeout = self.conf.build_timeout
-        self.build_interval = self.conf.build_interval
-        self.files = {'provider.yaml': self.instance_template,
-                      'lb.yaml': self.lb_template}
-        self.env = {'resource_registry':
-                    {'resources':
-                     {'custom_lb': {'AWS::EC2::Instance': 'lb.yaml'}},
-                     'AWS::EC2::Instance': 'provider.yaml'},
-                    'parameters': {'size': 2,
-                                   'image': self.conf.minimal_image_ref,
-                                   'flavor': self.conf.instance_type}}
-
-    def check_instance_count(self, stack_identifier, expected):
-        md = self.client.resources.metadata(stack_identifier, 'custom_lb')
-        actual_md = len(md['IPs'].split(','))
-        if actual_md != expected:
-            LOG.warning('check_instance_count exp:%d, meta:%s' % (expected,
-                                                                  md['IPs']))
-            return False
-
-        stack = self.client.stacks.get(stack_identifier)
-        inst_list = self._stack_output(stack, 'InstanceList')
-        actual = len(inst_list.split(','))
-        if actual != expected:
-            LOG.warning('check_instance_count exp:%d, act:%s' % (expected,
-                                                                 inst_list))
-        return actual == expected
-
-    def test_scaling_meta_update(self):
-        """Use heatclient to signal the up and down policy.
-
-        Then confirm that the metadata in the custom_lb is updated each
-        time.
-        """
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=self.files,
-                                             environment=self.env)
-
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 2))
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        # Scale up one, Trigger alarm
-        self.client.resources.signal(stack_identifier, 'ScaleUpPolicy')
-        self._wait_for_stack_status(nested_ident, 'UPDATE_COMPLETE')
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 3))
-
-        # Scale down two, Trigger alarm
-        self.client.resources.signal(stack_identifier, 'ScaleDownPolicy')
-        self._wait_for_stack_status(nested_ident, 'UPDATE_COMPLETE')
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 1))
-
-    def test_signal_with_policy_update(self):
-        """Prove that an updated policy is used in the next signal."""
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=self.files,
-                                             environment=self.env)
-
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 2))
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        # Scale up one, Trigger alarm
-        self.client.resources.signal(stack_identifier, 'ScaleUpPolicy')
-        self._wait_for_stack_status(nested_ident, 'UPDATE_COMPLETE')
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 3))
-
-        # increase the adjustment to "+2" and remove the DesiredCapacity
-        # so we don't go from 3 to 2.
-        new_template = self.template.replace(
-            '"ScalingAdjustment": "1"',
-            '"ScalingAdjustment": "2"').replace(
-                '"DesiredCapacity" : {"Ref": "size"},', '')
-
-        self.update_stack(stack_identifier, template=new_template,
-                          environment=self.env, files=self.files)
-
-        # Scale up two, Trigger alarm
-        self.client.resources.signal(stack_identifier, 'ScaleUpPolicy')
-        self._wait_for_stack_status(nested_ident, 'UPDATE_COMPLETE')
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 5))
-
-    def test_signal_during_suspend(self):
-        """Prove that a signal will fail when the stack is in suspend."""
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=self.files,
-                                             environment=self.env)
-
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 2))
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-
-        # suspend the top level stack.
-        self.client.actions.suspend(stack_id=stack_identifier)
-
-        # Wait for stack to reach SUSPEND_COMPLETE
-        self._wait_for_stack_status(stack_identifier, 'SUSPEND_COMPLETE')
-
-        # Send a signal and an exception will raise
-        ex = self.assertRaises(exc.BadRequest,
-                               self.client.resources.signal,
-                               stack_identifier, 'ScaleUpPolicy')
-
-        error_msg = 'Signal resource during SUSPEND is not supported'
-        self.assertIn(error_msg, six.text_type(ex))
-        ev = self.wait_for_event_with_reason(
-            stack_identifier,
-            reason='Cannot signal resource during SUSPEND',
-            rsrc_name='ScaleUpPolicy')
-        self.assertEqual('SUSPEND_COMPLETE', ev[0].resource_status)
-
-        # still SUSPEND_COMPLETE (not gone to UPDATE_COMPLETE)
-        self._wait_for_stack_status(nested_ident, 'SUSPEND_COMPLETE')
-        self._wait_for_stack_status(stack_identifier, 'SUSPEND_COMPLETE')
-        # still 2 instances.
-        self.assertTrue(test.call_until_true(
-            self.build_timeout, self.build_interval,
-            self.check_instance_count, stack_identifier, 2))
diff --git a/heat_tempest_plugin/tests/functional/test_aws_stack.py b/heat_tempest_plugin/tests/functional/test_aws_stack.py
deleted file mode 100644
index 03beb1f..0000000
--- a/heat_tempest_plugin/tests/functional/test_aws_stack.py
+++ /dev/null
@@ -1,201 +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.
-
-import hashlib
-import json
-import random
-
-from six.moves.urllib import parse
-from swiftclient import utils as swiftclient_utils
-import yaml
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class AwsStackTest(functional_base.FunctionalTestsBase):
-    test_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: AWS::CloudFormation::Stack
-    Properties:
-      TemplateURL: the.yaml
-      Parameters:
-        KeyName: foo
-Outputs:
-  output_foo:
-    Value: {"Fn::GetAtt": [the_nested, Outputs.Foo]}
-'''
-
-    nested_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  KeyName:
-    Type: String
-Outputs:
-  Foo:
-    Value: bar
-'''
-
-    update_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  KeyName:
-    Type: String
-Outputs:
-  Foo:
-    Value: foo
-'''
-
-    nested_with_res_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  KeyName:
-    Type: String
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-Outputs:
-  Foo:
-    Value: {"Fn::GetAtt": [NestedResource, value]}
-'''
-
-    def setUp(self):
-        super(AwsStackTest, self).setUp()
-        if not self.is_service_available('object-store'):
-            self.skipTest('object-store service not available, skipping')
-        self.object_container_name = test.rand_name()
-        self.project_id = self.identity_client.project_id
-        self.swift_key = hashlib.sha224(
-            str(random.getrandbits(256)).encode('ascii')).hexdigest()[:32]
-        key_header = 'x-container-meta-temp-url-key'
-        self.object_client.put_container(self.object_container_name,
-                                         {key_header: self.swift_key})
-        self.addCleanup(self.object_client.delete_container,
-                        self.object_container_name)
-
-    def publish_template(self, contents, cleanup=True):
-        oc = self.object_client
-
-        # post the object
-        oc.put_object(self.object_container_name, 'template.yaml', contents)
-        if cleanup:
-            self.addCleanup(oc.delete_object,
-                            self.object_container_name,
-                            'template.yaml')
-        path = '/v1/AUTH_%s/%s/%s' % (self.project_id,
-                                      self.object_container_name,
-                                      'template.yaml')
-        timeout = self.conf.build_timeout * 10
-        tempurl = swiftclient_utils.generate_temp_url(path, timeout,
-                                                      self.swift_key, 'GET')
-        sw_url = parse.urlparse(oc.url)
-        return '%s://%s%s' % (sw_url.scheme, sw_url.netloc, tempurl)
-
-    def test_nested_stack_create(self):
-        url = self.publish_template(self.nested_template)
-        self.template = self.test_template.replace('the.yaml', url)
-        stack_identifier = self.stack_create(template=self.template)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_resource_is_a_stack(stack_identifier, 'the_nested')
-        self.assertEqual('bar', self._stack_output(stack, 'output_foo'))
-
-    def test_nested_stack_create_with_timeout(self):
-        url = self.publish_template(self.nested_template)
-        self.template = self.test_template.replace('the.yaml', url)
-        timeout_template = yaml.safe_load(self.template)
-        props = timeout_template['Resources']['the_nested']['Properties']
-        props['TimeoutInMinutes'] = '50'
-
-        stack_identifier = self.stack_create(
-            template=timeout_template)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_resource_is_a_stack(stack_identifier, 'the_nested')
-        self.assertEqual('bar', self._stack_output(stack, 'output_foo'))
-
-    def test_nested_stack_adopt_ok(self):
-        url = self.publish_template(self.nested_with_res_template)
-        self.template = self.test_template.replace('the.yaml', url)
-        adopt_data = {
-            "resources": {
-                "the_nested": {
-                    "resource_id": "test-res-id",
-                    "resources": {
-                        "NestedResource": {
-                            "type": "OS::Heat::RandomString",
-                            "resource_id": "test-nested-res-id",
-                            "resource_data": {"value": "goopie"}
-                        }
-                    }
-                }
-            },
-            "environment": {"parameters": {}},
-            "template": yaml.safe_load(self.template)
-        }
-
-        stack_identifier = self.stack_adopt(adopt_data=json.dumps(adopt_data))
-
-        self.assert_resource_is_a_stack(stack_identifier, 'the_nested')
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual('goopie', self._stack_output(stack, 'output_foo'))
-
-    def test_nested_stack_adopt_fail(self):
-        url = self.publish_template(self.nested_with_res_template)
-        self.template = self.test_template.replace('the.yaml', url)
-        adopt_data = {
-            "resources": {
-                "the_nested": {
-                    "resource_id": "test-res-id",
-                    "resources": {
-                    }
-                }
-            },
-            "environment": {"parameters": {}},
-            "template": yaml.safe_load(self.template)
-        }
-
-        stack_identifier = self.stack_adopt(adopt_data=json.dumps(adopt_data),
-                                            wait_for_status='ADOPT_FAILED')
-        rsrc = self.client.resources.get(stack_identifier, 'the_nested')
-        self.assertEqual('ADOPT_FAILED', rsrc.resource_status)
-
-    def test_nested_stack_update(self):
-        url = self.publish_template(self.nested_template)
-        self.template = self.test_template.replace('the.yaml', url)
-        stack_identifier = self.stack_create(template=self.template)
-        original_nested_id = self.assert_resource_is_a_stack(
-            stack_identifier, 'the_nested')
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual('bar', self._stack_output(stack, 'output_foo'))
-
-        new_template = yaml.safe_load(self.template)
-        props = new_template['Resources']['the_nested']['Properties']
-        props['TemplateURL'] = self.publish_template(self.update_template,
-                                                     cleanup=False)
-
-        self.update_stack(stack_identifier, new_template)
-
-        # Expect the physical resource name staying the same after update,
-        # so that the nested was actually updated instead of replaced.
-        new_nested_id = self.assert_resource_is_a_stack(
-            stack_identifier, 'the_nested')
-        self.assertEqual(original_nested_id, new_nested_id)
-        updt_stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual('foo', self._stack_output(updt_stack, 'output_foo'))
-
-    def test_nested_stack_suspend_resume(self):
-        url = self.publish_template(self.nested_template)
-        self.template = self.test_template.replace('the.yaml', url)
-        stack_identifier = self.stack_create(template=self.template)
-        self.stack_suspend(stack_identifier)
-        self.stack_resume(stack_identifier)
diff --git a/heat_tempest_plugin/tests/functional/test_cancel_update.py b/heat_tempest_plugin/tests/functional/test_cancel_update.py
deleted file mode 100644
index 4a8938a..0000000
--- a/heat_tempest_plugin/tests/functional/test_cancel_update.py
+++ /dev/null
@@ -1,61 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-class CancelUpdateTest(functional_base.FunctionalTestsBase):
-
-    template = '''
-heat_template_version: '2013-05-23'
-parameters:
- InstanceType:
-   type: string
- ImageId:
-   type: string
- network:
-   type: string
-resources:
- port:
-   type: OS::Neutron::Port
-   properties:
-     network: {get_param: network}
- Server:
-   type: OS::Nova::Server
-   properties:
-     flavor_update_policy: REPLACE
-     image: {get_param: ImageId}
-     flavor: {get_param: InstanceType}
-     networks:
-       - port: {get_resource: port}
-'''
-
-    def setUp(self):
-        super(CancelUpdateTest, self).setUp()
-        if not self.conf.minimal_image_ref:
-            raise self.skipException("No minimal image configured to test")
-        if not self.conf.minimal_instance_type:
-            raise self.skipException("No minimal flavor configured to test.")
-
-    def test_cancel_update_server_with_port(self):
-        parameters = {'InstanceType': self.conf.minimal_instance_type,
-                      'ImageId': self.conf.minimal_image_ref,
-                      'network': self.conf.fixed_network_name}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             parameters=parameters)
-        parameters['InstanceType'] = self.conf.instance_type
-        self.update_stack(stack_identifier, self.template,
-                          parameters=parameters,
-                          expected_status='UPDATE_IN_PROGRESS')
-
-        self.cancel_update_stack(stack_identifier)
diff --git a/heat_tempest_plugin/tests/functional/test_conditional_exposure.py b/heat_tempest_plugin/tests/functional/test_conditional_exposure.py
deleted file mode 100644
index dd4329b..0000000
--- a/heat_tempest_plugin/tests/functional/test_conditional_exposure.py
+++ /dev/null
@@ -1,157 +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 heatclient import exc
-import keystoneclient
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class ServiceBasedExposureTest(functional_base.FunctionalTestsBase):
-    # NOTE(pas-ha) if we ever decide to install Sahara on Heat
-    # functional gate, this must be changed to other not-installed
-    # but in principle supported service
-    unavailable_service = 'Sahara'
-    unavailable_template = """
-heat_template_version: 2015-10-15
-parameters:
-  instance_type:
-    type: string
-resources:
-  not_available:
-    type: OS::Sahara::NodeGroupTemplate
-    properties:
-      plugin_name: fake
-      hadoop_version: 0.1
-      flavor: {get_param: instance_type}
-      node_processes: []
-"""
-
-    def setUp(self):
-        super(ServiceBasedExposureTest, self).setUp()
-        # check that Sahara endpoint is available
-        if self._is_sahara_deployed():
-            self.skipTest("Sahara is actually deployed, "
-                          "can not run negative tests on "
-                          "Sahara resources availability.")
-
-    def _is_sahara_deployed(self):
-        try:
-            self.identity_client.get_endpoint_url('data-processing',
-                                                  self.conf.region)
-        except keystoneclient.exceptions.EndpointNotFound:
-            return False
-        return True
-
-    def test_unavailable_resources_not_listed(self):
-        resources = self.client.resource_types.list()
-        self.assertFalse(any(self.unavailable_service in r.resource_type
-                             for r in resources))
-
-    def test_unavailable_resources_not_created(self):
-        stack_name = self._stack_rand_name()
-        parameters = {'instance_type': self.conf.minimal_instance_type}
-        ex = self.assertRaises(exc.HTTPBadRequest,
-                               self.client.stacks.create,
-                               stack_name=stack_name,
-                               parameters=parameters,
-                               template=self.unavailable_template)
-        self.assertIn('ResourceTypeUnavailable', ex.message.decode('utf-8'))
-        self.assertIn('OS::Sahara::NodeGroupTemplate',
-                      ex.message.decode('utf-8'))
-
-
-class RoleBasedExposureTest(functional_base.FunctionalTestsBase):
-
-    fl_tmpl = """
-heat_template_version: 2015-10-15
-
-resources:
-  not4everyone:
-    type: OS::Nova::Flavor
-    properties:
-      ram: 20000
-      vcpus: 10
-"""
-
-    cvt_tmpl = """
-heat_template_version: 2015-10-15
-
-resources:
-  cvt:
-    type: OS::Cinder::VolumeType
-    properties:
-      name: cvt_test
-"""
-
-    host_aggr_tmpl = """
-heat_template_version: 2015-10-15
-parameters:
-  az:
-    type: string
-    default: nova
-resources:
-  cvt:
-    type: OS::Nova::HostAggregate
-    properties:
-      name: aggregate_test
-      availability_zone: {get_param: az}
-"""
-
-    scenarios = [
-        ('r_nova_flavor', dict(
-            stack_name='s_nova_flavor',
-            template=fl_tmpl,
-            forbidden_r_type="OS::Nova::Flavor",
-            test_creation=True)),
-        ('r_nova_host_aggregate', dict(
-            stack_name='s_nova_ost_aggregate',
-            template=host_aggr_tmpl,
-            forbidden_r_type="OS::Nova::HostAggregate",
-            test_creation=True)),
-        ('r_cinder_vtype', dict(
-            stack_name='s_cinder_vtype',
-            template=cvt_tmpl,
-            forbidden_r_type="OS::Cinder::VolumeType",
-            test_creation=True)),
-        ('r_cinder_vtype_encrypt', dict(
-            forbidden_r_type="OS::Cinder::EncryptedVolumeType",
-            test_creation=False)),
-        ('r_neutron_qos', dict(
-            forbidden_r_type="OS::Neutron::QoSPolicy",
-            test_creation=False)),
-        ('r_neutron_qos_bandwidth_limit', dict(
-            forbidden_r_type="OS::Neutron::QoSBandwidthLimitRule",
-            test_creation=False)),
-        ('r_manila_share_type', dict(
-            forbidden_r_type="OS::Manila::ShareType",
-            test_creation=False))
-    ]
-
-    def test_non_admin_forbidden_create_resources(self):
-        """Fail to create resource w/o admin role.
-
-        Integration tests job runs as normal OpenStack user,
-        and the resources above are configured to require
-        admin role in default policy file of Heat.
-        """
-        if self.test_creation:
-            ex = self.assertRaises(exc.Forbidden,
-                                   self.client.stacks.create,
-                                   stack_name=self.stack_name,
-                                   template=self.template)
-            self.assertIn(self.forbidden_r_type, ex.message.decode('utf-8'))
-
-    def test_forbidden_resource_not_listed(self):
-        resources = self.client.resource_types.list()
-        self.assertNotIn(self.forbidden_r_type,
-                         (r.resource_type for r in resources))
diff --git a/heat_tempest_plugin/tests/functional/test_conditions.py b/heat_tempest_plugin/tests/functional/test_conditions.py
deleted file mode 100644
index 106a4ca..0000000
--- a/heat_tempest_plugin/tests/functional/test_conditions.py
+++ /dev/null
@@ -1,619 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-cfn_template = '''
-AWSTemplateFormatVersion: 2010-09-09
-Parameters:
-  env_type:
-    Default: test
-    Type: String
-    AllowedValues: [prod, test]
-  zone:
-    Type: String
-    Default: beijing
-Conditions:
-  Prod: {"Fn::Equals" : [{Ref: env_type}, "prod"]}
-  Test:
-    Fn::Not:
-    - Fn::Equals:
-      - Ref: env_type
-      - prod
-  Beijing_Prod:
-    Fn::And:
-    - Fn::Equals:
-      - Ref: env_type
-      - prod
-    - Fn::Equals:
-      - Ref: zone
-      - beijing
-  Xian_Zone:
-    Fn::Equals:
-    - Ref: zone
-    - xian
-  Xianyang_Zone:
-    Fn::Equals:
-    - Ref: zone
-    - xianyang
-  Fujian_Zone:
-    Fn::Or:
-    - Fn::Equals:
-      - Ref: zone
-      - fuzhou
-    - Fn::Equals:
-      - Ref: zone
-      - xiamen
-  Fujian_Prod:
-    Fn::And:
-    - Fujian_Zone
-    - Prod
-  Shannxi_Provice:
-    Fn::Or:
-    - Xian_Zone
-    - Xianyang_Zone
-  Not_Shannxi:
-    Fn::Not: [Shannxi_Provice]
-Resources:
-  test_res:
-    Type: OS::Heat::TestResource
-    Properties:
-      value: {"Fn::If": ["Prod", "env_is_prod", "env_is_test"]}
-  prod_res:
-    Type: OS::Heat::TestResource
-    Properties:
-      value: prod_res
-    Condition: Prod
-  test_res1:
-    Type: OS::Heat::TestResource
-    Properties:
-      value: just in test env
-    Condition: Test
-  beijing_prod_res:
-    Type: OS::Heat::TestResource
-    Properties:
-      value: beijing_prod_res
-    Condition: Beijing_Prod
-  fujian_res:
-    Type: OS::Heat::TestResource
-    Condition: Fujian_Zone
-    Properties:
-      value: fujian_res
-  fujian_prod_res:
-    Type: OS::Heat::TestResource
-    Condition: Fujian_Prod
-    Properties:
-      value: fujian_prod_res
-  shannxi_res:
-    Type: OS::Heat::TestResource
-    Condition: Shannxi_Provice
-    Properties:
-      value: shannxi_res
-  not_shannxi_res:
-    Type: OS::Heat::TestResource
-    Condition: Not_Shannxi
-    Properties:
-      value: not_shannxi_res
-Outputs:
-  res_value:
-    Value: {"Fn::GetAtt": [prod_res, output]}
-    Condition: Prod
-  test_res_value:
-    Value: {"Fn::GetAtt": [test_res, output]}
-  prod_resource:
-    Value: {"Fn::If": [Prod, {Ref: prod_res}, 'no_prod_res']}
-  test_res1_value:
-    Value: {"Fn::If": [Test, {"Fn::GetAtt": [test_res1, output]},
-                       'no_test_res1']}
-  beijing_prod_res:
-    Value: {"Fn::If": [Beijing_Prod, {Ref: beijing_prod_res}, 'no_prod_res']}
-'''
-
-hot_template = '''
-heat_template_version: 2016-10-14
-parameters:
-  env_type:
-    default: test
-    type: string
-    constraints:
-      - allowed_values: [prod, test]
-  zone:
-    type: string
-    default: beijing
-conditions:
-  prod: {equals : [{get_param: env_type}, "prod"]}
-  test:
-    not:
-      equals:
-      - get_param: env_type
-      - prod
-  beijing_prod:
-    and:
-    - equals:
-      - get_param: zone
-      - beijing
-    - equals:
-      - get_param: env_type
-      - prod
-  xian_zone:
-    equals:
-    - get_param: zone
-    - xian
-  xianyang_zone:
-    equals:
-    - get_param: zone
-    - xianyang
-  fujian_zone:
-    or:
-    - equals:
-      - get_param: zone
-      - fuzhou
-    - equals:
-      - get_param: zone
-      - xiamen
-  fujian_prod:
-    and:
-    - fujian_zone
-    - prod
-  shannxi_provice:
-    or:
-    - xian_zone
-    - xianyang_zone
-  not_shannxi:
-    not: shannxi_provice
-resources:
-  test_res:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: ["prod", "env_is_prod", "env_is_test"]}
-  prod_res:
-    type: OS::Heat::TestResource
-    properties:
-      value: prod_res
-    condition: prod
-  test_res1:
-    type: OS::Heat::TestResource
-    properties:
-      value: just in test env
-    condition: test
-  beijing_prod_res:
-    type: OS::Heat::TestResource
-    properties:
-      value: beijing_prod_res
-    condition: beijing_prod
-  fujian_res:
-    type: OS::Heat::TestResource
-    condition: fujian_zone
-    properties:
-      value: fujian_res
-  fujian_prod_res:
-    type: OS::Heat::TestResource
-    condition: fujian_prod
-    properties:
-      value: fujian_prod_res
-  shannxi_res:
-    type: OS::Heat::TestResource
-    condition: shannxi_provice
-    properties:
-      value: shannxi_res
-  not_shannxi_res:
-    type: OS::Heat::TestResource
-    condition: not_shannxi
-    properties:
-      value: not_shannxi_res
-outputs:
-  res_value:
-    value: {get_attr: [prod_res, output]}
-    condition: prod
-  test_res_value:
-    value: {get_attr: [test_res, output]}
-  prod_resource:
-    value: {if: [prod, {get_resource: prod_res}, 'no_prod_res']}
-  test_res1_value:
-    value: {if: [test, {get_attr: [test_res1, output]}, 'no_test_res1']}
-  beijing_prod_res:
-    value: {if: [beijing_prod, {get_resource: beijing_prod_res},
-                 'no_prod_res']}
-'''
-
-before_rename_tmpl = '''
-heat_template_version: 2016-10-14
-parameters:
-  env_type:
-    default: test
-    type: string
-conditions:
-  cd1: {equals : [{get_param: env_type}, "prod"]}
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: [cd1, 'prod', 'test']}
-'''
-
-after_rename_tmpl = '''
-heat_template_version: 2016-10-14
-parameters:
-  env_type:
-    default: prod
-    type: string
-conditions:
-  cd2: {equals : [{get_param: env_type}, "prod"]}
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: [cd2, 'prod', 'test']}
-  test2:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: [cd2, 'prod', 'test']}
-'''
-
-fail_rename_tmpl = '''
-heat_template_version: 2016-10-14
-parameters:
-  env_type:
-    default: prod
-    type: string
-conditions:
-  cd3: {equals : [{get_param: env_type}, "prod"]}
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: [cd3, 'prod', 'test']}
-  test2:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: [cd3, 'prod', 'test']}
-  test_fail:
-    type: OS::Heat::TestResource
-    properties:
-      fail: True
-    depends_on: [test, test2]
-'''
-
-recover_rename_tmpl = '''
-heat_template_version: 2016-10-14
-parameters:
-  env_type:
-    default: prod
-    type: string
-conditions:
-  cd3: {equals : [{get_param: env_type}, "prod"]}
-resources:
-  test2:
-    type: OS::Heat::TestResource
-    properties:
-      value: {if: [cd3, 'prod', 'test']}
-  test_fail:
-    type: OS::Heat::TestResource
-    properties:
-      fail: False
-    depends_on: [test2]
-'''
-
-
-class CreateUpdateResConditionTest(functional_base.FunctionalTestsBase):
-
-    def res_assert_for_prod(self, resources, bj_prod=True, fj_zone=False,
-                            shannxi_provice=False):
-        res_names = [res.resource_name for res in resources]
-        if bj_prod:
-            self.assertEqual(4, len(resources))
-            self.assertIn('beijing_prod_res', res_names)
-            self.assertIn('not_shannxi_res', res_names)
-        elif fj_zone:
-            self.assertEqual(5, len(resources))
-            self.assertIn('fujian_res', res_names)
-            self.assertNotIn('beijing_prod_res', res_names)
-            self.assertIn('not_shannxi_res', res_names)
-            self.assertIn('fujian_prod_res', res_names)
-        elif shannxi_provice:
-            self.assertEqual(3, len(resources))
-            self.assertIn('shannxi_res', res_names)
-        else:
-            self.assertEqual(3, len(resources))
-            self.assertIn('not_shannxi_res', res_names)
-        self.assertIn('prod_res', res_names)
-        self.assertIn('test_res', res_names)
-
-    def res_assert_for_test(self, resources, fj_zone=False,
-                            shannxi_provice=False):
-        res_names = [res.resource_name for res in resources]
-
-        if fj_zone:
-            self.assertEqual(4, len(resources))
-            self.assertIn('fujian_res', res_names)
-            self.assertIn('not_shannxi_res', res_names)
-        elif shannxi_provice:
-            self.assertEqual(3, len(resources))
-            self.assertNotIn('fujian_res', res_names)
-            self.assertIn('shannxi_res', res_names)
-        else:
-            self.assertEqual(3, len(resources))
-            self.assertIn('not_shannxi_res', res_names)
-        self.assertIn('test_res', res_names)
-        self.assertIn('test_res1', res_names)
-        self.assertNotIn('prod_res', res_names)
-
-    def output_assert_for_prod(self, stack_id, bj_prod=True):
-        output = self.client.stacks.output_show(stack_id,
-                                                'res_value')['output']
-        self.assertEqual('prod_res', output['output_value'])
-
-        test_res_value = self.client.stacks.output_show(
-            stack_id, 'test_res_value')['output']
-        self.assertEqual('env_is_prod', test_res_value['output_value'])
-
-        prod_resource = self.client.stacks.output_show(
-            stack_id, 'prod_resource')['output']
-        self.assertNotEqual('no_prod_res', prod_resource['output_value'])
-
-        test_res_output = self.client.stacks.output_show(
-            stack_id, 'test_res1_value')['output']
-        self.assertEqual('no_test_res1', test_res_output['output_value'])
-
-        beijing_prod_res = self.client.stacks.output_show(
-            stack_id, 'beijing_prod_res')['output']
-        if bj_prod:
-            self.assertNotEqual('no_prod_res',
-                                beijing_prod_res['output_value'])
-        else:
-            self.assertEqual('no_prod_res', beijing_prod_res['output_value'])
-
-    def output_assert_for_test(self, stack_id):
-        output = self.client.stacks.output_show(stack_id,
-                                                'res_value')['output']
-        self.assertIsNone(output['output_value'])
-
-        test_res_value = self.client.stacks.output_show(
-            stack_id, 'test_res_value')['output']
-        self.assertEqual('env_is_test', test_res_value['output_value'])
-
-        prod_resource = self.client.stacks.output_show(
-            stack_id, 'prod_resource')['output']
-        self.assertEqual('no_prod_res', prod_resource['output_value'])
-
-        test_res_output = self.client.stacks.output_show(
-            stack_id, 'test_res1_value')['output']
-        self.assertEqual('just in test env',
-                         test_res_output['output_value'])
-
-        beijing_prod_res = self.client.stacks.output_show(
-            stack_id, 'beijing_prod_res')['output']
-        self.assertEqual('no_prod_res', beijing_prod_res['output_value'])
-
-    def test_stack_create_update_cfn_template_test_to_prod(self):
-        stack_identifier = self.stack_create(template=cfn_template)
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'zone': 'fuzhou'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources, fj_zone=True)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources, shannxi_provice=True)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'env_type': 'prod'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources)
-        self.output_assert_for_prod(stack_identifier)
-
-        parms = {'env_type': 'prod',
-                 'zone': 'shanghai'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, False)
-        self.output_assert_for_prod(stack_identifier, False)
-
-        parms = {'env_type': 'prod',
-                 'zone': 'xiamen'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, bj_prod=False, fj_zone=True)
-        self.output_assert_for_prod(stack_identifier, False)
-
-        parms = {'env_type': 'prod',
-                 'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, bj_prod=False, fj_zone=False,
-                                 shannxi_provice=True)
-        self.output_assert_for_prod(stack_identifier, False)
-
-    def test_stack_create_update_cfn_template_prod_to_test(self):
-        parms = {'env_type': 'prod'}
-        stack_identifier = self.stack_create(template=cfn_template,
-                                             parameters=parms)
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources)
-        self.output_assert_for_prod(stack_identifier)
-
-        parms = {'zone': 'xiamen',
-                 'env_type': 'prod'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, bj_prod=False, fj_zone=True)
-        self.output_assert_for_prod(stack_identifier, bj_prod=False)
-
-        parms = {'zone': 'xianyang',
-                 'env_type': 'prod'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, bj_prod=False, fj_zone=False,
-                                 shannxi_provice=True)
-        self.output_assert_for_prod(stack_identifier, bj_prod=False)
-
-        parms = {'zone': 'shanghai',
-                 'env_type': 'prod'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, bj_prod=False, fj_zone=False,
-                                 shannxi_provice=False)
-        self.output_assert_for_prod(stack_identifier, bj_prod=False)
-
-        parms = {'env_type': 'test'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'env_type': 'test',
-                 'zone': 'fuzhou'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources, fj_zone=True)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'env_type': 'test',
-                 'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=cfn_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources, fj_zone=False,
-                                 shannxi_provice=True)
-        self.output_assert_for_test(stack_identifier)
-
-    def test_stack_create_update_hot_template_test_to_prod(self):
-        stack_identifier = self.stack_create(template=hot_template)
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources, shannxi_provice=True)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'env_type': 'prod'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources)
-        self.output_assert_for_prod(stack_identifier)
-
-        parms = {'env_type': 'prod',
-                 'zone': 'shanghai'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, False)
-        self.output_assert_for_prod(stack_identifier, False)
-
-        parms = {'env_type': 'prod',
-                 'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, False, shannxi_provice=True)
-        self.output_assert_for_prod(stack_identifier, False)
-
-    def test_stack_create_update_hot_template_prod_to_test(self):
-        parms = {'env_type': 'prod'}
-        stack_identifier = self.stack_create(template=hot_template,
-                                             parameters=parms)
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources)
-        self.output_assert_for_prod(stack_identifier)
-
-        parms = {'env_type': 'prod',
-                 'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_prod(resources, False, shannxi_provice=True)
-        self.output_assert_for_prod(stack_identifier, False)
-
-        parms = {'env_type': 'test'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources)
-        self.output_assert_for_test(stack_identifier)
-
-        parms = {'env_type': 'test',
-                 'zone': 'xianyang'}
-        self.update_stack(stack_identifier,
-                          template=hot_template,
-                          parameters=parms)
-
-        resources = self.client.resources.list(stack_identifier)
-        self.res_assert_for_test(resources, fj_zone=False,
-                                 shannxi_provice=True)
-        self.output_assert_for_test(stack_identifier)
-
-    def test_condition_rename(self):
-        stack_identifier = self.stack_create(template=before_rename_tmpl)
-        self.update_stack(stack_identifier, template=after_rename_tmpl)
-        self.update_stack(stack_identifier, template=fail_rename_tmpl,
-                          expected_status='UPDATE_FAILED')
-        self.update_stack(stack_identifier, template=recover_rename_tmpl)
diff --git a/heat_tempest_plugin/tests/functional/test_create_update.py b/heat_tempest_plugin/tests/functional/test_create_update.py
deleted file mode 100644
index 46b1837..0000000
--- a/heat_tempest_plugin/tests/functional/test_create_update.py
+++ /dev/null
@@ -1,710 +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.
-
-
-import copy
-import json
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-test_template_one_resource = {
-    'heat_template_version': 'pike',
-    'description': 'Test template to create one instance.',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 1,
-                'action_wait_secs': {'create': 1},
-                'client_name': 'nova',
-                'entity_name': 'servers',
-            }
-        }
-    }
-}
-
-test_template_two_resource = {
-    'heat_template_version': 'pike',
-    'description': 'Test template to create two instance.',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0,
-                'action_wait_secs': {'update': 1}
-            }
-        },
-        'test2': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0
-            }
-        }
-    }
-}
-
-
-def _change_rsrc_properties(template, rsrcs, values):
-        modified_template = copy.deepcopy(template)
-        for rsrc_name in rsrcs:
-            rsrc_prop = modified_template['resources'][
-                rsrc_name]['properties']
-            for prop in rsrc_prop:
-                if prop in values:
-                    rsrc_prop[prop] = values[prop]
-        return modified_template
-
-
-class CreateStackTest(functional_base.FunctionalTestsBase):
-    def test_create_rollback(self):
-        values = {'fail': True, 'value': 'test_create_rollback'}
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'], values)
-
-        self.stack_create(
-            template=template,
-            expected_status='ROLLBACK_COMPLETE',
-            disable_rollback=False)
-
-
-class UpdateStackTest(functional_base.FunctionalTestsBase):
-
-    provider_template = {
-        'heat_template_version': '2013-05-23',
-        'description': 'foo',
-        'resources': {
-            'test1': {
-                'type': 'My::TestResource'
-            }
-        }
-    }
-
-    provider_group_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  count:
-    type: number
-    default: 2
-resources:
-  test_group:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: {get_param: count}
-      resource_def:
-        type: My::TestResource
-'''
-
-    update_userdata_template = '''
-heat_template_version: 2014-10-16
-parameters:
-  flavor:
-    type: string
-  user_data:
-    type: string
-  image:
-    type: string
-  network:
-    type: string
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      image: {get_param: image}
-      flavor: {get_param: flavor}
-      networks: [{network: {get_param: network} }]
-      user_data_format: SOFTWARE_CONFIG
-      user_data: {get_param: user_data}
-'''
-
-    fail_param_template = '''
-heat_template_version: 2014-10-16
-parameters:
-  do_fail:
-    type: boolean
-    default: False
-resources:
-  aresource:
-    type: OS::Heat::TestResource
-    properties:
-      value: Test
-      fail: {get_param: do_fail}
-      wait_secs: 1
-'''
-
-    def test_stack_update_nochange(self):
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'],
-                                           {'value': 'test_no_change'})
-        stack_identifier = self.stack_create(
-            template=template)
-        expected_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(expected_resources,
-                         self.list_resources(stack_identifier))
-
-        # Update with no changes, resources should be unchanged
-        self.update_stack(stack_identifier, template)
-        self.assertEqual(expected_resources,
-                         self.list_resources(stack_identifier))
-
-    def test_stack_in_place_update(self):
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'],
-                                           {'value': 'test_in_place'})
-        stack_identifier = self.stack_create(
-            template=template)
-        expected_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(expected_resources,
-                         self.list_resources(stack_identifier))
-        resource = self.client.resources.list(stack_identifier)
-        initial_phy_id = resource[0].physical_resource_id
-
-        tmpl_update = _change_rsrc_properties(
-            test_template_one_resource, ['test1'],
-            {'value': 'test_in_place_update'})
-        # Update the Value
-        self.update_stack(stack_identifier, tmpl_update)
-        resource = self.client.resources.list(stack_identifier)
-        # By default update_in_place
-        self.assertEqual(initial_phy_id,
-                         resource[0].physical_resource_id)
-
-    def test_stack_update_replace(self):
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'],
-                                           {'value': 'test_replace'})
-        stack_identifier = self.stack_create(
-            template=template)
-        expected_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(expected_resources,
-                         self.list_resources(stack_identifier))
-        resource = self.client.resources.list(stack_identifier)
-        initial_phy_id = resource[0].physical_resource_id
-
-        # Update the value and also set update_replace prop
-        tmpl_update = _change_rsrc_properties(
-            test_template_one_resource, ['test1'],
-            {'value': 'test_in_place_update', 'update_replace': True})
-        self.update_stack(stack_identifier, tmpl_update)
-        resource = self.client.resources.list(stack_identifier)
-        # update Replace
-        self.assertNotEqual(initial_phy_id,
-                            resource[0].physical_resource_id)
-
-    def test_stack_update_add_remove(self):
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'],
-                                           {'value': 'test_add_remove'})
-        stack_identifier = self.stack_create(
-            template=template)
-        initial_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        tmpl_update = _change_rsrc_properties(
-            test_template_two_resource, ['test1', 'test2'],
-            {'value': 'test_add_remove_update'})
-        # Add one resource via a stack update
-        self.update_stack(stack_identifier, tmpl_update)
-        updated_resources = {'test1': 'OS::Heat::TestResource',
-                             'test2': 'OS::Heat::TestResource'}
-        self.assertEqual(updated_resources,
-                         self.list_resources(stack_identifier))
-
-        # Then remove it by updating with the original template
-        self.update_stack(stack_identifier, template)
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-    def test_stack_update_rollback(self):
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'],
-                                           {'value': 'test_update_rollback'})
-        stack_identifier = self.stack_create(
-            template=template)
-        initial_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        tmpl_update = _change_rsrc_properties(
-            test_template_two_resource, ['test1', 'test2'],
-            {'value': 'test_update_rollback', 'fail': True})
-        # stack update, also set failure
-        self.update_stack(stack_identifier, tmpl_update,
-                          expected_status='ROLLBACK_COMPLETE',
-                          disable_rollback=False)
-        # since stack update failed only the original resource is present
-        updated_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(updated_resources,
-                         self.list_resources(stack_identifier))
-
-    def test_stack_update_from_failed(self):
-        # Prove it's possible to update from an UPDATE_FAILED state
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'],
-                                           {'value': 'test_update_failed'})
-        stack_identifier = self.stack_create(
-            template=template)
-        initial_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        tmpl_update = _change_rsrc_properties(
-            test_template_one_resource, ['test1'], {'fail': True})
-        # Update with bad template, we should fail
-        self.update_stack(stack_identifier, tmpl_update,
-                          expected_status='UPDATE_FAILED')
-        # but then passing a good template should succeed
-        self.update_stack(stack_identifier, test_template_two_resource)
-        updated_resources = {'test1': 'OS::Heat::TestResource',
-                             'test2': 'OS::Heat::TestResource'}
-        self.assertEqual(updated_resources,
-                         self.list_resources(stack_identifier))
-
-    def test_stack_update_provider(self):
-        template = _change_rsrc_properties(
-            test_template_one_resource, ['test1'],
-            {'value': 'test_provider_template'})
-        files = {'provider.template': json.dumps(template)}
-        env = {'resource_registry':
-               {'My::TestResource': 'provider.template'}}
-        stack_identifier = self.stack_create(
-            template=self.provider_template,
-            files=files,
-            environment=env
-        )
-
-        initial_resources = {'test1': 'My::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        # Prove the resource is backed by a nested stack, save the ID
-        nested_identifier = self.assert_resource_is_a_stack(stack_identifier,
-                                                            'test1')
-        nested_id = nested_identifier.split('/')[-1]
-
-        # Then check the expected resources are in the nested stack
-        nested_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-        tmpl_update = _change_rsrc_properties(
-            test_template_two_resource, ['test1', 'test2'],
-            {'value': 'test_provider_template'})
-        # Add one resource via a stack update by changing the nested stack
-        files['provider.template'] = json.dumps(tmpl_update)
-        self.update_stack(stack_identifier, self.provider_template,
-                          environment=env, files=files)
-
-        # Parent resources should be unchanged and the nested stack
-        # should have been updated in-place without replacement
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-        rsrc = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual(rsrc.physical_resource_id, nested_id)
-
-        # Then check the expected resources are in the nested stack
-        nested_resources = {'test1': 'OS::Heat::TestResource',
-                            'test2': 'OS::Heat::TestResource'}
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-
-    def test_stack_update_alias_type(self):
-        env = {'resource_registry':
-               {'My::TestResource': 'OS::Heat::RandomString',
-                'My::TestResource2': 'OS::Heat::RandomString'}}
-        stack_identifier = self.stack_create(
-            template=self.provider_template,
-            environment=env
-        )
-        p_res = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual('My::TestResource', p_res.resource_type)
-
-        initial_resources = {'test1': 'My::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-        res = self.client.resources.get(stack_identifier, 'test1')
-        # Modify the type of the resource alias to My::TestResource2
-        tmpl_update = copy.deepcopy(self.provider_template)
-        tmpl_update['resources']['test1']['type'] = 'My::TestResource2'
-        self.update_stack(stack_identifier, tmpl_update, environment=env)
-        res_a = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual(res.physical_resource_id, res_a.physical_resource_id)
-        self.assertEqual(res.attributes['value'], res_a.attributes['value'])
-
-    def test_stack_update_alias_changes(self):
-        env = {'resource_registry':
-               {'My::TestResource': 'OS::Heat::RandomString'}}
-        stack_identifier = self.stack_create(
-            template=self.provider_template,
-            environment=env
-        )
-        p_res = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual('My::TestResource', p_res.resource_type)
-
-        initial_resources = {'test1': 'My::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-        res = self.client.resources.get(stack_identifier, 'test1')
-        # Modify the resource alias to point to a different type
-        env = {'resource_registry':
-               {'My::TestResource': 'OS::Heat::TestResource'}}
-        self.update_stack(stack_identifier, template=self.provider_template,
-                          environment=env)
-        res_a = self.client.resources.get(stack_identifier, 'test1')
-        self.assertNotEqual(res.physical_resource_id,
-                            res_a.physical_resource_id)
-
-    def test_stack_update_provider_type(self):
-        template = _change_rsrc_properties(
-            test_template_one_resource, ['test1'],
-            {'value': 'test_provider_template'})
-        files = {'provider.template': json.dumps(template)}
-        env = {'resource_registry':
-               {'My::TestResource': 'provider.template',
-                'My::TestResource2': 'provider.template'}}
-        stack_identifier = self.stack_create(
-            template=self.provider_template,
-            files=files,
-            environment=env
-        )
-        p_res = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual('My::TestResource', p_res.resource_type)
-
-        initial_resources = {'test1': 'My::TestResource'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        # Prove the resource is backed by a nested stack, save the ID
-        nested_identifier = self.assert_resource_is_a_stack(stack_identifier,
-                                                            'test1')
-        nested_id = nested_identifier.split('/')[-1]
-
-        # Then check the expected resources are in the nested stack
-        nested_resources = {'test1': 'OS::Heat::TestResource'}
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-        n_res = self.client.resources.get(nested_identifier, 'test1')
-
-        # Modify the type of the provider resource to My::TestResource2
-        tmpl_update = copy.deepcopy(self.provider_template)
-        tmpl_update['resources']['test1']['type'] = 'My::TestResource2'
-        self.update_stack(stack_identifier, tmpl_update,
-                          environment=env, files=files)
-        p_res = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual('My::TestResource2', p_res.resource_type)
-
-        # Parent resources should be unchanged and the nested stack
-        # should have been updated in-place without replacement
-        self.assertEqual({u'test1': u'My::TestResource2'},
-                         self.list_resources(stack_identifier))
-        rsrc = self.client.resources.get(stack_identifier, 'test1')
-        self.assertEqual(rsrc.physical_resource_id, nested_id)
-
-        # Then check the expected resources are in the nested stack
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-        n_res2 = self.client.resources.get(nested_identifier, 'test1')
-        self.assertEqual(n_res.physical_resource_id,
-                         n_res2.physical_resource_id)
-
-    def test_stack_update_provider_group(self):
-        """Test two-level nested update."""
-
-        # Create a ResourceGroup (which creates a nested stack),
-        # containing provider resources (which create a nested
-        # stack), thus exercising an update which traverses
-        # two levels of nesting.
-        template = _change_rsrc_properties(
-            test_template_one_resource, ['test1'],
-            {'value': 'test_provider_group_template'})
-        files = {'provider.template': json.dumps(template)}
-        env = {'resource_registry':
-               {'My::TestResource': 'provider.template'}}
-
-        stack_identifier = self.stack_create(
-            template=self.provider_group_template,
-            files=files,
-            environment=env
-        )
-
-        initial_resources = {'test_group': 'OS::Heat::ResourceGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        # Prove the resource is backed by a nested stack, save the ID
-        nested_identifier = self.assert_resource_is_a_stack(stack_identifier,
-                                                            'test_group')
-
-        # Then check the expected resources are in the nested stack
-        nested_resources = {'0': 'My::TestResource',
-                            '1': 'My::TestResource'}
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-
-        for n_rsrc in nested_resources:
-            rsrc = self.client.resources.get(nested_identifier, n_rsrc)
-            provider_stack = self.client.stacks.get(rsrc.physical_resource_id)
-            provider_identifier = '%s/%s' % (provider_stack.stack_name,
-                                             provider_stack.id)
-            provider_resources = {u'test1': u'OS::Heat::TestResource'}
-            self.assertEqual(provider_resources,
-                             self.list_resources(provider_identifier))
-
-        tmpl_update = _change_rsrc_properties(
-            test_template_two_resource, ['test1', 'test2'],
-            {'value': 'test_provider_group_template'})
-        # Add one resource via a stack update by changing the nested stack
-        files['provider.template'] = json.dumps(tmpl_update)
-        self.update_stack(stack_identifier, self.provider_group_template,
-                          environment=env, files=files)
-
-        # Parent resources should be unchanged and the nested stack
-        # should have been updated in-place without replacement
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        # Resource group stack should also be unchanged (but updated)
-        nested_stack = self.client.stacks.get(nested_identifier)
-        self.assertEqual('UPDATE_COMPLETE', nested_stack.stack_status)
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-
-        for n_rsrc in nested_resources:
-            rsrc = self.client.resources.get(nested_identifier, n_rsrc)
-            provider_stack = self.client.stacks.get(rsrc.physical_resource_id)
-            provider_identifier = '%s/%s' % (provider_stack.stack_name,
-                                             provider_stack.id)
-            provider_resources = {'test1': 'OS::Heat::TestResource',
-                                  'test2': 'OS::Heat::TestResource'}
-            self.assertEqual(provider_resources,
-                             self.list_resources(provider_identifier))
-
-    def test_stack_update_with_replacing_userdata(self):
-        """Test case for updating userdata of instance.
-
-        Confirm that we can update userdata of instance during updating stack
-        by the user of member role.
-
-        Make sure that a resource that inherits from StackUser can be deleted
-        during updating stack.
-        """
-        if not self.conf.minimal_image_ref:
-            raise self.skipException("No minimal image configured to test")
-        if not self.conf.minimal_instance_type:
-            raise self.skipException("No flavor configured to test")
-
-        parms = {'flavor': self.conf.minimal_instance_type,
-                 'image': self.conf.minimal_image_ref,
-                 'network': self.conf.fixed_network_name,
-                 'user_data': ''}
-
-        stack_identifier = self.stack_create(
-            template=self.update_userdata_template,
-            parameters=parms
-        )
-
-        parms_updated = parms
-        parms_updated['user_data'] = 'two'
-        self.update_stack(
-            stack_identifier,
-            template=self.update_userdata_template,
-            parameters=parms_updated)
-
-    def test_stack_update_provider_group_patch(self):
-        '''Test two-level nested update with PATCH'''
-        template = _change_rsrc_properties(
-            test_template_one_resource, ['test1'],
-            {'value': 'test_provider_group_template'})
-        files = {'provider.template': json.dumps(template)}
-        env = {'resource_registry':
-               {'My::TestResource': 'provider.template'}}
-
-        stack_identifier = self.stack_create(
-            template=self.provider_group_template,
-            files=files,
-            environment=env
-        )
-
-        initial_resources = {'test_group': 'OS::Heat::ResourceGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        # Prove the resource is backed by a nested stack, save the ID
-        nested_identifier = self.assert_resource_is_a_stack(stack_identifier,
-                                                            'test_group')
-
-        # Then check the expected resources are in the nested stack
-        nested_resources = {'0': 'My::TestResource',
-                            '1': 'My::TestResource'}
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-
-        # increase the count, pass only the paramter, no env or template
-        params = {'count': 3}
-        self.update_stack(stack_identifier, parameters=params, existing=True)
-
-        # Parent resources should be unchanged and the nested stack
-        # should have been updated in-place without replacement
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        # Resource group stack should also be unchanged (but updated)
-        nested_stack = self.client.stacks.get(nested_identifier)
-        self.assertEqual('UPDATE_COMPLETE', nested_stack.stack_status)
-        # Add a resource, as we should have added one
-        nested_resources['2'] = 'My::TestResource'
-        self.assertEqual(nested_resources,
-                         self.list_resources(nested_identifier))
-
-    def test_stack_update_from_failed_patch(self):
-        '''Test PATCH update from a failed state.'''
-
-        # Start with empty template
-        stack_identifier = self.stack_create(
-            template='heat_template_version: 2014-10-16')
-
-        # Update with a good template, but bad parameter
-        self.update_stack(stack_identifier,
-                          template=self.fail_param_template,
-                          parameters={'do_fail': True},
-                          expected_status='UPDATE_FAILED')
-
-        # PATCH update, only providing the parameter
-        self.update_stack(stack_identifier,
-                          parameters={'do_fail': False},
-                          existing=True)
-        self.assertEqual({u'aresource': u'OS::Heat::TestResource'},
-                         self.list_resources(stack_identifier))
-
-    def test_stack_update_with_new_env(self):
-        """Update handles new resource types in the environment.
-
-        If a resource type appears during an update and the update fails,
-        retrying the update is able to find the type properly in the
-        environment.
-        """
-        stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-
-        # Update with a new resource and make the update fails
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'], {'fail': True})
-        template['resources']['test2'] = {'type': 'My::TestResource'}
-        template['resources']['test1']['depends_on'] = 'test2'
-        env = {'resource_registry':
-               {'My::TestResource': 'OS::Heat::TestResource'}}
-        self.update_stack(stack_identifier,
-                          template=template,
-                          environment=env,
-                          expected_status='UPDATE_FAILED')
-
-        # Fixing the template should fix the stack
-        template = _change_rsrc_properties(template,
-                                           ['test1'], {'fail': False})
-        self.update_stack(stack_identifier,
-                          template=template,
-                          environment=env)
-        self.assertEqual({'test1': 'OS::Heat::TestResource',
-                          'test2': 'My::TestResource'},
-                         self.list_resources(stack_identifier))
-
-    def test_stack_update_with_new_version(self):
-        """Update handles new template version in failure.
-
-        If a stack update fails while changing the template version, update is
-        able to handle the new version fine.
-        """
-        stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-
-        # Update with a new function and make the update fails
-        template = _change_rsrc_properties(test_template_two_resource,
-                                           ['test1'], {'fail': True})
-
-        template['heat_template_version'] = '2015-10-15'
-        template['resources']['test2']['properties']['value'] = {
-            'list_join': [',', ['a'], ['b']]}
-        self.update_stack(stack_identifier,
-                          template=template,
-                          expected_status='UPDATE_FAILED')
-
-        template = _change_rsrc_properties(template,
-                                           ['test2'], {'value': 'Test2'})
-        self.update_stack(stack_identifier,
-                          template=template,
-                          expected_status='UPDATE_FAILED')
-        self._stack_delete(stack_identifier)
-
-    def test_stack_update_with_old_version(self):
-        """Update handles old template version in failure.
-
-        If a stack update fails while changing the template version, update is
-        able to handle the old version fine.
-        """
-        template = _change_rsrc_properties(
-            test_template_one_resource,
-            ['test1'], {'value': {'list_join': [',', ['a'], ['b']]}})
-        template['heat_template_version'] = '2015-10-15'
-        stack_identifier = self.stack_create(
-            template=template)
-
-        # Update with a new function and make the update fails
-        template = _change_rsrc_properties(test_template_one_resource,
-                                           ['test1'], {'fail': True})
-        self.update_stack(stack_identifier,
-                          template=template,
-                          expected_status='UPDATE_FAILED')
-        self._stack_delete(stack_identifier)
-
-    def test_stack_update_with_conditions(self):
-        """Update manages new conditions added.
-
-        When a new resource is added during updates, the stacks handles the new
-        conditions correctly, and doesn't fail to load them while the update is
-        still in progress.
-        """
-        stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-
-        updated_template = copy.deepcopy(test_template_two_resource)
-        updated_template['conditions'] = {'cond1': True}
-        updated_template['resources']['test3'] = {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': {'if': ['cond1', 'val3', 'val4']}
-            }
-        }
-        test2_props = updated_template['resources']['test2']['properties']
-        test2_props['action_wait_secs'] = {'create': 30}
-
-        self.update_stack(stack_identifier,
-                          template=updated_template,
-                          expected_status='UPDATE_IN_PROGRESS')
-
-        def check_resources():
-            resources = self.list_resources(stack_identifier)
-            if len(resources) < 2:
-                return False
-            self.assertIn('test3', resources)
-            return True
-
-        self.assertTrue(test.call_until_true(20, 2, check_resources))
diff --git a/heat_tempest_plugin/tests/functional/test_default_parameters.py b/heat_tempest_plugin/tests/functional/test_default_parameters.py
deleted file mode 100644
index 24aa6e4..0000000
--- a/heat_tempest_plugin/tests/functional/test_default_parameters.py
+++ /dev/null
@@ -1,92 +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.
-
-import yaml
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class DefaultParametersTest(functional_base.FunctionalTestsBase):
-
-    template = '''
-heat_template_version: 2013-05-23
-parameters:
-  length:
-    type: string
-    default: 40
-resources:
-  random1:
-    type: nested_random.yaml
-  random2:
-    type: OS::Heat::RandomString
-    properties:
-      length: {get_param: length}
-outputs:
-  random1:
-    value: {get_attr: [random1, random1_value]}
-  random2:
-    value: {get_resource: random2}
-'''
-    nested_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  length:
-    type: string
-    default: 50
-resources:
-  random1:
-    type: OS::Heat::RandomString
-    properties:
-      length: {get_param: length}
-outputs:
-  random1_value:
-    value: {get_resource: random1}
-'''
-
-    scenarios = [
-        ('none', dict(param=None, default=None, temp_def=True,
-                      expect1=50, expect2=40)),
-        ('default', dict(param=None, default=12, temp_def=True,
-                         expect1=12, expect2=12)),
-        ('both', dict(param=15, default=12, temp_def=True,
-                      expect1=12, expect2=15)),
-        ('no_temp_default', dict(param=None, default=12, temp_def=False,
-                                 expect1=12, expect2=12)),
-    ]
-
-    def test_defaults(self):
-        env = {'parameters': {}, 'parameter_defaults': {}}
-        if self.param:
-            env['parameters'] = {'length': self.param}
-        if self.default:
-            env['parameter_defaults'] = {'length': self.default}
-
-        if not self.temp_def:
-            # remove the default from the parameter in the nested template.
-            ntempl = yaml.safe_load(self.nested_template)
-            del ntempl['parameters']['length']['default']
-            nested_template = yaml.safe_dump(ntempl)
-        else:
-            nested_template = self.nested_template
-
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files={'nested_random.yaml': nested_template},
-            environment=env
-        )
-
-        stack = self.client.stacks.get(stack_identifier)
-        for out in stack.outputs:
-            if out['output_key'] == 'random1':
-                self.assertEqual(self.expect1, len(out['output_value']))
-            if out['output_key'] == 'random2':
-                self.assertEqual(self.expect2, len(out['output_value']))
diff --git a/heat_tempest_plugin/tests/functional/test_delete.py b/heat_tempest_plugin/tests/functional/test_delete.py
deleted file mode 100644
index 20266d6..0000000
--- a/heat_tempest_plugin/tests/functional/test_delete.py
+++ /dev/null
@@ -1,42 +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.
-
-import time
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class DeleteInProgressTest(functional_base.FunctionalTestsBase):
-
-    root_template = '''
-heat_template_version: 2013-05-23
-resources:
-    rg:
-        type: OS::Heat::ResourceGroup
-        properties:
-            count: 125
-            resource_def:
-                type: empty.yaml
-'''
-
-    empty_template = '''
-heat_template_version: 2013-05-23
-resources:
-'''
-
-    def test_delete_nested_stacks_create_in_progress(self):
-        files = {'empty.yaml': self.empty_template}
-        identifier = self.stack_create(template=self.root_template,
-                                       files=files,
-                                       expected_status='CREATE_IN_PROGRESS')
-        time.sleep(20)
-        self._stack_delete(identifier)
diff --git a/heat_tempest_plugin/tests/functional/test_env_merge.py b/heat_tempest_plugin/tests/functional/test_env_merge.py
deleted file mode 100644
index 68ec035..0000000
--- a/heat_tempest_plugin/tests/functional/test_env_merge.py
+++ /dev/null
@@ -1,95 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-TEMPLATE = '''
-    heat_template_version: 2015-04-30
-    parameters:
-      p0:
-        type: string
-        default: CORRECT
-      p1:
-        type: string
-        default: INCORRECT
-      p2:
-        type: string
-        default: INCORRECT
-    resources:
-      r1:
-        type: test::R1
-      r2:
-        type: test::R2
-      r3a:
-        type: test::R3
-      r3b:
-        type: test::R3
-'''
-
-ENV_1 = '''
-    parameters:
-      p1: CORRECT
-      p2: INCORRECT-E1
-    resource_registry:
-      test::R1: OS::Heat::RandomString
-      test::R2: BROKEN
-      test::R3: OS::Heat::None
-'''
-
-ENV_2 = '''
-    parameters:
-      p2: CORRECT
-    resource_registry:
-      test::R2: OS::Heat::RandomString
-      resources:
-        r3b:
-          test::R3: OS::Heat::RandomString
-'''
-
-
-class EnvironmentMergingTests(functional_base.FunctionalTestsBase):
-
-    def test_server_environment_merging(self):
-
-        # Setup
-        files = {'env1.yaml': ENV_1, 'env2.yaml': ENV_2}
-        environment_files = ['env1.yaml', 'env2.yaml']
-
-        # Test
-        stack_id = self.stack_create(stack_name='env_merge',
-                                     template=TEMPLATE,
-                                     files=files,
-                                     environment_files=environment_files)
-
-        # Verify
-
-        # Since there is no environment show, the registry overriding
-        # is partially verified by there being no error. If it wasn't
-        # working, test::R2 would remain mapped to BROKEN in env1.
-
-        # Sanity check
-        resources = self.list_resources(stack_id)
-        self.assertEqual(4, len(resources))
-
-        # Verify the parameters are correctly set
-        stack = self.client.stacks.get(stack_id)
-        self.assertEqual('CORRECT', stack.parameters['p0'])
-        self.assertEqual('CORRECT', stack.parameters['p1'])
-        self.assertEqual('CORRECT', stack.parameters['p2'])
-
-        # Verify that r3b has been overridden into a RandomString
-        # by checking to see that it has a value
-        r3b = self.client.resources.get(stack_id, 'r3b')
-        r3b_attrs = r3b.attributes
-        self.assertIn('value', r3b_attrs)
diff --git a/heat_tempest_plugin/tests/functional/test_heat_autoscaling.py b/heat_tempest_plugin/tests/functional/test_heat_autoscaling.py
deleted file mode 100644
index a83c7fe..0000000
--- a/heat_tempest_plugin/tests/functional/test_heat_autoscaling.py
+++ /dev/null
@@ -1,215 +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 heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class HeatAutoscalingTest(functional_base.FunctionalTestsBase):
-    template = '''
-heat_template_version: 2014-10-16
-
-resources:
-  random_group:
-    type: OS::Heat::AutoScalingGroup
-    properties:
-      cooldown: 0
-      desired_capacity: 3
-      max_size: 5
-      min_size: 2
-      resource:
-        type: OS::Heat::RandomString
-
-  scale_up_policy:
-    type: OS::Heat::ScalingPolicy
-    properties:
-      adjustment_type: change_in_capacity
-      auto_scaling_group_id: { get_resource: random_group }
-      scaling_adjustment: 1
-
-  scale_down_policy:
-    type: OS::Heat::ScalingPolicy
-    properties:
-      adjustment_type: change_in_capacity
-      auto_scaling_group_id: { get_resource: random_group }
-      scaling_adjustment: -1
-
-outputs:
-  all_values:
-    value: {get_attr: [random_group, outputs_list, value]}
-  value_0:
-    value: {get_attr: [random_group, resource.0.value]}
-  value_1:
-    value: {get_attr: [random_group, resource.1.value]}
-  value_2:
-    value: {get_attr: [random_group, resource.2.value]}
-  asg_size:
-    value: {get_attr: [random_group, current_size]}
-'''
-
-    template_nested = '''
-heat_template_version: 2014-10-16
-
-resources:
-  random_group:
-    type: OS::Heat::AutoScalingGroup
-    properties:
-      desired_capacity: 3
-      max_size: 5
-      min_size: 2
-      resource:
-        type: randomstr.yaml
-
-outputs:
-  all_values:
-    value: {get_attr: [random_group, outputs_list, random_str]}
-  value_0:
-    value: {get_attr: [random_group, resource.0.random_str]}
-  value_1:
-    value: {get_attr: [random_group, resource.1.random_str]}
-  value_2:
-    value: {get_attr: [random_group, resource.2.random_str]}
-'''
-
-    template_randomstr = '''
-heat_template_version: 2013-05-23
-
-resources:
-  random_str:
-    type: OS::Heat::RandomString
-
-outputs:
-  random_str:
-    value: {get_attr: [random_str, value]}
-'''
-
-    def _assert_output_values(self, stack_id):
-        stack = self.client.stacks.get(stack_id)
-        all_values = self._stack_output(stack, 'all_values')
-        self.assertEqual(3, len(all_values))
-        self.assertEqual(all_values[0], self._stack_output(stack, 'value_0'))
-        self.assertEqual(all_values[1], self._stack_output(stack, 'value_1'))
-        self.assertEqual(all_values[2], self._stack_output(stack, 'value_2'))
-
-    def test_asg_scale_up_max_size(self):
-        stack_id = self.stack_create(template=self.template,
-                                     expected_status='CREATE_COMPLETE')
-        stack = self.client.stacks.get(stack_id)
-        asg_size = self._stack_output(stack, 'asg_size')
-        # Ensure that initial desired capacity is met
-        self.assertEqual(3, asg_size)
-
-        # send scale up signals and ensure that asg honors max_size
-        asg = self.client.resources.get(stack_id, 'random_group')
-        max_size = 5
-        for num in range(asg_size+1, max_size+2):
-            expected_resources = num if num <= max_size else max_size
-            self.client.resources.signal(stack_id, 'scale_up_policy')
-            self.assertTrue(
-                test.call_until_true(self.conf.build_timeout,
-                                     self.conf.build_interval,
-                                     self.check_autoscale_complete,
-                                     asg.physical_resource_id,
-                                     expected_resources, stack_id,
-                                     'scale_up_policy'))
-
-    def test_asg_scale_down_min_size(self):
-        stack_id = self.stack_create(template=self.template,
-                                     expected_status='CREATE_COMPLETE')
-        stack = self.client.stacks.get(stack_id)
-        asg_size = self._stack_output(stack, 'asg_size')
-        # Ensure that initial desired capacity is met
-        self.assertEqual(3, asg_size)
-
-        # send scale down signals and ensure that asg honors min_size
-        asg = self.client.resources.get(stack_id, 'random_group')
-        min_size = 2
-        for num in range(asg_size-1, 0, -1):
-            expected_resources = num if num >= min_size else min_size
-            self.client.resources.signal(stack_id, 'scale_down_policy')
-            self.assertTrue(
-                test.call_until_true(self.conf.build_timeout,
-                                     self.conf.build_interval,
-                                     self.check_autoscale_complete,
-                                     asg.physical_resource_id,
-                                     expected_resources, stack_id,
-                                     'scale_down_policy'))
-
-    def test_asg_cooldown(self):
-        cooldown_tmpl = self.template.replace('cooldown: 0',
-                                              'cooldown: 60')
-        stack_id = self.stack_create(template=cooldown_tmpl,
-                                     expected_status='CREATE_COMPLETE')
-        stack = self.client.stacks.get(stack_id)
-        asg_size = self._stack_output(stack, 'asg_size')
-        # Ensure that initial desired capacity is met
-        self.assertEqual(3, asg_size)
-
-        # send scale up signal.
-        # Since cooldown is in effect, number of resources should not change
-        asg = self.client.resources.get(stack_id, 'random_group')
-        expected_resources = 3
-        self.client.resources.signal(stack_id, 'scale_up_policy')
-        self.assertTrue(
-            test.call_until_true(self.conf.build_timeout,
-                                 self.conf.build_interval,
-                                 self.check_autoscale_complete,
-                                 asg.physical_resource_id,
-                                 expected_resources, stack_id,
-                                 'scale_up_policy'))
-
-    def test_path_attrs(self):
-        stack_id = self.stack_create(template=self.template)
-        expected_resources = {'random_group': 'OS::Heat::AutoScalingGroup',
-                              'scale_up_policy': 'OS::Heat::ScalingPolicy',
-                              'scale_down_policy': 'OS::Heat::ScalingPolicy'}
-        self.assertEqual(expected_resources, self.list_resources(stack_id))
-        self._assert_output_values(stack_id)
-
-    def test_path_attrs_nested(self):
-        files = {'randomstr.yaml': self.template_randomstr}
-        stack_id = self.stack_create(template=self.template_nested,
-                                     files=files)
-        expected_resources = {'random_group': 'OS::Heat::AutoScalingGroup'}
-        self.assertEqual(expected_resources, self.list_resources(stack_id))
-        self._assert_output_values(stack_id)
-
-
-class AutoScalingGroupUpdateWithNoChanges(functional_base.FunctionalTestsBase):
-
-    template = '''
-heat_template_version: 2013-05-23
-
-resources:
-  test_group:
-    type: OS::Heat::AutoScalingGroup
-    properties:
-      desired_capacity: 0
-      max_size: 0
-      min_size: 0
-      resource:
-        type: OS::Heat::RandomString
-  test_policy:
-    type: OS::Heat::ScalingPolicy
-    properties:
-      adjustment_type: change_in_capacity
-      auto_scaling_group_id: { get_resource: test_group }
-      scaling_adjustment: 1
-'''
-
-    def test_as_group_update_without_resource_changes(self):
-        stack_identifier = self.stack_create(template=self.template)
-        new_template = self.template.replace(
-            'scaling_adjustment: 1',
-            'scaling_adjustment: 2')
-
-        self.update_stack(stack_identifier, template=new_template)
diff --git a/heat_tempest_plugin/tests/functional/test_immutable_parameters.py b/heat_tempest_plugin/tests/functional/test_immutable_parameters.py
deleted file mode 100644
index f031c01..0000000
--- a/heat_tempest_plugin/tests/functional/test_immutable_parameters.py
+++ /dev/null
@@ -1,141 +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 heat_tempest_plugin.tests.functional import functional_base
-from heatclient import exc as heat_exceptions
-
-
-class ImmutableParametersTest(functional_base.FunctionalTestsBase):
-
-    template_param_has_no_immutable_field = '''
-heat_template_version: 2014-10-16
-parameters:
-  param1:
-    type: string
-    default: default_value
-outputs:
-  param1_output:
-    description: 'parameter 1 details'
-    value: { get_param: param1 }
-'''
-
-    template_param_has_immutable_field = '''
-heat_template_version: 2014-10-16
-parameters:
-  param1:
-    type: string
-    default: default_value
-    immutable: false
-outputs:
-  param1_output:
-    description: 'parameter 1 details'
-    value: { get_param: param1 }
-'''
-
-    def test_no_immutable_param_field(self):
-        param1_create_value = 'value1'
-        create_parameters = {"param1": param1_create_value}
-
-        stack_identifier = self.stack_create(
-            template=self.template_param_has_no_immutable_field,
-            parameters=create_parameters
-        )
-        stack = self.client.stacks.get(stack_identifier)
-
-        # Verify the value of the parameter
-        self.assertEqual(param1_create_value,
-                         self._stack_output(stack, 'param1_output'))
-
-        param1_update_value = 'value2'
-        update_parameters = {"param1": param1_update_value}
-
-        self.update_stack(
-            stack_identifier,
-            template=self.template_param_has_no_immutable_field,
-            parameters=update_parameters)
-
-        stack = self.client.stacks.get(stack_identifier)
-
-        # Verify the value of the updated parameter
-        self.assertEqual(param1_update_value,
-                         self._stack_output(stack, 'param1_output'))
-
-    def test_immutable_param_field_allowed(self):
-        param1_create_value = 'value1'
-        create_parameters = {"param1": param1_create_value}
-
-        stack_identifier = self.stack_create(
-            template=self.template_param_has_immutable_field,
-            parameters=create_parameters
-        )
-        stack = self.client.stacks.get(stack_identifier)
-
-        # Verify the value of the parameter
-        self.assertEqual(param1_create_value,
-                         self._stack_output(stack, 'param1_output'))
-
-        param1_update_value = 'value2'
-        update_parameters = {"param1": param1_update_value}
-
-        self.update_stack(
-            stack_identifier,
-            template=self.template_param_has_immutable_field,
-            parameters=update_parameters)
-        stack = self.client.stacks.get(stack_identifier)
-
-        # Verify the value of the updated parameter
-        self.assertEqual(param1_update_value,
-                         self._stack_output(stack, 'param1_output'))
-
-        # Ensure stack is not in a failed state
-        self.assertEqual('UPDATE_COMPLETE', stack.stack_status)
-
-    def test_immutable_param_field_error(self):
-        param1_create_value = 'value1'
-        create_parameters = {"param1": param1_create_value}
-
-        # Toggle the immutable field to preclude updating
-        immutable_true = self.template_param_has_immutable_field.replace(
-            'immutable: false', 'immutable: true')
-
-        stack_identifier = self.stack_create(
-            template=immutable_true,
-            parameters=create_parameters
-        )
-        stack = self.client.stacks.get(stack_identifier)
-
-        param1_update_value = 'value2'
-        update_parameters = {"param1": param1_update_value}
-
-        # Verify the value of the parameter
-        self.assertEqual(param1_create_value,
-                         self._stack_output(stack, 'param1_output'))
-
-        # Attempt to update the stack with a new parameter value
-        try:
-            self.update_stack(
-                stack_identifier,
-                template=immutable_true,
-                parameters=update_parameters)
-        except heat_exceptions.HTTPBadRequest as exc:
-            exp = ('The following parameters are immutable and may not be '
-                   'updated: param1')
-            self.assertIn(exp, str(exc))
-
-        stack = self.client.stacks.get(stack_identifier)
-
-        # Ensure stack is not in a failed state
-        self.assertEqual('CREATE_COMPLETE', stack.stack_status)
-
-        # Ensure immutable parameter has not changed
-        self.assertEqual(param1_create_value,
-                         self._stack_output(stack, 'param1_output'))
diff --git a/heat_tempest_plugin/tests/functional/test_instance_group.py b/heat_tempest_plugin/tests/functional/test_instance_group.py
deleted file mode 100644
index c0bb7e8..0000000
--- a/heat_tempest_plugin/tests/functional/test_instance_group.py
+++ /dev/null
@@ -1,500 +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.
-
-import copy
-import json
-
-from testtools import matchers
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class InstanceGroupTest(functional_base.FunctionalTestsBase):
-
-    template = '''
-{
-  "AWSTemplateFormatVersion" : "2010-09-09",
-  "Description" : "Template to create multiple instances.",
-  "Parameters" : {"size": {"Type": "String", "Default": "1"},
-                  "AZ": {"Type": "String", "Default": "nova"},
-                  "image": {"Type": "String"},
-                  "flavor": {"Type": "String"},
-                  "user_data": {"Type": "String", "Default": "jsconfig data"}},
-  "Resources": {
-    "JobServerGroup": {
-      "Type": "OS::Heat::InstanceGroup",
-      "Properties": {
-        "LaunchConfigurationName" : {"Ref": "JobServerConfig"},
-        "Size" : {"Ref": "size"},
-        "AvailabilityZones" : [{"Ref": "AZ"}]
-      }
-    },
-
-    "JobServerConfig" : {
-      "Type" : "AWS::AutoScaling::LaunchConfiguration",
-      "Metadata": {"foo": "bar"},
-      "Properties": {
-        "ImageId"           : {"Ref": "image"},
-        "InstanceType"      : {"Ref": "flavor"},
-        "SecurityGroups"    : [ "sg-1" ],
-        "UserData"          : {"Ref": "user_data"}
-      }
-    }
-  },
-  "Outputs": {
-    "InstanceList": {"Value": {
-      "Fn::GetAtt": ["JobServerGroup", "InstanceList"]}},
-    "JobServerConfigRef": {"Value": {
-      "Ref": "JobServerConfig"}}
-  }
-}
-'''
-
-    instance_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  ImageId: {type: string}
-  InstanceType: {type: string}
-  SecurityGroups: {type: comma_delimited_list}
-  UserData: {type: string}
-  Tags: {type: comma_delimited_list}
-
-resources:
-  random1:
-    type: OS::Heat::RandomString
-    properties:
-      salt: {get_param: UserData}
-outputs:
-  PublicIp:
-    value: {get_attr: [random1, value]}
-'''
-
-    # This is designed to fail.
-    bad_instance_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  ImageId: {type: string}
-  InstanceType: {type: string}
-  SecurityGroups: {type: comma_delimited_list}
-  UserData: {type: string}
-  Tags: {type: comma_delimited_list}
-
-resources:
-  random1:
-    type: OS::Heat::RandomString
-    depends_on: waiter
-  ready_poster:
-    type: AWS::CloudFormation::WaitConditionHandle
-  waiter:
-    type: AWS::CloudFormation::WaitCondition
-    properties:
-      Handle: {Ref: ready_poster}
-      Timeout: 1
-outputs:
-  PublicIp:
-    value: {get_attr: [random1, value]}
-'''
-
-    def setUp(self):
-        super(InstanceGroupTest, self).setUp()
-        if not self.conf.minimal_image_ref:
-            raise self.skipException("No minimal image configured to test")
-        if not self.conf.instance_type:
-            raise self.skipException("No flavor configured to test")
-
-    def assert_instance_count(self, stack, expected_count):
-        inst_list = self._stack_output(stack, 'InstanceList')
-        self.assertEqual(expected_count, len(inst_list.split(',')))
-
-    def _assert_instance_state(self, nested_identifier,
-                               num_complete, num_failed):
-        for res in self.client.resources.list(nested_identifier):
-            if 'COMPLETE' in res.resource_status:
-                num_complete = num_complete - 1
-            elif 'FAILED' in res.resource_status:
-                num_failed = num_failed - 1
-        self.assertEqual(0, num_failed)
-        self.assertEqual(0, num_complete)
-
-
-class InstanceGroupBasicTest(InstanceGroupTest):
-
-    def test_basic_create_works(self):
-        """Make sure the working case is good.
-
-        Note this combines test_override_aws_ec2_instance into this test as
-        well, which is:
-        If AWS::EC2::Instance is overridden, InstanceGroup will automatically
-        use that overridden resource type.
-        """
-
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 4,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files, environment=env)
-        initial_resources = {
-            'JobServerConfig': 'AWS::AutoScaling::LaunchConfiguration',
-            'JobServerGroup': 'OS::Heat::InstanceGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 4)
-
-    def test_size_updates_work(self):
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 2,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files,
-                                             environment=env)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 2)
-
-        # Increase min size to 5
-        env2 = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-                'parameters': {'size': 5,
-                               'image': self.conf.minimal_image_ref,
-                               'flavor': self.conf.instance_type}}
-        self.update_stack(stack_identifier, self.template,
-                          environment=env2, files=files)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 5)
-
-    def test_update_group_replace(self):
-        """Test case for ensuring non-updatable props case a replacement.
-
-        Make sure that during a group update the non-updatable properties cause
-        a replacement.
-        """
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry':
-               {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 1,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files,
-                                             environment=env)
-        rsrc = self.client.resources.get(stack_identifier, 'JobServerGroup')
-        orig_asg_id = rsrc.physical_resource_id
-
-        env2 = {'resource_registry':
-                {'AWS::EC2::Instance': 'provider.yaml'},
-                'parameters': {'size': '2',
-                               'AZ': 'wibble',
-                               'image': self.conf.minimal_image_ref,
-                               'flavor': self.conf.instance_type,
-                               'user_data': 'new data'}}
-        self.update_stack(stack_identifier, self.template,
-                          environment=env2, files=files)
-
-        # replacement will cause the resource physical_resource_id to change.
-        rsrc = self.client.resources.get(stack_identifier, 'JobServerGroup')
-        self.assertNotEqual(orig_asg_id, rsrc.physical_resource_id)
-
-    def test_create_instance_error_causes_group_error(self):
-        """Test create failing a resource in the instance group.
-
-        If a resource in an instance group fails to be created, the instance
-        group itself will fail and the broken inner resource will remain.
-        """
-        stack_name = self._stack_rand_name()
-        files = {'provider.yaml': self.bad_instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 2,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        self.client.stacks.create(
-            stack_name=stack_name,
-            template=self.template,
-            files=files,
-            disable_rollback=True,
-            parameters={},
-            environment=env
-        )
-        self.addCleanup(self._stack_delete, stack_name)
-        stack = self.client.stacks.get(stack_name)
-        stack_identifier = '%s/%s' % (stack_name, stack.id)
-        self._wait_for_stack_status(stack_identifier, 'CREATE_FAILED')
-        initial_resources = {
-            'JobServerConfig': 'AWS::AutoScaling::LaunchConfiguration',
-            'JobServerGroup': 'OS::Heat::InstanceGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        self._assert_instance_state(nested_ident, 0, 2)
-
-    def test_update_instance_error_causes_group_error(self):
-        """Test update failing a resource in the instance group.
-
-        If a resource in an instance group fails to be created during an
-        update, the instance group itself will fail and the broken inner
-        resource will remain.
-        """
-        files = {'provider.yaml': self.instance_template}
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': 2,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.instance_type}}
-
-        stack_identifier = self.stack_create(template=self.template,
-                                             files=files,
-                                             environment=env)
-        initial_resources = {
-            'JobServerConfig': 'AWS::AutoScaling::LaunchConfiguration',
-            'JobServerGroup': 'OS::Heat::InstanceGroup'}
-        self.assertEqual(initial_resources,
-                         self.list_resources(stack_identifier))
-
-        stack = self.client.stacks.get(stack_identifier)
-        self.assert_instance_count(stack, 2)
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        self._assert_instance_state(nested_ident, 2, 0)
-        initial_list = [res.resource_name
-                        for res in self.client.resources.list(nested_ident)]
-
-        env['parameters']['size'] = 3
-        files2 = {'provider.yaml': self.bad_instance_template}
-        self.client.stacks.update(
-            stack_id=stack_identifier,
-            template=self.template,
-            files=files2,
-            disable_rollback=True,
-            parameters={},
-            environment=env
-        )
-        self._wait_for_stack_status(stack_identifier, 'UPDATE_FAILED')
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-        # assert that there are 3 bad instances
-        # 2 resources should be in update failed, and one create failed.
-        for res in self.client.resources.list(nested_ident):
-            if res.resource_name in initial_list:
-                self._wait_for_resource_status(nested_ident,
-                                               res.resource_name,
-                                               'UPDATE_FAILED')
-            else:
-                self._wait_for_resource_status(nested_ident,
-                                               res.resource_name,
-                                               'CREATE_FAILED')
-
-
-class InstanceGroupUpdatePolicyTest(InstanceGroupTest):
-
-    def ig_tmpl_with_updt_policy(self):
-        templ = json.loads(copy.deepcopy(self.template))
-        up = {"RollingUpdate": {
-            "MinInstancesInService": "1",
-            "MaxBatchSize": "2",
-            "PauseTime": "PT1S"}}
-        templ['Resources']['JobServerGroup']['UpdatePolicy'] = up
-        return templ
-
-    def update_instance_group(self, updt_template,
-                              num_updates_expected_on_updt,
-                              num_creates_expected_on_updt,
-                              num_deletes_expected_on_updt,
-                              update_replace):
-
-        # setup stack from the initial template
-        files = {'provider.yaml': self.instance_template}
-        size = 5
-        env = {'resource_registry': {'AWS::EC2::Instance': 'provider.yaml'},
-               'parameters': {'size': size,
-                              'image': self.conf.minimal_image_ref,
-                              'flavor': self.conf.minimal_instance_type}}
-        stack_name = self._stack_rand_name()
-        stack_identifier = self.stack_create(
-            stack_name=stack_name,
-            template=self.ig_tmpl_with_updt_policy(),
-            files=files,
-            environment=env)
-        stack = self.client.stacks.get(stack_identifier)
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'JobServerGroup')
-
-        # test that physical resource name of launch configuration is used
-        conf_name = self._stack_output(stack, 'JobServerConfigRef')
-        conf_name_pattern = '%s-JobServerConfig-[a-zA-Z0-9]+$' % stack_name
-        self.assertThat(conf_name,
-                        matchers.MatchesRegex(conf_name_pattern))
-
-        # test the number of instances created
-        self.assert_instance_count(stack, size)
-        # saves info from initial list of instances for comparison later
-        init_instances = self.client.resources.list(nested_ident)
-        init_names = [inst.resource_name for inst in init_instances]
-
-        # test stack update
-        self.update_stack(stack_identifier, updt_template,
-                          environment=env, files=files)
-        updt_stack = self.client.stacks.get(stack_identifier)
-
-        # test that the launch configuration is replaced
-        updt_conf_name = self._stack_output(updt_stack, 'JobServerConfigRef')
-        self.assertThat(updt_conf_name,
-                        matchers.MatchesRegex(conf_name_pattern))
-        self.assertNotEqual(conf_name, updt_conf_name)
-
-        # test that the group size are the same
-        updt_instances = self.client.resources.list(nested_ident)
-        updt_names = [inst.resource_name for inst in updt_instances]
-        self.assertEqual(len(init_names), len(updt_names))
-        for res in updt_instances:
-            self.assertEqual('UPDATE_COMPLETE', res.resource_status)
-
-        # test that the appropriate number of instance names are the same
-        matched_names = set(updt_names) & set(init_names)
-        self.assertEqual(num_updates_expected_on_updt, len(matched_names))
-
-        # test that the appropriate number of new instances are created
-        self.assertEqual(num_creates_expected_on_updt,
-                         len(set(updt_names) - set(init_names)))
-
-        # test that the appropriate number of instances are deleted
-        self.assertEqual(num_deletes_expected_on_updt,
-                         len(set(init_names) - set(updt_names)))
-
-        # test that the older instances are the ones being deleted
-        if num_deletes_expected_on_updt > 0:
-            deletes_expected = init_names[:num_deletes_expected_on_updt]
-            self.assertNotIn(deletes_expected, updt_names)
-
-    def test_instance_group_update_replace(self):
-        """Test simple update replace with no conflict.
-
-        Test simple update replace with no conflict in batch size and
-        minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        grp = updt_template['Resources']['JobServerGroup']
-        policy = grp['UpdatePolicy']['RollingUpdate']
-        policy['MinInstancesInService'] = '1'
-        policy['MaxBatchSize'] = '3'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=5,
-                                   num_creates_expected_on_updt=0,
-                                   num_deletes_expected_on_updt=0,
-                                   update_replace=True)
-
-    def test_instance_group_update_replace_with_adjusted_capacity(self):
-        """Test update replace with capacity adjustment.
-
-        Test update replace with capacity adjustment due to conflict in
-        batch size and minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        grp = updt_template['Resources']['JobServerGroup']
-        policy = grp['UpdatePolicy']['RollingUpdate']
-        policy['MinInstancesInService'] = '4'
-        policy['MaxBatchSize'] = '4'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=2,
-                                   num_creates_expected_on_updt=3,
-                                   num_deletes_expected_on_updt=3,
-                                   update_replace=True)
-
-    def test_instance_group_update_replace_huge_batch_size(self):
-        """Test update replace with a huge batch size."""
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['RollingUpdate']
-        policy['MinInstancesInService'] = '0'
-        policy['MaxBatchSize'] = '20'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=5,
-                                   num_creates_expected_on_updt=0,
-                                   num_deletes_expected_on_updt=0,
-                                   update_replace=True)
-
-    def test_instance_group_update_replace_huge_min_in_service(self):
-        """Update replace with huge number of minimum instances in service."""
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['RollingUpdate']
-        policy['MinInstancesInService'] = '20'
-        policy['MaxBatchSize'] = '2'
-        policy['PauseTime'] = 'PT0S'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['UserData'] = 'new data'
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=3,
-                                   num_creates_expected_on_updt=2,
-                                   num_deletes_expected_on_updt=2,
-                                   update_replace=True)
-
-    def test_instance_group_update_no_replace(self):
-        """Test simple update only and no replace with no conflict.
-
-        Test simple update only and no replace (i.e. updated instance flavor
-        in Launch Configuration) with no conflict in batch size and
-        minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['RollingUpdate']
-        policy['MinInstancesInService'] = '1'
-        policy['MaxBatchSize'] = '3'
-        policy['PauseTime'] = 'PT0S'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['InstanceType'] = self.conf.instance_type
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=5,
-                                   num_creates_expected_on_updt=0,
-                                   num_deletes_expected_on_updt=0,
-                                   update_replace=False)
-
-    def test_instance_group_update_no_replace_with_adjusted_capacity(self):
-        """Test update only and no replace with capacity adjustment.
-
-        Test update only and no replace (i.e. updated instance flavor in
-        Launch Configuration) with capacity adjustment due to conflict in
-        batch size and minimum instances in service.
-        """
-        updt_template = self.ig_tmpl_with_updt_policy()
-        group = updt_template['Resources']['JobServerGroup']
-        policy = group['UpdatePolicy']['RollingUpdate']
-        policy['MinInstancesInService'] = '4'
-        policy['MaxBatchSize'] = '4'
-        policy['PauseTime'] = 'PT0S'
-        config = updt_template['Resources']['JobServerConfig']
-        config['Properties']['InstanceType'] = self.conf.instance_type
-
-        self.update_instance_group(updt_template,
-                                   num_updates_expected_on_updt=2,
-                                   num_creates_expected_on_updt=3,
-                                   num_deletes_expected_on_updt=3,
-                                   update_replace=False)
diff --git a/heat_tempest_plugin/tests/functional/test_nested_get_attr.py b/heat_tempest_plugin/tests/functional/test_nested_get_attr.py
deleted file mode 100644
index 57f65e2..0000000
--- a/heat_tempest_plugin/tests/functional/test_nested_get_attr.py
+++ /dev/null
@@ -1,165 +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.
-
-# Using nested get_attr functions isn't a good idea - in particular, this
-# actually working depends on correct dependencies between the two resources
-# whose attributes are being fetched, and these dependencies are non-local to
-# where the get_attr calls are used. Nevertheless, it did sort-of work, and
-# this test will help keep it that way.
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-initial_template = '''
-heat_template_version: ocata
-resources:
-  dict_resource:
-    type: OS::Heat::Value
-    properties:
-      value:
-        blarg: wibble
-        foo: bar
-        baz: quux
-        fred: barney
-    # These dependencies are required because we only want to read the
-    # attribute values for a given resource once, and therefore we do so in
-    # dependency order. This is necessarily true for a convergence traversal,
-    # but also happens when we're fetching the resource attributes e.g. to show
-    # the output values. The key1/key2 attribute values must be stored before
-    # we attempt to calculate the dep_attrs for dict_resource in order to
-    # correctly determine which attributes of dict_resource are used.
-    depends_on:
-      - key1
-      - key2
-      - indirect_key3_dep
-  key1:
-    type: OS::Heat::Value
-    properties:
-      value: blarg
-  key2:
-    type: OS::Heat::Value
-    properties:
-      value: foo
-  key3:
-    type: OS::Heat::Value
-    properties:
-      value: fred
-  value1:
-    type: OS::Heat::Value
-    properties:
-      value:
-        get_attr:
-          - dict_resource
-          - value
-          - {get_attr: [key1, value]}
-  indirect_key3_dep:
-    type: OS::Heat::Value
-    properties:
-      value: ignored
-    depends_on: key3
-outputs:
-  value1:
-    value: {get_attr: [value1, value]}
-  value2:
-    value: {get_attr: [dict_resource, value, {get_attr: [key2, value]}]}
-  value3:
-    value: {get_attr: [dict_resource, value, {get_attr: [key3, value]}]}
-'''
-
-update_template = '''
-heat_template_version: ocata
-resources:
-  dict_resource:
-    type: OS::Heat::Value
-    properties:
-      value:
-        blarg: wibble
-        foo: bar
-        baz: quux
-        fred: barney
-    depends_on:
-      - key1
-      - key2
-      - indirect_key3_dep
-      - key4
-  key1:
-    type: OS::Heat::Value
-    properties:
-      value: foo
-  key2:
-    type: OS::Heat::Value
-    properties:
-      value: fred
-  key3:
-    type: OS::Heat::Value
-    properties:
-      value: blarg
-  key4:
-    type: OS::Heat::Value
-    properties:
-      value: baz
-  value1:
-    type: OS::Heat::Value
-    properties:
-      value:
-        get_attr:
-          - dict_resource
-          - value
-          - {get_attr: [key1, value]}
-  value4:
-    type: OS::Heat::Value
-    properties:
-      value:
-        get_attr:
-          - dict_resource
-          - value
-          - {get_attr: [key4, value]}
-  indirect_key3_dep:
-    type: OS::Heat::Value
-    properties:
-      value: ignored
-    depends_on: key3
-outputs:
-  value1:
-    value: {get_attr: [value1, value]}
-  value2:
-    value: {get_attr: [dict_resource, value, {get_attr: [key2, value]}]}
-  value3:
-    value: {get_attr: [dict_resource, value, {get_attr: [key3, value]}]}
-  value4:
-    value: {get_attr: [value4, value]}
-'''
-
-
-class NestedGetAttrTest(functional_base.FunctionalTestsBase):
-    def assertOutput(self, value, stack_identifier, key):
-        op = self.client.stacks.output_show(stack_identifier, key)['output']
-        self.assertEqual(key, op['output_key'])
-        if 'output_error' in op:
-            raise Exception(op['output_error'])
-        self.assertEqual(value, op['output_value'])
-
-    def test_nested_get_attr_create(self):
-        stack_identifier = self.stack_create(template=initial_template)
-
-        self.assertOutput('wibble', stack_identifier, 'value1')
-        self.assertOutput('bar', stack_identifier, 'value2')
-        self.assertOutput('barney', stack_identifier, 'value3')
-
-    def test_nested_get_attr_update(self):
-        stack_identifier = self.stack_create(template=initial_template)
-        self.update_stack(stack_identifier, template=update_template)
-
-        self.assertOutput('bar', stack_identifier, 'value1')
-        self.assertOutput('barney', stack_identifier, 'value2')
-        self.assertOutput('wibble', stack_identifier, 'value3')
-        self.assertOutput('quux', stack_identifier, 'value4')
diff --git a/heat_tempest_plugin/tests/functional/test_notifications.py b/heat_tempest_plugin/tests/functional/test_notifications.py
deleted file mode 100644
index 7a74cdb..0000000
--- a/heat_tempest_plugin/tests/functional/test_notifications.py
+++ /dev/null
@@ -1,194 +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.
-
-import kombu
-from oslo_config import cfg
-from oslo_messaging._drivers import common
-from oslo_messaging import transport
-import requests
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-BASIC_NOTIFICATIONS = [
-    'orchestration.stack.create.start',
-    'orchestration.stack.create.end',
-    'orchestration.stack.update.start',
-    'orchestration.stack.update.end',
-    'orchestration.stack.suspend.start',
-    'orchestration.stack.suspend.end',
-    'orchestration.stack.resume.start',
-    'orchestration.stack.resume.end',
-    'orchestration.stack.delete.start',
-    'orchestration.stack.delete.end'
-]
-
-ASG_NOTIFICATIONS = [
-    'orchestration.autoscaling.start',
-    'orchestration.autoscaling.end'
-]
-
-
-def get_url(conf):
-    conf = conf.oslo_messaging_rabbit
-    return 'amqp://%s:%s@%s:%s/' % (conf.rabbit_userid,
-                                    conf.rabbit_password,
-                                    conf.rabbit_host,
-                                    conf.rabbit_port)
-
-
-class NotificationHandler(object):
-    def __init__(self, stack_id, events=None):
-        self._notifications = []
-        self.stack_id = stack_id
-        self.events = events
-
-    def process_message(self, body, message):
-        notification = common.deserialize_msg(body)
-        if notification['payload']['stack_name'] == self.stack_id:
-            if self.events is not None:
-                if notification['event_type'] in self.events:
-                    self.notifications.append(notification['event_type'])
-            else:
-                self.notifications.append(notification['event_type'])
-        message.ack()
-
-    def clear(self):
-        self._notifications = []
-
-    @property
-    def notifications(self):
-        return self._notifications
-
-
-class NotificationTest(functional_base.FunctionalTestsBase):
-
-    basic_template = '''
-heat_template_version: 2013-05-23
-resources:
-  random1:
-    type: OS::Heat::RandomString
-'''
-    update_basic_template = '''
-heat_template_version: 2013-05-23
-resources:
-  random1:
-    type: OS::Heat::RandomString
-  random2:
-    type: OS::Heat::RandomString
-'''
-
-    asg_template = '''
-heat_template_version: 2013-05-23
-resources:
-  asg:
-    type: OS::Heat::AutoScalingGroup
-    properties:
-      resource:
-        type: OS::Heat::RandomString
-      min_size: 1
-      desired_capacity: 2
-      max_size: 3
-
-  scale_up_policy:
-    type: OS::Heat::ScalingPolicy
-    properties:
-      adjustment_type: change_in_capacity
-      auto_scaling_group_id: {get_resource: asg}
-      cooldown: 0
-      scaling_adjustment: 1
-
-  scale_down_policy:
-    type: OS::Heat::ScalingPolicy
-    properties:
-      adjustment_type: change_in_capacity
-      auto_scaling_group_id: {get_resource: asg}
-      cooldown: 0
-      scaling_adjustment: '-1'
-
-outputs:
-  scale_up_url:
-    value: {get_attr: [scale_up_policy, alarm_url]}
-  scale_dn_url:
-    value: {get_attr: [scale_down_policy, alarm_url]}
-'''
-
-    def setUp(self):
-        super(NotificationTest, self).setUp()
-        self.exchange = kombu.Exchange('heat', 'topic', durable=False)
-        queue = kombu.Queue(exchange=self.exchange,
-                            routing_key='notifications.info',
-                            exclusive=True)
-        self.conn = kombu.Connection(get_url(
-            transport.get_transport(cfg.CONF).conf))
-        self.ch = self.conn.channel()
-        self.queue = queue(self.ch)
-        self.queue.declare()
-
-    def consume_events(self, handler, count):
-        self.conn.drain_events()
-        return len(handler.notifications) == count
-
-    def test_basic_notifications(self):
-        # disable cleanup so we can call _stack_delete() directly.
-        stack_identifier = self.stack_create(template=self.basic_template,
-                                             enable_cleanup=False)
-        self.update_stack(stack_identifier,
-                          template=self.update_basic_template)
-        self.stack_suspend(stack_identifier)
-        self.stack_resume(stack_identifier)
-        self._stack_delete(stack_identifier)
-
-        handler = NotificationHandler(stack_identifier.split('/')[0])
-
-        with self.conn.Consumer(self.queue,
-                                callbacks=[handler.process_message],
-                                auto_declare=False):
-            try:
-                while True:
-                    self.conn.drain_events(timeout=1)
-            except Exception:
-                pass
-
-        for n in BASIC_NOTIFICATIONS:
-            self.assertIn(n, handler.notifications)
-
-    def test_asg_notifications(self):
-        stack_identifier = self.stack_create(template=self.asg_template)
-
-        for output in self.client.stacks.get(stack_identifier).outputs:
-            if output['output_key'] == 'scale_dn_url':
-                scale_down_url = output['output_value']
-            else:
-                scale_up_url = output['output_value']
-
-        notifications = []
-        handler = NotificationHandler(stack_identifier.split('/')[0],
-                                      ASG_NOTIFICATIONS)
-
-        with self.conn.Consumer(self.queue,
-                                callbacks=[handler.process_message],
-                                auto_declare=False):
-
-            requests.post(scale_up_url, verify=self.verify_cert)
-            self.assertTrue(
-                test.call_until_true(20, 0, self.consume_events, handler, 2))
-            notifications += handler.notifications
-
-            handler.clear()
-            requests.post(scale_down_url, verify=self.verify_cert)
-            self.assertTrue(
-                test.call_until_true(20, 0, self.consume_events, handler, 2))
-            notifications += handler.notifications
-
-        self.assertEqual(2, notifications.count(ASG_NOTIFICATIONS[0]))
-        self.assertEqual(2, notifications.count(ASG_NOTIFICATIONS[1]))
diff --git a/heat_tempest_plugin/tests/functional/test_nova_server_networks.py b/heat_tempest_plugin/tests/functional/test_nova_server_networks.py
index c0baeb4..9ab4eb1 100644
--- a/heat_tempest_plugin/tests/functional/test_nova_server_networks.py
+++ b/heat_tempest_plugin/tests/functional/test_nova_server_networks.py
@@ -90,6 +90,82 @@
         - port: {get_resource: port}
 '''
 
+server_with_multiple_subnets_no_ports_template = '''
+heat_template_version: 2016-04-08
+description: Test template to test nova server network updates.
+parameters:
+  flavor:
+    type: string
+  image:
+    type: string
+resources:
+  net:
+    type: OS::Neutron::Net
+    properties:
+      name: the_net
+  subnet_a:
+    type: OS::Neutron::Subnet
+    properties:
+      network: {get_resource: net}
+      cidr: 11.11.11.0/24
+      name: subnet_a
+  subnet_b:
+    type: OS::Neutron::Subnet
+    properties:
+      network: {get_resource: net}
+      cidr: 12.12.12.0/24
+      name: subnet_b
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: {get_param: image}
+      flavor: {get_param: flavor}
+      networks: $NETWORKS
+outputs:
+  networks:
+    value: {get_attr: [server, networks]}
+'''
+
+server_with_no_nets_template = '''
+heat_template_version: 2016-04-08
+description: Test template to test nova server network updates.
+parameters:
+  flavor:
+    type: string
+  image:
+    type: string
+resources:
+  net:
+    type: OS::Neutron::Net
+    properties:
+      name: the_net
+  subnet:
+    type: OS::Neutron::Subnet
+    properties:
+      name: the_subnet
+      network: {get_resource: net}
+      cidr: 11.11.11.0/24
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: {get_param: image}
+      flavor: {get_param: flavor}
+      networks: $NETWORKS
+outputs:
+  port0_id:
+    value: {get_attr: [server, addresses, the_net, 0, port]}
+  port1_id:
+    value: {get_attr: [server, addresses, the_net, 1, port]}
+  port2_id:
+    value: {get_attr: [server, addresses, the_net, 2, port]}
+  port0_ip_addr:
+    value: {get_attr: [server, addresses, the_net, 0, addr]}
+  port1_ip_addr:
+    value: {get_attr: [server, addresses, the_net, 1, addr]}
+  port2_ip_addr:
+    value: {get_attr: [server, addresses, the_net, 2, addr]}
+'''
+
 
 class CreateServerTest(functional_base.FunctionalTestsBase):
 
@@ -117,26 +193,25 @@
     def test_create_update_server_with_subnet(self):
         parms = {'flavor': self.conf.minimal_instance_type,
                  'image': self.conf.minimal_image_ref}
-        template = server_with_sub_fixed_ip_template.replace(
-            'fixed_ip: 11.11.11.11',
-            'fixed_ip: 11.11.11.22').replace(
-            'name: my_net', 'name: your_net')
+        template = server_with_multiple_subnets_no_ports_template.replace(
+            '$NETWORKS', ('[{subnet: {get_resource: subnet_a}}]'))
         stack_identifier = self.stack_create(
             template=template,
             stack_name='create_server_with_sub_ip',
             parameters=parms)
         networks = self.get_outputs(stack_identifier, 'networks')
-        self.assertEqual(['11.11.11.22'], networks['your_net'])
+        self.assertIn('11.11.11', networks['the_net'][0])
 
-        # update the server only with subnet, we won't pass
+        # update the server using a different subnet, we won't pass
         # both port_id and net_id to attach interface, then update success
-        template_only_subnet = template.replace(
-            'fixed_ip: 11.11.11.22', '')
+        template = server_with_multiple_subnets_no_ports_template.replace(
+            '$NETWORKS', ('[{subnet: {get_resource: subnet_b}}]'))
         self.update_stack(stack_identifier,
-                          template_only_subnet,
+                          template,
                           parameters=parms)
         new_networks = self.get_outputs(stack_identifier, 'networks')
-        self.assertNotEqual(['11.11.11.22'], new_networks['your_net'])
+        self.assertNotIn('11.11.11', new_networks['the_net'][0])
+        self.assertIn('12.12.12', new_networks['the_net'][0])
 
     def test_create_server_with_port(self):
         parms = {'flavor': self.conf.minimal_instance_type,
@@ -147,3 +222,205 @@
             template=server_with_port_template,
             stack_name='server_with_port',
             parameters=parms)
+
+
+class UpdateServerNetworksTest(functional_base.FunctionalTestsBase):
+    def setUp(self):
+        super(UpdateServerNetworksTest, self).setUp()
+        self.params = {'flavor': self.conf.minimal_instance_type,
+                       'image': self.conf.minimal_image_ref}
+
+    def get_outputs(self, stack_identifier, output_key):
+        stack = self.client.stacks.get(stack_identifier)
+        return self._stack_output(stack, output_key)
+
+    def test_create_update_server_swap_network_subnet(self):
+        '''Test updating stack with:
+
+        old_snippet
+          networks:
+            - network: {get_resource: net}
+        new_snippet
+          networks:
+            - subnet: {get_resource: subnet}
+        '''
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{network: {get_resource: net}}]')
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='swap_network_subnet',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{subnet: {get_resource: subnet}}]')
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+
+    def test_create_update_server_swap_network_port(self):
+        '''Test updating stack with:
+
+        old_snippet
+          networks:
+            - network: {get_resource: net}
+        new_snippet
+          networks:
+            - port: <the_port_created_on_stack_create>
+        '''
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{network: {get_resource: net}}]')
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='swap_network_port',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{port: ' + port0 + '}]')
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+
+    def test_create_update_server_swap_subnet_network(self):
+        '''Test updating stack with:
+
+        old_snippet
+          networks:
+            - subnet: {get_resource: subnet}
+        new_snippet
+          networks:
+            - network: {get_resource: net}
+        '''
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{subnet: {get_resource: subnet}}]')
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='swap_subnet_network',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{network: {get_resource: net}}]')
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+
+    def test_create_update_server_add_subnet(self):
+        '''Test updating stack with:
+
+        old_snippet
+          networks:
+            - network: {get_resource: net}
+        new_snippet
+          networks:
+            - network: {get_resource: net}
+              subnet: {get_resource: subnet}
+        '''
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{network: {get_resource: net}}]')
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='add_subnet',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS',
+            '[{network: {get_resource: net}, subnet: {get_resource: subnet}}]')
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+
+    def test_create_update_server_add_same_fixed_ip(self):
+        '''Test updating stack with:
+
+        old_snippet
+          networks:
+            - network: {get_resource: net}
+        new_snippet
+          networks:
+            - network: {get_resource: net}
+              fixed_ip: <the_same_ip_already_allocated>
+        '''
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS',
+            '[{network: {get_resource: net}}]')
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='same_fixed_ip',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        port0_ip = self.get_outputs(stack_identifier, 'port0_ip_addr')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS',
+            '[{network: {get_resource: net}, fixed_ip: ' + port0_ip + '}]')
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+
+    def test_create_update_server_add_network(self):
+        '''Test updating stack with:
+
+        old_snippet
+          networks:
+            - subnet: {get_resource: subnet}
+        new_snippet
+          networks:
+            - network: {get_resource: net}
+              subnet: {get_resource: subnet}
+        '''
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS', '[{subnet: {get_resource: subnet}}]')
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='add_network',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS',
+            '[{network: {get_resource: net}, subnet: {get_resource: subnet}}]')
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+
+    def test_create_update_server_multi_networks_swaps(self):
+        '''Test updating stack with:
+
+         old_snippet:
+           networks:
+             - network: {get_resource: net}
+             - network: {get_resource: net}
+               fixed_ip: 11.11.11.33
+             - subnet: {get_resource: subnet}
+         new_snippet:
+           networks:
+             - subnet: {get_resource: subnet}
+             - network: {get_resource: net}
+             - network: {get_resource: net}
+               subnet: {get_resource: subnet}
+        '''
+        old_snippet = """
+        - network: {get_resource: net}
+        - network: {get_resource: net}
+          fixed_ip: 11.11.11.33
+        - subnet: {get_resource: subnet}
+"""
+        new_snippet = """
+        - subnet: {get_resource: subnet}
+        - network: {get_resource: net}
+        - network: {get_resource: net}
+          subnet: {get_resource: subnet}
+"""
+        template = server_with_no_nets_template.replace(
+            '$NETWORKS', old_snippet)
+        stack_identifier = self.stack_create(
+            template=template,
+            stack_name='multi_networks_swaps',
+            parameters=self.params)
+        port0 = self.get_outputs(stack_identifier, 'port0_id')
+        port1 = self.get_outputs(stack_identifier, 'port1_id')
+        port2 = self.get_outputs(stack_identifier, 'port2_id')
+        template_update = server_with_no_nets_template.replace(
+            '$NETWORKS', new_snippet)
+        self.update_stack(stack_identifier, template_update,
+                          parameters=self.params)
+        self.assertEqual(port0, self.get_outputs(stack_identifier, 'port0_id'))
+        self.assertEqual(port1, self.get_outputs(stack_identifier, 'port1_id'))
+        self.assertEqual(port2, self.get_outputs(stack_identifier, 'port2_id'))
diff --git a/heat_tempest_plugin/tests/functional/test_preview_update.py b/heat_tempest_plugin/tests/functional/test_preview_update.py
deleted file mode 100644
index a4d293f..0000000
--- a/heat_tempest_plugin/tests/functional/test_preview_update.py
+++ /dev/null
@@ -1,298 +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 heat_tempest_plugin.tests.functional import functional_base
-
-test_template_one_resource = {
-    'heat_template_version': '2013-05-23',
-    'description': 'Test template to create one instance.',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0
-            }
-        }
-    }
-}
-
-test_template_two_resource = {
-    'heat_template_version': '2013-05-23',
-    'description': 'Test template to create two instance.',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0
-            }
-        },
-        'test2': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0
-            }
-        }
-    }
-}
-
-
-class UpdatePreviewBase(functional_base.FunctionalTestsBase):
-
-    def assert_empty_sections(self, changes, empty_sections):
-        for section in empty_sections:
-            self.assertEqual([], changes[section])
-
-
-class UpdatePreviewStackTest(UpdatePreviewBase):
-
-    def test_add_resource(self):
-        self.stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-        result = self.preview_update_stack(self.stack_identifier,
-                                           test_template_two_resource)
-        changes = result['resource_changes']
-
-        unchanged = changes['unchanged'][0]['resource_name']
-        self.assertEqual('test1', unchanged)
-
-        added = changes['added'][0]['resource_name']
-        self.assertEqual('test2', added)
-
-        self.assert_empty_sections(changes, ['updated', 'replaced', 'deleted'])
-
-    def test_no_change(self):
-        self.stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-        result = self.preview_update_stack(self.stack_identifier,
-                                           test_template_one_resource)
-        changes = result['resource_changes']
-
-        unchanged = changes['unchanged'][0]['resource_name']
-        self.assertEqual('test1', unchanged)
-
-        self.assert_empty_sections(
-            changes, ['updated', 'replaced', 'deleted', 'added'])
-
-    def test_update_resource(self):
-        self.stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-        test_template_updated_resource = {
-            'heat_template_version': '2013-05-23',
-            'description': 'Test template to create one instance.',
-            'resources': {
-                'test1': {
-                    'type': 'OS::Heat::TestResource',
-                    'properties': {
-                        'value': 'Test1 foo',
-                        'fail': False,
-                        'update_replace': False,
-                        'wait_secs': 0
-                    }
-                }
-            }
-        }
-
-        result = self.preview_update_stack(self.stack_identifier,
-                                           test_template_updated_resource)
-        changes = result['resource_changes']
-
-        updated = changes['updated'][0]['resource_name']
-        self.assertEqual('test1', updated)
-
-        self.assert_empty_sections(
-            changes, ['added', 'unchanged', 'replaced', 'deleted'])
-
-    def test_replaced_resource(self):
-        self.stack_identifier = self.stack_create(
-            template=test_template_one_resource)
-        new_template = {
-            'heat_template_version': '2013-05-23',
-            'description': 'Test template to create one instance.',
-            'resources': {
-                'test1': {
-                    'type': 'OS::Heat::TestResource',
-                    'properties': {
-                        'update_replace': True,
-                    }
-                }
-            }
-        }
-
-        result = self.preview_update_stack(self.stack_identifier, new_template)
-        changes = result['resource_changes']
-
-        replaced = changes['replaced'][0]['resource_name']
-        self.assertEqual('test1', replaced)
-
-        self.assert_empty_sections(
-            changes, ['added', 'unchanged', 'updated', 'deleted'])
-
-    def test_delete_resource(self):
-        self.stack_identifier = self.stack_create(
-            template=test_template_two_resource)
-        result = self.preview_update_stack(self.stack_identifier,
-                                           test_template_one_resource)
-        changes = result['resource_changes']
-
-        unchanged = changes['unchanged'][0]['resource_name']
-        self.assertEqual('test1', unchanged)
-
-        deleted = changes['deleted'][0]['resource_name']
-        self.assertEqual('test2', deleted)
-
-        self.assert_empty_sections(changes, ['updated', 'replaced', 'added'])
-
-
-class UpdatePreviewStackTestNested(UpdatePreviewBase):
-    template_nested_parent = '''
-heat_template_version: 2016-04-08
-resources:
-  nested1:
-    type: nested1.yaml
-'''
-
-    template_nested1 = '''
-heat_template_version: 2016-04-08
-resources:
-  nested2:
-    type: nested2.yaml
-'''
-
-    template_nested2 = '''
-heat_template_version: 2016-04-08
-resources:
-  random:
-    type: OS::Heat::RandomString
-'''
-
-    template_nested2_2 = '''
-heat_template_version: 2016-04-08
-resources:
-  random:
-    type: OS::Heat::RandomString
-  random2:
-    type: OS::Heat::RandomString
-'''
-
-    def _get_by_resource_name(self, changes, name, action):
-        filtered_l = [x for x in changes[action]
-                      if x['resource_name'] == name]
-        self.assertEqual(1, len(filtered_l))
-        return filtered_l[0]
-
-    def test_nested_resources_nochange(self):
-        files = {'nested1.yaml': self.template_nested1,
-                 'nested2.yaml': self.template_nested2}
-        self.stack_identifier = self.stack_create(
-            template=self.template_nested_parent, files=files)
-        result = self.preview_update_stack(
-            self.stack_identifier,
-            template=self.template_nested_parent,
-            files=files, show_nested=True)
-        changes = result['resource_changes']
-
-        # The nested random resource should be unchanged, but we always
-        # update nested stacks even when there are no changes
-        self.assertEqual(1, len(changes['unchanged']))
-        self.assertEqual('random', changes['unchanged'][0]['resource_name'])
-        self.assertEqual('nested2', changes['unchanged'][0]['parent_resource'])
-
-        self.assertEqual(2, len(changes['updated']))
-        u_nested1 = self._get_by_resource_name(changes, 'nested1', 'updated')
-        self.assertNotIn('parent_resource', u_nested1)
-        u_nested2 = self._get_by_resource_name(changes, 'nested2', 'updated')
-        self.assertEqual('nested1', u_nested2['parent_resource'])
-
-        self.assert_empty_sections(changes, ['replaced', 'deleted', 'added'])
-
-    def test_nested_resources_add(self):
-        files = {'nested1.yaml': self.template_nested1,
-                 'nested2.yaml': self.template_nested2}
-        self.stack_identifier = self.stack_create(
-            template=self.template_nested_parent, files=files)
-        files['nested2.yaml'] = self.template_nested2_2
-        result = self.preview_update_stack(
-            self.stack_identifier,
-            template=self.template_nested_parent,
-            files=files, show_nested=True)
-        changes = result['resource_changes']
-
-        # The nested random resource should be unchanged, but we always
-        # update nested stacks even when there are no changes
-        self.assertEqual(1, len(changes['unchanged']))
-        self.assertEqual('random', changes['unchanged'][0]['resource_name'])
-        self.assertEqual('nested2', changes['unchanged'][0]['parent_resource'])
-
-        self.assertEqual(1, len(changes['added']))
-        self.assertEqual('random2', changes['added'][0]['resource_name'])
-        self.assertEqual('nested2', changes['added'][0]['parent_resource'])
-
-        self.assert_empty_sections(changes, ['replaced', 'deleted'])
-
-    def test_nested_resources_delete(self):
-        files = {'nested1.yaml': self.template_nested1,
-                 'nested2.yaml': self.template_nested2_2}
-        self.stack_identifier = self.stack_create(
-            template=self.template_nested_parent, files=files)
-        files['nested2.yaml'] = self.template_nested2
-        result = self.preview_update_stack(
-            self.stack_identifier,
-            template=self.template_nested_parent,
-            files=files, show_nested=True)
-        changes = result['resource_changes']
-
-        # The nested random resource should be unchanged, but we always
-        # update nested stacks even when there are no changes
-        self.assertEqual(1, len(changes['unchanged']))
-        self.assertEqual('random', changes['unchanged'][0]['resource_name'])
-        self.assertEqual('nested2', changes['unchanged'][0]['parent_resource'])
-
-        self.assertEqual(1, len(changes['deleted']))
-        self.assertEqual('random2', changes['deleted'][0]['resource_name'])
-        self.assertEqual('nested2', changes['deleted'][0]['parent_resource'])
-
-        self.assert_empty_sections(changes, ['replaced', 'added'])
-
-    def test_nested_resources_replace(self):
-        files = {'nested1.yaml': self.template_nested1,
-                 'nested2.yaml': self.template_nested2}
-        self.stack_identifier = self.stack_create(
-            template=self.template_nested_parent, files=files)
-        parent_none = self.template_nested_parent.replace(
-            'nested1.yaml', 'OS::Heat::None')
-        result = self.preview_update_stack(
-            self.stack_identifier,
-            template=parent_none,
-            show_nested=True)
-        changes = result['resource_changes']
-
-        # The nested random resource should be unchanged, but we always
-        # update nested stacks even when there are no changes
-        self.assertEqual(1, len(changes['replaced']))
-        self.assertEqual('nested1', changes['replaced'][0]['resource_name'])
-
-        self.assertEqual(2, len(changes['deleted']))
-        d_random = self._get_by_resource_name(changes, 'random', 'deleted')
-        self.assertEqual('nested2', d_random['parent_resource'])
-        d_nested2 = self._get_by_resource_name(changes, 'nested2', 'deleted')
-        self.assertEqual('nested1', d_nested2['parent_resource'])
-
-        self.assert_empty_sections(changes, ['updated', 'unchanged', 'added'])
diff --git a/heat_tempest_plugin/tests/functional/test_purge.py b/heat_tempest_plugin/tests/functional/test_purge.py
deleted file mode 100644
index 1dd4ff8..0000000
--- a/heat_tempest_plugin/tests/functional/test_purge.py
+++ /dev/null
@@ -1,51 +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.
-
-import time
-
-from oslo_concurrency import processutils
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class PurgeTest(functional_base.FunctionalTestsBase):
-    template = '''
-heat_template_version: 2014-10-16
-parameters:
-resources:
-  test_resource:
-    type: OS::Heat::TestResource
-'''
-
-    def test_purge(self):
-        stack_identifier = self.stack_create(template=self.template)
-        self._stack_delete(stack_identifier)
-        stacks = dict((stack.id, stack) for stack in
-                      self.client.stacks.list(show_deleted=True))
-        self.assertIn(stack_identifier.split('/')[1], stacks)
-        time.sleep(1)
-        cmd = "heat-manage purge_deleted 0"
-        processutils.execute(cmd, shell=True)
-        stacks = dict((stack.id, stack) for stack in
-                      self.client.stacks.list(show_deleted=True))
-        self.assertNotIn(stack_identifier.split('/')[1], stacks)
-
-        # Test with tags
-        stack_identifier = self.stack_create(template=self.template,
-                                             tags="foo,bar")
-        self._stack_delete(stack_identifier)
-        time.sleep(1)
-        cmd = "heat-manage purge_deleted 0"
-        processutils.execute(cmd, shell=True)
-        stacks = dict((stack.id, stack) for stack in
-                      self.client.stacks.list(show_deleted=True))
-        self.assertNotIn(stack_identifier.split('/')[1], stacks)
diff --git a/heat_tempest_plugin/tests/functional/test_reload_on_sighup.py b/heat_tempest_plugin/tests/functional/test_reload_on_sighup.py
deleted file mode 100644
index 81da958..0000000
--- a/heat_tempest_plugin/tests/functional/test_reload_on_sighup.py
+++ /dev/null
@@ -1,142 +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.
-
-import re
-import subprocess
-import time
-
-import eventlet
-
-from oslo_concurrency import processutils
-from six.moves import configparser
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class ReloadOnSighupTest(functional_base.FunctionalTestsBase):
-
-    def setUp(self):
-        self.config_file = "/etc/heat/heat.conf"
-        super(ReloadOnSighupTest, self).setUp()
-
-    def _is_mod_wsgi_daemon(self, service):
-        process = ''.join(['wsgi:',
-                           service[:9]]).replace('_', '-').encode('utf-8')
-        s = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
-        for x in s.stdout:
-            if re.search(process, x):
-                return True
-
-    def _set_config_value(self, service, key, value):
-        config = configparser.ConfigParser()
-
-        # NOTE(prazumovsky): If there are several workers, there can be
-        # situation, when one thread opens self.config_file for writing
-        # (so config_file erases with opening), in that moment other thread
-        # intercepts to this file and try to set config option value, i.e.
-        # write to file, which is already erased by first thread, so,
-        # NoSectionError raised. So, should wait until first thread writes to
-        # config_file.
-        retries_count = self.conf.sighup_config_edit_retries
-        while True:
-            config.read(self.config_file)
-            try:
-                config.set(service, key, str(value))
-            except configparser.NoSectionError:
-                if retries_count <= 0:
-                    raise
-                retries_count -= 1
-                eventlet.sleep(1)
-            else:
-                break
-
-        with open(self.config_file, 'w') as f:
-            config.write(f)
-
-    def _get_config_value(self, service, key):
-        config = configparser.ConfigParser()
-        config.read(self.config_file)
-        val = config.get(service, key)
-        return val
-
-    def _get_heat_api_pids(self, service):
-        # get the pids of all heat-api processes
-        if service == "heat_api":
-            process = "heat-api|grep -Ev 'grep|cloudwatch|cfn'"
-        else:
-            process = "%s|grep -Ev 'grep'" % service.replace('_', '-')
-        cmd = "ps -ef|grep %s|awk '{print $2}'" % process
-        out, err = processutils.execute(cmd, shell=True)
-        self.assertIsNotNone(out, "heat-api service not running. %s" % err)
-        pids = filter(None, out.split('\n'))
-
-        # get the parent pids of all heat-api processes
-        cmd = "ps -ef|grep %s|awk '{print $3}'" % process
-        out, _ = processutils.execute(cmd, shell=True)
-        parent_pids = filter(None, out.split('\n'))
-
-        heat_api_parent = list(set(pids) & set(parent_pids))[0]
-        heat_api_children = list(set(pids) - set(parent_pids))
-
-        return heat_api_parent, heat_api_children
-
-    def _change_config(self, service, old_workers, new_workers):
-        pre_reload_parent, pre_reload_children = self._get_heat_api_pids(
-            service)
-        self.assertEqual(old_workers, len(pre_reload_children))
-
-        # change the config values
-        self._set_config_value(service, 'workers', new_workers)
-        cmd = "kill -HUP %s" % pre_reload_parent
-        processutils.execute(cmd, shell=True)
-
-        # wait till heat-api reloads
-        start_time = time.time()
-        while time.time() - start_time < self.conf.sighup_timeout:
-            post_reload_parent, post_reload_children = self._get_heat_api_pids(
-                service)
-            intersect = set(post_reload_children) & set(pre_reload_children)
-            if (new_workers == len(post_reload_children)
-                and pre_reload_parent == post_reload_parent
-                    and intersect == set()):
-                break
-            eventlet.sleep(1)
-        self.assertEqual(pre_reload_parent, post_reload_parent)
-        self.assertEqual(new_workers, len(post_reload_children))
-        # test if all child processes are newly created
-        self.assertEqual(set(post_reload_children) & set(pre_reload_children),
-                         set())
-
-    def _reload(self, service):
-        old_workers = int(self._get_config_value(service, 'workers'))
-        new_workers = old_workers + 1
-        self.addCleanup(self._set_config_value, service, 'workers',
-                        old_workers)
-
-        self._change_config(service, old_workers, new_workers)
-        # revert all the changes made
-        self._change_config(service, new_workers, old_workers)
-
-    def _reload_on_sighup(self, service):
-        if not self._is_mod_wsgi_daemon(service):
-            self._reload(service)
-        else:
-            self.skipTest('Skipping Test, Service running under httpd.')
-
-    def test_api_reload_on_sighup(self):
-        self._reload_on_sighup('heat_api')
-
-    def test_api_cfn_reload_on_sighup(self):
-        self._reload_on_sighup('heat_api_cfn')
-
-    def test_api_cloudwatch_on_sighup(self):
-        self._reload_on_sighup('heat_api_cloudwatch')
diff --git a/heat_tempest_plugin/tests/functional/test_replace_deprecated.py b/heat_tempest_plugin/tests/functional/test_replace_deprecated.py
deleted file mode 100644
index 0eee3f1..0000000
--- a/heat_tempest_plugin/tests/functional/test_replace_deprecated.py
+++ /dev/null
@@ -1,92 +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.
-
-import yaml
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class ReplaceDeprecatedResourceTest(functional_base.FunctionalTestsBase):
-    template = '''
-heat_template_version: "2013-05-23"
-parameters:
-  flavor:
-    type: string
-  image:
-    type: string
-  network:
-    type: string
-
-resources:
-  config:
-    type: OS::Heat::SoftwareConfig
-    properties:
-      config: xxxx
-
-  server:
-    type: OS::Nova::Server
-    properties:
-      image: {get_param: image}
-      flavor: {get_param: flavor}
-      networks: [{network: {get_param: network} }]
-      user_data_format: SOFTWARE_CONFIG
-  dep:
-    type: OS::Heat::SoftwareDeployments
-    properties:
-        config: {get_resource: config}
-        servers: {'0': {get_resource: server}}
-        signal_transport: NO_SIGNAL
-outputs:
-  server:
-    value: {get_resource: server}
-'''
-
-    deployment_group_snippet = '''
-type: OS::Heat::SoftwareDeploymentGroup
-properties:
-  config: {get_resource: config}
-  servers: {'0': {get_resource: server}}
-  signal_transport: NO_SIGNAL
-'''
-    enable_cleanup = True
-
-    def test_replace_software_deployments(self):
-        parms = {'flavor': self.conf.minimal_instance_type,
-                 'network': self.conf.fixed_network_name,
-                 'image': self.conf.minimal_image_ref
-                 }
-        deployments_template = yaml.safe_load(self.template)
-        stack_identifier = self.stack_create(
-            parameters=parms,
-            template=deployments_template,
-            enable_cleanup=self.enable_cleanup)
-        expected_resources = {'config': 'OS::Heat::SoftwareConfig',
-                              'dep': 'OS::Heat::SoftwareDeployments',
-                              'server': 'OS::Nova::Server'}
-        resource = self.client.resources.get(stack_identifier, 'server')
-        self.assertEqual(expected_resources,
-                         self.list_resources(stack_identifier))
-        initial_phy_id = resource.physical_resource_id
-        resources = deployments_template['resources']
-        resources['dep'] = yaml.safe_load(self.deployment_group_snippet)
-        self.update_stack(
-            stack_identifier,
-            deployments_template,
-            parameters=parms)
-        resource = self.client.resources.get(stack_identifier, 'server')
-        self.assertEqual(initial_phy_id,
-                         resource.physical_resource_id)
-        expected_new_resources = {'config': 'OS::Heat::SoftwareConfig',
-                                  'dep': 'OS::Heat::SoftwareDeploymentGroup',
-                                  'server': 'OS::Nova::Server'}
-        self.assertEqual(expected_new_resources,
-                         self.list_resources(stack_identifier))
diff --git a/heat_tempest_plugin/tests/functional/test_resource_chain.py b/heat_tempest_plugin/tests/functional/test_resource_chain.py
deleted file mode 100644
index 06ec8ff..0000000
--- a/heat_tempest_plugin/tests/functional/test_resource_chain.py
+++ /dev/null
@@ -1,167 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-TEMPLATE_SIMPLE = '''
-heat_template_version: 2016-04-08
-parameters:
-  string-length:
-    type: number
-resources:
-  my-chain:
-    type: OS::Heat::ResourceChain
-    properties:
-      resources: ['OS::Heat::RandomString', 'OS::Heat::RandomString']
-      resource_properties:
-        length: { get_param: string-length }
-outputs:
-  resource-ids:
-    value: { get_attr: [my-chain, refs] }
-  resource-0-value:
-    value: { get_attr: [my-chain, resource.0, value] }
-  all-resource-attrs:
-    value: { get_attr: [my-chain, attributes, value] }
-'''
-
-TEMPLATE_PARAM_DRIVEN = '''
-heat_template_version: 2016-04-08
-parameters:
-  chain-types:
-    type: comma_delimited_list
-resources:
-  my-chain:
-    type: OS::Heat::ResourceChain
-    properties:
-      resources: { get_param: chain-types }
-'''
-
-
-class ResourceChainTests(functional_base.FunctionalTestsBase):
-
-    def test_create(self):
-        # Test
-        params = {'string-length': 8}
-        stack_id = self.stack_create(template=TEMPLATE_SIMPLE,
-                                     parameters=params)
-
-        # Verify
-        stack = self.client.stacks.get(stack_id)
-        self.assertIsNotNone(stack)
-
-        # Top-level resource for chain
-        expected = {'my-chain': 'OS::Heat::ResourceChain'}
-        found = self.list_resources(stack_id)
-        self.assertEqual(expected, found)
-
-        # Nested stack exists and has two resources
-        nested_id = self.group_nested_identifier(stack_id, 'my-chain')
-        expected = {'0': 'OS::Heat::RandomString',
-                    '1': 'OS::Heat::RandomString'}
-        found = self.list_resources(nested_id)
-        self.assertEqual(expected, found)
-
-        # Outputs
-        resource_ids = self._stack_output(stack, 'resource-ids')
-        self.assertIsNotNone(resource_ids)
-        self.assertEqual(2, len(resource_ids))
-
-        resource_value = self._stack_output(stack, 'resource-0-value')
-        self.assertIsNotNone(resource_value)
-        self.assertEqual(8, len(resource_value))  # from parameter
-
-        resource_attrs = self._stack_output(stack, 'all-resource-attrs')
-        self.assertIsNotNone(resource_attrs)
-        self.assertIsInstance(resource_attrs, dict)
-        self.assertEqual(2, len(resource_attrs))
-        self.assertEqual(8, len(resource_attrs['0']))
-        self.assertEqual(8, len(resource_attrs['1']))
-
-    def test_update(self):
-        # Setup
-        params = {'string-length': 8}
-        stack_id = self.stack_create(template=TEMPLATE_SIMPLE,
-                                     parameters=params)
-
-        update_tmpl = '''
-        heat_template_version: 2016-04-08
-        parameters:
-          string-length:
-            type: number
-        resources:
-          my-chain:
-            type: OS::Heat::ResourceChain
-            properties:
-              resources: ['OS::Heat::None']
-        '''
-
-        # Test
-        self.update_stack(stack_id, template=update_tmpl, parameters=params)
-
-        # Verify
-        # Nested stack only has the None resource
-        nested_id = self.group_nested_identifier(stack_id, 'my-chain')
-        expected = {'0': 'OS::Heat::None'}
-        found = self.list_resources(nested_id)
-        self.assertEqual(expected, found)
-
-    def test_update_resources(self):
-        params = {'chain-types': 'OS::Heat::None'}
-
-        stack_id = self.stack_create(template=TEMPLATE_PARAM_DRIVEN,
-                                     parameters=params)
-
-        nested_id = self.group_nested_identifier(stack_id, 'my-chain')
-        expected = {'0': 'OS::Heat::None'}
-        found = self.list_resources(nested_id)
-        self.assertEqual(expected, found)
-
-        params = {'chain-types': 'OS::Heat::None,OS::Heat::None'}
-        self.update_stack(stack_id, template=TEMPLATE_PARAM_DRIVEN,
-                          parameters=params)
-
-        expected = {'0': 'OS::Heat::None', '1': 'OS::Heat::None'}
-        found = self.list_resources(nested_id)
-        self.assertEqual(expected, found)
-
-    def test_resources_param_driven(self):
-        # Setup
-        params = {'chain-types':
-                  'OS::Heat::None,OS::Heat::RandomString,OS::Heat::None'}
-
-        # Test
-        stack_id = self.stack_create(template=TEMPLATE_PARAM_DRIVEN,
-                                     parameters=params)
-
-        # Verify
-        nested_id = self.group_nested_identifier(stack_id, 'my-chain')
-        expected = {'0': 'OS::Heat::None',
-                    '1': 'OS::Heat::RandomString',
-                    '2': 'OS::Heat::None'}
-        found = self.list_resources(nested_id)
-        self.assertEqual(expected, found)
-
-    def test_resources_env_defined(self):
-        # Setup
-        env = {'parameters': {'chain-types': 'OS::Heat::None'}}
-
-        # Test
-        stack_id = self.stack_create(template=TEMPLATE_PARAM_DRIVEN,
-                                     environment=env)
-
-        # Verify
-        nested_id = self.group_nested_identifier(stack_id, 'my-chain')
-        expected = {'0': 'OS::Heat::None'}
-        found = self.list_resources(nested_id)
-        self.assertEqual(expected, found)
diff --git a/heat_tempest_plugin/tests/functional/test_resource_group.py b/heat_tempest_plugin/tests/functional/test_resource_group.py
deleted file mode 100644
index aea1bda..0000000
--- a/heat_tempest_plugin/tests/functional/test_resource_group.py
+++ /dev/null
@@ -1,695 +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.
-
-import copy
-import json
-
-from heatclient import exc
-import six
-import yaml
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class ResourceGroupTest(functional_base.FunctionalTestsBase):
-    template = '''
-heat_template_version: 2013-05-23
-resources:
-  random_group:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 0
-      resource_def:
-        type: My::RandomString
-        properties:
-          length: 30
-          salt: initial
-outputs:
-  random1:
-    value: {get_attr: [random_group, resource.0.value]}
-  random2:
-    value: {get_attr: [random_group, resource.1.value]}
-  all_values:
-    value: {get_attr: [random_group, value]}
-'''
-
-    def test_resource_group_zero_novalidate(self):
-        # Nested resources should be validated only when size > 0
-        # This allows features to be disabled via size=0 without
-        # triggering validation of nested resource custom constraints
-        # e.g images etc in the nested schema.
-        nested_template_fail = '''
-heat_template_version: 2013-05-23
-parameters:
-  length:
-    type: string
-    default: 50
-  salt:
-    type: string
-    default: initial
-resources:
-  random:
-    type: OS::Heat::RandomString
-    properties:
-      length: BAD
-'''
-
-        files = {'provider.yaml': nested_template_fail}
-        env = {'resource_registry':
-               {'My::RandomString': 'provider.yaml'}}
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files=files,
-            environment=env
-        )
-
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-
-        # Check we created an empty nested stack
-        nested_identifier = self.group_nested_identifier(stack_identifier,
-                                                         'random_group')
-        self.assertEqual({}, self.list_resources(nested_identifier))
-
-        # Prove validation works for non-zero create/update
-        template_two_nested = self.template.replace("count: 0", "count: 2")
-        expected_err = ("resources.random_group<nested_stack>.resources."
-                        "0<provider.yaml>.resources.random: : "
-                        "Value 'BAD' is not an integer")
-        ex = self.assertRaises(exc.HTTPBadRequest, self.update_stack,
-                               stack_identifier, template_two_nested,
-                               environment=env, files=files)
-        self.assertIn(expected_err, six.text_type(ex))
-
-        ex = self.assertRaises(exc.HTTPBadRequest, self.stack_create,
-                               template=template_two_nested,
-                               environment=env, files=files)
-        self.assertIn(expected_err, six.text_type(ex))
-
-    def _validate_resources(self, stack_identifier, expected_count):
-        resources = self.list_group_resources(stack_identifier,
-                                              'random_group')
-        self.assertEqual(expected_count, len(resources))
-        expected_resources = dict(
-            (str(idx), 'My::RandomString')
-            for idx in range(expected_count))
-
-        self.assertEqual(expected_resources, resources)
-
-    def test_create(self):
-        def validate_output(stack, output_key, length):
-            output_value = self._stack_output(stack, output_key)
-            self.assertEqual(length, len(output_value))
-            return output_value
-        # verify that the resources in resource group are identically
-        # configured, resource names and outputs are appropriate.
-        env = {'resource_registry':
-               {'My::RandomString': 'OS::Heat::RandomString'}}
-        create_template = self.template.replace("count: 0", "count: 2")
-        stack_identifier = self.stack_create(template=create_template,
-                                             environment=env)
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-
-        # validate count, type and name of resources in a resource group.
-        self._validate_resources(stack_identifier, 2)
-
-        # validate outputs
-        stack = self.client.stacks.get(stack_identifier)
-        outputs = []
-        outputs.append(validate_output(stack, 'random1', 30))
-        outputs.append(validate_output(stack, 'random2', 30))
-        self.assertEqual(outputs, self._stack_output(stack, 'all_values'))
-
-    def test_update_increase_decrease_count(self):
-        # create stack with resource group count 2
-        env = {'resource_registry':
-               {'My::RandomString': 'OS::Heat::RandomString'}}
-        create_template = self.template.replace("count: 0", "count: 2")
-        stack_identifier = self.stack_create(template=create_template,
-                                             environment=env)
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-        # verify that the resource group has 2 resources
-        self._validate_resources(stack_identifier, 2)
-
-        # increase the resource group count to 5
-        update_template = self.template.replace("count: 0", "count: 5")
-        self.update_stack(stack_identifier, update_template, environment=env)
-        # verify that the resource group has 5 resources
-        self._validate_resources(stack_identifier, 5)
-
-        # decrease the resource group count to 3
-        update_template = self.template.replace("count: 0", "count: 3")
-        self.update_stack(stack_identifier, update_template, environment=env)
-        # verify that the resource group has 3 resources
-        self._validate_resources(stack_identifier, 3)
-
-    def test_update_removal_policies(self):
-        rp_template = '''
-heat_template_version: 2014-10-16
-resources:
-  random_group:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 5
-      removal_policies: []
-      resource_def:
-        type: OS::Heat::RandomString
-'''
-
-        # create stack with resource group, initial count 5
-        stack_identifier = self.stack_create(template=rp_template)
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-        group_resources = self.list_group_resources(stack_identifier,
-                                                    'random_group')
-        expected_resources = {u'0': u'OS::Heat::RandomString',
-                              u'1': u'OS::Heat::RandomString',
-                              u'2': u'OS::Heat::RandomString',
-                              u'3': u'OS::Heat::RandomString',
-                              u'4': u'OS::Heat::RandomString'}
-        self.assertEqual(expected_resources, group_resources)
-
-        # Remove three, specifying the middle resources to be removed
-        update_template = rp_template.replace(
-            'removal_policies: []',
-            'removal_policies: [{resource_list: [\'1\', \'2\', \'3\']}]')
-        self.update_stack(stack_identifier, update_template)
-        group_resources = self.list_group_resources(stack_identifier,
-                                                    'random_group')
-        expected_resources = {u'0': u'OS::Heat::RandomString',
-                              u'4': u'OS::Heat::RandomString',
-                              u'5': u'OS::Heat::RandomString',
-                              u'6': u'OS::Heat::RandomString',
-                              u'7': u'OS::Heat::RandomString'}
-        self.assertEqual(expected_resources, group_resources)
-
-    def test_props_update(self):
-        """Test update of resource_def properties behaves as expected."""
-
-        env = {'resource_registry':
-               {'My::RandomString': 'OS::Heat::RandomString'}}
-        template_one = self.template.replace("count: 0", "count: 1")
-        stack_identifier = self.stack_create(template=template_one,
-                                             environment=env)
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-
-        initial_nested_ident = self.group_nested_identifier(stack_identifier,
-                                                            'random_group')
-        self.assertEqual({'0': 'My::RandomString'},
-                         self.list_resources(initial_nested_ident))
-        # get the resource id
-        res = self.client.resources.get(initial_nested_ident, '0')
-        initial_res_id = res.physical_resource_id
-
-        # change the salt (this should replace the RandomString but
-        # not the nested stack or resource group.
-        template_salt = template_one.replace("salt: initial", "salt: more")
-        self.update_stack(stack_identifier, template_salt, environment=env)
-        updated_nested_ident = self.group_nested_identifier(stack_identifier,
-                                                            'random_group')
-        self.assertEqual(initial_nested_ident, updated_nested_ident)
-
-        # compare the resource id, we expect a change.
-        res = self.client.resources.get(updated_nested_ident, '0')
-        updated_res_id = res.physical_resource_id
-        self.assertNotEqual(initial_res_id, updated_res_id)
-
-    def test_update_nochange(self):
-        """Test update with no properties change."""
-
-        env = {'resource_registry':
-               {'My::RandomString': 'OS::Heat::RandomString'}}
-        template_one = self.template.replace("count: 0", "count: 2")
-        stack_identifier = self.stack_create(template=template_one,
-                                             environment=env)
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-
-        initial_nested_ident = self.group_nested_identifier(stack_identifier,
-                                                            'random_group')
-        self.assertEqual({'0': 'My::RandomString', '1': 'My::RandomString'},
-                         self.list_resources(initial_nested_ident))
-        # get the output
-        stack0 = self.client.stacks.get(stack_identifier)
-        initial_rand = self._stack_output(stack0, 'random1')
-
-        template_copy = copy.deepcopy(template_one)
-        self.update_stack(stack_identifier, template_copy, environment=env)
-        updated_nested_ident = self.group_nested_identifier(stack_identifier,
-                                                            'random_group')
-        self.assertEqual(initial_nested_ident, updated_nested_ident)
-
-        # compare the random number, we expect no change.
-        stack1 = self.client.stacks.get(stack_identifier)
-        updated_rand = self._stack_output(stack1, 'random1')
-        self.assertEqual(initial_rand, updated_rand)
-
-    def test_update_nochange_resource_needs_update(self):
-        """Test update when the resource definition has changed.
-
-        Test the scenario when the ResourceGroup update happens without
-        any changed properties, this can happen if the definition of
-        a contained provider resource changes (files map changes), then
-        the group and underlying nested stack should end up updated.
-        """
-
-        random_templ1 = '''
-heat_template_version: 2013-05-23
-parameters:
-  length:
-    type: string
-    default: not-used
-  salt:
-    type: string
-    default: not-used
-resources:
-  random1:
-    type: OS::Heat::RandomString
-    properties:
-      salt: initial
-outputs:
-  value:
-    value: {get_attr: [random1, value]}
-'''
-        files1 = {'my_random.yaml': random_templ1}
-
-        random_templ2 = random_templ1.replace('salt: initial',
-                                              'salt: more')
-        files2 = {'my_random.yaml': random_templ2}
-
-        env = {'resource_registry':
-               {'My::RandomString': 'my_random.yaml'}}
-
-        template_one = self.template.replace("count: 0", "count: 2")
-        stack_identifier = self.stack_create(template=template_one,
-                                             environment=env,
-                                             files=files1)
-        self.assertEqual({u'random_group': u'OS::Heat::ResourceGroup'},
-                         self.list_resources(stack_identifier))
-        self.assertEqual(files1, self.client.stacks.files(stack_identifier))
-
-        initial_nested_ident = self.group_nested_identifier(stack_identifier,
-                                                            'random_group')
-        self.assertEqual({'0': 'My::RandomString', '1': 'My::RandomString'},
-                         self.list_resources(initial_nested_ident))
-        # get the output
-        stack0 = self.client.stacks.get(stack_identifier)
-        initial_rand = self._stack_output(stack0, 'random1')
-
-        # change the environment so we use a different TemplateResource.
-        # note "files2".
-        self.update_stack(stack_identifier, template_one,
-                          environment=env, files=files2)
-        updated_nested_ident = self.group_nested_identifier(stack_identifier,
-                                                            'random_group')
-        self.assertEqual(initial_nested_ident, updated_nested_ident)
-        self.assertEqual(files2, self.client.stacks.files(stack_identifier))
-
-        # compare the output, we expect a change.
-        stack1 = self.client.stacks.get(stack_identifier)
-        updated_rand = self._stack_output(stack1, 'random1')
-        self.assertNotEqual(initial_rand, updated_rand)
-
-
-class ResourceGroupTestNullParams(functional_base.FunctionalTestsBase):
-    template = '''
-heat_template_version: 2013-05-23
-parameters:
-  param:
-    type: empty
-resources:
-  random_group:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 1
-      resource_def:
-        type: My::RandomString
-        properties:
-          param: {get_param: param}
-outputs:
-  val:
-    value: {get_attr: [random_group, val]}
-'''
-
-    nested_template_file = '''
-heat_template_version: 2013-05-23
-parameters:
-  param:
-    type: empty
-outputs:
-  val:
-    value: {get_param: param}
-'''
-
-    scenarios = [
-        ('string_empty', dict(
-            param='',
-            p_type='string',
-        )),
-        ('boolean_false', dict(
-            param=False,
-            p_type='boolean',
-        )),
-        ('number_zero', dict(
-            param=0,
-            p_type='number',
-        )),
-        ('comma_delimited_list', dict(
-            param=[],
-            p_type='comma_delimited_list',
-        )),
-        ('json_empty', dict(
-            param={},
-            p_type='json',
-        )),
-    ]
-
-    def test_create_pass_zero_parameter(self):
-        templ = self.template.replace('type: empty',
-                                      'type: %s' % self.p_type)
-        n_t_f = self.nested_template_file.replace('type: empty',
-                                                  'type: %s' % self.p_type)
-        files = {'provider.yaml': n_t_f}
-        env = {'resource_registry':
-               {'My::RandomString': 'provider.yaml'}}
-        stack_identifier = self.stack_create(
-            template=templ,
-            files=files,
-            environment=env,
-            parameters={'param': self.param}
-        )
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual(self.param, self._stack_output(stack, 'val')[0])
-
-
-class ResourceGroupAdoptTest(functional_base.FunctionalTestsBase):
-    """Prove that we can do resource group adopt."""
-
-    main_template = '''
-heat_template_version: "2013-05-23"
-resources:
-  group1:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      resource_def:
-        type: OS::Heat::RandomString
-outputs:
-  test0:
-    value: {get_attr: [group1, resource.0.value]}
-  test1:
-    value: {get_attr: [group1, resource.1.value]}
-'''
-
-    def _yaml_to_json(self, yaml_templ):
-        return yaml.safe_load(yaml_templ)
-
-    def test_adopt(self):
-        data = {
-            "resources": {
-                "group1": {
-                    "status": "COMPLETE",
-                    "name": "group1",
-                    "resource_data": {},
-                    "metadata": {},
-                    "resource_id": "test-group1-id",
-                    "action": "CREATE",
-                    "type": "OS::Heat::ResourceGroup",
-                    "resources": {
-                        "0": {
-                            "status": "COMPLETE",
-                            "name": "0",
-                            "resource_data": {"value": "goopie"},
-                            "resource_id": "ID-0",
-                            "action": "CREATE",
-                            "type": "OS::Heat::RandomString",
-                            "metadata": {}
-                        },
-                        "1": {
-                            "status": "COMPLETE",
-                            "name": "1",
-                            "resource_data": {"value": "different"},
-                            "resource_id": "ID-1",
-                            "action": "CREATE",
-                            "type": "OS::Heat::RandomString",
-                            "metadata": {}
-                        }
-                    }
-                }
-            },
-            "environment": {"parameters": {}},
-            "template": yaml.safe_load(self.main_template)
-        }
-        stack_identifier = self.stack_adopt(
-            adopt_data=json.dumps(data))
-
-        self.assert_resource_is_a_stack(stack_identifier, 'group1')
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual('goopie', self._stack_output(stack, 'test0'))
-        self.assertEqual('different', self._stack_output(stack, 'test1'))
-
-
-class ResourceGroupErrorResourceTest(functional_base.FunctionalTestsBase):
-    template = '''
-heat_template_version: "2013-05-23"
-resources:
-  group1:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      resource_def:
-        type: fail.yaml
-'''
-    nested_templ = '''
-heat_template_version: "2013-05-23"
-resources:
-  oops:
-    type: OS::Heat::TestResource
-    properties:
-      fail: true
-      wait_secs: 2
-'''
-
-    def test_fail(self):
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files={'fail.yaml': self.nested_templ},
-            expected_status='CREATE_FAILED',
-            enable_cleanup=False)
-        stack = self.client.stacks.get(stack_identifier)
-
-        self.assertEqual('CREATE_FAILED', stack.stack_status)
-        self.client.stacks.delete(stack_identifier)
-        self._wait_for_stack_status(
-            stack_identifier, 'DELETE_COMPLETE',
-            success_on_not_found=True)
-
-
-class ResourceGroupUpdatePolicyTest(functional_base.FunctionalTestsBase):
-
-    template = '''
-heat_template_version: '2015-04-30'
-resources:
-  random_group:
-    type: OS::Heat::ResourceGroup
-    update_policy:
-      rolling_update:
-        min_in_service: 1
-        max_batch_size: 2
-        pause_time: 1
-    properties:
-      count: 10
-      resource_def:
-        type: OS::Heat::TestResource
-        properties:
-          value: initial
-          update_replace: False
-'''
-
-    def update_resource_group(self, update_template,
-                              updated, created, deleted):
-        stack_identifier = self.stack_create(template=self.template)
-        group_resources = self.list_group_resources(stack_identifier,
-                                                    'random_group',
-                                                    minimal=False)
-
-        init_names = [res.physical_resource_id for res in group_resources]
-
-        self.update_stack(stack_identifier, update_template)
-        group_resources = self.list_group_resources(stack_identifier,
-                                                    'random_group',
-                                                    minimal=False)
-
-        updt_names = [res.physical_resource_id for res in group_resources]
-
-        matched_names = set(updt_names) & set(init_names)
-
-        self.assertEqual(updated, len(matched_names))
-
-        self.assertEqual(created, len(set(updt_names) - set(init_names)))
-
-        self.assertEqual(deleted, len(set(init_names) - set(updt_names)))
-
-    def test_resource_group_update(self):
-        """Test rolling update with no conflict.
-
-        Simple rolling update with no conflict in batch size
-        and minimum instances in service.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '1'
-        policy['max_batch_size'] = '3'
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-
-        self.update_resource_group(updt_template,
-                                   updated=10,
-                                   created=0,
-                                   deleted=0)
-
-    def test_resource_group_update_replace(self):
-        """Test rolling update(replace)with no conflict.
-
-        Simple rolling update replace with no conflict in batch size
-        and minimum instances in service.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '1'
-        policy['max_batch_size'] = '3'
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-        res_def['properties']['update_replace'] = True
-
-        self.update_resource_group(updt_template,
-                                   updated=0,
-                                   created=10,
-                                   deleted=10)
-
-    def test_resource_group_update_scaledown(self):
-        """Test rolling update with scaledown.
-
-        Simple rolling update with reduced size.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '1'
-        policy['max_batch_size'] = '3'
-        grp['properties']['count'] = 6
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-
-        self.update_resource_group(updt_template,
-                                   updated=6,
-                                   created=0,
-                                   deleted=4)
-
-    def test_resource_group_update_scaleup(self):
-        """Test rolling update with scaleup.
-
-        Simple rolling update with increased size.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '1'
-        policy['max_batch_size'] = '3'
-        grp['properties']['count'] = 12
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-
-        self.update_resource_group(updt_template,
-                                   updated=10,
-                                   created=2,
-                                   deleted=0)
-
-    def test_resource_group_update_adjusted(self):
-        """Test rolling update with enough available resources
-
-        Update  with capacity adjustment with enough resources.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '8'
-        policy['max_batch_size'] = '4'
-        grp['properties']['count'] = 6
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-
-        self.update_resource_group(updt_template,
-                                   updated=6,
-                                   created=0,
-                                   deleted=4)
-
-    def test_resource_group_update_with_adjusted_capacity(self):
-        """Test rolling update with capacity adjustment.
-
-        Rolling update with capacity adjustment due to conflict in
-        batch size and minimum instances in service.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '8'
-        policy['max_batch_size'] = '4'
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-
-        self.update_resource_group(updt_template,
-                                   updated=10,
-                                   created=0,
-                                   deleted=0)
-
-    def test_resource_group_update_huge_batch_size(self):
-        """Test rolling update with huge batch size.
-
-        Rolling Update with a huge batch size(more than
-        current size).
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '0'
-        policy['max_batch_size'] = '20'
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-        self.update_resource_group(updt_template,
-                                   updated=10,
-                                   created=0,
-                                   deleted=0)
-
-    def test_resource_group_update_huge_min_in_service(self):
-        """Test rolling update with huge minimum capacity.
-
-        Rolling Update with a huge number of minimum instances
-        in service.
-        """
-        updt_template = yaml.safe_load(copy.deepcopy(self.template))
-        grp = updt_template['resources']['random_group']
-        policy = grp['update_policy']['rolling_update']
-        policy['min_in_service'] = '20'
-        policy['max_batch_size'] = '1'
-        res_def = grp['properties']['resource_def']
-        res_def['properties']['value'] = 'updated'
-
-        self.update_resource_group(updt_template,
-                                   updated=10,
-                                   created=0,
-                                   deleted=0)
diff --git a/heat_tempest_plugin/tests/functional/test_simultaneous_update.py b/heat_tempest_plugin/tests/functional/test_simultaneous_update.py
deleted file mode 100644
index 3cfbeaa..0000000
--- a/heat_tempest_plugin/tests/functional/test_simultaneous_update.py
+++ /dev/null
@@ -1,93 +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.
-
-
-import copy
-import time
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-_test_template = {
-    'heat_template_version': 'pike',
-    'description': 'Test template to create two resources.',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0,
-            }
-        },
-        'test2': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'fail': False,
-                'update_replace': False,
-                'wait_secs': 0,
-                'action_wait_secs': {
-                    'create': 30,
-                }
-            },
-            'depends_on': ['test1']
-        }
-    }
-}
-
-
-def get_templates(fail=False, delay_s=None):
-    before = copy.deepcopy(_test_template)
-
-    after = copy.deepcopy(before)
-    for r in after['resources'].values():
-        r['properties']['value'] = 'Test2'
-
-    before_props = before['resources']['test2']['properties']
-    before_props['fail'] = fail
-    if delay_s is not None:
-        before_props['action_wait_secs']['create'] = delay_s
-
-    return before, after
-
-
-class SimultaneousUpdateStackTest(functional_base.FunctionalTestsBase):
-
-    @test.requires_convergence
-    def test_retrigger_success(self):
-        before, after = get_templates()
-        stack_id = self.stack_create(template=before,
-                                     expected_status='CREATE_IN_PROGRESS')
-        time.sleep(10)
-
-        self.update_stack(stack_id, after)
-
-    @test.requires_convergence
-    def test_retrigger_failure(self):
-        before, after = get_templates(fail=True)
-        stack_id = self.stack_create(template=before,
-                                     expected_status='CREATE_IN_PROGRESS')
-        time.sleep(10)
-
-        self.update_stack(stack_id, after)
-
-    @test.requires_convergence
-    def test_retrigger_timeout(self):
-        before, after = get_templates(delay_s=70)
-        stack_id = self.stack_create(template=before,
-                                     expected_status='CREATE_IN_PROGRESS',
-                                     timeout=1)
-        time.sleep(50)
-
-        self.update_stack(stack_id, after)
diff --git a/heat_tempest_plugin/tests/functional/test_snapshot_restore.py b/heat_tempest_plugin/tests/functional/test_snapshot_restore.py
deleted file mode 100644
index 3616c8f..0000000
--- a/heat_tempest_plugin/tests/functional/test_snapshot_restore.py
+++ /dev/null
@@ -1,76 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-class StackSnapshotRestoreTest(functional_base.FunctionalTestsBase):
-
-    def setUp(self):
-        super(StackSnapshotRestoreTest, self).setUp()
-        if not self.conf.minimal_image_ref:
-            raise self.skipException("No image configured to test")
-
-        if not self.conf.minimal_instance_type:
-            raise self.skipException(
-                "No minimal_instance_type configured to test")
-
-        self.assign_keypair()
-
-    def test_stack_snapshot_restore(self):
-        template = '''
-heat_template_version: ocata
-parameters:
-  keyname:
-    type: string
-  flavor:
-    type: string
-  image:
-    type: string
-  network:
-    type: string
-resources:
-  my_port:
-    type: OS::Neutron::Port
-    properties:
-      network: {get_param: network}
-  my_server:
-    type: OS::Nova::Server
-    properties:
-      image: {get_param: image}
-      flavor: {get_param: flavor}
-      key_name: {get_param: keyname}
-      networks: [{port: {get_resource: my_port} }]
-
-'''
-
-        def get_server_image(server_id):
-            server = self.compute_client.servers.get(server_id)
-            return server.image['id']
-
-        parameters = {'keyname': self.keypair_name,
-                      'flavor': self.conf.minimal_instance_type,
-                      'image': self.conf.minimal_image_ref,
-                      'network': self.conf.fixed_network_name}
-        stack_identifier = self.stack_create(template=template,
-                                             parameters=parameters)
-        server_resource = self.client.resources.get(
-            stack_identifier, 'my_server')
-        server_id = server_resource.physical_resource_id
-        prev_image_id = get_server_image(server_id)
-
-        # Do snapshot and restore
-        snapshot_id = self.stack_snapshot(stack_identifier)
-        self.stack_restore(stack_identifier, snapshot_id)
-
-        self.assertNotEqual(prev_image_id, get_server_image(server_id))
diff --git a/heat_tempest_plugin/tests/functional/test_software_deployment_group.py b/heat_tempest_plugin/tests/functional/test_software_deployment_group.py
deleted file mode 100644
index a298419..0000000
--- a/heat_tempest_plugin/tests/functional/test_software_deployment_group.py
+++ /dev/null
@@ -1,150 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-class SoftwareDeploymentGroupTest(functional_base.FunctionalTestsBase):
-    sd_template = '''
-heat_template_version: 2016-10-14
-
-parameters:
-  input:
-    type: string
-    default: foo_input
-
-resources:
-  config:
-    type: OS::Heat::SoftwareConfig
-    properties:
-      group: script
-      inputs:
-      - name: foo
-
-  deployment:
-    type: OS::Heat::SoftwareDeploymentGroup
-    properties:
-      config: {get_resource: config}
-      input_values:
-        foo: {get_param: input}
-      servers:
-        '0': dummy0
-        '1': dummy1
-        '2': dummy2
-        '3': dummy3
-'''
-
-    sd_template_with_upd_policy = '''
-heat_template_version: 2016-10-14
-
-parameters:
-  input:
-    type: string
-    default: foo_input
-
-resources:
-  config:
-    type: OS::Heat::SoftwareConfig
-    properties:
-      group: script
-      inputs:
-      - name: foo
-
-  deployment:
-    type: OS::Heat::SoftwareDeploymentGroup
-    update_policy:
-      rolling_update:
-        max_batch_size: 2
-        pause_time: 1
-    properties:
-      config: {get_resource: config}
-      input_values:
-        foo: {get_param: input}
-      servers:
-        '0': dummy0
-        '1': dummy1
-        '2': dummy2
-        '3': dummy3
-'''
-    enable_cleanup = True
-
-    def deployment_crud(self, template):
-        stack_identifier = self.stack_create(
-            template=template,
-            enable_cleanup=self.enable_cleanup,
-            expected_status='CREATE_IN_PROGRESS')
-        self._wait_for_resource_status(
-            stack_identifier, 'deployment', 'CREATE_IN_PROGRESS')
-
-        # Wait for all deployment resources to become IN_PROGRESS, since only
-        # IN_PROGRESS resources get signalled
-        nested_identifier = self.assert_resource_is_a_stack(
-            stack_identifier, 'deployment')
-        self._wait_for_stack_status(nested_identifier, 'CREATE_IN_PROGRESS')
-        self._wait_for_all_resource_status(nested_identifier,
-                                           'CREATE_IN_PROGRESS')
-        group_resources = self.list_group_resources(
-            stack_identifier, 'deployment', minimal=False)
-
-        self.assertEqual(4, len(group_resources))
-        self._wait_for_stack_status(stack_identifier, 'CREATE_COMPLETE',
-                                    signal_required=True,
-                                    resources_to_signal=group_resources)
-
-        created_group_resources = self.list_group_resources(
-            stack_identifier, 'deployment', minimal=False)
-        self.assertEqual(4, len(created_group_resources))
-        self.check_input_values(created_group_resources, 'foo', 'foo_input')
-
-        self.update_stack(stack_identifier,
-                          template=template,
-                          environment={'parameters': {'input': 'input2'}},
-                          expected_status='UPDATE_IN_PROGRESS')
-        nested_identifier = self.assert_resource_is_a_stack(
-            stack_identifier, 'deployment')
-        self._wait_for_stack_status(stack_identifier, 'UPDATE_COMPLETE',
-                                    signal_required=True,
-                                    resources_to_signal=group_resources)
-
-        self.check_input_values(created_group_resources, 'foo', 'input2')
-
-        # We explicitly test delete here, vs just via cleanup and check
-        # the nested stack is gone
-        self._stack_delete(stack_identifier)
-        self._wait_for_stack_status(
-            nested_identifier, 'DELETE_COMPLETE',
-            success_on_not_found=True)
-
-    def test_deployment_crud(self):
-        self.deployment_crud(self.sd_template)
-
-    def test_deployment_crud_with_rolling_update(self):
-        self.deployment_crud(self.sd_template_with_upd_policy)
-
-    def test_deployments_create_delete_in_progress(self):
-        stack_identifier = self.stack_create(
-            template=self.sd_template,
-            enable_cleanup=self.enable_cleanup,
-            expected_status='CREATE_IN_PROGRESS')
-        self._wait_for_resource_status(
-            stack_identifier, 'deployment', 'CREATE_IN_PROGRESS')
-        nested_identifier = self.assert_resource_is_a_stack(
-            stack_identifier, 'deployment')
-        group_resources = self.list_group_resources(
-            stack_identifier, 'deployment', minimal=False)
-
-        self.assertEqual(4, len(group_resources))
-        # Now test delete while the stacks are still IN_PROGRESS
-        self._stack_delete(stack_identifier)
-        self._wait_for_stack_status(
-            nested_identifier, 'DELETE_COMPLETE',
-            success_on_not_found=True)
diff --git a/heat_tempest_plugin/tests/functional/test_stack_cancel.py b/heat_tempest_plugin/tests/functional/test_stack_cancel.py
deleted file mode 100644
index ba5e989..0000000
--- a/heat_tempest_plugin/tests/functional/test_stack_cancel.py
+++ /dev/null
@@ -1,92 +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.
-
-import copy
-import eventlet
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-template = {
-    'heat_template_version': 'pike',
-    'resources': {
-        'test1': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                'action_wait_secs': {
-                    'update': 30,
-                }
-            }
-        },
-        'test2': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': 'Test1',
-                },
-            'depends_on': ['test1']
-        },
-    }
-}
-
-
-def get_templates(delay_s=None):
-    before = copy.deepcopy(template)
-    after = copy.deepcopy(before)
-    for r in after['resources'].values():
-        r['properties']['value'] = 'Test2'
-
-    if delay_s:
-        before_props = before['resources']['test1']['properties']
-        before_props['action_wait_secs']['create'] = delay_s
-    return before, after
-
-
-class StackCancelTest(functional_base.FunctionalTestsBase):
-
-    def _test_cancel_update(self, rollback=True,
-                            expected_status='ROLLBACK_COMPLETE'):
-        before, after = get_templates()
-        stack_id = self.stack_create(template=before)
-        self.update_stack(stack_id, template=after,
-                          expected_status='UPDATE_IN_PROGRESS')
-        self._wait_for_resource_status(stack_id, 'test1', 'UPDATE_IN_PROGRESS')
-        self.cancel_update_stack(stack_id, rollback, expected_status)
-        return stack_id
-
-    def test_cancel_update_with_rollback(self):
-        self._test_cancel_update()
-
-    def test_cancel_update_without_rollback(self):
-        stack_id = self._test_cancel_update(rollback=False,
-                                            expected_status='UPDATE_FAILED')
-        self.assertTrue(test.call_until_true(
-            60, 2, self.verify_resource_status,
-            stack_id, 'test1', 'UPDATE_COMPLETE'))
-        eventlet.sleep(2)
-        self.assertTrue(self.verify_resource_status(stack_id, 'test2',
-                                                    'CREATE_COMPLETE'))
-
-    def test_cancel_create_without_rollback(self):
-        before, after = get_templates(delay_s=30)
-        stack_id = self.stack_create(template=before,
-                                     expected_status='CREATE_IN_PROGRESS')
-        self._wait_for_resource_status(stack_id, 'test1', 'CREATE_IN_PROGRESS')
-        self.cancel_update_stack(stack_id, rollback=False,
-                                 expected_status='CREATE_FAILED')
-        self.assertTrue(test.call_until_true(
-            60, 2, self.verify_resource_status,
-            stack_id, 'test1', 'CREATE_COMPLETE'))
-        eventlet.sleep(2)
-        self.assertTrue(self.verify_resource_status(stack_id, 'test2',
-                                                    'INIT_COMPLETE'))
diff --git a/heat_tempest_plugin/tests/functional/test_swiftsignal_update.py b/heat_tempest_plugin/tests/functional/test_swiftsignal_update.py
deleted file mode 100644
index 604e592..0000000
--- a/heat_tempest_plugin/tests/functional/test_swiftsignal_update.py
+++ /dev/null
@@ -1,46 +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 heat_tempest_plugin.tests.functional import functional_base
-
-test_template = '''
-heat_template_version: 2014-10-16
-
-resources:
-  signal_handle:
-    type: "OS::Heat::SwiftSignalHandle"
-
-outputs:
-  signal_curl:
-    value: { get_attr: ['signal_handle', 'curl_cli'] }
-    description: Swift signal cURL
-
-  signal_url:
-    value: { get_attr: ['signal_handle', 'endpoint'] }
-    description: Swift signal URL
-'''
-
-
-class SwiftSignalHandleUpdateTest(functional_base.FunctionalTestsBase):
-
-    def test_stack_update_same_template_replace_no_url(self):
-        if not self.is_service_available('object-store'):
-            self.skipTest('object-store service not available, skipping')
-        stack_identifier = self.stack_create(template=test_template)
-        stack = self.client.stacks.get(stack_identifier)
-        orig_url = self._stack_output(stack, 'signal_url')
-        orig_curl = self._stack_output(stack, 'signal_curl')
-        self.update_stack(stack_identifier, test_template)
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual(orig_url, self._stack_output(stack, 'signal_url'))
-        self.assertEqual(orig_curl, self._stack_output(stack, 'signal_curl'))
diff --git a/heat_tempest_plugin/tests/functional/test_template_resource.py b/heat_tempest_plugin/tests/functional/test_template_resource.py
deleted file mode 100644
index a7cc808..0000000
--- a/heat_tempest_plugin/tests/functional/test_template_resource.py
+++ /dev/null
@@ -1,982 +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.
-
-import json
-
-from heatclient import exc as heat_exceptions
-import six
-import yaml
-
-from heat_tempest_plugin.common import test
-from heat_tempest_plugin.tests.functional import functional_base
-
-
-class TemplateResourceTest(functional_base.FunctionalTestsBase):
-    """Prove that we can use the registry in a nested provider."""
-
-    template = '''
-heat_template_version: 2013-05-23
-resources:
-  secret1:
-    type: OS::Heat::RandomString
-outputs:
-  secret-out:
-    value: { get_attr: [secret1, value] }
-'''
-    nested_templ = '''
-heat_template_version: 2013-05-23
-resources:
-  secret2:
-    type: OS::Heat::RandomString
-outputs:
-  value:
-    value: { get_attr: [secret2, value] }
-'''
-
-    env_templ = '''
-resource_registry:
-  "OS::Heat::RandomString": nested.yaml
-'''
-
-    def test_nested_env(self):
-        main_templ = '''
-heat_template_version: 2013-05-23
-resources:
-  secret1:
-    type: My::NestedSecret
-outputs:
-  secret-out:
-    value: { get_attr: [secret1, value] }
-'''
-
-        nested_templ = '''
-heat_template_version: 2013-05-23
-resources:
-  secret2:
-    type: My::Secret
-outputs:
-  value:
-    value: { get_attr: [secret2, value] }
-'''
-
-        env_templ = '''
-resource_registry:
-  "My::Secret": "OS::Heat::RandomString"
-  "My::NestedSecret": nested.yaml
-'''
-
-        stack_identifier = self.stack_create(
-            template=main_templ,
-            files={'nested.yaml': nested_templ},
-            environment=env_templ)
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'secret1')
-        # prove that resource.parent_resource is populated.
-        sec2 = self.client.resources.get(nested_ident, 'secret2')
-        self.assertEqual('secret1', sec2.parent_resource)
-
-    def test_no_infinite_recursion(self):
-        """Prove that we can override a python resource.
-
-        And use that resource within the template resource.
-        """
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files={'nested.yaml': self.nested_templ},
-            environment=self.env_templ)
-        self.assert_resource_is_a_stack(stack_identifier, 'secret1')
-
-    def test_nested_stack_delete_then_delete_parent_stack(self):
-        """Check the robustness of stack deletion.
-
-        This tests that if you manually delete a nested
-        stack, the parent stack is still deletable.
-        """
-        # disable cleanup so we can call _stack_delete() directly.
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files={'nested.yaml': self.nested_templ},
-            environment=self.env_templ,
-            enable_cleanup=False)
-
-        nested_ident = self.assert_resource_is_a_stack(stack_identifier,
-                                                       'secret1')
-
-        self._stack_delete(nested_ident)
-        self._stack_delete(stack_identifier)
-
-    def test_change_in_file_path(self):
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files={'nested.yaml': self.nested_templ},
-            environment=self.env_templ)
-        stack = self.client.stacks.get(stack_identifier)
-        secret_out1 = self._stack_output(stack, 'secret-out')
-
-        nested_templ_2 = '''
-heat_template_version: 2013-05-23
-resources:
-  secret2:
-    type: OS::Heat::RandomString
-outputs:
-  value:
-    value: freddy
-'''
-        env_templ_2 = '''
-resource_registry:
-  "OS::Heat::RandomString": new/nested.yaml
-'''
-        self.update_stack(stack_identifier,
-                          template=self.template,
-                          files={'new/nested.yaml': nested_templ_2},
-                          environment=env_templ_2)
-        stack = self.client.stacks.get(stack_identifier)
-        secret_out2 = self._stack_output(stack, 'secret-out')
-        self.assertNotEqual(secret_out1, secret_out2)
-        self.assertEqual('freddy', secret_out2)
-
-
-class NestedAttributesTest(functional_base.FunctionalTestsBase):
-    """Prove that we can use the template resource references."""
-
-    main_templ = '''
-heat_template_version: 2014-10-16
-resources:
-  secret2:
-    type: My::NestedSecret
-outputs:
-  old_way:
-    value: { get_attr: [secret2, nested_str]}
-  test_attr1:
-    value: { get_attr: [secret2, resource.secret1, value]}
-  test_attr2:
-    value: { get_attr: [secret2, resource.secret1.value]}
-  test_ref:
-    value: { get_resource: secret2 }
-'''
-
-    env_templ = '''
-resource_registry:
-  "My::NestedSecret": nested.yaml
-'''
-
-    def test_stack_ref(self):
-        nested_templ = '''
-heat_template_version: 2014-10-16
-resources:
-  secret1:
-    type: OS::Heat::RandomString
-outputs:
-  nested_str:
-    value: {get_attr: [secret1, value]}
-'''
-        stack_identifier = self.stack_create(
-            template=self.main_templ,
-            files={'nested.yaml': nested_templ},
-            environment=self.env_templ)
-        self.assert_resource_is_a_stack(stack_identifier, 'secret2')
-        stack = self.client.stacks.get(stack_identifier)
-        test_ref = self._stack_output(stack, 'test_ref')
-        self.assertIn('arn:openstack:heat:', test_ref)
-
-    def test_transparent_ref(self):
-        """Test using nested resource more transparently.
-
-        With the addition of OS::stack_id we can now use the nested resource
-        more transparently.
-        """
-
-        nested_templ = '''
-heat_template_version: 2014-10-16
-resources:
-  secret1:
-    type: OS::Heat::RandomString
-outputs:
-  OS::stack_id:
-    value: {get_resource: secret1}
-  nested_str:
-    value: {get_attr: [secret1, value]}
-'''
-        stack_identifier = self.stack_create(
-            template=self.main_templ,
-            files={'nested.yaml': nested_templ},
-            environment=self.env_templ)
-        self.assert_resource_is_a_stack(stack_identifier, 'secret2')
-        stack = self.client.stacks.get(stack_identifier)
-        test_ref = self._stack_output(stack, 'test_ref')
-        test_attr = self._stack_output(stack, 'old_way')
-
-        self.assertNotIn('arn:openstack:heat', test_ref)
-        self.assertEqual(test_attr, test_ref)
-
-    def test_nested_attributes(self):
-        nested_templ = '''
-heat_template_version: 2014-10-16
-resources:
-  secret1:
-    type: OS::Heat::RandomString
-outputs:
-  nested_str:
-    value: {get_attr: [secret1, value]}
-'''
-        stack_identifier = self.stack_create(
-            template=self.main_templ,
-            files={'nested.yaml': nested_templ},
-            environment=self.env_templ)
-        self.assert_resource_is_a_stack(stack_identifier, 'secret2')
-        stack = self.client.stacks.get(stack_identifier)
-        old_way = self._stack_output(stack, 'old_way')
-        test_attr1 = self._stack_output(stack, 'test_attr1')
-        test_attr2 = self._stack_output(stack, 'test_attr2')
-
-        self.assertEqual(old_way, test_attr1)
-        self.assertEqual(old_way, test_attr2)
-
-
-class TemplateResourceFacadeTest(functional_base.FunctionalTestsBase):
-    """Prove that we can use ResourceFacade in a HOT template."""
-
-    main_template = '''
-heat_template_version: 2013-05-23
-resources:
-  the_nested:
-    type: the.yaml
-    metadata:
-      foo: bar
-outputs:
-  value:
-    value: {get_attr: [the_nested, output]}
-'''
-
-    nested_templ = '''
-heat_template_version: 2013-05-23
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value: {"Fn::Select": [foo, {resource_facade: metadata}]}
-outputs:
-  output:
-    value: {get_attr: [test, output]}
-    '''
-
-    def test_metadata(self):
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            files={'the.yaml': self.nested_templ})
-        stack = self.client.stacks.get(stack_identifier)
-        value = self._stack_output(stack, 'value')
-        self.assertEqual('bar', value)
-
-
-class TemplateResourceUpdateTest(functional_base.FunctionalTestsBase):
-    """Prove that we can do template resource updates."""
-
-    main_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: the.yaml
-    Properties:
-      one: my_name
-      two: your_name
-Outputs:
-  identifier:
-    Value: {Ref: the_nested}
-  value:
-    Value: {'Fn::GetAtt': [the_nested, the_str]}
-'''
-
-    main_template_change_prop = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: the.yaml
-    Properties:
-      one: updated_name
-      two: your_name
-
-Outputs:
-  identifier:
-    Value: {Ref: the_nested}
-  value:
-    Value: {'Fn::GetAtt': [the_nested, the_str]}
-'''
-
-    main_template_add_prop = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: the.yaml
-    Properties:
-      one: my_name
-      two: your_name
-      three: third_name
-
-Outputs:
-  identifier:
-    Value: {Ref: the_nested}
-  value:
-    Value: {'Fn::GetAtt': [the_nested, the_str]}
-'''
-
-    main_template_remove_prop = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: the.yaml
-    Properties:
-      one: my_name
-
-Outputs:
-  identifier:
-    Value: {Ref: the_nested}
-  value:
-    Value: {'Fn::GetAtt': [the_nested, the_str]}
-'''
-
-    initial_tmpl = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: foo
-    Type: String
-  two:
-    Default: bar
-    Type: String
-
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: one}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [NestedResource, value]}
-'''
-
-    prop_change_tmpl = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: yikes
-    Type: String
-  two:
-    Default: foo
-    Type: String
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: two}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [NestedResource, value]}
-'''
-
-    prop_add_tmpl = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: yikes
-    Type: String
-  two:
-    Default: foo
-    Type: String
-  three:
-    Default: bar
-    Type: String
-
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: three}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [NestedResource, value]}
-'''
-
-    prop_remove_tmpl = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: yikes
-    Type: String
-
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: one}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [NestedResource, value]}
-'''
-
-    attr_change_tmpl = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: foo
-    Type: String
-  two:
-    Default: bar
-    Type: String
-
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: one}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [NestedResource, value]}
-  something_else:
-    Value: just_a_string
-'''
-
-    content_change_tmpl = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: foo
-    Type: String
-  two:
-    Default: bar
-    Type: String
-
-Resources:
-  NestedResource:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: yum
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [NestedResource, value]}
-'''
-
-    EXPECTED = (UPDATE, NOCHANGE) = ('update', 'nochange')
-    scenarios = [
-        ('no_changes', dict(template=main_template,
-                            provider=initial_tmpl,
-                            expect=NOCHANGE)),
-        ('main_tmpl_change', dict(template=main_template_change_prop,
-                                  provider=initial_tmpl,
-                                  expect=UPDATE)),
-        ('provider_change', dict(template=main_template,
-                                 provider=content_change_tmpl,
-                                 expect=UPDATE)),
-        ('provider_props_change', dict(template=main_template,
-                                       provider=prop_change_tmpl,
-                                       expect=UPDATE)),
-        ('provider_props_add', dict(template=main_template_add_prop,
-                                    provider=prop_add_tmpl,
-                                    expect=UPDATE)),
-        ('provider_props_remove', dict(template=main_template_remove_prop,
-                                       provider=prop_remove_tmpl,
-                                       expect=NOCHANGE)),
-        ('provider_attr_change', dict(template=main_template,
-                                      provider=attr_change_tmpl,
-                                      expect=NOCHANGE)),
-    ]
-
-    def test_template_resource_update_template_schema(self):
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            files={'the.yaml': self.initial_tmpl})
-        stack = self.client.stacks.get(stack_identifier)
-        initial_id = self._stack_output(stack, 'identifier')
-        initial_val = self._stack_output(stack, 'value')
-
-        self.update_stack(stack_identifier,
-                          self.template,
-                          files={'the.yaml': self.provider})
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual(initial_id,
-                         self._stack_output(stack, 'identifier'))
-        if self.expect == self.NOCHANGE:
-            self.assertEqual(initial_val,
-                             self._stack_output(stack, 'value'))
-        else:
-            self.assertNotEqual(initial_val,
-                                self._stack_output(stack, 'value'))
-
-
-class TemplateResourceUpdateFailedTest(functional_base.FunctionalTestsBase):
-    """Prove that we can do updates on a nested stack to fix a stack."""
-
-    main_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  keypair:
-    Type: OS::Nova::KeyPair
-    Properties:
-      name: replace-this
-      save_private_key: false
-  server:
-    Type: server_fail.yaml
-    DependsOn: keypair
-'''
-    nested_templ = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  RealRandom:
-    Type: OS::Heat::RandomString
-'''
-
-    def setUp(self):
-        super(TemplateResourceUpdateFailedTest, self).setUp()
-        self.assign_keypair()
-
-    def test_update_on_failed_create(self):
-        # create a stack with "server" dependent on "keypair", but
-        # keypair fails, so "server" is not created properly.
-        # We then fix the template and it should succeed.
-        broken_templ = self.main_template.replace('replace-this',
-                                                  self.keypair_name)
-        stack_identifier = self.stack_create(
-            template=broken_templ,
-            files={'server_fail.yaml': self.nested_templ},
-            expected_status='CREATE_FAILED')
-
-        fixed_templ = self.main_template.replace('replace-this',
-                                                 test.rand_name())
-        self.update_stack(stack_identifier,
-                          fixed_templ,
-                          files={'server_fail.yaml': self.nested_templ})
-
-
-class TemplateResourceAdoptTest(functional_base.FunctionalTestsBase):
-    """Prove that we can do template resource adopt/abandon."""
-
-    main_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: the.yaml
-    Properties:
-      one: my_name
-Outputs:
-  identifier:
-    Value: {Ref: the_nested}
-  value:
-    Value: {'Fn::GetAtt': [the_nested, the_str]}
-'''
-
-    nested_templ = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: foo
-    Type: String
-Resources:
-  RealRandom:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: one}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [RealRandom, value]}
-'''
-
-    def _yaml_to_json(self, yaml_templ):
-        return yaml.safe_load(yaml_templ)
-
-    def test_abandon(self):
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            files={'the.yaml': self.nested_templ},
-            enable_cleanup=False
-        )
-
-        info = self.stack_abandon(stack_id=stack_identifier)
-        self.assertEqual(self._yaml_to_json(self.main_template),
-                         info['template'])
-        self.assertEqual(self._yaml_to_json(self.nested_templ),
-                         info['resources']['the_nested']['template'])
-        # TODO(james combs): Implement separate test cases for export
-        # once export REST API is available.  Also test reverse order
-        # of invocation: export -> abandon AND abandon -> export
-
-    def test_adopt(self):
-        data = {
-            'resources': {
-                'the_nested': {
-                    "type": "the.yaml",
-                    "resources": {
-                        "RealRandom": {
-                            "type": "OS::Heat::RandomString",
-                            'resource_data': {'value': 'goopie'},
-                            'resource_id': 'froggy'
-                        }
-                    }
-                }
-            },
-            "environment": {"parameters": {}},
-            "template": yaml.safe_load(self.main_template)
-        }
-
-        stack_identifier = self.stack_adopt(
-            adopt_data=json.dumps(data),
-            files={'the.yaml': self.nested_templ})
-
-        self.assert_resource_is_a_stack(stack_identifier, 'the_nested')
-        stack = self.client.stacks.get(stack_identifier)
-        self.assertEqual('goopie', self._stack_output(stack, 'value'))
-
-
-class TemplateResourceCheckTest(functional_base.FunctionalTestsBase):
-    """Prove that we can do template resource check."""
-
-    main_template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  the_nested:
-    Type: the.yaml
-    Properties:
-      one: my_name
-Outputs:
-  identifier:
-    Value: {Ref: the_nested}
-  value:
-    Value: {'Fn::GetAtt': [the_nested, the_str]}
-'''
-
-    nested_templ = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
-  one:
-    Default: foo
-    Type: String
-Resources:
-  RealRandom:
-    Type: OS::Heat::RandomString
-    Properties:
-      salt: {Ref: one}
-Outputs:
-  the_str:
-    Value: {'Fn::GetAtt': [RealRandom, value]}
-'''
-
-    def test_check(self):
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            files={'the.yaml': self.nested_templ}
-        )
-
-        self.client.actions.check(stack_id=stack_identifier)
-        self._wait_for_stack_status(stack_identifier, 'CHECK_COMPLETE')
-
-
-class TemplateResourceErrorMessageTest(functional_base.FunctionalTestsBase):
-    """Prove that nested stack errors don't suck."""
-
-    template = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  victim:
-    Type: fail.yaml
-'''
-    nested_templ = '''
-HeatTemplateFormatVersion: '2012-12-12'
-Resources:
-  oops:
-    Type: OS::Heat::TestResource
-    Properties:
-      fail: true
-      wait_secs: 2
-'''
-
-    def test_fail(self):
-        stack_identifier = self.stack_create(
-            template=self.template,
-            files={'fail.yaml': self.nested_templ},
-            expected_status='CREATE_FAILED')
-        stack = self.client.stacks.get(stack_identifier)
-
-        exp_path = 'resources.victim.resources.oops'
-        exp_msg = 'Test Resource failed oops'
-        exp = 'Resource CREATE failed: ValueError: %s: %s' % (exp_path,
-                                                              exp_msg)
-        self.assertEqual(exp, stack.stack_status_reason)
-
-
-class TemplateResourceSuspendResumeTest(functional_base.FunctionalTestsBase):
-    """Prove that we can do template resource suspend/resume."""
-
-    main_template = '''
-heat_template_version: 2014-10-16
-parameters:
-resources:
-  the_nested:
-    type: the.yaml
-'''
-
-    nested_templ = '''
-heat_template_version: 2014-10-16
-resources:
-  test_random_string:
-    type: OS::Heat::RandomString
-'''
-
-    def test_suspend_resume(self):
-        """Basic test for template resource suspend resume."""
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            files={'the.yaml': self.nested_templ}
-        )
-
-        self.stack_suspend(stack_identifier=stack_identifier)
-        self.stack_resume(stack_identifier=stack_identifier)
-
-
-class ValidateFacadeTest(functional_base.FunctionalTestsBase):
-    """Prove that nested stack errors don't suck."""
-
-    template = '''
-heat_template_version: 2015-10-15
-resources:
-  thisone:
-    type: OS::Thingy
-    properties:
-      one: pre
-      two: post
-outputs:
-  one:
-    value: {get_attr: [thisone, here-it-is]}
-'''
-    templ_facade = '''
-heat_template_version: 2015-04-30
-parameters:
-  one:
-    type: string
-  two:
-    type: string
-outputs:
-  here-it-is:
-    value: noop
-'''
-    env = '''
-resource_registry:
-  OS::Thingy: facade.yaml
-  resources:
-    thisone:
-      OS::Thingy: concrete.yaml
-'''
-
-    def setUp(self):
-        super(ValidateFacadeTest, self).setUp()
-        self.client = self.orchestration_client
-
-    def test_missing_param(self):
-        templ_missing_parameter = '''
-heat_template_version: 2015-04-30
-parameters:
-  one:
-    type: string
-resources:
-  str:
-    type: OS::Heat::RandomString
-outputs:
-  here-it-is:
-    value:
-      not-important
-'''
-        try:
-            self.stack_create(
-                template=self.template,
-                environment=self.env,
-                files={'facade.yaml': self.templ_facade,
-                       'concrete.yaml': templ_missing_parameter},
-                expected_status='CREATE_FAILED')
-        except heat_exceptions.HTTPBadRequest as exc:
-            exp = ('ERROR: Required property two for facade '
-                   'OS::Thingy missing in provider')
-            self.assertEqual(exp, six.text_type(exc))
-
-    def test_missing_output(self):
-        templ_missing_output = '''
-heat_template_version: 2015-04-30
-parameters:
-  one:
-    type: string
-  two:
-    type: string
-resources:
-  str:
-    type: OS::Heat::RandomString
-'''
-        try:
-            self.stack_create(
-                template=self.template,
-                environment=self.env,
-                files={'facade.yaml': self.templ_facade,
-                       'concrete.yaml': templ_missing_output},
-                expected_status='CREATE_FAILED')
-        except heat_exceptions.HTTPBadRequest as exc:
-            exp = ('ERROR: Attribute here-it-is for facade '
-                   'OS::Thingy missing in provider')
-            self.assertEqual(exp, six.text_type(exc))
-
-
-class TemplateResourceNewParamTest(functional_base.FunctionalTestsBase):
-
-    main_template = '''
-heat_template_version: 2013-05-23
-resources:
-  my_resource:
-    type: resource.yaml
-    properties:
-      value1: foo
-'''
-    nested_templ = '''
-heat_template_version: 2013-05-23
-parameters:
-  value1:
-    type: string
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value: {get_param: value1}
-'''
-    main_template_update = '''
-heat_template_version: 2013-05-23
-resources:
-  my_resource:
-    type: resource.yaml
-    properties:
-      value1: foo
-      value2: foo
-'''
-    nested_templ_update_fail = '''
-heat_template_version: 2013-05-23
-parameters:
-  value1:
-    type: string
-  value2:
-    type: string
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      fail: True
-      value:
-        str_replace:
-          template: VAL1-VAL2
-          params:
-            VAL1: {get_param: value1}
-            VAL2: {get_param: value2}
-'''
-    nested_templ_update = '''
-heat_template_version: 2013-05-23
-parameters:
-  value1:
-    type: string
-  value2:
-    type: string
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value:
-        str_replace:
-          template: VAL1-VAL2
-          params:
-            VAL1: {get_param: value1}
-            VAL2: {get_param: value2}
-'''
-
-    def test_update(self):
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            files={'resource.yaml': self.nested_templ})
-
-        # Make the update fails with the new parameter inserted.
-        self.update_stack(
-            stack_identifier,
-            self.main_template_update,
-            files={'resource.yaml': self.nested_templ_update_fail},
-            expected_status='UPDATE_FAILED')
-
-        # Fix the update, it should succeed now.
-        self.update_stack(
-            stack_identifier,
-            self.main_template_update,
-            files={'resource.yaml': self.nested_templ_update})
-
-
-class TemplateResourceRemovedParamTest(functional_base.FunctionalTestsBase):
-
-    main_template = '''
-heat_template_version: 2013-05-23
-parameters:
-  value1:
-    type: string
-    default: foo
-resources:
-  my_resource:
-    type: resource.yaml
-    properties:
-       value1: {get_param: value1}
-'''
-    nested_templ = '''
-heat_template_version: 2013-05-23
-parameters:
-  value1:
-    type: string
-    default: foo
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value: {get_param: value1}
-'''
-    main_template_update = '''
-heat_template_version: 2013-05-23
-resources:
-  my_resource:
-    type: resource.yaml
-'''
-    nested_templ_update = '''
-heat_template_version: 2013-05-23
-parameters:
-  value1:
-    type: string
-    default: foo
-  value2:
-    type: string
-    default: bar
-resources:
-  test:
-    type: OS::Heat::TestResource
-    properties:
-      value:
-        str_replace:
-          template: VAL1-VAL2
-          params:
-            VAL1: {get_param: value1}
-            VAL2: {get_param: value2}
-'''
-
-    def test_update(self):
-        stack_identifier = self.stack_create(
-            template=self.main_template,
-            environment={'parameters': {'value1': 'spam'}},
-            files={'resource.yaml': self.nested_templ})
-
-        self.update_stack(
-            stack_identifier,
-            self.main_template_update,
-            environment={'parameter_defaults': {'value2': 'egg'}},
-            files={'resource.yaml': self.nested_templ_update}, existing=True)
diff --git a/heat_tempest_plugin/tests/functional/test_templates.py b/heat_tempest_plugin/tests/functional/test_templates.py
index bfcf8bf..95c6a01 100644
--- a/heat_tempest_plugin/tests/functional/test_templates.py
+++ b/heat_tempest_plugin/tests/functional/test_templates.py
@@ -18,9 +18,8 @@
     """This will test the following template calls:
 
     1. Get the template content for the specific stack
-    2. List template versions
-    3. List resource types
-    4. Show resource details for OS::Heat::TestResource
+    2. List resource types
+    3. Show resource details for OS::Heat::TestResource
     """
 
     template = {
@@ -46,19 +45,6 @@
         template_from_client = self.client.stacks.template(stack_identifier)
         self.assertEqual(self.template, template_from_client)
 
-    def test_template_version(self):
-        template_versions = self.client.template_versions.list()
-        supported_template_versions = ["2013-05-23", "2014-10-16",
-                                       "2015-04-30", "2015-10-15",
-                                       "2012-12-12", "2010-09-09",
-                                       "2016-04-08", "2016-10-14", "newton",
-                                       "2017-02-24", "ocata",
-                                       "2017-09-01", "pike",
-                                       "2018-03-02", "queens"]
-        for template in template_versions:
-            self.assertIn(template.version.split(".")[1],
-                          supported_template_versions)
-
     def test_resource_types(self):
         resource_types = self.client.resource_types.list()
         self.assertTrue(any(resource.resource_type == "OS::Heat::TestResource"
diff --git a/heat_tempest_plugin/tests/functional/test_translation.py b/heat_tempest_plugin/tests/functional/test_translation.py
deleted file mode 100644
index 484663b..0000000
--- a/heat_tempest_plugin/tests/functional/test_translation.py
+++ /dev/null
@@ -1,117 +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 heat_tempest_plugin.tests.functional import functional_base
-
-template_subnet_old_network = """
-heat_template_version: 2016-10-14
-parameters:
-  net_cidr:
-    type: string
-resources:
-  net:
-    type: OS::Neutron::Net
-  subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      cidr: { get_param: net_cidr }
-      network_id: { get_resource: net }
-"""
-
-template_with_get_attr = """
-heat_template_version: 2016-10-14
-description: Test template to create/update subnet with translation
-parameters:
-  net_cidr:
-    type: string
-resources:
-  net:
-    type: OS::Neutron::Net
-  net_value:
-    type: OS::Heat::Value
-    properties:
-      value: { get_resource: net }
-  subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      network: { get_attr: [net_value, value] }
-      cidr: { get_param: net_cidr }
-"""
-
-template_value_from_nested_stack_main = """
-heat_template_version: 2016-10-14
-parameters:
-  flavor:
-    type: string
-  image:
-    type: string
-  public_net:
-    type: string
-resources:
-  network_settings:
-    type: network.yaml
-    properties:
-      public_net: { get_param: public_net }
-  server:
-    type: OS::Nova::Server
-    properties:
-      flavor: { get_param: flavor }
-      image: { get_param: image }
-      networks: { get_attr: [network_settings, networks] }
-"""
-
-template_value_from_nested_stack_network = """
-heat_template_version: 2016-10-14
-parameters:
-  public_net:
-    type: string
-outputs:
-  networks:
-    value:
-      - uuid: { get_param: public_net }
-"""
-
-
-class TestTranslation(functional_base.FunctionalTestsBase):
-
-    def test_create_update_subnet_old_network(self):
-        # Just create and update where network is translated properly.
-        env = {'parameters': {'net_cidr': '11.11.11.0/24'}}
-        stack_identifier = self.stack_create(
-            template=template_subnet_old_network,
-            environment=env)
-        env = {'parameters': {'net_cidr': '11.11.12.0/24'}}
-        self.update_stack(stack_identifier,
-                          template=template_subnet_old_network,
-                          environment=env)
-
-    def test_create_update_translation_with_get_attr(self):
-        # Check create and update successful for translation function value.
-        env = {'parameters': {'net_cidr': '11.11.11.0/24'}}
-        stack_identifier = self.stack_create(
-            template=template_with_get_attr,
-            environment=env)
-        env = {'parameters': {'net_cidr': '11.11.12.0/24'}}
-        self.update_stack(stack_identifier,
-                          template=template_with_get_attr,
-                          environment=env)
-
-    def test_value_from_nested_stack(self):
-        env = {'parameters': {
-            'flavor': self.conf.minimal_instance_type,
-            'image': self.conf.minimal_image_ref,
-            'public_net': self.conf.fixed_network_name
-        }}
-        self.stack_create(
-            template=template_value_from_nested_stack_main,
-            environment=env,
-            files={'network.yaml': template_value_from_nested_stack_network})
diff --git a/heat_tempest_plugin/tests/functional/test_update_restricted.py b/heat_tempest_plugin/tests/functional/test_update_restricted.py
deleted file mode 100644
index 83cb280..0000000
--- a/heat_tempest_plugin/tests/functional/test_update_restricted.py
+++ /dev/null
@@ -1,166 +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.
-
-import time
-
-from heat_tempest_plugin.tests.functional import functional_base
-
-test_template = {
-    'heat_template_version': '2013-05-23',
-    'description': 'Test template to create one instance.',
-    'resources': {
-        'bar': {
-            'type': 'OS::Heat::TestResource',
-            'properties': {
-                'value': '1234',
-                'update_replace': False,
-            }
-        }
-    }
-}
-
-env_both_restrict = {u'resource_registry': {
-    u'resources': {
-        'bar': {'restricted_actions': ['update', 'replace']}
-    }
-}
-}
-
-env_replace_restrict = {u'resource_registry': {
-    u'resources': {
-        '*ar': {'restricted_actions': 'replace'}
-    }
-}
-}
-
-reason_update_restrict = 'update is restricted for resource.'
-reason_replace_restrict = 'replace is restricted for resource.'
-
-
-class UpdateRestrictedStackTest(functional_base.FunctionalTestsBase):
-
-    def _check_for_restriction_reason(self, events,
-                                      reason, num_expected=1):
-        matched = [e for e in events
-                   if e.resource_status_reason == reason]
-        return len(matched) == num_expected
-
-    def test_update(self):
-        stack_identifier = self.stack_create(template=test_template)
-
-        update_template = test_template.copy()
-        props = update_template['resources']['bar']['properties']
-        props['value'] = '4567'
-
-        # check update fails - with 'both' restricted
-        self.update_stack(stack_identifier, update_template,
-                          env_both_restrict,
-                          expected_status='UPDATE_FAILED')
-
-        self.assertTrue(self.verify_resource_status(stack_identifier, 'bar',
-                                                    'CREATE_COMPLETE'))
-        resource_events = self.client.events.list(stack_identifier, 'bar')
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_update_restrict))
-
-        # Ensure the timestamp changes, since this will be very quick
-        time.sleep(1)
-
-        # check update succeeds - with only 'replace' restricted
-        self.update_stack(stack_identifier, update_template,
-                          env_replace_restrict,
-                          expected_status='UPDATE_COMPLETE')
-
-        self.assertTrue(self.verify_resource_status(stack_identifier, 'bar',
-                                                    'UPDATE_COMPLETE'))
-        resource_events = self.client.events.list(stack_identifier, 'bar')
-        self.assertFalse(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_update_restrict, 2))
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_replace_restrict, 0))
-
-    def test_replace(self):
-        stack_identifier = self.stack_create(template=test_template)
-
-        update_template = test_template.copy()
-        props = update_template['resources']['bar']['properties']
-        props['update_replace'] = True
-
-        # check replace fails - with 'both' restricted
-        self.update_stack(stack_identifier, update_template,
-                          env_both_restrict,
-                          expected_status='UPDATE_FAILED')
-
-        self.assertTrue(self.verify_resource_status(stack_identifier, 'bar',
-                                                    'CREATE_COMPLETE'))
-        resource_events = self.client.events.list(stack_identifier, 'bar')
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_replace_restrict))
-
-        # Ensure the timestamp changes, since this will be very quick
-        time.sleep(1)
-
-        # check replace fails - with only 'replace' restricted
-        self.update_stack(stack_identifier, update_template,
-                          env_replace_restrict,
-                          expected_status='UPDATE_FAILED')
-
-        self.assertTrue(self.verify_resource_status(stack_identifier, 'bar',
-                                                    'CREATE_COMPLETE'))
-        resource_events = self.client.events.list(stack_identifier, 'bar')
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_replace_restrict, 2))
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_update_restrict, 0))
-
-    def test_update_type_changed(self):
-        stack_identifier = self.stack_create(template=test_template)
-
-        update_template = test_template.copy()
-        rsrc = update_template['resources']['bar']
-        rsrc['type'] = 'OS::Heat::None'
-
-        # check replace fails - with 'both' restricted
-        self.update_stack(stack_identifier, update_template,
-                          env_both_restrict,
-                          expected_status='UPDATE_FAILED')
-
-        self.assertTrue(self.verify_resource_status(stack_identifier, 'bar',
-                                                    'CREATE_COMPLETE'))
-        resource_events = self.client.events.list(stack_identifier, 'bar')
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_replace_restrict))
-
-        # Ensure the timestamp changes, since this will be very quick
-        time.sleep(1)
-
-        # check replace fails - with only 'replace' restricted
-        self.update_stack(stack_identifier, update_template,
-                          env_replace_restrict,
-                          expected_status='UPDATE_FAILED')
-
-        self.assertTrue(self.verify_resource_status(stack_identifier, 'bar',
-                                                    'CREATE_COMPLETE'))
-        resource_events = self.client.events.list(stack_identifier, 'bar')
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_replace_restrict, 2))
-        self.assertTrue(
-            self._check_for_restriction_reason(resource_events,
-                                               reason_update_restrict, 0))
diff --git a/heat_tempest_plugin/tests/functional/test_validation.py b/heat_tempest_plugin/tests/functional/test_validation.py
deleted file mode 100644
index ab1762e..0000000
--- a/heat_tempest_plugin/tests/functional/test_validation.py
+++ /dev/null
@@ -1,92 +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 heat_tempest_plugin.tests.functional import functional_base
-
-
-class StackValidationTest(functional_base.FunctionalTestsBase):
-
-    def setUp(self):
-        super(StackValidationTest, self).setUp()
-        if not self.conf.minimal_image_ref:
-            raise self.skipException("No image configured to test")
-
-        if not self.conf.minimal_instance_type:
-            raise self.skipException(
-                "No minimal_instance_type configured to test")
-
-        self.assign_keypair()
-
-    def test_stack_validate_provider_references_parent_resource(self):
-        template = '''
-heat_template_version: 2014-10-16
-parameters:
-  keyname:
-    type: string
-  flavor:
-    type: string
-  image:
-    type: string
-  network:
-    type: string
-resources:
-  config:
-    type: My::Config
-    properties:
-        server: {get_resource: server}
-
-  server:
-    type: OS::Nova::Server
-    properties:
-      image: {get_param: image}
-      flavor: {get_param: flavor}
-      key_name: {get_param: keyname}
-      networks: [{network: {get_param: network} }]
-      user_data_format: SOFTWARE_CONFIG
-
-'''
-        config_template = '''
-heat_template_version: 2014-10-16
-parameters:
-  server:
-    type: string
-resources:
-  config:
-    type: OS::Heat::SoftwareConfig
-
-  deployment:
-    type: OS::Heat::SoftwareDeployment
-    properties:
-      config:
-        get_resource: config
-      server:
-        get_param: server
-'''
-        files = {'provider.yaml': config_template}
-        env = {'resource_registry':
-               {'My::Config': 'provider.yaml'}}
-        parameters = {'keyname': self.keypair_name,
-                      'flavor': self.conf.minimal_instance_type,
-                      'image': self.conf.minimal_image_ref,
-                      'network': self.conf.fixed_network_name}
-        # Note we don't wait for CREATE_COMPLETE, because we're using a
-        # minimal image without the tools to apply the config.
-        # The point of the test is just to prove that validation won't
-        # falsely prevent stack creation starting, ref bug #1407100
-        # Note that we can be sure My::Config will stay IN_PROGRESS as
-        # there's no signal sent to the deployment
-        self.stack_create(template=template,
-                          files=files,
-                          environment=env,
-                          parameters=parameters,
-                          expected_status='CREATE_IN_PROGRESS')
diff --git a/requirements.txt b/requirements.txt
index f030897..34fa1fd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,6 +6,7 @@
 oslo.config>=5.1.0 # Apache-2.0
 oslo.log>=3.36.0 # Apache-2.0
 oslo.messaging>=5.29.0 # Apache-2.0
+os-collect-config>=5.0.0 # Apache-2.0
 paramiko>=2.0.0 # LGPLv2.1+
 python-cinderclient>=3.3.0 # Apache-2.0
 gnocchiclient>=3.3.1 # Apache-2.0
