diff --git a/HACKING.rst b/HACKING.rst
index 7ab420b..a209b3f 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -240,29 +240,6 @@
   can be used to perform this. See AggregatesAdminTest in
   tempest.api.compute.admin for an example of using locking.
 
-Stress Tests in Tempest
------------------------
-Any tempest test case can be flagged as a stress test. With this flag it will
-be automatically discovery and used in the stress test runs. The stress test
-framework itself is a facility to spawn and control worker processes in order
-to find race conditions (see ``tempest/stress/`` for more information). Please
-note that these stress tests can't be used for benchmarking purposes since they
-don't measure any performance characteristics.
-
-Example::
-
-  @stresstest(class_setup_per='process')
-  def test_this_and_that(self):
-    ...
-
-This will flag the test ``test_this_and_that`` as a stress test. The parameter
-``class_setup_per`` gives control when the setUpClass function should be called.
-
-Good candidates for stress tests are:
-
-- Scenario tests
-- API tests that have a wide focus
-
 Sample Configuration File
 -------------------------
 The sample config file is autogenerated using a script. If any changes are made
diff --git a/doc/source/field_guide/stress.rst b/doc/source/field_guide/stress.rst
deleted file mode 120000
index d39d0f8..0000000
--- a/doc/source/field_guide/stress.rst
+++ /dev/null
@@ -1 +0,0 @@
-../../../tempest/stress/README.rst
\ No newline at end of file
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 6abe9dc..896cd98 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -24,7 +24,6 @@
    field_guide/index
    field_guide/api
    field_guide/scenario
-   field_guide/stress
    field_guide/unit_tests
 
 =========
diff --git a/etc/logging.conf.sample b/etc/logging.conf.sample
index 36cd324..c131b07 100644
--- a/etc/logging.conf.sample
+++ b/etc/logging.conf.sample
@@ -1,5 +1,5 @@
 [loggers]
-keys=root,tempest_stress
+keys=root
 
 [handlers]
 keys=file,devel,syslog
@@ -11,11 +11,6 @@
 level=DEBUG
 handlers=file
 
-[logger_tempest_stress]
-level=DEBUG
-handlers=file,devel
-qualname=tempest.stress
-
 [handler_file]
 class=FileHandler
 level=DEBUG
diff --git a/releasenotes/notes/remo-stress-tests-81052b211ad95d2e.yaml b/releasenotes/notes/remo-stress-tests-81052b211ad95d2e.yaml
new file mode 100644
index 0000000..aa3a78e
--- /dev/null
+++ b/releasenotes/notes/remo-stress-tests-81052b211ad95d2e.yaml
@@ -0,0 +1,4 @@
+---
+upgrade:
+  - The Stress tests framework and all the stress tests have been removed.
+
diff --git a/setup.cfg b/setup.cfg
index 28e17ef..96313fd 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -28,7 +28,6 @@
 [entry_points]
 console_scripts =
     verify-tempest-config = tempest.cmd.verify_tempest_config:main
-    run-tempest-stress = tempest.cmd.run_stress:main
     tempest-account-generator = tempest.cmd.account_generator:main
     tempest = tempest.cmd.main:main
     skip-tracker = tempest.lib.cmd.skip_tracker:main
@@ -38,7 +37,6 @@
     account-generator = tempest.cmd.account_generator:TempestAccountGenerator
     init = tempest.cmd.init:TempestInit
     cleanup = tempest.cmd.cleanup:TempestCleanup
-    run-stress = tempest.cmd.run_stress:TempestRunStress
     list-plugins = tempest.cmd.list_plugins:TempestListPlugins
     verify-config = tempest.cmd.verify_tempest_config:TempestVerifyConfig
     workspace = tempest.cmd.workspace:TempestWorkspace
diff --git a/tempest/README.rst b/tempest/README.rst
index c9a0491..0feec41 100644
--- a/tempest/README.rst
+++ b/tempest/README.rst
@@ -15,7 +15,6 @@
 | tempest/
 |    api/ - API tests
 |    scenario/ - complex scenario tests
-|    stress/ - stress tests
 
 Each of these directories contains different types of tests. What
 belongs in each directory, the rules and examples for good tests, are
@@ -46,14 +45,6 @@
 but should instead use the tempest implementations of clients.
 
 
-:ref:`stress_field_guide`
--------------------------
-
-Stress tests are designed to stress an OpenStack environment by running a high
-workload against it and seeing what breaks. The stress test framework runs
-several test jobs in parallel and can run any existing test in Tempest as a
-stress job.
-
 :ref:`unit_tests_field_guide`
 -----------------------------
 
diff --git a/tempest/api/compute/admin/test_availability_zone.py b/tempest/api/compute/admin/test_availability_zone.py
index 5befa53..ee003b0 100644
--- a/tempest/api/compute/admin/test_availability_zone.py
+++ b/tempest/api/compute/admin/test_availability_zone.py
@@ -35,4 +35,4 @@
     def test_get_availability_zone_list_detail(self):
         # List of availability zones and available services
         availability_zone = self.client.list_availability_zones(detail=True)
-        self.assertTrue(len(availability_zone['availabilityZoneInfo']) > 0)
+        self.assertGreater(len(availability_zone['availabilityZoneInfo']), 0)
diff --git a/tempest/api/compute/admin/test_hosts.py b/tempest/api/compute/admin/test_hosts.py
index a9e9644..29e1eb8 100644
--- a/tempest/api/compute/admin/test_hosts.py
+++ b/tempest/api/compute/admin/test_hosts.py
@@ -36,7 +36,7 @@
         hosts = self.client.list_hosts()['hosts']
         host = hosts[0]
         hosts = self.client.list_hosts(zone=host['zone'])['hosts']
-        self.assertTrue(len(hosts) >= 1)
+        self.assertGreaterEqual(len(hosts), 1)
         self.assertIn(host, hosts)
 
     @test.idempotent_id('9af3c171-fbf4-4150-a624-22109733c2a6')
@@ -58,12 +58,12 @@
         hosts = self.client.list_hosts()['hosts']
 
         hosts = [host for host in hosts if host['service'] == 'compute']
-        self.assertTrue(len(hosts) >= 1)
+        self.assertGreaterEqual(len(hosts), 1)
 
         for host in hosts:
             hostname = host['host_name']
             resources = self.client.show_host(hostname)['host']
-            self.assertTrue(len(resources) >= 1)
+            self.assertGreaterEqual(len(resources), 1)
             host_resource = resources[0]['resource']
             self.assertIsNotNone(host_resource)
             self.assertIsNotNone(host_resource['cpu'])
diff --git a/tempest/api/compute/admin/test_hosts_negative.py b/tempest/api/compute/admin/test_hosts_negative.py
index 8366945..c270829 100644
--- a/tempest/api/compute/admin/test_hosts_negative.py
+++ b/tempest/api/compute/admin/test_hosts_negative.py
@@ -29,7 +29,7 @@
 
     def _get_host_name(self):
         hosts = self.client.list_hosts()['hosts']
-        self.assertTrue(len(hosts) >= 1)
+        self.assertGreaterEqual(len(hosts), 1)
         hostname = hosts[0]['host_name']
         return hostname
 
diff --git a/tempest/api/compute/admin/test_hypervisor.py b/tempest/api/compute/admin/test_hypervisor.py
index 113ec40..92a9135 100644
--- a/tempest/api/compute/admin/test_hypervisor.py
+++ b/tempest/api/compute/admin/test_hypervisor.py
@@ -52,7 +52,7 @@
         self.assertHypervisors(hypers)
 
         details = self.client.show_hypervisor(hypers[0]['id'])['hypervisor']
-        self.assertTrue(len(details) > 0)
+        self.assertGreater(len(details), 0)
         self.assertEqual(details['hypervisor_hostname'],
                          hypers[0]['hypervisor_hostname'])
 
@@ -65,14 +65,14 @@
         hostname = hypers[0]['hypervisor_hostname']
         hypervisors = (self.client.list_servers_on_hypervisor(hostname)
                        ['hypervisors'])
-        self.assertTrue(len(hypervisors) > 0)
+        self.assertGreater(len(hypervisors), 0)
 
     @test.idempotent_id('797e4f28-b6e0-454d-a548-80cc77c00816')
     def test_get_hypervisor_stats(self):
         # Verify the stats of the all hypervisor
         stats = (self.client.show_hypervisor_statistics()
                  ['hypervisor_statistics'])
-        self.assertTrue(len(stats) > 0)
+        self.assertGreater(len(stats), 0)
 
     @test.idempotent_id('91a50d7d-1c2b-4f24-b55a-a1fe20efca70')
     def test_get_hypervisor_uptime(self):
diff --git a/tempest/api/compute/admin/test_hypervisor_negative.py b/tempest/api/compute/admin/test_hypervisor_negative.py
index 9c6df7f..220ea39 100644
--- a/tempest/api/compute/admin/test_hypervisor_negative.py
+++ b/tempest/api/compute/admin/test_hypervisor_negative.py
@@ -47,7 +47,7 @@
     @test.idempotent_id('51e663d0-6b89-4817-a465-20aca0667d03')
     def test_show_hypervisor_with_non_admin_user(self):
         hypers = self._list_hypervisors()
-        self.assertTrue(len(hypers) > 0)
+        self.assertGreater(len(hypers), 0)
 
         self.assertRaises(
             lib_exc.Forbidden,
@@ -58,7 +58,7 @@
     @test.idempotent_id('2a0a3938-832e-4859-95bf-1c57c236b924')
     def test_show_servers_with_non_admin_user(self):
         hypers = self._list_hypervisors()
-        self.assertTrue(len(hypers) > 0)
+        self.assertGreater(len(hypers), 0)
 
         self.assertRaises(
             lib_exc.Forbidden,
@@ -96,7 +96,7 @@
     @test.idempotent_id('6c3461f9-c04c-4e2a-bebb-71dc9cb47df2')
     def test_get_hypervisor_uptime_with_non_admin_user(self):
         hypers = self._list_hypervisors()
-        self.assertTrue(len(hypers) > 0)
+        self.assertGreater(len(hypers), 0)
 
         self.assertRaises(
             lib_exc.Forbidden,
@@ -133,7 +133,7 @@
     @test.idempotent_id('5b6a6c79-5dc1-4fa5-9c58-9c8085948e74')
     def test_search_hypervisor_with_non_admin_user(self):
         hypers = self._list_hypervisors()
-        self.assertTrue(len(hypers) > 0)
+        self.assertGreater(len(hypers), 0)
 
         self.assertRaises(
             lib_exc.Forbidden,
diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py
index b936b23..a8c59ca 100644
--- a/tempest/api/compute/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/servers/test_attach_interfaces.py
@@ -215,7 +215,7 @@
     def test_create_list_show_delete_interfaces(self):
         server, ifs = self._create_server_get_interfaces()
         interface_count = len(ifs)
-        self.assertTrue(interface_count > 0)
+        self.assertGreater(interface_count, 0)
         self._check_interface(ifs[0])
 
         try:
@@ -253,7 +253,7 @@
         # Add and Remove the fixed IP to server.
         server, ifs = self._create_server_get_interfaces()
         interface_count = len(ifs)
-        self.assertTrue(interface_count > 0)
+        self.assertGreater(interface_count, 0)
         self._check_interface(ifs[0])
         network_id = ifs[0]['net_id']
         self.servers_client.add_fixed_ip(server['id'], networkId=network_id)
diff --git a/tempest/api/compute/servers/test_create_server.py b/tempest/api/compute/servers/test_create_server.py
index 78f0db4..d4c2648 100644
--- a/tempest/api/compute/servers/test_create_server.py
+++ b/tempest/api/compute/servers/test_create_server.py
@@ -142,16 +142,12 @@
         self.assertEqual(self.name.lower(), hostname, msg)
 
     @test.idempotent_id('ed20d3fb-9d1f-4329-b160-543fbd5d9811')
+    @testtools.skipUnless(
+        test.is_scheduler_filter_enabled("ServerGroupAffinityFilter"),
+        'ServerGroupAffinityFilter is not available.')
     def test_create_server_with_scheduler_hint_group(self):
         # Create a server with the scheduler hint "group".
-        name = data_utils.rand_name('server_group')
-        policies = ['affinity']
-        body = self.server_groups_client.create_server_group(
-            name=name, policies=policies)['server_group']
-        group_id = body['id']
-        self.addCleanup(self.server_groups_client.delete_server_group,
-                        group_id)
-
+        group_id = self.create_test_server_group()['id']
         hints = {'group': group_id}
         server = self.create_test_server(scheduler_hints=hints,
                                          wait_until='ACTIVE')
diff --git a/tempest/api/compute/servers/test_server_addresses.py b/tempest/api/compute/servers/test_server_addresses.py
index 864f38f..d31b6f8 100644
--- a/tempest/api/compute/servers/test_server_addresses.py
+++ b/tempest/api/compute/servers/test_server_addresses.py
@@ -49,9 +49,9 @@
 
         # We do not know the exact network configuration, but an instance
         # should at least have a single public or private address
-        self.assertTrue(len(addresses) >= 1)
+        self.assertGreaterEqual(len(addresses), 1)
         for network_name, network_addresses in six.iteritems(addresses):
-            self.assertTrue(len(network_addresses) >= 1)
+            self.assertGreaterEqual(len(network_addresses), 1)
             for address in network_addresses:
                 self.assertTrue(address['addr'])
                 self.assertTrue(address['version'])
diff --git a/tempest/api/image/v1/test_images.py b/tempest/api/image/v1/test_images.py
index 269e297..7d52695 100644
--- a/tempest/api/image/v1/test_images.py
+++ b/tempest/api/image/v1/test_images.py
@@ -247,7 +247,7 @@
     def test_index_min_size(self):
         images_list = self.client.list_images(size_min=142)['images']
         for image in images_list:
-            self.assertTrue(image['size'] >= 142)
+            self.assertGreaterEqual(image['size'], 142)
         result_set = set(map(lambda x: x['id'], images_list))
         self.assertTrue(self.size142_set <= result_set)
         self.assertFalse(self.size42_set <= result_set)
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index fd973c6..1b1ffd1 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -114,7 +114,9 @@
             object_client = cls.object_client
         for cont in cls.containers:
             try:
-                objlist = container_client.list_all_container_objects(cont)
+                params = {'limit': 9999, 'format': 'json'}
+                resp, objlist = container_client.list_container_contents(
+                    cont, params)
                 # delete every object in the container
                 for obj in objlist:
                     test_utils.call_and_ignore_notfound_exc(
diff --git a/tempest/api/object_storage/test_container_services_negative.py b/tempest/api/object_storage/test_container_services_negative.py
index ed99eb2..7049db0 100644
--- a/tempest/api/object_storage/test_container_services_negative.py
+++ b/tempest/api/object_storage/test_container_services_negative.py
@@ -129,10 +129,10 @@
         # that doesn't exist.
         nonexistent_name = data_utils.rand_name(
             name="TestNonexistentContainer")
-
+        params = {'limit': 9999, 'format': 'json'}
         self.assertRaises(exceptions.NotFound,
-                          self.container_client.list_all_container_objects,
-                          nonexistent_name)
+                          self.container_client.list_container_contents,
+                          nonexistent_name, params)
 
     @test.attr(type=["negative"])
     @test.idempotent_id('86b2ab08-92d5-493d-acd2-85f0c848819e')
@@ -143,10 +143,10 @@
         # delete container
         resp, _ = self.container_client.delete_container(container_name)
         self.assertHeaders(resp, 'Container', 'DELETE')
-
+        params = {'limit': 9999, 'format': 'json'}
         self.assertRaises(exceptions.NotFound,
-                          self.container_client.list_all_container_objects,
-                          container_name)
+                          self.container_client.list_container_contents,
+                          container_name, params)
 
     @test.attr(type=["negative"])
     @test.idempotent_id('42da116e-1e8c-4c96-9e06-2f13884ed2b1')
diff --git a/tempest/api/orchestration/stacks/test_nova_keypair_resources.py b/tempest/api/orchestration/stacks/test_nova_keypair_resources.py
index 8d12e75..160bf6f 100644
--- a/tempest/api/orchestration/stacks/test_nova_keypair_resources.py
+++ b/tempest/api/orchestration/stacks/test_nova_keypair_resources.py
@@ -78,10 +78,10 @@
         self.assertIn('-----BEGIN', output_map['KeyPair_PrivateKey'])
         # Test that second key generated public key, and private key is not
         # in the output due to save_private_key = false
-        self.assertTrue('KeyPairDontSavePrivate_PublicKey' in output_map)
-        self.assertTrue('Generated' in
-                        output_map['KeyPairDontSavePrivate_PublicKey'])
-        self.assertTrue(u'KeyPairDontSavePrivate_PrivateKey' in output_map)
+        self.assertIn('KeyPairDontSavePrivate_PublicKey', output_map)
+        self.assertIn('Generated',
+                      output_map['KeyPairDontSavePrivate_PublicKey'])
+        self.assertIn(u'KeyPairDontSavePrivate_PrivateKey', output_map)
         private_key = output_map['KeyPairDontSavePrivate_PrivateKey']
         self.assertTrue(len(private_key) == 0)
 
diff --git a/tempest/api/volume/test_availability_zone.py b/tempest/api/volume/test_availability_zone.py
index fe51375..ae4b8f9 100644
--- a/tempest/api/volume/test_availability_zone.py
+++ b/tempest/api/volume/test_availability_zone.py
@@ -30,7 +30,7 @@
         # List of availability zone
         availability_zone = (self.client.list_availability_zones()
                              ['availabilityZoneInfo'])
-        self.assertTrue(len(availability_zone) > 0)
+        self.assertGreater(len(availability_zone), 0)
 
 
 class AvailabilityZoneV1TestJSON(AvailabilityZoneV2TestJSON):
diff --git a/tempest/api/volume/test_volumes_actions.py b/tempest/api/volume/test_volumes_actions.py
index 7fd8b60..737ce5e 100644
--- a/tempest/api/volume/test_volumes_actions.py
+++ b/tempest/api/volume/test_volumes_actions.py
@@ -50,7 +50,6 @@
         cls.volume = cls.create_volume()
 
     @test.idempotent_id('fff42874-7db5-4487-a8e1-ddda5fb5288d')
-    @test.stresstest(class_setup_per='process')
     @test.attr(type='smoke')
     @test.services('compute')
     def test_attach_detach_volume_to_instance(self):
@@ -82,7 +81,6 @@
             self.assertEqual(bool_bootable, bool_flag)
 
     @test.idempotent_id('9516a2c8-9135-488c-8dd6-5677a7e5f371')
-    @test.stresstest(class_setup_per='process')
     @test.services('compute')
     def test_get_volume_attachment(self):
         # Create a server
diff --git a/tempest/cmd/run_stress.py b/tempest/cmd/run_stress.py
deleted file mode 100755
index 7502c23..0000000
--- a/tempest/cmd/run_stress.py
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2013 Quanta Research Cambridge, Inc.
-#
-#    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 argparse
-import inspect
-import sys
-try:
-    from unittest import loader
-except ImportError:
-    # unittest in python 2.6 does not contain loader, so uses unittest2
-    from unittest2 import loader
-import traceback
-import warnings
-
-from cliff import command
-from oslo_log import log as logging
-from oslo_serialization import jsonutils as json
-from testtools import testsuite
-
-from tempest.stress import driver
-
-LOG = logging.getLogger(__name__)
-
-
-def discover_stress_tests(path="./", filter_attr=None, call_inherited=False):
-    """Discovers all tempest tests and create action out of them"""
-    LOG.info("Start test discovery")
-    tests = []
-    testloader = loader.TestLoader()
-    list = testloader.discover(path)
-    for func in (testsuite.iterate_tests(list)):
-        attrs = []
-        try:
-            method_name = getattr(func, '_testMethodName')
-            full_name = "%s.%s.%s" % (func.__module__,
-                                      func.__class__.__name__,
-                                      method_name)
-            test_func = getattr(func, method_name)
-            # NOTE(mkoderer): this contains a list of all type attributes
-            attrs = getattr(test_func, "__testtools_attrs")
-        except Exception:
-            next
-        if 'stress' in attrs:
-            if filter_attr is not None and filter_attr not in attrs:
-                continue
-            class_setup_per = getattr(test_func, "st_class_setup_per")
-
-            action = {'action':
-                      "tempest.stress.actions.unit_test.UnitTest",
-                      'kwargs': {"test_method": full_name,
-                                 "class_setup_per": class_setup_per
-                                 }
-                      }
-            if (not call_inherited and
-                getattr(test_func, "st_allow_inheritance") is not True):
-                class_structure = inspect.getmro(test_func.im_class)
-                if test_func.__name__ not in class_structure[0].__dict__:
-                    continue
-            tests.append(action)
-    return tests
-
-
-class TempestRunStress(command.Command):
-
-    @staticmethod
-    def display_deprecation_warning():
-        warnings.simplefilter('once', category=DeprecationWarning)
-        warnings.warn(
-            'Stress tests are deprecated and will be removed from Tempest '
-            'in the Newton release.',
-            DeprecationWarning)
-        warnings.resetwarnings()
-
-    def get_parser(self, prog_name):
-        self.display_deprecation_warning()
-        pa = super(TempestRunStress, self).get_parser(prog_name)
-        pa = add_arguments(pa)
-        return pa
-
-    def take_action(self, pa):
-        try:
-            action(pa)
-        except Exception:
-            LOG.exception("Failure in the stress test framework")
-            traceback.print_exc()
-            raise
-
-    def get_description(self):
-        return 'Run tempest stress tests'
-
-
-def add_arguments(parser):
-    parser.add_argument('-d', '--duration', default=300, type=int,
-                        help="Duration of test in secs")
-    parser.add_argument('-s', '--serial', action='store_true',
-                        help="Trigger running tests serially")
-    parser.add_argument('-S', '--stop', action='store_true',
-                        default=False, help="Stop on first error")
-    parser.add_argument('-n', '--number', type=int,
-                        help="How often an action is executed for each "
-                        "process")
-    group = parser.add_mutually_exclusive_group(required=True)
-    group.add_argument('-a', '--all', action='store_true',
-                       help="Execute all stress tests")
-    parser.add_argument('-T', '--type',
-                        help="Filters tests of a certain type (e.g. gate)")
-    parser.add_argument('-i', '--call-inherited', action='store_true',
-                        default=False,
-                        help="Call also inherited function with stress "
-                        "attribute")
-    group.add_argument('-t', "--tests", nargs='?',
-                       help="Name of the file with test description")
-    return parser
-
-
-def action(ns):
-    result = 0
-    if not ns.all:
-        tests = json.load(open(ns.tests, 'r'))
-    else:
-        tests = discover_stress_tests(filter_attr=ns.type,
-                                      call_inherited=ns.call_inherited)
-
-    if ns.serial:
-        # Duration is total time
-        duration = ns.duration / len(tests)
-        for test in tests:
-            step_result = driver.stress_openstack([test],
-                                                  duration,
-                                                  ns.number,
-                                                  ns.stop)
-            # NOTE(mkoderer): we just save the last result code
-            if (step_result != 0):
-                result = step_result
-                if ns.stop:
-                    return result
-    else:
-        result = driver.stress_openstack(tests,
-                                         ns.duration,
-                                         ns.number,
-                                         ns.stop)
-    return result
-
-
-def main():
-    TempestRunStress.display_deprecation_warning()
-    parser = argparse.ArgumentParser(description='Run stress tests')
-    pa = add_arguments(parser)
-    ns = pa.parse_args()
-    return action(ns)
-
-
-if __name__ == "__main__":
-    try:
-        sys.exit(main())
-    except Exception:
-        LOG.exception("Failure in the stress test framework")
-        traceback.print_exc()
-        sys.exit(1)
diff --git a/tempest/config.py b/tempest/config.py
index 8ce38f9..bc9215c 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -900,44 +900,6 @@
 ]
 
 
-stress_group = cfg.OptGroup(name='stress', title='Stress Test Options')
-
-StressGroup = [
-    cfg.StrOpt('nova_logdir',
-               help='Directory containing log files on the compute nodes'),
-    cfg.IntOpt('max_instances',
-               default=16,
-               help='Maximum number of instances to create during test.'),
-    cfg.StrOpt('controller',
-               help='Controller host.'),
-    # new stress options
-    cfg.StrOpt('target_controller',
-               help='Controller host.'),
-    cfg.StrOpt('target_ssh_user',
-               help='ssh user.'),
-    cfg.StrOpt('target_private_key_path',
-               help='Path to private key.'),
-    cfg.StrOpt('target_logfiles',
-               help='regexp for list of log files.'),
-    cfg.IntOpt('log_check_interval',
-               default=60,
-               help='time (in seconds) between log file error checks.'),
-    cfg.IntOpt('default_thread_number_per_action',
-               default=4,
-               help='The number of threads created while stress test.'),
-    cfg.BoolOpt('leave_dirty_stack',
-                default=False,
-                help='Prevent the cleaning (tearDownClass()) between'
-                     ' each stress test run if an exception occurs'
-                     ' during this run.'),
-    cfg.BoolOpt('full_clean_stack',
-                default=False,
-                help='Allows a full cleaning process after a stress test.'
-                     ' Caution : this cleanup will remove every objects of'
-                     ' every project.')
-]
-
-
 scenario_group = cfg.OptGroup(name='scenario', title='Scenario Test Options')
 
 ScenarioGroup = [
@@ -1145,7 +1107,6 @@
     (object_storage_group, ObjectStoreGroup),
     (object_storage_feature_group, ObjectStoreFeaturesGroup),
     (orchestration_group, OrchestrationGroup),
-    (stress_group, StressGroup),
     (scenario_group, ScenarioGroup),
     (service_available_group, ServiceAvailableGroup),
     (debug_group, DebugGroup),
@@ -1210,7 +1171,6 @@
         self.object_storage_feature_enabled = _CONF[
             'object-storage-feature-enabled']
         self.orchestration = _CONF.orchestration
-        self.stress = _CONF.stress
         self.scenario = _CONF.scenario
         self.service_available = _CONF.service_available
         self.debug = _CONF.debug
diff --git a/tempest/scenario/test_network_advanced_server_ops.py b/tempest/scenario/test_network_advanced_server_ops.py
index 2ae067e..60b030d 100644
--- a/tempest/scenario/test_network_advanced_server_ops.py
+++ b/tempest/scenario/test_network_advanced_server_ops.py
@@ -95,7 +95,6 @@
         self._check_network_connectivity(server, keypair, floating_ip)
 
     @test.idempotent_id('61f1aa9a-1573-410e-9054-afa557cab021')
-    @test.stresstest(class_setup_per='process')
     @test.services('compute', 'network')
     def test_server_connectivity_stop_start(self):
         keypair = self.create_keypair()
diff --git a/tempest/services/object_storage/container_client.py b/tempest/services/object_storage/container_client.py
index 5a26bfc..2509156 100644
--- a/tempest/services/object_storage/container_client.py
+++ b/tempest/services/object_storage/container_client.py
@@ -96,28 +96,6 @@
         self.expected_success(204, resp.status)
         return resp, body
 
-    def list_all_container_objects(self, container, params=None):
-        """Returns complete list of all objects in the container
-
-        even if item count is beyond 10,000 item listing limit.
-        Does not require any parameters aside from container name.
-        """
-        # TODO(dwalleck): Rewrite using json format to avoid newlines at end of
-        # obj names. Set limit to API limit - 1 (max returned items = 9999)
-        limit = 9999
-        if params is not None:
-            if 'limit' in params:
-                limit = params['limit']
-
-            if 'marker' in params:
-                limit = params['marker']
-
-        resp, objlist = self.list_container_contents(
-            container,
-            params={'limit': limit, 'format': 'json'})
-        self.expected_success(200, resp.status)
-        return objlist
-
     def list_container_contents(self, container, params=None):
         """List the objects in a container, given the container name
 
diff --git a/tempest/stress/README.rst b/tempest/stress/README.rst
deleted file mode 100644
index f22c9ce..0000000
--- a/tempest/stress/README.rst
+++ /dev/null
@@ -1,62 +0,0 @@
-.. _stress_field_guide:
-
-Tempest Field Guide to Stress Tests
-===================================
-
-OpenStack is a distributed, asynchronous system that is prone to race condition
-bugs. These bugs will not be easily found during
-functional testing but will be encountered by users in large deployments in a
-way that is hard to debug. The stress test tries to cause these bugs to happen
-in a more controlled environment.
-
-
-Environment
------------
-This particular framework assumes your working Nova cluster understands Nova
-API 2.0. The stress tests can read the logs from the cluster. To enable this
-you have to provide the hostname to call 'nova-manage' and
-the private key and user name for ssh to the cluster in the
-[stress] section of tempest.conf. You also need to provide the
-location of the log files:
-
-  .. code-block:: ini
-
-    target_logfiles = "regexp to all log files to be checked for errors"
-    target_private_key_path = "private ssh key for controller and log file nodes"
-    target_ssh_user = "username for controller and log file nodes"
-    target_controller = "hostname or ip of controller node (for nova-manage)
-    log_check_interval = "time between checking logs for errors (default 60s)"
-
-To activate logging on your console please make sure that you activate `use_stderr`
-in tempest.conf or use the default `logging.conf.sample` file.
-
-Running default stress test set
--------------------------------
-
-The stress test framework can automatically discover test inside the tempest
-test suite. All test flag with the `@stresstest` decorator will be executed.
-In order to use this discovery you have to install tempest CLI, be in the
-tempest root directory and execute the following:
-
-    tempest run-stress -a -d 30
-
-Running the sample test
------------------------
-
-To test installation, do the following:
-
-    tempest run-stress -t tempest/stress/etc/server-create-destroy-test.json -d 30
-
-This sample test tries to create a few VMs and kill a few VMs.
-
-
-Additional Tools
-----------------
-
-Sometimes the tests don't finish, or there are failures. In these
-cases, you may want to clean out the nova cluster. We have provided
-some scripts to do this in the ``tools`` subdirectory.
-You can use the following script to destroy any keypairs,
-floating ips, and servers:
-
-tempest/stress/tools/cleanup.py
diff --git a/tempest/stress/__init__.py b/tempest/stress/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/stress/__init__.py
+++ /dev/null
diff --git a/tempest/stress/actions/__init__.py b/tempest/stress/actions/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/stress/actions/__init__.py
+++ /dev/null
diff --git a/tempest/stress/actions/server_create_destroy.py b/tempest/stress/actions/server_create_destroy.py
deleted file mode 100644
index 183bc6c..0000000
--- a/tempest/stress/actions/server_create_destroy.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2013 Quanta Research Cambridge, Inc.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License");
-#    you may not use this file except in compliance with the License.
-#    You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-
-from tempest.common.utils import data_utils
-from tempest.common import waiters
-from tempest import config
-import tempest.stress.stressaction as stressaction
-
-CONF = config.CONF
-
-
-class ServerCreateDestroyTest(stressaction.StressAction):
-
-    def setUp(self, **kwargs):
-        self.image = CONF.compute.image_ref
-        self.flavor = CONF.compute.flavor_ref
-
-    def run(self):
-        name = data_utils.rand_name(self.__class__.__name__ + "-instance")
-        self.logger.info("creating %s" % name)
-        server = self.manager.servers_client.create_server(
-            name=name, imageRef=self.image, flavorRef=self.flavor)['server']
-        server_id = server['id']
-        waiters.wait_for_server_status(self.manager.servers_client, server_id,
-                                       'ACTIVE')
-        self.logger.info("created %s" % server_id)
-        self.logger.info("deleting %s" % name)
-        self.manager.servers_client.delete_server(server_id)
-        waiters.wait_for_server_termination(self.manager.servers_client,
-                                            server_id)
-        self.logger.info("deleted %s" % server_id)
diff --git a/tempest/stress/actions/ssh_floating.py b/tempest/stress/actions/ssh_floating.py
deleted file mode 100644
index 845b4a7..0000000
--- a/tempest/stress/actions/ssh_floating.py
+++ /dev/null
@@ -1,200 +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 socket
-import subprocess
-
-from tempest.common.utils import data_utils
-from tempest.common import waiters
-from tempest import config
-from tempest.lib.common.utils import test_utils
-import tempest.stress.stressaction as stressaction
-
-CONF = config.CONF
-
-
-class FloatingStress(stressaction.StressAction):
-
-    # from the scenario manager
-    def ping_ip_address(self, ip_address):
-        cmd = ['ping', '-c1', '-w1', ip_address]
-
-        proc = subprocess.Popen(cmd,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE)
-        proc.communicate()
-        success = proc.returncode == 0
-        return success
-
-    def tcp_connect_scan(self, addr, port):
-        # like tcp
-        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        try:
-            s.connect((addr, port))
-        except socket.error as exc:
-            self.logger.info("%s(%s): %s", self.server_id, self.floating['ip'],
-                             str(exc))
-            return False
-        self.logger.info("%s(%s): Connected :)", self.server_id,
-                         self.floating['ip'])
-        s.close()
-        return True
-
-    def check_port_ssh(self):
-        def func():
-            return self.tcp_connect_scan(self.floating['ip'], 22)
-        if not test_utils.call_until_true(func, self.check_timeout,
-                                          self.check_interval):
-            raise RuntimeError("Cannot connect to the ssh port.")
-
-    def check_icmp_echo(self):
-        self.logger.info("%s(%s): Pinging..",
-                         self.server_id, self.floating['ip'])
-
-        def func():
-            return self.ping_ip_address(self.floating['ip'])
-        if not test_utils.call_until_true(func, self.check_timeout,
-                                          self.check_interval):
-            raise RuntimeError("%s(%s): Cannot ping the machine.",
-                               self.server_id, self.floating['ip'])
-        self.logger.info("%s(%s): pong :)",
-                         self.server_id, self.floating['ip'])
-
-    def _create_vm(self):
-        self.name = name = data_utils.rand_name(
-            self.__class__.__name__ + "-instance")
-        servers_client = self.manager.servers_client
-        self.logger.info("creating %s" % name)
-        vm_args = self.vm_extra_args.copy()
-        vm_args['security_groups'] = [self.sec_grp]
-        server = servers_client.create_server(name=name, imageRef=self.image,
-                                              flavorRef=self.flavor,
-                                              **vm_args)['server']
-        self.server_id = server['id']
-        if self.wait_after_vm_create:
-            waiters.wait_for_server_status(self.manager.servers_client,
-                                           self.server_id, 'ACTIVE')
-
-    def _destroy_vm(self):
-        self.logger.info("deleting %s" % self.server_id)
-        self.manager.servers_client.delete_server(self.server_id)
-        waiters.wait_for_server_termination(self.manager.servers_client,
-                                            self.server_id)
-        self.logger.info("deleted %s" % self.server_id)
-
-    def _create_sec_group(self):
-        sec_grp_cli = self.manager.compute_security_groups_client
-        s_name = data_utils.rand_name(self.__class__.__name__ + '-sec_grp')
-        s_description = data_utils.rand_name('desc')
-        self.sec_grp = sec_grp_cli.create_security_group(
-            name=s_name, description=s_description)['security_group']
-        create_rule = sec_grp_cli.create_security_group_rule
-        create_rule(parent_group_id=self.sec_grp['id'], ip_protocol='tcp',
-                    from_port=22, to_port=22)
-        create_rule(parent_group_id=self.sec_grp['id'], ip_protocol='icmp',
-                    from_port=-1, to_port=-1)
-
-    def _destroy_sec_grp(self):
-        sec_grp_cli = self.manager.compute_security_groups_client
-        sec_grp_cli.delete_security_group(self.sec_grp['id'])
-
-    def _create_floating_ip(self):
-        floating_cli = self.manager.compute_floating_ips_client
-        self.floating = (floating_cli.create_floating_ip(self.floating_pool)
-                         ['floating_ip'])
-
-    def _destroy_floating_ip(self):
-        cli = self.manager.compute_floating_ips_client
-        cli.delete_floating_ip(self.floating['id'])
-        cli.wait_for_resource_deletion(self.floating['id'])
-        self.logger.info("Deleted Floating IP %s", str(self.floating['ip']))
-
-    def setUp(self, **kwargs):
-        self.image = CONF.compute.image_ref
-        self.flavor = CONF.compute.flavor_ref
-        self.vm_extra_args = kwargs.get('vm_extra_args', {})
-        self.wait_after_vm_create = kwargs.get('wait_after_vm_create',
-                                               True)
-        self.new_vm = kwargs.get('new_vm', False)
-        self.new_sec_grp = kwargs.get('new_sec_group', False)
-        self.new_floating = kwargs.get('new_floating', False)
-        self.reboot = kwargs.get('reboot', False)
-        self.floating_pool = kwargs.get('floating_pool', None)
-        self.verify = kwargs.get('verify', ('check_port_ssh',
-                                            'check_icmp_echo'))
-        self.check_timeout = kwargs.get('check_timeout', 120)
-        self.check_interval = kwargs.get('check_interval', 1)
-        self.wait_for_disassociate = kwargs.get('wait_for_disassociate',
-                                                True)
-
-        # allocate floating
-        if not self.new_floating:
-            self._create_floating_ip()
-        # add security group
-        if not self.new_sec_grp:
-            self._create_sec_group()
-        # create vm
-        if not self.new_vm:
-            self._create_vm()
-
-    def wait_disassociate(self):
-        cli = self.manager.compute_floating_ips_client
-
-        def func():
-            floating = (cli.show_floating_ip(self.floating['id'])
-                        ['floating_ip'])
-            return floating['instance_id'] is None
-
-        if not test_utils.call_until_true(func, self.check_timeout,
-                                          self.check_interval):
-            raise RuntimeError("IP disassociate timeout!")
-
-    def run_core(self):
-        cli = self.manager.compute_floating_ips_client
-        cli.associate_floating_ip_to_server(self.floating['ip'],
-                                            self.server_id)
-        for method in self.verify:
-            m = getattr(self, method)
-            m()
-        cli.disassociate_floating_ip_from_server(self.floating['ip'],
-                                                 self.server_id)
-        if self.wait_for_disassociate:
-            self.wait_disassociate()
-
-    def run(self):
-        if self.new_sec_grp:
-            self._create_sec_group()
-        if self.new_floating:
-            self._create_floating_ip()
-        if self.new_vm:
-            self._create_vm()
-        if self.reboot:
-            self.manager.servers_client.reboot(self.server_id, 'HARD')
-            waiters.wait_for_server_status(self.manager.servers_client,
-                                           self.server_id, 'ACTIVE')
-
-        self.run_core()
-
-        if self.new_vm:
-            self._destroy_vm()
-        if self.new_floating:
-            self._destroy_floating_ip()
-        if self.new_sec_grp:
-            self._destroy_sec_grp()
-
-    def tearDown(self):
-        if not self.new_vm:
-            self._destroy_vm()
-        if not self.new_floating:
-            self._destroy_floating_ip()
-        if not self.new_sec_grp:
-            self._destroy_sec_grp()
diff --git a/tempest/stress/actions/unit_test.py b/tempest/stress/actions/unit_test.py
deleted file mode 100644
index e016c61..0000000
--- a/tempest/stress/actions/unit_test.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 oslo_log import log as logging
-from oslo_utils import importutils
-
-from tempest import config
-import tempest.stress.stressaction as stressaction
-
-CONF = config.CONF
-
-
-class SetUpClassRunTime(object):
-
-    process = 'process'
-    action = 'action'
-    application = 'application'
-
-    allowed = set((process, action, application))
-
-    @classmethod
-    def validate(cls, name):
-        if name not in cls.allowed:
-            raise KeyError("\'%s\' not a valid option" % name)
-
-
-class UnitTest(stressaction.StressAction):
-    """This is a special action for running existing unittests as stress test.
-
-       You need to pass ``test_method`` and ``class_setup_per``
-       using ``kwargs`` in the JSON descriptor;
-       ``test_method`` should be the fully qualified name of a unittest,
-       ``class_setup_per`` should be one from:
-           ``application``: once in the stress job lifetime
-           ``process``: once in the worker process lifetime
-           ``action``: on each action
-       Not all combination working in every case.
-    """
-
-    def setUp(self, **kwargs):
-        method = kwargs['test_method'].split('.')
-        self.test_method = method.pop()
-        self.klass = importutils.import_class('.'.join(method))
-        self.logger = logging.getLogger('.'.join(method))
-        # valid options are 'process', 'application' , 'action'
-        self.class_setup_per = kwargs.get('class_setup_per',
-                                          SetUpClassRunTime.process)
-        SetUpClassRunTime.validate(self.class_setup_per)
-
-        if self.class_setup_per == SetUpClassRunTime.application:
-            self.klass.setUpClass()
-        self.setupclass_called = False
-
-    @property
-    def action(self):
-        if self.test_method:
-            return self.test_method
-        return super(UnitTest, self).action
-
-    def run_core(self):
-        res = self.klass(self.test_method).run()
-        if res.errors:
-            raise RuntimeError(res.errors)
-
-    def run(self):
-        if self.class_setup_per != SetUpClassRunTime.application:
-            if (self.class_setup_per == SetUpClassRunTime.action
-                or self.setupclass_called is False):
-                self.klass.setUpClass()
-                self.setupclass_called = True
-
-            try:
-                self.run_core()
-            finally:
-                if (CONF.stress.leave_dirty_stack is False
-                    and self.class_setup_per == SetUpClassRunTime.action):
-                    self.klass.tearDownClass()
-        else:
-            self.run_core()
-
-    def tearDown(self):
-        if self.class_setup_per != SetUpClassRunTime.action:
-            self.klass.tearDownClass()
diff --git a/tempest/stress/actions/volume_attach_delete.py b/tempest/stress/actions/volume_attach_delete.py
deleted file mode 100644
index 5fc006e..0000000
--- a/tempest/stress/actions/volume_attach_delete.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# (c) 2013 Deutsche Telekom AG
-#    Licensed under the Apache License, Version 2.0 (the "License");
-#    you may not use this file except in compliance with the License.
-#    You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-
-from tempest.common.utils import data_utils
-from tempest.common import waiters
-from tempest import config
-import tempest.stress.stressaction as stressaction
-
-CONF = config.CONF
-
-
-class VolumeAttachDeleteTest(stressaction.StressAction):
-
-    def setUp(self, **kwargs):
-        self.image = CONF.compute.image_ref
-        self.flavor = CONF.compute.flavor_ref
-
-    def run(self):
-        # Step 1: create volume
-        name = data_utils.rand_name(self.__class__.__name__ + "-volume")
-        self.logger.info("creating volume: %s" % name)
-        volume = self.manager.volumes_client.create_volume(
-            display_name=name, size=CONF.volume.volume_size)['volume']
-        self.manager.volumes_client.wait_for_volume_status(volume['id'],
-                                                           'available')
-        self.logger.info("created volume: %s" % volume['id'])
-
-        # Step 2: create vm instance
-        vm_name = data_utils.rand_name(self.__class__.__name__ + "-instance")
-        self.logger.info("creating vm: %s" % vm_name)
-        server = self.manager.servers_client.create_server(
-            name=vm_name, imageRef=self.image, flavorRef=self.flavor)['server']
-        server_id = server['id']
-        waiters.wait_for_server_status(self.manager.servers_client, server_id,
-                                       'ACTIVE')
-        self.logger.info("created vm %s" % server_id)
-
-        # Step 3: attach volume to vm
-        self.logger.info("attach volume (%s) to vm %s" %
-                         (volume['id'], server_id))
-        self.manager.servers_client.attach_volume(server_id,
-                                                  volumeId=volume['id'],
-                                                  device='/dev/vdc')
-        self.manager.volumes_client.wait_for_volume_status(volume['id'],
-                                                           'in-use')
-        self.logger.info("volume (%s) attached to vm %s" %
-                         (volume['id'], server_id))
-
-        # Step 4: delete vm
-        self.logger.info("deleting vm: %s" % vm_name)
-        self.manager.servers_client.delete_server(server_id)
-        waiters.wait_for_server_termination(self.manager.servers_client,
-                                            server_id)
-        self.logger.info("deleted vm: %s" % server_id)
-
-        # Step 5: delete volume
-        self.logger.info("deleting volume: %s" % volume['id'])
-        self.manager.volumes_client.delete_volume(volume['id'])
-        self.manager.volumes_client.wait_for_resource_deletion(volume['id'])
-        self.logger.info("deleted volume: %s" % volume['id'])
diff --git a/tempest/stress/actions/volume_attach_verify.py b/tempest/stress/actions/volume_attach_verify.py
deleted file mode 100644
index 4fbb851..0000000
--- a/tempest/stress/actions/volume_attach_verify.py
+++ /dev/null
@@ -1,233 +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
-
-from tempest.common.utils import data_utils
-from tempest.common.utils.linux import remote_client
-from tempest.common import waiters
-from tempest import config
-from tempest.lib.common.utils import test_utils
-import tempest.stress.stressaction as stressaction
-
-CONF = config.CONF
-
-
-class VolumeVerifyStress(stressaction.StressAction):
-
-    def _create_keypair(self):
-        keyname = data_utils.rand_name("key")
-        self.key = (self.manager.keypairs_client.create_keypair(name=keyname)
-                    ['keypair'])
-
-    def _delete_keypair(self):
-        self.manager.keypairs_client.delete_keypair(self.key['name'])
-
-    def _create_vm(self):
-        self.name = name = data_utils.rand_name(
-            self.__class__.__name__ + "-instance")
-        servers_client = self.manager.servers_client
-        self.logger.info("creating %s" % name)
-        vm_args = self.vm_extra_args.copy()
-        vm_args['security_groups'] = [self.sec_grp]
-        vm_args['key_name'] = self.key['name']
-        server = servers_client.create_server(name=name, imageRef=self.image,
-                                              flavorRef=self.flavor,
-                                              **vm_args)['server']
-        self.server_id = server['id']
-        waiters.wait_for_server_status(self.manager.servers_client,
-                                       self.server_id, 'ACTIVE')
-
-    def _destroy_vm(self):
-        self.logger.info("deleting server: %s" % self.server_id)
-        self.manager.servers_client.delete_server(self.server_id)
-        waiters.wait_for_server_termination(self.manager.servers_client,
-                                            self.server_id)
-        self.logger.info("deleted server: %s" % self.server_id)
-
-    def _create_sec_group(self):
-        sec_grp_cli = self.manager.compute_security_groups_client
-        s_name = data_utils.rand_name(self.__class__.__name__ + '-sec_grp')
-        s_description = data_utils.rand_name('desc')
-        self.sec_grp = sec_grp_cli.create_security_group(
-            name=s_name, description=s_description)['security_group']
-        create_rule = sec_grp_cli.create_security_group_rule
-        create_rule(parent_group_id=self.sec_grp['id'], ip_protocol='tcp',
-                    from_port=22, to_port=22)
-        create_rule(parent_group_id=self.sec_grp['id'], ip_protocol='icmp',
-                    from_port=-1, to_port=-1)
-
-    def _destroy_sec_grp(self):
-        sec_grp_cli = self.manager.compute_security_groups_client
-        sec_grp_cli.delete_security_group(self.sec_grp['id'])
-
-    def _create_floating_ip(self):
-        floating_cli = self.manager.compute_floating_ips_client
-        self.floating = (floating_cli.create_floating_ip(self.floating_pool)
-                         ['floating_ip'])
-
-    def _destroy_floating_ip(self):
-        cli = self.manager.compute_floating_ips_client
-        cli.delete_floating_ip(self.floating['id'])
-        cli.wait_for_resource_deletion(self.floating['id'])
-        self.logger.info("Deleted Floating IP %s", str(self.floating['ip']))
-
-    def _create_volume(self):
-        name = data_utils.rand_name(self.__class__.__name__ + "-volume")
-        self.logger.info("creating volume: %s" % name)
-        volumes_client = self.manager.volumes_client
-        self.volume = volumes_client.create_volume(
-            display_name=name, size=CONF.volume.volume_size)['volume']
-        volumes_client.wait_for_volume_status(self.volume['id'],
-                                              'available')
-        self.logger.info("created volume: %s" % self.volume['id'])
-
-    def _delete_volume(self):
-        self.logger.info("deleting volume: %s" % self.volume['id'])
-        volumes_client = self.manager.volumes_client
-        volumes_client.delete_volume(self.volume['id'])
-        volumes_client.wait_for_resource_deletion(self.volume['id'])
-        self.logger.info("deleted volume: %s" % self.volume['id'])
-
-    def _wait_disassociate(self):
-        cli = self.manager.compute_floating_ips_client
-
-        def func():
-            floating = (cli.show_floating_ip(self.floating['id'])
-                        ['floating_ip'])
-            return floating['instance_id'] is None
-
-        if not test_utils.call_until_true(func, CONF.compute.build_timeout,
-                                          CONF.compute.build_interval):
-            raise RuntimeError("IP disassociate timeout!")
-
-    def new_server_ops(self):
-        self._create_vm()
-        cli = self.manager.compute_floating_ips_client
-        cli.associate_floating_ip_to_server(self.floating['ip'],
-                                            self.server_id)
-        if self.ssh_test_before_attach and self.enable_ssh_verify:
-            self.logger.info("Scanning for block devices via ssh on %s"
-                             % self.server_id)
-            self.part_wait(self.detach_match_count)
-
-    def setUp(self, **kwargs):
-        """Note able configuration combinations:
-
-            Closest options to the test_stamp_pattern:
-                new_server = True
-                new_volume = True
-                enable_ssh_verify = True
-                ssh_test_before_attach = False
-            Just attaching:
-                new_server = False
-                new_volume = False
-                enable_ssh_verify = True
-                ssh_test_before_attach = True
-            Mostly API load by repeated attachment:
-                new_server = False
-                new_volume = False
-                enable_ssh_verify = False
-                ssh_test_before_attach = False
-            Minimal Nova load, but cinder load not decreased:
-                new_server = False
-                new_volume = True
-                enable_ssh_verify = True
-                ssh_test_before_attach = True
-        """
-        self.image = CONF.compute.image_ref
-        self.flavor = CONF.compute.flavor_ref
-        self.vm_extra_args = kwargs.get('vm_extra_args', {})
-        self.floating_pool = kwargs.get('floating_pool', None)
-        self.new_volume = kwargs.get('new_volume', True)
-        self.new_server = kwargs.get('new_server', False)
-        self.enable_ssh_verify = kwargs.get('enable_ssh_verify', True)
-        self.ssh_test_before_attach = kwargs.get('ssh_test_before_attach',
-                                                 False)
-        self.part_line_re = re.compile(kwargs.get('part_line_re', '.*vd.*'))
-        self.detach_match_count = kwargs.get('detach_match_count', 1)
-        self.attach_match_count = kwargs.get('attach_match_count', 2)
-        self.part_name = kwargs.get('part_name', '/dev/vdc')
-
-        self._create_floating_ip()
-        self._create_sec_group()
-        self._create_keypair()
-        private_key = self.key['private_key']
-        username = CONF.validation.image_ssh_user
-        self.remote_client = remote_client.RemoteClient(self.floating['ip'],
-                                                        username,
-                                                        pkey=private_key)
-        if not self.new_volume:
-            self._create_volume()
-        if not self.new_server:
-            self.new_server_ops()
-
-    # now we just test that the number of partitions has increased or decreased
-    def part_wait(self, num_match):
-        def _part_state():
-            self.partitions = self.remote_client.get_partitions().split('\n')
-            matching = 0
-            for part_line in self.partitions[1:]:
-                if self.part_line_re.match(part_line):
-                    matching += 1
-            return matching == num_match
-        if test_utils.call_until_true(_part_state,
-                                      CONF.compute.build_timeout,
-                                      CONF.compute.build_interval):
-            return
-        else:
-            raise RuntimeError("Unexpected partitions: %s",
-                               str(self.partitions))
-
-    def run(self):
-        if self.new_server:
-            self.new_server_ops()
-        if self.new_volume:
-            self._create_volume()
-        servers_client = self.manager.servers_client
-        self.logger.info("attach volume (%s) to vm %s" %
-                         (self.volume['id'], self.server_id))
-        servers_client.attach_volume(self.server_id,
-                                     volumeId=self.volume['id'],
-                                     device=self.part_name)
-        self.manager.volumes_client.wait_for_volume_status(self.volume['id'],
-                                                           'in-use')
-        if self.enable_ssh_verify:
-            self.logger.info("Scanning for new block device on %s"
-                             % self.server_id)
-            self.part_wait(self.attach_match_count)
-
-        servers_client.detach_volume(self.server_id,
-                                     self.volume['id'])
-        self.manager.volumes_client.wait_for_volume_status(self.volume['id'],
-                                                           'available')
-        if self.enable_ssh_verify:
-            self.logger.info("Scanning for block device disappearance on %s"
-                             % self.server_id)
-            self.part_wait(self.detach_match_count)
-        if self.new_volume:
-            self._delete_volume()
-        if self.new_server:
-            self._destroy_vm()
-
-    def tearDown(self):
-        cli = self.manager.compute_floating_ips_client
-        cli.disassociate_floating_ip_from_server(self.floating['ip'],
-                                                 self.server_id)
-        self._wait_disassociate()
-        if not self.new_server:
-            self._destroy_vm()
-        self._delete_keypair()
-        self._destroy_floating_ip()
-        self._destroy_sec_grp()
-        if not self.new_volume:
-            self._delete_volume()
diff --git a/tempest/stress/actions/volume_create_delete.py b/tempest/stress/actions/volume_create_delete.py
deleted file mode 100644
index 66971ea..0000000
--- a/tempest/stress/actions/volume_create_delete.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#    Licensed under the Apache License, Version 2.0 (the "License");
-#    you may not use this file except in compliance with the License.
-#    You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-
-from tempest.common.utils import data_utils
-from tempest import config
-import tempest.stress.stressaction as stressaction
-
-CONF = config.CONF
-
-
-class VolumeCreateDeleteTest(stressaction.StressAction):
-
-    def run(self):
-        name = data_utils.rand_name("volume")
-        self.logger.info("creating %s" % name)
-        volumes_client = self.manager.volumes_client
-        volume = volumes_client.create_volume(
-            display_name=name, size=CONF.volume.volume_size)['volume']
-        vol_id = volume['id']
-        volumes_client.wait_for_volume_status(vol_id, 'available')
-        self.logger.info("created %s" % volume['id'])
-        self.logger.info("deleting %s" % name)
-        volumes_client.delete_volume(vol_id)
-        volumes_client.wait_for_resource_deletion(vol_id)
-        self.logger.info("deleted %s" % vol_id)
diff --git a/tempest/stress/cleanup.py b/tempest/stress/cleanup.py
deleted file mode 100644
index 3b0a937..0000000
--- a/tempest/stress/cleanup.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2013 Quanta Research Cambridge, Inc.
-#
-#    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 oslo_log import log as logging
-
-from tempest.common import credentials_factory as credentials
-from tempest.common import waiters
-
-LOG = logging.getLogger(__name__)
-
-
-def cleanup():
-    admin_manager = credentials.AdminManager()
-
-    body = admin_manager.servers_client.list_servers(all_tenants=True)
-    LOG.info("Cleanup::remove %s servers" % len(body['servers']))
-    for s in body['servers']:
-        try:
-            admin_manager.servers_client.delete_server(s['id'])
-        except Exception:
-            pass
-
-    for s in body['servers']:
-        try:
-            waiters.wait_for_server_termination(admin_manager.servers_client,
-                                                s['id'])
-        except Exception:
-            pass
-
-    keypairs = admin_manager.keypairs_client.list_keypairs()['keypairs']
-    LOG.info("Cleanup::remove %s keypairs" % len(keypairs))
-    for k in keypairs:
-        try:
-            admin_manager.keypairs_client.delete_keypair(k['name'])
-        except Exception:
-            pass
-
-    secgrp_client = admin_manager.compute_security_groups_client
-    secgrp = (secgrp_client.list_security_groups(all_tenants=True)
-              ['security_groups'])
-    secgrp_del = [grp for grp in secgrp if grp['name'] != 'default']
-    LOG.info("Cleanup::remove %s Security Group" % len(secgrp_del))
-    for g in secgrp_del:
-        try:
-            secgrp_client.delete_security_group(g['id'])
-        except Exception:
-            pass
-
-    admin_floating_ips_client = admin_manager.compute_floating_ips_client
-    floating_ips = (admin_floating_ips_client.list_floating_ips()
-                    ['floating_ips'])
-    LOG.info("Cleanup::remove %s floating ips" % len(floating_ips))
-    for f in floating_ips:
-        try:
-            admin_floating_ips_client.delete_floating_ip(f['id'])
-        except Exception:
-            pass
-
-    users = admin_manager.users_client.list_users()['users']
-    LOG.info("Cleanup::remove %s users" % len(users))
-    for user in users:
-        if user['name'].startswith("stress_user"):
-            admin_manager.users_client.delete_user(user['id'])
-    tenants = admin_manager.tenants_client.list_tenants()['tenants']
-    LOG.info("Cleanup::remove %s tenants" % len(tenants))
-    for tenant in tenants:
-        if tenant['name'].startswith("stress_tenant"):
-            admin_manager.tenants_client.delete_tenant(tenant['id'])
-
-    # We have to delete snapshots first or
-    # volume deletion may block
-
-    _, snaps = admin_manager.snapshots_client.list_snapshots(
-        all_tenants=True)['snapshots']
-    LOG.info("Cleanup::remove %s snapshots" % len(snaps))
-    for v in snaps:
-        try:
-            waiters.wait_for_snapshot_status(
-                admin_manager.snapshots_client, v['id'], 'available')
-            admin_manager.snapshots_client.delete_snapshot(v['id'])
-        except Exception:
-            pass
-
-    for v in snaps:
-        try:
-            admin_manager.snapshots_client.wait_for_resource_deletion(v['id'])
-        except Exception:
-            pass
-
-    vols = admin_manager.volumes_client.list_volumes(
-        params={"all_tenants": True})
-    LOG.info("Cleanup::remove %s volumes" % len(vols))
-    for v in vols:
-        try:
-            waiters.wait_for_volume_status(
-                admin_manager.volumes_client, v['id'], 'available')
-            admin_manager.volumes_client.delete_volume(v['id'])
-        except Exception:
-            pass
-
-    for v in vols:
-        try:
-            admin_manager.volumes_client.wait_for_resource_deletion(v['id'])
-        except Exception:
-            pass
diff --git a/tempest/stress/driver.py b/tempest/stress/driver.py
deleted file mode 100644
index 1e33e88..0000000
--- a/tempest/stress/driver.py
+++ /dev/null
@@ -1,264 +0,0 @@
-# Copyright 2013 Quanta Research Cambridge, Inc.
-#
-#    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 multiprocessing
-import os
-import signal
-import time
-
-from oslo_log import log as logging
-from oslo_utils import importutils
-import six
-
-from tempest import clients
-from tempest.common import cred_client
-from tempest.common import credentials_factory as credentials
-from tempest.common.utils import data_utils
-from tempest import config
-from tempest import exceptions
-from tempest.lib.common import ssh
-from tempest.stress import cleanup
-
-CONF = config.CONF
-
-LOG = logging.getLogger(__name__)
-processes = []
-
-
-def do_ssh(command, host, ssh_user, ssh_key=None):
-    ssh_client = ssh.Client(host, ssh_user, key_filename=ssh_key)
-    try:
-        return ssh_client.exec_command(command)
-    except exceptions.SSHExecCommandFailed:
-        LOG.error('do_ssh raise exception. command:%s, host:%s.'
-                  % (command, host))
-        return None
-
-
-def _get_compute_nodes(controller, ssh_user, ssh_key=None):
-    """Returns a list of active compute nodes.
-
-    List is generated by running nova-manage on the controller.
-    """
-    nodes = []
-    cmd = "nova-manage service list | grep ^nova-compute"
-    output = do_ssh(cmd, controller, ssh_user, ssh_key)
-    if not output:
-        return nodes
-    # For example: nova-compute xg11eth0 nova enabled :-) 2011-10-31 18:57:46
-    # This is fragile but there is, at present, no other way to get this info.
-    for line in output.split('\n'):
-        words = line.split()
-        if len(words) > 0 and words[4] == ":-)":
-            nodes.append(words[1])
-    return nodes
-
-
-def _has_error_in_logs(logfiles, nodes, ssh_user, ssh_key=None,
-                       stop_on_error=False):
-    """Detect errors in nova log files on the controller and compute nodes."""
-    grep = 'egrep "ERROR|TRACE" %s' % logfiles
-    ret = False
-    for node in nodes:
-        errors = do_ssh(grep, node, ssh_user, ssh_key)
-        if len(errors) > 0:
-            LOG.error('%s: %s' % (node, errors))
-            ret = True
-            if stop_on_error:
-                break
-    return ret
-
-
-def sigchld_handler(signalnum, frame):
-    """Signal handler (only active if stop_on_error is True)."""
-    for process in processes:
-        if (not process['process'].is_alive() and
-                process['process'].exitcode != 0):
-            signal.signal(signalnum, signal.SIG_DFL)
-            terminate_all_processes()
-            break
-
-
-def terminate_all_processes(check_interval=20):
-    """Goes through the process list and terminates all child processes."""
-    LOG.info("Stopping all processes.")
-    for process in processes:
-        if process['process'].is_alive():
-            try:
-                process['process'].terminate()
-            except Exception:
-                pass
-    time.sleep(check_interval)
-    for process in processes:
-        if process['process'].is_alive():
-            try:
-                pid = process['process'].pid
-                LOG.warning("Process %d hangs. Send SIGKILL." % pid)
-                os.kill(pid, signal.SIGKILL)
-            except Exception:
-                pass
-        process['process'].join()
-
-
-def stress_openstack(tests, duration, max_runs=None, stop_on_error=False):
-    """Workload driver. Executes an action function against a nova-cluster."""
-    admin_manager = credentials.AdminManager()
-
-    ssh_user = CONF.stress.target_ssh_user
-    ssh_key = CONF.stress.target_private_key_path
-    logfiles = CONF.stress.target_logfiles
-    log_check_interval = int(CONF.stress.log_check_interval)
-    default_thread_num = int(CONF.stress.default_thread_number_per_action)
-    if logfiles:
-        controller = CONF.stress.target_controller
-        computes = _get_compute_nodes(controller, ssh_user, ssh_key)
-        for node in computes:
-            do_ssh("rm -f %s" % logfiles, node, ssh_user, ssh_key)
-    skip = False
-    for test in tests:
-        for service in test.get('required_services', []):
-            if not CONF.service_available.get(service):
-                skip = True
-                break
-        if skip:
-            break
-        # TODO(andreaf) This has to be reworked to use the credential
-        # provider interface. For now only tests marked as 'use_admin' will
-        # work.
-        if test.get('use_admin', False):
-            manager = admin_manager
-        else:
-            raise NotImplemented('Non admin tests are not supported')
-        for p_number in range(test.get('threads', default_thread_num)):
-            if test.get('use_isolated_tenants', False):
-                username = data_utils.rand_name("stress_user")
-                tenant_name = data_utils.rand_name("stress_tenant")
-                password = "pass"
-                if CONF.identity.auth_version == 'v2':
-                    identity_client = admin_manager.identity_client
-                    projects_client = admin_manager.tenants_client
-                    roles_client = admin_manager.roles_client
-                    users_client = admin_manager.users_client
-                    domains_client = None
-                else:
-                    identity_client = admin_manager.identity_v3_client
-                    projects_client = admin_manager.projects_client
-                    roles_client = admin_manager.roles_v3_client
-                    users_client = admin_manager.users_v3_client
-                    domains_client = admin_manager.domains_client
-                domain = (identity_client.auth_provider.credentials.
-                          get('project_domain_name', 'Default'))
-                credentials_client = cred_client.get_creds_client(
-                    identity_client, projects_client, users_client,
-                    roles_client, domains_client, project_domain_name=domain)
-                project = credentials_client.create_project(
-                    name=tenant_name, description=tenant_name)
-                user = credentials_client.create_user(username, password,
-                                                      project, "email")
-                # Add roles specified in config file
-                for conf_role in CONF.auth.tempest_roles:
-                    credentials_client.assign_user_role(user, project,
-                                                        conf_role)
-                creds = credentials_client.get_credentials(user, project,
-                                                           password)
-                manager = clients.Manager(credentials=creds)
-
-            test_obj = importutils.import_class(test['action'])
-            test_run = test_obj(manager, max_runs, stop_on_error)
-
-            kwargs = test.get('kwargs', {})
-            test_run.setUp(**dict(six.iteritems(kwargs)))
-
-            LOG.debug("calling Target Object %s" %
-                      test_run.__class__.__name__)
-
-            mp_manager = multiprocessing.Manager()
-            shared_statistic = mp_manager.dict()
-            shared_statistic['runs'] = 0
-            shared_statistic['fails'] = 0
-
-            p = multiprocessing.Process(target=test_run.execute,
-                                        args=(shared_statistic,))
-
-            process = {'process': p,
-                       'p_number': p_number,
-                       'action': test_run.action,
-                       'statistic': shared_statistic}
-
-            processes.append(process)
-            p.start()
-    if stop_on_error:
-        # NOTE(mkoderer): only the parent should register the handler
-        signal.signal(signal.SIGCHLD, sigchld_handler)
-    end_time = time.time() + duration
-    had_errors = False
-    try:
-        while True:
-            if max_runs is None:
-                remaining = end_time - time.time()
-                if remaining <= 0:
-                    break
-            else:
-                remaining = log_check_interval
-                all_proc_term = True
-                for process in processes:
-                    if process['process'].is_alive():
-                        all_proc_term = False
-                        break
-                if all_proc_term:
-                    break
-
-            time.sleep(min(remaining, log_check_interval))
-            if stop_on_error:
-                if any([True for proc in processes
-                        if proc['statistic']['fails'] > 0]):
-                    break
-
-            if not logfiles:
-                continue
-            if _has_error_in_logs(logfiles, computes, ssh_user, ssh_key,
-                                  stop_on_error):
-                had_errors = True
-                break
-    except KeyboardInterrupt:
-        LOG.warning("Interrupted, going to print statistics and exit ...")
-
-    if stop_on_error:
-        signal.signal(signal.SIGCHLD, signal.SIG_DFL)
-    terminate_all_processes()
-
-    sum_fails = 0
-    sum_runs = 0
-
-    LOG.info("Statistics (per process):")
-    for process in processes:
-        if process['statistic']['fails'] > 0:
-            had_errors = True
-        sum_runs += process['statistic']['runs']
-        sum_fails += process['statistic']['fails']
-        print("Process %d (%s): Run %d actions (%d failed)" % (
-            process['p_number'],
-            process['action'],
-            process['statistic']['runs'],
-            process['statistic']['fails']))
-    print("Summary:")
-    print("Run %d actions (%d failed)" % (sum_runs, sum_fails))
-
-    if not had_errors and CONF.stress.full_clean_stack:
-        LOG.info("cleaning up")
-        cleanup.cleanup()
-    if had_errors:
-        return 1
-    else:
-        return 0
diff --git a/tempest/stress/etc/sample-unit-test.json b/tempest/stress/etc/sample-unit-test.json
deleted file mode 100644
index 54433d5..0000000
--- a/tempest/stress/etc/sample-unit-test.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[{"action": "tempest.stress.actions.unit_test.UnitTest",
-  "threads": 8,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {"test_method": "tempest.cli.simple_read_only.test_glance.SimpleReadOnlyGlanceClientTest.test_glance_fake_action",
-             "class_setup_per": "process"}
-  }
-]
diff --git a/tempest/stress/etc/server-create-destroy-test.json b/tempest/stress/etc/server-create-destroy-test.json
deleted file mode 100644
index bbb5352..0000000
--- a/tempest/stress/etc/server-create-destroy-test.json
+++ /dev/null
@@ -1,7 +0,0 @@
-[{"action": "tempest.stress.actions.server_create_destroy.ServerCreateDestroyTest",
-  "threads": 8,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {}
-  }
-]
diff --git a/tempest/stress/etc/ssh_floating.json b/tempest/stress/etc/ssh_floating.json
deleted file mode 100644
index c502e96..0000000
--- a/tempest/stress/etc/ssh_floating.json
+++ /dev/null
@@ -1,16 +0,0 @@
-[{"action": "tempest.stress.actions.ssh_floating.FloatingStress",
-  "threads": 8,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {"vm_extra_args": {},
-             "new_vm": true,
-             "new_sec_group": true,
-             "new_floating": true,
-             "verify": ["check_icmp_echo", "check_port_ssh"],
-             "check_timeout": 120,
-             "check_interval": 1,
-             "wait_after_vm_create": true,
-             "wait_for_disassociate": true,
-             "reboot": false}
-}
-]
diff --git a/tempest/stress/etc/stress-tox-job.json b/tempest/stress/etc/stress-tox-job.json
deleted file mode 100644
index bfa448d..0000000
--- a/tempest/stress/etc/stress-tox-job.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[{"action": "tempest.stress.actions.server_create_destroy.ServerCreateDestroyTest",
-  "threads": 8,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {}
-  },
-  {"action": "tempest.stress.actions.volume_create_delete.VolumeCreateDeleteTest",
-  "threads": 4,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {}
-  },
-  {"action": "tempest.stress.actions.volume_attach_delete.VolumeAttachDeleteTest",
-  "threads": 2,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {}
-  },
-  {"action": "tempest.stress.actions.unit_test.UnitTest",
-  "threads": 4,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "required_services": ["neutron"],
-  "kwargs": {"test_method": "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_stop_start",
-             "class_setup_per": "process"}
-  }
-]
-
diff --git a/tempest/stress/etc/volume-attach-delete-test.json b/tempest/stress/etc/volume-attach-delete-test.json
deleted file mode 100644
index d468967..0000000
--- a/tempest/stress/etc/volume-attach-delete-test.json
+++ /dev/null
@@ -1,7 +0,0 @@
-[{"action": "tempest.stress.actions.volume_attach_delete.VolumeAttachDeleteTest",
-  "threads": 4,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {}
-  }
-]
diff --git a/tempest/stress/etc/volume-attach-verify.json b/tempest/stress/etc/volume-attach-verify.json
deleted file mode 100644
index d8c96fd..0000000
--- a/tempest/stress/etc/volume-attach-verify.json
+++ /dev/null
@@ -1,11 +0,0 @@
-[{"action": "tempest.stress.actions.volume_attach_verify.VolumeVerifyStress",
-  "threads": 1,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {"vm_extra_args": {},
-             "new_volume": true,
-             "new_server": false,
-             "ssh_test_before_attach": false,
-             "enable_ssh_verify": true}
-}
-]
diff --git a/tempest/stress/etc/volume-create-delete-test.json b/tempest/stress/etc/volume-create-delete-test.json
deleted file mode 100644
index a60cde6..0000000
--- a/tempest/stress/etc/volume-create-delete-test.json
+++ /dev/null
@@ -1,7 +0,0 @@
-[{"action": "tempest.stress.actions.volume_create_delete.VolumeCreateDeleteTest",
-  "threads": 4,
-  "use_admin": true,
-  "use_isolated_tenants": true,
-  "kwargs": {}
-  }
-]
diff --git a/tempest/stress/stressaction.py b/tempest/stress/stressaction.py
deleted file mode 100644
index cf0a08a..0000000
--- a/tempest/stress/stressaction.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import abc
-import signal
-import sys
-
-import six
-
-from oslo_log import log as logging
-
-
-@six.add_metaclass(abc.ABCMeta)
-class StressAction(object):
-
-    def __init__(self, manager, max_runs=None, stop_on_error=False):
-        full_cname = self.__module__ + "." + self.__class__.__name__
-        self.logger = logging.getLogger(full_cname)
-        self.manager = manager
-        self.max_runs = max_runs
-        self.stop_on_error = stop_on_error
-
-    def _shutdown_handler(self, signal, frame):
-        try:
-            self.tearDown()
-        except Exception:
-            self.logger.exception("Error while tearDown")
-        sys.exit(0)
-
-    @property
-    def action(self):
-        """This methods returns the action.
-
-        Overload this if you create a stress test wrapper.
-        """
-        return self.__class__.__name__
-
-    def setUp(self, **kwargs):
-        """Initialize test structures/resources
-
-        This method is called before "run" method to help the test
-        initialize any structures. kwargs contains arguments passed
-        in from the configuration json file.
-
-        setUp doesn't count against the time duration.
-        """
-        self.logger.debug("setUp")
-
-    def tearDown(self):
-        """Cleanup test structures/resources
-
-        This method is called to do any cleanup after the test is complete.
-        """
-        self.logger.debug("tearDown")
-
-    def execute(self, shared_statistic):
-        """This is the main execution entry point called by the driver.
-
-        We register a signal handler to allow us to tearDown gracefully,
-        and then exit. We also keep track of how many runs we do.
-        """
-        signal.signal(signal.SIGHUP, self._shutdown_handler)
-        signal.signal(signal.SIGTERM, self._shutdown_handler)
-
-        while self.max_runs is None or (shared_statistic['runs'] <
-                                        self.max_runs):
-            self.logger.debug("Trigger new run (run %d)" %
-                              shared_statistic['runs'])
-            try:
-                self.run()
-            except Exception:
-                shared_statistic['fails'] += 1
-                self.logger.exception("Failure in run")
-            finally:
-                shared_statistic['runs'] += 1
-                if self.stop_on_error and (shared_statistic['fails'] > 1):
-                    self.logger.warning("Stop process due to"
-                                        "\"stop-on-error\" argument")
-                    self.tearDown()
-                    sys.exit(1)
-
-    @abc.abstractmethod
-    def run(self):
-        """This method is where the stress test code runs."""
-        return
diff --git a/tempest/stress/tools/cleanup.py b/tempest/stress/tools/cleanup.py
deleted file mode 100755
index 3885ba0..0000000
--- a/tempest/stress/tools/cleanup.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2013 Quanta Research Cambridge, Inc.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License");
-#    you may not use this file except in compliance with the License.
-#    You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-
-from tempest.stress import cleanup
-
-cleanup.cleanup()
diff --git a/tempest/test.py b/tempest/test.py
index 6dc065c..cc9410f 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -102,32 +102,6 @@
     return decorator
 
 
-def stresstest(**kwargs):
-    """Add stress test decorator
-
-    For all functions with this decorator a attr stress will be
-    set automatically.
-
-    @param class_setup_per: allowed values are application, process, action
-           ``application``: once in the stress job lifetime
-           ``process``: once in the worker process lifetime
-           ``action``: on each action
-    @param allow_inheritance: allows inheritance of this attribute
-    """
-    def decorator(f):
-        if 'class_setup_per' in kwargs:
-            setattr(f, "st_class_setup_per", kwargs['class_setup_per'])
-        else:
-            setattr(f, "st_class_setup_per", 'process')
-        if 'allow_inheritance' in kwargs:
-            setattr(f, "st_allow_inheritance", kwargs['allow_inheritance'])
-        else:
-            setattr(f, "st_allow_inheritance", False)
-        attr(type='stress')(f)
-        return f
-    return decorator
-
-
 def requires_ext(**kwargs):
     """A decorator to skip tests if an extension is not enabled
 
diff --git a/tempest/tests/stress/__init__.py b/tempest/tests/stress/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/tests/stress/__init__.py
+++ /dev/null
diff --git a/tempest/tests/stress/test_stress.py b/tempest/tests/stress/test_stress.py
deleted file mode 100644
index dfe0291..0000000
--- a/tempest/tests/stress/test_stress.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2013 Deutsche Telekom AG
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import shlex
-import subprocess
-
-from oslo_log import log as logging
-from tempest.lib import exceptions
-from tempest.tests import base
-
-LOG = logging.getLogger(__name__)
-
-
-class StressFrameworkTest(base.TestCase):
-    """Basic test for the stress test framework."""
-
-    def _cmd(self, cmd, param):
-        """Executes specified command."""
-        cmd = ' '.join([cmd, param])
-        LOG.info("running: '%s'" % cmd)
-        cmd_str = cmd
-        cmd = shlex.split(cmd)
-        result = ''
-        result_err = ''
-        try:
-            stdout = subprocess.PIPE
-            stderr = subprocess.PIPE
-            proc = subprocess.Popen(
-                cmd, stdout=stdout, stderr=stderr)
-            result, result_err = proc.communicate()
-            if proc.returncode != 0:
-                LOG.debug('error of %s:\n%s' % (cmd_str, result_err))
-                raise exceptions.CommandFailed(proc.returncode,
-                                               cmd,
-                                               result)
-        finally:
-            LOG.debug('output of %s:\n%s' % (cmd_str, result))
-        return proc.returncode
-
-    def test_help_function(self):
-        result = self._cmd("python", "-m tempest.cmd.run_stress -h")
-        self.assertEqual(0, result)
diff --git a/tempest/tests/stress/test_stressaction.py b/tempest/tests/stress/test_stressaction.py
deleted file mode 100644
index 1a1bb67..0000000
--- a/tempest/tests/stress/test_stressaction.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2013 Deutsche Telekom AG
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import tempest.stress.stressaction as stressaction
-import tempest.test
-
-
-class FakeStressAction(stressaction.StressAction):
-    def __init__(self, manager, max_runs=None, stop_on_error=False):
-        super(self.__class__, self).__init__(manager, max_runs, stop_on_error)
-        self._run_called = False
-
-    def run(self):
-        self._run_called = True
-
-    @property
-    def run_called(self):
-        return self._run_called
-
-
-class FakeStressActionFailing(stressaction.StressAction):
-    def run(self):
-        raise Exception('FakeStressActionFailing raise exception')
-
-
-class TestStressAction(tempest.test.BaseTestCase):
-    def _bulid_stats_dict(self, runs=0, fails=0):
-        return {'runs': runs, 'fails': fails}
-
-    def testStressTestRun(self):
-        stressAction = FakeStressAction(manager=None, max_runs=1)
-        stats = self._bulid_stats_dict()
-        stressAction.execute(stats)
-        self.assertTrue(stressAction.run_called)
-        self.assertEqual(stats['runs'], 1)
-        self.assertEqual(stats['fails'], 0)
-
-    def testStressMaxTestRuns(self):
-        stressAction = FakeStressAction(manager=None, max_runs=500)
-        stats = self._bulid_stats_dict(runs=499)
-        stressAction.execute(stats)
-        self.assertTrue(stressAction.run_called)
-        self.assertEqual(stats['runs'], 500)
-        self.assertEqual(stats['fails'], 0)
-
-    def testStressTestRunWithException(self):
-        stressAction = FakeStressActionFailing(manager=None, max_runs=1)
-        stats = self._bulid_stats_dict()
-        stressAction.execute(stats)
-        self.assertEqual(stats['runs'], 1)
-        self.assertEqual(stats['fails'], 1)
diff --git a/tempest/tests/test_decorators.py b/tempest/tests/test_decorators.py
index 17dbea0..ae2f2a3 100644
--- a/tempest/tests/test_decorators.py
+++ b/tempest/tests/test_decorators.py
@@ -153,36 +153,6 @@
                 continue
 
 
-class TestStressDecorator(BaseDecoratorsTest):
-    def _test_stresstest_helper(self, expected_frequency='process',
-                                expected_inheritance=False,
-                                **decorator_args):
-        @test.stresstest(**decorator_args)
-        def foo():
-            pass
-        self.assertEqual(getattr(foo, 'st_class_setup_per'),
-                         expected_frequency)
-        self.assertEqual(getattr(foo, 'st_allow_inheritance'),
-                         expected_inheritance)
-        self.assertEqual(set(['stress']), getattr(foo, '__testtools_attrs'))
-
-    def test_stresstest_decorator_default(self):
-        self._test_stresstest_helper()
-
-    def test_stresstest_decorator_class_setup_frequency(self):
-        self._test_stresstest_helper('process', class_setup_per='process')
-
-    def test_stresstest_decorator_class_setup_frequency_non_default(self):
-        self._test_stresstest_helper(expected_frequency='application',
-                                     class_setup_per='application')
-
-    def test_stresstest_decorator_set_frequency_and_inheritance(self):
-        self._test_stresstest_helper(expected_frequency='application',
-                                     expected_inheritance=True,
-                                     class_setup_per='application',
-                                     allow_inheritance=True)
-
-
 class TestRequiresExtDecorator(BaseDecoratorsTest):
     def setUp(self):
         super(TestRequiresExtDecorator, self).setUp()
diff --git a/tox.ini b/tox.ini
index 02eef78..82dba92 100644
--- a/tox.ini
+++ b/tox.ini
@@ -112,14 +112,6 @@
     find . -type f -name "*.pyc" -delete
     tempest run --serial --regex '\[.*\bsmoke\b.*\]' {posargs}
 
-[testenv:stress]
-envdir = .tox/tempest
-sitepackages = {[tempestenv]sitepackages}
-setenv = {[tempestenv]setenv}
-deps = {[tempestenv]deps}
-commands =
-    run-tempest-stress {posargs}
-
 [testenv:venv]
 commands = {posargs}
 
