Merge "Forbid availability_zone None in aggregate Nova API"
diff --git a/etc/schemas/compute/flavors/flavor_details.json b/etc/schemas/compute/flavors/flavor_details.json
new file mode 100644
index 0000000..d1c1077
--- /dev/null
+++ b/etc/schemas/compute/flavors/flavor_details.json
@@ -0,0 +1,6 @@
+{
+    "name": "get-flavor-details",
+    "http-method": "GET",
+    "url": "flavors/%s",
+    "resources": ["flavor"]
+}
diff --git a/etc/schemas/compute/flavors/flavors_list.json b/etc/schemas/compute/flavors/flavors_list.json
new file mode 100644
index 0000000..eb8383b
--- /dev/null
+++ b/etc/schemas/compute/flavors/flavors_list.json
@@ -0,0 +1,24 @@
+{
+    "name": "list-flavors-with-detail",
+    "http-method": "GET",
+    "url": "flavors/detail",
+    "json-schema": {
+        "type": "object",
+        "properties": {
+            "minRam": {
+                "type": "integer",
+                "results": {
+                    "gen_none": 400,
+                    "gen_string": 400
+                }
+            },
+            "minDisk": {
+                "type": "integer",
+                "results": {
+                    "gen_none": 400,
+                    "gen_string": 400
+                }
+            }
+        }
+    }
+}
diff --git a/etc/schemas/compute/servers/get_console_output.json b/etc/schemas/compute/servers/get_console_output.json
new file mode 100644
index 0000000..7c3860f
--- /dev/null
+++ b/etc/schemas/compute/servers/get_console_output.json
@@ -0,0 +1,21 @@
+{
+    "name": "get-console-output",
+    "http-method": "POST",
+    "url": "servers/%s/action",
+    "resources": ["server"],
+    "json-schema": {
+        "type": "object",
+        "properties": {
+            "os-getConsoleOutput": {
+                "type": "object",
+                "properties": {
+                    "length": {
+                        "type": ["integer", "string"],
+                        "minimum": 0
+                    }
+                }
+            }
+        },
+        "additionalProperties": false
+    }
+}
diff --git a/etc/tempest.conf.sample b/etc/tempest.conf.sample
index 21c8506..48ca905 100644
--- a/etc/tempest.conf.sample
+++ b/etc/tempest.conf.sample
@@ -155,7 +155,7 @@
 [cli]
 
 #
-# Options defined in tempest.cli
+# Options defined in tempest.config
 #
 
 # enable cli tests (boolean value)
@@ -494,7 +494,7 @@
 
 # Matching flavors become parameters for scenario tests
 # (string value)
-#flavor_regex=^m1.(micro|nano|tiny)$
+#flavor_regex=^m1.nano$
 
 # SSH verification in tests is skippedfor matching images
 # (string value)
diff --git a/requirements.txt b/requirements.txt
index 3b3e1fa..8c0f872 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,22 +1,22 @@
 pbr>=0.5.21,<1.0
 anyjson>=0.3.3
 nose
-httplib2
-jsonschema>=1.3.0,!=1.4.0
-testtools>=0.9.32
+httplib2>=0.7.5
+jsonschema>=2.0.0,<3.0.0
+testtools>=0.9.34
 lxml>=2.3
 boto>=2.12.0,!=2.13.0
-paramiko>=1.8.0
+paramiko>=1.9.0
 netaddr>=0.7.6
 python-glanceclient>=0.9.0
-python-keystoneclient>=0.4.1
+python-keystoneclient>=0.4.2
 python-novaclient>=2.15.0
-python-neutronclient>=2.3.0,<3
+python-neutronclient>=2.3.3,<3
 python-cinderclient>=1.0.6
 python-heatclient>=0.2.3
 python-swiftclient>=1.5
 testresources>=0.2.4
-keyring>=1.6.1,<2.0
+keyring>=1.6.1,<2.0,>=2.1
 testrepository>=0.0.17
 oslo.config>=1.2.0
 six>=1.4.1
diff --git a/run_tempest.sh b/run_tempest.sh
index be9b38a..f6c330d 100755
--- a/run_tempest.sh
+++ b/run_tempest.sh
@@ -13,7 +13,7 @@
   echo "  -t, --serial             Run testr serially"
   echo "  -C, --config             Config file location"
   echo "  -h, --help               Print this usage message"
-  echo "  -d, --debug              Debug this script -- set -o xtrace"
+  echo "  -d, --debug              Run tests with testtools instead of testr. This allows you to use PDB"
   echo "  -l, --logging            Enable logging"
   echo "  -L, --logging-config     Logging config file location.  Default is etc/logging.conf"
   echo "  -- [TESTROPTIONS]        After the first '--' you can pass arbitrary arguments to testr "
@@ -26,6 +26,7 @@
 always_venv=0
 never_venv=0
 no_site_packages=0
+debug=0
 force=0
 wrapper=""
 config_file=""
@@ -50,7 +51,7 @@
     -n|--no-site-packages) no_site_packages=1;;
     -f|--force) force=1;;
     -u|--update) update=1;;
-    -d|--debug) set -o xtrace;;
+    -d|--debug) debug=1;;
     -C|--config) config_file=$2; shift;;
     -s|--smoke) testrargs+="smoke"; noseargs+="--attr=type=smoke";;
     -t|--serial) serial=1;;
@@ -94,6 +95,14 @@
   testr_init
   ${wrapper} find . -type f -name "*.pyc" -delete
   export OS_TEST_PATH=./tempest/test_discover
+  if [ $debug -eq 1 ]; then
+      if [ "$testrargs" = "" ]; then
+           testrargs="discover ./tempest/test_discover"
+      fi
+      ${wrapper} python -m testtools.run $testrargs
+      return $?
+  fi
+
   if [ $serial -eq 1 ]; then
       ${wrapper} testr run --subunit $testrargs | ${wrapper} subunit-2to1 | ${wrapper} tools/colorizer.py
   else
diff --git a/run_tests.sh b/run_tests.sh
index 3f00453..eaa7fd7 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -13,7 +13,7 @@
   echo "  -p, --pep8               Just run pep8"
   echo "  -c, --coverage           Generate coverage report"
   echo "  -h, --help               Print this usage message"
-  echo "  -d, --debug              Debug this script -- set -o xtrace"
+  echo "  -d, --debug              Run tests with testtools instead of testr. This allows you to use PDB"
   echo "  -- [TESTROPTIONS]        After the first '--' you can pass arbitrary arguments to testr "
 }
 
@@ -25,6 +25,7 @@
 always_venv=0
 never_venv=0
 no_site_packages=0
+debug=0
 force=0
 coverage=0
 wrapper=""
@@ -48,7 +49,7 @@
     -n|--no-site-packages) no_site_packages=1;;
     -f|--force) force=1;;
     -u|--update) update=1;;
-    -d|--debug) set -o xtrace;;
+    -d|--debug) debug=1;;
     -p|--pep8) let just_pep8=1;;
     -c|--coverage) coverage=1;;
     -t|--serial) serial=1;;
@@ -75,6 +76,14 @@
   testr_init
   ${wrapper} find . -type f -name "*.pyc" -delete
   export OS_TEST_PATH=./tempest/tests
+  if [ $debug -eq 1 ]; then
+      if [ "$testrargs" = "" ]; then
+          testrargs="discover ./tempest/tests"
+      fi
+      ${wrapper} python -m testtools.run $testrargs
+      return $?
+  fi
+
   if [ $serial -eq 1 ]; then
       ${wrapper} testr run --subunit $testrargs | ${wrapper} subunit-2to1 | ${wrapper} tools/colorizer.py
   else
diff --git a/tempest/api/baremetal/base.py b/tempest/api/baremetal/base.py
index ec87321..2e745f8 100644
--- a/tempest/api/baremetal/base.py
+++ b/tempest/api/baremetal/base.py
@@ -14,9 +14,12 @@
 
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions as exc
 from tempest import test
 
+CONF = config.CONF
+
 
 def creates(resource):
     """Decorator that adds resources to the appropriate cleanup list."""
@@ -42,7 +45,7 @@
     def setUpClass(cls):
         super(BaseBaremetalTest, cls).setUpClass()
 
-        if not cls.config.service_available.ironic:
+        if not CONF.service_available.ironic:
             skip_msg = ('%s skipped as Ironic is not available' % cls.__name__)
             raise cls.skipException(skip_msg)
 
diff --git a/tempest/api/compute/admin/test_aggregates.py b/tempest/api/compute/admin/test_aggregates.py
index d0331bc..08d8a0d 100644
--- a/tempest/api/compute/admin/test_aggregates.py
+++ b/tempest/api/compute/admin/test_aggregates.py
@@ -109,7 +109,6 @@
     @attr(type='gate')
     def test_aggregate_create_update_with_az(self):
         # Update an aggregate and ensure properties are updated correctly
-        self.useFixture(fixtures.LockFixture('availability_zone'))
         aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
         az_name = data_utils.rand_name(self.az_name_prefix)
         resp, aggregate = self.client.create_aggregate(
diff --git a/tempest/api/compute/admin/test_fixed_ips.py b/tempest/api/compute/admin/test_fixed_ips.py
index 0c36837..cfb2f0e 100644
--- a/tempest/api/compute/admin/test_fixed_ips.py
+++ b/tempest/api/compute/admin/test_fixed_ips.py
@@ -14,8 +14,11 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class FixedIPsTestJson(base.BaseV2ComputeAdminTest):
     _interface = 'json'
@@ -23,7 +26,7 @@
     @classmethod
     def setUpClass(cls):
         super(FixedIPsTestJson, cls).setUpClass()
-        if cls.config.service_available.neutron:
+        if CONF.service_available.neutron:
             msg = ("%s skipped as neutron is available" % cls.__name__)
             raise cls.skipException(msg)
         cls.client = cls.os_adm.fixed_ips_client
diff --git a/tempest/api/compute/admin/test_fixed_ips_negative.py b/tempest/api/compute/admin/test_fixed_ips_negative.py
index bf7fd51..def9810 100644
--- a/tempest/api/compute/admin/test_fixed_ips_negative.py
+++ b/tempest/api/compute/admin/test_fixed_ips_negative.py
@@ -13,9 +13,12 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class FixedIPsNegativeTestJson(base.BaseV2ComputeAdminTest):
     _interface = 'json'
@@ -23,7 +26,7 @@
     @classmethod
     def setUpClass(cls):
         super(FixedIPsNegativeTestJson, cls).setUpClass()
-        if cls.config.service_available.neutron:
+        if CONF.service_available.neutron:
             msg = ("%s skipped as neutron is available" % cls.__name__)
             raise cls.skipException(msg)
         cls.client = cls.os_adm.fixed_ips_client
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index 5539894..f8b0051 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -17,10 +17,12 @@
 
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 import tempest.test
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -37,15 +39,15 @@
         os = cls.get_client_manager()
 
         cls.os = os
-        cls.build_interval = cls.config.compute.build_interval
-        cls.build_timeout = cls.config.compute.build_timeout
-        cls.ssh_user = cls.config.compute.ssh_user
-        cls.image_ref = cls.config.compute.image_ref
-        cls.image_ref_alt = cls.config.compute.image_ref_alt
-        cls.flavor_ref = cls.config.compute.flavor_ref
-        cls.flavor_ref_alt = cls.config.compute.flavor_ref_alt
-        cls.image_ssh_user = cls.config.compute.image_ssh_user
-        cls.image_ssh_password = cls.config.compute.image_ssh_password
+        cls.build_interval = CONF.compute.build_interval
+        cls.build_timeout = CONF.compute.build_timeout
+        cls.ssh_user = CONF.compute.ssh_user
+        cls.image_ref = CONF.compute.image_ref
+        cls.image_ref_alt = CONF.compute.image_ref_alt
+        cls.flavor_ref = CONF.compute.flavor_ref
+        cls.flavor_ref_alt = CONF.compute.flavor_ref_alt
+        cls.image_ssh_user = CONF.compute.image_ssh_user
+        cls.image_ssh_password = CONF.compute.image_ssh_password
         cls.servers = []
         cls.images = []
         cls.multi_user = cls.get_multi_user()
@@ -57,14 +59,14 @@
         # used in testing. If the test cases are allowed to create
         # users (config.compute.allow_tenant_isolation is true,
         # then we allow multi-user.
-        if not cls.config.compute.allow_tenant_isolation:
-            user1 = cls.config.identity.username
-            user2 = cls.config.identity.alt_username
+        if not CONF.compute.allow_tenant_isolation:
+            user1 = CONF.identity.username
+            user2 = CONF.identity.alt_username
             if not user2 or user1 == user2:
                 multi_user = False
             else:
-                user2_password = cls.config.identity.alt_password
-                user2_tenant_name = cls.config.identity.alt_tenant_name
+                user2_password = CONF.identity.alt_password
+                user2_tenant_name = CONF.identity.alt_tenant_name
                 if not user2_password or not user2_tenant_name:
                     msg = ("Alternate user specified but not alternate "
                            "tenant or password: alt_tenant_name=%s "
@@ -227,6 +229,18 @@
         cls.password = server['adminPass']
         return server['id']
 
+    @classmethod
+    def delete_volume(cls, volume_id):
+        """Deletes the given volume and waits for it to be gone."""
+        try:
+            resp, _ = cls.volumes_extensions_client.delete_volume(volume_id)
+            # TODO(mriedem): We should move the wait_for_resource_deletion
+            # into the delete_volume method as a convenience to the caller.
+            cls.volumes_extensions_client.wait_for_resource_deletion(volume_id)
+        except exceptions.NotFound:
+            LOG.warn("Unable to delete volume '%s' since it was not found. "
+                     "Maybe it was already deleted?" % volume_id)
+
 
 class BaseV2ComputeAdminTest(BaseV2ComputeTest):
     """Base test case class for Compute Admin V2 API tests."""
@@ -234,14 +248,14 @@
     @classmethod
     def setUpClass(cls):
         super(BaseV2ComputeAdminTest, cls).setUpClass()
-        admin_username = cls.config.compute_admin.username
-        admin_password = cls.config.compute_admin.password
-        admin_tenant = cls.config.compute_admin.tenant_name
+        admin_username = CONF.compute_admin.username
+        admin_password = CONF.compute_admin.password
+        admin_tenant = CONF.compute_admin.tenant_name
         if not (admin_username and admin_password and admin_tenant):
             msg = ("Missing Compute Admin API credentials "
                    "in configuration.")
             raise cls.skipException(msg)
-        if (cls.config.compute.allow_tenant_isolation or
+        if (CONF.compute.allow_tenant_isolation or
             cls.force_tenant_isolation is True):
             creds = cls.isolated_creds.get_admin_creds()
             admin_username, admin_tenant_name, admin_password = creds
@@ -265,7 +279,7 @@
 
         cls.set_network_resources()
         super(BaseV3ComputeTest, cls).setUpClass()
-        if not cls.config.compute_feature_enabled.api_v3:
+        if not CONF.compute_feature_enabled.api_v3:
             cls.tearDownClass()
             skip_msg = ("%s skipped as nova v3 api is not available" %
                         cls.__name__)
@@ -330,14 +344,14 @@
     @classmethod
     def setUpClass(cls):
         super(BaseV3ComputeAdminTest, cls).setUpClass()
-        admin_username = cls.config.compute_admin.username
-        admin_password = cls.config.compute_admin.password
-        admin_tenant = cls.config.compute_admin.tenant_name
+        admin_username = CONF.compute_admin.username
+        admin_password = CONF.compute_admin.password
+        admin_tenant = CONF.compute_admin.tenant_name
         if not (admin_username and admin_password and admin_tenant):
             msg = ("Missing Compute Admin API credentials "
                    "in configuration.")
             raise cls.skipException(msg)
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_admin_creds()
             admin_username, admin_tenant_name, admin_password = creds
             os_adm = clients.Manager(username=admin_username,
diff --git a/tempest/api/compute/flavors/test_flavors_negative.py b/tempest/api/compute/flavors/test_flavors_negative.py
index 7474996..8ac6182 100644
--- a/tempest/api/compute/flavors/test_flavors_negative.py
+++ b/tempest/api/compute/flavors/test_flavors_negative.py
@@ -13,40 +13,42 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import uuid
+import testscenarios
 
 from tempest.api.compute import base
-from tempest import exceptions
-from tempest.test import attr
+from tempest import test
 
 
-class FlavorsNegativeTestJSON(base.BaseV2ComputeTest):
+load_tests = testscenarios.load_tests_apply_scenarios
+
+
+class FlavorsListNegativeTestJSON(base.BaseV2ComputeTest,
+                                  test.NegativeAutoTest):
     _interface = 'json'
+    _service = 'compute'
+    _schema_file = 'compute/flavors/flavors_list.json'
+
+    scenarios = test.NegativeAutoTest.generate_scenario(_schema_file)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_list_flavors_with_detail(self):
+        self.execute(self._schema_file)
+
+
+class FlavorDetailsNegativeTestJSON(base.BaseV2ComputeTest,
+                                    test.NegativeAutoTest):
+    _interface = 'json'
+    _service = 'compute'
+    _schema_file = 'compute/flavors/flavor_details.json'
+
+    scenarios = test.NegativeAutoTest.generate_scenario(_schema_file)
 
     @classmethod
     def setUpClass(cls):
-        super(FlavorsNegativeTestJSON, cls).setUpClass()
-        cls.client = cls.flavors_client
+        super(FlavorDetailsNegativeTestJSON, cls).setUpClass()
+        cls.set_resource("flavor", cls.flavor_ref)
 
-    @attr(type=['negative', 'gate'])
-    def test_invalid_minRam_filter(self):
-        self.assertRaises(exceptions.BadRequest,
-                          self.client.list_flavors_with_detail,
-                          {'minRam': 'invalid'})
-
-    @attr(type=['negative', 'gate'])
-    def test_invalid_minDisk_filter(self):
-        self.assertRaises(exceptions.BadRequest,
-                          self.client.list_flavors_with_detail,
-                          {'minDisk': 'invalid'})
-
-    @attr(type=['negative', 'gate'])
-    def test_non_existent_flavor_id(self):
+    @test.attr(type=['negative', 'gate'])
+    def test_get_flavor_details(self):
         # flavor details are not returned for non-existent flavors
-        nonexistent_flavor_id = str(uuid.uuid4())
-        self.assertRaises(exceptions.NotFound, self.client.get_flavor_details,
-                          nonexistent_flavor_id)
-
-
-class FlavorsNegativeTestXML(FlavorsNegativeTestJSON):
-    _interface = 'xml'
+        self.execute(self._schema_file)
diff --git a/tempest/api/compute/flavors/test_flavors_negative_xml.py b/tempest/api/compute/flavors/test_flavors_negative_xml.py
new file mode 100644
index 0000000..c93c7c9
--- /dev/null
+++ b/tempest/api/compute/flavors/test_flavors_negative_xml.py
@@ -0,0 +1,48 @@
+# Copyright 2013 OpenStack Foundation
+# 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 uuid
+
+from tempest.api.compute import base
+from tempest import exceptions
+from tempest.test import attr
+
+
+class FlavorsNegativeTestXML(base.BaseV2ComputeTest):
+    _interface = 'xml'
+
+    @classmethod
+    def setUpClass(cls):
+        super(FlavorsNegativeTestXML, cls).setUpClass()
+        cls.client = cls.flavors_client
+
+    @attr(type=['negative', 'gate'])
+    def test_invalid_minRam_filter(self):
+        self.assertRaises(exceptions.BadRequest,
+                          self.client.list_flavors_with_detail,
+                          {'minRam': 'invalid'})
+
+    @attr(type=['negative', 'gate'])
+    def test_invalid_minDisk_filter(self):
+        self.assertRaises(exceptions.BadRequest,
+                          self.client.list_flavors_with_detail,
+                          {'minDisk': 'invalid'})
+
+    @attr(type=['negative', 'gate'])
+    def test_non_existent_flavor_id(self):
+        # flavor details are not returned for non-existent flavors
+        nonexistent_flavor_id = str(uuid.uuid4())
+        self.assertRaises(exceptions.NotFound, self.client.get_flavor_details,
+                          nonexistent_flavor_id)
diff --git a/tempest/api/compute/floating_ips/test_floating_ips_actions.py b/tempest/api/compute/floating_ips/test_floating_ips_actions.py
index 2c89391..56bd291 100644
--- a/tempest/api/compute/floating_ips/test_floating_ips_actions.py
+++ b/tempest/api/compute/floating_ips/test_floating_ips_actions.py
@@ -96,9 +96,7 @@
         # to specific server should change the association of the Floating IP
         # Create server so as to use for Multiple association
         new_name = rand_name('floating_server')
-        resp, body = self.servers_client.create_server(new_name,
-                                                       self.image_ref,
-                                                       self.flavor_ref)
+        resp, body = self.create_test_server(name=new_name)
         self.servers_client.wait_for_server_status(body['id'], 'ACTIVE')
         self.new_server_id = body['id']
 
diff --git a/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py b/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py
index e4d83c5..f24343b 100644
--- a/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py
+++ b/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py
@@ -17,9 +17,12 @@
 
 from tempest.api.compute.floating_ips import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class FloatingIPsNegativeTestJSON(base.BaseFloatingIPsTest):
     _interface = 'json'
@@ -40,7 +43,7 @@
             cls.floating_ip_ids.append(body[i]['id'])
         while True:
             cls.non_exist_id = data_utils.rand_int_id(start=999)
-            if cls.config.service_available.neutron:
+            if CONF.service_available.neutron:
                 cls.non_exist_id = str(uuid.uuid4())
             if cls.non_exist_id not in cls.floating_ip_ids:
                 break
diff --git a/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py b/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py
index bb1c828..8d60e7d 100644
--- a/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py
+++ b/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py
@@ -17,9 +17,12 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class FloatingIPDetailsNegativeTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
@@ -34,7 +37,7 @@
         # Negative test:Should not be able to GET the details
         # of non-existent floating IP
         # Creating a non-existent floatingIP id
-        if self.config.service_available.neutron:
+        if CONF.service_available.neutron:
             non_exist_id = str(uuid.uuid4())
         else:
             non_exist_id = data_utils.rand_int_id(start=999)
diff --git a/tempest/api/compute/images/test_image_metadata.py b/tempest/api/compute/images/test_image_metadata.py
index 89a2f75..4115d65 100644
--- a/tempest/api/compute/images/test_image_metadata.py
+++ b/tempest/api/compute/images/test_image_metadata.py
@@ -15,8 +15,11 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class ImagesMetadataTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
@@ -24,7 +27,7 @@
     @classmethod
     def setUpClass(cls):
         super(ImagesMetadataTestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
diff --git a/tempest/api/compute/images/test_images.py b/tempest/api/compute/images/test_images.py
index fc09741..4cc36c9 100644
--- a/tempest/api/compute/images/test_images.py
+++ b/tempest/api/compute/images/test_images.py
@@ -15,9 +15,12 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class ImagesTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
@@ -25,7 +28,7 @@
     @classmethod
     def setUpClass(cls):
         super(ImagesTestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         cls.client = cls.images_client
@@ -34,7 +37,7 @@
         cls.image_ids = []
 
         if cls.multi_user:
-            if cls.config.compute.allow_tenant_isolation:
+            if CONF.compute.allow_tenant_isolation:
                 creds = cls.isolated_creds.get_alt_creds()
                 username, tenant_name, password = creds
                 cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/images/test_images_oneserver.py b/tempest/api/compute/images/test_images_oneserver.py
index 0cb748b..8d60623 100644
--- a/tempest/api/compute/images/test_images_oneserver.py
+++ b/tempest/api/compute/images/test_images_oneserver.py
@@ -55,7 +55,7 @@
     def setUpClass(cls):
         super(ImagesOneServerTestJSON, cls).setUpClass()
         cls.client = cls.images_client
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
@@ -69,7 +69,7 @@
         cls.image_ids = []
 
         if cls.multi_user:
-            if cls.config.compute.allow_tenant_isolation:
+            if CONF.compute.allow_tenant_isolation:
                 creds = cls.isolated_creds.get_alt_creds()
                 username, tenant_name, password = creds
                 cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/images/test_images_oneserver_negative.py b/tempest/api/compute/images/test_images_oneserver_negative.py
index 3f93fbe..c96c4a4 100644
--- a/tempest/api/compute/images/test_images_oneserver_negative.py
+++ b/tempest/api/compute/images/test_images_oneserver_negative.py
@@ -17,11 +17,14 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 from tempest.test import skip_because
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -57,7 +60,7 @@
     def setUpClass(cls):
         super(ImagesOneServerNegativeTestJSON, cls).setUpClass()
         cls.client = cls.images_client
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
@@ -71,7 +74,7 @@
         cls.image_ids = []
 
         if cls.multi_user:
-            if cls.config.compute.allow_tenant_isolation:
+            if CONF.compute.allow_tenant_isolation:
                 creds = cls.isolated_creds.get_alt_creds()
                 username, tenant_name, password = creds
                 cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/images/test_list_image_filters.py b/tempest/api/compute/images/test_list_image_filters.py
index c04729c..f82143e 100644
--- a/tempest/api/compute/images/test_list_image_filters.py
+++ b/tempest/api/compute/images/test_list_image_filters.py
@@ -14,10 +14,12 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -28,7 +30,7 @@
     @classmethod
     def setUpClass(cls):
         super(ListImageFiltersTestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         cls.client = cls.images_client
diff --git a/tempest/api/compute/images/test_list_images.py b/tempest/api/compute/images/test_list_images.py
index ae1e8d0..ed38442 100644
--- a/tempest/api/compute/images/test_list_images.py
+++ b/tempest/api/compute/images/test_list_images.py
@@ -14,8 +14,11 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class ListImagesTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
@@ -23,7 +26,7 @@
     @classmethod
     def setUpClass(cls):
         super(ListImagesTestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         cls.client = cls.images_client
diff --git a/tempest/api/compute/security_groups/test_security_group_rules.py b/tempest/api/compute/security_groups/test_security_group_rules.py
index 6aa5cb5..375105e 100644
--- a/tempest/api/compute/security_groups/test_security_group_rules.py
+++ b/tempest/api/compute/security_groups/test_security_group_rules.py
@@ -15,8 +15,11 @@
 
 from tempest.api.compute.security_groups import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class SecurityGroupRulesTestJSON(base.BaseSecurityGroupsTest):
     _interface = 'json'
@@ -25,7 +28,7 @@
     def setUpClass(cls):
         super(SecurityGroupRulesTestJSON, cls).setUpClass()
         cls.client = cls.security_groups_client
-        cls.neutron_available = cls.config.service_available.neutron
+        cls.neutron_available = CONF.service_available.neutron
 
     @attr(type='smoke')
     def test_security_group_rules_create(self):
diff --git a/tempest/api/compute/security_groups/test_security_groups.py b/tempest/api/compute/security_groups/test_security_groups.py
index bff6e14..2c67581 100644
--- a/tempest/api/compute/security_groups/test_security_groups.py
+++ b/tempest/api/compute/security_groups/test_security_groups.py
@@ -121,9 +121,7 @@
         # Create server and add the security group created
         # above to the server we just created
         server_name = data_utils.rand_name('server')
-        resp, server = self.servers_client.create_server(server_name,
-                                                         self.image_ref,
-                                                         self.flavor_ref)
+        resp, server = self.create_test_server(name=server_name)
         server_id = server['id']
         self.servers_client.wait_for_server_status(server_id, 'ACTIVE')
         resp, body = self.servers_client.add_security_group(server_id,
diff --git a/tempest/api/compute/security_groups/test_security_groups_negative.py b/tempest/api/compute/security_groups/test_security_groups_negative.py
index 98ed8e8..ce1eada 100644
--- a/tempest/api/compute/security_groups/test_security_groups_negative.py
+++ b/tempest/api/compute/security_groups/test_security_groups_negative.py
@@ -31,7 +31,7 @@
     def setUpClass(cls):
         super(SecurityGroupsNegativeTestJSON, cls).setUpClass()
         cls.client = cls.security_groups_client
-        cls.neutron_available = cls.config.service_available.neutron
+        cls.neutron_available = CONF.service_available.neutron
 
     def _delete_security_group(self, securitygroup_id):
         resp, _ = self.client.delete_security_group(securitygroup_id)
diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py
index 4dacb48..9cdac55 100644
--- a/tempest/api/compute/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/servers/test_attach_interfaces.py
@@ -14,18 +14,21 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
 import time
 
+CONF = config.CONF
+
 
 class AttachInterfacesTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        if not cls.config.service_available.neutron:
+        if not CONF.service_available.neutron:
             raise cls.skipException("Neutron is required")
         # This test class requires network and subnet
         cls.set_network_resources(network=True, subnet=True)
diff --git a/tempest/api/compute/servers/test_list_server_filters.py b/tempest/api/compute/servers/test_list_server_filters.py
index 1dc0a39..15b7b9e 100644
--- a/tempest/api/compute/servers/test_list_server_filters.py
+++ b/tempest/api/compute/servers/test_list_server_filters.py
@@ -71,7 +71,7 @@
                                               flavor=cls.flavor_ref_alt,
                                               wait_until='ACTIVE')
 
-        cls.fixed_network_name = cls.config.compute.fixed_network_name
+        cls.fixed_network_name = CONF.compute.fixed_network_name
 
     @utils.skip_unless_attr('multiple_images', 'Only one image found')
     @attr(type='gate')
@@ -143,6 +143,22 @@
         # when _interface='xml', one element for servers_links in servers
         self.assertEqual(1, len([x for x in servers['servers'] if 'id' in x]))
 
+    @attr(type='gate')
+    def test_list_servers_filter_by_zero_limit(self):
+        # Verify only the expected number of servers are returned
+        params = {'limit': 0}
+        resp, servers = self.client.list_servers(params)
+        self.assertEqual(0, len(servers['servers']))
+
+    @attr(type='gate')
+    def test_list_servers_filter_by_exceed_limit(self):
+        # Verify only the expected number of servers are returned
+        params = {'limit': 100000}
+        resp, servers = self.client.list_servers(params)
+        resp, all_servers = self.client.list_servers()
+        self.assertEqual(len([x for x in all_servers['servers'] if 'id' in x]),
+                         len([x for x in servers['servers'] if 'id' in x]))
+
     @utils.skip_unless_attr('multiple_images', 'Only one image found')
     @attr(type='gate')
     def test_list_servers_detailed_filter_by_image(self):
diff --git a/tempest/api/compute/servers/test_server_actions.py b/tempest/api/compute/servers/test_server_actions.py
index fea8dd5..f113047 100644
--- a/tempest/api/compute/servers/test_server_actions.py
+++ b/tempest/api/compute/servers/test_server_actions.py
@@ -369,7 +369,7 @@
         resp, server = self.client.shelve_server(self.server_id)
         self.assertEqual(202, resp.status)
 
-        offload_time = self.config.compute.shelved_offload_time
+        offload_time = CONF.compute.shelved_offload_time
         if offload_time >= 0:
             self.client.wait_for_server_status(self.server_id,
                                                'SHELVED_OFFLOADED',
diff --git a/tempest/api/compute/servers/test_server_metadata_negative.py b/tempest/api/compute/servers/test_server_metadata_negative.py
index d12f91c..e52ea4a 100644
--- a/tempest/api/compute/servers/test_server_metadata_negative.py
+++ b/tempest/api/compute/servers/test_server_metadata_negative.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright 2012 OpenStack Foundation
 # All Rights Reserved.
 #
diff --git a/tempest/api/compute/servers/test_server_rescue.py b/tempest/api/compute/servers/test_server_rescue.py
index 45fe5ac..20c5d7f 100644
--- a/tempest/api/compute/servers/test_server_rescue.py
+++ b/tempest/api/compute/servers/test_server_rescue.py
@@ -212,6 +212,7 @@
         self.servers_client.rescue_server(
             self.server_id, adminPass=self.password)
         self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
+        self.addCleanup(self._unrescue, self.server_id)
 
         # Add Security group
         resp, body = self.servers_client.add_security_group(self.server_id,
@@ -223,11 +224,6 @@
                                                                self.sg_name)
         self.assertEqual(202, resp.status)
 
-        # Unrescue the server
-        resp, body = self.servers_client.unrescue_server(self.server_id)
-        self.assertEqual(202, resp.status)
-        self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
-
 
 class ServerRescueTestXML(ServerRescueTestJSON):
     _interface = 'xml'
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index 8f49aec..e0181b9 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -19,9 +19,12 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest import test
 
+CONF = config.CONF
+
 
 class ServersNegativeTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
@@ -408,7 +411,7 @@
         self.assertEqual(202, resp.status)
         self.addCleanup(self.client.unshelve_server, self.server_id)
 
-        offload_time = self.config.compute.shelved_offload_time
+        offload_time = CONF.compute.shelved_offload_time
         if offload_time >= 0:
             self.client.wait_for_server_status(self.server_id,
                                                'SHELVED_OFFLOADED',
diff --git a/tempest/api/compute/servers/test_servers_negative_new.py b/tempest/api/compute/servers/test_servers_negative_new.py
new file mode 100644
index 0000000..2b2fcf1
--- /dev/null
+++ b/tempest/api/compute/servers/test_servers_negative_new.py
@@ -0,0 +1,41 @@
+# Copyright 2014 Red Hat, Inc & 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 testscenarios
+
+from tempest.api.compute import base
+from tempest import test
+
+
+load_tests = testscenarios.load_tests_apply_scenarios
+
+
+class GetConsoleOutputNegativeTestJSON(base.BaseV2ComputeTest,
+                                       test.NegativeAutoTest):
+    _interface = 'json'
+    _service = 'compute'
+    _schema_file = 'compute/servers/get_console_output.json'
+
+    scenarios = test.NegativeAutoTest.generate_scenario(_schema_file)
+
+    @classmethod
+    def setUpClass(cls):
+        super(GetConsoleOutputNegativeTestJSON, cls).setUpClass()
+        _resp, server = cls.create_test_server()
+        cls.set_resource("server", server['id'])
+
+    @test.attr(type=['negative', 'gate'])
+    def test_get_console_output(self):
+        self.execute(self._schema_file)
diff --git a/tempest/api/compute/servers/test_virtual_interfaces.py b/tempest/api/compute/servers/test_virtual_interfaces.py
index 32376eb..95703d4 100644
--- a/tempest/api/compute/servers/test_virtual_interfaces.py
+++ b/tempest/api/compute/servers/test_virtual_interfaces.py
@@ -19,12 +19,12 @@
 from tempest import config
 from tempest import test
 
+CONF = config.CONF
+
 
 class VirtualInterfacesTestJSON(base.BaseV2ComputeTest):
     _interface = 'json'
 
-    CONF = config.CONF
-
     @classmethod
     def setUpClass(cls):
         # This test needs a network and a subnet
diff --git a/tempest/api/compute/test_authorization.py b/tempest/api/compute/test_authorization.py
index 13b75cf..4774fec 100644
--- a/tempest/api/compute/test_authorization.py
+++ b/tempest/api/compute/test_authorization.py
@@ -16,10 +16,13 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -39,7 +42,7 @@
         cls.keypairs_client = cls.os.keypairs_client
         cls.security_client = cls.os.security_groups_client
 
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_alt_creds()
             username, tenant_name, password = creds
             cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/test_extensions.py b/tempest/api/compute/test_extensions.py
index aac635c..55146e5 100644
--- a/tempest/api/compute/test_extensions.py
+++ b/tempest/api/compute/test_extensions.py
@@ -15,9 +15,12 @@
 
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest import test
 
+CONF = config.CONF
+
 
 LOG = logging.getLogger(__name__)
 
@@ -28,11 +31,11 @@
     @test.attr(type='gate')
     def test_list_extensions(self):
         # List of all extensions
-        if len(self.config.compute_feature_enabled.api_extensions) == 0:
+        if len(CONF.compute_feature_enabled.api_extensions) == 0:
             raise self.skipException('There are not any extensions configured')
         resp, extensions = self.extensions_client.list_extensions()
         self.assertEqual(200, resp.status)
-        ext = self.config.compute_feature_enabled.api_extensions[0]
+        ext = CONF.compute_feature_enabled.api_extensions[0]
         if ext == 'all':
             self.assertIn('Hosts', map(lambda x: x['name'], extensions))
         elif ext:
diff --git a/tempest/api/compute/test_live_block_migration.py b/tempest/api/compute/test_live_block_migration.py
index 85d314b..fcd055b 100644
--- a/tempest/api/compute/test_live_block_migration.py
+++ b/tempest/api/compute/test_live_block_migration.py
@@ -23,13 +23,13 @@
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class LiveBlockMigrationTestJSON(base.BaseV2ComputeAdminTest):
     _host_key = 'OS-EXT-SRV-ATTR:host'
     _interface = 'json'
 
-    CONF = config.CONF
-
     @classmethod
     def setUpClass(cls):
         super(LiveBlockMigrationTestJSON, cls).setUpClass()
@@ -57,8 +57,7 @@
     def _migrate_server_to(self, server_id, dest_host):
         _resp, body = self.admin_servers_client.live_migrate_server(
             server_id, dest_host,
-            self.config.compute_feature_enabled.
-            block_migration_for_live_migration)
+            CONF.compute_feature_enabled.block_migration_for_live_migration)
         return body
 
     def _get_host_other_than(self, host):
diff --git a/tempest/api/compute/v3/admin/test_aggregates.py b/tempest/api/compute/v3/admin/test_aggregates.py
index 74bf52c..b8b478d 100644
--- a/tempest/api/compute/v3/admin/test_aggregates.py
+++ b/tempest/api/compute/v3/admin/test_aggregates.py
@@ -19,7 +19,7 @@
 from tempest import test
 
 
-class AggregatesAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+class AggregatesAdminV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Aggregates API that require admin privileges
@@ -30,7 +30,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(AggregatesAdminV3TestJSON, cls).setUpClass()
+        super(AggregatesAdminV3Test, cls).setUpClass()
         cls.client = cls.aggregates_admin_client
         cls.user_client = cls.aggregates_client
         cls.aggregate_name_prefix = 'test_aggregate_'
diff --git a/tempest/api/compute/v3/admin/test_aggregates_negative.py b/tempest/api/compute/v3/admin/test_aggregates_negative.py
index e2c4e30..5700460 100644
--- a/tempest/api/compute/v3/admin/test_aggregates_negative.py
+++ b/tempest/api/compute/v3/admin/test_aggregates_negative.py
@@ -20,7 +20,7 @@
 from tempest import test
 
 
-class AggregatesAdminNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class AggregatesAdminNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Aggregates API that require admin privileges
@@ -30,7 +30,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(AggregatesAdminNegativeV3TestJSON, cls).setUpClass()
+        super(AggregatesAdminNegativeV3Test, cls).setUpClass()
         cls.client = cls.aggregates_admin_client
         cls.user_client = cls.aggregates_client
         cls.aggregate_name_prefix = 'test_aggregate_'
diff --git a/tempest/api/compute/v3/admin/test_availability_zone.py b/tempest/api/compute/v3/admin/test_availability_zone.py
index 5ced2b1..57ac869 100644
--- a/tempest/api/compute/v3/admin/test_availability_zone.py
+++ b/tempest/api/compute/v3/admin/test_availability_zone.py
@@ -17,7 +17,7 @@
 from tempest.test import attr
 
 
-class AZAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+class AZAdminV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Availability Zone API List
@@ -27,7 +27,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(AZAdminV3TestJSON, cls).setUpClass()
+        super(AZAdminV3Test, cls).setUpClass()
         cls.client = cls.availability_zone_admin_client
         cls.non_adm_client = cls.availability_zone_client
 
diff --git a/tempest/api/compute/v3/admin/test_availability_zone_negative.py b/tempest/api/compute/v3/admin/test_availability_zone_negative.py
index 60cd1d6..180f298 100644
--- a/tempest/api/compute/v3/admin/test_availability_zone_negative.py
+++ b/tempest/api/compute/v3/admin/test_availability_zone_negative.py
@@ -18,7 +18,7 @@
 from tempest.test import attr
 
 
-class AZAdminNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class AZAdminNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Availability Zone API List
@@ -28,7 +28,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(AZAdminNegativeV3TestJSON, cls).setUpClass()
+        super(AZAdminNegativeV3Test, cls).setUpClass()
         cls.client = cls.availability_zone_admin_client
         cls.non_adm_client = cls.availability_zone_client
 
diff --git a/tempest/api/compute/v3/admin/test_flavors_access.py b/tempest/api/compute/v3/admin/test_flavors_access.py
index d668640..43dc726 100644
--- a/tempest/api/compute/v3/admin/test_flavors_access.py
+++ b/tempest/api/compute/v3/admin/test_flavors_access.py
@@ -18,7 +18,7 @@
 from tempest import test
 
 
-class FlavorsAccessV3TestJSON(base.BaseV3ComputeAdminTest):
+class FlavorsAccessV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Flavor Access API extension.
@@ -29,7 +29,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(FlavorsAccessV3TestJSON, cls).setUpClass()
+        super(FlavorsAccessV3Test, cls).setUpClass()
 
         cls.client = cls.flavors_admin_client
         admin_client = cls._get_identity_admin_client()
@@ -44,6 +44,7 @@
         cls.vcpus = 1
         cls.disk = 10
 
+    @test.skip_because(bug='1265416')
     @test.attr(type='gate')
     def test_flavor_access_list_with_private_flavor(self):
         # Test to list flavor access successfully by querying private flavor
@@ -63,6 +64,7 @@
         self.assertEqual(str(new_flavor_id), str(first_flavor['flavor_id']))
         self.assertEqual(self.adm_tenant_id, first_flavor['tenant_id'])
 
+    @test.skip_because(bug='1265416')
     @test.attr(type='gate')
     def test_flavor_access_add_remove(self):
         # Test to add and remove flavor access to a given tenant.
diff --git a/tempest/api/compute/v3/admin/test_flavors_access_negative.py b/tempest/api/compute/v3/admin/test_flavors_access_negative.py
index 8595b2c..6a2e826 100644
--- a/tempest/api/compute/v3/admin/test_flavors_access_negative.py
+++ b/tempest/api/compute/v3/admin/test_flavors_access_negative.py
@@ -21,7 +21,7 @@
 from tempest import test
 
 
-class FlavorsAccessNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class FlavorsAccessNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Flavor Access API extension.
@@ -32,7 +32,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(FlavorsAccessNegativeV3TestJSON, cls).setUpClass()
+        super(FlavorsAccessNegativeV3Test, cls).setUpClass()
 
         cls.client = cls.flavors_admin_client
         admin_client = cls._get_identity_admin_client()
@@ -63,6 +63,7 @@
                           self.client.list_flavor_access,
                           new_flavor_id)
 
+    @test.skip_because(bug='1265416')
     @test.attr(type=['negative', 'gate'])
     def test_flavor_non_admin_add(self):
         # Test to add flavor access as a user without admin privileges.
@@ -79,6 +80,7 @@
                           new_flavor['id'],
                           self.tenant_id)
 
+    @test.skip_because(bug='1265416')
     @test.attr(type=['negative', 'gate'])
     def test_flavor_non_admin_remove(self):
         # Test to remove flavor access as a user without admin privileges.
@@ -99,6 +101,7 @@
                           new_flavor['id'],
                           self.tenant_id)
 
+    @test.skip_because(bug='1265416')
     @test.attr(type=['negative', 'gate'])
     def test_add_flavor_access_duplicate(self):
         # Create a new flavor.
@@ -123,6 +126,7 @@
                           new_flavor['id'],
                           self.tenant_id)
 
+    @test.skip_because(bug='1265416')
     @test.attr(type=['negative', 'gate'])
     def test_remove_flavor_access_not_found(self):
         # Create a new flavor.
diff --git a/tempest/api/compute/v3/admin/test_flavors_extra_specs.py b/tempest/api/compute/v3/admin/test_flavors_extra_specs.py
index 0363fcb..4d22027 100644
--- a/tempest/api/compute/v3/admin/test_flavors_extra_specs.py
+++ b/tempest/api/compute/v3/admin/test_flavors_extra_specs.py
@@ -18,7 +18,7 @@
 from tempest import test
 
 
-class FlavorsExtraSpecsV3TestJSON(base.BaseV3ComputeAdminTest):
+class FlavorsExtraSpecsV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Flavor Extra Spec API extension.
@@ -30,7 +30,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(FlavorsExtraSpecsV3TestJSON, cls).setUpClass()
+        super(FlavorsExtraSpecsV3Test, cls).setUpClass()
 
         cls.client = cls.flavors_admin_client
         flavor_name = data_utils.rand_name('test_flavor')
@@ -53,7 +53,7 @@
     def tearDownClass(cls):
         resp, body = cls.client.delete_flavor(cls.flavor['id'])
         cls.client.wait_for_resource_deletion(cls.flavor['id'])
-        super(FlavorsExtraSpecsV3TestJSON, cls).tearDownClass()
+        super(FlavorsExtraSpecsV3Test, cls).tearDownClass()
 
     @test.attr(type='gate')
     def test_flavor_set_get_update_show_unset_keys(self):
diff --git a/tempest/api/compute/v3/admin/test_flavors_extra_specs_negative.py b/tempest/api/compute/v3/admin/test_flavors_extra_specs_negative.py
index 0f300a1..98e6e3d 100644
--- a/tempest/api/compute/v3/admin/test_flavors_extra_specs_negative.py
+++ b/tempest/api/compute/v3/admin/test_flavors_extra_specs_negative.py
@@ -20,7 +20,7 @@
 from tempest import test
 
 
-class FlavorsExtraSpecsNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class FlavorsExtraSpecsNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Negative Tests Flavor Extra Spec API extension.
@@ -31,7 +31,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(FlavorsExtraSpecsNegativeV3TestJSON, cls).setUpClass()
+        super(FlavorsExtraSpecsNegativeV3Test, cls).setUpClass()
 
         cls.client = cls.flavors_admin_client
         flavor_name = data_utils.rand_name('test_flavor')
@@ -54,7 +54,7 @@
     def tearDownClass(cls):
         resp, body = cls.client.delete_flavor(cls.flavor['id'])
         cls.client.wait_for_resource_deletion(cls.flavor['id'])
-        super(FlavorsExtraSpecsNegativeV3TestJSON, cls).tearDownClass()
+        super(FlavorsExtraSpecsNegativeV3Test, cls).tearDownClass()
 
     @test.attr(type=['negative', 'gate'])
     def test_flavor_non_admin_set_keys(self):
diff --git a/tempest/api/compute/v3/admin/test_hosts.py b/tempest/api/compute/v3/admin/test_hosts.py
index 8199ee8..2c9369f 100644
--- a/tempest/api/compute/v3/admin/test_hosts.py
+++ b/tempest/api/compute/v3/admin/test_hosts.py
@@ -17,7 +17,7 @@
 from tempest import test
 
 
-class HostsAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+class HostsAdminV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests hosts API using admin privileges.
@@ -27,7 +27,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(HostsAdminV3TestJSON, cls).setUpClass()
+        super(HostsAdminV3Test, cls).setUpClass()
         cls.client = cls.hosts_admin_client
 
     @test.attr(type='gate')
diff --git a/tempest/api/compute/v3/admin/test_hosts_negative.py b/tempest/api/compute/v3/admin/test_hosts_negative.py
index aa50618..ac5d7de 100644
--- a/tempest/api/compute/v3/admin/test_hosts_negative.py
+++ b/tempest/api/compute/v3/admin/test_hosts_negative.py
@@ -18,7 +18,7 @@
 from tempest import test
 
 
-class HostsAdminNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class HostsAdminNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests hosts API using admin privileges.
@@ -28,7 +28,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(HostsAdminNegativeV3TestJSON, cls).setUpClass()
+        super(HostsAdminNegativeV3Test, cls).setUpClass()
         cls.client = cls.hosts_admin_client
         cls.non_admin_client = cls.hosts_client
 
diff --git a/tempest/api/compute/v3/admin/test_hypervisor.py b/tempest/api/compute/v3/admin/test_hypervisor.py
index 8bd4abb..0f96bba 100644
--- a/tempest/api/compute/v3/admin/test_hypervisor.py
+++ b/tempest/api/compute/v3/admin/test_hypervisor.py
@@ -17,7 +17,7 @@
 from tempest.test import attr
 
 
-class HypervisorAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+class HypervisorAdminV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Hypervisors API that require admin privileges
@@ -27,7 +27,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(HypervisorAdminV3TestJSON, cls).setUpClass()
+        super(HypervisorAdminV3Test, cls).setUpClass()
         cls.client = cls.hypervisor_admin_client
 
     def _list_hypervisors(self):
diff --git a/tempest/api/compute/v3/admin/test_hypervisor_negative.py b/tempest/api/compute/v3/admin/test_hypervisor_negative.py
index 63e8cae..aee354a 100644
--- a/tempest/api/compute/v3/admin/test_hypervisor_negative.py
+++ b/tempest/api/compute/v3/admin/test_hypervisor_negative.py
@@ -21,7 +21,7 @@
 from tempest.test import attr
 
 
-class HypervisorAdminNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class HypervisorAdminNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Hypervisors API that require admin privileges
@@ -31,7 +31,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(HypervisorAdminNegativeV3TestJSON, cls).setUpClass()
+        super(HypervisorAdminNegativeV3Test, cls).setUpClass()
         cls.client = cls.hypervisor_admin_client
         cls.non_adm_client = cls.hypervisor_client
 
diff --git a/tempest/api/compute/v3/admin/test_instance_usage_audit_log.py b/tempest/api/compute/v3/admin/test_instance_usage_audit_log.py
index 9651338..a86b7f5 100644
--- a/tempest/api/compute/v3/admin/test_instance_usage_audit_log.py
+++ b/tempest/api/compute/v3/admin/test_instance_usage_audit_log.py
@@ -20,13 +20,13 @@
 from tempest import test
 
 
-class InstanceUsageAuditLogV3TestJSON(base.BaseV3ComputeAdminTest):
+class InstanceUsageAuditLogV3Test(base.BaseV3ComputeAdminTest):
 
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(InstanceUsageAuditLogV3TestJSON, cls).setUpClass()
+        super(InstanceUsageAuditLogV3Test, cls).setUpClass()
         cls.adm_client = cls.instance_usages_audit_log_admin_client
 
     @test.attr(type='gate')
diff --git a/tempest/api/compute/v3/admin/test_instance_usage_audit_log_negative.py b/tempest/api/compute/v3/admin/test_instance_usage_audit_log_negative.py
index 8ed1a98..0438825 100644
--- a/tempest/api/compute/v3/admin/test_instance_usage_audit_log_negative.py
+++ b/tempest/api/compute/v3/admin/test_instance_usage_audit_log_negative.py
@@ -18,13 +18,13 @@
 from tempest import test
 
 
-class InstanceUsageLogNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class InstanceUsageLogNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(InstanceUsageLogNegativeV3TestJSON, cls).setUpClass()
+        super(InstanceUsageLogNegativeV3Test, cls).setUpClass()
         cls.adm_client = cls.instance_usages_audit_log_admin_client
 
     @test.attr(type=['negative', 'gate'])
diff --git a/tempest/api/compute/v3/admin/test_quotas.py b/tempest/api/compute/v3/admin/test_quotas.py
index e116734..ccb9d8e 100644
--- a/tempest/api/compute/v3/admin/test_quotas.py
+++ b/tempest/api/compute/v3/admin/test_quotas.py
@@ -15,18 +15,21 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest import test
 
+CONF = config.CONF
 
-class QuotasAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+
+class QuotasAdminV3Test(base.BaseV3ComputeAdminTest):
     _interface = 'json'
     force_tenant_isolation = True
 
     @classmethod
     def setUpClass(cls):
-        super(QuotasAdminV3TestJSON, cls).setUpClass()
-        cls.auth_url = cls.config.identity.uri
+        super(QuotasAdminV3Test, cls).setUpClass()
+        cls.auth_url = CONF.identity.uri
         cls.client = cls.quotas_client
         cls.adm_client = cls.quotas_admin_client
         cls.identity_admin_client = cls._get_identity_admin_client()
diff --git a/tempest/api/compute/v3/admin/test_servers.py b/tempest/api/compute/v3/admin/test_servers.py
index a8e1a0a..ef9eedc 100644
--- a/tempest/api/compute/v3/admin/test_servers.py
+++ b/tempest/api/compute/v3/admin/test_servers.py
@@ -20,7 +20,7 @@
 from tempest.test import skip_because
 
 
-class ServersAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+class ServersAdminV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Servers API using admin privileges
@@ -30,7 +30,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ServersAdminV3TestJSON, cls).setUpClass()
+        super(ServersAdminV3Test, cls).setUpClass()
         cls.client = cls.servers_admin_client
         cls.non_admin_client = cls.servers_client
         cls.flavors_client = cls.flavors_admin_client
diff --git a/tempest/api/compute/v3/admin/test_servers_negative.py b/tempest/api/compute/v3/admin/test_servers_negative.py
index a86bdfc..a6a5736 100644
--- a/tempest/api/compute/v3/admin/test_servers_negative.py
+++ b/tempest/api/compute/v3/admin/test_servers_negative.py
@@ -20,7 +20,7 @@
 from tempest.test import attr
 
 
-class ServersAdminNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class ServersAdminNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Servers API using admin privileges
@@ -30,7 +30,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ServersAdminNegativeV3TestJSON, cls).setUpClass()
+        super(ServersAdminNegativeV3Test, cls).setUpClass()
         cls.client = cls.servers_admin_client
         cls.non_adm_client = cls.servers_client
         cls.flavors_client = cls.flavors_admin_client
diff --git a/tempest/api/compute/v3/admin/test_services.py b/tempest/api/compute/v3/admin/test_services.py
index 9e55e78..8d6e549 100644
--- a/tempest/api/compute/v3/admin/test_services.py
+++ b/tempest/api/compute/v3/admin/test_services.py
@@ -18,7 +18,7 @@
 from tempest.test import attr
 
 
-class ServicesAdminV3TestJSON(base.BaseV3ComputeAdminTest):
+class ServicesAdminV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Services API. List and Enable/Disable require admin privileges.
@@ -28,7 +28,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ServicesAdminV3TestJSON, cls).setUpClass()
+        super(ServicesAdminV3Test, cls).setUpClass()
         cls.client = cls.services_admin_client
 
     @attr(type='gate')
diff --git a/tempest/api/compute/v3/admin/test_services_negative.py b/tempest/api/compute/v3/admin/test_services_negative.py
index 1382347..c270842 100644
--- a/tempest/api/compute/v3/admin/test_services_negative.py
+++ b/tempest/api/compute/v3/admin/test_services_negative.py
@@ -19,7 +19,7 @@
 from tempest.test import attr
 
 
-class ServicesAdminNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class ServicesAdminNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     """
     Tests Services API. List and Enable/Disable require admin privileges.
@@ -29,7 +29,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ServicesAdminNegativeV3TestJSON, cls).setUpClass()
+        super(ServicesAdminNegativeV3Test, cls).setUpClass()
         cls.client = cls.services_admin_client
         cls.non_admin_client = cls.services_client
 
diff --git a/tempest/api/compute/v3/admin/test_simple_tenant_usage.py b/tempest/api/compute/v3/admin/test_simple_tenant_usage.py
index 7ee835b..e16332f 100644
--- a/tempest/api/compute/v3/admin/test_simple_tenant_usage.py
+++ b/tempest/api/compute/v3/admin/test_simple_tenant_usage.py
@@ -21,13 +21,13 @@
 import time
 
 
-class TenantUsagesV3TestJSON(base.BaseV3ComputeAdminTest):
+class TenantUsagesV3Test(base.BaseV3ComputeAdminTest):
 
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(TenantUsagesV3TestJSON, cls).setUpClass()
+        super(TenantUsagesV3Test, cls).setUpClass()
         cls.adm_client = cls.tenant_usages_admin_client
         cls.client = cls.tenant_usages_client
         cls.identity_client = cls._get_identity_admin_client()
diff --git a/tempest/api/compute/v3/admin/test_simple_tenant_usage_negative.py b/tempest/api/compute/v3/admin/test_simple_tenant_usage_negative.py
index 00068dc..17849c5 100644
--- a/tempest/api/compute/v3/admin/test_simple_tenant_usage_negative.py
+++ b/tempest/api/compute/v3/admin/test_simple_tenant_usage_negative.py
@@ -21,13 +21,13 @@
 from tempest.test import attr
 
 
-class TenantUsagesNegativeV3TestJSON(base.BaseV3ComputeAdminTest):
+class TenantUsagesNegativeV3Test(base.BaseV3ComputeAdminTest):
 
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(TenantUsagesNegativeV3TestJSON, cls).setUpClass()
+        super(TenantUsagesNegativeV3Test, cls).setUpClass()
         cls.adm_client = cls.os_adm.tenant_usages_client
         cls.client = cls.os.tenant_usages_client
         cls.identity_client = cls._get_identity_admin_client()
diff --git a/tempest/api/compute/v3/certificates/test_certificates.py b/tempest/api/compute/v3/certificates/test_certificates.py
index b24f4d8..5c980c0 100644
--- a/tempest/api/compute/v3/certificates/test_certificates.py
+++ b/tempest/api/compute/v3/certificates/test_certificates.py
@@ -17,7 +17,7 @@
 from tempest.test import attr
 
 
-class CertificatesV3TestJSON(base.BaseV3ComputeTest):
+class CertificatesV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @attr(type='gate')
diff --git a/tempest/api/compute/v3/images/test_image_metadata.py b/tempest/api/compute/v3/images/test_image_metadata.py
index d0d2daf..cd4e5e7 100644
--- a/tempest/api/compute/v3/images/test_image_metadata.py
+++ b/tempest/api/compute/v3/images/test_image_metadata.py
@@ -15,16 +15,19 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
 
-class ImagesMetadataTestJSON(base.BaseV2ComputeTest):
+
+class ImagesMetadataTest(base.BaseV2ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ImagesMetadataTestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        super(ImagesMetadataTest, cls).setUpClass()
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
@@ -44,10 +47,10 @@
     @classmethod
     def tearDownClass(cls):
         cls.client.delete_image(cls.image_id)
-        super(ImagesMetadataTestJSON, cls).tearDownClass()
+        super(ImagesMetadataTest, cls).tearDownClass()
 
     def setUp(self):
-        super(ImagesMetadataTestJSON, self).setUp()
+        super(ImagesMetadataTest, self).setUp()
         meta = {'key1': 'value1', 'key2': 'value2'}
         resp, _ = self.client.set_image_metadata(self.image_id, meta)
         self.assertEqual(resp.status, 200)
diff --git a/tempest/api/compute/v3/images/test_image_metadata_negative.py b/tempest/api/compute/v3/images/test_image_metadata_negative.py
index 6e7cc8f..e76af2c 100644
--- a/tempest/api/compute/v3/images/test_image_metadata_negative.py
+++ b/tempest/api/compute/v3/images/test_image_metadata_negative.py
@@ -19,12 +19,12 @@
 from tempest.test import attr
 
 
-class ImagesMetadataTestJSON(base.BaseV2ComputeTest):
+class ImagesMetadataTest(base.BaseV2ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ImagesMetadataTestJSON, cls).setUpClass()
+        super(ImagesMetadataTest, cls).setUpClass()
         cls.client = cls.images_client
 
     @attr(type=['negative', 'gate'])
diff --git a/tempest/api/compute/v3/images/test_images.py b/tempest/api/compute/v3/images/test_images.py
index 52772e0..bbb84fb 100644
--- a/tempest/api/compute/v3/images/test_images.py
+++ b/tempest/api/compute/v3/images/test_images.py
@@ -15,24 +15,27 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
 
-class ImagesV3TestJSON(base.BaseV3ComputeTest):
+
+class ImagesV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ImagesV3TestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        super(ImagesV3Test, cls).setUpClass()
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         cls.client = cls.images_client
         cls.servers_client = cls.servers_client
 
         if cls.multi_user:
-            if cls.config.compute.allow_tenant_isolation:
+            if CONF.compute.allow_tenant_isolation:
                 creds = cls.isolated_creds.get_alt_creds()
                 username, tenant_name, password = creds
                 cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/v3/images/test_images_oneserver.py b/tempest/api/compute/v3/images/test_images_oneserver.py
index fb54942..18772df 100644
--- a/tempest/api/compute/v3/images/test_images_oneserver.py
+++ b/tempest/api/compute/v3/images/test_images_oneserver.py
@@ -26,7 +26,7 @@
 LOG = logging.getLogger(__name__)
 
 
-class ImagesOneServerTestJSON(base.BaseV2ComputeTest):
+class ImagesOneServerTest(base.BaseV2ComputeTest):
     _interface = 'json'
 
     def tearDown(self):
@@ -34,12 +34,12 @@
         for image_id in self.image_ids:
             self.client.delete_image(image_id)
             self.image_ids.remove(image_id)
-        super(ImagesOneServerTestJSON, self).tearDown()
+        super(ImagesOneServerTest, self).tearDown()
 
     def setUp(self):
         # NOTE(afazekas): Normally we use the same server with all test cases,
         # but if it has an issue, we build a new one
-        super(ImagesOneServerTestJSON, self).setUp()
+        super(ImagesOneServerTest, self).setUp()
         # Check if the server is in a clean state after test
         try:
             self.servers_client.wait_for_server_status(self.server_id,
@@ -53,9 +53,9 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ImagesOneServerTestJSON, cls).setUpClass()
+        super(ImagesOneServerTest, cls).setUpClass()
         cls.client = cls.images_client
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
@@ -69,7 +69,7 @@
         cls.image_ids = []
 
         if cls.multi_user:
-            if cls.config.compute.allow_tenant_isolation:
+            if CONF.compute.allow_tenant_isolation:
                 creds = cls.isolated_creds.get_alt_creds()
                 username, tenant_name, password = creds
                 cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/v3/images/test_images_oneserver_negative.py b/tempest/api/compute/v3/images/test_images_oneserver_negative.py
index d9e7882..bc276d1 100644
--- a/tempest/api/compute/v3/images/test_images_oneserver_negative.py
+++ b/tempest/api/compute/v3/images/test_images_oneserver_negative.py
@@ -17,15 +17,18 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 from tempest.test import skip_because
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
-class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
+class ImagesOneServerNegativeTest(base.BaseV2ComputeTest):
     _interface = 'json'
 
     def tearDown(self):
@@ -33,12 +36,12 @@
         for image_id in self.image_ids:
             self.client.delete_image(image_id)
             self.image_ids.remove(image_id)
-        super(ImagesOneServerNegativeTestJSON, self).tearDown()
+        super(ImagesOneServerNegativeTest, self).tearDown()
 
     def setUp(self):
         # NOTE(afazekas): Normally we use the same server with all test cases,
         # but if it has an issue, we build a new one
-        super(ImagesOneServerNegativeTestJSON, self).setUp()
+        super(ImagesOneServerNegativeTest, self).setUp()
         # Check if the server is in a clean state after test
         try:
             self.servers_client.wait_for_server_status(self.server_id,
@@ -55,9 +58,9 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ImagesOneServerNegativeTestJSON, cls).setUpClass()
+        super(ImagesOneServerNegativeTest, cls).setUpClass()
         cls.client = cls.images_client
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
@@ -71,7 +74,7 @@
         cls.image_ids = []
 
         if cls.multi_user:
-            if cls.config.compute.allow_tenant_isolation:
+            if CONF.compute.allow_tenant_isolation:
                 creds = cls.isolated_creds.get_alt_creds()
                 username, tenant_name, password = creds
                 cls.alt_manager = clients.Manager(username=username,
diff --git a/tempest/api/compute/v3/images/test_list_image_filters.py b/tempest/api/compute/v3/images/test_list_image_filters.py
index f654920..457ca53 100644
--- a/tempest/api/compute/v3/images/test_list_image_filters.py
+++ b/tempest/api/compute/v3/images/test_list_image_filters.py
@@ -14,21 +14,23 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
 
-class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
+class ListImageFiltersTest(base.BaseV2ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ListImageFiltersTestJSON, cls).setUpClass()
-        if not cls.config.service_available.glance:
+        super(ListImageFiltersTest, cls).setUpClass()
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         cls.client = cls.images_client
diff --git a/tempest/api/compute/v3/keypairs/test_keypairs.py b/tempest/api/compute/v3/keypairs/test_keypairs.py
index 4aef8b1..8eef811 100644
--- a/tempest/api/compute/v3/keypairs/test_keypairs.py
+++ b/tempest/api/compute/v3/keypairs/test_keypairs.py
@@ -18,12 +18,12 @@
 from tempest import test
 
 
-class KeyPairsV3TestJSON(base.BaseV3ComputeTest):
+class KeyPairsV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(KeyPairsV3TestJSON, cls).setUpClass()
+        super(KeyPairsV3Test, cls).setUpClass()
         cls.client = cls.keypairs_client
 
     def _delete_keypair(self, keypair_name):
diff --git a/tempest/api/compute/v3/keypairs/test_keypairs_negative.py b/tempest/api/compute/v3/keypairs/test_keypairs_negative.py
index 87f62b7..ae22ccc 100644
--- a/tempest/api/compute/v3/keypairs/test_keypairs_negative.py
+++ b/tempest/api/compute/v3/keypairs/test_keypairs_negative.py
@@ -20,12 +20,12 @@
 from tempest import test
 
 
-class KeyPairsNegativeV3TestJSON(base.BaseV3ComputeTest):
+class KeyPairsNegativeV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(KeyPairsNegativeV3TestJSON, cls).setUpClass()
+        super(KeyPairsNegativeV3Test, cls).setUpClass()
         cls.client = cls.keypairs_client
 
     def _create_keypair(self, keypair_name, pub_key=None):
diff --git a/tempest/api/compute/v3/servers/test_attach_interfaces.py b/tempest/api/compute/v3/servers/test_attach_interfaces.py
index aa85424..272cb53 100644
--- a/tempest/api/compute/v3/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/v3/servers/test_attach_interfaces.py
@@ -14,22 +14,25 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
 import time
 
+CONF = config.CONF
 
-class AttachInterfacesV3TestJSON(base.BaseV3ComputeTest):
+
+class AttachInterfacesV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        if not cls.config.service_available.neutron:
+        if not CONF.service_available.neutron:
             raise cls.skipException("Neutron is required")
         # This test class requires network and subnet
         cls.set_network_resources(network=True, subnet=True)
-        super(AttachInterfacesV3TestJSON, cls).setUpClass()
+        super(AttachInterfacesV3Test, cls).setUpClass()
         cls.client = cls.interfaces_client
 
     def _check_interface(self, iface, port_id=None, network_id=None,
diff --git a/tempest/api/compute/v3/servers/test_attach_volume.py b/tempest/api/compute/v3/servers/test_attach_volume.py
index 2529af9..d693be5 100644
--- a/tempest/api/compute/v3/servers/test_attach_volume.py
+++ b/tempest/api/compute/v3/servers/test_attach_volume.py
@@ -23,21 +23,21 @@
 CONF = config.CONF
 
 
-class AttachVolumeV3TestJSON(base.BaseV3ComputeTest):
+class AttachVolumeV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
     run_ssh = CONF.compute.run_ssh
 
     def __init__(self, *args, **kwargs):
-        super(AttachVolumeV3TestJSON, self).__init__(*args, **kwargs)
+        super(AttachVolumeV3Test, self).__init__(*args, **kwargs)
         self.server = None
         self.volume = None
         self.attached = False
 
     @classmethod
     def setUpClass(cls):
-        super(AttachVolumeV3TestJSON, cls).setUpClass()
-        cls.device = cls.config.compute.volume_device_name
-        if not cls.config.service_available.cinder:
+        super(AttachVolumeV3Test, cls).setUpClass()
+        cls.device = CONF.compute.volume_device_name
+        if not CONF.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
diff --git a/tempest/api/compute/v3/servers/test_create_server.py b/tempest/api/compute/v3/servers/test_create_server.py
index cb02894..7a4c877 100644
--- a/tempest/api/compute/v3/servers/test_create_server.py
+++ b/tempest/api/compute/v3/servers/test_create_server.py
@@ -27,14 +27,14 @@
 CONF = config.CONF
 
 
-class ServersV3TestJSON(base.BaseV3ComputeTest):
+class ServersV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
     run_ssh = CONF.compute.run_ssh
     disk_config = 'AUTO'
 
     @classmethod
     def setUpClass(cls):
-        super(ServersV3TestJSON, cls).setUpClass()
+        super(ServersV3Test, cls).setUpClass()
         cls.meta = {'hello': 'world'}
         cls.accessIPv4 = '1.1.1.1'
         cls.accessIPv6 = '0000:0000:0000:0000:0000:babe:220.12.22.2'
@@ -115,14 +115,14 @@
         self.assertTrue(linux_client.hostname_equals_servername(self.name))
 
 
-class ServersWithSpecificFlavorV3TestJSON(base.BaseV3ComputeAdminTest):
+class ServersWithSpecificFlavorV3Test(base.BaseV3ComputeAdminTest):
     _interface = 'json'
     run_ssh = CONF.compute.run_ssh
     disk_config = 'AUTO'
 
     @classmethod
     def setUpClass(cls):
-        super(ServersWithSpecificFlavorV3TestJSON, cls).setUpClass()
+        super(ServersWithSpecificFlavorV3Test, cls).setUpClass()
         cls.meta = {'hello': 'world'}
         cls.accessIPv4 = '1.1.1.1'
         cls.accessIPv6 = '0000:0000:0000:0000:0000:babe:220.12.22.2'
@@ -213,7 +213,7 @@
         self.assertEqual(partition_num + 1, linux_client.get_partitions())
 
 
-class ServersV3TestManualDisk(ServersV3TestJSON):
+class ServersV3TestManualDisk(ServersV3Test):
     disk_config = 'MANUAL'
 
     @classmethod
diff --git a/tempest/api/compute/v3/servers/test_instance_actions.py b/tempest/api/compute/v3/servers/test_instance_actions.py
index dd5dd30..d536871 100644
--- a/tempest/api/compute/v3/servers/test_instance_actions.py
+++ b/tempest/api/compute/v3/servers/test_instance_actions.py
@@ -18,12 +18,12 @@
 from tempest.test import attr
 
 
-class InstanceActionsV3TestJSON(base.BaseV3ComputeTest):
+class InstanceActionsV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(InstanceActionsV3TestJSON, cls).setUpClass()
+        super(InstanceActionsV3Test, cls).setUpClass()
         cls.client = cls.servers_client
         resp, server = cls.create_test_server(wait_until='ACTIVE')
         cls.request_id = resp['x-compute-request-id']
diff --git a/tempest/api/compute/v3/servers/test_list_server_filters.py b/tempest/api/compute/v3/servers/test_list_server_filters.py
index 8698d97..9082eda 100644
--- a/tempest/api/compute/v3/servers/test_list_server_filters.py
+++ b/tempest/api/compute/v3/servers/test_list_server_filters.py
@@ -24,12 +24,12 @@
 CONF = config.CONF
 
 
-class ListServerFiltersV3TestJSON(base.BaseV3ComputeTest):
+class ListServerFiltersV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ListServerFiltersV3TestJSON, cls).setUpClass()
+        super(ListServerFiltersV3Test, cls).setUpClass()
         cls.client = cls.servers_client
 
         # Check to see if the alternate image ref actually exists...
@@ -71,7 +71,7 @@
                                               flavor=cls.flavor_ref_alt,
                                               wait_until='ACTIVE')
 
-        cls.fixed_network_name = cls.config.compute.fixed_network_name
+        cls.fixed_network_name = CONF.compute.fixed_network_name
 
     @utils.skip_unless_attr('multiple_images', 'Only one image found')
     @attr(type='gate')
@@ -125,6 +125,22 @@
         resp, servers = self.client.list_servers(params)
         self.assertEqual(1, len([x for x in servers['servers'] if 'id' in x]))
 
+    @attr(type='gate')
+    def test_list_servers_filter_by_zero_limit(self):
+        # Verify only the expected number of servers are returned
+        params = {'limit': 0}
+        resp, servers = self.client.list_servers(params)
+        self.assertEqual(0, len(servers['servers']))
+
+    @attr(type='gate')
+    def test_list_servers_filter_by_exceed_limit(self):
+        # Verify only the expected number of servers are returned
+        params = {'limit': 100000}
+        resp, servers = self.client.list_servers(params)
+        resp, all_servers = self.client.list_servers()
+        self.assertEqual(len([x for x in all_servers['servers'] if 'id' in x]),
+                         len([x for x in servers['servers'] if 'id' in x]))
+
     @utils.skip_unless_attr('multiple_images', 'Only one image found')
     @attr(type='gate')
     def test_list_servers_detailed_filter_by_image(self):
diff --git a/tempest/api/compute/v3/servers/test_list_servers_negative.py b/tempest/api/compute/v3/servers/test_list_servers_negative.py
index 23f2bda..09e1bb6 100644
--- a/tempest/api/compute/v3/servers/test_list_servers_negative.py
+++ b/tempest/api/compute/v3/servers/test_list_servers_negative.py
@@ -20,13 +20,13 @@
 from tempest.test import attr
 
 
-class ListServersNegativeV3TestJSON(base.BaseV3ComputeTest):
+class ListServersNegativeV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
     force_tenant_isolation = True
 
     @classmethod
     def setUpClass(cls):
-        super(ListServersNegativeV3TestJSON, cls).setUpClass()
+        super(ListServersNegativeV3Test, cls).setUpClass()
         cls.client = cls.servers_client
 
         # The following servers are created for use
diff --git a/tempest/api/compute/v3/servers/test_multiple_create.py b/tempest/api/compute/v3/servers/test_multiple_create.py
index 429a8ba..f1ae5f8 100644
--- a/tempest/api/compute/v3/servers/test_multiple_create.py
+++ b/tempest/api/compute/v3/servers/test_multiple_create.py
@@ -19,7 +19,7 @@
 from tempest import test
 
 
-class MultipleCreateV3TestJSON(base.BaseV3ComputeTest):
+class MultipleCreateV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
     _name = 'multiple-create-test'
 
diff --git a/tempest/api/compute/v3/servers/test_server_actions.py b/tempest/api/compute/v3/servers/test_server_actions.py
index fdf23f8..0dae796 100644
--- a/tempest/api/compute/v3/servers/test_server_actions.py
+++ b/tempest/api/compute/v3/servers/test_server_actions.py
@@ -28,7 +28,7 @@
 CONF = config.CONF
 
 
-class ServerActionsV3TestJSON(base.BaseV3ComputeTest):
+class ServerActionsV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
     resize_available = CONF.compute_feature_enabled.resize
     run_ssh = CONF.compute.run_ssh
@@ -36,7 +36,7 @@
     def setUp(self):
         # NOTE(afazekas): Normally we use the same server with all test cases,
         # but if it has an issue, we build a new one
-        super(ServerActionsV3TestJSON, self).setUp()
+        super(ServerActionsV3Test, self).setUp()
         # Check if the server is in a clean state after test
         try:
             self.client.wait_for_server_status(self.server_id, 'ACTIVE')
@@ -46,7 +46,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ServerActionsV3TestJSON, cls).setUpClass()
+        super(ServerActionsV3Test, cls).setUpClass()
         cls.client = cls.servers_client
         cls.server_id = cls.rebuild_server(None)
 
@@ -359,7 +359,7 @@
         resp, server = self.client.shelve_server(self.server_id)
         self.assertEqual(202, resp.status)
 
-        offload_time = self.config.compute.shelved_offload_time
+        offload_time = CONF.compute.shelved_offload_time
         if offload_time >= 0:
             self.client.wait_for_server_status(self.server_id,
                                                'SHELVED_OFFLOADED',
diff --git a/tempest/api/compute/v3/servers/test_server_metadata.py b/tempest/api/compute/v3/servers/test_server_metadata.py
index 1758b0b..13c82dd 100644
--- a/tempest/api/compute/v3/servers/test_server_metadata.py
+++ b/tempest/api/compute/v3/servers/test_server_metadata.py
@@ -14,16 +14,15 @@
 #    under the License.
 
 from tempest.api.compute import base
-from tempest import exceptions
-from tempest.test import attr
+from tempest import test
 
 
-class ServerMetadataV3TestJSON(base.BaseV3ComputeTest):
+class ServerMetadataV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ServerMetadataV3TestJSON, cls).setUpClass()
+        super(ServerMetadataV3Test, cls).setUpClass()
         cls.client = cls.servers_client
         cls.quotas = cls.quotas_client
         cls.admin_client = cls._get_identity_admin_client()
@@ -35,12 +34,12 @@
         cls.server_id = server['id']
 
     def setUp(self):
-        super(ServerMetadataV3TestJSON, self).setUp()
+        super(ServerMetadataV3Test, self).setUp()
         meta = {'key1': 'value1', 'key2': 'value2'}
         resp, _ = self.client.set_server_metadata(self.server_id, meta)
         self.assertEqual(resp.status, 200)
 
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_list_server_metadata(self):
         # All metadata key/value pairs for a server should be returned
         resp, resp_metadata = self.client.list_server_metadata(self.server_id)
@@ -50,7 +49,7 @@
         expected = {'key1': 'value1', 'key2': 'value2'}
         self.assertEqual(expected, resp_metadata)
 
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_set_server_metadata(self):
         # The server's metadata should be replaced with the provided values
         # Create a new set of metadata for the server
@@ -64,22 +63,7 @@
         resp, resp_metadata = self.client.list_server_metadata(self.server_id)
         self.assertEqual(resp_metadata, req_metadata)
 
-    @attr(type='gate')
-    def test_server_create_metadata_key_too_long(self):
-        # Attempt to start a server with a meta-data key that is > 255
-        # characters
-
-        # Try a few values
-        for sz in [256, 257, 511, 1023]:
-            key = "k" * sz
-            meta = {key: 'data1'}
-            self.assertRaises(exceptions.OverLimit,
-                              self.create_test_server,
-                              meta=meta)
-
-        # no teardown - all creates should fail
-
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_update_server_metadata(self):
         # The server's metadata values should be updated to the
         # provided values
@@ -93,7 +77,7 @@
         expected = {'key1': 'alt1', 'key2': 'value2', 'key3': 'value3'}
         self.assertEqual(expected, resp_metadata)
 
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_update_metadata_empty_body(self):
         # The original metadata should not be lost if empty metadata body is
         # passed
@@ -103,14 +87,14 @@
         expected = {'key1': 'value1', 'key2': 'value2'}
         self.assertEqual(expected, resp_metadata)
 
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_get_server_metadata_item(self):
         # The value for a specific metadata key should be returned
         resp, meta = self.client.get_server_metadata_item(self.server_id,
                                                           'key2')
         self.assertEqual('value2', meta['key2'])
 
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_set_server_metadata_item(self):
         # The item's value should be updated to the provided value
         # Update the metadata value
@@ -124,7 +108,7 @@
         expected = {'key1': 'value1', 'key2': 'value2', 'nova': 'alt'}
         self.assertEqual(expected, resp_metadata)
 
-    @attr(type='gate')
+    @test.attr(type='gate')
     def test_delete_server_metadata_item(self):
         # The metadata value/key pair should be deleted from the server
         resp, meta = self.client.delete_server_metadata_item(self.server_id,
@@ -135,77 +119,3 @@
         resp, resp_metadata = self.client.list_server_metadata(self.server_id)
         expected = {'key2': 'value2'}
         self.assertEqual(expected, resp_metadata)
-
-    @attr(type=['negative', 'gate'])
-    def test_server_metadata_negative(self):
-        # Blank key should trigger an error.
-        meta = {'': 'data1'}
-        self.assertRaises(exceptions.BadRequest,
-                          self.create_test_server,
-                          meta=meta)
-
-        # GET on a non-existent server should not succeed
-        self.assertRaises(exceptions.NotFound,
-                          self.client.get_server_metadata_item, 999, 'test2')
-
-        # List metadata on a non-existent server should not succeed
-        self.assertRaises(exceptions.NotFound,
-                          self.client.list_server_metadata, 999)
-
-        # Raise BadRequest if key in uri does not match
-        # the key passed in body.
-        meta = {'testkey': 'testvalue'}
-        self.assertRaises(exceptions.BadRequest,
-                          self.client.set_server_metadata_item,
-                          self.server_id, 'key', meta)
-
-        # Set metadata on a non-existent server should not succeed
-        meta = {'meta1': 'data1'}
-        self.assertRaises(exceptions.NotFound,
-                          self.client.set_server_metadata, 999, meta)
-
-        # An update should not happen for a non-existent image
-        meta = {'key1': 'value1', 'key2': 'value2'}
-        self.assertRaises(exceptions.NotFound,
-                          self.client.update_server_metadata, 999, meta)
-
-        # Blank key should trigger an error
-        meta = {'': 'data1'}
-        self.assertRaises(exceptions.BadRequest,
-                          self.client.update_server_metadata,
-                          self.server_id, meta=meta)
-
-        # Should not be able to delete metadata item from a non-existent server
-        self.assertRaises(exceptions.NotFound,
-                          self.client.delete_server_metadata_item, 999, 'd')
-
-        # Raise a 413 OverLimit exception while exceeding metadata items limit
-        # for tenant.
-        _, quota_set = self.quotas.get_quota_set(self.tenant_id)
-        quota_metadata = quota_set['metadata_items']
-        req_metadata = {}
-        for num in range(1, quota_metadata + 2):
-            req_metadata['key' + str(num)] = 'val' + str(num)
-        self.assertRaises(exceptions.OverLimit,
-                          self.client.set_server_metadata,
-                          self.server_id, req_metadata)
-
-        # Raise a 413 OverLimit exception while exceeding metadata items limit
-        # for tenant (update).
-        self.assertRaises(exceptions.OverLimit,
-                          self.client.update_server_metadata,
-                          self.server_id, req_metadata)
-
-        # Raise a bad request error for blank key.
-        # set_server_metadata will replace all metadata with new value
-        meta = {'': 'data1'}
-        self.assertRaises(exceptions.BadRequest,
-                          self.client.set_server_metadata,
-                          self.server_id, meta=meta)
-
-        # Raise a bad request error for a missing metadata field
-        # set_server_metadata will replace all metadata with new value
-        meta = {'meta1': 'data1'}
-        self.assertRaises(exceptions.BadRequest,
-                          self.client.set_server_metadata,
-                          self.server_id, meta=meta, no_metadata_field=True)
diff --git a/tempest/api/compute/v3/servers/test_server_metadata_negative.py b/tempest/api/compute/v3/servers/test_server_metadata_negative.py
new file mode 100644
index 0000000..2c413db
--- /dev/null
+++ b/tempest/api/compute/v3/servers/test_server_metadata_negative.py
@@ -0,0 +1,158 @@
+# Copyright 2014 NEC Corporation.  All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.api.compute import base
+from tempest.common.utils import data_utils
+from tempest import exceptions
+from tempest import test
+
+
+class ServerMetadataV3NegativeTest(base.BaseV3ComputeTest):
+    _interface = 'json'
+
+    @classmethod
+    def setUpClass(cls):
+        super(ServerMetadataV3NegativeTest, cls).setUpClass()
+        cls.client = cls.servers_client
+        cls.quotas = cls.quotas_client
+        cls.admin_client = cls._get_identity_admin_client()
+        resp, tenants = cls.admin_client.list_tenants()
+        cls.tenant_id = [tnt['id'] for tnt in tenants if tnt['name'] ==
+                         cls.client.tenant_name][0]
+        resp, server = cls.create_test_server(meta={}, wait_until='ACTIVE')
+
+        cls.server_id = server['id']
+
+    @test.attr(type=['gate', 'negative'])
+    def test_server_create_metadata_key_too_long(self):
+        # Attempt to start a server with a meta-data key that is > 255
+        # characters
+
+        # Tryset_server_metadata_item a few values
+        for sz in [256, 257, 511, 1023]:
+            key = "k" * sz
+            meta = {key: 'data1'}
+            self.assertRaises(exceptions.OverLimit,
+                              self.create_test_server,
+                              meta=meta)
+
+        # no teardown - all creates should fail
+
+    @test.attr(type=['negative', 'gate'])
+    def test_create_server_metadata_blank_key(self):
+        # Blank key should trigger an error.
+        meta = {'': 'data1'}
+        self.assertRaises(exceptions.BadRequest,
+                          self.create_test_server,
+                          meta=meta)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_server_metadata_non_existent_server(self):
+        # GET on a non-existent server should not succeed
+        non_existent_server_id = data_utils.rand_uuid()
+        self.assertRaises(exceptions.NotFound,
+                          self.client.get_server_metadata_item,
+                          non_existent_server_id,
+                          'test2')
+
+    @test.attr(type=['negative', 'gate'])
+    def test_list_server_metadata_non_existent_server(self):
+        # List metadata on a non-existent server should not succeed
+        non_existent_server_id = data_utils.rand_uuid()
+        self.assertRaises(exceptions.NotFound,
+                          self.client.list_server_metadata,
+                          non_existent_server_id)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_wrong_key_passed_in_body(self):
+        # Raise BadRequest if key in uri does not match
+        # the key passed in body.
+        meta = {'testkey': 'testvalue'}
+        self.assertRaises(exceptions.BadRequest,
+                          self.client.set_server_metadata_item,
+                          self.server_id, 'key', meta)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_set_metadata_non_existent_server(self):
+        # Set metadata on a non-existent server should not succeed
+        non_existent_server_id = data_utils.rand_uuid()
+        meta = {'meta1': 'data1'}
+        self.assertRaises(exceptions.NotFound,
+                          self.client.set_server_metadata,
+                          non_existent_server_id,
+                          meta)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_update_metadata_non_existent_server(self):
+        # An update should not happen for a non-existent server
+        non_existent_server_id = data_utils.rand_uuid()
+        meta = {'key1': 'value1', 'key2': 'value2'}
+        self.assertRaises(exceptions.NotFound,
+                          self.client.update_server_metadata,
+                          non_existent_server_id,
+                          meta)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_update_metadata_with_blank_key(self):
+        # Blank key should trigger an error
+        meta = {'': 'data1'}
+        self.assertRaises(exceptions.BadRequest,
+                          self.client.update_server_metadata,
+                          self.server_id, meta=meta)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_delete_metadata_non_existent_server(self):
+        # Should not be able to delete metadata item from a non-existent server
+        non_existent_server_id = data_utils.rand_uuid()
+        self.assertRaises(exceptions.NotFound,
+                          self.client.delete_server_metadata_item,
+                          non_existent_server_id,
+                          'd')
+
+    @test.attr(type=['negative', 'gate'])
+    def test_metadata_items_limit(self):
+        # Raise a 413 OverLimit exception while exceeding metadata items limit
+        # for tenant.
+        _, quota_set = self.quotas.get_quota_set(self.tenant_id)
+        quota_metadata = quota_set['metadata_items']
+        req_metadata = {}
+        for num in range(1, quota_metadata + 2):
+            req_metadata['key' + str(num)] = 'val' + str(num)
+        self.assertRaises(exceptions.OverLimit,
+                          self.client.set_server_metadata,
+                          self.server_id, req_metadata)
+
+        # Raise a 413 OverLimit exception while exceeding metadata items limit
+        # for tenant (update).
+        self.assertRaises(exceptions.OverLimit,
+                          self.client.update_server_metadata,
+                          self.server_id, req_metadata)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_set_server_metadata_blank_key(self):
+        # Raise a bad request error for blank key.
+        # set_server_metadata will replace all metadata with new value
+        meta = {'': 'data1'}
+        self.assertRaises(exceptions.BadRequest,
+                          self.client.set_server_metadata,
+                          self.server_id, meta=meta)
+
+    @test.attr(type=['negative', 'gate'])
+    def test_set_server_metadata_missing_metadata(self):
+        # Raise a bad request error for a missing metadata field
+        # set_server_metadata will replace all metadata with new value
+        meta = {'meta1': 'data1'}
+        self.assertRaises(exceptions.BadRequest,
+                          self.client.set_server_metadata,
+                          self.server_id, meta=meta, no_metadata_field=True)
diff --git a/tempest/api/compute/v3/servers/test_server_rescue.py b/tempest/api/compute/v3/servers/test_server_rescue.py
index 99e8f68..f8be1c1 100644
--- a/tempest/api/compute/v3/servers/test_server_rescue.py
+++ b/tempest/api/compute/v3/servers/test_server_rescue.py
@@ -18,12 +18,12 @@
 from tempest.test import attr
 
 
-class ServerRescueV3TestJSON(base.BaseV3ComputeTest):
+class ServerRescueV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ServerRescueV3TestJSON, cls).setUpClass()
+        super(ServerRescueV3Test, cls).setUpClass()
         cls.device = 'vdf'
 
         # Create a volume and wait for it to become ready for attach
@@ -58,17 +58,17 @@
         cls.servers_client.wait_for_server_status(cls.rescue_id, 'RESCUE')
 
     def setUp(self):
-        super(ServerRescueV3TestJSON, self).setUp()
+        super(ServerRescueV3Test, self).setUp()
 
     @classmethod
     def tearDownClass(cls):
         client = cls.volumes_client
         client.delete_volume(str(cls.volume_to_attach['id']).strip())
         client.delete_volume(str(cls.volume_to_detach['id']).strip())
-        super(ServerRescueV3TestJSON, cls).tearDownClass()
+        super(ServerRescueV3Test, cls).tearDownClass()
 
     def tearDown(self):
-        super(ServerRescueV3TestJSON, self).tearDown()
+        super(ServerRescueV3Test, self).tearDown()
 
     def _detach(self, server_id, volume_id):
         self.servers_client.detach_volume(server_id, volume_id)
diff --git a/tempest/api/compute/v3/servers/test_servers.py b/tempest/api/compute/v3/servers/test_servers.py
index c476b78..dc64c40 100644
--- a/tempest/api/compute/v3/servers/test_servers.py
+++ b/tempest/api/compute/v3/servers/test_servers.py
@@ -18,17 +18,17 @@
 from tempest import test
 
 
-class ServersV3TestJSON(base.BaseV3ComputeTest):
+class ServersV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(ServersV3TestJSON, cls).setUpClass()
+        super(ServersV3Test, cls).setUpClass()
         cls.client = cls.servers_client
 
     def tearDown(self):
         self.clear_servers()
-        super(ServersV3TestJSON, self).tearDown()
+        super(ServersV3Test, self).tearDown()
 
     @test.attr(type='gate')
     def test_create_server_with_admin_password(self):
diff --git a/tempest/api/compute/v3/servers/test_servers_negative.py b/tempest/api/compute/v3/servers/test_servers_negative.py
index aadba77..c153699 100644
--- a/tempest/api/compute/v3/servers/test_servers_negative.py
+++ b/tempest/api/compute/v3/servers/test_servers_negative.py
@@ -19,15 +19,18 @@
 from tempest.api.compute import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest import test
 
+CONF = config.CONF
 
-class ServersNegativeV3TestJSON(base.BaseV3ComputeTest):
+
+class ServersNegativeV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     def setUp(self):
-        super(ServersNegativeV3TestJSON, self).setUp()
+        super(ServersNegativeV3Test, self).setUp()
         try:
             self.client.wait_for_server_status(self.server_id, 'ACTIVE')
         except Exception:
@@ -35,7 +38,7 @@
 
     @classmethod
     def setUpClass(cls):
-        super(ServersNegativeV3TestJSON, cls).setUpClass()
+        super(ServersNegativeV3Test, cls).setUpClass()
         cls.client = cls.servers_client
         cls.alt_os = clients.AltManager()
         cls.alt_client = cls.alt_os.servers_v3_client
@@ -393,7 +396,7 @@
         self.assertEqual(202, resp.status)
         self.addCleanup(self.client.unshelve_server, self.server_id)
 
-        offload_time = self.config.compute.shelved_offload_time
+        offload_time = CONF.compute.shelved_offload_time
         if offload_time >= 0:
             self.client.wait_for_server_status(self.server_id,
                                                'SHELVED_OFFLOADED',
diff --git a/tempest/api/compute/v3/test_extensions.py b/tempest/api/compute/v3/test_extensions.py
index 32f62d5..09f5ab4 100644
--- a/tempest/api/compute/v3/test_extensions.py
+++ b/tempest/api/compute/v3/test_extensions.py
@@ -15,24 +15,26 @@
 
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest import test
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
 
-class ExtensionsV3TestJSON(base.BaseV3ComputeTest):
+class ExtensionsV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @test.attr(type='gate')
     def test_list_extensions(self):
         # List of all extensions
-        if len(self.config.compute_feature_enabled.api_v3_extensions) == 0:
+        if len(CONF.compute_feature_enabled.api_v3_extensions) == 0:
             raise self.skipException('There are not any extensions configured')
         resp, extensions = self.extensions_client.list_extensions()
         self.assertEqual(200, resp.status)
-        ext = self.config.compute_feature_enabled.api_v3_extensions[0]
+        ext = CONF.compute_feature_enabled.api_v3_extensions[0]
         if ext == 'all':
             self.assertIn('Hosts', map(lambda x: x['name'], extensions))
         elif ext:
diff --git a/tempest/api/compute/v3/test_live_block_migration.py b/tempest/api/compute/v3/test_live_block_migration.py
index 087bffb..144cadb 100644
--- a/tempest/api/compute/v3/test_live_block_migration.py
+++ b/tempest/api/compute/v3/test_live_block_migration.py
@@ -23,16 +23,16 @@
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
 
-class LiveBlockMigrationV3TestJSON(base.BaseV3ComputeAdminTest):
+
+class LiveBlockMigrationV3Test(base.BaseV3ComputeAdminTest):
     _host_key = 'os-extended-server-attributes:host'
     _interface = 'json'
 
-    CONF = config.CONF
-
     @classmethod
     def setUpClass(cls):
-        super(LiveBlockMigrationV3TestJSON, cls).setUpClass()
+        super(LiveBlockMigrationV3Test, cls).setUpClass()
 
         cls.admin_hosts_client = cls.hosts_admin_client
         cls.admin_servers_client = cls.servers_admin_client
@@ -57,7 +57,7 @@
     def _migrate_server_to(self, server_id, dest_host):
         _resp, body = self.admin_servers_client.live_migrate_server(
             server_id, dest_host,
-            self.config.compute_feature_enabled.
+            CONF.compute_feature_enabled.
             block_migration_for_live_migration)
         return body
 
@@ -161,4 +161,4 @@
         for server_id in cls.created_server_ids:
             cls.servers_client.delete_server(server_id)
 
-        super(LiveBlockMigrationV3TestJSON, cls).tearDownClass()
+        super(LiveBlockMigrationV3Test, cls).tearDownClass()
diff --git a/tempest/api/compute/v3/test_quotas.py b/tempest/api/compute/v3/test_quotas.py
index 1cbfa2b..33b90ff 100644
--- a/tempest/api/compute/v3/test_quotas.py
+++ b/tempest/api/compute/v3/test_quotas.py
@@ -17,12 +17,12 @@
 from tempest import test
 
 
-class QuotasV3TestJSON(base.BaseV3ComputeTest):
+class QuotasV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @classmethod
     def setUpClass(cls):
-        super(QuotasV3TestJSON, cls).setUpClass()
+        super(QuotasV3Test, cls).setUpClass()
         cls.client = cls.quotas_client
         cls.admin_client = cls._get_identity_admin_client()
         resp, tenants = cls.admin_client.list_tenants()
diff --git a/tempest/api/compute/v3/test_version.py b/tempest/api/compute/v3/test_version.py
index 6fbe794..9161d4d 100644
--- a/tempest/api/compute/v3/test_version.py
+++ b/tempest/api/compute/v3/test_version.py
@@ -18,7 +18,7 @@
 from tempest import test
 
 
-class VersionV3TestJSON(base.BaseV3ComputeTest):
+class VersionV3Test(base.BaseV3ComputeTest):
     _interface = 'json'
 
     @test.attr(type='gate')
diff --git a/tempest/api/compute/volumes/test_attach_volume.py b/tempest/api/compute/volumes/test_attach_volume.py
index d51bf13..8d8e3ec 100644
--- a/tempest/api/compute/volumes/test_attach_volume.py
+++ b/tempest/api/compute/volumes/test_attach_volume.py
@@ -36,8 +36,8 @@
     @classmethod
     def setUpClass(cls):
         super(AttachVolumeTestJSON, cls).setUpClass()
-        cls.device = cls.config.compute.volume_device_name
-        if not cls.config.service_available.cinder:
+        cls.device = CONF.compute.volume_device_name
+        if not CONF.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
diff --git a/tempest/api/compute/volumes/test_volumes_get.py b/tempest/api/compute/volumes/test_volumes_get.py
index b5a4802..bcab891 100644
--- a/tempest/api/compute/volumes/test_volumes_get.py
+++ b/tempest/api/compute/volumes/test_volumes_get.py
@@ -15,9 +15,12 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 from testtools.matchers import ContainsAll
 
+CONF = config.CONF
+
 
 class VolumesGetTestJSON(base.BaseV2ComputeTest):
 
@@ -27,7 +30,7 @@
     def setUpClass(cls):
         super(VolumesGetTestJSON, cls).setUpClass()
         cls.client = cls.volumes_extensions_client
-        if not cls.config.service_available.cinder:
+        if not CONF.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
@@ -41,7 +44,7 @@
         resp, volume = self.client.create_volume(size=1,
                                                  display_name=v_name,
                                                  metadata=metadata)
-        self.addCleanup(self._delete_volume, volume)
+        self.addCleanup(self.delete_volume, volume['id'])
         self.assertEqual(200, resp.status)
         self.assertIn('id', volume)
         self.assertIn('displayName', volume)
@@ -69,16 +72,6 @@
                         'The fetched Volume metadata misses data '
                         'from the created Volume')
 
-    def _delete_volume(self, volume):
-        # Delete the Volume created in this method
-        try:
-            resp, _ = self.client.delete_volume(volume['id'])
-            self.assertEqual(202, resp.status)
-            # Checking if the deleted Volume still exists
-            self.client.wait_for_resource_deletion(volume['id'])
-        except KeyError:
-            return
-
 
 class VolumesGetTestXML(VolumesGetTestJSON):
     _interface = "xml"
diff --git a/tempest/api/compute/volumes/test_volumes_list.py b/tempest/api/compute/volumes/test_volumes_list.py
index ac89f99..48b1b7e 100644
--- a/tempest/api/compute/volumes/test_volumes_list.py
+++ b/tempest/api/compute/volumes/test_volumes_list.py
@@ -15,8 +15,11 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class VolumesTestJSON(base.BaseV2ComputeTest):
 
@@ -34,7 +37,7 @@
     def setUpClass(cls):
         super(VolumesTestJSON, cls).setUpClass()
         cls.client = cls.volumes_extensions_client
-        if not cls.config.service_available.cinder:
+        if not CONF.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         # Create 3 Volumes
@@ -59,7 +62,7 @@
                     # too small. So, here, we clean up whatever we did manage
                     # to create and raise a SkipTest
                     for volume in cls.volume_list:
-                        cls.client.delete_volume(volume)
+                        cls.delete_volume(volume['id'])
                     msg = ("Failed to create ALL necessary volumes to run "
                            "test. This typically means that the backing file "
                            "size of the nova-volumes group is too small to "
@@ -71,8 +74,7 @@
     def tearDownClass(cls):
         # Delete the created Volumes
         for volume in cls.volume_list:
-            resp, _ = cls.client.delete_volume(volume['id'])
-            cls.client.wait_for_resource_deletion(volume['id'])
+            cls.delete_volume(volume['id'])
         super(VolumesTestJSON, cls).tearDownClass()
 
     @attr(type='gate')
diff --git a/tempest/api/compute/volumes/test_volumes_negative.py b/tempest/api/compute/volumes/test_volumes_negative.py
index e01e349..85b30e2 100644
--- a/tempest/api/compute/volumes/test_volumes_negative.py
+++ b/tempest/api/compute/volumes/test_volumes_negative.py
@@ -17,9 +17,12 @@
 
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class VolumesNegativeTest(base.BaseV2ComputeTest):
     _interface = 'json'
@@ -28,7 +31,7 @@
     def setUpClass(cls):
         super(VolumesNegativeTest, cls).setUpClass()
         cls.client = cls.volumes_extensions_client
-        if not cls.config.service_available.cinder:
+        if not CONF.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
diff --git a/tempest/api/identity/admin/v3/test_trusts.py b/tempest/api/identity/admin/v3/test_trusts.py
index 0bded78..1bebad4 100644
--- a/tempest/api/identity/admin/v3/test_trusts.py
+++ b/tempest/api/identity/admin/v3/test_trusts.py
@@ -31,7 +31,7 @@
         if not CONF.identity_feature_enabled.trust:
             raise self.skipException("Trusts aren't enabled")
 
-        self.trustee_username = self.config.identity.alt_username
+        self.trustee_username = CONF.identity.alt_username
         self.trust_id = None
 
     def tearDown(self):
diff --git a/tempest/api/image/base.py b/tempest/api/image/base.py
index 2e69579..37b848c 100644
--- a/tempest/api/image/base.py
+++ b/tempest/api/image/base.py
@@ -17,10 +17,13 @@
 from tempest import clients
 from tempest.common import isolated_creds
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 import tempest.test
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -35,10 +38,10 @@
         cls._interface = 'json'
         cls.isolated_creds = isolated_creds.IsolatedCreds(
             cls.__name__, network_resources=cls.network_resources)
-        if not cls.config.service_available.glance:
+        if not CONF.service_available.glance:
             skip_msg = ("%s skipped as glance is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_primary_creds()
             username, tenant_name, password = creds
             cls.os = clients.Manager(username=username,
@@ -83,7 +86,7 @@
     def setUpClass(cls):
         super(BaseV1ImageTest, cls).setUpClass()
         cls.client = cls.os.image_client
-        if not cls.config.image_feature_enabled.api_v1:
+        if not CONF.image_feature_enabled.api_v1:
             msg = "Glance API v1 not supported"
             raise cls.skipException(msg)
 
@@ -92,7 +95,7 @@
     @classmethod
     def setUpClass(cls):
         super(BaseV1ImageMembersTest, cls).setUpClass()
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_alt_creds()
             username, tenant_name, password = creds
             cls.os_alt = clients.Manager(username=username,
@@ -124,7 +127,7 @@
     def setUpClass(cls):
         super(BaseV2ImageTest, cls).setUpClass()
         cls.client = cls.os.image_client_v2
-        if not cls.config.image_feature_enabled.api_v2:
+        if not CONF.image_feature_enabled.api_v2:
             msg = "Glance API v2 not supported"
             raise cls.skipException(msg)
 
@@ -134,7 +137,7 @@
     @classmethod
     def setUpClass(cls):
         super(BaseV2MemberImageTest, cls).setUpClass()
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_alt_creds()
             username, tenant_name, password = creds
             cls.os_alt = clients.Manager(username=username,
diff --git a/tempest/api/image/v1/test_images.py b/tempest/api/image/v1/test_images.py
index 3c8d95e..8c62c05 100644
--- a/tempest/api/image/v1/test_images.py
+++ b/tempest/api/image/v1/test_images.py
@@ -16,8 +16,11 @@
 import cStringIO as StringIO
 
 from tempest.api.image import base
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class CreateRegisterImagesTest(base.BaseV1ImageTest):
     """Here we test the registration and creation of images."""
@@ -68,7 +71,7 @@
         resp, body = self.create_image(name='New Http Image',
                                        container_format='bare',
                                        disk_format='raw', is_public=True,
-                                       copy_from=self.config.images.http_image)
+                                       copy_from=CONF.images.http_image)
         self.assertIn('id', body)
         image_id = body.get('id')
         self.assertEqual('New Http Image', body.get('name'))
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index 0085cd6..1c2c4b0 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -17,10 +17,13 @@
 
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 import tempest.test
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -52,8 +55,7 @@
         cls.set_network_resources()
         super(BaseNetworkTest, cls).setUpClass()
         os = clients.Manager(interface=cls._interface)
-        cls.network_cfg = os.config.network
-        if not cls.config.service_available.neutron:
+        if not CONF.service_available.neutron:
             raise cls.skipException("Neutron support is required")
         cls.client = os.network_client
         cls.networks = []
@@ -123,8 +125,8 @@
     @classmethod
     def create_subnet(cls, network, ip_version=4):
         """Wrapper utility that returns a test subnet."""
-        cidr = netaddr.IPNetwork(cls.network_cfg.tenant_network_cidr)
-        mask_bits = cls.network_cfg.tenant_network_mask_bits
+        cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr)
+        mask_bits = CONF.network.tenant_network_mask_bits
         # Find a cidr that is not in use yet and create a subnet with it
         body = None
         failure = None
@@ -260,9 +262,9 @@
     @classmethod
     def setUpClass(cls):
         super(BaseAdminNetworkTest, cls).setUpClass()
-        admin_username = cls.config.compute_admin.username
-        admin_password = cls.config.compute_admin.password
-        admin_tenant = cls.config.compute_admin.tenant_name
+        admin_username = CONF.compute_admin.username
+        admin_password = CONF.compute_admin.password
+        admin_tenant = CONF.compute_admin.tenant_name
         if not (admin_username and admin_password and admin_tenant):
             msg = ("Missing Administrative Network API credentials "
                    "in configuration.")
diff --git a/tempest/api/network/test_floating_ips.py b/tempest/api/network/test_floating_ips.py
index a7c1bd2..69367ab 100644
--- a/tempest/api/network/test_floating_ips.py
+++ b/tempest/api/network/test_floating_ips.py
@@ -15,8 +15,11 @@
 
 from tempest.api.network import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class FloatingIPTestJSON(base.BaseNetworkTest):
     _interface = 'json'
@@ -43,7 +46,7 @@
     @classmethod
     def setUpClass(cls):
         super(FloatingIPTestJSON, cls).setUpClass()
-        cls.ext_net_id = cls.config.network.public_network_id
+        cls.ext_net_id = CONF.network.public_network_id
 
         # Create network, subnet, router and add interface
         cls.network = cls.create_network()
diff --git a/tempest/api/network/test_networks.py b/tempest/api/network/test_networks.py
index b1f4608..3aa765c 100644
--- a/tempest/api/network/test_networks.py
+++ b/tempest/api/network/test_networks.py
@@ -17,9 +17,12 @@
 
 from tempest.api.network import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class NetworksTestJSON(base.BaseNetworkTest):
     _interface = 'json'
@@ -76,8 +79,8 @@
         updated_net = body['network']
         self.assertEqual(updated_net['name'], new_name)
         # Find a cidr that is not in use yet and create a subnet with it
-        cidr = netaddr.IPNetwork(self.network_cfg.tenant_network_cidr)
-        mask_bits = self.network_cfg.tenant_network_mask_bits
+        cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr)
+        mask_bits = CONF.network.tenant_network_mask_bits
         for subnet_cidr in cidr.subnet(mask_bits):
             try:
                 resp, body = self.client.create_subnet(
@@ -321,8 +324,8 @@
     @attr(type='smoke')
     def test_bulk_create_delete_subnet(self):
         # Creates 2 subnets in one request
-        cidr = netaddr.IPNetwork(self.network_cfg.tenant_network_cidr)
-        mask_bits = self.network_cfg.tenant_network_mask_bits
+        cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr)
+        mask_bits = CONF.network.tenant_network_mask_bits
         cidrs = []
         for subnet_cidr in cidr.subnet(mask_bits):
             cidrs.append(subnet_cidr)
diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py
index 426273c..f3fac93 100644
--- a/tempest/api/network/test_routers.py
+++ b/tempest/api/network/test_routers.py
@@ -17,8 +17,11 @@
 
 from tempest.api.network import base_routers as base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import test
 
+CONF = config.CONF
+
 
 class RoutersTest(base.BaseRouterTest):
     _interface = 'json'
@@ -35,14 +38,14 @@
         name = data_utils.rand_name('router-')
         resp, create_body = self.client.create_router(
             name, external_gateway_info={
-                "network_id": self.network_cfg.public_network_id},
+                "network_id": CONF.network.public_network_id},
             admin_state_up=False)
         self.assertEqual('201', resp['status'])
         self.addCleanup(self._delete_router, create_body['router']['id'])
         self.assertEqual(create_body['router']['name'], name)
         self.assertEqual(
             create_body['router']['external_gateway_info']['network_id'],
-            self.network_cfg.public_network_id)
+            CONF.network.public_network_id)
         self.assertEqual(create_body['router']['admin_state_up'], False)
         # Show details of the created router
         resp, show_body = self.client.show_router(
@@ -51,7 +54,7 @@
         self.assertEqual(show_body['router']['name'], name)
         self.assertEqual(
             show_body['router']['external_gateway_info']['network_id'],
-            self.network_cfg.public_network_id)
+            CONF.network.public_network_id)
         self.assertEqual(show_body['router']['admin_state_up'], False)
         # List routers and verify if created router is there in response
         resp, list_body = self.client.list_routers()
@@ -123,14 +126,14 @@
 
     def _verify_gateway_port(self, router_id):
         resp, list_body = self.admin_client.list_ports(
-            network_id=self.network_cfg.public_network_id,
+            network_id=CONF.network.public_network_id,
             device_id=router_id)
         self.assertEqual(len(list_body['ports']), 1)
         gw_port = list_body['ports'][0]
         fixed_ips = gw_port['fixed_ips']
         self.assertEqual(len(fixed_ips), 1)
         resp, public_net_body = self.admin_client.show_network(
-            self.network_cfg.public_network_id)
+            CONF.network.public_network_id)
         public_subnet_id = public_net_body['network']['subnets'][0]
         self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
 
@@ -140,40 +143,42 @@
         self.client.update_router(
             router['id'],
             external_gateway_info={
-                'network_id': self.network_cfg.public_network_id})
+                'network_id': CONF.network.public_network_id})
         # Verify operation - router
         resp, show_body = self.client.show_router(router['id'])
         self.assertEqual('200', resp['status'])
         self._verify_router_gateway(
             router['id'],
-            {'network_id': self.network_cfg.public_network_id})
+            {'network_id': CONF.network.public_network_id})
         self._verify_gateway_port(router['id'])
 
+    @test.requires_ext(extension='ext-gw-mode', service='network')
     @test.attr(type='smoke')
     def test_update_router_set_gateway_with_snat_explicit(self):
         router = self.create_router(data_utils.rand_name('router-'))
         self.admin_client.update_router_with_snat_gw_info(
             router['id'],
             external_gateway_info={
-                'network_id': self.network_cfg.public_network_id,
+                'network_id': CONF.network.public_network_id,
                 'enable_snat': True})
         self._verify_router_gateway(
             router['id'],
-            {'network_id': self.network_cfg.public_network_id,
+            {'network_id': CONF.network.public_network_id,
              'enable_snat': True})
         self._verify_gateway_port(router['id'])
 
+    @test.requires_ext(extension='ext-gw-mode', service='network')
     @test.attr(type='smoke')
     def test_update_router_set_gateway_without_snat(self):
         router = self.create_router(data_utils.rand_name('router-'))
         self.admin_client.update_router_with_snat_gw_info(
             router['id'],
             external_gateway_info={
-                'network_id': self.network_cfg.public_network_id,
+                'network_id': CONF.network.public_network_id,
                 'enable_snat': False})
         self._verify_router_gateway(
             router['id'],
-            {'network_id': self.network_cfg.public_network_id,
+            {'network_id': CONF.network.public_network_id,
              'enable_snat': False})
         self._verify_gateway_port(router['id'])
 
@@ -181,28 +186,29 @@
     def test_update_router_unset_gateway(self):
         router = self.create_router(
             data_utils.rand_name('router-'),
-            external_network_id=self.network_cfg.public_network_id)
+            external_network_id=CONF.network.public_network_id)
         self.client.update_router(router['id'], external_gateway_info={})
         self._verify_router_gateway(router['id'])
         # No gateway port expected
         resp, list_body = self.admin_client.list_ports(
-            network_id=self.network_cfg.public_network_id,
+            network_id=CONF.network.public_network_id,
             device_id=router['id'])
         self.assertFalse(list_body['ports'])
 
+    @test.requires_ext(extension='ext-gw-mode', service='network')
     @test.attr(type='smoke')
     def test_update_router_reset_gateway_without_snat(self):
         router = self.create_router(
             data_utils.rand_name('router-'),
-            external_network_id=self.network_cfg.public_network_id)
+            external_network_id=CONF.network.public_network_id)
         self.admin_client.update_router_with_snat_gw_info(
             router['id'],
             external_gateway_info={
-                'network_id': self.network_cfg.public_network_id,
+                'network_id': CONF.network.public_network_id,
                 'enable_snat': False})
         self._verify_router_gateway(
             router['id'],
-            {'network_id': self.network_cfg.public_network_id,
+            {'network_id': CONF.network.public_network_id,
              'enable_snat': False})
         self._verify_gateway_port(router['id'])
 
diff --git a/tempest/api/network/test_vpnaas_extensions.py b/tempest/api/network/test_vpnaas_extensions.py
index 089f9ef..64b8a41 100644
--- a/tempest/api/network/test_vpnaas_extensions.py
+++ b/tempest/api/network/test_vpnaas_extensions.py
@@ -15,8 +15,11 @@
 
 from tempest.api.network import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import test
 
+CONF = config.CONF
+
 
 class VPNaaSJSON(base.BaseNetworkTest):
     _interface = 'json'
@@ -43,7 +46,7 @@
         cls.subnet = cls.create_subnet(cls.network)
         cls.router = cls.create_router(
             data_utils.rand_name("router-"),
-            external_network_id=cls.network_cfg.public_network_id)
+            external_network_id=CONF.network.public_network_id)
         cls.create_router_interface(cls.router['id'], cls.subnet['id'])
         cls.vpnservice = cls.create_vpnservice(cls.subnet['id'],
                                                cls.router['id'])
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index 41f23b3..0eedea1 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -18,9 +18,12 @@
 from tempest import clients
 from tempest.common import custom_matchers
 from tempest.common import isolated_creds
+from tempest import config
 from tempest import exceptions
 import tempest.test
 
+CONF = config.CONF
+
 
 class BaseObjectTest(tempest.test.BaseTestCase):
 
@@ -28,12 +31,12 @@
     def setUpClass(cls):
         cls.set_network_resources()
         super(BaseObjectTest, cls).setUpClass()
-        if not cls.config.service_available.swift:
+        if not CONF.service_available.swift:
             skip_msg = ("%s skipped as swift is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
         cls.isolated_creds = isolated_creds.IsolatedCreds(
             cls.__name__, network_resources=cls.network_resources)
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             # Get isolated creds for normal user
             creds = cls.isolated_creds.get_primary_creds()
             username, tenant_name, password = creds
@@ -82,7 +85,7 @@
     def _assign_member_role(cls):
         primary_user = cls.isolated_creds.get_primary_user()
         alt_user = cls.isolated_creds.get_alt_user()
-        swift_role = cls.config.object_storage.operator_role
+        swift_role = CONF.object_storage.operator_role
         try:
             resp, roles = cls.os_admin.identity_client.list_roles()
             role = next(r for r in roles if r['name'] == swift_role)
diff --git a/tempest/api/object_storage/test_account_bulk.py b/tempest/api/object_storage/test_account_bulk.py
new file mode 100644
index 0000000..5fde76a
--- /dev/null
+++ b/tempest/api/object_storage/test_account_bulk.py
@@ -0,0 +1,136 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 NTT Corporation
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import tarfile
+import tempfile
+
+from tempest.api.object_storage import base
+from tempest.common import custom_matchers
+from tempest import test
+
+
+class BulkTest(base.BaseObjectTest):
+
+    def setUp(self):
+        super(BulkTest, self).setUp()
+        self.containers = []
+
+    def tearDown(self):
+        self.delete_containers(self.containers)
+        super(BulkTest, self).tearDown()
+
+    def _create_archive(self):
+        # Create an archived file for bulk upload testing.
+        # Directory and files contained in the directory correspond to
+        # container and subsidiary objects.
+        tmp_dir = tempfile.mkdtemp()
+        tmp_file = tempfile.mkstemp(dir=tmp_dir)
+
+        # Extract a container name and an object name
+        container_name = tmp_dir.split("/")[-1]
+        object_name = tmp_file[1].split("/")[-1]
+
+        # Create tar file
+        tarpath = tempfile.NamedTemporaryFile(suffix=".tar")
+        tar = tarfile.open(None, 'w', tarpath)
+        tar.add(tmp_dir, arcname=container_name)
+        tar.close()
+        tarpath.flush()
+
+        return tarpath.name, container_name, object_name
+
+    @test.attr(type='gate')
+    def test_extract_archive(self):
+        # Test bulk operation of file upload with an archived file
+        filepath, container_name, object_name = self._create_archive()
+
+        params = {'extract-archive': 'tar'}
+        with open(filepath) as fh:
+            mydata = fh.read()
+            resp, body = self.account_client.create_account(data=mydata,
+                                                            params=params)
+
+        self.containers.append(container_name)
+
+        self.assertIn(int(resp['status']), test.HTTP_SUCCESS)
+
+        # When uploading an archived file with the bulk operation, the response
+        # does not contain 'content-length' header. This is the special case,
+        # therefore the existence of response headers is checked without
+        # custom matcher.
+        self.assertIn('transfer-encoding', resp)
+        self.assertIn('content-type', resp)
+        self.assertIn('x-trans-id', resp)
+        self.assertIn('date', resp)
+
+        # Check only the format of common headers with custom matcher
+        self.assertThat(resp, custom_matchers.AreAllWellFormatted())
+
+        param = {'format': 'json'}
+        resp, body = self.account_client.list_account_containers(param)
+
+        self.assertIn(int(resp['status']), test.HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Account', 'GET')
+
+        self.assertIn(container_name, [b['name'] for b in body])
+
+        param = {'format': 'json'}
+        resp, contents_list = self.container_client.list_container_contents(
+            container_name, param)
+
+        self.assertIn(int(resp['status']), test.HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+
+        self.assertIn(object_name, [c['name'] for c in contents_list])
+
+    @test.attr(type='gate')
+    def test_bulk_delete(self):
+        # Test bulk operation of deleting multiple files
+        filepath, container_name, object_name = self._create_archive()
+
+        params = {'extract-archive': 'tar'}
+        with open(filepath) as fh:
+            mydata = fh.read()
+            resp, body = self.account_client.create_account(data=mydata,
+                                                            params=params)
+
+        data = '%s/%s\n%s' % (container_name, object_name, container_name)
+        params = {'bulk-delete': ''}
+        resp, body = self.account_client.delete_account(data=data,
+                                                        params=params)
+
+        self.assertIn(int(resp['status']), test.HTTP_SUCCESS)
+
+        # When deleting multiple files using the bulk operation, the response
+        # does not contain 'content-length' header. This is the special case,
+        # therefore the existence of response headers is checked without
+        # custom matcher.
+        self.assertIn('transfer-encoding', resp)
+        self.assertIn('content-type', resp)
+        self.assertIn('x-trans-id', resp)
+        self.assertIn('date', resp)
+
+        # Check only the format of common headers with custom matcher
+        self.assertThat(resp, custom_matchers.AreAllWellFormatted())
+
+        # Check if a container is deleted
+        param = {'format': 'txt'}
+        resp, body = self.account_client.list_account_containers(param)
+
+        self.assertIn(int(resp['status']), test.HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Account', 'GET')
+
+        self.assertNotIn(container_name, body)
diff --git a/tempest/api/object_storage/test_account_services_negative.py b/tempest/api/object_storage/test_account_services_negative.py
index 3b07e17..c8f8096 100644
--- a/tempest/api/object_storage/test_account_services_negative.py
+++ b/tempest/api/object_storage/test_account_services_negative.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
 #
 # Author: Joe H. Rahme <joe.hakim.rahme@enovance.com>
diff --git a/tempest/api/object_storage/test_container_acl_negative.py b/tempest/api/object_storage/test_container_acl_negative.py
index e75f21d..f8f29de 100644
--- a/tempest/api/object_storage/test_container_acl_negative.py
+++ b/tempest/api/object_storage/test_container_acl_negative.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
 #
 # Author: Joe H. Rahme <joe.hakim.rahme@enovance.com>
diff --git a/tempest/api/object_storage/test_container_services.py b/tempest/api/object_storage/test_container_services.py
index 0d477d9..84cc91e 100644
--- a/tempest/api/object_storage/test_container_services.py
+++ b/tempest/api/object_storage/test_container_services.py
@@ -20,15 +20,32 @@
 
 
 class ContainerTest(base.BaseObjectTest):
-    @classmethod
-    def setUpClass(cls):
-        super(ContainerTest, cls).setUpClass()
-        cls.containers = []
+    def setUp(self):
+        super(ContainerTest, self).setUp()
+        self.containers = []
 
-    @classmethod
-    def tearDownClass(cls):
-        cls.delete_containers(cls.containers)
-        super(ContainerTest, cls).tearDownClass()
+    def tearDown(self):
+        self.delete_containers(self.containers)
+        super(ContainerTest, self).tearDown()
+
+    def _create_container(self):
+        # setup container
+        container_name = data_utils.rand_name(name='TestContainer')
+        self.container_client.create_container(container_name)
+        self.containers.append(container_name)
+
+        return container_name
+
+    def _create_object(self, container_name, object_name=None):
+        # setup object
+        if object_name is None:
+            object_name = data_utils.rand_name(name='TestObject')
+        data = data_utils.arbitrary_string()
+        self.object_client.create_object(container_name,
+                                         object_name,
+                                         data)
+
+        return object_name
 
     @attr(type='smoke')
     def test_create_container(self):
@@ -39,11 +56,97 @@
         self.assertHeaders(resp, 'Container', 'PUT')
 
     @attr(type='smoke')
+    def test_create_container_overwrite(self):
+        # overwrite container with the same name
+        container_name = data_utils.rand_name(name='TestContainer')
+        self.container_client.create_container(container_name)
+        self.containers.append(container_name)
+
+        resp, _ = self.container_client.create_container(container_name)
+        self.assertIn(resp['status'], ('202', '201'))
+        self.assertHeaders(resp, 'Container', 'PUT')
+
+    @attr(type='smoke')
+    def test_create_container_with_metadata_key(self):
+        # create container with the blank value of metadata
+        container_name = data_utils.rand_name(name='TestContainer')
+        metadata = {'test-container-meta': ''}
+        resp, _ = self.container_client.create_container(
+            container_name,
+            metadata=metadata)
+        self.containers.append(container_name)
+        self.assertIn(resp['status'], ('201', '202'))
+        self.assertHeaders(resp, 'Container', 'PUT')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        # if the value of metadata is blank, metadata is not registered
+        # in the server
+        self.assertNotIn('x-container-meta-test-container-meta', resp)
+
+    @attr(type='smoke')
+    def test_create_container_with_metadata_value(self):
+        # create container with metadata value
+        container_name = data_utils.rand_name(name='TestContainer')
+
+        metadata = {'test-container-meta': 'Meta1'}
+        resp, _ = self.container_client.create_container(
+            container_name,
+            metadata=metadata)
+        self.containers.append(container_name)
+        self.assertIn(resp['status'], ('201', '202'))
+        self.assertHeaders(resp, 'Container', 'PUT')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertIn('x-container-meta-test-container-meta', resp)
+        self.assertEqual(resp['x-container-meta-test-container-meta'],
+                         metadata['test-container-meta'])
+
+    @attr(type='smoke')
+    def test_create_container_with_remove_metadata_key(self):
+        # create container with the blank value of remove metadata
+        container_name = data_utils.rand_name(name='TestContainer')
+        metadata_1 = {'test-container-meta': 'Meta1'}
+        self.container_client.create_container(
+            container_name,
+            metadata=metadata_1)
+        self.containers.append(container_name)
+
+        metadata_2 = {'test-container-meta': ''}
+        resp, _ = self.container_client.create_container(
+            container_name,
+            remove_metadata=metadata_2)
+        self.assertIn(resp['status'], ('201', '202'))
+        self.assertHeaders(resp, 'Container', 'PUT')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertNotIn('x-container-meta-test-container-meta', resp)
+
+    @attr(type='smoke')
+    def test_create_container_with_remove_metadata_value(self):
+        # create container with remove metadata
+        container_name = data_utils.rand_name(name='TestContainer')
+        metadata = {'test-container-meta': 'Meta1'}
+        self.container_client.create_container(container_name,
+                                               metadata=metadata)
+        self.containers.append(container_name)
+
+        resp, _ = self.container_client.create_container(
+            container_name,
+            remove_metadata=metadata)
+        self.assertIn(resp['status'], ('201', '202'))
+        self.assertHeaders(resp, 'Container', 'PUT')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertNotIn('x-container-meta-test-container-meta', resp)
+
+    @attr(type='smoke')
     def test_delete_container(self):
         # create a container
-        container_name = data_utils.rand_name(name='TestContainer')
-        resp, _ = self.container_client.create_container(container_name)
-        self.containers.append(container_name)
+        container_name = self._create_container()
         # delete container
         resp, _ = self.container_client.delete_container(container_name)
         self.assertIn(int(resp['status']), HTTP_SUCCESS)
@@ -52,78 +155,280 @@
         self.containers.remove(container_name)
 
     @attr(type='smoke')
-    def test_list_container_contents_json(self):
-        # add metadata to an object
-
-        # create a container
-        container_name = data_utils.rand_name(name='TestContainer')
-        resp, _ = self.container_client.create_container(container_name)
-        self.containers.append(container_name)
-        # create object
-        object_name = data_utils.rand_name(name='TestObject')
-        data = data_utils.arbitrary_string()
-        resp, _ = self.object_client.create_object(container_name,
-                                                   object_name, data)
-        # set object metadata
-        meta_key = data_utils.rand_name(name='Meta-Test-')
-        meta_value = data_utils.rand_name(name='MetaValue-')
-        orig_metadata = {meta_key: meta_value}
-        resp, _ = self.object_client.update_object_metadata(container_name,
-                                                            object_name,
-                                                            orig_metadata)
+    def test_list_container_contents(self):
         # get container contents list
+        container_name = self._create_container()
+        object_name = self._create_object(container_name)
+
+        resp, object_list = self.container_client.list_container_contents(
+            container_name)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name, object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_no_object(self):
+        # get empty container contents list
+        container_name = self._create_container()
+
+        resp, object_list = self.container_client.list_container_contents(
+            container_name)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual('', object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_delimiter(self):
+        # get container contents list using delimiter param
+        container_name = self._create_container()
+        object_name = data_utils.rand_name(name='TestObject/')
+        self._create_object(container_name, object_name)
+
+        params = {'delimiter': '/'}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name.split('/')[0], object_list.strip('/\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_end_marker(self):
+        # get container contents list using end_marker param
+        container_name = self._create_container()
+        object_name = self._create_object(container_name)
+
+        params = {'end_marker': 'ZzzzObject1234567890'}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name, object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_format_json(self):
+        # get container contents list using format_json param
+        container_name = self._create_container()
+        self._create_object(container_name)
+
         params = {'format': 'json'}
-        resp, object_list = \
-            self.container_client.\
-            list_container_contents(container_name, params=params)
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
         self.assertIn(int(resp['status']), HTTP_SUCCESS)
         self.assertHeaders(resp, 'Container', 'GET')
 
         self.assertIsNotNone(object_list)
-
-        object_names = [obj['name'] for obj in object_list]
-        self.assertIn(object_name, object_names)
+        self.assertTrue([c['name'] for c in object_list])
+        self.assertTrue([c['hash'] for c in object_list])
+        self.assertTrue([c['bytes'] for c in object_list])
+        self.assertTrue([c['content_type'] for c in object_list])
+        self.assertTrue([c['last_modified'] for c in object_list])
 
     @attr(type='smoke')
-    def test_container_metadata(self):
-        # update/retrieve/delete container metadata
+    def test_list_container_contents_with_format_xml(self):
+        # get container contents list using format_xml param
+        container_name = self._create_container()
+        self._create_object(container_name)
 
-        # create a container
-        container_name = data_utils.rand_name(name='TestContainer')
-        resp, _ = self.container_client.create_container(container_name)
-        self.containers.append(container_name)
-        # update container metadata
-        metadata = {'name': 'Pictures',
-                    'description': 'Travel'
-                    }
-        resp, _ = \
-            self.container_client.update_container_metadata(container_name,
-                                                            metadata=metadata)
+        params = {'format': 'xml'}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
         self.assertIn(int(resp['status']), HTTP_SUCCESS)
-        self.assertHeaders(resp, 'Container', 'POST')
+        self.assertHeaders(resp, 'Container', 'GET')
 
-        # list container metadata
+        self.assertIsNotNone(object_list)
+        self.assertEqual(object_list.tag, 'container')
+        self.assertTrue('name' in object_list.keys())
+        self.assertEqual(object_list.find(".//object").tag, 'object')
+        self.assertEqual(object_list.find(".//name").tag, 'name')
+        self.assertEqual(object_list.find(".//hash").tag, 'hash')
+        self.assertEqual(object_list.find(".//bytes").tag, 'bytes')
+        self.assertEqual(object_list.find(".//content_type").tag,
+                         'content_type')
+        self.assertEqual(object_list.find(".//last_modified").tag,
+                         'last_modified')
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_limit(self):
+        # get container contents list using limit param
+        container_name = self._create_container()
+        object_name = self._create_object(container_name)
+
+        params = {'limit': data_utils.rand_int_id(1, 10000)}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name, object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_marker(self):
+        # get container contents list using marker param
+        container_name = self._create_container()
+        object_name = self._create_object(container_name)
+
+        params = {'marker': 'AaaaObject1234567890'}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name, object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_path(self):
+        # get container contents list using path param
+        container_name = self._create_container()
+        object_name = data_utils.rand_name(name='Swift/TestObject')
+        self._create_object(container_name, object_name)
+
+        params = {'path': 'Swift'}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name, object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_contents_with_prefix(self):
+        # get container contents list using prefix param
+        container_name = self._create_container()
+        object_name = self._create_object(container_name)
+
+        prefix_key = object_name[0:8]
+        params = {'prefix': prefix_key}
+        resp, object_list = self.container_client.list_container_contents(
+            container_name,
+            params=params)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'GET')
+        self.assertEqual(object_name, object_list.strip('\n'))
+
+    @attr(type='smoke')
+    def test_list_container_metadata(self):
+        # List container metadata
+        container_name = self._create_container()
+
+        metadata = {'name': 'Pictures'}
+        self.container_client.update_container_metadata(
+            container_name,
+            metadata=metadata)
+
         resp, _ = self.container_client.list_container_metadata(
             container_name)
         self.assertIn(int(resp['status']), HTTP_SUCCESS)
         self.assertHeaders(resp, 'Container', 'HEAD')
-
         self.assertIn('x-container-meta-name', resp)
-        self.assertIn('x-container-meta-description', resp)
-        self.assertEqual(resp['x-container-meta-name'], 'Pictures')
-        self.assertEqual(resp['x-container-meta-description'], 'Travel')
+        self.assertEqual(resp['x-container-meta-name'], metadata['name'])
 
-        # delete container metadata
-        resp, _ = self.container_client.delete_container_metadata(
+    @attr(type='smoke')
+    def test_list_no_container_metadata(self):
+        # HEAD container without metadata
+        container_name = self._create_container()
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'HEAD')
+        self.assertNotIn('x-container-meta-', str(resp))
+
+    @attr(type='smoke')
+    def test_update_container_metadata_with_create_and_delete_matadata(self):
+        # Send one request of adding and deleting metadata
+        container_name = data_utils.rand_name(name='TestContainer')
+        metadata_1 = {'test-container-meta1': 'Meta1'}
+        self.container_client.create_container(container_name,
+                                               metadata=metadata_1)
+        self.containers.append(container_name)
+
+        metadata_2 = {'test-container-meta2': 'Meta2'}
+        resp, _ = self.container_client.update_container_metadata(
             container_name,
-            metadata=metadata.keys())
+            metadata=metadata_2,
+            remove_metadata=metadata_1)
         self.assertIn(int(resp['status']), HTTP_SUCCESS)
         self.assertHeaders(resp, 'Container', 'POST')
 
-        # check if the metadata are no longer there
-        resp, _ = self.container_client.list_container_metadata(container_name)
-        self.assertIn(int(resp['status']), HTTP_SUCCESS)
-        self.assertHeaders(resp, 'Container', 'HEAD')
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertNotIn('x-container-meta-test-container-meta1', resp)
+        self.assertIn('x-container-meta-test-container-meta2', resp)
+        self.assertEqual(resp['x-container-meta-test-container-meta2'],
+                         metadata_2['test-container-meta2'])
 
-        self.assertNotIn('x-container-meta-name', resp)
-        self.assertNotIn('x-container-meta-description', resp)
+    @attr(type='smoke')
+    def test_update_container_metadata_with_create_metadata(self):
+        # update container metadata using add metadata
+        container_name = self._create_container()
+
+        metadata = {'test-container-meta1': 'Meta1'}
+        resp, _ = self.container_client.update_container_metadata(
+            container_name,
+            metadata=metadata)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'POST')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertIn('x-container-meta-test-container-meta1', resp)
+        self.assertEqual(resp['x-container-meta-test-container-meta1'],
+                         metadata['test-container-meta1'])
+
+    @attr(type='smoke')
+    def test_update_container_metadata_with_delete_metadata(self):
+        # update container metadata using delete metadata
+        container_name = data_utils.rand_name(name='TestContainer')
+        metadata = {'test-container-meta1': 'Meta1'}
+        self.container_client.create_container(container_name,
+                                               metadata=metadata)
+        self.containers.append(container_name)
+
+        resp, _ = self.container_client.delete_container_metadata(
+            container_name,
+            metadata=metadata)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'POST')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertNotIn('x-container-meta-test-container-meta1', resp)
+
+    @attr(type='smoke')
+    def test_update_container_metadata_with_create_matadata_key(self):
+        # update container metadata with a blenk value of metadata
+        container_name = self._create_container()
+
+        metadata = {'test-container-meta1': ''}
+        resp, _ = self.container_client.update_container_metadata(
+            container_name,
+            metadata=metadata)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'POST')
+
+        resp, _ = self.container_client.list_container_metadata(
+            container_name)
+        self.assertNotIn('x-container-meta-test-container-meta1', resp)
+
+    @attr(type='smoke')
+    def test_update_container_metadata_with_delete_metadata_key(self):
+        # update container metadata with a blank value of matadata
+        container_name = data_utils.rand_name(name='TestContainer')
+        metadata = {'test-container-meta1': 'Meta1'}
+        self.container_client.create_container(container_name,
+                                               metadata=metadata)
+        self.containers.append(container_name)
+
+        metadata = {'test-container-meta1': ''}
+        resp, _ = self.container_client.delete_container_metadata(
+            container_name,
+            metadata=metadata)
+        self.assertIn(int(resp['status']), HTTP_SUCCESS)
+        self.assertHeaders(resp, 'Container', 'POST')
+
+        resp, _ = self.container_client.list_container_metadata(container_name)
+        self.assertNotIn('x-container-meta-test-container-meta1', resp)
diff --git a/tempest/api/object_storage/test_container_sync.py b/tempest/api/object_storage/test_container_sync.py
index 32bbcbd..207fced 100644
--- a/tempest/api/object_storage/test_container_sync.py
+++ b/tempest/api/object_storage/test_container_sync.py
@@ -18,9 +18,13 @@
 
 from tempest.api.object_storage import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 from tempest.test import HTTP_SUCCESS
 
+CONF = config.CONF
+
+
 # This test can be quite long to run due to its
 # dependency on container-sync process running interval.
 # You can obviously reduce the container-sync interval in the
@@ -40,9 +44,9 @@
 
         # Must be configure according to container-sync interval
         container_sync_timeout = \
-            int(cls.config.object_storage.container_sync_timeout)
+            int(CONF.object_storage.container_sync_timeout)
         cls.container_sync_interval = \
-            int(cls.config.object_storage.container_sync_interval)
+            int(CONF.object_storage.container_sync_interval)
         cls.attempts = \
             int(container_sync_timeout / cls.container_sync_interval)
 
diff --git a/tempest/api/object_storage/test_object_expiry.py b/tempest/api/object_storage/test_object_expiry.py
index 7ca0e51..3aae0a1 100644
--- a/tempest/api/object_storage/test_object_expiry.py
+++ b/tempest/api/object_storage/test_object_expiry.py
@@ -28,30 +28,34 @@
         cls.container_name = data_utils.rand_name(name='TestContainer')
         cls.container_client.create_container(cls.container_name)
 
+    def setUp(self):
+        super(ObjectExpiryTest, self).setUp()
+        # create object
+        self.object_name = data_utils.rand_name(name='TestObject')
+        resp, _ = self.object_client.create_object(self.container_name,
+                                                   self.object_name, '')
+
     @classmethod
     def tearDownClass(cls):
         cls.delete_containers([cls.container_name])
         super(ObjectExpiryTest, cls).tearDownClass()
 
     def _test_object_expiry(self, metadata):
-        # create object
-        object_name = data_utils.rand_name(name='TestObject')
-        resp, _ = self.object_client.create_object(self.container_name,
-                                                   object_name, '')
         # update object metadata
         resp, _ = \
             self.object_client.update_object_metadata(self.container_name,
-                                                      object_name, metadata,
+                                                      self.object_name,
+                                                      metadata,
                                                       metadata_prefix='')
         # verify object metadata
         resp, _ = \
             self.object_client.list_object_metadata(self.container_name,
-                                                    object_name)
+                                                    self.object_name)
         self.assertEqual(resp['status'], '200')
         self.assertHeaders(resp, 'Object', 'HEAD')
         self.assertIn('x-delete-at', resp)
         resp, body = self.object_client.get_object(self.container_name,
-                                                   object_name)
+                                                   self.object_name)
         self.assertEqual(resp['status'], '200')
         self.assertHeaders(resp, 'Object', 'GET')
         self.assertIn('x-delete-at', resp)
@@ -61,7 +65,7 @@
 
         # object should not be there anymore
         self.assertRaises(exceptions.NotFound, self.object_client.get_object,
-                          self.container_name, object_name)
+                          self.container_name, self.object_name)
 
     @attr(type='gate')
     def test_get_object_after_expiry_time(self):
diff --git a/tempest/api/object_storage/test_object_formpost_negative.py b/tempest/api/object_storage/test_object_formpost_negative.py
index a07e277..e02a058 100644
--- a/tempest/api/object_storage/test_object_formpost_negative.py
+++ b/tempest/api/object_storage/test_object_formpost_negative.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
 # Author: Joe H. Rahme <joe.hakim.rahme@enovance.com>
 #
diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py
index 13f197b..bca9b93 100644
--- a/tempest/api/object_storage/test_object_services.py
+++ b/tempest/api/object_storage/test_object_services.py
@@ -14,7 +14,6 @@
 #    under the License.
 
 import hashlib
-import re
 
 from tempest.api.object_storage import base
 from tempest.common import custom_matchers
@@ -264,23 +263,15 @@
         resp, _ = self.object_client.list_object_metadata(
             self.container_name, object_name)
 
-        # Check only the existence of common headers with custom matcher
-        self.assertThat(resp, custom_matchers.ExistsAllResponseHeaders(
-                        'Object', 'HEAD'))
-        self.assertIn('x-object-manifest', resp)
-
         # Etag value of a large object is enclosed in double-quotations.
-        # This is a special case, therefore the formats of response headers
-        # are checked without a custom matcher.
+        # After etag quotes are checked they are removed and the response is
+        # checked if all common headers are present and well formatted
         self.assertTrue(resp['etag'].startswith('\"'))
         self.assertTrue(resp['etag'].endswith('\"'))
-        self.assertTrue(resp['etag'].strip('\"').isalnum())
-        self.assertTrue(re.match("^\d+\.?\d*\Z", resp['x-timestamp']))
-        self.assertNotEqual(len(resp['content-type']), 0)
-        self.assertTrue(re.match("^tx[0-9a-f]*-[0-9a-f]*$",
-                                 resp['x-trans-id']))
-        self.assertNotEqual(len(resp['date']), 0)
-        self.assertEqual(resp['accept-ranges'], 'bytes')
+        resp['etag'] = resp['etag'].strip('"')
+        self.assertHeaders(resp, 'Object', 'HEAD')
+
+        self.assertIn('x-object-manifest', resp)
         self.assertEqual(resp['x-object-manifest'],
                          '%s/%s/' % (self.container_name, object_name))
 
diff --git a/tempest/api/object_storage/test_object_slo.py b/tempest/api/object_storage/test_object_slo.py
index ee7f6a4..0443a80 100644
--- a/tempest/api/object_storage/test_object_slo.py
+++ b/tempest/api/object_storage/test_object_slo.py
@@ -14,7 +14,6 @@
 
 import hashlib
 import json
-import re
 
 from tempest.api.object_storage import base
 from tempest.common import custom_matchers
@@ -95,29 +94,19 @@
         return object_name
 
     def _assertHeadersSLO(self, resp, method):
-        # Check the existence of common headers with custom matcher
-        self.assertThat(resp, custom_matchers.ExistsAllResponseHeaders(
-                        'Object', method))
         # When sending GET or HEAD requests to SLO the response contains
         # 'X-Static-Large-Object' header
         if method in ('GET', 'HEAD'):
             self.assertIn('x-static-large-object', resp)
+            self.assertEqual(resp['x-static-large-object'], 'True')
 
-        # Check common headers for all HTTP methods
-        self.assertTrue(re.match("^tx[0-9a-f]*-[0-9a-f]*$",
-                                 resp['x-trans-id']))
-        self.assertTrue(resp['content-length'].isdigit())
-        self.assertNotEqual(len(resp['date']), 0)
         # Etag value of a large object is enclosed in double-quotations.
+        # After etag quotes are checked they are removed and the response is
+        # checked if all common headers are present and well formatted
         self.assertTrue(resp['etag'].startswith('\"'))
         self.assertTrue(resp['etag'].endswith('\"'))
-        self.assertTrue(resp['etag'].strip('\"').isalnum())
-        # Check header formats for a specific method
-        if method in ('GET', 'HEAD'):
-            self.assertTrue(re.match("^\d+\.?\d*\Z", resp['x-timestamp']))
-            self.assertNotEqual(len(resp['content-type']), 0)
-            self.assertEqual(resp['accept-ranges'], 'bytes')
-            self.assertEqual(resp['x-static-large-object'], 'True')
+        resp['etag'] = resp['etag'].strip('"')
+        self.assertHeaders(resp, 'Object', method)
 
     @test.attr(type='gate')
     def test_upload_manifest(self):
diff --git a/tempest/api/object_storage/test_object_temp_url_negative.py b/tempest/api/object_storage/test_object_temp_url_negative.py
index cc507c5..cf24f66 100644
--- a/tempest/api/object_storage/test_object_temp_url_negative.py
+++ b/tempest/api/object_storage/test_object_temp_url_negative.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
 #
 # Author: Joe H. Rahme <joe.hakim.rahme@enovance.com>
diff --git a/tempest/api/orchestration/base.py b/tempest/api/orchestration/base.py
index b69cc49..3424082 100644
--- a/tempest/api/orchestration/base.py
+++ b/tempest/api/orchestration/base.py
@@ -12,9 +12,11 @@
 
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.openstack.common import log as logging
 import tempest.test
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -26,12 +28,10 @@
     def setUpClass(cls):
         super(BaseOrchestrationTest, cls).setUpClass()
         os = clients.OrchestrationManager()
-        cls.orchestration_cfg = os.config.orchestration
-        cls.compute_cfg = os.config.compute
-        if not os.config.service_available.heat:
+        if not CONF.service_available.heat:
             raise cls.skipException("Heat support is required")
-        cls.build_timeout = cls.orchestration_cfg.build_timeout
-        cls.build_interval = cls.orchestration_cfg.build_interval
+        cls.build_timeout = CONF.orchestration.build_timeout
+        cls.build_interval = CONF.orchestration.build_interval
 
         cls.os = os
         cls.orchestration_client = os.orchestration_client
@@ -45,7 +45,7 @@
     def _get_default_network(cls):
         resp, networks = cls.network_client.list_networks()
         for net in networks['networks']:
-            if net['name'] == cls.compute_cfg.fixed_network_name:
+            if net['name'] == CONF.compute.fixed_network_name:
                 return net
 
     @classmethod
@@ -58,16 +58,6 @@
         return admin_client
 
     @classmethod
-    def _get_client_args(cls):
-
-        return (
-            cls.config,
-            cls.config.identity.admin_username,
-            cls.config.identity.admin_password,
-            cls.config.identity.uri
-        )
-
-    @classmethod
     def create_stack(cls, stack_name, template_data, parameters={}):
         resp, body = cls.client.create_stack(
             stack_name,
diff --git a/tempest/api/orchestration/stacks/test_limits.py b/tempest/api/orchestration/stacks/test_limits.py
index 2b5bd8f..22f544d 100644
--- a/tempest/api/orchestration/stacks/test_limits.py
+++ b/tempest/api/orchestration/stacks/test_limits.py
@@ -14,9 +14,11 @@
 
 from tempest.api.orchestration import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.test import attr
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -32,7 +34,7 @@
 
     @attr(type='gate')
     def test_exceed_max_template_size_fails(self):
-        fill = 'A' * self.orchestration_cfg.max_template_size
+        fill = 'A' * CONF.orchestration.max_template_size
         template = '''
 HeatTemplateFormatVersion: '2012-12-12'
 Description: '%s'
diff --git a/tempest/api/orchestration/stacks/test_neutron_resources.py b/tempest/api/orchestration/stacks/test_neutron_resources.py
index bed72c8..243c3ce 100644
--- a/tempest/api/orchestration/stacks/test_neutron_resources.py
+++ b/tempest/api/orchestration/stacks/test_neutron_resources.py
@@ -16,8 +16,10 @@
 from tempest.api.orchestration import base
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -91,16 +93,15 @@
     @classmethod
     def setUpClass(cls):
         super(NeutronResourcesTestJSON, cls).setUpClass()
-        if not cls.orchestration_cfg.image_ref:
+        if not CONF.orchestration.image_ref:
             raise cls.skipException("No image available to test")
         cls.client = cls.orchestration_client
         os = clients.Manager()
-        cls.network_cfg = os.config.network
-        if not cls.config.service_available.neutron:
+        if not CONF.service_available.neutron:
             raise cls.skipException("Neutron support is required")
         cls.network_client = os.network_client
         cls.stack_name = data_utils.rand_name('heat')
-        cls.keypair_name = (cls.orchestration_cfg.keypair_name or
+        cls.keypair_name = (CONF.orchestration.keypair_name or
                             cls._create_keypair()['name'])
         cls.external_router_id = cls._get_external_router_id()
 
@@ -110,8 +111,8 @@
             cls.template,
             parameters={
                 'KeyName': cls.keypair_name,
-                'InstanceType': cls.orchestration_cfg.instance_type,
-                'ImageId': cls.orchestration_cfg.image_ref,
+                'InstanceType': CONF.orchestration.instance_type,
+                'ImageId': CONF.orchestration.image_ref,
                 'ExternalRouterId': cls.external_router_id
             })
         cls.stack_id = cls.stack_identifier.split('/')[1]
diff --git a/tempest/api/orchestration/stacks/test_server_cfn_init.py b/tempest/api/orchestration/stacks/test_server_cfn_init.py
index 2ef629f..4267c1d 100644
--- a/tempest/api/orchestration/stacks/test_server_cfn_init.py
+++ b/tempest/api/orchestration/stacks/test_server_cfn_init.py
@@ -125,13 +125,13 @@
     @classmethod
     def setUpClass(cls):
         super(ServerCfnInitTestJSON, cls).setUpClass()
-        if not cls.orchestration_cfg.image_ref:
+        if not CONF.orchestration.image_ref:
             raise cls.skipException("No image available to test")
         cls.client = cls.orchestration_client
 
         stack_name = data_utils.rand_name('heat')
-        if cls.orchestration_cfg.keypair_name:
-            keypair_name = cls.orchestration_cfg.keypair_name
+        if CONF.orchestration.keypair_name:
+            keypair_name = CONF.orchestration.keypair_name
         else:
             cls.keypair = cls._create_keypair()
             keypair_name = cls.keypair['name']
@@ -142,8 +142,8 @@
             cls.template,
             parameters={
                 'key_name': keypair_name,
-                'flavor': cls.orchestration_cfg.instance_type,
-                'image': cls.orchestration_cfg.image_ref,
+                'flavor': CONF.orchestration.instance_type,
+                'image': CONF.orchestration.image_ref,
                 'network': cls._get_default_network()['id']
             })
 
diff --git a/tempest/api/volume/admin/test_multi_backend.py b/tempest/api/volume/admin/test_multi_backend.py
index 32a355b..96e0264 100644
--- a/tempest/api/volume/admin/test_multi_backend.py
+++ b/tempest/api/volume/admin/test_multi_backend.py
@@ -12,11 +12,14 @@
 
 from tempest.api.volume import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.services.volume.json.admin import volume_types_client
 from tempest.services.volume.json import volumes_client
 from tempest.test import attr
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -26,24 +29,24 @@
     @classmethod
     def setUpClass(cls):
         super(VolumeMultiBackendTest, cls).setUpClass()
-        if not cls.config.volume_feature_enabled.multi_backend:
+        if not CONF.volume_feature_enabled.multi_backend:
             cls.tearDownClass()
             raise cls.skipException("Cinder multi-backend feature disabled")
 
-        cls.backend1_name = cls.config.volume.backend1_name
-        cls.backend2_name = cls.config.volume.backend2_name
+        cls.backend1_name = CONF.volume.backend1_name
+        cls.backend2_name = CONF.volume.backend2_name
 
-        adm_user = cls.config.identity.admin_username
-        adm_pass = cls.config.identity.admin_password
-        adm_tenant = cls.config.identity.admin_tenant_name
-        auth_url = cls.config.identity.uri
+        adm_user = CONF.identity.admin_username
+        adm_pass = CONF.identity.admin_password
+        adm_tenant = CONF.identity.admin_tenant_name
+        auth_url = CONF.identity.uri
 
-        cls.volume_client = volumes_client.VolumesClientJSON(cls.config,
+        cls.volume_client = volumes_client.VolumesClientJSON(CONF,
                                                              adm_user,
                                                              adm_pass,
                                                              auth_url,
                                                              adm_tenant)
-        cls.type_client = volume_types_client.VolumeTypesClientJSON(cls.config,
+        cls.type_client = volume_types_client.VolumeTypesClientJSON(CONF,
                                                                     adm_user,
                                                                     adm_pass,
                                                                     auth_url,
diff --git a/tempest/api/volume/admin/test_snapshots_actions.py b/tempest/api/volume/admin/test_snapshots_actions.py
index 3211ef8..12fda92 100644
--- a/tempest/api/volume/admin/test_snapshots_actions.py
+++ b/tempest/api/volume/admin/test_snapshots_actions.py
@@ -64,6 +64,19 @@
                                                           status)
         super(SnapshotsActionsTest, self).tearDown()
 
+    def _create_reset_and_force_delete_temp_snapshot(self, status=None):
+        # Create snapshot, reset snapshot status,
+        # and force delete temp snapshot
+        temp_snapshot = self.create_snapshot(self.volume['id'])
+        if status:
+            resp, body = self.admin_snapshots_client.\
+                reset_snapshot_status(temp_snapshot['id'], status)
+            self.assertEqual(202, resp.status)
+        resp_delete, volume_delete = self.admin_snapshots_client.\
+            force_delete_snapshot(temp_snapshot['id'])
+        self.assertEqual(202, resp_delete.status)
+        self.client.wait_for_resource_deletion(temp_snapshot['id'])
+
     def _get_progress_alias(self):
         return 'os-extended-snapshot-attributes:progress'
 
@@ -99,6 +112,26 @@
         self.assertEqual(status, snapshot_get['status'])
         self.assertEqual(progress, snapshot_get[progress_alias])
 
+    @attr(type='gate')
+    def test_snapshot_force_delete_when_snapshot_is_creating(self):
+        # test force delete when status of snapshot is creating
+        self._create_reset_and_force_delete_temp_snapshot('creating')
+
+    @attr(type='gate')
+    def test_snapshot_force_delete_when_snapshot_is_deleting(self):
+        # test force delete when status of snapshot is deleting
+        self._create_reset_and_force_delete_temp_snapshot('deleting')
+
+    @attr(type='gate')
+    def test_snapshot_force_delete_when_snapshot_is_error(self):
+        # test force delete when status of snapshot is error
+        self._create_reset_and_force_delete_temp_snapshot('error')
+
+    @attr(type='gate')
+    def test_snapshot_force_delete_when_snapshot_is_error_deleting(self):
+        # test force delete when status of snapshot is error_deleting
+        self._create_reset_and_force_delete_temp_snapshot('error_deleting')
+
 
 class SnapshotsActionsTestXML(SnapshotsActionsTest):
     _interface = "xml"
diff --git a/tempest/api/volume/admin/test_volume_types.py b/tempest/api/volume/admin/test_volume_types.py
index 0ea999a..d481251 100644
--- a/tempest/api/volume/admin/test_volume_types.py
+++ b/tempest/api/volume/admin/test_volume_types.py
@@ -15,27 +15,15 @@
 
 from tempest.api.volume import base
 from tempest.common.utils import data_utils
-from tempest.services.volume.json.admin import volume_types_client
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
 
-class VolumeTypesTest(base.BaseVolumeV1Test):
+
+class VolumeTypesTest(base.BaseVolumeV1AdminTest):
     _interface = "json"
 
-    @classmethod
-    def setUpClass(cls):
-        super(VolumeTypesTest, cls).setUpClass()
-        adm_user = cls.config.identity.admin_username
-        adm_pass = cls.config.identity.admin_password
-        adm_tenant = cls.config.identity.admin_tenant_name
-        auth_url = cls.config.identity.uri
-
-        cls.client = volume_types_client.VolumeTypesClientJSON(cls.config,
-                                                               adm_user,
-                                                               adm_pass,
-                                                               auth_url,
-                                                               adm_tenant)
-
     def _delete_volume(self, volume_id):
         resp, _ = self.volumes_client.delete_volume(volume_id)
         self.assertEqual(202, resp.status)
@@ -58,8 +46,8 @@
         volume = {}
         vol_name = data_utils.rand_name("volume-")
         vol_type_name = data_utils.rand_name("volume-type-")
-        proto = self.config.volume.storage_protocol
-        vendor = self.config.volume.vendor_name
+        proto = CONF.volume.storage_protocol
+        vendor = CONF.volume.vendor_name
         extra_specs = {"storage_protocol": proto,
                        "vendor_name": vendor}
         body = {}
@@ -101,8 +89,8 @@
         # Create/get volume type.
         body = {}
         name = data_utils.rand_name("volume-type-")
-        proto = self.config.volume.storage_protocol
-        vendor = self.config.volume.vendor_name
+        proto = CONF.volume.storage_protocol
+        vendor = CONF.volume.vendor_name
         extra_specs = {"storage_protocol": proto,
                        "vendor_name": vendor}
         resp, body = self.client.create_volume_type(
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index 9c6eebe..de2b240 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -15,9 +15,12 @@
 
 from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.openstack.common import log as logging
 import tempest.test
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -30,17 +33,17 @@
         cls.set_network_resources()
         super(BaseVolumeTest, cls).setUpClass()
 
-        if not cls.config.service_available.cinder:
+        if not CONF.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
             raise cls.skipException(skip_msg)
 
         cls.os = cls.get_client_manager()
 
         cls.servers_client = cls.os.servers_client
-        cls.image_ref = cls.config.compute.image_ref
-        cls.flavor_ref = cls.config.compute.flavor_ref
-        cls.build_interval = cls.config.volume.build_interval
-        cls.build_timeout = cls.config.volume.build_timeout
+        cls.image_ref = CONF.compute.image_ref
+        cls.flavor_ref = CONF.compute.flavor_ref
+        cls.build_interval = CONF.volume.build_interval
+        cls.build_timeout = CONF.volume.build_timeout
         cls.snapshots = []
         cls.volumes = []
 
@@ -109,7 +112,7 @@
 class BaseVolumeV1Test(BaseVolumeTest):
     @classmethod
     def setUpClass(cls):
-        if not cls.config.volume_feature_enabled.api_v1:
+        if not CONF.volume_feature_enabled.api_v1:
             msg = "Volume API v1 not supported"
             raise cls.skipException(msg)
         super(BaseVolumeV1Test, cls).setUpClass()
@@ -123,14 +126,14 @@
     @classmethod
     def setUpClass(cls):
         super(BaseVolumeV1AdminTest, cls).setUpClass()
-        cls.adm_user = cls.config.identity.admin_username
-        cls.adm_pass = cls.config.identity.admin_password
-        cls.adm_tenant = cls.config.identity.admin_tenant_name
+        cls.adm_user = CONF.identity.admin_username
+        cls.adm_pass = CONF.identity.admin_password
+        cls.adm_tenant = CONF.identity.admin_tenant_name
         if not all((cls.adm_user, cls.adm_pass, cls.adm_tenant)):
             msg = ("Missing Volume Admin API credentials "
                    "in configuration.")
             raise cls.skipException(msg)
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_admin_creds()
             admin_username, admin_tenant_name, admin_password = creds
             cls.os_adm = clients.Manager(username=admin_username,
diff --git a/tempest/api/volume/test_extensions.py b/tempest/api/volume/test_extensions.py
index deef8a1..cceffd6 100644
--- a/tempest/api/volume/test_extensions.py
+++ b/tempest/api/volume/test_extensions.py
@@ -15,9 +15,12 @@
 
 
 from tempest.api.volume import base
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 LOG = logging.getLogger(__name__)
 
@@ -30,11 +33,11 @@
         # List of all extensions
         resp, extensions = self.volumes_extension_client.list_extensions()
         self.assertEqual(200, resp.status)
-        if len(self.config.volume_feature_enabled.api_extensions) == 0:
+        if len(CONF.volume_feature_enabled.api_extensions) == 0:
             raise self.skipException('There are not any extensions configured')
         extension_list = [extension.get('alias') for extension in extensions]
         LOG.debug("Cinder extensions: %s" % ','.join(extension_list))
-        ext = self.config.volume_feature_enabled.api_extensions[0]
+        ext = CONF.volume_feature_enabled.api_extensions[0]
         if ext == 'all':
             self.assertIn('Hosts', map(lambda x: x['name'], extensions))
         elif ext:
diff --git a/tempest/api/volume/test_volume_metadata.py b/tempest/api/volume/test_volume_metadata.py
index 6d23c0a..ec732d1 100644
--- a/tempest/api/volume/test_volume_metadata.py
+++ b/tempest/api/volume/test_volume_metadata.py
@@ -13,6 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from testtools.matchers import ContainsAll
+
 from tempest.api.volume import base
 from tempest import test
 
@@ -49,7 +51,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(metadata, body)
+        self.assertThat(body.items(), ContainsAll(metadata.items()))
         # Delete one item metadata of the volume
         rsp, body = self.volumes_client.delete_volume_metadata_item(
             self.volume_id,
@@ -76,7 +78,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(metadata, body)
+        self.assertThat(body.items(), ContainsAll(metadata.items()))
         # Update metadata
         resp, body = self.volumes_client.update_volume_metadata(
             self.volume_id,
@@ -85,7 +87,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(update, body)
+        self.assertThat(body.items(), ContainsAll(update.items()))
 
     @test.attr(type='gate')
     def test_update_volume_metadata_item(self):
@@ -93,9 +95,6 @@
         metadata = {"key1": "value1",
                     "key2": "value2",
                     "key3": "value3"}
-        create_expect = {"key1": "value1",
-                         "key2": "value2",
-                         "key3": "value3"}
         update_item = {"key3": "value3_update"}
         expect = {"key1": "value1",
                   "key2": "value2",
@@ -105,7 +104,7 @@
             self.volume_id,
             metadata)
         self.assertEqual(200, resp.status)
-        self.assertEqual(create_expect, body)
+        self.assertThat(body.items(), ContainsAll(metadata.items()))
         # Update metadata item
         resp, body = self.volumes_client.update_volume_metadata_item(
             self.volume_id,
@@ -115,7 +114,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(expect, body)
+        self.assertThat(body.items(), ContainsAll(expect.items()))
 
 
 class VolumeMetadataTestXML(VolumeMetadataTest):
diff --git a/tempest/api/volume/test_volume_transfers.py b/tempest/api/volume/test_volume_transfers.py
index 4ee7bd0..fc4f07d 100644
--- a/tempest/api/volume/test_volume_transfers.py
+++ b/tempest/api/volume/test_volume_transfers.py
@@ -15,8 +15,11 @@
 
 from tempest.api.volume import base
 from tempest import clients
+from tempest import config
 from tempest.test import attr
 
+CONF = config.CONF
+
 
 class VolumesTransfersTest(base.BaseVolumeV1Test):
     _interface = "json"
@@ -26,7 +29,7 @@
         super(VolumesTransfersTest, cls).setUpClass()
 
         # Add another tenant to test volume-transfer
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             creds = cls.isolated_creds.get_alt_creds()
             username, tenant_name, password = creds
             cls.os_alt = clients.Manager(username=username,
diff --git a/tempest/api/volume/test_volumes_actions.py b/tempest/api/volume/test_volumes_actions.py
index e767ec0..5924c7e 100644
--- a/tempest/api/volume/test_volumes_actions.py
+++ b/tempest/api/volume/test_volumes_actions.py
@@ -15,10 +15,13 @@
 
 from tempest.api.volume import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 from tempest.test import services
 from tempest.test import stresstest
 
+CONF = config.CONF
+
 
 class VolumesActionsTest(base.BaseVolumeV1Test):
     _interface = "json"
@@ -98,7 +101,7 @@
         image_name = data_utils.rand_name('Image-')
         resp, body = self.client.upload_volume(self.volume['id'],
                                                image_name,
-                                               self.config.volume.disk_format)
+                                               CONF.volume.disk_format)
         image_id = body["image_id"]
         self.addCleanup(self.image_client.delete_image, image_id)
         self.assertEqual(202, resp.status)
diff --git a/tempest/api/volume/test_volumes_get.py b/tempest/api/volume/test_volumes_get.py
index 79a4365..6d89e5b 100644
--- a/tempest/api/volume/test_volumes_get.py
+++ b/tempest/api/volume/test_volumes_get.py
@@ -13,11 +13,16 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from testtools.matchers import ContainsAll
+
 from tempest.api.volume import base
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 from tempest.test import services
 
+CONF = config.CONF
+
 
 class VolumesGetTest(base.BaseVolumeV1Test):
     _interface = "json"
@@ -66,16 +71,16 @@
         self.assertEqual(200, resp.status)
         self.assertEqual(v_name,
                          fetched_volume['display_name'],
-                         'The fetched Volume is different '
+                         'The fetched Volume name is different '
                          'from the created Volume')
         self.assertEqual(volume['id'],
                          fetched_volume['id'],
-                         'The fetched Volume is different '
+                         'The fetched Volume id is different '
                          'from the created Volume')
-        self.assertEqual(metadata,
-                         fetched_volume['metadata'],
-                         'The fetched Volume is different '
-                         'from the created Volume')
+        self.assertThat(fetched_volume['metadata'].items(),
+                        ContainsAll(metadata.items()),
+                        'The fetched Volume metadata misses data '
+                        'from the created Volume')
 
         # NOTE(jdg): Revert back to strict true/false checking
         # after fix for bug #1227837 merges
@@ -102,7 +107,10 @@
         self.assertEqual(volume['id'], updated_volume['id'])
         self.assertEqual(new_v_name, updated_volume['display_name'])
         self.assertEqual(new_desc, updated_volume['display_description'])
-        self.assertEqual(metadata, updated_volume['metadata'])
+        self.assertThat(updated_volume['metadata'].items(),
+                        ContainsAll(metadata.items()),
+                        'The fetched Volume metadata misses data '
+                        'from the created Volume')
 
         # NOTE(jdg): Revert back to strict true/false checking
         # after fix for bug #1227837 merges
@@ -112,18 +120,6 @@
         if 'imageRef' not in kwargs:
             self.assertEqual(boot_flag, False)
 
-    @attr(type='gate')
-    def test_volume_get_metadata_none(self):
-        # Create a volume without passing metadata, get details, and delete
-
-        # Create a volume without metadata
-        volume = self.create_volume(metadata={})
-
-        # GET Volume
-        resp, fetched_volume = self.client.get_volume(volume['id'])
-        self.assertEqual(200, resp.status)
-        self.assertEqual(fetched_volume['metadata'], {})
-
     @attr(type='smoke')
     def test_volume_create_get_update_delete(self):
         self._volume_create_get_update_delete()
@@ -131,8 +127,7 @@
     @attr(type='smoke')
     @services('image')
     def test_volume_create_get_update_delete_from_image(self):
-        self._volume_create_get_update_delete(imageRef=self.
-                                              config.compute.image_ref)
+        self._volume_create_get_update_delete(imageRef=CONF.compute.image_ref)
 
     @attr(type='gate')
     def test_volume_create_get_update_delete_as_clone(self):
diff --git a/tempest/cli/__init__.py b/tempest/cli/__init__.py
index dfa2124..a5e0447 100644
--- a/tempest/cli/__init__.py
+++ b/tempest/cli/__init__.py
@@ -17,31 +17,15 @@
 import shlex
 import subprocess
 
-from oslo.config import cfg
-
 import tempest.cli.output_parser
+from tempest import config
 from tempest.openstack.common import log as logging
 import tempest.test
 
 
 LOG = logging.getLogger(__name__)
 
-cli_opts = [
-    cfg.BoolOpt('enabled',
-                default=True,
-                help="enable cli tests"),
-    cfg.StrOpt('cli_dir',
-               default='/usr/local/bin',
-               help="directory where python client binaries are located"),
-    cfg.IntOpt('timeout',
-               default=15,
-               help="Number of seconds to wait on a CLI timeout"),
-]
-
-CONF = cfg.CONF
-cli_group = cfg.OptGroup(name='cli', title="cli Configuration Options")
-CONF.register_group(cli_group)
-CONF.register_opts(cli_opts, group=cli_group)
+CONF = config.CONF
 
 
 class ClientTestBase(tempest.test.BaseTestCase):
@@ -50,7 +34,6 @@
         if not CONF.cli.enabled:
             msg = "cli testing disabled"
             raise cls.skipException(msg)
-        cls.identity = cls.config.identity
         super(ClientTestBase, cls).setUpClass()
 
     def __init__(self, *args, **kwargs):
@@ -106,10 +89,10 @@
         # TODO(jogo) make admin=False work
         creds = ('--os-username %s --os-tenant-name %s --os-password %s '
                  '--os-auth-url %s ' %
-                 (self.identity.admin_username,
-                  self.identity.admin_tenant_name,
-                  self.identity.admin_password,
-                  self.identity.uri))
+                 (CONF.identity.admin_username,
+                  CONF.identity.admin_tenant_name,
+                  CONF.identity.admin_password,
+                  CONF.identity.uri))
         flags = creds + ' ' + flags
         return self.cmd(cmd, action, flags, params, fail_ok)
 
diff --git a/tempest/cli/simple_read_only/test_cinder.py b/tempest/cli/simple_read_only/test_cinder.py
index cf8440d..afbd732 100644
--- a/tempest/cli/simple_read_only/test_cinder.py
+++ b/tempest/cli/simple_read_only/test_cinder.py
@@ -18,7 +18,9 @@
 import subprocess
 
 import tempest.cli
+from tempest import config
 
+CONF = config.CONF
 LOG = logging.getLogger(__name__)
 
 
@@ -30,6 +32,13 @@
     their own. They only verify the structure of output if present.
     """
 
+    @classmethod
+    def setUpClass(cls):
+        if not CONF.service_available.cinder:
+            msg = ("%s skipped as Cinder is not available" % cls.__name__)
+            raise cls.skipException(msg)
+        super(SimpleReadOnlyCinderClientTest, cls).setUpClass()
+
     def test_cinder_fake_action(self):
         self.assertRaises(subprocess.CalledProcessError,
                           self.cinder,
@@ -63,14 +72,14 @@
     def test_cinder_quota_defaults(self):
         """This CLI can accept and string as param."""
         roles = self.parser.listing(self.cinder('quota-defaults',
-                                                params=self.identity.
+                                                params=CONF.identity.
                                                 admin_tenant_name))
         self.assertTableStruct(roles, ['Property', 'Value'])
 
     def test_cinder_quota_show(self):
         """This CLI can accept and string as param."""
         roles = self.parser.listing(self.cinder('quota-show',
-                                                params=self.identity.
+                                                params=CONF.identity.
                                                 admin_tenant_name))
         self.assertTableStruct(roles, ['Property', 'Value'])
 
@@ -136,7 +145,7 @@
         self.cinder('list', flags='--retries 3')
 
     def test_cinder_region_list(self):
-        region = self.config.volume.region
+        region = CONF.volume.region
         if not region:
-            region = self.config.identity.region
+            region = CONF.identity.region
         self.cinder('list', flags='--os-region-name ' + region)
diff --git a/tempest/cli/simple_read_only/test_glance.py b/tempest/cli/simple_read_only/test_glance.py
index 0e0f995..9869483 100644
--- a/tempest/cli/simple_read_only/test_glance.py
+++ b/tempest/cli/simple_read_only/test_glance.py
@@ -16,13 +16,11 @@
 import re
 import subprocess
 
-from oslo.config import cfg
-
 import tempest.cli
+from tempest import config
 from tempest.openstack.common import log as logging
 
-CONF = cfg.CONF
-
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -35,6 +33,13 @@
     their own. They only verify the structure of output if present.
     """
 
+    @classmethod
+    def setUpClass(cls):
+        if not CONF.service_available.glance:
+            msg = ("%s skipped as Glance is not available" % cls.__name__)
+            raise cls.skipException(msg)
+        super(SimpleReadOnlyGlanceClientTest, cls).setUpClass()
+
     def test_glance_fake_action(self):
         self.assertRaises(subprocess.CalledProcessError,
                           self.glance,
@@ -48,7 +53,7 @@
             'Size', 'Status'])
 
     def test_glance_member_list(self):
-        tenant_name = '--tenant-id %s' % self.identity.admin_tenant_name
+        tenant_name = '--tenant-id %s' % CONF.identity.admin_tenant_name
         out = self.glance('member-list',
                           params=tenant_name)
         endpoints = self.parser.listing(out)
diff --git a/tempest/cli/simple_read_only/test_heat.py b/tempest/cli/simple_read_only/test_heat.py
index b45182b..cf4580c 100644
--- a/tempest/cli/simple_read_only/test_heat.py
+++ b/tempest/cli/simple_read_only/test_heat.py
@@ -14,12 +14,11 @@
 import os
 import yaml
 
-from oslo.config import cfg
-
 import tempest.cli
+from tempest import config
 from tempest.openstack.common import log as logging
 
-CONF = cfg.CONF
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
diff --git a/tempest/cli/simple_read_only/test_keystone.py b/tempest/cli/simple_read_only/test_keystone.py
index 271a18c..1efbede 100644
--- a/tempest/cli/simple_read_only/test_keystone.py
+++ b/tempest/cli/simple_read_only/test_keystone.py
@@ -16,12 +16,11 @@
 import re
 import subprocess
 
-from oslo.config import cfg
-
 import tempest.cli
+from tempest import config
 from tempest.openstack.common import log as logging
 
-CONF = cfg.CONF
+CONF = config.CONF
 
 
 LOG = logging.getLogger(__name__)
diff --git a/tempest/cli/simple_read_only/test_nova.py b/tempest/cli/simple_read_only/test_nova.py
index 822e531..b0264d0 100644
--- a/tempest/cli/simple_read_only/test_nova.py
+++ b/tempest/cli/simple_read_only/test_nova.py
@@ -15,15 +15,14 @@
 
 import subprocess
 
-from oslo.config import cfg
 import testtools
 
 import tempest.cli
+from tempest import config
 from tempest.openstack.common import log as logging
 import tempest.test
 
-CONF = cfg.CONF
-
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -42,6 +41,13 @@
 
     """
 
+    @classmethod
+    def setUpClass(cls):
+        if not CONF.service_available.nova:
+            msg = ("%s skipped as Nova is not available" % cls.__name__)
+            raise cls.skipException(msg)
+        super(SimpleReadOnlyNovaClientTest, cls).setUpClass()
+
     def test_admin_fake_action(self):
         self.assertRaises(subprocess.CalledProcessError,
                           self.nova,
diff --git a/tempest/cli/simple_read_only/test_nova_manage.py b/tempest/cli/simple_read_only/test_nova_manage.py
index a92e8da..13a1589 100644
--- a/tempest/cli/simple_read_only/test_nova_manage.py
+++ b/tempest/cli/simple_read_only/test_nova_manage.py
@@ -16,9 +16,11 @@
 import subprocess
 
 import tempest.cli
+from tempest import config
 from tempest.openstack.common import log as logging
 
 
+CONF = config.CONF
 LOG = logging.getLogger(__name__)
 
 
@@ -34,6 +36,13 @@
 
     """
 
+    @classmethod
+    def setUpClass(cls):
+        if not CONF.service_available.nova:
+            msg = ("%s skipped as Nova is not available" % cls.__name__)
+            raise cls.skipException(msg)
+        super(SimpleReadOnlyNovaManageTest, cls).setUpClass()
+
     def test_admin_fake_action(self):
         self.assertRaises(subprocess.CalledProcessError,
                           self.nova_manage,
diff --git a/tempest/clients.py b/tempest/clients.py
index 4c40ce0..f8361af 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -13,11 +13,11 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.common.rest_client import NegativeRestClient
 from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.services.baremetal.v1.client_json import BaremetalClientJSON
-from tempest.services.baremetal.v1.client_xml import BaremetalClientXML
 from tempest.services import botoclients
 from tempest.services.compute.json.aggregates_client import \
     AggregatesClientJSON
@@ -175,7 +175,7 @@
     """
 
     def __init__(self, username=None, password=None, tenant_name=None,
-                 interface='json'):
+                 interface='json', service=None):
         """
         We allow overriding of the credentials used within the various
         client classes managed by the Manager object. Left as None, the
@@ -185,7 +185,6 @@
         :param password: Override of the password
         :param tenant_name: Override of the tenant name
         """
-        self.config = CONF
         # If no creds are provided, we fall back on the defaults
         # in the config file for the Compute API.
         self.username = username or CONF.identity.username
@@ -202,12 +201,12 @@
         self.auth_url = CONF.identity.uri
         self.auth_url_v3 = CONF.identity.uri_v3
 
-        client_args = (CONF, self.username, self.password,
+        client_args = (self.username, self.password,
                        self.auth_url, self.tenant_name)
 
         if self.auth_url_v3:
             auth_version = 'v3'
-            client_args_v3_auth = (CONF, self.username,
+            client_args_v3_auth = (self.username,
                                    self.password, self.auth_url_v3,
                                    self.tenant_name, auth_version)
         else:
@@ -217,7 +216,6 @@
 
         if interface == 'xml':
             self.certificates_client = CertificatesClientXML(*client_args)
-            self.baremetal_client = BaremetalClientXML(*client_args)
             self.servers_client = ServersClientXML(*client_args)
             self.limits_client = LimitsClientXML(*client_args)
             self.images_client = ImagesClientXML(*client_args)
@@ -233,7 +231,7 @@
             self.volume_types_client = VolumeTypesClientXML(*client_args)
             self.identity_client = IdentityClientXML(*client_args)
             self.identity_v3_client = IdentityV3ClientXML(*client_args)
-            self.token_client = TokenClientXML(CONF)
+            self.token_client = TokenClientXML()
             self.security_groups_client = SecurityGroupsClientXML(
                 *client_args)
             self.interfaces_client = InterfacesClientXML(*client_args)
@@ -289,7 +287,7 @@
             self.volume_types_client = VolumeTypesClientJSON(*client_args)
             self.identity_client = IdentityClientJSON(*client_args)
             self.identity_v3_client = IdentityV3ClientJSON(*client_args)
-            self.token_client = TokenClientJSON(CONF)
+            self.token_client = TokenClientJSON()
             self.security_groups_client = SecurityGroupsClientJSON(
                 *client_args)
             self.interfaces_v3_client = InterfacesV3ClientJSON(*client_args)
@@ -326,10 +324,15 @@
             self.hosts_v3_client = HostsV3ClientJSON(*client_args)
             if CONF.service_available.ceilometer:
                 self.telemetry_client = TelemetryClientJSON(*client_args)
+            self.negative_client = NegativeRestClient(*client_args)
+            self.negative_client.service = service
 
             if client_args_v3_auth:
                 self.servers_client_v3_auth = ServersClientJSON(
                     *client_args_v3_auth)
+                self.negative_v3_client = NegativeRestClient(
+                    *client_args_v3_auth)
+                self.negative_v3_client.service = service
         else:
             msg = "Unsupported interface type `%s'" % interface
             raise exceptions.InvalidConfiguration(msg)
@@ -357,11 +360,12 @@
     managed client objects
     """
 
-    def __init__(self, interface='json'):
+    def __init__(self, interface='json', service=None):
         super(AltManager, self).__init__(CONF.identity.alt_username,
                                          CONF.identity.alt_password,
                                          CONF.identity.alt_tenant_name,
-                                         interface=interface)
+                                         interface=interface,
+                                         service=service)
 
 
 class AdminManager(Manager):
@@ -371,11 +375,12 @@
     managed client objects
     """
 
-    def __init__(self, interface='json'):
+    def __init__(self, interface='json', service=None):
         super(AdminManager, self).__init__(CONF.identity.admin_username,
                                            CONF.identity.admin_password,
                                            CONF.identity.admin_tenant_name,
-                                           interface=interface)
+                                           interface=interface,
+                                           service=service)
 
 
 class ComputeAdminManager(Manager):
@@ -385,12 +390,13 @@
     managed client objects
     """
 
-    def __init__(self, interface='json'):
+    def __init__(self, interface='json', service=None):
         base = super(ComputeAdminManager, self)
         base.__init__(CONF.compute_admin.username,
                       CONF.compute_admin.password,
                       CONF.compute_admin.tenant_name,
-                      interface=interface)
+                      interface=interface,
+                      service=service)
 
 
 class OrchestrationManager(Manager):
@@ -398,9 +404,10 @@
     Manager object that uses the admin credentials for its
     so that heat templates can create users
     """
-    def __init__(self, interface='json'):
+    def __init__(self, interface='json', service=None):
         base = super(OrchestrationManager, self)
         base.__init__(CONF.identity.admin_username,
                       CONF.identity.admin_password,
                       CONF.identity.tenant_name,
-                      interface=interface)
+                      interface=interface,
+                      service=service)
diff --git a/tempest/common/commands.py b/tempest/common/commands.py
index af7a692..6405eaa 100644
--- a/tempest/common/commands.py
+++ b/tempest/common/commands.py
@@ -29,7 +29,8 @@
     subprocess_args = {'stdout': subprocess.PIPE,
                        'stderr': subprocess.STDOUT}
     try:
-        proc = subprocess.Popen(['/usr/bin/sudo'] + args, **subprocess_args)
+        proc = subprocess.Popen(['/usr/bin/sudo', '-n'] + args,
+                                **subprocess_args)
         return proc.communicate()[0]
         if proc.returncode != 0:
             LOG.error(cmd + "returned with: " +
diff --git a/tempest/common/custom_matchers.py b/tempest/common/custom_matchers.py
index a02c967..4a7921f 100644
--- a/tempest/common/custom_matchers.py
+++ b/tempest/common/custom_matchers.py
@@ -131,6 +131,8 @@
                 return InvalidFormat(key, value)
             elif key == 'etag' and not value.isalnum():
                 return InvalidFormat(key, value)
+            elif key == 'transfer-encoding' and not value == 'chunked':
+                return InvalidFormat(key, value)
 
         return None
 
diff --git a/tempest/common/generate_json.py b/tempest/common/generate_json.py
new file mode 100644
index 0000000..0a0afe4
--- /dev/null
+++ b/tempest/common/generate_json.py
@@ -0,0 +1,239 @@
+# Copyright 2014 Red Hat, Inc. & 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 copy
+import jsonschema
+
+from tempest.openstack.common import log as logging
+
+LOG = logging.getLogger(__name__)
+
+
+def generate_valid(schema):
+    """
+    Create a valid dictionary based on the types in a json schema.
+    """
+    LOG.debug("generate_valid: %s" % schema)
+    schema_type = schema["type"]
+    if isinstance(schema_type, list):
+        # Just choose the first one since all are valid.
+        schema_type = schema_type[0]
+    return type_map_valid[schema_type](schema)
+
+
+def generate_valid_string(schema):
+    size = schema.get("minLength", 0)
+    # TODO(dkr mko): handle format and pattern
+    return "x" * size
+
+
+def generate_valid_integer(schema):
+    # TODO(dkr mko): handle multipleOf
+    if "minimum" in schema:
+        minimum = schema["minimum"]
+        if "exclusiveMinimum" not in schema:
+            return minimum
+        else:
+            return minimum + 1
+    if "maximum" in schema:
+        maximum = schema["maximum"]
+        if "exclusiveMaximum" not in schema:
+            return maximum
+        else:
+            return maximum - 1
+    return 0
+
+
+def generate_valid_object(schema):
+    obj = {}
+    for k, v in schema["properties"].iteritems():
+        obj[k] = generate_valid(v)
+    return obj
+
+
+def generate_invalid(schema):
+    """
+    Generate an invalid json dictionary based on a schema.
+    Only one value is mis-generated for each dictionary created.
+
+    Any generator must return a list of tuples or a single tuple.
+    The values of this tuple are:
+      result[0]: Name of the test
+      result[1]: json schema for the test
+      result[2]: expected result of the test (can be None)
+    """
+    LOG.debug("generate_invalid: %s" % schema)
+    schema_type = schema["type"]
+    if isinstance(schema_type, list):
+        if "integer" in schema_type:
+            schema_type = "integer"
+        else:
+            raise Exception("non-integer list types not supported")
+    result = []
+    for generator in type_map_invalid[schema_type]:
+        ret = generator(schema)
+        if ret is not None:
+            if isinstance(ret, list):
+                result.extend(ret)
+            elif isinstance(ret, tuple):
+                result.append(ret)
+            else:
+                raise Exception("generator (%s) returns invalid result"
+                                % generator)
+    LOG.debug("result: %s" % result)
+    return result
+
+
+def _check_for_expected_result(name, schema):
+    expected_result = None
+    if "results" in schema:
+        if name in schema["results"]:
+            expected_result = schema["results"][name]
+    return expected_result
+
+
+def generator(fn):
+    """
+    Decorator for simple generators that simply return one value
+    """
+    def wrapped(schema):
+        result = fn(schema)
+        if result is not None:
+            expected_result = _check_for_expected_result(fn.__name__, schema)
+            return (fn.__name__, result, expected_result)
+        return
+    return wrapped
+
+
+@generator
+def gen_int(_):
+    return 4
+
+
+@generator
+def gen_string(_):
+    return "XXXXXX"
+
+
+def gen_none(schema):
+    # Note(mkoderer): it's not using the decorator otherwise it'd be filtered
+    expected_result = _check_for_expected_result('gen_none', schema)
+    return ('gen_none', None, expected_result)
+
+
+@generator
+def gen_str_min_length(schema):
+    min_length = schema.get("minLength", 0)
+    if min_length > 0:
+        return "x" * (min_length - 1)
+
+
+@generator
+def gen_str_max_length(schema):
+    max_length = schema.get("maxLength", -1)
+    if max_length > -1:
+        return "x" * (max_length + 1)
+
+
+@generator
+def gen_int_min(schema):
+    if "minimum" in schema:
+        minimum = schema["minimum"]
+        if "exclusiveMinimum" not in schema:
+            minimum -= 1
+        return minimum
+
+
+@generator
+def gen_int_max(schema):
+    if "maximum" in schema:
+        maximum = schema["maximum"]
+        if "exclusiveMaximum" not in schema:
+            maximum += 1
+        return maximum
+
+
+def gen_obj_remove_attr(schema):
+    invalids = []
+    valid = generate_valid(schema)
+    required = schema.get("required", [])
+    for r in required:
+        new_valid = copy.deepcopy(valid)
+        del new_valid[r]
+        invalids.append(("gen_obj_remove_attr", new_valid, None))
+    return invalids
+
+
+@generator
+def gen_obj_add_attr(schema):
+    valid = generate_valid(schema)
+    if not schema.get("additionalProperties", True):
+        new_valid = copy.deepcopy(valid)
+        new_valid["$$$$$$$$$$"] = "xxx"
+        return new_valid
+
+
+def gen_inv_prop_obj(schema):
+    LOG.debug("generate_invalid_object: %s" % schema)
+    valid = generate_valid(schema)
+    invalids = []
+    properties = schema["properties"]
+
+    for k, v in properties.iteritems():
+        for invalid in generate_invalid(v):
+            LOG.debug(v)
+            new_valid = copy.deepcopy(valid)
+            new_valid[k] = invalid[1]
+            name = "prop_%s_%s" % (k, invalid[0])
+            invalids.append((name, new_valid, invalid[2]))
+
+    LOG.debug("generate_invalid_object return: %s" % invalids)
+    return invalids
+
+
+type_map_valid = {"string": generate_valid_string,
+                  "integer": generate_valid_integer,
+                  "object": generate_valid_object}
+
+type_map_invalid = {"string": [gen_int,
+                               gen_none,
+                               gen_str_min_length,
+                               gen_str_max_length],
+                    "integer": [gen_string,
+                                gen_none,
+                                gen_int_min,
+                                gen_int_max],
+                    "object": [gen_obj_remove_attr,
+                               gen_obj_add_attr,
+                               gen_inv_prop_obj]}
+
+schema = {"type": "object",
+          "properties":
+          {"name": {"type": "string"},
+           "http-method": {"enum": ["GET", "PUT", "HEAD",
+                                    "POST", "PATCH", "DELETE", 'COPY']},
+           "url": {"type": "string"},
+           "json-schema": jsonschema._utils.load_schema("draft4"),
+           "resources": {"type": "array", "items": {"type": "string"}},
+           "results": {"type": "object",
+                       "properties": {}}
+           },
+          "required": ["name", "http-method", "url"],
+          "additionalProperties": False,
+          }
+
+
+def validate_negative_test_schema(nts):
+    jsonschema.validate(nts, schema)
diff --git a/tempest/common/glance_http.py b/tempest/common/glance_http.py
index 2ce05ee..d8afab3 100644
--- a/tempest/common/glance_http.py
+++ b/tempest/common/glance_http.py
@@ -354,7 +354,7 @@
             # file. Closing socket too soon will cause response
             # reads to fail with socket IO error 'Bad file descriptor'.
             self.sock = None
-        super(VerifiedHTTPSConnection, self).close()
+        httplib.HTTPSConnection.close(self)
 
 
 class ResponseBodyIterator(object):
diff --git a/tempest/common/isolated_creds.py b/tempest/common/isolated_creds.py
index ea614c3..146fac9 100644
--- a/tempest/common/isolated_creds.py
+++ b/tempest/common/isolated_creds.py
@@ -146,18 +146,28 @@
         else:
             self.identity_admin_client.tenants.delete(tenant)
 
-    def _create_creds(self, suffix=None, admin=False):
-        data_utils.rand_name_root = data_utils.rand_name(self.name)
-        if suffix:
-            data_utils.rand_name_root += suffix
-        tenant_name = data_utils.rand_name_root + "-tenant"
+    def _create_creds(self, suffix="", admin=False):
+        """Create random credentials under the following schema.
+
+        If the name contains a '.' is the full class path of something, and
+        we don't really care. If it isn't, it's probably a meaningful name,
+        so use it.
+
+        For logging purposes, -user and -tenant are long and redundant,
+        don't use them. The user# will be sufficient to figure it out.
+        """
+        if '.' in self.name:
+            root = ""
+        else:
+            root = self.name
+
+        tenant_name = data_utils.rand_name(root) + suffix
         tenant_desc = tenant_name + "-desc"
         tenant = self._create_tenant(name=tenant_name,
                                      description=tenant_desc)
-        if suffix:
-            data_utils.rand_name_root += suffix
-        username = data_utils.rand_name_root + "-user"
-        email = data_utils.rand_name_root + "@example.com"
+
+        username = data_utils.rand_name(root) + suffix
+        email = data_utils.rand_name(root) + suffix + "@example.com"
         user = self._create_user(username, self.password,
                                  tenant, email)
         if admin:
@@ -462,7 +472,11 @@
         net_client = self.network_admin_client
         for cred in self.isolated_net_resources:
             network, subnet, router = self.isolated_net_resources.get(cred)
-            if self.network_resources.get('router'):
+            LOG.debug("Clearing network: %(network)s, "
+                      "subnet: %(subnet)s, router: %(router)s",
+                      {'network': network, 'subnet': subnet, 'router': router})
+            if (not self.network_resources or
+                self.network_resources.get('router')):
                 try:
                     if self.tempest_client:
                         net_client.remove_router_interface_with_subnet_id(
@@ -475,13 +489,16 @@
                              router['name'])
                     pass
                 self._clear_isolated_router(router['id'], router['name'])
-            if self.network_resources.get('network'):
+            if (not self.network_resources or
+                self.network_resources.get('network')):
                 # TODO(mlavalle) This method call will be removed once patch
                 # https://review.openstack.org/#/c/46563/ merges in Neutron
                 self._cleanup_ports(network['id'])
-            if self.network_resources.get('subnet'):
+            if (not self.network_resources or
+                self.network_resources.get('subnet')):
                 self._clear_isolated_subnet(subnet['id'], subnet['name'])
-            if self.network_resources.get('network'):
+            if (not self.network_resources or
+                self.network_resources.get('network')):
                 self._clear_isolated_network(network['id'], network['name'])
 
     def clear_isolated_creds(self):
diff --git a/tempest/common/rest_client.py b/tempest/common/rest_client.py
index a90c924..d80d4c0 100644
--- a/tempest/common/rest_client.py
+++ b/tempest/common/rest_client.py
@@ -22,10 +22,13 @@
 import time
 
 from tempest.common import http
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 # redrive rate limited calls at most twice
 MAX_RECURSION_DEPTH = 2
 TOKEN_CHARS_RE = re.compile('^[-A-Za-z0-9+/=]*$')
@@ -38,9 +41,8 @@
     TYPE = "json"
     LOG = logging.getLogger(__name__)
 
-    def __init__(self, config, user, password, auth_url, tenant_name=None,
+    def __init__(self, user, password, auth_url, tenant_name=None,
                  auth_version='v2'):
-        self.config = config
         self.user = user
         self.password = password
         self.auth_url = auth_url
@@ -51,21 +53,21 @@
         self.token = None
         self.base_url = None
         self.region = {}
-        for cfgname in dir(self.config):
+        for cfgname in dir(CONF):
             # Find all config.FOO.catalog_type and assume FOO is a service.
-            cfg = getattr(self.config, cfgname)
+            cfg = getattr(CONF, cfgname)
             catalog_type = getattr(cfg, 'catalog_type', None)
             if not catalog_type:
                 continue
             service_region = getattr(cfg, 'region', None)
             if not service_region:
-                service_region = self.config.identity.region
+                service_region = CONF.identity.region
             self.region[catalog_type] = service_region
         self.endpoint_url = 'publicURL'
         self.headers = {'Content-Type': 'application/%s' % self.TYPE,
                         'Accept': 'application/%s' % self.TYPE}
-        self.build_interval = config.compute.build_interval
-        self.build_timeout = config.compute.build_timeout
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
         self.general_header_lc = set(('cache-control', 'connection',
                                       'date', 'pragma', 'trailer',
                                       'transfer-encoding', 'via',
@@ -74,18 +76,18 @@
                                        'location', 'proxy-authenticate',
                                        'retry-after', 'server',
                                        'vary', 'www-authenticate'))
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         self.http_obj = http.ClosingHttp(
             disable_ssl_certificate_validation=dscv)
 
     def __str__(self):
         STRING_LIMIT = 80
-        str_format = ("config:%s, user:%s, password:%s, "
+        str_format = ("user:%s, password:%s, "
                       "auth_url:%s, tenant_name:%s, auth_version:%s, "
                       "service:%s, base_url:%s, region:%s, "
                       "endpoint_url:%s, build_interval:%s, build_timeout:%s"
                       "\ntoken:%s..., \nheaders:%s...")
-        return str_format % (self.config, self.user, self.password,
+        return str_format % (self.user, self.password,
                              self.auth_url, self.tenant_name,
                              self.auth_version, self.service,
                              self.base_url, self.region, self.endpoint_url,
@@ -126,21 +128,6 @@
 
         return self.token
 
-    def basic_auth(self, user, password, auth_url):
-        """
-        Provides authentication for the target API.
-        """
-
-        params = {}
-        params['headers'] = {'User-Agent': 'Test-Client', 'X-Auth-User': user,
-                             'X-Auth-Key': password}
-
-        resp, body = self.http_obj.request(auth_url, 'GET', **params)
-        try:
-            return resp['x-auth-token'], resp['x-server-management-url']
-        except Exception:
-            raise
-
     def keystone_auth(self, user, password, auth_url, service, tenant_name):
         """
         Provides authentication via Keystone using v2 identity API.
@@ -274,7 +261,8 @@
 
         elif resp.status == 401:
             raise exceptions.AuthenticationFailure(user=user,
-                                                   password=password)
+                                                   password=password,
+                                                   tenant=project_name)
         else:
             self.LOG.error("Failed to obtain token using V3 authentication"
                            " (auth URL is '%s'), the response status is %s" %
@@ -303,8 +291,8 @@
     def get(self, url, headers=None):
         return self.request('GET', url, headers)
 
-    def delete(self, url, headers=None):
-        return self.request('DELETE', url, headers)
+    def delete(self, url, headers=None, body=None):
+        return self.request('DELETE', url, headers, body)
 
     def patch(self, url, body, headers):
         return self.request('PATCH', url, headers, body)
@@ -571,3 +559,33 @@
                 'retry-after' not in resp):
             return True
         return 'exceed' in resp_body.get('message', 'blabla')
+
+
+class NegativeRestClient(RestClient):
+    """
+    Version of RestClient that does not raise exceptions.
+    """
+    def _error_checker(self, method, url,
+                       headers, body, resp, resp_body):
+        pass
+
+    def send_request(self, method, url_template, resources, body=None):
+        url = url_template % tuple(resources)
+        if method == "GET":
+            resp, body = self.get(url)
+        elif method == "POST":
+            resp, body = self.post(url, body, self.headers)
+        elif method == "PUT":
+            resp, body = self.put(url, body, self.headers)
+        elif method == "PATCH":
+            resp, body = self.patch(url, body, self.headers)
+        elif method == "HEAD":
+            resp, body = self.head(url)
+        elif method == "DELETE":
+            resp, body = self.delete(url)
+        elif method == "COPY":
+            resp, body = self.copy(url)
+        else:
+            assert False
+
+        return resp, body
diff --git a/tempest/common/utils/data_utils.py b/tempest/common/utils/data_utils.py
index 2b2963c..cd32720 100644
--- a/tempest/common/utils/data_utils.py
+++ b/tempest/common/utils/data_utils.py
@@ -30,8 +30,12 @@
     return uuid.uuid4().hex
 
 
-def rand_name(name='test'):
-    return name + "-tempest-" + str(random.randint(1, 0x7fffffff))
+def rand_name(name=''):
+    randbits = str(random.randint(1, 0x7fffffff))
+    if name:
+        return name + '-' + randbits
+    else:
+        return randbits
 
 
 def rand_int_id(start=0, end=0x7fffffff):
diff --git a/tempest/common/utils/linux/remote_client.py b/tempest/common/utils/linux/remote_client.py
index 5276d49..bb2fcfb 100644
--- a/tempest/common/utils/linux/remote_client.py
+++ b/tempest/common/utils/linux/remote_client.py
@@ -14,7 +14,6 @@
 import time
 
 from tempest.common.ssh import Client
-from tempest.common import utils
 from tempest import config
 from tempest.exceptions import ServerUnreachable
 
@@ -76,11 +75,10 @@
         return output
 
     def get_boot_time(self):
-        cmd = 'date -d "`cut -f1 -d. /proc/uptime` seconds ago" \
-            "+%Y-%m-%d %H:%M:%S"'
-        boot_time_string = self.ssh_client.exec_command(cmd)
-        boot_time_string = boot_time_string.replace('\n', '')
-        return time.strptime(boot_time_string, utils.LAST_REBOOT_TIME_FORMAT)
+        cmd = 'cut -f1 -d. /proc/uptime'
+        boot_secs = self.ssh_client.exec_command(cmd)
+        boot_time = time.time() - int(boot_secs)
+        return time.localtime(boot_time)
 
     def write_to_console(self, message):
         message = re.sub("([$\\`])", "\\\\\\\\\\1", message)
diff --git a/tempest/config.py b/tempest/config.py
index 5a9199d..ccb3125 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -667,7 +667,7 @@
                default='^cirros-0.3.1-x86_64-uec$',
                help="Matching images become parameters for scenario tests"),
     cfg.StrOpt('flavor_regex',
-               default='^m1.(micro|nano|tiny)$',
+               default='^m1.nano$',
                help="Matching flavors become parameters for scenario tests"),
     cfg.StrOpt('non_ssh_image_regex',
                default='^.*[Ww]in.*$',
@@ -689,6 +689,20 @@
                help="Catalog type of the baremetal provisioning service."),
 ]
 
+cli_group = cfg.OptGroup(name='cli', title="cli Configuration Options")
+
+CLIGroup = [
+    cfg.BoolOpt('enabled',
+                default=True,
+                help="enable cli tests"),
+    cfg.StrOpt('cli_dir',
+               default='/usr/local/bin',
+               help="directory where python client binaries are located"),
+    cfg.IntOpt('timeout',
+               default=15,
+               help="Number of seconds to wait on a CLI timeout"),
+]
+
 
 # this should never be called outside of this class
 class TempestConfigPrivate(object):
@@ -713,9 +727,7 @@
 
         path = os.path.join(conf_dir, conf_file)
 
-        if not (os.path.isfile(path) or
-                'TEMPEST_CONFIG_DIR' in os.environ or
-                'TEMPEST_CONFIG' in os.environ):
+        if not os.path.isfile(path):
             path = failsafe_path
 
         # only parse the config file if we expect one to exist. This is needed
@@ -759,6 +771,7 @@
         register_opt_group(cfg.CONF, debug_group, DebugGroup)
         register_opt_group(cfg.CONF, baremetal_group, BaremetalGroup)
         register_opt_group(cfg.CONF, input_scenario_group, InputScenarioGroup)
+        register_opt_group(cfg.CONF, cli_group, CLIGroup)
         self.compute = cfg.CONF.compute
         self.compute_feature_enabled = cfg.CONF['compute-feature-enabled']
         self.identity = cfg.CONF.identity
@@ -784,6 +797,7 @@
         self.debug = cfg.CONF.debug
         self.baremetal = cfg.CONF.baremetal
         self.input_scenario = cfg.CONF['input-scenario']
+        self.cli = cfg.CONF.cli
         if not self.compute_admin.username:
             self.compute_admin.username = self.identity.admin_username
             self.compute_admin.password = self.identity.admin_password
diff --git a/tempest/exceptions.py b/tempest/exceptions.py
index 809037d..3b3f3eb 100644
--- a/tempest/exceptions.py
+++ b/tempest/exceptions.py
@@ -123,8 +123,7 @@
 
 
 class RateLimitExceeded(TempestException):
-    message = ("Rate limit exceeded.\nMessage: %(message)s\n"
-               "Details: %(details)s")
+    message = "Rate limit exceeded"
 
 
 class OverLimit(TempestException):
@@ -162,10 +161,6 @@
     message = "The server is not reachable via the configured network"
 
 
-class SQLException(TempestException):
-    message = "SQL error: %(message)s"
-
-
 class TearDownException(TempestException):
     message = "%(num)d cleanUp operation failed"
 
diff --git a/tempest/manager.py b/tempest/manager.py
index cba6ba5..93ff10f 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest import config
 from tempest import exceptions
 
 
@@ -27,7 +26,6 @@
     """
 
     def __init__(self):
-        self.config = config.CONF
         self.client_attr_names = []
 
     # we do this everywhere, have it be part of the super class
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 04882f3..59a3aeb 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -35,11 +35,13 @@
 from tempest.common import isolated_creds
 from tempest.common.utils import data_utils
 from tempest.common.utils.linux.remote_client import RemoteClient
+from tempest import config
 from tempest import exceptions
 import tempest.manager
 from tempest.openstack.common import log
 import tempest.test
 
+CONF = config.CONF
 
 LOG = log.getLogger(__name__)
 
@@ -89,14 +91,14 @@
         # each user that operations need to be performed for.
         self._validate_credentials(username, password, tenant_name)
 
-        auth_url = self.config.identity.uri
-        dscv = self.config.identity.disable_ssl_certificate_validation
-        region = self.config.identity.region
+        auth_url = CONF.identity.uri
+        dscv = CONF.identity.disable_ssl_certificate_validation
+        region = CONF.identity.region
 
         client_args = (username, password, tenant_name, auth_url)
 
         # Create our default Nova client to use in testing
-        service_type = self.config.compute.catalog_type
+        service_type = CONF.compute.catalog_type
         return novaclient.client.Client(self.NOVACLIENT_VERSION,
                                         *client_args,
                                         service_type=service_type,
@@ -107,17 +109,17 @@
 
     def _get_image_client(self):
         token = self.identity_client.auth_token
-        region = self.config.identity.region
+        region = CONF.identity.region
         endpoint = self.identity_client.service_catalog.url_for(
             attr='region', filter_value=region,
             service_type='image', endpoint_type='publicURL')
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         return glanceclient.Client('1', endpoint=endpoint, token=token,
                                    insecure=dscv)
 
     def _get_volume_client(self, username, password, tenant_name):
-        auth_url = self.config.identity.uri
-        region = self.config.identity.region
+        auth_url = CONF.identity.uri
+        region = CONF.identity.region
         return cinderclient.client.Client(self.CINDERCLIENT_VERSION,
                                           username,
                                           password,
@@ -127,16 +129,17 @@
                                           http_log_debug=True)
 
     def _get_object_storage_client(self, username, password, tenant_name):
-        auth_url = self.config.identity.uri
-        # add current tenant to Member group.
+        auth_url = CONF.identity.uri
+        # add current tenant to swift operator role group.
         keystone_admin = self._get_identity_client(
-            self.config.identity.admin_username,
-            self.config.identity.admin_password,
-            self.config.identity.admin_tenant_name)
+            CONF.identity.admin_username,
+            CONF.identity.admin_password,
+            CONF.identity.admin_tenant_name)
 
-        # enable test user to operate swift by adding Member role to him.
+        # enable test user to operate swift by adding operator role to him.
         roles = keystone_admin.roles.list()
-        member_role = [role for role in roles if role.name == 'Member'][0]
+        operator_role = CONF.object_storage.operator_role
+        member_role = [role for role in roles if role.name == operator_role][0]
         # NOTE(maurosr): This is surrounded in the try-except block cause
         # neutron tests doesn't have tenant isolation.
         try:
@@ -153,16 +156,16 @@
     def _get_orchestration_client(self, username=None, password=None,
                                   tenant_name=None):
         if not username:
-            username = self.config.identity.admin_username
+            username = CONF.identity.admin_username
         if not password:
-            password = self.config.identity.admin_password
+            password = CONF.identity.admin_password
         if not tenant_name:
-            tenant_name = self.config.identity.tenant_name
+            tenant_name = CONF.identity.tenant_name
 
         self._validate_credentials(username, password, tenant_name)
 
         keystone = self._get_identity_client(username, password, tenant_name)
-        region = self.config.identity.region
+        region = CONF.identity.region
         token = keystone.auth_token
         try:
             endpoint = keystone.service_catalog.url_for(
@@ -184,8 +187,8 @@
         # of the identity service, so use admin credentials by default.
         self._validate_credentials(username, password, tenant_name)
 
-        auth_url = self.config.identity.uri
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        auth_url = CONF.identity.uri
+        dscv = CONF.identity.disable_ssl_certificate_validation
 
         return keystoneclient.v2_0.client.Client(username=username,
                                                  password=password,
@@ -200,14 +203,14 @@
         # preferable to authenticating as a specific user because
         # working with certain resources (public routers and networks)
         # often requires admin privileges anyway.
-        username = self.config.identity.admin_username
-        password = self.config.identity.admin_password
-        tenant_name = self.config.identity.admin_tenant_name
+        username = CONF.identity.admin_username
+        password = CONF.identity.admin_password
+        tenant_name = CONF.identity.admin_tenant_name
 
         self._validate_credentials(username, password, tenant_name)
 
-        auth_url = self.config.identity.uri
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        auth_url = CONF.identity.uri
+        dscv = CONF.identity.disable_ssl_certificate_validation
 
         return neutronclient.v2_0.client.Client(username=username,
                                                 password=password,
@@ -233,7 +236,7 @@
     def setUpClass(cls):
         super(OfficialClientTest, cls).setUpClass()
         cls.isolated_creds = isolated_creds.IsolatedCreds(
-            __name__, tempest_client=False,
+            cls.__name__, tempest_client=False,
             network_resources=cls.network_resources)
 
         username, password, tenant_name = cls.credentials()
@@ -251,12 +254,12 @@
 
     @classmethod
     def _get_credentials(cls, get_creds, prefix):
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             username, tenant_name, password = get_creds()
         else:
-            username = getattr(cls.config.identity, prefix + 'username')
-            password = getattr(cls.config.identity, prefix + 'password')
-            tenant_name = getattr(cls.config.identity, prefix + 'tenant_name')
+            username = getattr(CONF.identity, prefix + 'username')
+            password = getattr(CONF.identity, prefix + 'password')
+            tenant_name = getattr(CONF.identity, prefix + 'tenant_name')
         return username, password, tenant_name
 
     @classmethod
@@ -394,7 +397,8 @@
             if new_status.lower() == error_status.lower():
                 message = ("%s failed to get to expected status. "
                            "In %s state.") % (thing, new_status)
-                raise exceptions.BuildErrorException(message)
+                raise exceptions.BuildErrorException(message,
+                                                     server_id=thing_id)
             elif new_status == expected_status and expected_status is not None:
                 return True  # All good.
             LOG.debug("Waiting for %s to get to %s status. "
@@ -402,8 +406,8 @@
                       thing, log_status, new_status)
         if not tempest.test.call_until_true(
             check_status,
-            self.config.compute.build_timeout,
-            self.config.compute.build_interval):
+            CONF.compute.build_timeout,
+            CONF.compute.build_interval):
             message = ("Timed out waiting for thing %s "
                        "to become %s") % (thing_id, log_status)
             raise exceptions.TimeoutException(message)
@@ -453,9 +457,9 @@
         if name is None:
             name = data_utils.rand_name('scenario-server-')
         if image is None:
-            image = self.config.compute.image_ref
+            image = CONF.compute.image_ref
         if flavor is None:
-            flavor = self.config.compute.flavor_ref
+            flavor = CONF.compute.flavor_ref
         LOG.debug("Creating a server (name: %s, image: %s, flavor: %s)",
                   name, image, flavor)
         server = client.servers.create(name, image, flavor, **create_kwargs)
@@ -518,10 +522,10 @@
         if isinstance(server_or_ip, basestring):
             ip = server_or_ip
         else:
-            network_name_for_ssh = self.config.compute.network_for_ssh
+            network_name_for_ssh = CONF.compute.network_for_ssh
             ip = server_or_ip.networks[network_name_for_ssh][0]
         if username is None:
-            username = self.config.scenario.ssh_user
+            username = CONF.scenario.ssh_user
         if private_key is None:
             private_key = self.keypair.private_key
         return RemoteClient(ip, username, pkey=private_key)
@@ -541,7 +545,7 @@
 
     @classmethod
     def check_preconditions(cls):
-        if (cls.config.service_available.neutron):
+        if (CONF.service_available.neutron):
             cls.enabled = True
             # verify that neutron_available is telling the truth
             try:
@@ -557,13 +561,13 @@
     @classmethod
     def setUpClass(cls):
         super(NetworkScenarioTest, cls).setUpClass()
-        if cls.config.compute.allow_tenant_isolation:
+        if CONF.compute.allow_tenant_isolation:
             cls.tenant_id = cls.isolated_creds.get_primary_tenant().id
         else:
             cls.tenant_id = cls.manager._get_identity_client(
-                cls.config.identity.username,
-                cls.config.identity.password,
-                cls.config.identity.tenant_name).tenant_id
+                CONF.identity.username,
+                CONF.identity.password,
+                CONF.identity.tenant_name).tenant_id
 
     def _create_network(self, tenant_id, namestart='network-smoke-'):
         name = data_utils.rand_name(namestart)
@@ -618,12 +622,12 @@
         Create a subnet for the given network within the cidr block
         configured for tenant networks.
         """
-        cfg = self.config.network
-        tenant_cidr = netaddr.IPNetwork(cfg.tenant_network_cidr)
+        tenant_cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr)
         result = None
         # Repeatedly attempt subnet creation with sequential cidr
         # blocks until an unallocated block is found.
-        for subnet_cidr in tenant_cidr.subnet(cfg.tenant_network_mask_bits):
+        for subnet_cidr in tenant_cidr.subnet(
+            CONF.network.tenant_network_mask_bits):
             body = dict(
                 subnet=dict(
                     ip_version=4,
@@ -707,7 +711,7 @@
             return (proc.returncode == 0) == should_succeed
 
         return tempest.test.call_until_true(
-            ping, self.config.compute.ping_timeout, 1)
+            ping, CONF.compute.ping_timeout, 1)
 
     def _check_vm_connectivity(self, ip_address,
                                username=None,
@@ -903,7 +907,7 @@
         return rules
 
     def _ssh_to_server(self, server, private_key):
-        ssh_login = self.config.compute.image_ssh_user
+        ssh_login = CONF.compute.image_ssh_user
         return self.get_remote_client(server,
                                       username=ssh_login,
                                       private_key=private_key)
@@ -929,8 +933,8 @@
         network has, a tenant router will be created and returned that
         routes traffic to the public network.
         """
-        router_id = self.config.network.public_router_id
-        network_id = self.config.network.public_network_id
+        router_id = CONF.network.public_router_id
+        network_id = CONF.network.public_network_id
         if router_id:
             result = self.network_client.show_router(router_id)
             return net_common.AttributeDict(**result['router'])
@@ -983,14 +987,14 @@
     @classmethod
     def setUpClass(cls):
         super(OrchestrationScenarioTest, cls).setUpClass()
-        if not cls.config.service_available.heat:
+        if not CONF.service_available.heat:
             raise cls.skipException("Heat support is required")
 
     @classmethod
     def credentials(cls):
-        username = cls.config.identity.admin_username
-        password = cls.config.identity.admin_password
-        tenant_name = cls.config.identity.tenant_name
+        username = CONF.identity.admin_username
+        password = CONF.identity.admin_password
+        tenant_name = CONF.identity.tenant_name
         return username, password, tenant_name
 
     def _load_template(self, base_file, file_name):
@@ -1007,5 +1011,5 @@
     def _get_default_network(cls):
         networks = cls.network_client.list_networks()
         for net in networks['networks']:
-            if net['name'] == cls.config.compute.fixed_network_name:
+            if net['name'] == CONF.compute.fixed_network_name:
                 return net
diff --git a/tempest/scenario/orchestration/test_autoscaling.py b/tempest/scenario/orchestration/test_autoscaling.py
index be7f955..cd7a2b2 100644
--- a/tempest/scenario/orchestration/test_autoscaling.py
+++ b/tempest/scenario/orchestration/test_autoscaling.py
@@ -13,25 +13,28 @@
 import heatclient.exc as heat_exceptions
 import time
 
+from tempest import config
 from tempest.scenario import manager
 from tempest.test import attr
 from tempest.test import call_until_true
 from tempest.test import services
 from tempest.test import skip_because
 
+CONF = config.CONF
+
 
 class AutoScalingTest(manager.OrchestrationScenarioTest):
 
     def setUp(self):
         super(AutoScalingTest, self).setUp()
-        if not self.config.orchestration.image_ref:
+        if not CONF.orchestration.image_ref:
             raise self.skipException("No image available to test")
         self.client = self.orchestration_client
 
     def assign_keypair(self):
         self.stack_name = self._stack_rand_name()
-        if self.config.orchestration.keypair_name:
-            self.keypair_name = self.config.orchestration.keypair_name
+        if CONF.orchestration.keypair_name:
+            self.keypair_name = CONF.orchestration.keypair_name
         else:
             self.keypair = self.create_keypair()
             self.keypair_name = self.keypair.id
@@ -40,8 +43,8 @@
         net = self._get_default_network()
         self.parameters = {
             'KeyName': self.keypair_name,
-            'InstanceType': self.config.orchestration.instance_type,
-            'ImageId': self.config.orchestration.image_ref,
+            'InstanceType': CONF.orchestration.instance_type,
+            'ImageId': CONF.orchestration.image_ref,
             'StackStart': str(time.time()),
             'Subnet': net['subnets'][0]
         }
@@ -58,7 +61,7 @@
 
         # if a keypair was set, do not delete the stack on exit to allow
         # for manual post-mortums
-        if not self.config.orchestration.keypair_name:
+        if not CONF.orchestration.keypair_name:
             self.set_resource('stack', self.stack)
 
     @skip_because(bug="1257575")
@@ -70,7 +73,7 @@
         self.launch_stack()
 
         sid = self.stack_identifier
-        timeout = self.config.orchestration.build_timeout
+        timeout = CONF.orchestration.build_timeout
         interval = 10
 
         self.assertEqual('CREATE', self.stack.action)
diff --git a/tempest/scenario/test_cross_tenant_connectivity.py b/tempest/scenario/test_cross_tenant_connectivity.py
index 6fd10be..edcf091 100644
--- a/tempest/scenario/test_cross_tenant_connectivity.py
+++ b/tempest/scenario/test_cross_tenant_connectivity.py
@@ -15,6 +15,7 @@
 
 from tempest.common import debug
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
@@ -23,6 +24,8 @@
 from tempest.test import call_until_true
 from tempest.test import services
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -131,8 +134,8 @@
             msg = 'No alt_tenant defined'
             cls.enabled = False
             raise cls.skipException(msg)
-        cfg = cls.config.network
-        if not (cfg.tenant_networks_reachable or cfg.public_network_id):
+        if not (CONF.network.tenant_networks_reachable or
+                CONF.network.public_network_id):
             msg = ('Either tenant_networks_reachable must be "true", or '
                    'public_network_id must be defined.')
             cls.enabled = False
@@ -166,7 +169,7 @@
         )
         for tenant in [cls.demo_tenant, cls.alt_tenant]:
             cls.tenants[tenant.tenant_id] = tenant
-        if not cls.config.network.public_router_id:
+        if not CONF.network.public_router_id:
             cls.floating_ip_access = True
         else:
             cls.floating_ip_access = False
@@ -277,7 +280,7 @@
         self._assign_floating_ips(server)
 
     def _assign_floating_ips(self, server):
-        public_network_id = self.config.network.public_network_id
+        public_network_id = CONF.network.public_network_id
         floating_ip = self._create_floating_ip(server, public_network_id)
         self.floating_ips.setdefault(server, floating_ip)
 
@@ -353,7 +356,7 @@
             return should_succeed
 
         return call_until_true(ping_remote,
-                               self.config.compute.ping_timeout,
+                               CONF.compute.ping_timeout,
                                1)
 
     def _check_connectivity(self, access_point, ip, should_succeed=True):
diff --git a/tempest/scenario/test_dashboard_basic_ops.py b/tempest/scenario/test_dashboard_basic_ops.py
index 98efcfb..19996e5 100644
--- a/tempest/scenario/test_dashboard_basic_ops.py
+++ b/tempest/scenario/test_dashboard_basic_ops.py
@@ -17,9 +17,12 @@
 
 from lxml import html
 
+from tempest import config
 from tempest.scenario import manager
 from tempest.test import services
 
+CONF = config.CONF
+
 
 class TestDashboardBasicOps(manager.OfficialClientTest):
 
@@ -35,16 +38,16 @@
         cls.set_network_resources()
         super(TestDashboardBasicOps, cls).setUpClass()
 
-        if not cls.config.service_available.horizon:
+        if not CONF.service_available.horizon:
             raise cls.skipException("Horizon support is required")
 
     def check_login_page(self):
-        response = urllib2.urlopen(self.config.dashboard.dashboard_url)
+        response = urllib2.urlopen(CONF.dashboard.dashboard_url)
         self.assertIn("<h3>Log In</h3>", response.read())
 
     def user_login(self):
         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
-        response = self.opener.open(self.config.dashboard.dashboard_url).read()
+        response = self.opener.open(CONF.dashboard.dashboard_url).read()
 
         # Grab the CSRF token and default region
         csrf_token = html.fromstring(response).xpath(
@@ -53,17 +56,17 @@
             '//input[@name="region"]/@value')[0]
 
         # Prepare login form request
-        req = urllib2.Request(self.config.dashboard.login_url)
+        req = urllib2.Request(CONF.dashboard.login_url)
         req.add_header('Content-type', 'application/x-www-form-urlencoded')
-        req.add_header('Referer', self.config.dashboard.dashboard_url)
-        params = {'username': self.config.identity.username,
-                  'password': self.config.identity.password,
+        req.add_header('Referer', CONF.dashboard.dashboard_url)
+        params = {'username': CONF.identity.username,
+                  'password': CONF.identity.password,
                   'region': region,
                   'csrfmiddlewaretoken': csrf_token}
         self.opener.open(req, urllib.urlencode(params))
 
     def check_home_page(self):
-        response = self.opener.open(self.config.dashboard.dashboard_url)
+        response = self.opener.open(CONF.dashboard.dashboard_url)
         self.assertIn('Overview', response.read())
 
     @services('dashboard')
diff --git a/tempest/scenario/test_large_ops.py b/tempest/scenario/test_large_ops.py
index 25e2dab..e8030c9 100644
--- a/tempest/scenario/test_large_ops.py
+++ b/tempest/scenario/test_large_ops.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 from tempest.test import services
 
+CONF = config.CONF
+
 
 LOG = logging.getLogger(__name__)
 
@@ -67,12 +70,9 @@
         return image.id
 
     def glance_image_create(self):
-        aki_img_path = self.config.scenario.img_dir + "/" + \
-            self.config.scenario.aki_img_file
-        ari_img_path = self.config.scenario.img_dir + "/" + \
-            self.config.scenario.ari_img_file
-        ami_img_path = self.config.scenario.img_dir + "/" + \
-            self.config.scenario.ami_img_file
+        aki_img_path = CONF.scenario.img_dir + "/" + CONF.scenario.aki_img_file
+        ari_img_path = CONF.scenario.img_dir + "/" + CONF.scenario.ari_img_file
+        ami_img_path = CONF.scenario.img_dir + "/" + CONF.scenario.ami_img_file
         LOG.debug("paths: ami: %s, ari: %s, aki: %s"
                   % (ami_img_path, ari_img_path, aki_img_path))
         kernel_id = self._image_create('scenario-aki', 'aki', aki_img_path)
@@ -87,12 +87,12 @@
     def nova_boot(self):
         name = data_utils.rand_name('scenario-server-')
         client = self.compute_client
-        flavor_id = self.config.compute.flavor_ref
+        flavor_id = CONF.compute.flavor_ref
         secgroup = self._create_security_group_nova()
         self.servers = client.servers.create(
             name=name, image=self.image,
             flavor=flavor_id,
-            min_count=self.config.scenario.large_ops_number,
+            min_count=CONF.scenario.large_ops_number,
             security_groups=[secgroup.name])
         # needed because of bug 1199788
         self.servers = [x for x in client.servers.list() if name in x.name]
@@ -102,7 +102,7 @@
 
     @services('compute', 'image')
     def test_large_ops_scenario(self):
-        if self.config.scenario.large_ops_number < 1:
+        if CONF.scenario.large_ops_number < 1:
             return
         self.glance_image_create()
         self.nova_boot()
diff --git a/tempest/scenario/test_minimum_basic.py b/tempest/scenario/test_minimum_basic.py
index 26a4dc0..846e0cc 100644
--- a/tempest/scenario/test_minimum_basic.py
+++ b/tempest/scenario/test_minimum_basic.py
@@ -14,10 +14,12 @@
 #    under the License.
 
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 from tempest.test import services
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -63,12 +65,9 @@
         return image.id
 
     def glance_image_create(self):
-        aki_img_path = self.config.scenario.img_dir + "/" + \
-            self.config.scenario.aki_img_file
-        ari_img_path = self.config.scenario.img_dir + "/" + \
-            self.config.scenario.ari_img_file
-        ami_img_path = self.config.scenario.img_dir + "/" + \
-            self.config.scenario.ami_img_file
+        aki_img_path = CONF.scenario.img_dir + "/" + CONF.scenario.aki_img_file
+        ari_img_path = CONF.scenario.img_dir + "/" + CONF.scenario.ari_img_file
+        ami_img_path = CONF.scenario.img_dir + "/" + CONF.scenario.ami_img_file
         LOG.debug("paths: ami: %s, ari: %s, aki: %s"
                   % (ami_img_path, ari_img_path, aki_img_path))
         kernel_id = self._image_create('scenario-aki', 'aki', aki_img_path)
diff --git a/tempest/scenario/test_network_basic_ops.py b/tempest/scenario/test_network_basic_ops.py
index aea5874..020a256 100644
--- a/tempest/scenario/test_network_basic_ops.py
+++ b/tempest/scenario/test_network_basic_ops.py
@@ -103,8 +103,8 @@
     @classmethod
     def check_preconditions(cls):
         super(TestNetworkBasicOps, cls).check_preconditions()
-        cfg = cls.config.network
-        if not (cfg.tenant_networks_reachable or cfg.public_network_id):
+        if not (CONF.network.tenant_networks_reachable
+                or CONF.network.public_network_id):
             msg = ('Either tenant_networks_reachable must be "true", or '
                    'public_network_id must be defined.')
             cls.enabled = False
@@ -196,7 +196,8 @@
             floating_ip = self._create_floating_ip(server, public_network_id)
             self.floating_ips[floating_ip] = server
 
-    def _check_public_network_connectivity(self, should_connect=True):
+    def _check_public_network_connectivity(self, should_connect=True,
+                                           msg=None):
         # The target login is assumed to have been configured for
         # key-based authentication by cloud-init.
         ssh_login = CONF.compute.image_ssh_user
@@ -212,7 +213,10 @@
                                             private_key,
                                             should_connect=should_connect)
         except Exception:
-            LOG.exception('Public network connectivity check failed')
+            ex_msg = 'Public network connectivity check failed'
+            if msg:
+                ex_msg += ": " + msg
+            LOG.exception(ex_msg)
             self._log_console_output(servers=self.servers.keys())
             debug.log_ip_ns()
             raise
@@ -242,6 +246,10 @@
         self._check_tenant_network_connectivity()
         self._check_public_network_connectivity(should_connect=True)
         self._disassociate_floating_ips()
-        self._check_public_network_connectivity(should_connect=False)
+        self._check_public_network_connectivity(should_connect=False,
+                                                msg="after disassociate "
+                                                    "floating ip")
         self._reassociate_floating_ips()
-        self._check_public_network_connectivity(should_connect=True)
+        self._check_public_network_connectivity(should_connect=True,
+                                                msg="after re-associate "
+                                                    "floating ip")
diff --git a/tempest/scenario/test_server_advanced_ops.py b/tempest/scenario/test_server_advanced_ops.py
index 45c24ca..9626157 100644
--- a/tempest/scenario/test_server_advanced_ops.py
+++ b/tempest/scenario/test_server_advanced_ops.py
@@ -13,10 +13,13 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 from tempest.test import services
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -34,13 +37,13 @@
         cls.set_network_resources()
         super(TestServerAdvancedOps, cls).setUpClass()
 
-        if not cls.config.compute_feature_enabled.resize:
+        if not CONF.compute_feature_enabled.resize:
             msg = "Skipping test - resize not available on this host"
             raise cls.skipException(msg)
 
-        resize_flavor = cls.config.compute.flavor_ref_alt
+        resize_flavor = CONF.compute.flavor_ref_alt
 
-        if resize_flavor == cls.config.compute.flavor_ref:
+        if resize_flavor == CONF.compute.flavor_ref:
             msg = "Skipping test - flavor_ref and flavor_ref_alt are identical"
             raise cls.skipException(msg)
 
@@ -49,7 +52,7 @@
         # We create an instance for use in this test
         instance = self.create_server()
         instance_id = instance.id
-        resize_flavor = self.config.compute.flavor_ref_alt
+        resize_flavor = CONF.compute.flavor_ref_alt
         LOG.debug("Resizing instance %s from flavor %s to flavor %s",
                   instance.id, instance.flavor, resize_flavor)
         instance.resize(resize_flavor)
diff --git a/tempest/scenario/test_server_basic_ops.py b/tempest/scenario/test_server_basic_ops.py
index 8779518..73ff6b4 100644
--- a/tempest/scenario/test_server_basic_ops.py
+++ b/tempest/scenario/test_server_basic_ops.py
@@ -15,12 +15,15 @@
 
 from tempest.common.utils import data_utils
 from tempest.common.utils import test_utils
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 from tempest.test import services
 
 import testscenarios
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 # NOTE(andreaf) - nose does not honour the load_tests protocol
@@ -56,9 +59,9 @@
         # Setup image and flavor the test instance
         # Support both configured and injected values
         if not hasattr(self, 'image_ref'):
-            self.image_ref = self.config.compute.image_ref
+            self.image_ref = CONF.compute.image_ref
         if not hasattr(self, 'flavor_ref'):
-            self.flavor_ref = self.config.compute.flavor_ref
+            self.flavor_ref = CONF.compute.flavor_ref
         self.image_utils = test_utils.ImageUtils()
         if not self.image_utils.is_flavor_enough(self.flavor_ref,
                                                  self.image_ref):
@@ -67,7 +70,7 @@
                     image=self.image_ref, flavor=self.flavor_ref
                 )
             )
-        self.run_ssh = self.config.compute.run_ssh and \
+        self.run_ssh = CONF.compute.run_ssh and \
             self.image_utils.is_sshable_image(self.image_ref)
         self.ssh_user = self.image_utils.ssh_user(self.image_ref)
         LOG.debug('Starting test for i:{image}, f:{flavor}. '
diff --git a/tempest/scenario/test_snapshot_pattern.py b/tempest/scenario/test_snapshot_pattern.py
index 5ff8642..2bb3d84 100644
--- a/tempest/scenario/test_snapshot_pattern.py
+++ b/tempest/scenario/test_snapshot_pattern.py
@@ -13,10 +13,12 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
 from tempest.openstack.common import log
 from tempest.scenario import manager
 from tempest.test import services
 
+CONF = config.CONF
 
 LOG = log.getLogger(__name__)
 
@@ -74,8 +76,8 @@
         self._create_loginable_secgroup_rule_nova()
 
         # boot a instance and create a timestamp file in it
-        server = self._boot_image(self.config.compute.image_ref)
-        if self.config.compute.use_floatingip_for_ssh:
+        server = self._boot_image(CONF.compute.image_ref)
+        if CONF.compute.use_floatingip_for_ssh:
             fip_for_server = self._create_floating_ip()
             self._set_floating_ip_to_server(server, fip_for_server)
             self._write_timestamp(fip_for_server.ip)
@@ -89,7 +91,7 @@
         server_from_snapshot = self._boot_image(snapshot_image.id)
 
         # check the existence of the timestamp file in the second instance
-        if self.config.compute.use_floatingip_for_ssh:
+        if CONF.compute.use_floatingip_for_ssh:
             fip_for_snapshot = self._create_floating_ip()
             self._set_floating_ip_to_server(server_from_snapshot,
                                             fip_for_snapshot)
diff --git a/tempest/scenario/test_stamp_pattern.py b/tempest/scenario/test_stamp_pattern.py
index 84c7096..8d043ae 100644
--- a/tempest/scenario/test_stamp_pattern.py
+++ b/tempest/scenario/test_stamp_pattern.py
@@ -18,11 +18,14 @@
 from cinderclient import exceptions as cinder_exceptions
 
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 import tempest.test
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -113,7 +116,6 @@
 
     def _wait_for_volume_availible_on_the_system(self, server_or_ip):
         ssh = self.get_remote_client(server_or_ip)
-        conf = self.config
 
         def _func():
             part = ssh.get_partitions()
@@ -121,8 +123,8 @@
             return 'vdb' in part
 
         if not tempest.test.call_until_true(_func,
-                                            conf.compute.build_timeout,
-                                            conf.compute.build_interval):
+                                            CONF.compute.build_timeout,
+                                            CONF.compute.build_interval):
             raise exceptions.TimeoutException
 
     def _create_timestamp(self, server_or_ip):
@@ -148,10 +150,10 @@
 
         # boot an instance and create a timestamp file in it
         volume = self._create_volume()
-        server = self._boot_image(self.config.compute.image_ref)
+        server = self._boot_image(CONF.compute.image_ref)
 
         # create and add floating IP to server1
-        if self.config.compute.use_floatingip_for_ssh:
+        if CONF.compute.use_floatingip_for_ssh:
             floating_ip_for_server = self._create_floating_ip()
             self._add_floating_ip(server, floating_ip_for_server)
             ip_for_server = floating_ip_for_server.ip
@@ -177,7 +179,7 @@
         server_from_snapshot = self._boot_image(snapshot_image.id)
 
         # create and add floating IP to server_from_snapshot
-        if self.config.compute.use_floatingip_for_ssh:
+        if CONF.compute.use_floatingip_for_ssh:
             floating_ip_for_snapshot = self._create_floating_ip()
             self._add_floating_ip(server_from_snapshot,
                                   floating_ip_for_snapshot)
diff --git a/tempest/scenario/test_swift_basic_ops.py b/tempest/scenario/test_swift_basic_ops.py
index 5892e1e..60df606 100644
--- a/tempest/scenario/test_swift_basic_ops.py
+++ b/tempest/scenario/test_swift_basic_ops.py
@@ -15,10 +15,13 @@
 
 
 from tempest.common.utils.data_utils import rand_name
+from tempest import config
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 from tempest.test import services
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -39,7 +42,7 @@
     def setUpClass(cls):
         cls.set_network_resources()
         super(TestSwiftBasicOps, cls).setUpClass()
-        if not cls.config.service_available.swift:
+        if not CONF.service_available.swift:
             skip_msg = ("%s skipped as swift is not available" %
                         cls.__name__)
             raise cls.skipException(skip_msg)
@@ -90,7 +93,7 @@
             for obj in not_present_obj:
                 self.assertNotIn(obj, object_list)
 
-    @services('object')
+    @services('object_storage')
     def test_swift_basic_ops(self):
         self._get_swift_stat()
         container_name = self._create_container()
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index c4f8ced..7b002eb 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -11,11 +11,12 @@
 #    under the License.
 
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.openstack.common import log
 from tempest.scenario import manager
-import tempest.test
 from tempest.test import services
 
+CONF = config.CONF
 
 LOG = log.getLogger(__name__)
 
@@ -36,7 +37,7 @@
     """
 
     def _create_volume_from_image(self):
-        img_uuid = self.config.compute.image_ref
+        img_uuid = CONF.compute.image_ref
         vol_name = data_utils.rand_name('volume-origin')
         return self.create_volume(name=vol_name, imageRef=img_uuid)
 
@@ -89,14 +90,14 @@
                                 'available')
 
     def _ssh_to_server(self, server, keypair):
-        if self.config.compute.use_floatingip_for_ssh:
+        if CONF.compute.use_floatingip_for_ssh:
             floating_ip = self.compute_client.floating_ips.create()
             fip_name = data_utils.rand_name('scenario-fip')
             self.set_resource(fip_name, floating_ip)
             server.add_floating_ip(floating_ip)
             ip = floating_ip.ip
         else:
-            network_name_for_ssh = self.config.compute.network_for_ssh
+            network_name_for_ssh = CONF.compute.network_for_ssh
             ip = server.networks[network_name_for_ssh][0]
 
         try:
@@ -126,7 +127,6 @@
         actual = self._get_content(ssh_client)
         self.assertEqual(expected, actual)
 
-    @tempest.test.skip_because(bug="1270608")
     @services('compute', 'volume', 'image')
     def test_volume_boot_pattern(self):
         keypair = self.create_keypair()
diff --git a/tempest/services/baremetal/base.py b/tempest/services/baremetal/base.py
index 74d023a..0b5426e 100644
--- a/tempest/services/baremetal/base.py
+++ b/tempest/services/baremetal/base.py
@@ -16,6 +16,9 @@
 import six
 
 from tempest.common import rest_client
+from tempest import config
+
+CONF = config.CONF
 
 
 def handle_errors(f):
@@ -44,10 +47,10 @@
 
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(BaremetalClient, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(BaremetalClient, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.baremetal.catalog_type
+        self.service = CONF.baremetal.catalog_type
         self.uri_prefix = ''
 
     def serialize(self, object_type, object_dict):
diff --git a/tempest/services/baremetal/v1/base_v1.py b/tempest/services/baremetal/v1/base_v1.py
index 5e90cd6..13693e1 100644
--- a/tempest/services/baremetal/v1/base_v1.py
+++ b/tempest/services/baremetal/v1/base_v1.py
@@ -21,8 +21,8 @@
     methods in order to send requests to Ironic.
 
     """
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(BaremetalClientV1, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(BaremetalClientV1, self).__init__(username, password,
                                                 auth_url, tenant_name)
         self.version = '1'
         self.uri_prefix = 'v%s' % self.version
diff --git a/tempest/services/baremetal/v1/client_json.py b/tempest/services/baremetal/v1/client_json.py
index f1708af..c98b20f 100644
--- a/tempest/services/baremetal/v1/client_json.py
+++ b/tempest/services/baremetal/v1/client_json.py
@@ -18,8 +18,8 @@
 class BaremetalClientJSON(base_v1.BaremetalClientV1):
     """Tempest REST client for Ironic JSON API v1."""
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(BaremetalClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(BaremetalClientJSON, self).__init__(username, password,
                                                   auth_url, tenant_name)
 
         self.serialize = lambda obj_type, obj_body: json.dumps(obj_body)
diff --git a/tempest/services/baremetal/v1/client_xml.py b/tempest/services/baremetal/v1/client_xml.py
deleted file mode 100644
index 4c214fe..0000000
--- a/tempest/services/baremetal/v1/client_xml.py
+++ /dev/null
@@ -1,55 +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 import rest_client
-from tempest.services.baremetal.v1 import base_v1 as base
-from tempest.services.compute.xml import common as xml
-
-
-class BaremetalClientXML(rest_client.RestClientXML, base.BaremetalClientV1):
-    """Tempest REST client for Ironic XML API v1."""
-
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(BaremetalClientXML, self).__init__(config, username, password,
-                                                 auth_url, tenant_name)
-
-        self.serialize = self.json_to_xml
-        self.deserialize = xml.xml_to_json
-
-    def json_to_xml(self, object_type, object_dict):
-        """
-        Brainlessly converts a specification of an object to XML string.
-
-        :param object_type: Kind of the object.
-        :param object_dict: Specification of the object attributes as a dict.
-        :return: An XML string that corresponds to the specification.
-
-        """
-        root = xml.Element(object_type)
-
-        for attr_name, value in object_dict:
-            # Handle nested dictionaries
-            if isinstance(value, dict):
-                value = self.json_to_xml(attr_name, value)
-
-            root.append(xml.Element(attr_name, value))
-
-        return str(xml.Document(root))
-
-    def _patch_request(self, resource_name, uuid, patch_object):
-        """Changes Content-Type header to application/json for jsonpatch."""
-
-        self.headers['Content-Type'] = 'application/json'
-        try:
-            super(self)._patch_request(self, resource_name, uuid, patch_object)
-        finally:
-            self.headers['Content-Type'] = 'application/xml'
diff --git a/tempest/services/botoclients.py b/tempest/services/botoclients.py
index a1e1b5c..03e87b1 100644
--- a/tempest/services/botoclients.py
+++ b/tempest/services/botoclients.py
@@ -18,25 +18,27 @@
 import types
 import urlparse
 
+from tempest import config
 from tempest import exceptions
 
 import boto
 import boto.ec2
 import boto.s3.connection
 
+CONF = config.CONF
+
 
 class BotoClientBase(object):
 
     ALLOWED_METHODS = set()
 
-    def __init__(self, config,
-                 username=None, password=None,
+    def __init__(self, username=None, password=None,
                  auth_url=None, tenant_name=None,
                  *args, **kwargs):
 
-        self.connection_timeout = str(config.boto.http_socket_timeout)
-        self.num_retries = str(config.boto.num_retries)
-        self.build_timeout = config.boto.build_timeout
+        self.connection_timeout = str(CONF.boto.http_socket_timeout)
+        self.num_retries = str(CONF.boto.num_retries)
+        self.build_timeout = CONF.boto.build_timeout
         self.ks_cred = {"username": username,
                         "password": password,
                         "auth_url": auth_url,
@@ -103,15 +105,15 @@
     def connect_method(self, *args, **kwargs):
         return boto.connect_ec2(*args, **kwargs)
 
-    def __init__(self, config, *args, **kwargs):
-        super(APIClientEC2, self).__init__(config, *args, **kwargs)
-        aws_access = config.boto.aws_access
-        aws_secret = config.boto.aws_secret
-        purl = urlparse.urlparse(config.boto.ec2_url)
+    def __init__(self, *args, **kwargs):
+        super(APIClientEC2, self).__init__(*args, **kwargs)
+        aws_access = CONF.boto.aws_access
+        aws_secret = CONF.boto.aws_secret
+        purl = urlparse.urlparse(CONF.boto.ec2_url)
 
-        region_name = config.compute.region
+        region_name = CONF.compute.region
         if not region_name:
-            region_name = config.identity.region
+            region_name = CONF.identity.region
         region = boto.ec2.regioninfo.RegionInfo(name=region_name,
                                                 endpoint=purl.hostname)
         port = purl.port
@@ -194,11 +196,11 @@
     def connect_method(self, *args, **kwargs):
         return boto.connect_s3(*args, **kwargs)
 
-    def __init__(self, config, *args, **kwargs):
-        super(ObjectClientS3, self).__init__(config, *args, **kwargs)
-        aws_access = config.boto.aws_access
-        aws_secret = config.boto.aws_secret
-        purl = urlparse.urlparse(config.boto.s3_url)
+    def __init__(self, *args, **kwargs):
+        super(ObjectClientS3, self).__init__(*args, **kwargs)
+        aws_access = CONF.boto.aws_access
+        aws_secret = CONF.boto.aws_secret
+        purl = urlparse.urlparse(CONF.boto.s3_url)
         port = purl.port
         if port is None:
             if purl.scheme is not "https":
diff --git a/tempest/services/compute/json/aggregates_client.py b/tempest/services/compute/json/aggregates_client.py
index 30677b9..dc8a316 100644
--- a/tempest/services/compute/json/aggregates_client.py
+++ b/tempest/services/compute/json/aggregates_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class AggregatesClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AggregatesClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AggregatesClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_aggregates(self):
         """Get aggregate list."""
diff --git a/tempest/services/compute/json/availability_zone_client.py b/tempest/services/compute/json/availability_zone_client.py
index 49664c7..2b7e23c 100644
--- a/tempest/services/compute/json/availability_zone_client.py
+++ b/tempest/services/compute/json/availability_zone_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class AvailabilityZoneClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AvailabilityZoneClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AvailabilityZoneClientJSON, self).__init__(username,
                                                          password, auth_url,
                                                          tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_availability_zone_list(self):
         resp, body = self.get('os-availability-zone')
diff --git a/tempest/services/compute/json/certificates_client.py b/tempest/services/compute/json/certificates_client.py
index f4d31ed..06e2ae7 100644
--- a/tempest/services/compute/json/certificates_client.py
+++ b/tempest/services/compute/json/certificates_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class CertificatesClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(CertificatesClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(CertificatesClientJSON, self).__init__(username,
                                                      password,
                                                      auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_certificate(self, id):
         url = "os-certificates/%s" % (id)
diff --git a/tempest/services/compute/json/extensions_client.py b/tempest/services/compute/json/extensions_client.py
index ae68261..8505d93 100644
--- a/tempest/services/compute/json/extensions_client.py
+++ b/tempest/services/compute/json/extensions_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class ExtensionsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ExtensionsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ExtensionsClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_extensions(self):
         url = 'extensions'
diff --git a/tempest/services/compute/json/fixed_ips_client.py b/tempest/services/compute/json/fixed_ips_client.py
index 31754ca..19bf4e2 100644
--- a/tempest/services/compute/json/fixed_ips_client.py
+++ b/tempest/services/compute/json/fixed_ips_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class FixedIPsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FixedIPsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FixedIPsClientJSON, self).__init__(username, password,
                                                  auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_fixed_ip_details(self, fixed_ip):
         url = "os-fixed-ips/%s" % (fixed_ip)
diff --git a/tempest/services/compute/json/flavors_client.py b/tempest/services/compute/json/flavors_client.py
index 300a0de..7fcf1b2 100644
--- a/tempest/services/compute/json/flavors_client.py
+++ b/tempest/services/compute/json/flavors_client.py
@@ -17,14 +17,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class FlavorsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FlavorsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FlavorsClientJSON, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_flavors(self, params=None):
         url = 'flavors'
diff --git a/tempest/services/compute/json/floating_ips_client.py b/tempest/services/compute/json/floating_ips_client.py
index 1235dd1..7c2139d 100644
--- a/tempest/services/compute/json/floating_ips_client.py
+++ b/tempest/services/compute/json/floating_ips_client.py
@@ -17,14 +17,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class FloatingIPsClientJSON(RestClient):
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FloatingIPsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FloatingIPsClientJSON, self).__init__(username, password,
                                                     auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_floating_ips(self, params=None):
         """Returns a list of all floating IPs filtered by any parameters."""
diff --git a/tempest/services/compute/json/hosts_client.py b/tempest/services/compute/json/hosts_client.py
index 23cb7e9..33e5345 100644
--- a/tempest/services/compute/json/hosts_client.py
+++ b/tempest/services/compute/json/hosts_client.py
@@ -16,14 +16,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class HostsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(HostsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(HostsClientJSON, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_hosts(self, params=None):
         """Lists all hosts."""
diff --git a/tempest/services/compute/json/hypervisor_client.py b/tempest/services/compute/json/hypervisor_client.py
index c8ac951..a4d8660 100644
--- a/tempest/services/compute/json/hypervisor_client.py
+++ b/tempest/services/compute/json/hypervisor_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class HypervisorClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(HypervisorClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(HypervisorClientJSON, self).__init__(username,
                                                    password, auth_url,
                                                    tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_hypervisor_list(self):
         """List hypervisors information."""
diff --git a/tempest/services/compute/json/images_client.py b/tempest/services/compute/json/images_client.py
index d64d8d7..c9adc3f 100644
--- a/tempest/services/compute/json/images_client.py
+++ b/tempest/services/compute/json/images_client.py
@@ -18,17 +18,20 @@
 
 from tempest.common.rest_client import RestClient
 from tempest.common import waiters
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class ImagesClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ImagesClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ImagesClientJSON, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
-        self.build_interval = self.config.compute.build_interval
-        self.build_timeout = self.config.compute.build_timeout
+        self.service = CONF.compute.catalog_type
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
 
     def create_image(self, server_id, name, meta=None):
         """Creates an image of the original server."""
diff --git a/tempest/services/compute/json/instance_usage_audit_log_client.py b/tempest/services/compute/json/instance_usage_audit_log_client.py
index 97062cb..2673bd7 100644
--- a/tempest/services/compute/json/instance_usage_audit_log_client.py
+++ b/tempest/services/compute/json/instance_usage_audit_log_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class InstanceUsagesAuditLogClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
+    def __init__(self, username, password, auth_url, tenant_name=None):
         super(InstanceUsagesAuditLogClientJSON, self).__init__(
-            config, username, password, auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+            username, password, auth_url, tenant_name)
+        self.service = CONF.compute.catalog_type
 
     def list_instance_usage_audit_logs(self):
         url = 'os-instance_usage_audit_log'
diff --git a/tempest/services/compute/json/interfaces_client.py b/tempest/services/compute/json/interfaces_client.py
index 06e6476..c0a2db2 100644
--- a/tempest/services/compute/json/interfaces_client.py
+++ b/tempest/services/compute/json/interfaces_client.py
@@ -17,15 +17,18 @@
 import time
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class InterfacesClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(InterfacesClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(InterfacesClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_interfaces(self, server):
         resp, body = self.get('servers/%s/os-interface' % server)
@@ -36,11 +39,12 @@
                          fixed_ip=None):
         post_body = dict(interfaceAttachment=dict())
         if port_id:
-            post_body['port_id'] = port_id
+            post_body['interfaceAttachment']['port_id'] = port_id
         if network_id:
-            post_body['net_id'] = network_id
+            post_body['interfaceAttachment']['net_id'] = network_id
         if fixed_ip:
-            post_body['fixed_ips'] = [dict(ip_address=fixed_ip)]
+            fip = dict(ip_address=fixed_ip)
+            post_body['interfaceAttachment']['fixed_ips'] = [fip]
         post_body = json.dumps(post_body)
         resp, body = self.post('servers/%s/os-interface' % server,
                                headers=self.headers,
diff --git a/tempest/services/compute/json/keypairs_client.py b/tempest/services/compute/json/keypairs_client.py
index efd92d2..dd4e3e1 100644
--- a/tempest/services/compute/json/keypairs_client.py
+++ b/tempest/services/compute/json/keypairs_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class KeyPairsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(KeyPairsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(KeyPairsClientJSON, self).__init__(username, password,
                                                  auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_keypairs(self):
         resp, body = self.get("os-keypairs")
diff --git a/tempest/services/compute/json/limits_client.py b/tempest/services/compute/json/limits_client.py
index 525c12f..c5cc988 100644
--- a/tempest/services/compute/json/limits_client.py
+++ b/tempest/services/compute/json/limits_client.py
@@ -14,15 +14,19 @@
 #    under the License.
 
 import json
+
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class LimitsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(LimitsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(LimitsClientJSON, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_absolute_limits(self):
         resp, body = self.get("limits")
diff --git a/tempest/services/compute/json/quotas_client.py b/tempest/services/compute/json/quotas_client.py
index b6ec9b8..df12467 100644
--- a/tempest/services/compute/json/quotas_client.py
+++ b/tempest/services/compute/json/quotas_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class QuotasClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(QuotasClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(QuotasClientJSON, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_quota_set(self, tenant_id):
         """List the quota set for a tenant."""
diff --git a/tempest/services/compute/json/security_groups_client.py b/tempest/services/compute/json/security_groups_client.py
index 8a44626..299a6e6 100644
--- a/tempest/services/compute/json/security_groups_client.py
+++ b/tempest/services/compute/json/security_groups_client.py
@@ -17,16 +17,19 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class SecurityGroupsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(SecurityGroupsClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(SecurityGroupsClientJSON, self).__init__(username,
                                                        password, auth_url,
                                                        tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_security_groups(self, params=None):
         """List all security groups for a user."""
diff --git a/tempest/services/compute/json/servers_client.py b/tempest/services/compute/json/servers_client.py
index 0b9ca0e..0987f05 100644
--- a/tempest/services/compute/json/servers_client.py
+++ b/tempest/services/compute/json/servers_client.py
@@ -20,17 +20,20 @@
 
 from tempest.common.rest_client import RestClient
 from tempest.common import waiters
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class ServersClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None,
+    def __init__(self, username, password, auth_url, tenant_name=None,
                  auth_version='v2'):
-        super(ServersClientJSON, self).__init__(config, username, password,
+        super(ServersClientJSON, self).__init__(username, password,
                                                 auth_url, tenant_name,
                                                 auth_version=auth_version)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def create_server(self, name, image_ref, flavor_ref, **kwargs):
         """
diff --git a/tempest/services/compute/json/services_client.py b/tempest/services/compute/json/services_client.py
index 7829e5a..c209cf3 100644
--- a/tempest/services/compute/json/services_client.py
+++ b/tempest/services/compute/json/services_client.py
@@ -18,14 +18,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class ServicesClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ServicesClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ServicesClientJSON, self).__init__(username, password,
                                                  auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_services(self, params=None):
         url = 'os-services'
diff --git a/tempest/services/compute/json/tenant_usages_client.py b/tempest/services/compute/json/tenant_usages_client.py
index a263767..c141fa7 100644
--- a/tempest/services/compute/json/tenant_usages_client.py
+++ b/tempest/services/compute/json/tenant_usages_client.py
@@ -17,14 +17,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class TenantUsagesClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
+    def __init__(self, username, password, auth_url, tenant_name=None):
         super(TenantUsagesClientJSON, self).__init__(
-            config, username, password, auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+            username, password, auth_url, tenant_name)
+        self.service = CONF.compute.catalog_type
 
     def list_tenant_usages(self, params=None):
         url = 'os-simple-tenant-usage'
diff --git a/tempest/services/compute/json/volumes_extensions_client.py b/tempest/services/compute/json/volumes_extensions_client.py
index aa49be5..d61b8a5 100644
--- a/tempest/services/compute/json/volumes_extensions_client.py
+++ b/tempest/services/compute/json/volumes_extensions_client.py
@@ -18,18 +18,21 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class VolumesExtensionsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumesExtensionsClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumesExtensionsClientJSON, self).__init__(username,
                                                           password, auth_url,
                                                           tenant_name)
-        self.service = self.config.compute.catalog_type
-        self.build_interval = self.config.volume.build_interval
-        self.build_timeout = self.config.volume.build_timeout
+        self.service = CONF.compute.catalog_type
+        self.build_interval = CONF.volume.build_interval
+        self.build_timeout = CONF.volume.build_timeout
 
     def list_volumes(self, params=None):
         """List all the volumes created."""
diff --git a/tempest/services/compute/v3/json/aggregates_client.py b/tempest/services/compute/v3/json/aggregates_client.py
index 5fef3ba..f3824f8 100644
--- a/tempest/services/compute/v3/json/aggregates_client.py
+++ b/tempest/services/compute/v3/json/aggregates_client.py
@@ -16,16 +16,19 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class AggregatesV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AggregatesV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AggregatesV3ClientJSON, self).__init__(username,
                                                      password, auth_url,
                                                      tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_aggregates(self):
         """Get aggregate list."""
diff --git a/tempest/services/compute/v3/json/availability_zone_client.py b/tempest/services/compute/v3/json/availability_zone_client.py
index 97ff21c..a3f4d94 100644
--- a/tempest/services/compute/v3/json/availability_zone_client.py
+++ b/tempest/services/compute/v3/json/availability_zone_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class AvailabilityZoneV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AvailabilityZoneV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AvailabilityZoneV3ClientJSON, self).__init__(username,
                                                            password, auth_url,
                                                            tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def get_availability_zone_list(self):
         resp, body = self.get('os-availability-zone')
diff --git a/tempest/services/compute/v3/json/certificates_client.py b/tempest/services/compute/v3/json/certificates_client.py
index 7c21290..1833cb9 100644
--- a/tempest/services/compute/v3/json/certificates_client.py
+++ b/tempest/services/compute/v3/json/certificates_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class CertificatesV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(CertificatesV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(CertificatesV3ClientJSON, self).__init__(username,
                                                        password,
                                                        auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def get_certificate(self, id):
         url = "os-certificates/%s" % (id)
diff --git a/tempest/services/compute/v3/json/extensions_client.py b/tempest/services/compute/v3/json/extensions_client.py
index c508d2f..f760093 100644
--- a/tempest/services/compute/v3/json/extensions_client.py
+++ b/tempest/services/compute/v3/json/extensions_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class ExtensionsV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ExtensionsV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ExtensionsV3ClientJSON, self).__init__(username,
                                                      password, auth_url,
                                                      tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_extensions(self):
         url = 'extensions'
diff --git a/tempest/services/compute/v3/json/flavors_client.py b/tempest/services/compute/v3/json/flavors_client.py
index f8c762c..d8a54a6 100644
--- a/tempest/services/compute/v3/json/flavors_client.py
+++ b/tempest/services/compute/v3/json/flavors_client.py
@@ -17,14 +17,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class FlavorsV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FlavorsV3ClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FlavorsV3ClientJSON, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_flavors(self, params=None):
         url = 'flavors'
@@ -63,7 +66,7 @@
         if kwargs.get('swap'):
             post_body['swap'] = kwargs.get('swap')
         if kwargs.get('rxtx'):
-            post_body['rxtx_factor'] = kwargs.get('rxtx')
+            post_body['os-flavor-rxtx:rxtx_factor'] = kwargs.get('rxtx')
         if kwargs.get('is_public'):
             post_body['flavor-access:is_public'] = kwargs.get('is_public')
         post_body = json.dumps({'flavor': post_body})
diff --git a/tempest/services/compute/v3/json/hosts_client.py b/tempest/services/compute/v3/json/hosts_client.py
index 669bf59..d15b237 100644
--- a/tempest/services/compute/v3/json/hosts_client.py
+++ b/tempest/services/compute/v3/json/hosts_client.py
@@ -16,14 +16,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class HostsV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(HostsV3ClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(HostsV3ClientJSON, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_hosts(self, params=None):
         """Lists all hosts."""
diff --git a/tempest/services/compute/v3/json/hypervisor_client.py b/tempest/services/compute/v3/json/hypervisor_client.py
index d78cc5e..a4ec606 100644
--- a/tempest/services/compute/v3/json/hypervisor_client.py
+++ b/tempest/services/compute/v3/json/hypervisor_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class HypervisorV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(HypervisorV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(HypervisorV3ClientJSON, self).__init__(username,
                                                      password, auth_url,
                                                      tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def get_hypervisor_list(self):
         """List hypervisors information."""
diff --git a/tempest/services/compute/v3/json/instance_usage_audit_log_client.py b/tempest/services/compute/v3/json/instance_usage_audit_log_client.py
index c5fba48..b51f490 100644
--- a/tempest/services/compute/v3/json/instance_usage_audit_log_client.py
+++ b/tempest/services/compute/v3/json/instance_usage_audit_log_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class InstanceUsagesAuditLogV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
+    def __init__(self, username, password, auth_url, tenant_name=None):
         super(InstanceUsagesAuditLogV3ClientJSON, self).__init__(
-            config, username, password, auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+            username, password, auth_url, tenant_name)
+        self.service = CONF.compute.catalog_v3_type
 
     def list_instance_usage_audit_logs(self, time_before=None):
         if time_before:
diff --git a/tempest/services/compute/v3/json/interfaces_client.py b/tempest/services/compute/v3/json/interfaces_client.py
index 7fb0fa9..dc06395 100644
--- a/tempest/services/compute/v3/json/interfaces_client.py
+++ b/tempest/services/compute/v3/json/interfaces_client.py
@@ -17,16 +17,19 @@
 import time
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class InterfacesV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(InterfacesV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(InterfacesV3ClientJSON, self).__init__(username,
                                                      password, auth_url,
                                                      tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_interfaces(self, server):
         resp, body = self.get('servers/%s/os-attach-interfaces' % server)
@@ -35,14 +38,14 @@
 
     def create_interface(self, server, port_id=None, network_id=None,
                          fixed_ip=None):
-        post_body = dict(interface_attachment=dict())
+        post_body = dict()
         if port_id:
             post_body['port_id'] = port_id
         if network_id:
             post_body['net_id'] = network_id
         if fixed_ip:
             post_body['fixed_ips'] = [dict(ip_address=fixed_ip)]
-        post_body = json.dumps(post_body)
+        post_body = json.dumps({'interface_attachment': post_body})
         resp, body = self.post('servers/%s/os-attach-interfaces' % server,
                                headers=self.headers,
                                body=post_body)
diff --git a/tempest/services/compute/v3/json/keypairs_client.py b/tempest/services/compute/v3/json/keypairs_client.py
index 26018ae..c2efb84 100644
--- a/tempest/services/compute/v3/json/keypairs_client.py
+++ b/tempest/services/compute/v3/json/keypairs_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class KeyPairsV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(KeyPairsV3ClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(KeyPairsV3ClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_keypairs(self):
         resp, body = self.get("keypairs")
diff --git a/tempest/services/compute/v3/json/quotas_client.py b/tempest/services/compute/v3/json/quotas_client.py
index 0f0fd00..ea0d3a2 100644
--- a/tempest/services/compute/v3/json/quotas_client.py
+++ b/tempest/services/compute/v3/json/quotas_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class QuotasV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(QuotasV3ClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(QuotasV3ClientJSON, self).__init__(username, password,
                                                  auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def get_quota_set(self, tenant_id):
         """List the quota set for a tenant."""
diff --git a/tempest/services/compute/v3/json/servers_client.py b/tempest/services/compute/v3/json/servers_client.py
index ef282fa..aa8c95a 100644
--- a/tempest/services/compute/v3/json/servers_client.py
+++ b/tempest/services/compute/v3/json/servers_client.py
@@ -21,17 +21,20 @@
 
 from tempest.common.rest_client import RestClient
 from tempest.common import waiters
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class ServersV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url,
+    def __init__(self, username, password, auth_url,
                  tenant_name=None, auth_version='v2'):
-        super(ServersV3ClientJSON, self).__init__(config, username, password,
+        super(ServersV3ClientJSON, self).__init__(username, password,
                                                   auth_url, tenant_name,
                                                   auth_version=auth_version)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def create_server(self, name, image_ref, flavor_ref, **kwargs):
         """
diff --git a/tempest/services/compute/v3/json/services_client.py b/tempest/services/compute/v3/json/services_client.py
index e0c1c3c..174a4f7 100644
--- a/tempest/services/compute/v3/json/services_client.py
+++ b/tempest/services/compute/v3/json/services_client.py
@@ -18,14 +18,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class ServicesV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ServicesV3ClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ServicesV3ClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def list_services(self, params=None):
         url = 'os-services'
diff --git a/tempest/services/compute/v3/json/tenant_usages_client.py b/tempest/services/compute/v3/json/tenant_usages_client.py
index ff0251d..fbc41de 100644
--- a/tempest/services/compute/v3/json/tenant_usages_client.py
+++ b/tempest/services/compute/v3/json/tenant_usages_client.py
@@ -17,14 +17,17 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class TenantUsagesV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
+    def __init__(self, username, password, auth_url, tenant_name=None):
         super(TenantUsagesV3ClientJSON, self).__init__(
-            config, username, password, auth_url, tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+            username, password, auth_url, tenant_name)
+        self.service = CONF.compute.catalog_v3_type
 
     def list_tenant_usages(self, params=None):
         url = 'os-simple-tenant-usage'
diff --git a/tempest/services/compute/v3/json/version_client.py b/tempest/services/compute/v3/json/version_client.py
index 1773af5..419bbb8 100644
--- a/tempest/services/compute/v3/json/version_client.py
+++ b/tempest/services/compute/v3/json/version_client.py
@@ -16,15 +16,18 @@
 import json
 
 from tempest.common import rest_client
+from tempest import config
+
+CONF = config.CONF
 
 
 class VersionV3ClientJSON(rest_client.RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VersionV3ClientJSON, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VersionV3ClientJSON, self).__init__(username,
                                                   password, auth_url,
                                                   tenant_name)
-        self.service = self.config.compute.catalog_v3_type
+        self.service = CONF.compute.catalog_v3_type
 
     def get_version(self):
         resp, body = self.get('')
diff --git a/tempest/services/compute/xml/aggregates_client.py b/tempest/services/compute/xml/aggregates_client.py
index 164a963..ddef18b 100644
--- a/tempest/services/compute/xml/aggregates_client.py
+++ b/tempest/services/compute/xml/aggregates_client.py
@@ -16,19 +16,22 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class AggregatesClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AggregatesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AggregatesClientXML, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _format_aggregate(self, g):
         agg = xml_to_json(g)
diff --git a/tempest/services/compute/xml/availability_zone_client.py b/tempest/services/compute/xml/availability_zone_client.py
index 4024d29..ac1bb4b 100644
--- a/tempest/services/compute/xml/availability_zone_client.py
+++ b/tempest/services/compute/xml/availability_zone_client.py
@@ -16,16 +16,19 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class AvailabilityZoneClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AvailabilityZoneClientXML, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AvailabilityZoneClientXML, self).__init__(username,
                                                         password, auth_url,
                                                         tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_array(self, node):
         return [xml_to_json(x) for x in node]
diff --git a/tempest/services/compute/xml/certificates_client.py b/tempest/services/compute/xml/certificates_client.py
index 682f8de..3f2438d 100644
--- a/tempest/services/compute/xml/certificates_client.py
+++ b/tempest/services/compute/xml/certificates_client.py
@@ -15,14 +15,17 @@
 
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
+
+CONF = config.CONF
 
 
 class CertificatesClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(CertificatesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(CertificatesClientXML, self).__init__(username, password,
                                                     auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_certificate(self, id):
         url = "os-certificates/%s" % (id)
diff --git a/tempest/services/compute/xml/common.py b/tempest/services/compute/xml/common.py
index 9c562b7..4def19f 100644
--- a/tempest/services/compute/xml/common.py
+++ b/tempest/services/compute/xml/common.py
@@ -112,11 +112,27 @@
     others, it requires a little hand-editing of the result.
     """
     json = {}
+    bool_flag = False
+    int_flag = False
+    long_flag = False
     for attr in node.keys():
         if not attr.startswith("xmlns"):
             json[attr] = node.get(attr)
+            if json[attr] == 'bool':
+                bool_flag = True
+            elif json[attr] == 'int':
+                int_flag = True
+            elif json[attr] == 'long':
+                long_flag = True
     if not node.getchildren():
-        return node.text or json
+        if bool_flag:
+            return node.text == 'True'
+        elif int_flag:
+            return int(node.text)
+        elif long_flag:
+            return long(node.text)
+        else:
+            return node.text or json
     for child in node.getchildren():
         tag = child.tag
         if tag.startswith("{"):
diff --git a/tempest/services/compute/xml/extensions_client.py b/tempest/services/compute/xml/extensions_client.py
index b2ab9da..98cd3e3 100644
--- a/tempest/services/compute/xml/extensions_client.py
+++ b/tempest/services/compute/xml/extensions_client.py
@@ -14,16 +14,20 @@
 #    under the License.
 
 from lxml import etree
+
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class ExtensionsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ExtensionsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ExtensionsClientXML, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_array(self, node):
         array = []
diff --git a/tempest/services/compute/xml/fixed_ips_client.py b/tempest/services/compute/xml/fixed_ips_client.py
index 53482c1..f212e21 100644
--- a/tempest/services/compute/xml/fixed_ips_client.py
+++ b/tempest/services/compute/xml/fixed_ips_client.py
@@ -15,17 +15,20 @@
 
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 
+CONF = config.CONF
+
 
 class FixedIPsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FixedIPsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FixedIPsClientXML, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_fixed_ip_details(self, fixed_ip):
         url = "os-fixed-ips/%s" % (fixed_ip)
diff --git a/tempest/services/compute/xml/flavors_client.py b/tempest/services/compute/xml/flavors_client.py
index b7e63e6..74c0e47 100644
--- a/tempest/services/compute/xml/flavors_client.py
+++ b/tempest/services/compute/xml/flavors_client.py
@@ -18,12 +18,14 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
 
 XMLNS_OS_FLV_EXT_DATA = \
     "http://docs.openstack.org/compute/ext/flavor_extra_data/api/v1.1"
@@ -33,10 +35,10 @@
 
 class FlavorsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FlavorsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FlavorsClientXML, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _format_flavor(self, f):
         flavor = {'links': []}
diff --git a/tempest/services/compute/xml/floating_ips_client.py b/tempest/services/compute/xml/floating_ips_client.py
index de78b1e..bbfe86b 100644
--- a/tempest/services/compute/xml/floating_ips_client.py
+++ b/tempest/services/compute/xml/floating_ips_client.py
@@ -17,18 +17,21 @@
 import urllib
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class FloatingIPsClientXML(RestClientXML):
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(FloatingIPsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(FloatingIPsClientXML, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_array(self, node):
         array = []
diff --git a/tempest/services/compute/xml/hosts_client.py b/tempest/services/compute/xml/hosts_client.py
index e7931a3..441be0e 100644
--- a/tempest/services/compute/xml/hosts_client.py
+++ b/tempest/services/compute/xml/hosts_client.py
@@ -16,17 +16,20 @@
 
 from lxml import etree
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class HostsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(HostsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(HostsClientXML, self).__init__(username, password,
                                              auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_hosts(self, params=None):
         """Lists all hosts."""
diff --git a/tempest/services/compute/xml/hypervisor_client.py b/tempest/services/compute/xml/hypervisor_client.py
index e988a36..bee2dfd 100644
--- a/tempest/services/compute/xml/hypervisor_client.py
+++ b/tempest/services/compute/xml/hypervisor_client.py
@@ -16,16 +16,19 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class HypervisorClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(HypervisorClientXML, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(HypervisorClientXML, self).__init__(username,
                                                   password, auth_url,
                                                   tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_array(self, node):
         return [xml_to_json(x) for x in node]
diff --git a/tempest/services/compute/xml/images_client.py b/tempest/services/compute/xml/images_client.py
index 6c5a14c..98de7df 100644
--- a/tempest/services/compute/xml/images_client.py
+++ b/tempest/services/compute/xml/images_client.py
@@ -19,6 +19,7 @@
 
 from tempest.common.rest_client import RestClientXML
 from tempest.common import waiters
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
@@ -26,15 +27,17 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 
 class ImagesClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ImagesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ImagesClientXML, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
-        self.build_interval = self.config.compute.build_interval
-        self.build_timeout = self.config.compute.build_timeout
+        self.service = CONF.compute.catalog_type
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
 
     def _parse_server(self, node):
         data = xml_to_json(node)
diff --git a/tempest/services/compute/xml/instance_usage_audit_log_client.py b/tempest/services/compute/xml/instance_usage_audit_log_client.py
index 473ecd1..2e1d6c8 100644
--- a/tempest/services/compute/xml/instance_usage_audit_log_client.py
+++ b/tempest/services/compute/xml/instance_usage_audit_log_client.py
@@ -16,15 +16,18 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class InstanceUsagesAuditLogClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
+    def __init__(self, username, password, auth_url, tenant_name=None):
         super(InstanceUsagesAuditLogClientXML, self).__init__(
-            config, username, password, auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+            username, password, auth_url, tenant_name)
+        self.service = CONF.compute.catalog_type
 
     def list_instance_usage_audit_logs(self):
         url = 'os-instance_usage_audit_log'
diff --git a/tempest/services/compute/xml/interfaces_client.py b/tempest/services/compute/xml/interfaces_client.py
index a84e0bd..c90f507 100644
--- a/tempest/services/compute/xml/interfaces_client.py
+++ b/tempest/services/compute/xml/interfaces_client.py
@@ -18,19 +18,22 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class InterfacesClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(InterfacesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(InterfacesClientXML, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _process_xml_interface(self, node):
         iface = xml_to_json(node)
diff --git a/tempest/services/compute/xml/keypairs_client.py b/tempest/services/compute/xml/keypairs_client.py
index 57c4dda..da3303e 100644
--- a/tempest/services/compute/xml/keypairs_client.py
+++ b/tempest/services/compute/xml/keypairs_client.py
@@ -15,19 +15,23 @@
 
 
 from lxml import etree
+
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class KeyPairsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(KeyPairsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(KeyPairsClientXML, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_keypairs(self):
         resp, body = self.get("os-keypairs", self.headers)
diff --git a/tempest/services/compute/xml/limits_client.py b/tempest/services/compute/xml/limits_client.py
index 785d546..9233697 100644
--- a/tempest/services/compute/xml/limits_client.py
+++ b/tempest/services/compute/xml/limits_client.py
@@ -16,16 +16,19 @@
 from lxml import objectify
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
+
+CONF = config.CONF
 
 NS = "{http://docs.openstack.org/common/api/v1.0}"
 
 
 class LimitsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(LimitsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(LimitsClientXML, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def get_absolute_limits(self):
         resp, body = self.get("limits", self.headers)
diff --git a/tempest/services/compute/xml/quotas_client.py b/tempest/services/compute/xml/quotas_client.py
index f157dfb..74aad1b 100644
--- a/tempest/services/compute/xml/quotas_client.py
+++ b/tempest/services/compute/xml/quotas_client.py
@@ -16,18 +16,21 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 
 class QuotasClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(QuotasClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(QuotasClientXML, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _format_quota(self, q):
         quota = {}
diff --git a/tempest/services/compute/xml/security_groups_client.py b/tempest/services/compute/xml/security_groups_client.py
index 498922b..c32a81e 100644
--- a/tempest/services/compute/xml/security_groups_client.py
+++ b/tempest/services/compute/xml/security_groups_client.py
@@ -17,6 +17,7 @@
 import urllib
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
@@ -24,14 +25,16 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 
 class SecurityGroupsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
+    def __init__(self, username, password, auth_url, tenant_name=None):
         super(SecurityGroupsClientXML, self).__init__(
-            config, username, password,
+            username, password,
             auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_array(self, node):
         array = []
diff --git a/tempest/services/compute/xml/servers_client.py b/tempest/services/compute/xml/servers_client.py
index 63492b7..c16d4a3 100644
--- a/tempest/services/compute/xml/servers_client.py
+++ b/tempest/services/compute/xml/servers_client.py
@@ -21,6 +21,7 @@
 
 from tempest.common.rest_client import RestClientXML
 from tempest.common import waiters
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.services.compute.xml.common import Document
@@ -29,6 +30,7 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
 
 LOG = logging.getLogger(__name__)
 
@@ -139,12 +141,12 @@
 
 class ServersClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None,
+    def __init__(self, username, password, auth_url, tenant_name=None,
                  auth_version='v2'):
-        super(ServersClientXML, self).__init__(config, username, password,
+        super(ServersClientXML, self).__init__(username, password,
                                                auth_url, tenant_name,
                                                auth_version=auth_version)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_key_value(self, node):
         """Parse <foo key='key'>value</foo> data into {'key': 'value'}."""
@@ -379,7 +381,7 @@
 
             server_status = body['status']
             if server_status == 'ERROR' and not ignore_error:
-                raise exceptions.BuildErrorException
+                raise exceptions.BuildErrorException(server_id=server_id)
 
             if int(time.time()) - start_time >= self.build_timeout:
                 raise exceptions.TimeoutException
diff --git a/tempest/services/compute/xml/services_client.py b/tempest/services/compute/xml/services_client.py
index 8ef0aa8..bfc824d 100644
--- a/tempest/services/compute/xml/services_client.py
+++ b/tempest/services/compute/xml/services_client.py
@@ -17,18 +17,22 @@
 import urllib
 
 from lxml import etree
+
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class ServicesClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ServicesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ServicesClientXML, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def list_services(self, params=None):
         url = 'os-services'
diff --git a/tempest/services/compute/xml/tenant_usages_client.py b/tempest/services/compute/xml/tenant_usages_client.py
index dfa4a9f..ae813a6 100644
--- a/tempest/services/compute/xml/tenant_usages_client.py
+++ b/tempest/services/compute/xml/tenant_usages_client.py
@@ -18,16 +18,19 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class TenantUsagesClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(TenantUsagesClientXML, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(TenantUsagesClientXML, self).__init__(username,
                                                     password, auth_url,
                                                     tenant_name)
-        self.service = self.config.compute.catalog_type
+        self.service = CONF.compute.catalog_type
 
     def _parse_array(self, node):
         json = xml_to_json(node)
diff --git a/tempest/services/compute/xml/volumes_extensions_client.py b/tempest/services/compute/xml/volumes_extensions_client.py
index cb6cefc..d6723e1 100644
--- a/tempest/services/compute/xml/volumes_extensions_client.py
+++ b/tempest/services/compute/xml/volumes_extensions_client.py
@@ -19,6 +19,7 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
@@ -26,16 +27,17 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 
 class VolumesExtensionsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumesExtensionsClientXML, self).__init__(config,
-                                                         username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumesExtensionsClientXML, self).__init__(username, password,
                                                          auth_url, tenant_name)
-        self.service = self.config.compute.catalog_type
-        self.build_interval = self.config.compute.build_interval
-        self.build_timeout = self.config.compute.build_timeout
+        self.service = CONF.compute.catalog_type
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
 
     def _parse_volume(self, body):
         vol = dict((attr, body.get(attr)) for attr in body.keys())
diff --git a/tempest/services/data_processing/v1_1/client.py b/tempest/services/data_processing/v1_1/client.py
index bd147e8..a1d558a 100644
--- a/tempest/services/data_processing/v1_1/client.py
+++ b/tempest/services/data_processing/v1_1/client.py
@@ -16,13 +16,16 @@
 import json
 
 from tempest.common import rest_client
+from tempest import config
+
+CONF = config.CONF
 
 
 class DataProcessingClient(rest_client.RestClient):
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(DataProcessingClient, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(DataProcessingClient, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.data_processing.catalog_type
+        self.service = CONF.data_processing.catalog_type
 
     @classmethod
     def _request_and_parse(cls, req_fun, uri, res_name, *args, **kwargs):
diff --git a/tempest/services/identity/json/identity_client.py b/tempest/services/identity/json/identity_client.py
index a0411dc..1ed7044 100644
--- a/tempest/services/identity/json/identity_client.py
+++ b/tempest/services/identity/json/identity_client.py
@@ -14,15 +14,18 @@
 
 from tempest.common import http
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class IdentityClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(IdentityClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(IdentityClientJSON, self).__init__(username, password,
                                                  auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def has_admin_extensions(self):
@@ -239,8 +242,8 @@
 
 class TokenClientJSON(RestClient):
 
-    def __init__(self, config):
-        auth_url = config.identity.uri
+    def __init__(self):
+        auth_url = CONF.identity.uri
 
         # TODO(jaypipes) Why is this all repeated code in here?
         # Normalize URI to ensure /tokens is in it.
@@ -248,7 +251,6 @@
             auth_url = auth_url.rstrip('/') + '/tokens'
 
         self.auth_url = auth_url
-        self.config = config
 
     def auth(self, user, password, tenant):
         creds = {
@@ -267,7 +269,7 @@
 
     def request(self, method, url, headers=None, body=None):
         """A simple HTTP request interface."""
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         self.http_obj = http.ClosingHttp(
             disable_ssl_certificate_validation=dscv)
         if headers is None:
diff --git a/tempest/services/identity/v3/json/credentials_client.py b/tempest/services/identity/v3/json/credentials_client.py
index dccb9a0..1250d79 100644
--- a/tempest/services/identity/v3/json/credentials_client.py
+++ b/tempest/services/identity/v3/json/credentials_client.py
@@ -17,14 +17,17 @@
 from urlparse import urlparse
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class CredentialsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(CredentialsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(CredentialsClientJSON, self).__init__(username, password,
                                                     auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def request(self, method, url, headers=None, body=None, wait=None):
diff --git a/tempest/services/identity/v3/json/endpoints_client.py b/tempest/services/identity/v3/json/endpoints_client.py
index 124f498..bb2230b 100644
--- a/tempest/services/identity/v3/json/endpoints_client.py
+++ b/tempest/services/identity/v3/json/endpoints_client.py
@@ -17,15 +17,17 @@
 import urlparse
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class EndPointClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(EndPointClientJSON, self).__init__(config,
-                                                 username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(EndPointClientJSON, self).__init__(username, password,
                                                  auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def request(self, method, url, headers=None, body=None, wait=None):
diff --git a/tempest/services/identity/v3/json/identity_client.py b/tempest/services/identity/v3/json/identity_client.py
index c89fbcc..7dd5c6e 100644
--- a/tempest/services/identity/v3/json/identity_client.py
+++ b/tempest/services/identity/v3/json/identity_client.py
@@ -17,14 +17,17 @@
 from urlparse import urlparse
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class IdentityV3ClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(IdentityV3ClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(IdentityV3ClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def request(self, method, url, headers=None, body=None, wait=None):
@@ -459,19 +462,18 @@
 
 class V3TokenClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(V3TokenClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(V3TokenClientJSON, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
-        auth_url = config.identity.uri
+        auth_url = CONF.identity.uri
 
         if 'tokens' not in auth_url:
             auth_url = auth_url.rstrip('/') + '/tokens'
 
         self.auth_url = auth_url
-        self.config = config
 
     def auth(self, user_id, password):
         creds = {
diff --git a/tempest/services/identity/v3/json/policy_client.py b/tempest/services/identity/v3/json/policy_client.py
index 9ce6d5b..3d98d99 100644
--- a/tempest/services/identity/v3/json/policy_client.py
+++ b/tempest/services/identity/v3/json/policy_client.py
@@ -17,14 +17,17 @@
 from urlparse import urlparse
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class PolicyClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(PolicyClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(PolicyClientJSON, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def request(self, method, url, headers=None, body=None, wait=None):
diff --git a/tempest/services/identity/v3/json/service_client.py b/tempest/services/identity/v3/json/service_client.py
index e60e7e3..57b6e9e 100644
--- a/tempest/services/identity/v3/json/service_client.py
+++ b/tempest/services/identity/v3/json/service_client.py
@@ -17,14 +17,17 @@
 from urlparse import urlparse
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class ServiceClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ServiceClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ServiceClientJSON, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def request(self, method, url, headers=None, body=None, wait=None):
diff --git a/tempest/services/identity/v3/xml/credentials_client.py b/tempest/services/identity/v3/xml/credentials_client.py
index 4344db1..c8cdce7 100644
--- a/tempest/services/identity/v3/xml/credentials_client.py
+++ b/tempest/services/identity/v3/xml/credentials_client.py
@@ -19,21 +19,23 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
 
 XMLNS = "http://docs.openstack.org/identity/api/v3"
 
 
 class CredentialsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(CredentialsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(CredentialsClientXML, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def request(self, method, url, headers=None, body=None, wait=None):
diff --git a/tempest/services/identity/v3/xml/endpoints_client.py b/tempest/services/identity/v3/xml/endpoints_client.py
index bd23674..e1df3a9 100644
--- a/tempest/services/identity/v3/xml/endpoints_client.py
+++ b/tempest/services/identity/v3/xml/endpoints_client.py
@@ -18,19 +18,22 @@
 
 from tempest.common import http
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 XMLNS = "http://docs.openstack.org/identity/api/v3"
 
 
 class EndPointClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(EndPointClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(EndPointClientXML, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def _parse_array(self, node):
@@ -47,7 +50,7 @@
 
     def request(self, method, url, headers=None, body=None, wait=None):
         """Overriding the existing HTTP request in super class RestClient."""
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         self.http_obj = http.ClosingHttp(
             disable_ssl_certificate_validation=dscv)
         self._set_auth()
diff --git a/tempest/services/identity/v3/xml/identity_client.py b/tempest/services/identity/v3/xml/identity_client.py
index 579ddb8..de75fe5 100644
--- a/tempest/services/identity/v3/xml/identity_client.py
+++ b/tempest/services/identity/v3/xml/identity_client.py
@@ -18,20 +18,23 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import Text
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 XMLNS = "http://docs.openstack.org/identity/api/v3"
 
 
 class IdentityV3ClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(IdentityV3ClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(IdentityV3ClientXML, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def _parse_projects(self, node):
@@ -451,19 +454,18 @@
 
 class V3TokenClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(V3TokenClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(V3TokenClientXML, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
-        auth_url = config.identity.uri
+        auth_url = CONF.identity.uri
 
         if 'tokens' not in auth_url:
             auth_url = auth_url.rstrip('/') + '/tokens'
 
         self.auth_url = auth_url
-        self.config = config
 
     def auth(self, user_id, password):
         user = Element('user',
diff --git a/tempest/services/identity/v3/xml/policy_client.py b/tempest/services/identity/v3/xml/policy_client.py
index 7317728..54b4ad8 100644
--- a/tempest/services/identity/v3/xml/policy_client.py
+++ b/tempest/services/identity/v3/xml/policy_client.py
@@ -19,19 +19,22 @@
 
 from tempest.common import http
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 XMLNS = "http://docs.openstack.org/identity/api/v3"
 
 
 class PolicyClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(PolicyClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(PolicyClientXML, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def _parse_array(self, node):
@@ -48,7 +51,7 @@
 
     def request(self, method, url, headers=None, body=None, wait=None):
         """Overriding the existing HTTP request in super class RestClient."""
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         self.http_obj = http.ClosingHttp(
             disable_ssl_certificate_validation=dscv)
         self._set_auth()
diff --git a/tempest/services/identity/v3/xml/service_client.py b/tempest/services/identity/v3/xml/service_client.py
index a142b06..2997775 100644
--- a/tempest/services/identity/v3/xml/service_client.py
+++ b/tempest/services/identity/v3/xml/service_client.py
@@ -18,20 +18,22 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
 
 XMLNS = "http://docs.openstack.org/identity/api/v3"
 
 
 class ServiceClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ServiceClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ServiceClientXML, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def _parse_array(self, node):
diff --git a/tempest/services/identity/xml/identity_client.py b/tempest/services/identity/xml/identity_client.py
index 6e819d8..e6a7188 100644
--- a/tempest/services/identity/xml/identity_client.py
+++ b/tempest/services/identity/xml/identity_client.py
@@ -19,21 +19,23 @@
 
 from tempest.common import http
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
 
 XMLNS = "http://docs.openstack.org/identity/api/v2.0"
 
 
 class IdentityClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(IdentityClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(IdentityClientXML, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.identity.catalog_type
+        self.service = CONF.identity.catalog_type
         self.endpoint_url = 'adminURL'
 
     def _parse_array(self, node):
@@ -263,8 +265,8 @@
 
 class TokenClientXML(RestClientXML):
 
-    def __init__(self, config):
-        auth_url = config.identity.uri
+    def __init__(self):
+        auth_url = CONF.identity.uri
 
         # TODO(jaypipes) Why is this all repeated code in here?
         # Normalize URI to ensure /tokens is in it.
@@ -272,7 +274,6 @@
             auth_url = auth_url.rstrip('/') + '/tokens'
 
         self.auth_url = auth_url
-        self.config = config
 
     def auth(self, user, password, tenant):
         passwordCreds = Element("passwordCredentials",
@@ -287,7 +288,7 @@
 
     def request(self, method, url, headers=None, body=None):
         """A simple HTTP request interface."""
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         self.http_obj = http.ClosingHttp(
             disable_ssl_certificate_validation=dscv)
         if headers is None:
diff --git a/tempest/services/image/v1/json/image_client.py b/tempest/services/image/v1/json/image_client.py
index aa6abd0..a5b93a0 100644
--- a/tempest/services/image/v1/json/image_client.py
+++ b/tempest/services/image/v1/json/image_client.py
@@ -22,19 +22,22 @@
 
 from tempest.common import glance_http
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
 class ImageClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ImageClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ImageClientJSON, self).__init__(username, password,
                                               auth_url, tenant_name)
-        self.service = self.config.images.catalog_type
-        if config.service_available.glance:
+        self.service = CONF.images.catalog_type
+        if CONF.service_available.glance:
             self.http = self._get_http()
 
     def _image_meta_from_headers(self, headers):
@@ -108,7 +111,7 @@
                                              self.auth_url,
                                              self.service,
                                              self.tenant_name)
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         return glance_http.HTTPClient(endpoint=endpoint, token=token,
                                       insecure=dscv)
 
diff --git a/tempest/services/image/v2/json/image_client.py b/tempest/services/image/v2/json/image_client.py
index 3a79695..0c4fb5c 100644
--- a/tempest/services/image/v2/json/image_client.py
+++ b/tempest/services/image/v2/json/image_client.py
@@ -20,23 +20,26 @@
 
 from tempest.common import glance_http
 from tempest.common import rest_client
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class ImageClientV2JSON(rest_client.RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ImageClientV2JSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ImageClientV2JSON, self).__init__(username, password,
                                                 auth_url, tenant_name)
-        self.service = self.config.images.catalog_type
-        if config.service_available.glance:
+        self.service = CONF.images.catalog_type
+        if CONF.service_available.glance:
             self.http = self._get_http()
 
     def _get_http(self):
         token, endpoint = self.keystone_auth(self.user, self.password,
                                              self.auth_url, self.service,
                                              self.tenant_name)
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         return glance_http.HTTPClient(endpoint=endpoint, token=token,
                                       insecure=dscv)
 
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index 47c20d2..9908816 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -31,9 +31,9 @@
     quotas
     """
 
-    def get_rest_client(self, config, username,
+    def get_rest_client(self, username,
                         password, auth_url, tenant_name=None):
-        return RestClient(config, username, password, auth_url, tenant_name)
+        return RestClient(username, password, auth_url, tenant_name)
 
     def deserialize_single(self, body):
         return json.loads(body)
diff --git a/tempest/services/network/network_client_base.py b/tempest/services/network/network_client_base.py
index f4a012f..467256e 100644
--- a/tempest/services/network/network_client_base.py
+++ b/tempest/services/network/network_client_base.py
@@ -12,6 +12,10 @@
 
 import urllib
 
+from tempest import config
+
+CONF = config.CONF
+
 # the following map is used to construct proper URI
 # for the given neutron resource
 service_resource_prefix_map = {
@@ -42,15 +46,15 @@
 
 
 class NetworkClientBase(object):
-    def __init__(self, config, username, password,
+    def __init__(self, username, password,
                  auth_url, tenant_name=None):
         self.rest_client = self.get_rest_client(
-            config, username, password, auth_url, tenant_name)
-        self.rest_client.service = self.rest_client.config.network.catalog_type
+            username, password, auth_url, tenant_name)
+        self.rest_client.service = CONF.network.catalog_type
         self.version = '2.0'
         self.uri_prefix = "v%s" % (self.version)
 
-    def get_rest_client(self, config, username, password,
+    def get_rest_client(self, username, password,
                         auth_url, tenant_name):
         raise NotImplementedError
 
diff --git a/tempest/services/network/xml/network_client.py b/tempest/services/network/xml/network_client.py
index b8e39ad..4eb38be 100644
--- a/tempest/services/network/xml/network_client.py
+++ b/tempest/services/network/xml/network_client.py
@@ -28,9 +28,9 @@
     PLURALS = ['dns_nameservers', 'host_routes', 'allocation_pools',
                'fixed_ips', 'extensions']
 
-    def get_rest_client(self, config, username, password,
+    def get_rest_client(self, username, password,
                         auth_url, tenant_name=None):
-        return RestClientXML(config, username, password,
+        return RestClientXML(username, password,
                              auth_url, tenant_name)
 
     def _parse_array(self, node):
diff --git a/tempest/services/object_storage/account_client.py b/tempest/services/object_storage/account_client.py
index a6f47b7..28d10aa 100644
--- a/tempest/services/object_storage/account_client.py
+++ b/tempest/services/object_storage/account_client.py
@@ -18,16 +18,50 @@
 
 from tempest.common import http
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class AccountClient(RestClient):
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AccountClient, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AccountClient, self).__init__(username, password,
                                             auth_url, tenant_name)
-        self.service = self.config.object_storage.catalog_type
+        self.service = CONF.object_storage.catalog_type
         self.format = 'json'
 
+    def create_account(self, data=None,
+                       params=None,
+                       metadata={},
+                       remove_metadata={},
+                       metadata_prefix='X-Account-Meta-',
+                       remove_metadata_prefix='X-Remove-Account-Meta-'):
+        """Create an account."""
+        url = ''
+        if params:
+            url += '?%s' % urllib.urlencode(params)
+
+        headers = {}
+        for key in metadata:
+            headers[metadata_prefix + key] = metadata[key]
+        for key in remove_metadata:
+            headers[remove_metadata_prefix + key] = remove_metadata[key]
+
+        resp, body = self.put(url, data, headers)
+        return resp, body
+
+    def delete_account(self, data=None, params=None):
+        """Delete an account."""
+        url = ''
+        if params:
+            if 'bulk-delete' in params:
+                url += 'bulk-delete&'
+            url = '?%s%s' % (url, urllib.urlencode(params))
+
+        resp, body = self.delete(url, headers=None, body=data)
+        return resp, body
+
     def list_account_metadata(self):
         """
         HEAD on the storage URL
@@ -88,7 +122,9 @@
 
         url = '?' + urllib.urlencode(params)
         resp, body = self.get(url)
-        body = json.loads(body)
+
+        if params and params.get('format') == 'json':
+            body = json.loads(body)
         return resp, body
 
     def list_extensions(self):
@@ -102,12 +138,12 @@
 
 class AccountClientCustomizedHeader(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(AccountClientCustomizedHeader, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(AccountClientCustomizedHeader, self).__init__(username,
                                                             password, auth_url,
                                                             tenant_name)
         # Overwrites json-specific header encoding in RestClient
-        self.service = self.config.object_storage.catalog_type
+        self.service = CONF.object_storage.catalog_type
         self.format = 'json'
 
     def request(self, method, url, headers=None, body=None):
diff --git a/tempest/services/object_storage/container_client.py b/tempest/services/object_storage/container_client.py
index cbd07bf..bc85c73 100644
--- a/tempest/services/object_storage/container_client.py
+++ b/tempest/services/object_storage/container_client.py
@@ -17,20 +17,28 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+from xml.etree import ElementTree as etree
+
+CONF = config.CONF
 
 
 class ContainerClient(RestClient):
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ContainerClient, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ContainerClient, self).__init__(username, password,
                                               auth_url, tenant_name)
 
         # Overwrites json-specific header encoding in RestClient
         self.headers = {}
-        self.service = self.config.object_storage.catalog_type
+        self.service = CONF.object_storage.catalog_type
         self.format = 'json'
 
-    def create_container(self, container_name, metadata=None,
-                         metadata_prefix='X-Container-Meta-'):
+    def create_container(
+            self, container_name,
+            metadata=None,
+            remove_metadata=None,
+            metadata_prefix='X-Container-Meta-',
+            remove_metadata_prefix='X-Remove-Container-Meta-'):
         """
            Creates a container, with optional metadata passed in as a
            dictionary
@@ -41,6 +49,9 @@
         if metadata is not None:
             for key in metadata:
                 headers[metadata_prefix + key] = metadata[key]
+        if remove_metadata is not None:
+            for key in remove_metadata:
+                headers[remove_metadata_prefix + key] = remove_metadata[key]
 
         resp, body = self.put(url, body=None, headers=headers)
         return resp, body
@@ -51,8 +62,12 @@
         resp, body = self.delete(url)
         return resp, body
 
-    def update_container_metadata(self, container_name, metadata,
-                                  metadata_prefix='X-Container-Meta-'):
+    def update_container_metadata(
+            self, container_name,
+            metadata=None,
+            remove_metadata=None,
+            metadata_prefix='X-Container-Meta-',
+            remove_metadata_prefix='X-Remove-Container-Meta-'):
         """Updates arbitrary metadata on container."""
         url = str(container_name)
         headers = {}
@@ -60,6 +75,9 @@
         if metadata is not None:
             for key in metadata:
                 headers[metadata_prefix + key] = metadata[key]
+        if remove_metadata is not None:
+            for key in remove_metadata:
+                headers[remove_metadata_prefix + key] = remove_metadata[key]
 
         resp, body = self.post(url, body=None, headers=headers)
         return resp, body
@@ -72,7 +90,7 @@
 
         if metadata is not None:
             for item in metadata:
-                headers[metadata_prefix + item] = 'x'
+                headers[metadata_prefix + item] = metadata[item]
 
         resp, body = self.post(url, body=None, headers=headers)
         return resp, body
@@ -101,8 +119,9 @@
             if 'marker' in params:
                 limit = params['marker']
 
-        resp, objlist = self.list_container_contents(container,
-                                                     params={'limit': limit})
+        resp, objlist = self.list_container_contents(
+            container,
+            params={'limit': limit, 'format': 'json'})
         return objlist
         """tmp = []
         for obj in objlist:
@@ -159,10 +178,13 @@
         """
 
         url = str(container)
-        url += '?format=%s' % self.format
         if params:
+            url += '?'
             url += '&%s' % urllib.urlencode(params)
 
         resp, body = self.get(url)
-        body = json.loads(body)
+        if params and params.get('format') == 'json':
+            body = json.loads(body)
+        elif params and params.get('format') == 'xml':
+            body = etree.fromstring(body)
         return resp, body
diff --git a/tempest/services/object_storage/object_client.py b/tempest/services/object_storage/object_client.py
index 1304a03..2a68a4f 100644
--- a/tempest/services/object_storage/object_client.py
+++ b/tempest/services/object_storage/object_client.py
@@ -17,15 +17,18 @@
 
 from tempest.common import http
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class ObjectClient(RestClient):
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ObjectClient, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ObjectClient, self).__init__(username, password,
                                            auth_url, tenant_name)
 
-        self.service = self.config.object_storage.catalog_type
+        self.service = CONF.object_storage.catalog_type
 
     def create_object(self, container, object_name, data, params=None):
         """Create storage object."""
@@ -135,17 +138,17 @@
 
 class ObjectClientCustomizedHeader(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ObjectClientCustomizedHeader, self).__init__(config, username,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ObjectClientCustomizedHeader, self).__init__(username,
                                                            password, auth_url,
                                                            tenant_name)
         # Overwrites json-specific header encoding in RestClient
-        self.service = self.config.object_storage.catalog_type
+        self.service = CONF.object_storage.catalog_type
         self.format = 'json'
 
     def request(self, method, url, headers=None, body=None):
         """A simple HTTP request interface."""
-        dscv = self.config.identity.disable_ssl_certificate_validation
+        dscv = CONF.identity.disable_ssl_certificate_validation
         self.http_obj = http.ClosingHttp(
             disable_ssl_certificate_validation=dscv)
         if headers is None:
diff --git a/tempest/services/orchestration/json/orchestration_client.py b/tempest/services/orchestration/json/orchestration_client.py
index 20f1b06..273c2ae 100644
--- a/tempest/services/orchestration/json/orchestration_client.py
+++ b/tempest/services/orchestration/json/orchestration_client.py
@@ -19,17 +19,20 @@
 import urllib
 
 from tempest.common import rest_client
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class OrchestrationClient(rest_client.RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(OrchestrationClient, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(OrchestrationClient, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.orchestration.catalog_type
-        self.build_interval = self.config.orchestration.build_interval
-        self.build_timeout = self.config.orchestration.build_timeout
+        self.service = CONF.orchestration.catalog_type
+        self.build_interval = CONF.orchestration.build_interval
+        self.build_timeout = CONF.orchestration.build_timeout
 
     def list_stacks(self, params=None):
         """Lists all stacks for a user."""
diff --git a/tempest/services/telemetry/json/telemetry_client.py b/tempest/services/telemetry/json/telemetry_client.py
index 8d46bf3..a1112da 100644
--- a/tempest/services/telemetry/json/telemetry_client.py
+++ b/tempest/services/telemetry/json/telemetry_client.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright 2014 OpenStack Foundation
 # All Rights Reserved.
 #
@@ -22,9 +20,9 @@
 
 class TelemetryClientJSON(client.TelemetryClientBase):
 
-    def get_rest_client(self, config, username,
+    def get_rest_client(self, username,
                         password, auth_url, tenant_name=None):
-        return RestClient(config, username, password, auth_url, tenant_name)
+        return RestClient(username, password, auth_url, tenant_name)
 
     def deserialize(self, body):
         return json.loads(body.replace("\n", ""))
diff --git a/tempest/services/telemetry/telemetry_client_base.py b/tempest/services/telemetry/telemetry_client_base.py
index 59127b9..24039c6 100644
--- a/tempest/services/telemetry/telemetry_client_base.py
+++ b/tempest/services/telemetry/telemetry_client_base.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright 2013 OpenStack Foundation
 # All Rights Reserved.
 #
@@ -19,6 +17,10 @@
 import six
 import urllib
 
+from tempest import config
+
+CONF = config.CONF
+
 
 @six.add_metaclass(abc.ABCMeta)
 class TelemetryClientBase(object):
@@ -33,17 +35,16 @@
     statistics
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        self.rest_client = self.get_rest_client(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        self.rest_client = self.get_rest_client(username, password,
                                                 auth_url, tenant_name)
-        self.rest_client.service = \
-            self.rest_client.config.telemetry.catalog_type
+        self.rest_client.service = CONF.telemetry.catalog_type
         self.headers = self.rest_client.headers
         self.version = '2'
         self.uri_prefix = "v%s" % self.version
 
     @abc.abstractmethod
-    def get_rest_client(self, config, username, password,
+    def get_rest_client(self, username, password,
                         auth_url, tenant_name):
         """
         :param config:
diff --git a/tempest/services/telemetry/xml/telemetry_client.py b/tempest/services/telemetry/xml/telemetry_client.py
index 245ccb5..862d08f 100644
--- a/tempest/services/telemetry/xml/telemetry_client.py
+++ b/tempest/services/telemetry/xml/telemetry_client.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright 2014 OpenStack Foundation
 # All Rights Reserved.
 #
@@ -25,9 +23,9 @@
 
 class TelemetryClientXML(client.TelemetryClientBase):
 
-    def get_rest_client(self, config, username,
+    def get_rest_client(self, username,
                         password, auth_url, tenant_name=None):
-        return RestClientXML(config, username, password, auth_url, tenant_name)
+        return RestClientXML(username, password, auth_url, tenant_name)
 
     def _parse_array(self, body):
         array = []
diff --git a/tempest/services/volume/json/admin/volume_hosts_client.py b/tempest/services/volume/json/admin/volume_hosts_client.py
index c9a522a..e4178b9 100644
--- a/tempest/services/volume/json/admin/volume_hosts_client.py
+++ b/tempest/services/volume/json/admin/volume_hosts_client.py
@@ -17,6 +17,9 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class VolumeHostsClientJSON(RestClient):
@@ -24,13 +27,13 @@
     Client class to send CRUD Volume Hosts API requests to a Cinder endpoint
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumeHostsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumeHostsClientJSON, self).__init__(username, password,
                                                     auth_url, tenant_name)
 
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.volume.build_interval
-        self.build_timeout = self.config.volume.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.volume.build_interval
+        self.build_timeout = CONF.volume.build_timeout
 
     def list_hosts(self, params=None):
         """Lists all hosts."""
diff --git a/tempest/services/volume/json/admin/volume_types_client.py b/tempest/services/volume/json/admin/volume_types_client.py
index 4ab9b70..5b6328b 100644
--- a/tempest/services/volume/json/admin/volume_types_client.py
+++ b/tempest/services/volume/json/admin/volume_types_client.py
@@ -17,6 +17,9 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class VolumeTypesClientJSON(RestClient):
@@ -24,13 +27,13 @@
     Client class to send CRUD Volume Types API requests to a Cinder endpoint
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumeTypesClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumeTypesClientJSON, self).__init__(username, password,
                                                     auth_url, tenant_name)
 
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.volume.build_interval
-        self.build_timeout = self.config.volume.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.volume.build_interval
+        self.build_timeout = CONF.volume.build_timeout
 
     def list_volume_types(self, params=None):
         """List all the volume_types created."""
diff --git a/tempest/services/volume/json/extensions_client.py b/tempest/services/volume/json/extensions_client.py
index bdd5f1e..c3bbb20 100644
--- a/tempest/services/volume/json/extensions_client.py
+++ b/tempest/services/volume/json/extensions_client.py
@@ -16,14 +16,17 @@
 import json
 
 from tempest.common.rest_client import RestClient
+from tempest import config
+
+CONF = config.CONF
 
 
 class ExtensionsClientJSON(RestClient):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ExtensionsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ExtensionsClientJSON, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.volume.catalog_type
+        self.service = CONF.volume.catalog_type
 
     def list_extensions(self):
         url = 'extensions'
diff --git a/tempest/services/volume/json/snapshots_client.py b/tempest/services/volume/json/snapshots_client.py
index 1a34898..e8926bd 100644
--- a/tempest/services/volume/json/snapshots_client.py
+++ b/tempest/services/volume/json/snapshots_client.py
@@ -15,22 +15,25 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
 class SnapshotsClientJSON(RestClient):
     """Client class to send CRUD Volume API requests."""
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(SnapshotsClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(SnapshotsClientJSON, self).__init__(username, password,
                                                   auth_url, tenant_name)
 
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.volume.build_interval
-        self.build_timeout = self.config.volume.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.volume.build_interval
+        self.build_timeout = CONF.volume.build_timeout
 
     def list_snapshots(self, params=None):
         """List all the snapshot."""
@@ -184,3 +187,10 @@
         url = "snapshots/%s/metadata/%s" % (str(snapshot_id), str(id))
         resp, body = self.delete(url, self.headers)
         return resp, body
+
+    def force_delete_snapshot(self, snapshot_id):
+        """Force Delete Snapshot."""
+        post_body = json.dumps({'os-force_delete': {}})
+        resp, body = self.post('snapshots/%s/action' % snapshot_id, post_body,
+                               self.headers)
+        return resp, body
diff --git a/tempest/services/volume/json/volumes_client.py b/tempest/services/volume/json/volumes_client.py
index c99501b..6c09e02 100644
--- a/tempest/services/volume/json/volumes_client.py
+++ b/tempest/services/volume/json/volumes_client.py
@@ -18,21 +18,24 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest import config
 from tempest import exceptions
 
+CONF = config.CONF
+
 
 class VolumesClientJSON(RestClient):
     """
     Client class to send CRUD Volume API requests to a Cinder endpoint
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumesClientJSON, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumesClientJSON, self).__init__(username, password,
                                                 auth_url, tenant_name)
 
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.volume.build_interval
-        self.build_timeout = self.config.volume.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.volume.build_interval
+        self.build_timeout = CONF.volume.build_timeout
 
     def get_attachment_from_volume(self, volume):
         """Return the element 'attachment' from input volumes."""
diff --git a/tempest/services/volume/xml/admin/volume_hosts_client.py b/tempest/services/volume/xml/admin/volume_hosts_client.py
index 31e529f..39b82e5 100644
--- a/tempest/services/volume/xml/admin/volume_hosts_client.py
+++ b/tempest/services/volume/xml/admin/volume_hosts_client.py
@@ -18,20 +18,23 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class VolumeHostsClientXML(RestClientXML):
     """
     Client class to send CRUD Volume Hosts API requests to a Cinder endpoint
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumeHostsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumeHostsClientXML, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.compute.build_interval
-        self.build_timeout = self.config.compute.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
 
     def _parse_array(self, node):
         """
diff --git a/tempest/services/volume/xml/admin/volume_types_client.py b/tempest/services/volume/xml/admin/volume_types_client.py
index 12e70d4..942c4e1 100644
--- a/tempest/services/volume/xml/admin/volume_types_client.py
+++ b/tempest/services/volume/xml/admin/volume_types_client.py
@@ -18,6 +18,7 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
@@ -25,18 +26,20 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 
 class VolumeTypesClientXML(RestClientXML):
     """
     Client class to send CRUD Volume Types API requests to a Cinder endpoint
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumeTypesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumeTypesClientXML, self).__init__(username, password,
                                                    auth_url, tenant_name)
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.compute.build_interval
-        self.build_timeout = self.config.compute.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
 
     def _parse_volume_type(self, body):
         vol_type = dict((attr, body.get(attr)) for attr in body.keys())
diff --git a/tempest/services/volume/xml/extensions_client.py b/tempest/services/volume/xml/extensions_client.py
index 30997bb..a04616d 100644
--- a/tempest/services/volume/xml/extensions_client.py
+++ b/tempest/services/volume/xml/extensions_client.py
@@ -14,16 +14,20 @@
 #    under the License.
 
 from lxml import etree
+
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest.services.compute.xml.common import xml_to_json
 
+CONF = config.CONF
+
 
 class ExtensionsClientXML(RestClientXML):
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ExtensionsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(ExtensionsClientXML, self).__init__(username, password,
                                                   auth_url, tenant_name)
-        self.service = self.config.volume.catalog_type
+        self.service = CONF.volume.catalog_type
 
     def _parse_array(self, node):
         array = []
diff --git a/tempest/services/volume/xml/snapshots_client.py b/tempest/services/volume/xml/snapshots_client.py
index ea2ea27..5e62b6d 100644
--- a/tempest/services/volume/xml/snapshots_client.py
+++ b/tempest/services/volume/xml/snapshots_client.py
@@ -16,6 +16,7 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.services.compute.xml.common import Document
@@ -24,19 +25,21 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
 class SnapshotsClientXML(RestClientXML):
     """Client class to send CRUD Volume API requests."""
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(SnapshotsClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(SnapshotsClientXML, self).__init__(username, password,
                                                  auth_url, tenant_name)
 
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.volume.build_interval
-        self.build_timeout = self.config.volume.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.volume.build_interval
+        self.build_timeout = CONF.volume.build_timeout
 
     def list_snapshots(self, params=None):
         """List all snapshot."""
@@ -223,3 +226,12 @@
         """Delete metadata item for the snapshot."""
         url = "snapshots/%s/metadata/%s" % (str(snapshot_id), str(id))
         return self.delete(url)
+
+    def force_delete_snapshot(self, snapshot_id):
+        """Force Delete Snapshot."""
+        post_body = Element("os-force_delete")
+        url = 'snapshots/%s/action' % str(snapshot_id)
+        resp, body = self.post(url, str(Document(post_body)), self.headers)
+        if body:
+            body = xml_to_json(etree.fromstring(body))
+        return resp, body
diff --git a/tempest/services/volume/xml/volumes_client.py b/tempest/services/volume/xml/volumes_client.py
index 37370b1..7adaf4b 100644
--- a/tempest/services/volume/xml/volumes_client.py
+++ b/tempest/services/volume/xml/volumes_client.py
@@ -19,6 +19,7 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest import config
 from tempest import exceptions
 from tempest.services.compute.xml.common import Document
 from tempest.services.compute.xml.common import Element
@@ -26,18 +27,20 @@
 from tempest.services.compute.xml.common import xml_to_json
 from tempest.services.compute.xml.common import XMLNS_11
 
+CONF = config.CONF
+
 
 class VolumesClientXML(RestClientXML):
     """
     Client class to send CRUD Volume API requests to a Cinder endpoint
     """
 
-    def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(VolumesClientXML, self).__init__(config, username, password,
+    def __init__(self, username, password, auth_url, tenant_name=None):
+        super(VolumesClientXML, self).__init__(username, password,
                                                auth_url, tenant_name)
-        self.service = self.config.volume.catalog_type
-        self.build_interval = self.config.compute.build_interval
-        self.build_timeout = self.config.compute.build_timeout
+        self.service = CONF.volume.catalog_type
+        self.build_interval = CONF.compute.build_interval
+        self.build_timeout = CONF.compute.build_timeout
 
     def _parse_volume(self, body):
         vol = dict((attr, body.get(attr)) for attr in body.keys())
diff --git a/tempest/stress/README.rst b/tempest/stress/README.rst
index 20e58d4..b56f96b 100644
--- a/tempest/stress/README.rst
+++ b/tempest/stress/README.rst
@@ -1,7 +1,7 @@
 Tempest Field Guide to Stress Tests
 ===================================
 
-Nova is a distributed, asynchronous system that is prone to race condition
+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
diff --git a/tempest/stress/actions/server_create_destroy.py b/tempest/stress/actions/server_create_destroy.py
index 84c7cf5..4a9f0d5 100644
--- a/tempest/stress/actions/server_create_destroy.py
+++ b/tempest/stress/actions/server_create_destroy.py
@@ -13,14 +13,17 @@
 #    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 ServerCreateDestroyTest(stressaction.StressAction):
 
     def setUp(self, **kwargs):
-        self.image = self.manager.config.compute.image_ref
-        self.flavor = self.manager.config.compute.flavor_ref
+        self.image = CONF.compute.image_ref
+        self.flavor = CONF.compute.flavor_ref
 
     def run(self):
         name = data_utils.rand_name("instance")
diff --git a/tempest/stress/actions/ssh_floating.py b/tempest/stress/actions/ssh_floating.py
index 28de771..a34a20d 100644
--- a/tempest/stress/actions/ssh_floating.py
+++ b/tempest/stress/actions/ssh_floating.py
@@ -14,9 +14,12 @@
 import subprocess
 
 from tempest.common.utils import data_utils
+from tempest import config
 import tempest.stress.stressaction as stressaction
 import tempest.test
 
+CONF = config.CONF
+
 
 class FloatingStress(stressaction.StressAction):
 
@@ -109,8 +112,8 @@
         self.logger.info("Deleted Floating IP %s", str(self.floating['ip']))
 
     def setUp(self, **kwargs):
-        self.image = self.manager.config.compute.image_ref
-        self.flavor = self.manager.config.compute.flavor_ref
+        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)
diff --git a/tempest/stress/actions/volume_attach_delete.py b/tempest/stress/actions/volume_attach_delete.py
index e6fcb81..c2e6072 100644
--- a/tempest/stress/actions/volume_attach_delete.py
+++ b/tempest/stress/actions/volume_attach_delete.py
@@ -12,14 +12,17 @@
 #    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 VolumeAttachDeleteTest(stressaction.StressAction):
 
     def setUp(self, **kwargs):
-        self.image = self.manager.config.compute.image_ref
-        self.flavor = self.manager.config.compute.flavor_ref
+        self.image = CONF.compute.image_ref
+        self.flavor = CONF.compute.flavor_ref
 
     def run(self):
         # Step 1: create volume
diff --git a/tempest/stress/driver.py b/tempest/stress/driver.py
index d37ab6d..d4689c4 100644
--- a/tempest/stress/driver.py
+++ b/tempest/stress/driver.py
@@ -20,11 +20,14 @@
 from tempest import clients
 from tempest.common import ssh
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import importutils
 from tempest.openstack.common import log as logging
 from tempest.stress import cleanup
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 processes = []
 
@@ -110,14 +113,13 @@
     """
     admin_manager = clients.AdminManager()
 
-    ssh_user = admin_manager.config.stress.target_ssh_user
-    ssh_key = admin_manager.config.stress.target_private_key_path
-    logfiles = admin_manager.config.stress.target_logfiles
-    log_check_interval = int(admin_manager.config.stress.log_check_interval)
-    default_thread_num = int(admin_manager.config.stress.
-                             default_thread_number_per_action)
+    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 = admin_manager.config.stress.target_controller
+        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)
diff --git a/tempest/test.py b/tempest/test.py
index 61d1311..5464c03 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -15,8 +15,11 @@
 
 import atexit
 import functools
+import json
 import os
 import time
+import urllib
+import uuid
 
 import fixtures
 import nose.plugins.attrib
@@ -24,6 +27,7 @@
 import testtools
 
 from tempest import clients
+from tempest.common import generate_json
 from tempest.common import isolated_creds
 from tempest import config
 from tempest import exceptions
@@ -67,7 +71,7 @@
     exercised by a test case.
     """
     valid_service_list = ['compute', 'image', 'volume', 'orchestration',
-                          'network', 'identity', 'object', 'dashboard']
+                          'network', 'identity', 'object_storage', 'dashboard']
 
     def decorator(f):
         for service in args:
@@ -155,13 +159,12 @@
     """A function that will check the list of enabled extensions from config
 
     """
-    configs = CONF
     config_dict = {
-        'compute': configs.compute_feature_enabled.api_extensions,
-        'compute_v3': configs.compute_feature_enabled.api_v3_extensions,
-        'volume': configs.volume_feature_enabled.api_extensions,
-        'network': configs.network_feature_enabled.api_extensions,
-        'object': configs.object_storage_feature_enabled.discoverable_apis,
+        'compute': CONF.compute_feature_enabled.api_extensions,
+        'compute_v3': CONF.compute_feature_enabled.api_v3_extensions,
+        'volume': CONF.volume_feature_enabled.api_extensions,
+        'network': CONF.network_feature_enabled.api_extensions,
+        'object': CONF.object_storage_feature_enabled.discoverable_apis,
     }
     if config_dict[service][0] == 'all':
         return True
@@ -209,12 +212,12 @@
 
 def validate_tearDownClass():
     if at_exit_set:
-        raise RuntimeError("tearDownClass does not calls the super's "
+        raise RuntimeError("tearDownClass does not call the super's "
                            "tearDownClass in these classes: "
                            + str(at_exit_set) + "\n"
                            "If you see the exception, with another "
-                           "exception please do not report this one!"
-                           "If you are changing tempest code, make sure you",
+                           "exception please do not report this one! "
+                           "If you are changing tempest code, make sure you "
                            "are calling the super class's tearDownClass!")
 
 atexit.register(validate_tearDownClass)
@@ -224,9 +227,8 @@
                    testtools.testcase.WithAttributes,
                    testresources.ResourcedTestCase):
 
-    config = CONF
-
     setUpClassCalled = False
+    _service = None
 
     network_resources = {}
 
@@ -273,7 +275,7 @@
                                                    level=None))
 
     @classmethod
-    def get_client_manager(cls):
+    def get_client_manager(cls, interface=None):
         """
         Returns an Openstack client manager
         """
@@ -281,16 +283,35 @@
             cls.__name__, network_resources=cls.network_resources)
 
         force_tenant_isolation = getattr(cls, 'force_tenant_isolation', None)
-        if (cls.config.compute.allow_tenant_isolation or
+        if (CONF.compute.allow_tenant_isolation or
             force_tenant_isolation):
             creds = cls.isolated_creds.get_primary_creds()
             username, tenant_name, password = creds
-            os = clients.Manager(username=username,
-                                 password=password,
-                                 tenant_name=tenant_name,
-                                 interface=cls._interface)
+            if getattr(cls, '_interface', None):
+                os = clients.Manager(username=username,
+                                     password=password,
+                                     tenant_name=tenant_name,
+                                     interface=cls._interface,
+                                     service=cls._service)
+            elif interface:
+                os = clients.Manager(username=username,
+                                     password=password,
+                                     tenant_name=tenant_name,
+                                     interface=interface,
+                                     service=cls._service)
+            else:
+                os = clients.Manager(username=username,
+                                     password=password,
+                                     tenant_name=tenant_name,
+                                     service=cls._service)
         else:
-            os = clients.Manager(interface=cls._interface)
+            if getattr(cls, '_interface', None):
+                os = clients.Manager(interface=cls._interface,
+                                     service=cls._service)
+            elif interface:
+                os = clients.Manager(interface=interface, service=cls._service)
+            else:
+                os = clients.Manager(service=cls._service)
         return os
 
     @classmethod
@@ -306,21 +327,12 @@
         """
         Returns an instance of the Identity Admin API client
         """
-        os = clients.AdminManager(interface=cls._interface)
+        os = clients.AdminManager(interface=cls._interface,
+                                  service=cls._service)
         admin_client = os.identity_client
         return admin_client
 
     @classmethod
-    def _get_client_args(cls):
-
-        return (
-            cls.config,
-            cls.config.identity.admin_username,
-            cls.config.identity.admin_password,
-            cls.config.identity.uri
-        )
-
-    @classmethod
     def set_network_resources(self, network=False, router=False, subnet=False,
                               dhcp=False):
         """Specify which network resources should be created
@@ -342,6 +354,171 @@
                 'dhcp': dhcp}
 
 
+class NegativeAutoTest(BaseTestCase):
+
+    _resources = {}
+
+    @classmethod
+    def setUpClass(cls):
+        super(NegativeAutoTest, cls).setUpClass()
+        os = cls.get_client_manager()
+        cls.client = os.negative_client
+
+    @staticmethod
+    def load_schema(file):
+        """
+        Loads a schema from a file on a specified location.
+
+        :param file: the file name
+        """
+        #NOTE(mkoderer): must be extended for xml support
+        fn = os.path.join(
+            os.path.abspath(os.path.dirname(os.path.dirname(__file__))),
+            "etc", "schemas", file)
+        LOG.debug("Open schema file: %s" % (fn))
+        return json.load(open(fn))
+
+    @staticmethod
+    def generate_scenario(description_file):
+        """
+        Generates the test scenario list for a given description.
+
+        :param description: A dictionary with the following entries:
+            name (required) name for the api
+            http-method (required) one of HEAD,GET,PUT,POST,PATCH,DELETE
+            url (required) the url to be appended to the catalog url with '%s'
+                for each resource mentioned
+            resources: (optional) A list of resource names such as "server",
+                "flavor", etc. with an element for each '%s' in the url. This
+                method will call self.get_resource for each element when
+                constructing the positive test case template so negative
+                subclasses are expected to return valid resource ids when
+                appropriate.
+            json-schema (optional) A valid json schema that will be used to
+                create invalid data for the api calls. For "GET" and "HEAD",
+                the data is used to generate query strings appended to the url,
+                otherwise for the body of the http call.
+        """
+        description = NegativeAutoTest.load_schema(description_file)
+        LOG.debug(description)
+        generate_json.validate_negative_test_schema(description)
+        schema = description.get("json-schema", None)
+        resources = description.get("resources", [])
+        scenario_list = []
+        for resource in resources:
+            LOG.debug("Add resource to test %s" % resource)
+            scn_name = "inv_res_%s" % (resource)
+            scenario_list.append((scn_name, {"resource": (resource,
+                                                          str(uuid.uuid4()))
+                                             }))
+        if schema is not None:
+            for invalid in generate_json.generate_invalid(schema):
+                scenario_list.append((invalid[0],
+                                      {"schema": invalid[1],
+                                       "expected_result": invalid[2]}))
+        LOG.debug(scenario_list)
+        return scenario_list
+
+    def execute(self, description_file):
+        """
+        Execute a http call on an api that are expected to
+        result in client errors. First it uses invalid resources that are part
+        of the url, and then invalid data for queries and http request bodies.
+
+        :param description: A dictionary with the following entries:
+            name (required) name for the api
+            http-method (required) one of HEAD,GET,PUT,POST,PATCH,DELETE
+            url (required) the url to be appended to the catalog url with '%s'
+                for each resource mentioned
+            resources: (optional) A list of resource names such as "server",
+                "flavor", etc. with an element for each '%s' in the url. This
+                method will call self.get_resource for each element when
+                constructing the positive test case template so negative
+                subclasses are expected to return valid resource ids when
+                appropriate.
+            json-schema (optional) A valid json schema that will be used to
+                create invalid data for the api calls. For "GET" and "HEAD",
+                the data is used to generate query strings appended to the url,
+                otherwise for the body of the http call.
+
+        """
+        description = NegativeAutoTest.load_schema(description_file)
+        LOG.info("Executing %s" % description["name"])
+        LOG.debug(description)
+        method = description["http-method"]
+        url = description["url"]
+
+        resources = [self.get_resource(r) for
+                     r in description.get("resources", [])]
+
+        if hasattr(self, "resource"):
+            # Note(mkoderer): The resources list already contains an invalid
+            # entry (see get_resource).
+            # We just send a valid json-schema with it
+            valid = None
+            schema = description.get("json-schema", None)
+            if schema:
+                valid = generate_json.generate_valid(schema)
+            new_url, body = self._http_arguments(valid, url, method)
+            resp, resp_body = self.client.send_request(method, new_url,
+                                                       resources, body=body)
+            self._check_negative_response(resp.status, resp_body)
+            return
+
+        if hasattr(self, "schema"):
+            new_url, body = self._http_arguments(self.schema, url, method)
+            resp, resp_body = self.client.send_request(method, new_url,
+                                                       resources, body=body)
+            self._check_negative_response(resp.status, resp_body)
+
+    def _http_arguments(self, json_dict, url, method):
+        LOG.debug("dict: %s url: %s method: %s" % (json_dict, url, method))
+        if not json_dict:
+            return url, None
+        elif method in ["GET", "HEAD", "PUT", "DELETE"]:
+            return "%s?%s" % (url, urllib.urlencode(json_dict)), None
+        else:
+            return url, json.dumps(json_dict)
+
+    def _check_negative_response(self, result, body):
+        expected_result = getattr(self, "expected_result", None)
+        self.assertTrue(result >= 400 and result < 500 and result != 413,
+                        "Expected client error, got %s:%s" %
+                        (result, body))
+        self.assertTrue(expected_result is None or expected_result == result,
+                        "Expected %s, got %s:%s" %
+                        (expected_result, result, body))
+
+    @classmethod
+    def set_resource(cls, name, resource):
+        """
+        This function can be used in setUpClass context to register a resoruce
+        for a test.
+
+        :param name: The name of the kind of resource such as "flavor", "role",
+            etc.
+        :resource: The id of the resource
+        """
+        cls._resources[name] = resource
+
+    def get_resource(self, name):
+        """
+        Return a valid uuid for a type of resource. If a real resource is
+        needed as part of a url then this method should return one. Otherwise
+        it can return None.
+
+        :param name: The name of the kind of resource such as "flavor", "role",
+            etc.
+        """
+        if hasattr(self, "resource") and self.resource[0] == name:
+            LOG.debug("Return invalid resource (%s) value: %s" %
+                      (self.resource[0], self.resource[1]))
+            return self.resource[1]
+        if name in self._resources:
+            return self._resources[name]
+        return None
+
+
 def call_until_true(func, duration, sleep_for):
     """
     Call the given function until it returns True (and return True) or
diff --git a/tempest/tests/test_compute_xml_common.py b/tempest/tests/test_compute_xml_common.py
new file mode 100644
index 0000000..bfa6a10
--- /dev/null
+++ b/tempest/tests/test_compute_xml_common.py
@@ -0,0 +1,67 @@
+# Copyright 2013 IBM Corp.
+#
+#    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 lxml import etree
+
+from tempest.services.compute.xml import common
+from tempest.tests import base
+
+
+class TestXMLParser(base.TestCase):
+
+    def test_xml_to_json_parser_bool_value(self):
+        node = etree.fromstring('''<health_monitor
+        xmlns="http://openstack.org/quantum/api/v2.0"
+         xmlns:quantum="http://openstack.org/quantum/api/v2.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+           <admin_state_up quantum:type="bool">False</admin_state_up>
+          <fake_state_up quantum:type="bool">True</fake_state_up>
+          </health_monitor>''')
+        body = common.xml_to_json(node)
+        self.assertEqual(body['admin_state_up'], False)
+        self.assertEqual(body['fake_state_up'], True)
+
+    def test_xml_to_json_parser_int_value(self):
+        node = etree.fromstring('''<health_monitor
+        xmlns="http://openstack.org/quantum/api/v2.0"
+         xmlns:quantum="http://openstack.org/quantum/api/v2.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <delay quantum:type="long">4</delay>
+          <max_retries quantum:type="int">3</max_retries>
+          </health_monitor>''')
+        body = common.xml_to_json(node)
+        self.assertEqual(body['delay'], 4L)
+        self.assertEqual(body['max_retries'], 3)
+
+    def test_xml_to_json_parser_text_value(self):
+        node = etree.fromstring('''<health_monitor
+        xmlns="http://openstack.org/quantum/api/v2.0"
+         xmlns:quantum="http://openstack.org/quantum/api/v2.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <status>ACTIVE</status>
+          </health_monitor>''')
+        body = common.xml_to_json(node)
+        self.assertEqual(body['status'], 'ACTIVE')
+
+    def test_xml_to_json_parser_list_as_value(self):
+        node = etree.fromstring('''<health_monitor
+        xmlns="http://openstack.org/quantum/api/v2.0"
+         xmlns:quantum="http://openstack.org/quantum/api/v2.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <elements>
+          <element>first_element</element>
+          <element>second_element</element>
+          </elements>
+          </health_monitor>''')
+        body = common.xml_to_json(node, 'elements')
+        self.assertEqual(body['elements'], ['first_element', 'second_element'])
diff --git a/tempest/tests/test_rest_client.py b/tempest/tests/test_rest_client.py
index acb9000..f3c7440 100644
--- a/tempest/tests/test_rest_client.py
+++ b/tempest/tests/test_rest_client.py
@@ -15,6 +15,7 @@
 import httplib2
 
 from tempest.common import rest_client
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common.fixture import mockpatch
 from tempest.tests import base
@@ -29,8 +30,8 @@
 
     def setUp(self):
         super(BaseRestClientTestClass, self).setUp()
-        self.rest_client = rest_client.RestClient(fake_config.FakeConfig(),
-                                                  'fake_user', 'fake_pass',
+        self.stubs.Set(config, 'TempestConfigPrivate', fake_config.FakeConfig)
+        self.rest_client = rest_client.RestClient('fake_user', 'fake_pass',
                                                   'http://fake_url/v2.0')
         self.stubs.Set(httplib2.Http, 'request', self.fake_http.request)
         self.useFixture(mockpatch.PatchObject(self.rest_client, '_set_auth',
diff --git a/tempest/tests/test_ssh.py b/tempest/tests/test_ssh.py
index 09bb588..429ed56 100644
--- a/tempest/tests/test_ssh.py
+++ b/tempest/tests/test_ssh.py
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright 2014 OpenStack Foundation
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/tests/test_wrappers.py b/tempest/tests/test_wrappers.py
index dd0ea61..f6ed445 100644
--- a/tempest/tests/test_wrappers.py
+++ b/tempest/tests/test_wrappers.py
@@ -27,6 +27,7 @@
         super(TestWrappers, self).setUp()
         # Setup test dirs
         self.directory = tempfile.mkdtemp(prefix='tempest-unit')
+        self.addCleanup(shutil.rmtree, self.directory)
         self.test_dir = os.path.join(self.directory, 'tests')
         os.mkdir(self.test_dir)
         # Setup Test files
diff --git a/tempest/thirdparty/boto/test.py b/tempest/thirdparty/boto/test.py
index d484d94..b36e8c7 100644
--- a/tempest/thirdparty/boto/test.py
+++ b/tempest/thirdparty/boto/test.py
@@ -195,6 +195,7 @@
     def setUpClass(cls):
         super(BotoTestCase, cls).setUpClass()
         cls.conclusion = decision_maker()
+        cls.os = cls.get_client_manager()
         # The trash contains cleanup functions and paramaters in tuples
         # (function, *args, **kwargs)
         cls._resource_trash_bin = {}
@@ -259,6 +260,7 @@
                 LOG.exception("Cleanup failed %s" % func_name)
             finally:
                 del cls._resource_trash_bin[key]
+        cls.clear_isolated_creds()
         super(BotoTestCase, cls).tearDownClass()
         # NOTE(afazekas): let the super called even on exceptions
         # The real exceptions already logged, if the super throws another,
diff --git a/tempest/thirdparty/boto/test_ec2_instance_run.py b/tempest/thirdparty/boto/test_ec2_instance_run.py
index 8a08cc2..a6932bc 100644
--- a/tempest/thirdparty/boto/test_ec2_instance_run.py
+++ b/tempest/thirdparty/boto/test_ec2_instance_run.py
@@ -15,9 +15,9 @@
 
 from boto import exception
 
-from tempest import clients
 from tempest.common.utils import data_utils
 from tempest.common.utils.linux.remote_client import RemoteClient
+from tempest import config
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.test import attr
@@ -27,6 +27,8 @@
 from tempest.thirdparty.boto.utils.wait import re_search_wait
 from tempest.thirdparty.boto.utils.wait import state_wait
 
+CONF = config.CONF
+
 LOG = logging.getLogger(__name__)
 
 
@@ -38,16 +40,14 @@
         if not cls.conclusion['A_I_IMAGES_READY']:
             raise cls.skipException("".join(("EC2 ", cls.__name__,
                                     ": requires ami/aki/ari manifest")))
-        cls.os = clients.Manager()
         cls.s3_client = cls.os.s3_client
         cls.ec2_client = cls.os.ec2api_client
         cls.zone = cls.ec2_client.get_good_zone()
-        config = cls.config
-        cls.materials_path = config.boto.s3_materials_path
-        ami_manifest = config.boto.ami_manifest
-        aki_manifest = config.boto.aki_manifest
-        ari_manifest = config.boto.ari_manifest
-        cls.instance_type = config.boto.instance_type
+        cls.materials_path = CONF.boto.s3_materials_path
+        ami_manifest = CONF.boto.ami_manifest
+        aki_manifest = CONF.boto.aki_manifest
+        ari_manifest = CONF.boto.ari_manifest
+        cls.instance_type = CONF.boto.instance_type
         cls.bucket_name = data_utils.rand_name("s3bucket-")
         cls.keypair_name = data_utils.rand_name("keypair-")
         cls.keypair = cls.ec2_client.create_key_pair(cls.keypair_name)
@@ -281,7 +281,7 @@
         # NOTE(afazekas): it may be reports availble before it is available
 
         ssh = RemoteClient(address.public_ip,
-                           self.os.config.compute.ssh_user,
+                           CONF.compute.ssh_user,
                            pkey=self.keypair.material)
         text = data_utils.rand_name("Pattern text for console output -")
         resp = ssh.write_to_console(text)
diff --git a/tempest/thirdparty/boto/test_ec2_keys.py b/tempest/thirdparty/boto/test_ec2_keys.py
index b4c1827..329ace3 100644
--- a/tempest/thirdparty/boto/test_ec2_keys.py
+++ b/tempest/thirdparty/boto/test_ec2_keys.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest import clients
 from tempest.common.utils import data_utils
 from tempest.test import attr
 from tempest.test import skip_because
@@ -30,7 +29,6 @@
     @classmethod
     def setUpClass(cls):
         super(EC2KeysTest, cls).setUpClass()
-        cls.os = clients.Manager()
         cls.client = cls.os.ec2api_client
         cls.ec = cls.ec2_error_code
 
diff --git a/tempest/thirdparty/boto/test_ec2_network.py b/tempest/thirdparty/boto/test_ec2_network.py
index 3c3c74d..4b2f01f 100644
--- a/tempest/thirdparty/boto/test_ec2_network.py
+++ b/tempest/thirdparty/boto/test_ec2_network.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest import clients
 from tempest.test import attr
 from tempest.test import skip_because
 from tempest.thirdparty.boto.test import BotoTestCase
@@ -24,7 +23,6 @@
     @classmethod
     def setUpClass(cls):
         super(EC2NetworkTest, cls).setUpClass()
-        cls.os = clients.Manager()
         cls.client = cls.os.ec2api_client
 
     # Note(afazekas): these tests for things duable without an instance
diff --git a/tempest/thirdparty/boto/test_ec2_security_groups.py b/tempest/thirdparty/boto/test_ec2_security_groups.py
index 75dd254..9b58603 100644
--- a/tempest/thirdparty/boto/test_ec2_security_groups.py
+++ b/tempest/thirdparty/boto/test_ec2_security_groups.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest import clients
 from tempest.common.utils import data_utils
 from tempest.test import attr
 from tempest.thirdparty.boto.test import BotoTestCase
@@ -24,7 +23,6 @@
     @classmethod
     def setUpClass(cls):
         super(EC2SecurityGroupTest, cls).setUpClass()
-        cls.os = clients.Manager()
         cls.client = cls.os.ec2api_client
 
     @attr(type='smoke')
diff --git a/tempest/thirdparty/boto/test_ec2_volumes.py b/tempest/thirdparty/boto/test_ec2_volumes.py
index 3e7e2de..04671c5 100644
--- a/tempest/thirdparty/boto/test_ec2_volumes.py
+++ b/tempest/thirdparty/boto/test_ec2_volumes.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest import clients
 from tempest.openstack.common import log as logging
 from tempest.test import attr
 from tempest.thirdparty.boto.test import BotoTestCase
@@ -31,7 +30,6 @@
     @classmethod
     def setUpClass(cls):
         super(EC2VolumesTest, cls).setUpClass()
-        cls.os = clients.Manager()
         cls.client = cls.os.ec2api_client
         cls.zone = cls.client.get_good_zone()
 
diff --git a/tempest/thirdparty/boto/test_s3_buckets.py b/tempest/thirdparty/boto/test_s3_buckets.py
index f8948fd..f34faac 100644
--- a/tempest/thirdparty/boto/test_s3_buckets.py
+++ b/tempest/thirdparty/boto/test_s3_buckets.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from tempest import clients
 from tempest.common.utils import data_utils
 from tempest.test import attr
 from tempest.test import skip_because
@@ -25,7 +24,6 @@
     @classmethod
     def setUpClass(cls):
         super(S3BucketsTest, cls).setUpClass()
-        cls.os = clients.Manager()
         cls.client = cls.os.s3_client
 
     @skip_because(bug="1076965")
diff --git a/tempest/thirdparty/boto/test_s3_ec2_images.py b/tempest/thirdparty/boto/test_s3_ec2_images.py
index 4b7d9dd..9607a92 100644
--- a/tempest/thirdparty/boto/test_s3_ec2_images.py
+++ b/tempest/thirdparty/boto/test_s3_ec2_images.py
@@ -15,12 +15,14 @@
 
 import os
 
-from tempest import clients
 from tempest.common.utils import data_utils
+from tempest import config
 from tempest.test import attr
 from tempest.thirdparty.boto.test import BotoTestCase
 from tempest.thirdparty.boto.utils.s3 import s3_upload_dir
 
+CONF = config.CONF
+
 
 class S3ImagesTest(BotoTestCase):
 
@@ -30,14 +32,12 @@
         if not cls.conclusion['A_I_IMAGES_READY']:
             raise cls.skipException("".join(("EC2 ", cls.__name__,
                                     ": requires ami/aki/ari manifest")))
-        cls.os = clients.Manager()
         cls.s3_client = cls.os.s3_client
         cls.images_client = cls.os.ec2api_client
-        config = cls.config
-        cls.materials_path = config.boto.s3_materials_path
-        cls.ami_manifest = config.boto.ami_manifest
-        cls.aki_manifest = config.boto.aki_manifest
-        cls.ari_manifest = config.boto.ari_manifest
+        cls.materials_path = CONF.boto.s3_materials_path
+        cls.ami_manifest = CONF.boto.ami_manifest
+        cls.aki_manifest = CONF.boto.aki_manifest
+        cls.ari_manifest = CONF.boto.ari_manifest
         cls.ami_path = cls.materials_path + os.sep + cls.ami_manifest
         cls.aki_path = cls.materials_path + os.sep + cls.aki_manifest
         cls.ari_path = cls.materials_path + os.sep + cls.ari_manifest
diff --git a/tempest/thirdparty/boto/test_s3_objects.py b/tempest/thirdparty/boto/test_s3_objects.py
index f355899..a102a22 100644
--- a/tempest/thirdparty/boto/test_s3_objects.py
+++ b/tempest/thirdparty/boto/test_s3_objects.py
@@ -17,7 +17,6 @@
 
 import boto.s3.key
 
-from tempest import clients
 from tempest.common.utils import data_utils
 from tempest.test import attr
 from tempest.thirdparty.boto.test import BotoTestCase
@@ -28,7 +27,6 @@
     @classmethod
     def setUpClass(cls):
         super(S3BucketsTest, cls).setUpClass()
-        cls.os = clients.Manager()
         cls.client = cls.os.s3_client
 
     @attr(type='smoke')
diff --git a/test-requirements.txt b/test-requirements.txt
index d7340f3..3fe2f27 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -2,7 +2,7 @@
 # needed for doc build
 docutils==0.9.1
 sphinx>=1.1.2,<1.2
-python-subunit
+python-subunit>=0.0.18
 oslo.sphinx
 mox>=0.5.3
 mock>=1.0
diff --git a/tools/verify_tempest_config.py b/tools/verify_tempest_config.py
index b393402..913c90b 100755
--- a/tools/verify_tempest_config.py
+++ b/tools/verify_tempest_config.py
@@ -127,11 +127,22 @@
                           "enabled extensions" % (service, extension))
 
 
+def check_service_availability(service):
+    if service == 'nova_v3':
+        service = 'nova'
+    return getattr(CONF.service_available, service)
+
+
 def main(argv):
     print('Running config verification...')
     os = clients.ComputeAdminManager(interface='json')
     results = {}
     for service in ['nova', 'nova_v3', 'cinder', 'neutron']:
+        # TODO(mtreinish) make this a keystone endpoint check for available
+        # services
+        if not check_service_availability(service):
+            print("%s is not available" % service)
+            continue
         results = verify_extensions(os, service, results)
     verify_glance_api_versions(os)
     verify_nova_api_versions(os)