Merge "Add a note about using a full path for test accounts option"
diff --git a/README.rst b/README.rst
index 45cb4c0..71e185f 100644
--- a/README.rst
+++ b/README.rst
@@ -87,7 +87,7 @@
    be done with testr directly or any `testr`_ based test runner, like
    `ostestr`_. For example, from the working dir running::
 
-     $ ostestr --regex '(?!.*\[.*\bslow\b.*\])(^tempest\.(api|scenario|thirdparty))'
+     $ ostestr --regex '(?!.*\[.*\bslow\b.*\])(^tempest\.(api|scenario))'
 
    will run the same set of tests as the default gate jobs.
 
diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst
index 5b4bec4..3284f10 100644
--- a/doc/source/configuration.rst
+++ b/doc/source/configuration.rst
@@ -9,16 +9,6 @@
 config file which explains the purpose of each individual option. You can see
 the sample config file here: :ref:`tempest-sampleconf`
 
-Lock Path
----------
-
-There are some tests and operations inside of tempest that need to be
-externally locked when running in parallel to prevent them from running at
-the same time. This is a mandatory step for configuring tempest and is still
-needed even when running serially. All that is needed to do this is:
-
- #. Set the lock_path option in the oslo_concurrency group
-
 Auth/Credentials
 ----------------
 
diff --git a/doc/source/field_guide/thirdparty.rst b/doc/source/field_guide/thirdparty.rst
deleted file mode 120000
index 3fd6a51..0000000
--- a/doc/source/field_guide/thirdparty.rst
+++ /dev/null
@@ -1 +0,0 @@
-../../../tempest/thirdparty/README.rst
\ No newline at end of file
diff --git a/doc/source/index.rst b/doc/source/index.rst
index fe6074f..32e6e51 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -26,7 +26,6 @@
    field_guide/api
    field_guide/scenario
    field_guide/stress
-   field_guide/thirdparty
    field_guide/unit_tests
 
 ---------------------------
diff --git a/requirements.txt b/requirements.txt
index d470c30..469b294 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,6 @@
 httplib2>=0.7.5
 jsonschema!=2.5.0,<3.0.0,>=2.0.0
 testtools>=1.4.0
-boto>=2.32.1
 paramiko>=1.13.0
 netaddr!=0.7.16,>=0.7.12
 testrepository>=0.0.18
@@ -17,11 +16,11 @@
 oslo.i18n>=1.5.0 # Apache-2.0
 oslo.log>=1.12.0 # Apache-2.0
 oslo.serialization>=1.10.0 # Apache-2.0
-oslo.utils>=2.8.0 # Apache-2.0
+oslo.utils>=3.2.0 # Apache-2.0
 six>=1.9.0
 iso8601>=0.1.9
 fixtures>=1.3.1
 testscenarios>=0.4
-tempest-lib>=0.11.0
+tempest-lib>=0.12.0
 PyYAML>=3.1.0
 stevedore>=1.5.0 # Apache-2.0
diff --git a/run_tempest.sh b/run_tempest.sh
index a704684..8c8f25f 100755
--- a/run_tempest.sh
+++ b/run_tempest.sh
@@ -14,8 +14,6 @@
   echo "  -C, --config             Config file location"
   echo "  -h, --help               Print this usage message"
   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 "
 }
 
@@ -31,10 +29,8 @@
 wrapper=""
 config_file=""
 update=0
-logging=0
-logging_config=etc/logging.conf
 
-if ! options=$(getopt -o VNnfusthdC:lL: -l virtual-env,no-virtual-env,no-site-packages,force,update,smoke,serial,help,debug,config:,logging,logging-config: -- "$@")
+if ! options=$(getopt -o VNnfusthdC:lL: -l virtual-env,no-virtual-env,no-site-packages,force,update,smoke,serial,help,debug,config: -- "$@")
 then
     # parse error
     usage
@@ -55,8 +51,6 @@
     -C|--config) config_file=$2; shift;;
     -s|--smoke) testrargs+="smoke";;
     -t|--serial) serial=1;;
-    -l|--logging) logging=1;;
-    -L|--logging-config) logging_config=$2; shift;;
     --) [ "yes" == "$first_uu" ] || testrargs="$testrargs $1"; first_uu=no  ;;
     *) testrargs="$testrargs $1";;
   esac
@@ -69,16 +63,6 @@
     export TEMPEST_CONFIG=`basename "$config_file"`
 fi
 
-if [ $logging -eq 1 ]; then
-    if [ ! -f "$logging_config" ]; then
-        echo "No such logging config file: $logging_config"
-        exit 1
-    fi
-    logging_config=`readlink -f "$logging_config"`
-    export TEMPEST_LOG_CONFIG_DIR=`dirname "$logging_config"`
-    export TEMPEST_LOG_CONFIG=`basename "$logging_config"`
-fi
-
 cd `dirname "$0"`
 
 if [ $no_site_packages -eq 1 ]; then
diff --git a/tempest/README.rst b/tempest/README.rst
index f93a173..113b191 100644
--- a/tempest/README.rst
+++ b/tempest/README.rst
@@ -16,7 +16,6 @@
 |    api/ - API tests
 |    scenario/ - complex scenario tests
 |    stress/ - stress tests
-|    thirdparty/ - 3rd party api tests
 
 Each of these directories contains different types of tests. What
 belongs in each directory, the rules and examples for good tests, are
@@ -56,14 +55,6 @@
 several test jobs in parallel and can run any existing test in Tempest as a
 stress job.
 
-:ref:`third_party_field_guide`
-------------------------------
-
-Many openstack components include 3rdparty API support. It is
-completely legitimate for Tempest to include tests of 3rdparty APIs,
-but those should be kept separate from the normal OpenStack
-validation.
-
 :ref:`unit_tests_field_guide`
 -----------------------------
 
diff --git a/tempest/api/compute/admin/test_floating_ips_bulk.py b/tempest/api/compute/admin/test_floating_ips_bulk.py
index fe05ddb..456363c 100644
--- a/tempest/api/compute/admin/test_floating_ips_bulk.py
+++ b/tempest/api/compute/admin/test_floating_ips_bulk.py
@@ -38,7 +38,7 @@
     @classmethod
     def resource_setup(cls):
         super(FloatingIPsBulkAdminTestJSON, cls).resource_setup()
-        cls.ip_range = CONF.compute.floating_ip_range
+        cls.ip_range = CONF.validation.floating_ip_range
         cls.verify_unallocated_floating_ip_range(cls.ip_range)
 
     @classmethod
diff --git a/tempest/api/compute/admin/test_security_groups.py b/tempest/api/compute/admin/test_security_groups.py
index e31129b..1494745 100644
--- a/tempest/api/compute/admin/test_security_groups.py
+++ b/tempest/api/compute/admin/test_security_groups.py
@@ -13,8 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import testtools
-
 from tempest.api.compute import base
 from tempest.common.utils import data_utils
 from tempest import config
@@ -38,9 +36,6 @@
             self.client.delete_security_group(securitygroup_id)
 
     @test.idempotent_id('49667619-5af9-4c63-ab5d-2cfdd1c8f7f1')
-    @testtools.skipIf(CONF.service_available.neutron,
-                      "Skipped because neutron does not support all_tenants "
-                      "search filter.")
     @test.services('network')
     def test_list_security_groups_list_all_tenants_filter(self):
         # Admin can list security groups of all tenants
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index 2321b4e..aa8ee3f 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -101,13 +101,13 @@
         super(BaseV2ComputeTest, cls).resource_setup()
         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.ssh_user = CONF.validation.image_ssh_user
+        cls.image_ssh_user = CONF.validation.image_ssh_user
+        cls.image_ssh_password = CONF.validation.image_ssh_password
         cls.servers = []
         cls.images = []
         cls.security_groups = []
diff --git a/tempest/api/compute/servers/test_server_personality.py b/tempest/api/compute/servers/test_server_personality.py
index 58d26d3..c948f8c 100644
--- a/tempest/api/compute/servers/test_server_personality.py
+++ b/tempest/api/compute/servers/test_server_personality.py
@@ -55,13 +55,14 @@
         file_path = '/test.txt'
         personality = [{'path': file_path,
                         'contents': base64.b64encode(file_contents)}]
-        server = self.create_test_server(personality=personality,
-                                         wait_until='ACTIVE',
-                                         validatable=True)
+        created_server = self.create_test_server(personality=personality,
+                                                 wait_until='ACTIVE',
+                                                 validatable=True)
+        server = self.client.show_server(created_server['id'])['server']
         if CONF.validation.run_validation:
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server),
-                self.ssh_user, server['adminPass'],
+                self.ssh_user, created_server['adminPass'],
                 self.validation_resources['keypair']['private_key'])
             self.assertEqual(file_contents,
                              linux_client.exec_command(
@@ -116,13 +117,14 @@
                 'path': path,
                 'contents': base64.b64encode(file_contents),
             })
-        server = self.create_test_server(personality=person,
-                                         wait_until='ACTIVE',
-                                         validatable=True)
+        created_server = self.create_test_server(personality=person,
+                                                 wait_until='ACTIVE',
+                                                 validatable=True)
+        server = self.client.show_server(created_server['id'])['server']
         if CONF.validation.run_validation:
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server),
-                self.ssh_user, server['adminPass'],
+                self.ssh_user, created_server['adminPass'],
                 self.validation_resources['keypair']['private_key'])
             for i in person:
                 self.assertEqual(base64.b64decode(i['contents']),
diff --git a/tempest/api/identity/admin/v2/test_roles.py b/tempest/api/identity/admin/v2/test_roles.py
index 8702db7..3f3d16e 100644
--- a/tempest/api/identity/admin/v2/test_roles.py
+++ b/tempest/api/identity/admin/v2/test_roles.py
@@ -27,7 +27,7 @@
         super(RolesTestJSON, cls).resource_setup()
         for _ in moves.xrange(5):
             role_name = data_utils.rand_name(name='role')
-            role = cls.client.create_role(role_name)['role']
+            role = cls.roles_client.create_role(name=role_name)['role']
             cls.data.roles.append(role)
 
     def _get_role_params(self):
@@ -48,7 +48,7 @@
     @test.idempotent_id('75d9593f-50b7-4fcf-bd64-e3fb4a278e23')
     def test_list_roles(self):
         """Return a list of all roles."""
-        body = self.client.list_roles()['roles']
+        body = self.roles_client.list_roles()['roles']
         found = [role for role in body if role in self.data.roles]
         self.assertTrue(any(found))
         self.assertEqual(len(found), len(self.data.roles))
@@ -57,16 +57,16 @@
     def test_role_create_delete(self):
         """Role should be created, verified, and deleted."""
         role_name = data_utils.rand_name(name='role-test')
-        body = self.client.create_role(role_name)['role']
+        body = self.roles_client.create_role(name=role_name)['role']
         self.assertEqual(role_name, body['name'])
 
-        body = self.client.list_roles()['roles']
+        body = self.roles_client.list_roles()['roles']
         found = [role for role in body if role['name'] == role_name]
         self.assertTrue(any(found))
 
-        body = self.client.delete_role(found[0]['id'])
+        body = self.roles_client.delete_role(found[0]['id'])
 
-        body = self.client.list_roles()['roles']
+        body = self.roles_client.list_roles()['roles']
         found = [role for role in body if role['name'] == role_name]
         self.assertFalse(any(found))
 
@@ -76,7 +76,7 @@
         self.data.setup_test_role()
         role_id = self.data.role['id']
         role_name = self.data.role['name']
-        body = self.client.show_role(role_id)['role']
+        body = self.roles_client.show_role(role_id)['role']
         self.assertEqual(role_id, body['id'])
         self.assertEqual(role_name, body['name'])
 
@@ -84,24 +84,28 @@
     def test_assign_user_role(self):
         """Assign a role to a user on a tenant."""
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'], user['id'], role['id'])
-        roles = self.client.list_user_roles(tenant['id'], user['id'])['roles']
+        self.roles_client.assign_user_role(tenant['id'], user['id'],
+                                           role['id'])
+        roles = self.roles_client.list_user_roles(tenant['id'],
+                                                  user['id'])['roles']
         self.assert_role_in_role_list(role, roles)
 
     @test.idempotent_id('f0b9292c-d3ba-4082-aa6c-440489beef69')
     def test_remove_user_role(self):
         """Remove a role assigned to a user on a tenant."""
         (user, tenant, role) = self._get_role_params()
-        user_role = self.client.assign_user_role(tenant['id'],
-                                                 user['id'],
-                                                 role['id'])['role']
-        self.client.delete_user_role(tenant['id'], user['id'],
-                                     user_role['id'])
+        user_role = self.roles_client.assign_user_role(tenant['id'],
+                                                       user['id'],
+                                                       role['id'])['role']
+        self.roles_client.delete_user_role(tenant['id'], user['id'],
+                                           user_role['id'])
 
     @test.idempotent_id('262e1e3e-ed71-4edd-a0e5-d64e83d66d05')
     def test_list_user_roles(self):
         """List roles assigned to a user on tenant."""
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'], user['id'], role['id'])
-        roles = self.client.list_user_roles(tenant['id'], user['id'])['roles']
+        self.roles_client.assign_user_role(tenant['id'], user['id'],
+                                           role['id'])
+        roles = self.roles_client.list_user_roles(tenant['id'],
+                                                  user['id'])['roles']
         self.assert_role_in_role_list(role, roles)
diff --git a/tempest/api/identity/admin/v2/test_roles_negative.py b/tempest/api/identity/admin/v2/test_roles_negative.py
index 45c95df..c9af7c6 100644
--- a/tempest/api/identity/admin/v2/test_roles_negative.py
+++ b/tempest/api/identity/admin/v2/test_roles_negative.py
@@ -37,7 +37,7 @@
     def test_list_roles_by_unauthorized_user(self):
         # Non-administrator user should not be able to list roles
         self.assertRaises(lib_exc.Forbidden,
-                          self.non_admin_client.list_roles)
+                          self.non_admin_roles_client.list_roles)
 
     @test.attr(type=['negative'])
     @test.idempotent_id('11a3c7da-df6c-40c2-abc2-badd682edf9f')
@@ -45,14 +45,15 @@
         # Request to list roles without a valid token should fail
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
-        self.assertRaises(lib_exc.Unauthorized, self.client.list_roles)
+        self.assertRaises(lib_exc.Unauthorized, self.roles_client.list_roles)
         self.client.auth_provider.clear_auth()
 
     @test.attr(type=['negative'])
     @test.idempotent_id('c0b89e56-accc-4c73-85f8-9c0f866104c1')
     def test_role_create_blank_name(self):
         # Should not be able to create a role with a blank name
-        self.assertRaises(lib_exc.BadRequest, self.client.create_role, '')
+        self.assertRaises(lib_exc.BadRequest, self.roles_client.create_role,
+                          name='')
 
     @test.attr(type=['negative'])
     @test.idempotent_id('585c8998-a8a4-4641-a5dd-abef7a8ced00')
@@ -60,7 +61,8 @@
         # Non-administrator user should not be able to create role
         role_name = data_utils.rand_name(name='role')
         self.assertRaises(lib_exc.Forbidden,
-                          self.non_admin_client.create_role, role_name)
+                          self.non_admin_roles_client.create_role,
+                          name=role_name)
 
     @test.attr(type=['negative'])
     @test.idempotent_id('a7edd17a-e34a-4aab-8bb7-fa6f498645b8')
@@ -70,7 +72,7 @@
         self.client.delete_token(token)
         role_name = data_utils.rand_name(name='role')
         self.assertRaises(lib_exc.Unauthorized,
-                          self.client.create_role, role_name)
+                          self.roles_client.create_role, name=role_name)
         self.client.auth_provider.clear_auth()
 
     @test.attr(type=['negative'])
@@ -78,35 +80,35 @@
     def test_role_create_duplicate(self):
         # Role names should be unique
         role_name = data_utils.rand_name(name='role-dup')
-        body = self.client.create_role(role_name)['role']
+        body = self.roles_client.create_role(name=role_name)['role']
         role1_id = body.get('id')
-        self.addCleanup(self.client.delete_role, role1_id)
-        self.assertRaises(lib_exc.Conflict, self.client.create_role,
-                          role_name)
+        self.addCleanup(self.roles_client.delete_role, role1_id)
+        self.assertRaises(lib_exc.Conflict, self.roles_client.create_role,
+                          name=role_name)
 
     @test.attr(type=['negative'])
     @test.idempotent_id('15347635-b5b1-4a87-a280-deb2bd6d865e')
     def test_delete_role_by_unauthorized_user(self):
         # Non-administrator user should not be able to delete role
         role_name = data_utils.rand_name(name='role')
-        body = self.client.create_role(role_name)['role']
+        body = self.roles_client.create_role(name=role_name)['role']
         self.data.roles.append(body)
         role_id = body.get('id')
         self.assertRaises(lib_exc.Forbidden,
-                          self.non_admin_client.delete_role, role_id)
+                          self.non_admin_roles_client.delete_role, role_id)
 
     @test.attr(type=['negative'])
     @test.idempotent_id('44b60b20-70de-4dac-beaf-a3fc2650a16b')
     def test_delete_role_request_without_token(self):
         # Request to delete role without a valid token should fail
         role_name = data_utils.rand_name(name='role')
-        body = self.client.create_role(role_name)['role']
+        body = self.roles_client.create_role(name=role_name)['role']
         self.data.roles.append(body)
         role_id = body.get('id')
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
         self.assertRaises(lib_exc.Unauthorized,
-                          self.client.delete_role,
+                          self.roles_client.delete_role,
                           role_id)
         self.client.auth_provider.clear_auth()
 
@@ -115,7 +117,7 @@
     def test_delete_role_non_existent(self):
         # Attempt to delete a non existent role should fail
         non_existent_role = str(uuid.uuid4().hex)
-        self.assertRaises(lib_exc.NotFound, self.client.delete_role,
+        self.assertRaises(lib_exc.NotFound, self.roles_client.delete_role,
                           non_existent_role)
 
     @test.attr(type=['negative'])
@@ -125,7 +127,7 @@
         # assign a role to user
         (user, tenant, role) = self._get_role_params()
         self.assertRaises(lib_exc.Forbidden,
-                          self.non_admin_client.assign_user_role,
+                          self.non_admin_roles_client.assign_user_role,
                           tenant['id'], user['id'], role['id'])
 
     @test.attr(type=['negative'])
@@ -136,7 +138,7 @@
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
         self.assertRaises(lib_exc.Unauthorized,
-                          self.client.assign_user_role, tenant['id'],
+                          self.roles_client.assign_user_role, tenant['id'],
                           user['id'], role['id'])
         self.client.auth_provider.clear_auth()
 
@@ -146,7 +148,7 @@
         # Attempt to assign a non existent role to user should fail
         (user, tenant, role) = self._get_role_params()
         non_existent_role = str(uuid.uuid4().hex)
-        self.assertRaises(lib_exc.NotFound, self.client.assign_user_role,
+        self.assertRaises(lib_exc.NotFound, self.roles_client.assign_user_role,
                           tenant['id'], user['id'], non_existent_role)
 
     @test.attr(type=['negative'])
@@ -155,7 +157,7 @@
         # Attempt to assign a role on a non existent tenant should fail
         (user, tenant, role) = self._get_role_params()
         non_existent_tenant = str(uuid.uuid4().hex)
-        self.assertRaises(lib_exc.NotFound, self.client.assign_user_role,
+        self.assertRaises(lib_exc.NotFound, self.roles_client.assign_user_role,
                           non_existent_tenant, user['id'], role['id'])
 
     @test.attr(type=['negative'])
@@ -163,8 +165,9 @@
     def test_assign_duplicate_user_role(self):
         # Duplicate user role should not get assigned
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'], user['id'], role['id'])
-        self.assertRaises(lib_exc.Conflict, self.client.assign_user_role,
+        self.roles_client.assign_user_role(tenant['id'], user['id'],
+                                           role['id'])
+        self.assertRaises(lib_exc.Conflict, self.roles_client.assign_user_role,
                           tenant['id'], user['id'], role['id'])
 
     @test.attr(type=['negative'])
@@ -173,11 +176,11 @@
         # Non-administrator user should not be authorized to
         # remove a user's role
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'],
-                                     user['id'],
-                                     role['id'])
+        self.roles_client.assign_user_role(tenant['id'],
+                                           user['id'],
+                                           role['id'])
         self.assertRaises(lib_exc.Forbidden,
-                          self.non_admin_client.delete_user_role,
+                          self.non_admin_roles_client.delete_user_role,
                           tenant['id'], user['id'], role['id'])
 
     @test.attr(type=['negative'])
@@ -185,13 +188,13 @@
     def test_remove_user_role_request_without_token(self):
         # Request to remove a user's role without a valid token
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'],
-                                     user['id'],
-                                     role['id'])
+        self.roles_client.assign_user_role(tenant['id'],
+                                           user['id'],
+                                           role['id'])
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
         self.assertRaises(lib_exc.Unauthorized,
-                          self.client.delete_user_role, tenant['id'],
+                          self.roles_client.delete_user_role, tenant['id'],
                           user['id'], role['id'])
         self.client.auth_provider.clear_auth()
 
@@ -200,11 +203,11 @@
     def test_remove_user_role_non_existent_role(self):
         # Attempt to delete a non existent role from a user should fail
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'],
-                                     user['id'],
-                                     role['id'])
+        self.roles_client.assign_user_role(tenant['id'],
+                                           user['id'],
+                                           role['id'])
         non_existent_role = str(uuid.uuid4().hex)
-        self.assertRaises(lib_exc.NotFound, self.client.delete_user_role,
+        self.assertRaises(lib_exc.NotFound, self.roles_client.delete_user_role,
                           tenant['id'], user['id'], non_existent_role)
 
     @test.attr(type=['negative'])
@@ -212,11 +215,11 @@
     def test_remove_user_role_non_existent_tenant(self):
         # Attempt to remove a role from a non existent tenant should fail
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'],
-                                     user['id'],
-                                     role['id'])
+        self.roles_client.assign_user_role(tenant['id'],
+                                           user['id'],
+                                           role['id'])
         non_existent_tenant = str(uuid.uuid4().hex)
-        self.assertRaises(lib_exc.NotFound, self.client.delete_user_role,
+        self.assertRaises(lib_exc.NotFound, self.roles_client.delete_user_role,
                           non_existent_tenant, user['id'], role['id'])
 
     @test.attr(type=['negative'])
@@ -225,10 +228,11 @@
         # Non-administrator user should not be authorized to list
         # a user's roles
         (user, tenant, role) = self._get_role_params()
-        self.client.assign_user_role(tenant['id'], user['id'], role['id'])
+        self.roles_client.assign_user_role(tenant['id'], user['id'],
+                                           role['id'])
         self.assertRaises(lib_exc.Forbidden,
-                          self.non_admin_client.list_user_roles, tenant['id'],
-                          user['id'])
+                          self.non_admin_roles_client.list_user_roles,
+                          tenant['id'], user['id'])
 
     @test.attr(type=['negative'])
     @test.idempotent_id('682adfb2-fd5f-4b0a-a9ca-322e9bebb907')
@@ -239,7 +243,7 @@
         self.client.delete_token(token)
         try:
             self.assertRaises(lib_exc.Unauthorized,
-                              self.client.list_user_roles, tenant['id'],
+                              self.roles_client.list_user_roles, tenant['id'],
                               user['id'])
         finally:
             self.client.auth_provider.clear_auth()
diff --git a/tempest/api/identity/admin/v2/test_tokens.py b/tempest/api/identity/admin/v2/test_tokens.py
index 0daa66d..fdb5a5a 100644
--- a/tempest/api/identity/admin/v2/test_tokens.py
+++ b/tempest/api/identity/admin/v2/test_tokens.py
@@ -77,15 +77,15 @@
 
         # Create a role
         role_name = data_utils.rand_name(name='role')
-        role = self.client.create_role(role_name)['role']
+        role = self.roles_client.create_role(name=role_name)['role']
         self.data.roles.append(role)
 
         # Grant the user the role on the tenants.
-        self.client.assign_user_role(tenant1['id'], user['id'],
-                                     role['id'])
+        self.roles_client.assign_user_role(tenant1['id'], user['id'],
+                                           role['id'])
 
-        self.client.assign_user_role(tenant2['id'], user['id'],
-                                     role['id'])
+        self.roles_client.assign_user_role(tenant2['id'], user['id'],
+                                           role['id'])
 
         # Get an unscoped token.
         body = self.token_client.auth(user_name, user_password)
diff --git a/tempest/api/identity/admin/v2/test_users.py b/tempest/api/identity/admin/v2/test_users.py
index 9cf1ce0..d886524 100644
--- a/tempest/api/identity/admin/v2/test_users.py
+++ b/tempest/api/identity/admin/v2/test_users.py
@@ -170,8 +170,8 @@
         user_ids = list()
         fetched_user_ids = list()
         user_ids.append(user['id'])
-        role = self.client.assign_user_role(tenant['id'], user['id'],
-                                            role['id'])['role']
+        role = self.roles_client.assign_user_role(tenant['id'], user['id'],
+                                                  role['id'])['role']
 
         alt_user2 = data_utils.rand_name('second_user')
         alt_password2 = data_utils.rand_password()
@@ -180,9 +180,9 @@
                                               'user2@123')['user']
         user_ids.append(second_user['id'])
         self.data.users.append(second_user)
-        role = self.client.assign_user_role(tenant['id'],
-                                            second_user['id'],
-                                            role['id'])['role']
+        role = self.roles_client.assign_user_role(tenant['id'],
+                                                  second_user['id'],
+                                                  role['id'])['role']
         # List of users with roles for the respective tenant ID
         body = (self.tenants_client.list_tenant_users(self.data.tenant['id'])
                 ['users'])
@@ -202,7 +202,7 @@
         # Updating the user with new password
         new_pass = data_utils.rand_password()
         update_user = self.client.update_user_password(
-            self.data.user['id'], new_pass)['user']
+            self.data.user['id'], password=new_pass)['user']
         self.assertEqual(update_user['id'], self.data.user['id'])
 
         # Validate the updated password
diff --git a/tempest/api/identity/admin/v3/test_endpoints.py b/tempest/api/identity/admin/v3/test_endpoints.py
index 429e2e3..2ac832e 100644
--- a/tempest/api/identity/admin/v3/test_endpoints.py
+++ b/tempest/api/identity/admin/v3/test_endpoints.py
@@ -34,8 +34,8 @@
         s_type = data_utils.rand_name('type')
         s_description = data_utils.rand_name('description')
         cls.service_data = (
-            cls.service_client.create_service(name=s_name, type=s_type,
-                                              description=s_description))
+            cls.services_client.create_service(name=s_name, type=s_type,
+                                               description=s_description))
         cls.service_data = cls.service_data['service']
         cls.service_id = cls.service_data['id']
         cls.service_ids.append(cls.service_id)
@@ -56,7 +56,7 @@
         for e in cls.setup_endpoints:
             cls.client.delete_endpoint(e['id'])
         for s in cls.service_ids:
-            cls.service_client.delete_service(s)
+            cls.services_client.delete_service(s)
         super(EndPointsTestJSON, cls).resource_cleanup()
 
     @test.idempotent_id('c19ecf90-240e-4e23-9966-21cee3f6a618')
@@ -113,8 +113,8 @@
         s_type = data_utils.rand_name('type')
         s_description = data_utils.rand_name('description')
         service2 = (
-            self.service_client.create_service(name=s_name, type=s_type,
-                                               description=s_description))
+            self.services_client.create_service(name=s_name, type=s_type,
+                                                description=s_description))
         service2 = service2['service']
         self.service_ids.append(service2['id'])
         # Updating endpoint with new values
diff --git a/tempest/api/identity/admin/v3/test_endpoints_negative.py b/tempest/api/identity/admin/v3/test_endpoints_negative.py
index 8f9bf2a..372254f 100644
--- a/tempest/api/identity/admin/v3/test_endpoints_negative.py
+++ b/tempest/api/identity/admin/v3/test_endpoints_negative.py
@@ -37,8 +37,8 @@
         s_type = data_utils.rand_name('type')
         s_description = data_utils.rand_name('description')
         cls.service_data = (
-            cls.service_client.create_service(name=s_name, type=s_type,
-                                              description=s_description)
+            cls.services_client.create_service(name=s_name, type=s_type,
+                                               description=s_description)
             ['service'])
         cls.service_id = cls.service_data['id']
         cls.service_ids.append(cls.service_id)
@@ -46,7 +46,7 @@
     @classmethod
     def resource_cleanup(cls):
         for s in cls.service_ids:
-            cls.service_client.delete_service(s)
+            cls.services_client.delete_service(s)
         super(EndpointsNegativeTestJSON, cls).resource_cleanup()
 
     @test.attr(type=['negative'])
diff --git a/tempest/api/identity/admin/v3/test_policies.py b/tempest/api/identity/admin/v3/test_policies.py
index f38d25d..3b5e5d4 100644
--- a/tempest/api/identity/admin/v3/test_policies.py
+++ b/tempest/api/identity/admin/v3/test_policies.py
@@ -21,7 +21,7 @@
 class PoliciesTestJSON(base.BaseIdentityV3AdminTest):
 
     def _delete_policy(self, policy_id):
-        self.policy_client.delete_policy(policy_id)
+        self.policies_client.delete_policy(policy_id)
 
     @test.idempotent_id('1a0ad286-2d06-4123-ab0d-728893a76201')
     def test_list_policies(self):
@@ -31,13 +31,13 @@
         for _ in range(3):
             blob = data_utils.rand_name('BlobName')
             policy_type = data_utils.rand_name('PolicyType')
-            policy = self.policy_client.create_policy(
+            policy = self.policies_client.create_policy(
                 blob=blob, type=policy_type)['policy']
             # Delete the Policy at the end of this method
             self.addCleanup(self._delete_policy, policy['id'])
             policy_ids.append(policy['id'])
         # List and Verify Policies
-        body = self.policy_client.list_policies()['policies']
+        body = self.policies_client.list_policies()['policies']
         for p in body:
             fetched_ids.append(p['id'])
         missing_pols = [p for p in policy_ids if p not in fetched_ids]
@@ -49,8 +49,8 @@
         # Test to update policy
         blob = data_utils.rand_name('BlobName')
         policy_type = data_utils.rand_name('PolicyType')
-        policy = self.policy_client.create_policy(blob=blob,
-                                                  type=policy_type)['policy']
+        policy = self.policies_client.create_policy(blob=blob,
+                                                    type=policy_type)['policy']
         self.addCleanup(self._delete_policy, policy['id'])
         self.assertIn('id', policy)
         self.assertIn('type', policy)
@@ -60,11 +60,12 @@
         self.assertEqual(policy_type, policy['type'])
         # Update policy
         update_type = data_utils.rand_name('UpdatedPolicyType')
-        data = self.policy_client.update_policy(
+        data = self.policies_client.update_policy(
             policy['id'], type=update_type)['policy']
         self.assertIn('type', data)
         # Assertion for updated value with fetched value
-        fetched_policy = self.policy_client.show_policy(policy['id'])['policy']
+        fetched_policy = self.policies_client.show_policy(
+            policy['id'])['policy']
         self.assertIn('id', fetched_policy)
         self.assertIn('blob', fetched_policy)
         self.assertIn('type', fetched_policy)
diff --git a/tempest/api/identity/admin/v3/test_regions.py b/tempest/api/identity/admin/v3/test_regions.py
index ec1b12e..8bba3cb 100644
--- a/tempest/api/identity/admin/v3/test_regions.py
+++ b/tempest/api/identity/admin/v3/test_regions.py
@@ -25,7 +25,7 @@
     @classmethod
     def setup_clients(cls):
         super(RegionsTestJSON, cls).setup_clients()
-        cls.client = cls.region_client
+        cls.client = cls.regions_client
 
     @classmethod
     def resource_setup(cls):
diff --git a/tempest/api/identity/admin/v3/test_roles.py b/tempest/api/identity/admin/v3/test_roles.py
index f194d9c..ae714aa 100644
--- a/tempest/api/identity/admin/v3/test_roles.py
+++ b/tempest/api/identity/admin/v3/test_roles.py
@@ -25,7 +25,7 @@
         super(RolesV3TestJSON, cls).resource_setup()
         for _ in range(3):
             role_name = data_utils.rand_name(name='role')
-            role = cls.client.create_role(role_name)['role']
+            role = cls.client.create_role(name=role_name)['role']
             cls.data.v3_roles.append(role)
         cls.fetched_role_ids = list()
         u_name = data_utils.rand_name('user')
@@ -47,7 +47,7 @@
             email=u_email, project_id=cls.project['id'],
             domain_id=cls.domain['id'])['user']
         cls.role = cls.client.create_role(
-            data_utils.rand_name('Role'))['role']
+            name=data_utils.rand_name('Role'))['role']
 
     @classmethod
     def resource_cleanup(cls):
@@ -69,13 +69,14 @@
     @test.idempotent_id('18afc6c0-46cf-4911-824e-9989cc056c3a')
     def test_role_create_update_get_list(self):
         r_name = data_utils.rand_name('Role')
-        role = self.client.create_role(r_name)['role']
+        role = self.client.create_role(name=r_name)['role']
         self.addCleanup(self.client.delete_role, role['id'])
         self.assertIn('name', role)
         self.assertEqual(role['name'], r_name)
 
         new_name = data_utils.rand_name('NewRole')
-        updated_role = self.client.update_role(new_name, role['id'])['role']
+        updated_role = self.client.update_role(role['id'],
+                                               name=new_name)['role']
         self.assertIn('name', updated_role)
         self.assertIn('id', updated_role)
         self.assertIn('links', updated_role)
diff --git a/tempest/api/identity/admin/v3/test_services.py b/tempest/api/identity/admin/v3/test_services.py
index d1595dd..c6e3df4 100644
--- a/tempest/api/identity/admin/v3/test_services.py
+++ b/tempest/api/identity/admin/v3/test_services.py
@@ -24,9 +24,9 @@
 
     def _del_service(self, service_id):
         # Used for deleting the services created in this class
-        self.service_client.delete_service(service_id)
+        self.services_client.delete_service(service_id)
         # Checking whether service is deleted successfully
-        self.assertRaises(lib_exc.NotFound, self.service_client.show_service,
+        self.assertRaises(lib_exc.NotFound, self.services_client.show_service,
                           service_id)
 
     @test.attr(type='smoke')
@@ -36,7 +36,7 @@
         name = data_utils.rand_name('service')
         serv_type = data_utils.rand_name('type')
         desc = data_utils.rand_name('description')
-        create_service = self.service_client.create_service(
+        create_service = self.services_client.create_service(
             type=serv_type, name=name, description=desc)['service']
         self.addCleanup(self._del_service, create_service['id'])
         self.assertIsNotNone(create_service['id'])
@@ -49,14 +49,14 @@
         s_id = create_service['id']
         resp1_desc = create_service['description']
         s_desc2 = data_utils.rand_name('desc2')
-        update_service = self.service_client.update_service(
+        update_service = self.services_client.update_service(
             s_id, description=s_desc2)['service']
         resp2_desc = update_service['description']
 
         self.assertNotEqual(resp1_desc, resp2_desc)
 
         # Get service
-        fetched_service = self.service_client.show_service(s_id)['service']
+        fetched_service = self.services_client.show_service(s_id)['service']
         resp3_desc = fetched_service['description']
 
         self.assertEqual(resp2_desc, resp3_desc)
@@ -67,9 +67,9 @@
         # Create a service only with name and type
         name = data_utils.rand_name('service')
         serv_type = data_utils.rand_name('type')
-        service = self.service_client.create_service(
+        service = self.services_client.create_service(
             type=serv_type, name=name)['service']
-        self.addCleanup(self.service_client.delete_service, service['id'])
+        self.addCleanup(self.services_client.delete_service, service['id'])
         self.assertIn('id', service)
         expected_data = {'name': name, 'type': serv_type}
         self.assertDictContainsSubset(expected_data, service)
@@ -81,14 +81,14 @@
         for _ in range(3):
             name = data_utils.rand_name('service')
             serv_type = data_utils.rand_name('type')
-            create_service = self.service_client.create_service(
+            create_service = self.services_client.create_service(
                 type=serv_type, name=name)['service']
-            self.addCleanup(self.service_client.delete_service,
+            self.addCleanup(self.services_client.delete_service,
                             create_service['id'])
             service_ids.append(create_service['id'])
 
         # List and Verify Services
-        services = self.service_client.list_services()['services']
+        services = self.services_client.list_services()['services']
         fetched_ids = [service['id'] for service in services]
         found = [s for s in fetched_ids if s in service_ids]
         self.assertEqual(len(found), len(service_ids))
diff --git a/tempest/api/identity/admin/v3/test_tokens.py b/tempest/api/identity/admin/v3/test_tokens.py
index f5b20d5..b1446cf 100644
--- a/tempest/api/identity/admin/v3/test_tokens.py
+++ b/tempest/api/identity/admin/v3/test_tokens.py
@@ -76,7 +76,7 @@
 
         # Create a role
         role_name = data_utils.rand_name(name='role')
-        role = self.client.create_role(role_name)['role']
+        role = self.client.create_role(name=role_name)['role']
         self.addCleanup(self.client.delete_role, role['id'])
 
         # Grant the user the role on both projects.
diff --git a/tempest/api/identity/admin/v3/test_trusts.py b/tempest/api/identity/admin/v3/test_trusts.py
index bf7ad71..85961b4 100644
--- a/tempest/api/identity/admin/v3/test_trusts.py
+++ b/tempest/api/identity/admin/v3/test_trusts.py
@@ -69,10 +69,10 @@
         self.delegated_role = data_utils.rand_name('DelegatedRole')
         self.not_delegated_role = data_utils.rand_name('NotDelegatedRole')
 
-        role = self.client.create_role(self.delegated_role)['role']
+        role = self.client.create_role(name=self.delegated_role)['role']
         self.delegated_role_id = role['id']
 
-        role = self.client.create_role(self.not_delegated_role)['role']
+        role = self.client.create_role(name=self.not_delegated_role)['role']
         self.not_delegated_role_id = role['id']
 
         # Assign roles to trustor
diff --git a/tempest/api/identity/admin/v3/test_users.py b/tempest/api/identity/admin/v3/test_users.py
index 6dbd443..a402b3f 100644
--- a/tempest/api/identity/admin/v3/test_users.py
+++ b/tempest/api/identity/admin/v3/test_users.py
@@ -117,7 +117,7 @@
         self.addCleanup(self.client.delete_user, user_body['id'])
         # Creating Role
         role_body = self.client.create_role(
-            data_utils.rand_name('role'))['role']
+            name=data_utils.rand_name('role'))['role']
         # Delete the Role at the end of this method
         self.addCleanup(self.client.delete_role, role_body['id'])
 
diff --git a/tempest/api/identity/base.py b/tempest/api/identity/base.py
index 8359b8f..d68a204 100644
--- a/tempest/api/identity/base.py
+++ b/tempest/api/identity/base.py
@@ -30,7 +30,7 @@
     @classmethod
     def disable_user(cls, user_name):
         user = cls.get_user_by_name(user_name)
-        cls.client.enable_disable_user(user['id'], False)
+        cls.client.enable_disable_user(user['id'], enabled=False)
 
     @classmethod
     def disable_tenant(cls, tenant_name):
@@ -56,7 +56,7 @@
 
     @classmethod
     def get_role_by_name(cls, name):
-        roles = cls.client.list_roles()['roles']
+        roles = cls.roles_client.list_roles()['roles']
         role = [r for r in roles if r['name'] == name]
         if len(role) > 0:
             return role[0]
@@ -76,6 +76,7 @@
         cls.non_admin_client = cls.os.identity_public_client
         cls.non_admin_token_client = cls.os.token_client
         cls.non_admin_tenants_client = cls.os.tenants_public_client
+        cls.non_admin_roles_client = cls.os.roles_public_client
 
     @classmethod
     def resource_setup(cls):
@@ -98,11 +99,14 @@
         cls.token_client = cls.os_adm.token_client
         cls.tenants_client = cls.os_adm.tenants_client
         cls.non_admin_tenants_client = cls.os.tenants_client
+        cls.roles_client = cls.os_adm.roles_client
+        cls.non_admin_roles_client = cls.os.roles_client
 
     @classmethod
     def resource_setup(cls):
         super(BaseIdentityV2AdminTest, cls).resource_setup()
-        cls.data = DataGenerator(cls.client, cls.tenants_client)
+        cls.data = DataGenerator(cls.client, cls.tenants_client,
+                                 cls.roles_client)
 
     @classmethod
     def resource_cleanup(cls):
@@ -139,9 +143,9 @@
         cls.client = cls.os_adm.identity_v3_client
         cls.token = cls.os_adm.token_v3_client
         cls.endpoints_client = cls.os_adm.endpoints_client
-        cls.region_client = cls.os_adm.region_client
-        cls.service_client = cls.os_adm.service_client
-        cls.policy_client = cls.os_adm.policy_client
+        cls.regions_client = cls.os_adm.regions_client
+        cls.services_client = cls.os_adm.identity_services_client
+        cls.policies_client = cls.os_adm.policies_client
         cls.creds_client = cls.os_adm.credentials_client
         cls.groups_client = cls.os_adm.groups_client
 
@@ -187,10 +191,11 @@
 
 class DataGenerator(object):
 
-        def __init__(self, client, tenants_client=None):
+        def __init__(self, client, tenants_client=None, roles_client=None):
             self.client = client
             # TODO(dmellado) split Datagenerator for v2 and v3
             self.tenants_client = tenants_client
+            self.roles_client = roles_client
             self.users = []
             self.tenants = []
             self.roles = []
@@ -232,7 +237,8 @@
         def setup_test_role(self):
             """Set up a test role."""
             self.test_role = data_utils.rand_name('role')
-            self.role = self.client.create_role(self.test_role)['role']
+            self.role = self.roles_client.create_role(
+                name=self.test_role)['role']
             self.roles.append(self.role)
 
         def setup_test_v3_user(self):
@@ -260,7 +266,7 @@
         def setup_test_v3_role(self):
             """Set up a test v3 role."""
             self.test_role = data_utils.rand_name('role')
-            self.v3_role = self.client.create_role(self.test_role)['role']
+            self.v3_role = self.client.create_role(name=self.test_role)['role']
             self.v3_roles.append(self.v3_role)
 
         def setup_test_domain(self):
@@ -294,7 +300,7 @@
             for tenant in self.tenants:
                 self._try_wrapper(self.tenants_client.delete_tenant, tenant)
             for role in self.roles:
-                self._try_wrapper(self.client.delete_role, role)
+                self._try_wrapper(self.roles_client.delete_role, role)
             for v3_user in self.v3_users:
                 self._try_wrapper(self.client.delete_user, v3_user)
             for v3_project in self.projects:
diff --git a/tempest/api/identity/v2/test_users.py b/tempest/api/identity/v2/test_users.py
index 5f2a8c4..98a2e68 100644
--- a/tempest/api/identity/v2/test_users.py
+++ b/tempest/api/identity/v2/test_users.py
@@ -51,14 +51,10 @@
         # to change password back. important for allow_tenant_isolation = false
         self.addCleanup(
             self.non_admin_client_for_cleanup.update_user_own_password,
-            user_id=user_id,
-            new_pass=old_pass,
-            old_pass=new_pass)
-
+            user_id, original_password=new_pass, password=old_pass)
         # user updates own password
         self.non_admin_client.update_user_own_password(
-            user_id=user_id, new_pass=new_pass, old_pass=old_pass)
-
+            user_id, password=new_pass, original_password=old_pass)
         # TODO(lbragstad): Sleeping after the response status has been checked
         # and the body loaded as JSON allows requests to fail-fast. The sleep
         # is necessary because keystone will err on the side of security and
diff --git a/tempest/api/image/base.py b/tempest/api/image/base.py
index da0ce83..c3205ce 100644
--- a/tempest/api/image/base.py
+++ b/tempest/api/image/base.py
@@ -70,8 +70,10 @@
         container_format = kwargs.pop('container_format')
         disk_format = kwargs.pop('disk_format')
 
-        image = cls.client.create_image(name, container_format,
-                                        disk_format, **kwargs)
+        image = cls.client.create_image(name=name,
+                                        container_format=container_format,
+                                        disk_format=disk_format,
+                                        **kwargs)
         # Image objects returned by the v1 client have the image
         # data inside a dict that is keyed against 'image'.
         if 'image' in image:
@@ -156,7 +158,7 @@
 
     def _create_image(self):
         name = data_utils.rand_name('image')
-        image = self.os_img_client.create_image(name,
+        image = self.os_img_client.create_image(name=name,
                                                 container_format='bare',
                                                 disk_format='raw')
         image_id = image['id']
diff --git a/tempest/api/image/v2/test_images_negative.py b/tempest/api/image/v2/test_images_negative.py
index 71c8c7a..485942e 100644
--- a/tempest/api/image/v2/test_images_negative.py
+++ b/tempest/api/image/v2/test_images_negative.py
@@ -90,10 +90,12 @@
     def test_register_with_invalid_container_format(self):
         # Negative tests for invalid data supplied to POST /images
         self.assertRaises(lib_exc.BadRequest, self.client.create_image,
-                          'test', 'wrong', 'vhd')
+                          name='test', container_format='wrong',
+                          disk_format='vhd')
 
     @test.attr(type=['negative'])
     @test.idempotent_id('70c6040c-5a97-4111-9e13-e73665264ce1')
     def test_register_with_invalid_disk_format(self):
         self.assertRaises(lib_exc.BadRequest, self.client.create_image,
-                          'test', 'bare', 'wrong')
+                          name='test', container_format='bare',
+                          disk_format='wrong')
diff --git a/tempest/api/network/admin/test_agent_management.py b/tempest/api/network/admin/test_agent_management.py
index c5d0d57..61f8e15 100644
--- a/tempest/api/network/admin/test_agent_management.py
+++ b/tempest/api/network/admin/test_agent_management.py
@@ -29,13 +29,13 @@
     @classmethod
     def resource_setup(cls):
         super(AgentManagementTestJSON, cls).resource_setup()
-        body = cls.admin_client.list_agents()
+        body = cls.admin_agents_client.list_agents()
         agents = body['agents']
         cls.agent = agents[0]
 
     @test.idempotent_id('9c80f04d-11f3-44a4-8738-ed2f879b0ff4')
     def test_list_agent(self):
-        body = self.admin_client.list_agents()
+        body = self.admin_agents_client.list_agents()
         agents = body['agents']
         # Hearthbeats must be excluded from comparison
         self.agent.pop('heartbeat_timestamp', None)
@@ -47,12 +47,12 @@
 
     @test.idempotent_id('e335be47-b9a1-46fd-be30-0874c0b751e6')
     def test_list_agents_non_admin(self):
-        body = self.client.list_agents()
+        body = self.agents_client.list_agents()
         self.assertEqual(len(body["agents"]), 0)
 
     @test.idempotent_id('869bc8e8-0fda-4a30-9b71-f8a7cf58ca9f')
     def test_show_agent(self):
-        body = self.admin_client.show_agent(self.agent['id'])
+        body = self.admin_agents_client.show_agent(self.agent['id'])
         agent = body['agent']
         self.assertEqual(agent['id'], self.agent['id'])
 
@@ -62,8 +62,8 @@
         # Try to update the 'admin_state_up' to the original
         # one to avoid the negative effect.
         agent_status = {'admin_state_up': origin_status}
-        body = self.admin_client.update_agent(agent_id=self.agent['id'],
-                                              agent_info=agent_status)
+        body = self.admin_agents_client.update_agent(agent_id=self.agent['id'],
+                                                     agent=agent_status)
         updated_status = body['agent']['admin_state_up']
         self.assertEqual(origin_status, updated_status)
 
@@ -72,8 +72,8 @@
         self.useFixture(fixtures.LockFixture('agent_description'))
         description = 'description for update agent.'
         agent_description = {'description': description}
-        body = self.admin_client.update_agent(agent_id=self.agent['id'],
-                                              agent_info=agent_description)
+        body = self.admin_agents_client.update_agent(agent_id=self.agent['id'],
+                                                     agent=agent_description)
         self.addCleanup(self._restore_agent)
         updated_description = body['agent']['description']
         self.assertEqual(updated_description, description)
@@ -83,5 +83,5 @@
 
         description = self.agent['description'] or ''
         origin_agent = {'description': description}
-        self.admin_client.update_agent(agent_id=self.agent['id'],
-                                       agent_info=origin_agent)
+        self.admin_agents_client.update_agent(agent_id=self.agent['id'],
+                                              agent=origin_agent)
diff --git a/tempest/api/network/admin/test_dhcp_agent_scheduler.py b/tempest/api/network/admin/test_dhcp_agent_scheduler.py
index 7692b56..5ff465b 100644
--- a/tempest/api/network/admin/test_dhcp_agent_scheduler.py
+++ b/tempest/api/network/admin/test_dhcp_agent_scheduler.py
@@ -51,7 +51,7 @@
 
     def _check_network_in_dhcp_agent(self, network_id, agent):
         network_ids = []
-        body = self.admin_client.list_networks_hosted_by_one_dhcp_agent(
+        body = self.admin_agents_client.list_networks_hosted_by_one_dhcp_agent(
             agent['id'])
         networks = body['networks']
         for network in networks:
@@ -65,7 +65,7 @@
         self.ports.remove(self.port)
         agent = dict()
         agent['agent_type'] = None
-        body = self.admin_client.list_agents()
+        body = self.admin_agents_client.list_agents()
         agents = body['agents']
         for a in agents:
             if a['agent_type'] == 'DHCP agent':
@@ -84,14 +84,14 @@
             self._remove_network_from_dhcp_agent(network_id, agent)
 
     def _remove_network_from_dhcp_agent(self, network_id, agent):
-        self.admin_client.remove_network_from_dhcp_agent(
+        self.admin_agents_client.remove_network_from_dhcp_agent(
             agent_id=agent['id'],
             network_id=network_id)
         self.assertFalse(self._check_network_in_dhcp_agent(
             network_id, agent))
 
     def _add_dhcp_agent_to_network(self, network_id, agent):
-        self.admin_client.add_dhcp_agent_to_network(agent['id'],
-                                                    network_id)
+        self.admin_agents_client.add_dhcp_agent_to_network(
+            agent['id'], network_id=network_id)
         self.assertTrue(self._check_network_in_dhcp_agent(
             network_id, agent))
diff --git a/tempest/api/network/admin/test_l3_agent_scheduler.py b/tempest/api/network/admin/test_l3_agent_scheduler.py
index 36747a3..2e8fd50 100644
--- a/tempest/api/network/admin/test_l3_agent_scheduler.py
+++ b/tempest/api/network/admin/test_l3_agent_scheduler.py
@@ -51,7 +51,7 @@
     @classmethod
     def resource_setup(cls):
         super(L3AgentSchedulerTestJSON, cls).resource_setup()
-        body = cls.admin_client.list_agents()
+        body = cls.admin_agents_client.list_agents()
         agents = body['agents']
         for agent in agents:
             # TODO(armax): falling back on default _agent_mode can be
@@ -90,12 +90,12 @@
 
     @test.idempotent_id('b7ce6e89-e837-4ded-9b78-9ed3c9c6a45a')
     def test_list_routers_on_l3_agent(self):
-        self.admin_client.list_routers_on_l3_agent(self.agent['id'])
+        self.admin_agents_client.list_routers_on_l3_agent(self.agent['id'])
 
     @test.idempotent_id('9464e5e7-8625-49c3-8fd1-89c52be59d66')
     def test_add_list_remove_router_on_l3_agent(self):
         l3_agent_ids = list()
-        self.admin_client.add_router_to_l3_agent(
+        self.admin_agents_client.add_router_to_l3_agent(
             self.agent['id'],
             router_id=self.router['id'])
         body = (
@@ -105,7 +105,7 @@
             self.assertIn('agent_type', agent)
             self.assertEqual('L3 agent', agent['agent_type'])
         self.assertIn(self.agent['id'], l3_agent_ids)
-        body = self.admin_client.remove_router_from_l3_agent(
+        body = self.admin_agents_client.remove_router_from_l3_agent(
             self.agent['id'],
             self.router['id'])
         # NOTE(afazekas): The deletion not asserted, because neutron
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index f1fd3e9..2a1776a 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -71,11 +71,14 @@
     def setup_clients(cls):
         super(BaseNetworkTest, cls).setup_clients()
         cls.client = cls.os.network_client
+        cls.agents_client = cls.os.network_agents_client
         cls.networks_client = cls.os.networks_client
+        cls.subnetpools_client = cls.os.subnetpools_client
         cls.subnets_client = cls.os.subnets_client
         cls.ports_client = cls.os.ports_client
         cls.quotas_client = cls.os.network_quotas_client
         cls.floating_ips_client = cls.os.floating_ips_client
+        cls.security_groups_client = cls.os.security_groups_client
 
     @classmethod
     def resource_setup(cls):
@@ -272,6 +275,7 @@
     def setup_clients(cls):
         super(BaseAdminNetworkTest, cls).setup_clients()
         cls.admin_client = cls.os_adm.network_client
+        cls.admin_agents_client = cls.os_adm.network_agents_client
         cls.admin_networks_client = cls.os_adm.networks_client
         cls.admin_subnets_client = cls.os_adm.subnets_client
         cls.admin_ports_client = cls.os_adm.ports_client
diff --git a/tempest/api/network/base_security_groups.py b/tempest/api/network/base_security_groups.py
index 1cef2cc..1525e19 100644
--- a/tempest/api/network/base_security_groups.py
+++ b/tempest/api/network/base_security_groups.py
@@ -22,17 +22,18 @@
     def _create_security_group(self):
         # Create a security group
         name = data_utils.rand_name('secgroup-')
-        group_create_body = self.client.create_security_group(name=name)
+        group_create_body = (
+            self.security_groups_client.create_security_group(name=name))
         self.addCleanup(self._delete_security_group,
                         group_create_body['security_group']['id'])
         self.assertEqual(group_create_body['security_group']['name'], name)
         return group_create_body, name
 
     def _delete_security_group(self, secgroup_id):
-        self.client.delete_security_group(secgroup_id)
+        self.security_groups_client.delete_security_group(secgroup_id)
         # Asserting that the security group is not found in the list
         # after deletion
-        list_body = self.client.list_security_groups()
+        list_body = self.security_groups_client.list_security_groups()
         secgroup_list = list()
         for secgroup in list_body['security_groups']:
             secgroup_list.append(secgroup['id'])
diff --git a/tempest/api/network/test_networks.py b/tempest/api/network/test_networks.py
index a266142..1c446ef 100644
--- a/tempest/api/network/test_networks.py
+++ b/tempest/api/network/test_networks.py
@@ -449,9 +449,9 @@
     @test.idempotent_id('d4f9024d-1e28-4fc1-a6b1-25dbc6fa11e2')
     def test_bulk_create_delete_network(self):
         # Creates 2 networks in one request
-        network_names = [data_utils.rand_name('network-'),
-                         data_utils.rand_name('network-')]
-        body = self.client.create_bulk_network(network_names)
+        network_list = [{'name': data_utils.rand_name('network-')},
+                        {'name': data_utils.rand_name('network-')}]
+        body = self.client.create_bulk_network(networks=network_list)
         created_networks = body['networks']
         self.addCleanup(self._delete_networks, created_networks)
         # Asserting that the networks are found in the list after creation
@@ -486,7 +486,7 @@
             }
             subnets_list.append(p1)
         del subnets_list[1]['name']
-        body = self.client.create_bulk_subnet(subnets_list)
+        body = self.client.create_bulk_subnet(subnets=subnets_list)
         created_subnets = body['subnets']
         self.addCleanup(self._delete_subnets, created_subnets)
         # Asserting that the subnets are found in the list after creation
@@ -512,7 +512,7 @@
             }
             port_list.append(p1)
         del port_list[1]['name']
-        body = self.client.create_bulk_port(port_list)
+        body = self.client.create_bulk_port(ports=port_list)
         created_ports = body['ports']
         self.addCleanup(self._delete_ports, created_ports)
         # Asserting that the ports are found in the list after creation
diff --git a/tempest/api/network/test_ports.py b/tempest/api/network/test_ports.py
index 43da1c4..67f2c83 100644
--- a/tempest/api/network/test_ports.py
+++ b/tempest/api/network/test_ports.py
@@ -74,7 +74,7 @@
         network2 = self.create_network(network_name=name)
         network_list = [network1['id'], network2['id']]
         port_list = [{'network_id': net_id} for net_id in network_list]
-        body = self.client.create_bulk_port(port_list)
+        body = self.client.create_bulk_port(ports=port_list)
         created_ports = body['ports']
         port1 = created_ports[0]
         port2 = created_ports[1]
@@ -250,17 +250,19 @@
         fixed_ip_1 = [{'subnet_id': subnet_1['id']}]
 
         security_groups_list = list()
+        sec_grps_client = self.security_groups_client
         for name in security_groups_names:
-            group_create_body = self.client.create_security_group(
+            group_create_body = sec_grps_client.create_security_group(
                 name=name)
-            self.addCleanup(self.client.delete_security_group,
+            self.addCleanup(self.security_groups_client.delete_security_group,
                             group_create_body['security_group']['id'])
             security_groups_list.append(group_create_body['security_group']
                                         ['id'])
         # Create a port
         sec_grp_name = data_utils.rand_name('secgroup')
-        security_group = self.client.create_security_group(name=sec_grp_name)
-        self.addCleanup(self.client.delete_security_group,
+        security_group = sec_grps_client.create_security_group(
+            name=sec_grp_name)
+        self.addCleanup(self.security_groups_client.delete_security_group,
                         security_group['security_group']['id'])
         post_body = {
             "name": data_utils.rand_name('port-'),
diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py
index ed191b6..406ad44 100644
--- a/tempest/api/network/test_routers.py
+++ b/tempest/api/network/test_routers.py
@@ -301,7 +301,7 @@
 
         test_routes.sort(key=lambda x: x['destination'])
         extra_route = self.client.update_extra_routes(router['id'],
-                                                      test_routes)
+                                                      routes=test_routes)
         show_body = self.client.show_router(router['id'])
         # Assert the number of routes
         self.assertEqual(routes_num, len(extra_route['router']['routes']))
diff --git a/tempest/api/network/test_security_groups.py b/tempest/api/network/test_security_groups.py
index ccc5232..cf45328 100644
--- a/tempest/api/network/test_security_groups.py
+++ b/tempest/api/network/test_security_groups.py
@@ -71,7 +71,7 @@
     @test.idempotent_id('e30abd17-fef9-4739-8617-dc26da88e686')
     def test_list_security_groups(self):
         # Verify the that security group belonging to tenant exist in list
-        body = self.client.list_security_groups()
+        body = self.security_groups_client.list_security_groups()
         security_groups = body['security_groups']
         found = None
         for n in security_groups:
@@ -86,7 +86,7 @@
         group_create_body, name = self._create_security_group()
 
         # List security groups and verify if created group is there in response
-        list_body = self.client.list_security_groups()
+        list_body = self.security_groups_client.list_security_groups()
         secgroup_list = list()
         for secgroup in list_body['security_groups']:
             secgroup_list.append(secgroup['id'])
@@ -94,7 +94,7 @@
         # Update the security group
         new_name = data_utils.rand_name('security-')
         new_description = data_utils.rand_name('security-description')
-        update_body = self.client.update_security_group(
+        update_body = self.security_groups_client.update_security_group(
             group_create_body['security_group']['id'],
             name=new_name,
             description=new_description)
@@ -103,7 +103,7 @@
         self.assertEqual(update_body['security_group']['description'],
                          new_description)
         # Show details of the updated security group
-        show_body = self.client.show_security_group(
+        show_body = self.security_groups_client.show_security_group(
             group_create_body['security_group']['id'])
         self.assertEqual(show_body['security_group']['name'], new_name)
         self.assertEqual(show_body['security_group']['description'],
diff --git a/tempest/api/network/test_security_groups_negative.py b/tempest/api/network/test_security_groups_negative.py
index f80ea59..58e39e9 100644
--- a/tempest/api/network/test_security_groups_negative.py
+++ b/tempest/api/network/test_security_groups_negative.py
@@ -38,8 +38,9 @@
     @test.idempotent_id('424fd5c3-9ddc-486a-b45f-39bf0c820fc6')
     def test_show_non_existent_security_group(self):
         non_exist_id = str(uuid.uuid4())
-        self.assertRaises(lib_exc.NotFound, self.client.show_security_group,
-                          non_exist_id)
+        self.assertRaises(
+            lib_exc.NotFound, self.security_groups_client.show_security_group,
+            non_exist_id)
 
     @test.attr(type=['negative'])
     @test.idempotent_id('4c094c09-000b-4e41-8100-9617600c02a6')
@@ -54,7 +55,7 @@
     def test_delete_non_existent_security_group(self):
         non_exist_id = str(uuid.uuid4())
         self.assertRaises(lib_exc.NotFound,
-                          self.client.delete_security_group,
+                          self.security_groups_client.delete_security_group,
                           non_exist_id
                           )
 
@@ -163,7 +164,7 @@
         # Create security group named 'default', it should be failed.
         name = 'default'
         self.assertRaises(lib_exc.Conflict,
-                          self.client.create_security_group,
+                          self.security_groups_client.create_security_group,
                           name=name)
 
     @test.attr(type=['negative'])
diff --git a/tempest/api/network/test_subnetpools_extensions.py b/tempest/api/network/test_subnetpools_extensions.py
index 8a61ff8..29d1d89 100644
--- a/tempest/api/network/test_subnetpools_extensions.py
+++ b/tempest/api/network/test_subnetpools_extensions.py
@@ -50,27 +50,28 @@
         subnetpool_name = data_utils.rand_name('subnetpools')
         # create subnet pool
         prefix = CONF.network.default_network
-        body = self.client.create_subnetpools(name=subnetpool_name,
-                                              prefixes=prefix)
+        body = self.subnetpools_client.create_subnetpools(name=subnetpool_name,
+                                                          prefixes=prefix)
         subnetpool_id = body["subnetpool"]["id"]
         self.addCleanup(self._cleanup_subnetpools, subnetpool_id)
         self.assertEqual(subnetpool_name, body["subnetpool"]["name"])
         # get detail about subnet pool
-        body = self.client.show_subnetpools(subnetpool_id)
+        body = self.subnetpools_client.show_subnetpools(subnetpool_id)
         self.assertEqual(subnetpool_name, body["subnetpool"]["name"])
         # update the subnet pool
         subnetpool_name = data_utils.rand_name('subnetpools_update')
-        body = self.client.update_subnetpools(subnetpool_id,
-                                              name=subnetpool_name)
+        body = self.subnetpools_client.update_subnetpools(subnetpool_id,
+                                                          name=subnetpool_name)
         self.assertEqual(subnetpool_name, body["subnetpool"]["name"])
         # delete subnet pool
-        body = self.client.delete_subnetpools(subnetpool_id)
-        self.assertRaises(lib_exc.NotFound, self.client.show_subnetpools,
+        body = self.subnetpools_client.delete_subnetpools(subnetpool_id)
+        self.assertRaises(lib_exc.NotFound,
+                          self.subnetpools_client.show_subnetpools,
                           subnetpool_id)
 
     def _cleanup_subnetpools(self, subnetpool_id):
         # this is used to cleanup the resources
         try:
-            self.client.delete_subnetpools(subnetpool_id)
+            self.subnetpools_client.delete_subnetpools(subnetpool_id)
         except lib_exc.NotFound:
             pass
diff --git a/tempest/api/telemetry/base.py b/tempest/api/telemetry/base.py
index bbd01f0..bbf6db2 100644
--- a/tempest/api/telemetry/base.py
+++ b/tempest/api/telemetry/base.py
@@ -75,10 +75,11 @@
         return body
 
     @classmethod
-    def create_image(cls, client):
-        body = client.create_image(
-            data_utils.rand_name('image'), container_format='bare',
-            disk_format='raw', visibility='private')
+    def create_image(cls, client, **kwargs):
+        body = client.create_image(name=data_utils.rand_name('image'),
+                                   container_format='bare',
+                                   disk_format='raw',
+                                   **kwargs)
         # TODO(jswarren) Move ['image'] up to initial body value assignment
         # once both v1 and v2 glance clients include the full response
         # object.
diff --git a/tempest/api/telemetry/test_telemetry_notification_api.py b/tempest/api/telemetry/test_telemetry_notification_api.py
index 7511505..a575125 100644
--- a/tempest/api/telemetry/test_telemetry_notification_api.py
+++ b/tempest/api/telemetry/test_telemetry_notification_api.py
@@ -39,7 +39,7 @@
     @testtools.skipIf(not CONF.image_feature_enabled.api_v1,
                       "Glance api v1 is disabled")
     def test_check_glance_v1_notifications(self):
-        body = self.create_image(self.image_client)
+        body = self.create_image(self.image_client, is_public=False)
         self.image_client.update_image(body['id'], data='data')
 
         query = 'resource', 'eq', body['id']
@@ -55,7 +55,7 @@
     @testtools.skipIf(not CONF.image_feature_enabled.api_v2,
                       "Glance api v2 is disabled")
     def test_check_glance_v2_notifications(self):
-        body = self.create_image(self.image_client_v2)
+        body = self.create_image(self.image_client_v2, visibility='private')
 
         self.image_client_v2.store_image_file(body['id'], "file")
         self.image_client_v2.show_image_file(body['id'])
diff --git a/tempest/api/volume/admin/test_multi_backend.py b/tempest/api/volume/admin/test_multi_backend.py
index 6d2aaea..8e43b00 100644
--- a/tempest/api/volume/admin/test_multi_backend.py
+++ b/tempest/api/volume/admin/test_multi_backend.py
@@ -71,7 +71,7 @@
         else:
             extra_specs = {spec_key_without_prefix: backend_name_key}
         self.type = self.volume_types_client.create_volume_type(
-            type_name, extra_specs=extra_specs)['volume_type']
+            name=type_name, extra_specs=extra_specs)['volume_type']
         self.volume_type_id_list.append(self.type['id'])
 
         params = {self.name_field: vol_name, 'volume_type': type_name}
diff --git a/tempest/api/volume/admin/test_volume_types.py b/tempest/api/volume/admin/test_volume_types.py
index 2d9019a..acb591d 100644
--- a/tempest/api/volume/admin/test_volume_types.py
+++ b/tempest/api/volume/admin/test_volume_types.py
@@ -32,7 +32,7 @@
 
     @test.idempotent_id('9d9b28e3-1b2e-4483-a2cc-24aa0ea1de54')
     def test_volume_type_list(self):
-        # List Volume types.
+        # List volume types.
         body = self.volume_types_client.list_volume_types()['volume_types']
         self.assertIsInstance(body, list)
 
@@ -50,7 +50,7 @@
         for i in range(2):
             vol_type_name = data_utils.rand_name("volume-type")
             vol_type = self.volume_types_client.create_volume_type(
-                vol_type_name,
+                name=vol_type_name,
                 extra_specs=extra_specs)['volume_type']
             volume_types.append(vol_type)
             self.addCleanup(self._delete_volume_type, vol_type['id'])
@@ -97,7 +97,7 @@
         extra_specs = {"storage_protocol": proto,
                        "vendor_name": vendor}
         body = self.volume_types_client.create_volume_type(
-            name,
+            name=name,
             extra_specs=extra_specs)['volume_type']
         self.assertIn('id', body)
         self.addCleanup(self._delete_volume_type, body['id'])
@@ -125,7 +125,8 @@
         provider = "LuksEncryptor"
         control_location = "front-end"
         name = data_utils.rand_name("volume-type")
-        body = self.volume_types_client.create_volume_type(name)['volume_type']
+        body = self.volume_types_client.create_volume_type(
+            name=name)['volume_type']
         self.addCleanup(self._delete_volume_type, body['id'])
 
         # Create encryption type
diff --git a/tempest/api/volume/admin/test_volume_types_extra_specs.py b/tempest/api/volume/admin/test_volume_types_extra_specs.py
index bec803c..502cd86 100644
--- a/tempest/api/volume/admin/test_volume_types_extra_specs.py
+++ b/tempest/api/volume/admin/test_volume_types_extra_specs.py
@@ -25,7 +25,7 @@
         super(VolumeTypesExtraSpecsV2Test, cls).resource_setup()
         vol_type_name = data_utils.rand_name('Volume-type')
         cls.volume_type = cls.volume_types_client.create_volume_type(
-            vol_type_name)['volume_type']
+            name=vol_type_name)['volume_type']
 
     @classmethod
     def resource_cleanup(cls):
diff --git a/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py b/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py
index 040ef53..6483af3 100644
--- a/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py
+++ b/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py
@@ -30,7 +30,7 @@
         vol_type_name = data_utils.rand_name('Volume-type')
         cls.extra_specs = {"spec1": "val1"}
         cls.volume_type = cls.volume_types_client.create_volume_type(
-            vol_type_name,
+            name=vol_type_name,
             extra_specs=cls.extra_specs)['volume_type']
 
     @classmethod
@@ -70,7 +70,7 @@
     def test_update_multiple_extra_spec(self):
         # Should not update volume type extra specs with multiple specs as
             # body.
-        extra_spec = {"spec1": "val2", 'spec2': 'val1'}
+        extra_spec = {"spec1": "val2", "spec2": "val1"}
         self.assertRaises(
             lib_exc.BadRequest,
             self.volume_types_client.update_volume_type_extra_specs,
@@ -101,7 +101,7 @@
         self.assertRaises(
             lib_exc.BadRequest,
             self.volume_types_client.create_volume_type_extra_specs,
-            self.volume_type['id'], ['invalid'])
+            self.volume_type['id'], extra_specs=['invalid'])
 
     @test.idempotent_id('031cda8b-7d23-4246-8bf6-bbe73fd67074')
     def test_delete_nonexistent_volume_type_id(self):
diff --git a/tempest/api/volume/admin/test_volume_types_negative.py b/tempest/api/volume/admin/test_volume_types_negative.py
index 2694b63..bc32fc9 100644
--- a/tempest/api/volume/admin/test_volume_types_negative.py
+++ b/tempest/api/volume/admin/test_volume_types_negative.py
@@ -36,7 +36,7 @@
     def test_create_with_empty_name(self):
         # Should not be able to create volume type with an empty name.
         self.assertRaises(lib_exc.BadRequest,
-                          self.volume_types_client.create_volume_type, '')
+                          self.volume_types_client.create_volume_type, name='')
 
     @test.idempotent_id('994610d6-0476-4018-a644-a2602ef5d4aa')
     def test_get_nonexistent_type_id(self):
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index 12e6761..5c4d0e1 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -217,8 +217,8 @@
         """create a test Qos-Specs."""
         name = name or data_utils.rand_name(cls.__name__ + '-QoS')
         consumer = consumer or 'front-end'
-        qos_specs = cls.volume_qos_client.create_qos(name, consumer,
-                                                     **kwargs)['qos_specs']
+        qos_specs = cls.volume_qos_client.create_qos(
+            name=name, consumer=consumer, **kwargs)['qos_specs']
         cls.qos_specs.append(qos_specs['id'])
         return qos_specs
 
diff --git a/tempest/api/volume/test_qos.py b/tempest/api/volume/test_qos.py
index 2f7c3df..722a39a 100644
--- a/tempest/api/volume/test_qos.py
+++ b/tempest/api/volume/test_qos.py
@@ -53,7 +53,7 @@
     def _create_test_volume_type(self):
         vol_type_name = utils.rand_name("volume-type")
         vol_type = self.volume_types_client.create_volume_type(
-            vol_type_name)['volume_type']
+            name=vol_type_name)['volume_type']
         self.addCleanup(self.volume_types_client.delete_volume_type,
                         vol_type['id'])
         return vol_type
diff --git a/tempest/api_schema/response/compute/v2_1/floating_ips.py b/tempest/api_schema/response/compute/v2_1/floating_ips.py
deleted file mode 100644
index 3551681..0000000
--- a/tempest/api_schema/response/compute/v2_1/floating_ips.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# 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_schema.response.compute.v2_1 import parameter_types
-
-common_floating_ip_info = {
-    'type': 'object',
-    'properties': {
-        # NOTE: Now the type of 'id' is integer, but
-        # here allows 'string' also because we will be
-        # able to change it to 'uuid' in the future.
-        'id': {'type': ['integer', 'string']},
-        'pool': {'type': ['string', 'null']},
-        'instance_id': {'type': ['string', 'null']},
-        'ip': parameter_types.ip_address,
-        'fixed_ip': parameter_types.ip_address
-    },
-    'additionalProperties': False,
-    'required': ['id', 'pool', 'instance_id',
-                 'ip', 'fixed_ip'],
-
-}
-list_floating_ips = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'floating_ips': {
-                'type': 'array',
-                'items': common_floating_ip_info
-            },
-        },
-        'additionalProperties': False,
-        'required': ['floating_ips'],
-    }
-}
-
-create_get_floating_ip = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'floating_ip': common_floating_ip_info
-        },
-        'additionalProperties': False,
-        'required': ['floating_ip'],
-    }
-}
-
-list_floating_ip_pools = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'floating_ip_pools': {
-                'type': 'array',
-                'items': {
-                    'type': 'object',
-                    'properties': {
-                        'name': {'type': 'string'}
-                    },
-                    'additionalProperties': False,
-                    'required': ['name'],
-                }
-            }
-        },
-        'additionalProperties': False,
-        'required': ['floating_ip_pools'],
-    }
-}
-
-add_remove_floating_ip = {
-    'status_code': [202]
-}
-
-create_floating_ips_bulk = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'floating_ips_bulk_create': {
-                'type': 'object',
-                'properties': {
-                    'interface': {'type': ['string', 'null']},
-                    'ip_range': {'type': 'string'},
-                    'pool': {'type': ['string', 'null']},
-                },
-                'additionalProperties': False,
-                'required': ['interface', 'ip_range', 'pool'],
-            }
-        },
-        'additionalProperties': False,
-        'required': ['floating_ips_bulk_create'],
-    }
-}
-
-delete_floating_ips_bulk = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'floating_ips_bulk_delete': {'type': 'string'}
-        },
-        'additionalProperties': False,
-        'required': ['floating_ips_bulk_delete'],
-    }
-}
-
-list_floating_ips_bulk = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'floating_ip_info': {
-                'type': 'array',
-                'items': {
-                    'type': 'object',
-                    'properties': {
-                        'address': parameter_types.ip_address,
-                        'instance_uuid': {'type': ['string', 'null']},
-                        'interface': {'type': ['string', 'null']},
-                        'pool': {'type': ['string', 'null']},
-                        'project_id': {'type': ['string', 'null']},
-                        'fixed_ip': parameter_types.ip_address
-                    },
-                    'additionalProperties': False,
-                    # NOTE: fixed_ip is introduced after JUNO release,
-                    # So it is not defined as 'required'.
-                    'required': ['address', 'instance_uuid', 'interface',
-                                 'pool', 'project_id'],
-                }
-            }
-        },
-        'additionalProperties': False,
-        'required': ['floating_ip_info'],
-    }
-}
diff --git a/tempest/api_schema/response/compute/v2_1/parameter_types.py b/tempest/api_schema/response/compute/v2_1/parameter_types.py
deleted file mode 100644
index 07cc890..0000000
--- a/tempest/api_schema/response/compute/v2_1/parameter_types.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# 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.
-
-links = {
-    'type': 'array',
-    'items': {
-        'type': 'object',
-        'properties': {
-            'href': {
-                'type': 'string',
-                'format': 'uri'
-            },
-            'rel': {'type': 'string'}
-        },
-        'additionalProperties': False,
-        'required': ['href', 'rel']
-    }
-}
-
-mac_address = {
-    'type': 'string',
-    'pattern': '(?:[a-f0-9]{2}:){5}[a-f0-9]{2}'
-}
-
-ip_address = {
-    'oneOf': [
-        {
-            'type': 'string',
-            'oneOf': [
-                {'format': 'ipv4'},
-                {'format': 'ipv6'}
-            ]
-        },
-        {'type': 'null'}
-    ]
-}
-
-access_ip_v4 = {
-    'type': 'string',
-    'oneOf': [{'format': 'ipv4'}, {'enum': ['']}]
-}
-
-access_ip_v6 = {
-    'type': 'string',
-    'oneOf': [{'format': 'ipv6'}, {'enum': ['']}]
-}
-
-addresses = {
-    'type': 'object',
-    'patternProperties': {
-        # NOTE: Here is for 'private' or something.
-        '^[a-zA-Z0-9-_.]+$': {
-            'type': 'array',
-            'items': {
-                'type': 'object',
-                'properties': {
-                    'version': {'type': 'integer'},
-                    'addr': {
-                        'type': 'string',
-                        'oneOf': [
-                            {'format': 'ipv4'},
-                            {'format': 'ipv6'}
-                        ]
-                    }
-                },
-                'additionalProperties': False,
-                'required': ['version', 'addr']
-            }
-        }
-    }
-}
-
-response_header = {
-    'connection': {'type': 'string'},
-    'content-length': {'type': 'string'},
-    'content-type': {'type': 'string'},
-    'status': {'type': 'string'},
-    'x-compute-request-id': {'type': 'string'},
-    'vary': {'type': 'string'},
-    'x-openstack-nova-api-version': {'type': 'string'},
-    'date': {
-        'type': 'string',
-        'format': 'data-time'
-    }
-}
diff --git a/tempest/api_schema/response/compute/v2_1/security_groups.py b/tempest/api_schema/response/compute/v2_1/security_groups.py
deleted file mode 100644
index 5ed5a5c..0000000
--- a/tempest/api_schema/response/compute/v2_1/security_groups.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# 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.
-
-common_security_group_rule = {
-    'from_port': {'type': ['integer', 'null']},
-    'to_port': {'type': ['integer', 'null']},
-    'group': {
-        'type': 'object',
-        'properties': {
-            'tenant_id': {'type': 'string'},
-            'name': {'type': 'string'}
-        },
-        'additionalProperties': False,
-    },
-    'ip_protocol': {'type': ['string', 'null']},
-    # 'parent_group_id' can be UUID so defining it as 'string' also.
-    'parent_group_id': {'type': ['string', 'integer', 'null']},
-    'ip_range': {
-        'type': 'object',
-        'properties': {
-            'cidr': {'type': 'string'}
-        },
-        'additionalProperties': False,
-        # When optional argument is provided in request body
-        # like 'group_id' then, attribute 'cidr' does not
-        # comes in response body. So it is not 'required'.
-    },
-    'id': {'type': ['string', 'integer']}
-}
-
-common_security_group = {
-    'type': 'object',
-    'properties': {
-        'id': {'type': ['integer', 'string']},
-        'name': {'type': 'string'},
-        'tenant_id': {'type': 'string'},
-        'rules': {
-            'type': 'array',
-            'items': {
-                'type': ['object', 'null'],
-                'properties': common_security_group_rule,
-                'additionalProperties': False,
-            }
-        },
-        'description': {'type': 'string'},
-    },
-    'additionalProperties': False,
-    'required': ['id', 'name', 'tenant_id', 'rules', 'description'],
-}
-
-list_security_groups = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'security_groups': {
-                'type': 'array',
-                'items': common_security_group
-            }
-        },
-        'additionalProperties': False,
-        'required': ['security_groups']
-    }
-}
-
-get_security_group = create_security_group = update_security_group = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'security_group': common_security_group
-        },
-        'additionalProperties': False,
-        'required': ['security_group']
-    }
-}
-
-delete_security_group = {
-    'status_code': [202]
-}
-
-create_security_group_rule = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'security_group_rule': {
-                'type': 'object',
-                'properties': common_security_group_rule,
-                'additionalProperties': False,
-                'required': ['from_port', 'to_port', 'group', 'ip_protocol',
-                             'parent_group_id', 'id', 'ip_range']
-            }
-        },
-        'additionalProperties': False,
-        'required': ['security_group_rule']
-    }
-}
-
-delete_security_group_rule = {
-    'status_code': [202]
-}
diff --git a/tempest/api_schema/response/compute/v2_1/servers.py b/tempest/api_schema/response/compute/v2_1/servers.py
deleted file mode 100644
index 38f7c82..0000000
--- a/tempest/api_schema/response/compute/v2_1/servers.py
+++ /dev/null
@@ -1,549 +0,0 @@
-# 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.
-
-import copy
-
-from tempest.api_schema.response.compute.v2_1 import parameter_types
-
-create_server = {
-    'status_code': [202],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'server': {
-                'type': 'object',
-                'properties': {
-                    'id': {'type': 'string'},
-                    'security_groups': {'type': 'array'},
-                    'links': parameter_types.links,
-                    'OS-DCF:diskConfig': {'type': 'string'}
-                },
-                'additionalProperties': False,
-                # NOTE: OS-DCF:diskConfig & security_groups are API extension,
-                # and some environments return a response without these
-                # attributes.So they are not 'required'.
-                'required': ['id', 'links']
-            }
-        },
-        'additionalProperties': False,
-        'required': ['server']
-    }
-}
-
-create_server_with_admin_pass = copy.deepcopy(create_server)
-create_server_with_admin_pass['response_body']['properties']['server'][
-    'properties'].update({'adminPass': {'type': 'string'}})
-create_server_with_admin_pass['response_body']['properties']['server'][
-    'required'].append('adminPass')
-
-list_servers = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'servers': {
-                'type': 'array',
-                'items': {
-                    'type': 'object',
-                    'properties': {
-                        'id': {'type': 'string'},
-                        'links': parameter_types.links,
-                        'name': {'type': 'string'}
-                    },
-                    'additionalProperties': False,
-                    'required': ['id', 'links', 'name']
-                }
-            },
-            'servers_links': parameter_types.links
-        },
-        'additionalProperties': False,
-        # NOTE(gmann): servers_links attribute is not necessary to be
-        # present always So it is not 'required'.
-        'required': ['servers']
-    }
-}
-
-delete_server = {
-    'status_code': [204],
-}
-
-common_show_server = {
-    'type': 'object',
-    'properties': {
-        'id': {'type': 'string'},
-        'name': {'type': 'string'},
-        'status': {'type': 'string'},
-        'image': {'oneOf': [
-            {'type': 'object',
-                'properties': {
-                    'id': {'type': 'string'},
-                    'links': parameter_types.links
-                },
-                'additionalProperties': False,
-                'required': ['id', 'links']},
-            {'type': ['string', 'null']}
-        ]},
-        'flavor': {
-            'type': 'object',
-            'properties': {
-                'id': {'type': 'string'},
-                'links': parameter_types.links
-            },
-            'additionalProperties': False,
-            'required': ['id', 'links']
-        },
-        'fault': {
-            'type': 'object',
-            'properties': {
-                'code': {'type': 'integer'},
-                'created': {'type': 'string'},
-                'message': {'type': 'string'},
-                'details': {'type': 'string'},
-            },
-            'additionalProperties': False,
-            # NOTE(gmann): 'details' is not necessary to be present
-            #  in the 'fault'. So it is not defined as 'required'.
-            'required': ['code', 'created', 'message']
-        },
-        'user_id': {'type': 'string'},
-        'tenant_id': {'type': 'string'},
-        'created': {'type': 'string'},
-        'updated': {'type': 'string'},
-        'progress': {'type': 'integer'},
-        'metadata': {'type': 'object'},
-        'links': parameter_types.links,
-        'addresses': parameter_types.addresses,
-        'hostId': {'type': 'string'},
-        'OS-DCF:diskConfig': {'type': 'string'},
-        'accessIPv4': parameter_types.access_ip_v4,
-        'accessIPv6': parameter_types.access_ip_v6
-    },
-    'additionalProperties': False,
-    # NOTE(GMann): 'progress' attribute is present in the response
-    # only when server's status is one of the progress statuses
-    # ("ACTIVE","BUILD", "REBUILD", "RESIZE","VERIFY_RESIZE")
-    # 'fault' attribute is present in the response
-    # only when server's status is one of the  "ERROR", "DELETED".
-    # OS-DCF:diskConfig and accessIPv4/v6 are API
-    # extensions, and some environments return a response
-    # without these attributes.So these are not defined as 'required'.
-    'required': ['id', 'name', 'status', 'image', 'flavor',
-                 'user_id', 'tenant_id', 'created', 'updated',
-                 'metadata', 'links', 'addresses', 'hostId']
-}
-
-update_server = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'server': common_show_server
-        },
-        'additionalProperties': False,
-        'required': ['server']
-    }
-}
-
-server_detail = copy.deepcopy(common_show_server)
-server_detail['properties'].update({
-    'key_name': {'type': ['string', 'null']},
-    'security_groups': {'type': 'array'},
-
-    # NOTE: Non-admin users also can see "OS-SRV-USG" and "OS-EXT-AZ"
-    # attributes.
-    'OS-SRV-USG:launched_at': {'type': ['string', 'null']},
-    'OS-SRV-USG:terminated_at': {'type': ['string', 'null']},
-    'OS-EXT-AZ:availability_zone': {'type': 'string'},
-
-    # NOTE: Admin users only can see "OS-EXT-STS" and "OS-EXT-SRV-ATTR"
-    # attributes.
-    'OS-EXT-STS:task_state': {'type': ['string', 'null']},
-    'OS-EXT-STS:vm_state': {'type': 'string'},
-    'OS-EXT-STS:power_state': {'type': 'integer'},
-    'OS-EXT-SRV-ATTR:host': {'type': ['string', 'null']},
-    'OS-EXT-SRV-ATTR:instance_name': {'type': 'string'},
-    'OS-EXT-SRV-ATTR:hypervisor_hostname': {'type': ['string', 'null']},
-    'os-extended-volumes:volumes_attached': {'type': 'array'},
-    'config_drive': {'type': 'string'}
-})
-server_detail['properties']['addresses']['patternProperties'][
-    '^[a-zA-Z0-9-_.]+$']['items']['properties'].update({
-        'OS-EXT-IPS:type': {'type': 'string'},
-        'OS-EXT-IPS-MAC:mac_addr': parameter_types.mac_address})
-# NOTE(gmann): Update OS-EXT-IPS:type and OS-EXT-IPS-MAC:mac_addr
-# attributes in server address. Those are API extension,
-# and some environments return a response without
-# these attributes. So they are not 'required'.
-
-get_server = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'server': server_detail
-        },
-        'additionalProperties': False,
-        'required': ['server']
-    }
-}
-
-list_servers_detail = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'servers': {
-                'type': 'array',
-                'items': server_detail
-            },
-            'servers_links': parameter_types.links
-        },
-        'additionalProperties': False,
-        # NOTE(gmann): servers_links attribute is not necessary to be
-        # present always So it is not 'required'.
-        'required': ['servers']
-    }
-}
-
-rebuild_server = copy.deepcopy(update_server)
-rebuild_server['status_code'] = [202]
-
-rebuild_server_with_admin_pass = copy.deepcopy(rebuild_server)
-rebuild_server_with_admin_pass['response_body']['properties']['server'][
-    'properties'].update({'adminPass': {'type': 'string'}})
-rebuild_server_with_admin_pass['response_body']['properties']['server'][
-    'required'].append('adminPass')
-
-rescue_server = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'adminPass': {'type': 'string'}
-        },
-        'additionalProperties': False,
-        'required': ['adminPass']
-    }
-}
-
-list_virtual_interfaces = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'virtual_interfaces': {
-                'type': 'array',
-                'items': {
-                    'type': 'object',
-                    'properties': {
-                        'id': {'type': 'string'},
-                        'mac_address': parameter_types.mac_address,
-                        'OS-EXT-VIF-NET:net_id': {'type': 'string'}
-                    },
-                    'additionalProperties': False,
-                    # 'OS-EXT-VIF-NET:net_id' is API extension So it is
-                    # not defined as 'required'
-                    'required': ['id', 'mac_address']
-                }
-            }
-        },
-        'additionalProperties': False,
-        'required': ['virtual_interfaces']
-    }
-}
-
-common_attach_volume_info = {
-    'type': 'object',
-    'properties': {
-        'id': {'type': 'string'},
-        'device': {'type': 'string'},
-        'volumeId': {'type': 'string'},
-        'serverId': {'type': ['integer', 'string']}
-    },
-    'additionalProperties': False,
-    'required': ['id', 'device', 'volumeId', 'serverId']
-}
-
-attach_volume = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'volumeAttachment': common_attach_volume_info
-        },
-        'additionalProperties': False,
-        'required': ['volumeAttachment']
-    }
-}
-
-detach_volume = {
-    'status_code': [202]
-}
-
-show_volume_attachment = copy.deepcopy(attach_volume)
-show_volume_attachment['response_body']['properties'][
-    'volumeAttachment']['properties'].update({'serverId': {'type': 'string'}})
-
-list_volume_attachments = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'volumeAttachments': {
-                'type': 'array',
-                'items': common_attach_volume_info
-            }
-        },
-        'additionalProperties': False,
-        'required': ['volumeAttachments']
-    }
-}
-list_volume_attachments['response_body']['properties'][
-    'volumeAttachments']['items']['properties'].update(
-    {'serverId': {'type': 'string'}})
-
-list_addresses_by_network = {
-    'status_code': [200],
-    'response_body': parameter_types.addresses
-}
-
-list_addresses = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'addresses': parameter_types.addresses
-        },
-        'additionalProperties': False,
-        'required': ['addresses']
-    }
-}
-
-common_server_group = {
-    'type': 'object',
-    'properties': {
-        'id': {'type': 'string'},
-        'name': {'type': 'string'},
-        'policies': {
-            'type': 'array',
-            'items': {'type': 'string'}
-        },
-        # 'members' attribute contains the array of instance's UUID of
-        # instances present in server group
-        'members': {
-            'type': 'array',
-            'items': {'type': 'string'}
-        },
-        'metadata': {'type': 'object'}
-    },
-    'additionalProperties': False,
-    'required': ['id', 'name', 'policies', 'members', 'metadata']
-}
-
-create_show_server_group = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'server_group': common_server_group
-        },
-        'additionalProperties': False,
-        'required': ['server_group']
-    }
-}
-
-delete_server_group = {
-    'status_code': [204]
-}
-
-list_server_groups = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'server_groups': {
-                'type': 'array',
-                'items': common_server_group
-            }
-        },
-        'additionalProperties': False,
-        'required': ['server_groups']
-    }
-}
-
-instance_actions = {
-    'type': 'object',
-    'properties': {
-        'action': {'type': 'string'},
-        'request_id': {'type': 'string'},
-        'user_id': {'type': 'string'},
-        'project_id': {'type': 'string'},
-        'start_time': {'type': 'string'},
-        'message': {'type': ['string', 'null']},
-        'instance_uuid': {'type': 'string'}
-    },
-    'additionalProperties': False,
-    'required': ['action', 'request_id', 'user_id', 'project_id',
-                 'start_time', 'message', 'instance_uuid']
-}
-
-instance_action_events = {
-    'type': 'array',
-    'items': {
-        'type': 'object',
-        'properties': {
-            'event': {'type': 'string'},
-            'start_time': {'type': 'string'},
-            'finish_time': {'type': 'string'},
-            'result': {'type': 'string'},
-            'traceback': {'type': ['string', 'null']}
-        },
-        'additionalProperties': False,
-        'required': ['event', 'start_time', 'finish_time', 'result',
-                     'traceback']
-    }
-}
-
-list_instance_actions = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'instanceActions': {
-                'type': 'array',
-                'items': instance_actions
-            }
-        },
-        'additionalProperties': False,
-        'required': ['instanceActions']
-    }
-}
-
-instance_actions_with_events = copy.deepcopy(instance_actions)
-instance_actions_with_events['properties'].update({
-    'events': instance_action_events})
-# 'events' does not come in response body always so it is not
-# defined as 'required'
-
-show_instance_action = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'instanceAction': instance_actions_with_events
-        },
-        'additionalProperties': False,
-        'required': ['instanceAction']
-    }
-}
-
-show_password = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'password': {'type': 'string'}
-        },
-        'additionalProperties': False,
-        'required': ['password']
-    }
-}
-
-get_vnc_console = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'console': {
-                'type': 'object',
-                'properties': {
-                    'type': {'type': 'string'},
-                    'url': {
-                        'type': 'string',
-                        'format': 'uri'
-                    }
-                },
-                'additionalProperties': False,
-                'required': ['type', 'url']
-            }
-        },
-        'additionalProperties': False,
-        'required': ['console']
-    }
-}
-
-get_console_output = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'output': {'type': 'string'}
-        },
-        'additionalProperties': False,
-        'required': ['output']
-    }
-}
-
-set_server_metadata = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'metadata': {
-                'type': 'object',
-                'patternProperties': {
-                    '^.+$': {'type': 'string'}
-                }
-            }
-        },
-        'additionalProperties': False,
-        'required': ['metadata']
-    }
-}
-
-list_server_metadata = copy.deepcopy(set_server_metadata)
-
-update_server_metadata = copy.deepcopy(set_server_metadata)
-
-delete_server_metadata_item = {
-    'status_code': [204]
-}
-
-set_show_server_metadata_item = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'meta': {
-                'type': 'object',
-                'patternProperties': {
-                    '^.+$': {'type': 'string'}
-                }
-            }
-        },
-        'additionalProperties': False,
-        'required': ['meta']
-    }
-}
-
-server_actions_common_schema = {
-    'status_code': [202]
-}
-
-server_actions_delete_password = {
-    'status_code': [204]
-}
-
-server_actions_confirm_resize = copy.deepcopy(
-    server_actions_delete_password)
diff --git a/tempest/clients.py b/tempest/clients.py
index 74f8684..54218d6 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -32,6 +32,8 @@
     FloatingIPPoolsClient
 from tempest_lib.services.compute.floating_ips_bulk_client import \
     FloatingIPsBulkClient
+from tempest_lib.services.compute.floating_ips_client import \
+    FloatingIPsClient as ComputeFloatingIPsClient
 from tempest_lib.services.compute.hosts_client import HostsClient
 from tempest_lib.services.compute.hypervisor_client import \
     HypervisorClient
@@ -49,8 +51,13 @@
 from tempest_lib.services.compute.quotas_client import QuotasClient
 from tempest_lib.services.compute.security_group_default_rules_client import \
     SecurityGroupDefaultRulesClient
+from tempest_lib.services.compute.security_group_rules_client import \
+    SecurityGroupRulesClient
 from tempest_lib.services.compute.security_groups_client import \
     SecurityGroupsClient as ComputeSecurityGroupsClient
+from tempest_lib.services.compute.server_groups_client import \
+    ServerGroupsClient
+from tempest_lib.services.compute.servers_client import ServersClient
 from tempest_lib.services.compute.services_client import ServicesClient
 from tempest_lib.services.compute.snapshots_client import \
     SnapshotsClient as ComputeSnapshotsClient
@@ -70,15 +77,7 @@
 from tempest import manager
 from tempest.services.baremetal.v1.json.baremetal_client import \
     BaremetalClient
-from tempest.services import botoclients
-from tempest.services.compute.json.floating_ips_client import \
-    FloatingIPsClient as ComputeFloatingIPsClient
 from tempest.services.compute.json.keypairs_client import KeyPairsClient
-from tempest.services.compute.json.security_group_rules_client import \
-    SecurityGroupRulesClient
-from tempest.services.compute.json.server_groups_client import \
-    ServerGroupsClient
-from tempest.services.compute.json.servers_client import ServersClient
 from tempest.services.data_processing.v1_1.data_processing_client import \
     DataProcessingClient
 from tempest.services.database.json.flavors_client import \
@@ -89,6 +88,8 @@
     DatabaseVersionsClient
 from tempest.services.identity.v2.json.identity_client import \
     IdentityClient
+from tempest.services.identity.v2.json.roles_client import \
+    RolesClient
 from tempest.services.identity.v2.json.tenants_client import \
     TenantsClient
 from tempest.services.identity.v3.json.credentials_client import \
@@ -98,16 +99,18 @@
 from tempest.services.identity.v3.json.groups_client import \
     GroupsClient as GroupsV3Client
 from tempest.services.identity.v3.json.identity_client import IdentityV3Client
-from tempest.services.identity.v3.json.policy_client import \
-    PolicyClient as PolicyV3Client
-from tempest.services.identity.v3.json.region_client import \
-    RegionClient as RegionV3Client
-from tempest.services.identity.v3.json.service_client import \
-    ServiceClient as ServiceV3Client
+from tempest.services.identity.v3.json.policies_client import \
+    PoliciesClient as PoliciesV3Client
+from tempest.services.identity.v3.json.regions_client import \
+    RegionsClient as RegionsV3Client
+from tempest.services.identity.v3.json.services_client import \
+    ServicesClient as IdentityServicesV3Client
 from tempest.services.image.v1.json.images_client import ImagesClient
 from tempest.services.image.v2.json.images_client import ImagesClientV2
 from tempest.services.messaging.json.messaging_client import \
     MessagingClient
+from tempest.services.network.json.agents_client import AgentsClient \
+    as NetworkAgentsClient
 from tempest.services.network.json.floating_ips_client import FloatingIPsClient
 from tempest.services.network.json.metering_label_rules_client import \
     MeteringLabelRulesClient
@@ -118,6 +121,9 @@
 from tempest.services.network.json.ports_client import PortsClient
 from tempest.services.network.json.quotas_client import QuotasClient \
     as NetworkQuotasClient
+from tempest.services.network.json.security_groups_client import \
+    SecurityGroupsClient
+from tempest.services.network.json.subnetpools_client import SubnetpoolsClient
 from tempest.services.network.json.subnets_client import SubnetsClient
 from tempest.services.object_storage.account_client import AccountClient
 from tempest.services.object_storage.container_client import ContainerClient
@@ -201,6 +207,14 @@
             CONF.identity.region,
             endpoint_type=CONF.baremetal.endpoint_type,
             **self.default_params_with_timeout_values)
+        self.network_agents_client = NetworkAgentsClient(
+            self.auth_provider,
+            CONF.network.catalog_type,
+            CONF.network.region or CONF.identity.region,
+            endpoint_type=CONF.network.endpoint_type,
+            build_interval=CONF.network.build_interval,
+            build_timeout=CONF.network.build_timeout,
+            **self.default_params)
         self.network_client = NetworkClient(
             self.auth_provider,
             CONF.network.catalog_type,
@@ -217,6 +231,14 @@
             build_interval=CONF.network.build_interval,
             build_timeout=CONF.network.build_timeout,
             **self.default_params)
+        self.subnetpools_client = SubnetpoolsClient(
+            self.auth_provider,
+            CONF.network.catalog_type,
+            CONF.network.region or CONF.identity.region,
+            endpoint_type=CONF.network.endpoint_type,
+            build_interval=CONF.network.build_interval,
+            build_timeout=CONF.network.build_timeout,
+            **self.default_params)
         self.subnets_client = SubnetsClient(
             self.auth_provider,
             CONF.network.catalog_type,
@@ -265,6 +287,14 @@
             build_interval=CONF.network.build_interval,
             build_timeout=CONF.network.build_timeout,
             **self.default_params)
+        self.security_groups_client = SecurityGroupsClient(
+            self.auth_provider,
+            CONF.network.catalog_type,
+            CONF.network.region or CONF.identity.region,
+            endpoint_type=CONF.network.endpoint_type,
+            build_interval=CONF.network.build_interval,
+            build_timeout=CONF.network.build_timeout,
+            **self.default_params)
         self.messaging_client = MessagingClient(
             self.auth_provider,
             CONF.messaging.catalog_type,
@@ -318,15 +348,6 @@
         self.negative_client = negative_rest_client.NegativeRestClient(
             self.auth_provider, service, **self.default_params)
 
-        # Generating EC2 credentials in tempest is only supported
-        # with identity v2
-        if CONF.identity_feature_enabled.api_v2 and \
-                CONF.identity.auth_version == 'v2':
-            # EC2 and S3 clients, if used, will check configured AWS
-            # credentials and generate new ones if needed
-            self.ec2api_client = botoclients.APIClientEC2(self.identity_client)
-            self.s3_client = botoclients.ObjectClientS3(self.identity_client)
-
     def _set_compute_clients(self):
         params = {
             'service': CONF.compute.catalog_type,
@@ -437,6 +458,8 @@
                                               **params_v2_admin)
         self.tenants_client = TenantsClient(self.auth_provider,
                                             **params_v2_admin)
+        self.roles_client = RolesClient(self.auth_provider,
+                                        **params_v2_admin)
         params_v2_public = params.copy()
         params_v2_public['endpoint_type'] = (
             CONF.identity.v2_public_endpoint_type)
@@ -445,6 +468,8 @@
                                                      **params_v2_public)
         self.tenants_public_client = TenantsClient(self.auth_provider,
                                                    **params_v2_public)
+        self.roles_public_client = RolesClient(self.auth_provider,
+                                               **params_v2_public)
         params_v3 = params.copy()
         params_v3['endpoint_type'] = CONF.identity.v3_endpoint_type
         # Clients below use the endpoint type of Keystone API v3
@@ -452,9 +477,11 @@
                                                    **params_v3)
         self.endpoints_client = EndPointV3Client(self.auth_provider,
                                                  **params_v3)
-        self.service_client = ServiceV3Client(self.auth_provider, **params_v3)
-        self.policy_client = PolicyV3Client(self.auth_provider, **params_v3)
-        self.region_client = RegionV3Client(self.auth_provider, **params_v3)
+        self.identity_services_client = IdentityServicesV3Client(
+            self.auth_provider, **params_v3)
+        self.policies_client = PoliciesV3Client(self.auth_provider,
+                                                **params_v3)
+        self.regions_client = RegionsV3Client(self.auth_provider, **params_v3)
         self.credentials_client = CredentialsV3Client(self.auth_provider,
                                                       **params_v3)
         self.groups_client = GroupsV3Client(self.auth_provider, **params_v3)
diff --git a/tempest/cmd/account_generator.py b/tempest/cmd/account_generator.py
index 64c9b00..b90ee04 100755
--- a/tempest/cmd/account_generator.py
+++ b/tempest/cmd/account_generator.py
@@ -93,6 +93,7 @@
 from tempest import config
 from tempest import exceptions as exc
 from tempest.services.identity.v2.json import identity_client
+from tempest.services.identity.v2.json import roles_client
 from tempest.services.identity.v2.json import tenants_client
 from tempest.services.network.json import network_client
 from tempest.services.network.json import networks_client
@@ -146,6 +147,13 @@
         endpoint_type='adminURL',
         **params
     )
+    roles_admin = roles_client.RolesClient(
+        _auth,
+        CONF.identity.catalog_type,
+        CONF.identity.region,
+        endpoint_type='adminURL',
+        **params
+    )
     network_admin = None
     networks_admin = None
     subnets_admin = None
@@ -171,14 +179,14 @@
             CONF.network.region or CONF.identity.region,
             endpoint_type='adminURL',
             **params)
-    return (identity_admin, tenants_admin, neutron_iso_networks, network_admin,
-            networks_admin, subnets_admin)
+    return (identity_admin, tenants_admin, roles_admin, neutron_iso_networks,
+            network_admin, networks_admin, subnets_admin)
 
 
 def create_resources(opts, resources):
-    (identity_admin, tenants_admin, neutron_iso_networks,
+    (identity_admin, tenants_admin, roles_admin, neutron_iso_networks,
      network_admin, networks_admin, subnets_admin) = get_admin_clients(opts)
-    roles = identity_admin.list_roles()['roles']
+    roles = roles_admin.list_roles()['roles']
     for u in resources['users']:
         u['role_ids'] = []
         for r in u.get('roles', ()):
@@ -240,7 +248,7 @@
             continue
         for r in u['role_ids']:
             try:
-                identity_admin.assign_user_role(tenant['id'], user['id'], r)
+                roles_admin.assign_user_role(tenant['id'], user['id'], r)
             except tempest_lib.exceptions.Conflict:
                 # don't care if it's already assigned
                 pass
@@ -349,7 +357,7 @@
                 resources['users'].append({
                     'tenant': tenant,
                     'name': user,
-                    'pass': data_utils.rand_name(),
+                    'pass': data_utils.rand_password(),
                     'prefix': user_group['prefix'],
                     'roles': user_group['roles']
                 })
diff --git a/tempest/cmd/cleanup.py b/tempest/cmd/cleanup.py
index 1c8ddcb..7b73a61 100644
--- a/tempest/cmd/cleanup.py
+++ b/tempest/cmd/cleanup.py
@@ -51,6 +51,7 @@
 Please run with **--help** to see full list of options.
 """
 import sys
+import traceback
 
 from cliff import command
 from oslo_log import log as logging
@@ -74,6 +75,16 @@
         super(TempestCleanup, self).__init__(app, cmd)
 
     def take_action(self, parsed_args):
+        try:
+            self.init(parsed_args)
+            self._cleanup()
+        except Exception:
+            LOG.exception("Failure during cleanup")
+            traceback.print_exc()
+            raise
+        return 0
+
+    def init(self, parsed_args):
         cleanup_service.init_conf()
         self.options = parsed_args
         self.admin_mgr = credentials.AdminManager()
@@ -96,10 +107,9 @@
             return
 
         self._load_json()
-        self._cleanup()
 
     def _cleanup(self):
-        LOG.debug("Begin cleanup")
+        print ("Begin cleanup")
         is_dry_run = self.options.dry_run
         is_preserve = not self.options.delete_tempest_conf_objects
         is_save_state = False
@@ -118,7 +128,7 @@
                   'is_save_state': is_save_state}
         tenant_service = cleanup_service.TenantService(admin_mgr, **kwargs)
         tenants = tenant_service.list()
-        LOG.debug("Process %s tenants" % len(tenants))
+        print ("Process %s tenants" % len(tenants))
 
         # Loop through list of tenants and clean them up.
         for tenant in tenants:
@@ -149,7 +159,7 @@
             self._remove_admin_role(tenant_id)
 
     def _clean_tenant(self, tenant):
-        LOG.debug("Cleaning tenant:  %s " % tenant['name'])
+        print ("Cleaning tenant:  %s " % tenant['name'])
         is_dry_run = self.options.dry_run
         dry_run_data = self.dry_run_data
         is_preserve = not self.options.delete_tempest_conf_objects
@@ -176,17 +186,18 @@
             svc.run()
 
     def _init_admin_ids(self):
-        id_cl = self.admin_mgr.identity_client
+        tn_cl = self.admin_mgr.tenants_client
+        rl_cl = self.admin_mgr.roles_client
 
-        tenant = identity.get_tenant_by_name(id_cl,
+        tenant = identity.get_tenant_by_name(tn_cl,
                                              CONF.auth.admin_tenant_name)
         self.admin_tenant_id = tenant['id']
 
-        user = identity.get_user_by_username(id_cl, self.admin_tenant_id,
+        user = identity.get_user_by_username(tn_cl, self.admin_tenant_id,
                                              CONF.auth.admin_username)
         self.admin_id = user['id']
 
-        roles = id_cl.list_roles()['roles']
+        roles = rl_cl.list_roles()['roles']
         for role in roles:
             if role['name'] == CONF.identity.admin_role:
                 self.admin_role_id = role['id']
@@ -221,8 +232,9 @@
 
     def _add_admin(self, tenant_id):
         id_cl = self.admin_mgr.identity_client
+        rl_cl = self.admin_mgr.roles_client
         needs_role = True
-        roles = id_cl.list_user_roles(tenant_id, self.admin_id)['roles']
+        roles = rl_cl.list_user_roles(tenant_id, self.admin_id)['roles']
         for role in roles:
             if role['id'] == self.admin_role_id:
                 needs_role = False
@@ -247,9 +259,9 @@
                               "exists, exception: %s" % ex)
 
     def _tenant_exists(self, tenant_id):
-        id_cl = self.admin_mgr.identity_client
+        tn_cl = self.admin_mgr.tenants_client
         try:
-            t = id_cl.show_tenant(tenant_id)
+            t = tn_cl.show_tenant(tenant_id)
             LOG.debug("Tenant is: %s" % str(t))
             return True
         except Exception as ex:
@@ -257,7 +269,7 @@
             return False
 
     def _init_state(self):
-        LOG.debug("Initializing saved state.")
+        print ("Initializing saved state.")
         data = {}
         admin_mgr = self.admin_mgr
         kwargs = {'data': data,
diff --git a/tempest/cmd/cleanup_service.py b/tempest/cmd/cleanup_service.py
index b5b78c6..2aeb5b1 100644
--- a/tempest/cmd/cleanup_service.py
+++ b/tempest/cmd/cleanup_service.py
@@ -389,6 +389,7 @@
         self.floating_ips_client = manager.floating_ips_client
         self.metering_labels_client = manager.metering_labels_client
         self.metering_label_rules_client = manager.metering_label_rules_client
+        self.security_groups_client = manager.security_groups_client
 
     def _filter_by_conf_networks(self, item_list):
         if not item_list or not all(('network_id' in i for i in item_list)):
@@ -654,7 +655,7 @@
 
 class NetworkSecGroupService(NetworkService):
     def list(self):
-        client = self.client
+        client = self.security_groups_client
         filter = self.tenant_filter
         # cannot delete default sec group so never show it.
         secgroups = [secgroup for secgroup in
@@ -855,12 +856,15 @@
             self.data['users'][user['id']] = user['name']
 
 
-class RoleService(IdentityService):
+class RoleService(BaseService):
+
+    def __init__(self, manager, **kwargs):
+        super(RoleService, self).__init__(kwargs)
+        self.client = manager.roles_client
 
     def list(self):
-        client = self.client
         try:
-            roles = client.list_roles()['roles']
+            roles = self.client.list_roles()['roles']
             # reconcile roles with saved state and never list admin role
             if not self.is_save_state:
                 roles = [role for role in roles if
@@ -874,11 +878,10 @@
             return []
 
     def delete(self):
-        client = self.client
         roles = self.list()
         for role in roles:
             try:
-                client.delete_role(role['id'])
+                self.client.delete_role(role['id'])
             except Exception:
                 LOG.exception("Delete Role exception.")
 
@@ -893,7 +896,7 @@
             self.data['roles'][role['id']] = role['name']
 
 
-class TenantService(IdentityService):
+class TenantService(BaseService):
 
     def __init__(self, manager, **kwargs):
         super(TenantService, self).__init__(kwargs)
diff --git a/tempest/cmd/javelin.py b/tempest/cmd/javelin.py
index 826d8e8..fd35eab 100755
--- a/tempest/cmd/javelin.py
+++ b/tempest/cmd/javelin.py
@@ -118,16 +118,17 @@
 from tempest_lib import auth
 from tempest_lib import exceptions as lib_exc
 from tempest_lib.services.compute import flavors_client
+from tempest_lib.services.compute import floating_ips_client
+from tempest_lib.services.compute import security_group_rules_client
 from tempest_lib.services.compute import security_groups_client
+from tempest_lib.services.compute import servers_client
 import yaml
 
 from tempest.common import identity
 from tempest.common import waiters
 from tempest import config
-from tempest.services.compute.json import floating_ips_client
-from tempest.services.compute.json import security_group_rules_client
-from tempest.services.compute.json import servers_client
 from tempest.services.identity.v2.json import identity_client
+from tempest.services.identity.v2.json import roles_client
 from tempest.services.identity.v2.json import tenants_client
 from tempest.services.image.v2.json import images_client
 from tempest.services.network.json import network_client
@@ -206,6 +207,12 @@
             CONF.identity.region,
             endpoint_type='adminURL',
             **default_params_with_timeout_values)
+        self.roles = roles_client.RolesClient(
+            _auth,
+            CONF.identity.catalog_type,
+            CONF.identity.region,
+            endpoint_type='adminURL',
+            **default_params_with_timeout_values)
         self.servers = servers_client.ServersClient(_auth,
                                                     **compute_params)
         self.flavors = flavors_client.FlavorsClient(_auth,
@@ -339,11 +346,11 @@
 
 def _assign_swift_role(user, swift_role):
     admin = keystone_admin()
-    roles = admin.identity.list_roles()
+    roles = admin.roles.list_roles()
     role = next(r for r in roles if r['name'] == swift_role)
     LOG.debug(USERS[user])
     try:
-        admin.identity.assign_user_role(
+        admin.roles.assign_user_role(
             USERS[user]['tenant_id'],
             USERS[user]['id'],
             role['id'])
@@ -492,24 +499,26 @@
                 for network_name, body in found['addresses'].items():
                     for addr in body:
                         ip = addr['addr']
-                        # If floatingip_for_ssh is at True, it's assumed
-                        # you want to use the floating IP to reach the server,
-                        # fallback to fixed IP, then other type.
+                        # Use floating IP, fixed IP or other type to
+                        # reach the server.
                         # This is useful in multi-node environment.
-                        if CONF.compute.use_floatingip_for_ssh:
+                        if CONF.validation.connect_method == 'floating':
                             if addr.get('OS-EXT-IPS:type',
                                         'floating') == 'floating':
                                 self._ping_ip(ip, 60)
                                 _floating_is_alive = True
-                        elif addr.get('OS-EXT-IPS:type', 'fixed') == 'fixed':
-                            namespace = _get_router_namespace(client,
-                                                              network_name)
-                            self._ping_ip(ip, 60, namespace)
+                        elif CONF.validation.connect_method == 'fixed':
+                            if addr.get('OS-EXT-IPS:type',
+                                        'fixed') == 'fixed':
+                                namespace = _get_router_namespace(client,
+                                                                  network_name)
+                                self._ping_ip(ip, 60, namespace)
                         else:
                             self._ping_ip(ip, 60)
-                # if floatingip_for_ssh is at True, validate found a
-                # floating IP and ping worked.
-                if CONF.compute.use_floatingip_for_ssh:
+                # If CONF.validation.connect_method is floating, validate
+                # that the floating IP is attached to the server and the
+                # the server is pingable.
+                if CONF.validation.connect_method == 'floating':
                     self.assertTrue(_floating_is_alive,
                                     "Server %s has no floating IP." %
                                     server['name'])
@@ -903,7 +912,7 @@
         # create security group(s) after server spawning
         for secgroup in server['secgroups']:
             client.servers.add_security_group(server_id, name=secgroup)
-        if CONF.compute.use_floatingip_for_ssh:
+        if CONF.validation.connect_method == 'floating':
             floating_ip_pool = server.get('floating_ip_pool')
             floating_ip = client.floating_ips.create_floating_ip(
                 pool_name=floating_ip_pool)['floating_ip']
diff --git a/tempest/cmd/run_stress.py b/tempest/cmd/run_stress.py
index f99e5d9..943fe5b 100644
--- a/tempest/cmd/run_stress.py
+++ b/tempest/cmd/run_stress.py
@@ -22,6 +22,7 @@
 except ImportError:
     # unittest in python 2.6 does not contain loader, so uses unittest2
     from unittest2 import loader
+import traceback
 
 from cliff import command
 from oslo_log import log as logging
@@ -79,7 +80,16 @@
         return pa
 
     def take_action(self, pa):
-        return action(pa)
+        try:
+            action(pa)
+        except Exception:
+            LOG.exception("Failure in the stress test framework")
+            traceback.print_exc()
+            raise
+        return 0
+
+    def get_description(self):
+        return 'Run tempest stress tests'
 
 
 def add_arguments(parser):
@@ -149,4 +159,5 @@
         sys.exit(main())
     except Exception:
         LOG.exception("Failure in the stress test framework")
+        traceback.print_exc()
         sys.exit(1)
diff --git a/tempest/common/cred_client.py b/tempest/common/cred_client.py
index 94515dc..5d15988 100644
--- a/tempest/common/cred_client.py
+++ b/tempest/common/cred_client.py
@@ -31,12 +31,14 @@
      admin credentials used for generating credentials.
     """
 
-    def __init__(self, identity_client, projects_client=None):
+    def __init__(self, identity_client, projects_client=None,
+                 roles_client=None):
         # The client implies version and credentials
         self.identity_client = identity_client
         # this is temporary until the v3 project client is
         # separated, then projects_client will become mandatory
         self.projects_client = projects_client or identity_client
+        self.roles_client = roles_client or identity_client
 
     def create_user(self, username, password, project, email):
         user = self.identity_client.create_user(
@@ -59,7 +61,7 @@
 
     def create_user_role(self, role_name):
         if not self._check_role_exists(role_name):
-            self.identity_client.create_role(role_name)
+            self.roles_client.create_role(name=role_name)
 
     def assign_user_role(self, user, project, role_name):
         role = self._check_role_exists(role_name)
@@ -67,8 +69,8 @@
             msg = 'No "%s" role found' % role_name
             raise lib_exc.NotFound(msg)
         try:
-            self.identity_client.assign_user_role(project['id'], user['id'],
-                                                  role['id'])
+            self.roles_client.assign_user_role(project['id'], user['id'],
+                                               role['id'])
         except lib_exc.Conflict:
             LOG.debug("Role %s already assigned on project %s for user %s" % (
                 role['id'], project['id'], user['id']))
@@ -88,14 +90,16 @@
         self.identity_client.delete_user(user_id)
 
     def _list_roles(self):
-        roles = self.identity_client.list_roles()['roles']
+        roles = self.roles_client.list_roles()['roles']
         return roles
 
 
 class V2CredsClient(CredsClient):
 
-    def __init__(self, identity_client, projects_client):
-        super(V2CredsClient, self).__init__(identity_client, projects_client)
+    def __init__(self, identity_client, projects_client, roles_client):
+        super(V2CredsClient, self).__init__(identity_client,
+                                            projects_client,
+                                            roles_client)
 
     def create_project(self, name, description):
         tenant = self.projects_client.create_tenant(
@@ -160,8 +164,9 @@
 
 def get_creds_client(identity_client,
                      projects_client=None,
+                     roles_client=None,
                      project_domain_name=None):
     if isinstance(identity_client, v2_identity.IdentityClient):
-        return V2CredsClient(identity_client, projects_client)
+        return V2CredsClient(identity_client, projects_client, roles_client)
     else:
         return V3CredsClient(identity_client, project_domain_name)
diff --git a/tempest/common/dynamic_creds.py b/tempest/common/dynamic_creds.py
index 813d94f..5bbc93c 100644
--- a/tempest/common/dynamic_creds.py
+++ b/tempest/common/dynamic_creds.py
@@ -58,10 +58,12 @@
         self.ports = []
         self.default_admin_creds = admin_creds
         (self.identity_admin_client, self.tenants_admin_client,
+         self.roles_admin_client,
          self.network_admin_client,
          self.networks_admin_client,
          self.subnets_admin_client,
-         self.ports_admin_client) = self._get_admin_clients()
+         self.ports_admin_client,
+         self.security_groups_admin_client) = self._get_admin_clients()
         # Domain where isolated credentials are provisioned (v3 only).
         # Use that of the admin account is None is configured.
         self.creds_domain_name = None
@@ -72,6 +74,7 @@
         self.creds_client = cred_client.get_creds_client(
             self.identity_admin_client,
             self.tenants_admin_client,
+            self.roles_admin_client,
             self.creds_domain_name)
 
     def _get_admin_clients(self):
@@ -83,11 +86,13 @@
         """
         os = clients.Manager(self.default_admin_creds)
         if self.identity_version == 'v2':
-            return (os.identity_client, os.tenants_client, os.network_client,
-                    os.networks_client, os.subnets_client, os.ports_client)
+            return (os.identity_client, os.tenants_client, os.roles_client,
+                    os.network_client, os.networks_client, os.subnets_client,
+                    os.ports_client, os.security_groups_client)
         else:
-            return (os.identity_v3_client, None, os.network_client,
-                    os.networks_client, os.subnets_client, os.ports_client)
+            return (os.identity_v3_client, None, None, os.network_client,
+                    os.networks_client, os.subnets_client, os.ports_client,
+                    os.security_groups_client)
 
     def _create_creds(self, suffix="", admin=False, roles=None):
         """Create random credentials under the following schema.
@@ -300,13 +305,13 @@
                      network_name)
 
     def _cleanup_default_secgroup(self, tenant):
-        net_client = self.network_admin_client
-        resp_body = net_client.list_security_groups(tenant_id=tenant,
+        nsg_client = self.security_groups_admin_client
+        resp_body = nsg_client.list_security_groups(tenant_id=tenant,
                                                     name="default")
         secgroups_to_delete = resp_body['security_groups']
         for secgroup in secgroups_to_delete:
             try:
-                net_client.delete_security_group(secgroup['id'])
+                nsg_client.delete_security_group(secgroup['id'])
             except lib_exc.NotFound:
                 LOG.warn('Security group %s, id %s not found for clean-up' %
                          (secgroup['name'], secgroup['id']))
diff --git a/tempest/common/utils/linux/remote_client.py b/tempest/common/utils/linux/remote_client.py
index 025b79f..b76c356 100644
--- a/tempest/common/utils/linux/remote_client.py
+++ b/tempest/common/utils/linux/remote_client.py
@@ -31,7 +31,7 @@
     # NOTE(afazekas): It should always get an address instead of server
     def __init__(self, server, username, password=None, pkey=None):
         ssh_timeout = CONF.validation.ssh_timeout
-        network = CONF.compute.network_for_ssh
+        network = CONF.validation.network_for_ssh
         ip_version = CONF.validation.ip_version_for_ssh
         connect_timeout = CONF.validation.connect_timeout
         if isinstance(server, six.string_types):
@@ -51,7 +51,7 @@
     def exec_command(self, cmd):
         # Shell options below add more clearness on failures,
         # path is extended for some non-cirros guest oses (centos7)
-        cmd = CONF.compute.ssh_shell_prologue + " " + cmd
+        cmd = CONF.validation.ssh_shell_prologue + " " + cmd
         LOG.debug("Remote command: %s" % cmd)
         return self.ssh_client.exec_command(cmd)
 
@@ -73,7 +73,7 @@
             return output.split()[1]
 
     def get_number_of_vcpus(self):
-        output = self.exec_command('grep -c processor /proc/cpuinfo')
+        output = self.exec_command('grep -c ^processor /proc/cpuinfo')
         return int(output)
 
     def get_partitions(self):
@@ -94,8 +94,8 @@
         cmd = 'sudo sh -c "echo \\"%s\\" >/dev/console"' % message
         return self.exec_command(cmd)
 
-    def ping_host(self, host, count=CONF.compute.ping_count,
-                  size=CONF.compute.ping_size, nic=None):
+    def ping_host(self, host, count=CONF.validation.ping_count,
+                  size=CONF.validation.ping_size, nic=None):
         addr = netaddr.IPAddress(host)
         cmd = 'ping6' if addr.version == 6 else 'ping'
         if nic:
diff --git a/tempest/config.py b/tempest/config.py
index a6212fb..8f2ca4b 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -17,9 +17,10 @@
 
 import logging as std_logging
 import os
+import tempfile
 
+from oslo_concurrency import lockutils
 from oslo_config import cfg
-
 from oslo_log import log as logging
 
 from tempest.test_discover import plugins
@@ -231,12 +232,6 @@
     cfg.StrOpt('flavor_ref_alt',
                default="2",
                help='Valid secondary flavor to be used in tests.'),
-    cfg.StrOpt('image_ssh_user',
-               default="root",
-               help="User name used to authenticate to an instance."),
-    cfg.StrOpt('image_ssh_password',
-               default="password",
-               help="Password used to authenticate to an instance."),
     cfg.IntOpt('build_interval',
                default=1,
                help="Time in seconds between build status checks."),
@@ -245,41 +240,6 @@
                help="Timeout in seconds to wait for an instance to build. "
                     "Other services that do not define build_timeout will "
                     "inherit this value."),
-    cfg.StrOpt('ssh_shell_prologue',
-               default="set -eu -o pipefail; PATH=$$PATH:/sbin;",
-               help="Shell fragments to use before executing a command "
-                    "when sshing to a guest."),
-    cfg.StrOpt('ssh_auth_method',
-               default='keypair',
-               choices=('keypair', 'configured', 'adminpass', 'disabled'),
-               help="Auth method used for authenticate to the instance. "
-                    "Valid choices are: keypair, configured, adminpass "
-                    "and disabled. "
-                    "Keypair: start the servers with a ssh keypair. "
-                    "Configured: use the configured user and password. "
-                    "Adminpass: use the injected adminPass. "
-                    "Disabled: avoid using ssh when it is an option."),
-    cfg.StrOpt('ssh_connect_method',
-               default='floating',
-               choices=('fixed', 'floating'),
-               help="How to connect to the instance? "
-                    "fixed: using the first ip belongs the fixed network "
-                    "floating: creating and using a floating ip."),
-    cfg.StrOpt('ssh_user',
-               default='root',
-               help="User name used to authenticate to an instance."),
-    cfg.IntOpt('ping_timeout',
-               default=120,
-               help="Timeout in seconds to wait for ping to "
-                    "succeed."),
-    cfg.IntOpt('ping_size',
-               default=56,
-               help="The packet size for ping packets originating "
-                    "from remote linux hosts"),
-    cfg.IntOpt('ping_count',
-               default=1,
-               help="The number of ping packets originating from remote "
-                    "linux hosts"),
     cfg.IntOpt('ready_wait',
                default=0,
                help="Additional wait time for clean state, when there is "
@@ -291,13 +251,6 @@
                     "servers if tempest does not create a network or a "
                     "network is not specified elsewhere. It may be used for "
                     "ssh validation only if floating IPs are disabled."),
-    cfg.StrOpt('network_for_ssh',
-               default='public',
-               help="Network used for SSH connections. Ignored if "
-                    "use_floatingip_for_ssh=true or run_validation=false."),
-    cfg.BoolOpt('use_floatingip_for_ssh',
-                default=True,
-                help="Does SSH use Floating IPs?"),
     cfg.StrOpt('catalog_type',
                default='compute',
                help="Catalog type of the Compute service."),
@@ -323,12 +276,6 @@
                     'when shelved. This time should be the same as the time '
                     'of nova.conf, and some tests will run for as long as the '
                     'time.'),
-    cfg.StrOpt('floating_ip_range',
-               default='10.0.0.0/29',
-               help='Unallocated floating IP range, which will be used to '
-                    'test the floating IP bulk feature for CRUD operation. '
-                    'This block must not overlap an existing floating IP '
-                    'pool.'),
     cfg.IntOpt('min_compute_nodes',
                default=1,
                help=('The minimum number of compute nodes expected. This will '
@@ -441,9 +388,6 @@
                 default=True,
                 help='Does the test environment support creating snapshot '
                      'images of running instances?'),
-    cfg.BoolOpt('ec2_api',
-                default=True,
-                help='Does the test environment have the ec2 api running?'),
     cfg.BoolOpt('nova_cert',
                 default=True,
                 help='Does the test environment have the nova cert running?'),
@@ -672,9 +616,7 @@
     cfg.BoolOpt('run_validation',
                 default=False,
                 help='Enable ssh on created servers and creation of additional'
-                     ' validation resources to enable remote access',
-                deprecated_opts=[cfg.DeprecatedOpt('run_ssh',
-                                                   group='compute')]),
+                     ' validation resources to enable remote access'),
     cfg.BoolOpt('security_group',
                 default=True,
                 help='Enable/disable security groups.'),
@@ -686,31 +628,77 @@
                choices=['fixed', 'floating'],
                help='Default IP type used for validation: '
                     '-fixed: uses the first IP belonging to the fixed network '
-                    '-floating: creates and uses a floating IP'),
+                    '-floating: creates and uses a floating IP',
+               deprecated_opts=[cfg.DeprecatedOpt('use_floatingip_for_ssh',
+                                                  group='compute')]),
     cfg.StrOpt('auth_method',
                default='keypair',
                choices=['keypair'],
                help='Default authentication method to the instance. '
                     'Only ssh via keypair is supported for now. '
-                    'Additional methods will be handled in a separate spec.'),
+                    'Additional methods will be handled in a separate spec.',
+               deprecated_opts=[cfg.DeprecatedOpt('ssh_auth_method',
+                                                  group='compute')]),
     cfg.IntOpt('ip_version_for_ssh',
                default=4,
-               help='Default IP version for ssh connections.',
-               deprecated_opts=[cfg.DeprecatedOpt('ip_version_for_ssh',
-                                                  group='compute')]),
+               help='Default IP version for ssh connections.'),
     cfg.IntOpt('ping_timeout',
                default=120,
-               help='Timeout in seconds to wait for ping to succeed.'),
+               help='Timeout in seconds to wait for ping to succeed.',
+               deprecated_opts=[cfg.DeprecatedOpt('ping_timeout',
+                                                  group='compute')]),
     cfg.IntOpt('connect_timeout',
                default=60,
                help='Timeout in seconds to wait for the TCP connection to be '
-                    'successful.',
-               deprecated_opts=[cfg.DeprecatedOpt('ssh_channel_timeout',
-                                                  group='compute')]),
+                    'successful.'),
     cfg.IntOpt('ssh_timeout',
                default=300,
-               help='Timeout in seconds to wait for the ssh banner.',
-               deprecated_opts=[cfg.DeprecatedOpt('ssh_timeout',
+               help='Timeout in seconds to wait for the ssh banner.'),
+    cfg.StrOpt('image_ssh_user',
+               default="root",
+               help="User name used to authenticate to an instance.",
+               deprecated_opts=[cfg.DeprecatedOpt('image_ssh_user',
+                                                  group='compute'),
+                                cfg.DeprecatedOpt('ssh_user',
+                                                  group='compute'),
+                                cfg.DeprecatedOpt('ssh_user',
+                                                  group='scenario')]),
+    cfg.StrOpt('image_ssh_password',
+               default="password",
+               help="Password used to authenticate to an instance.",
+               deprecated_opts=[cfg.DeprecatedOpt('image_ssh_password',
+                                                  group='compute')]),
+    cfg.StrOpt('ssh_shell_prologue',
+               default="set -eu -o pipefail; PATH=$$PATH:/sbin;",
+               help="Shell fragments to use before executing a command "
+                    "when sshing to a guest.",
+               deprecated_opts=[cfg.DeprecatedOpt('ssh_shell_prologue',
+                                                  group='compute')]),
+    cfg.IntOpt('ping_size',
+               default=56,
+               help="The packet size for ping packets originating "
+                    "from remote linux hosts",
+               deprecated_opts=[cfg.DeprecatedOpt('ping_size',
+                                                  group='compute')]),
+    cfg.IntOpt('ping_count',
+               default=1,
+               help="The number of ping packets originating from remote "
+                    "linux hosts",
+               deprecated_opts=[cfg.DeprecatedOpt('ping_count',
+                                                  group='compute')]),
+    cfg.StrOpt('floating_ip_range',
+               default='10.0.0.0/29',
+               help='Unallocated floating IP range, which will be used to '
+                    'test the floating IP bulk feature for CRUD operation. '
+                    'This block must not overlap an existing floating IP '
+                    'pool.',
+               deprecated_opts=[cfg.DeprecatedOpt('floating_ip_range',
+                                                  group='compute')]),
+    cfg.StrOpt('network_for_ssh',
+               default='public',
+               help="Network used for SSH connections. Ignored if "
+                    "use_floatingip_for_ssh=true or run_validation=false.",
+               deprecated_opts=[cfg.DeprecatedOpt('network_for_ssh',
                                                   group='compute')]),
 ]
 
@@ -1013,54 +1001,6 @@
                 help="List of enabled data processing plugins")
 ]
 
-
-boto_group = cfg.OptGroup(name='boto',
-                          title='EC2/S3 options')
-BotoGroup = [
-    cfg.StrOpt('ec2_url',
-               default="http://localhost:8773/services/Cloud",
-               help="EC2 URL"),
-    cfg.StrOpt('s3_url',
-               default="http://localhost:8080",
-               help="S3 URL"),
-    cfg.StrOpt('aws_secret',
-               help="AWS Secret Key",
-               secret=True),
-    cfg.StrOpt('aws_access',
-               help="AWS Access Key"),
-    cfg.StrOpt('aws_zone',
-               default="nova",
-               help="AWS Zone for EC2 tests"),
-    cfg.StrOpt('s3_materials_path',
-               default="/opt/stack/devstack/files/images/"
-                       "s3-materials/cirros-0.3.0",
-               help="S3 Materials Path"),
-    cfg.StrOpt('ari_manifest',
-               default="cirros-0.3.0-x86_64-initrd.manifest.xml",
-               help="ARI Ramdisk Image manifest"),
-    cfg.StrOpt('ami_manifest',
-               default="cirros-0.3.0-x86_64-blank.img.manifest.xml",
-               help="AMI Machine Image manifest"),
-    cfg.StrOpt('aki_manifest',
-               default="cirros-0.3.0-x86_64-vmlinuz.manifest.xml",
-               help="AKI Kernel Image manifest"),
-    cfg.StrOpt('instance_type',
-               default="m1.tiny",
-               help="Instance type"),
-    cfg.IntOpt('http_socket_timeout',
-               default=3,
-               help="boto Http socket timeout"),
-    cfg.IntOpt('num_retries',
-               default=1,
-               help="boto num_retries on error"),
-    cfg.IntOpt('build_timeout',
-               default=60,
-               help="Status Change Timeout"),
-    cfg.IntOpt('build_interval',
-               default=1,
-               help="Status Change Test Interval"),
-]
-
 stress_group = cfg.OptGroup(name='stress', title='Stress Test Options')
 
 StressGroup = [
@@ -1126,9 +1066,6 @@
     cfg.StrOpt('aki_img_file',
                default='cirros-0.3.1-x86_64-vmlinuz',
                help='AKI image file name'),
-    cfg.StrOpt('ssh_user',
-               default='cirros',
-               help='ssh username for the image file'),
     cfg.IntOpt(
         'large_ops_number',
         default=0,
@@ -1322,7 +1259,6 @@
     (dashboard_group, DashboardGroup),
     (data_processing_group, DataProcessingGroup),
     (data_processing_feature_group, DataProcessingFeaturesGroup),
-    (boto_group, BotoGroup),
     (stress_group, StressGroup),
     (scenario_group, ScenarioGroup),
     (service_available_group, ServiceAvailableGroup),
@@ -1392,7 +1328,6 @@
         self.data_processing = _CONF['data-processing']
         self.data_processing_feature_enabled = _CONF[
             'data-processing-feature-enabled']
-        self.boto = _CONF.boto
         self.stress = _CONF.stress
         self.scenario = _CONF.scenario
         self.service_available = _CONF.service_available
@@ -1406,6 +1341,7 @@
         _CONF.set_default('alt_domain_name',
                           self.auth.default_credentials_domain_name,
                           group='identity')
+        logging.tempest_set_log_file('tempest.log')
 
     def __init__(self, parse_conf=True, config_path=None):
         """Initialize a configuration from a conf directory and conf file."""
@@ -1436,6 +1372,13 @@
             _CONF([], project='tempest', default_config_files=config_files)
         else:
             _CONF([], project='tempest')
+
+        logging_cfg_path = "%s/logging.conf" % os.path.dirname(path)
+        if (not hasattr(_CONF, 'log_config_append') and
+            os.path.isfile(logging_cfg_path)):
+            # if logging conf is in place we need to set log_config_append
+            _CONF.log_config_append = logging_cfg_path
+
         logging.setup(_CONF, 'tempest')
         LOG = logging.getLogger('tempest')
         LOG.info("Using tempest config file %s" % path)
@@ -1462,6 +1405,8 @@
     def __getattr__(self, attr):
         if not self._config:
             self._fix_log_levels()
+            lock_dir = os.path.join(tempfile.gettempdir(), 'tempest-lock')
+            lockutils.set_defaults(lock_dir)
             self._config = TempestConfigPrivate(config_path=self._path)
 
         return getattr(self._config, attr)
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index fc56ad5..8b34ce9 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -67,6 +67,7 @@
         cls.ports_client = cls.manager.ports_client
         cls.subnets_client = cls.manager.subnets_client
         cls.floating_ips_client = cls.manager.floating_ips_client
+        cls.security_groups_client = cls.manager.security_groups_client
         # Heat client
         cls.orchestration_client = cls.manager.orchestration_client
 
@@ -196,7 +197,7 @@
                 # to pass to create_port
                 if 'security_groups' in kwargs:
                     security_groups =\
-                        clients.network_client.list_security_groups(
+                        clients.security_groups_client.list_security_groups(
                         ).get('security_groups')
                     sec_dict = dict([(s['name'], s['id'])
                                     for s in security_groups])
@@ -359,7 +360,7 @@
         if isinstance(server_or_ip, six.string_types):
             ip = server_or_ip
         else:
-            addrs = server_or_ip['addresses'][CONF.compute.network_for_ssh]
+            addrs = server_or_ip['addresses'][CONF.validation.network_for_ssh]
             try:
                 ip = (addr['addr'] for addr in addrs if
                       netaddr.valid_ipv4(addr['addr'])).next()
@@ -368,7 +369,7 @@
                                        "remote server.")
 
         if username is None:
-            username = CONF.scenario.ssh_user
+            username = CONF.validation.image_ssh_user
         # Set this with 'keypair' or others to log in with keypair or
         # username/password.
         if CONF.validation.auth_method == 'keypair':
@@ -376,7 +377,7 @@
             if private_key is None:
                 private_key = self.keypair['private_key']
         else:
-            password = CONF.compute.image_ssh_password
+            password = CONF.validation.image_ssh_password
             private_key = None
         linux_client = remote_client.RemoteClient(ip, username,
                                                   pkey=private_key,
@@ -728,7 +729,7 @@
 
     def _list_agents(self, *args, **kwargs):
         """List agents using admin creds """
-        agents_list = self.admin_manager.network_client.list_agents(
+        agents_list = self.admin_manager.network_agents_client.list_agents(
             *args, **kwargs)
         return agents_list['agents']
 
@@ -941,18 +942,22 @@
                                             1)
 
     def _create_security_group(self, client=None, tenant_id=None,
-                               namestart='secgroup-smoke'):
+                               namestart='secgroup-smoke',
+                               security_groups_client=None):
         if client is None:
             client = self.network_client
+        if security_groups_client is None:
+            security_groups_client = self.security_groups_client
         if tenant_id is None:
-            tenant_id = client.tenant_id
-        secgroup = self._create_empty_security_group(namestart=namestart,
-                                                     client=client,
-                                                     tenant_id=tenant_id)
+            tenant_id = security_groups_client.tenant_id
+        secgroup = self._create_empty_security_group(
+            namestart=namestart, client=security_groups_client,
+            tenant_id=tenant_id)
 
         # Add rules to the security group
-        rules = self._create_loginable_secgroup_rule(client=client,
-                                                     secgroup=secgroup)
+        rules = self._create_loginable_secgroup_rule(
+            client=client, secgroup=secgroup,
+            security_groups_client=security_groups_client)
         for rule in rules:
             self.assertEqual(tenant_id, rule.tenant_id)
             self.assertEqual(secgroup.id, rule.security_group_id)
@@ -970,7 +975,7 @@
         :returns: DeletableSecurityGroup -- containing the secgroup created
         """
         if client is None:
-            client = self.network_client
+            client = self.security_groups_client
         if not tenant_id:
             tenant_id = client.tenant_id
         sg_name = data_utils.rand_name(namestart)
@@ -995,7 +1000,7 @@
         :returns: DeletableSecurityGroup -- default secgroup for given tenant
         """
         if client is None:
-            client = self.network_client
+            client = self.security_groups_client
         if not tenant_id:
             tenant_id = client.tenant_id
         sgs = [
@@ -1008,7 +1013,8 @@
                                                     **sgs[0])
 
     def _create_security_group_rule(self, secgroup=None, client=None,
-                                    tenant_id=None, **kwargs):
+                                    tenant_id=None,
+                                    security_groups_client=None, **kwargs):
         """Create a rule from a dictionary of rule parameters.
 
         Create a rule in a secgroup. if secgroup not defined will search for
@@ -1028,11 +1034,13 @@
         """
         if client is None:
             client = self.network_client
+        if security_groups_client is None:
+            security_groups_client = self.security_groups_client
         if not tenant_id:
-            tenant_id = client.tenant_id
+            tenant_id = security_groups_client.tenant_id
         if secgroup is None:
-            secgroup = self._default_security_group(client=client,
-                                                    tenant_id=tenant_id)
+            secgroup = self._default_security_group(
+                client=security_groups_client, tenant_id=tenant_id)
 
         ruleset = dict(security_group_id=secgroup.id,
                        tenant_id=secgroup.tenant_id)
@@ -1049,7 +1057,8 @@
 
         return sg_rule
 
-    def _create_loginable_secgroup_rule(self, client=None, secgroup=None):
+    def _create_loginable_secgroup_rule(self, client=None, secgroup=None,
+                                        security_groups_client=None):
         """Create loginable security group rule
 
         These rules are intended to permit inbound ssh and icmp
@@ -1060,6 +1069,8 @@
 
         if client is None:
             client = self.network_client
+        if security_groups_client is None:
+            security_groups_client = self.security_groups_client
         rules = []
         rulesets = [
             dict(
@@ -1083,7 +1094,9 @@
                 ruleset['direction'] = r_direction
                 try:
                     sg_rule = self._create_security_group_rule(
-                        client=client, secgroup=secgroup, **ruleset)
+                        client=client, secgroup=secgroup,
+                        security_groups_client=security_groups_client,
+                        **ruleset)
                 except lib_exc.Conflict as ex:
                     # if rule already exist - skip rule and continue
                     msg = 'Security group rule already exists'
@@ -1096,7 +1109,7 @@
         return rules
 
     def _ssh_to_server(self, server, private_key):
-        ssh_login = CONF.compute.image_ssh_user
+        ssh_login = CONF.validation.image_ssh_user
         return self.get_remote_client(server,
                                       username=ssh_login,
                                       private_key=private_key)
@@ -1365,7 +1378,7 @@
         randomized_name = data_utils.rand_name('scenario-type-' + name)
         LOG.debug("Creating a volume type: %s", randomized_name)
         body = client.create_volume_type(
-            randomized_name)['volume_type']
+            name=randomized_name)['volume_type']
         self.assertIn('id', body)
         self.addCleanup(client.delete_volume_type, body['id'])
         return body
diff --git a/tempest/scenario/test_baremetal_basic_ops.py b/tempest/scenario/test_baremetal_basic_ops.py
index 9415629..93b32f7 100644
--- a/tempest/scenario/test_baremetal_basic_ops.py
+++ b/tempest/scenario/test_baremetal_basic_ops.py
@@ -123,23 +123,9 @@
         # the same size as our flavor definition.
         eph_size = self.get_flavor_ephemeral_size()
         if eph_size:
-            preserve_ephemeral = True
-
             self.verify_partition(vm_client, 'ephemeral0', '/mnt', eph_size)
             # Create the test file
-            timestamp = self.create_timestamp(
+            self.create_timestamp(
                 floating_ip, private_key=self.keypair['private_key'])
-        else:
-            preserve_ephemeral = False
 
-        # Rebuild and preserve the ephemeral partition if it exists
-        self.rebuild_instance(preserve_ephemeral)
-        self.verify_connectivity()
-
-        # Check that we maintained our data
-        if eph_size:
-            self.verify_partition(vm_client, 'ephemeral0', '/mnt', eph_size)
-            timestamp2 = self.get_timestamp(
-                floating_ip, private_key=self.keypair['private_key'])
-            self.assertEqual(timestamp, timestamp2)
         self.terminate_instance()
diff --git a/tempest/scenario/test_network_advanced_server_ops.py b/tempest/scenario/test_network_advanced_server_ops.py
index 8aac98e..d6dd6f3 100644
--- a/tempest/scenario/test_network_advanced_server_ops.py
+++ b/tempest/scenario/test_network_advanced_server_ops.py
@@ -74,7 +74,7 @@
 
     def _check_network_connectivity(self, server, keypair, floating_ip,
                                     should_connect=True):
-        username = CONF.compute.image_ssh_user
+        username = CONF.validation.image_ssh_user
         private_key = keypair['private_key']
         self._check_tenant_network_connectivity(
             server, username, private_key,
diff --git a/tempest/scenario/test_network_basic_ops.py b/tempest/scenario/test_network_basic_ops.py
index 20ccc59..b8bec16 100644
--- a/tempest/scenario/test_network_basic_ops.py
+++ b/tempest/scenario/test_network_basic_ops.py
@@ -172,7 +172,7 @@
         return self.keypairs[server['key_name']]['private_key']
 
     def _check_tenant_network_connectivity(self):
-        ssh_login = CONF.compute.image_ssh_user
+        ssh_login = CONF.validation.image_ssh_user
         for server in self.servers:
             # call the common method in the parent class
             super(TestNetworkBasicOps, self).\
@@ -195,7 +195,7 @@
         :param should_check_floating_ip_status: bool. should status of
         floating_ip be checked or not
         """
-        ssh_login = CONF.compute.image_ssh_user
+        ssh_login = CONF.validation.image_ssh_user
         floating_ip, server = self.floating_ip_tuple
         ip_address = floating_ip.floating_ip_address
         private_key = None
@@ -683,9 +683,9 @@
 
         list_hosts = (self.admin_manager.network_client.
                       list_l3_agents_hosting_router)
-        schedule_router = (self.admin_manager.network_client.
+        schedule_router = (self.admin_manager.network_agents_client.
                            add_router_to_l3_agent)
-        unschedule_router = (self.admin_manager.network_client.
+        unschedule_router = (self.admin_manager.network_agents_client.
                              remove_router_from_l3_agent)
 
         agent_list = set(a["id"] for a in
@@ -744,20 +744,28 @@
     def test_port_security_macspoofing_port(self):
         """Tests port_security extension enforces mac spoofing
 
-        1. create a new network
-        2. connect VM to new network
-        4. check VM can ping new network DHCP port
-        5. spoof mac on new new network interface
-        6. check Neutron enforces mac spoofing and blocks pings via spoofed
-            interface
-        7. disable port-security on the spoofed port
-        8. check Neutron allows pings via spoofed interface
+        Neutron security groups always apply anti-spoof rules on the VMs. This
+        allows traffic to originate and terminate at the VM as expected, but
+        prevents traffic to pass through the VM. Anti-spoof rules are not
+        required in cases where the VM routes traffic through it.
+
+        The test steps are :
+        1. Create a new network.
+        2. Connect (hotplug) the VM to a new network.
+        3. Check the VM can ping the DHCP interface of this network.
+        4. Spoof the mac address of the new VM interface.
+        5. Check the Security Group enforces mac spoofing and blocks pings via
+           spoofed interface (VM cannot ping the DHCP interface).
+        6. Disable port-security of the spoofed port- set the flag to false.
+        7. Retest 3rd step and check that the Security Group allows pings via
+        the spoofed interface.
         """
+
         spoof_mac = "00:00:00:00:00:01"
 
         # Create server
         self._setup_network_and_servers()
-        self.check_public_network_connectivity(should_connect=False)
+        self.check_public_network_connectivity(should_connect=True)
         self._create_new_network()
         self._hotplug_server()
         fip, server = self.floating_ip_tuple
diff --git a/tempest/scenario/test_network_v6.py b/tempest/scenario/test_network_v6.py
index d6ad46a..40c7680 100644
--- a/tempest/scenario/test_network_v6.py
+++ b/tempest/scenario/test_network_v6.py
@@ -114,7 +114,7 @@
         return ips
 
     def prepare_server(self, networks=None):
-        username = CONF.compute.image_ssh_user
+        username = CONF.validation.image_ssh_user
 
         networks = networks or [self.network]
 
diff --git a/tempest/scenario/test_security_groups_basic_ops.py b/tempest/scenario/test_security_groups_basic_ops.py
index e266dc2..783b740 100644
--- a/tempest/scenario/test_security_groups_basic_ops.py
+++ b/tempest/scenario/test_security_groups_basic_ops.py
@@ -176,14 +176,14 @@
         access_sg = self._create_empty_security_group(
             namestart='secgroup_access-',
             tenant_id=tenant.creds.tenant_id,
-            client=tenant.manager.network_client
+            client=tenant.manager.security_groups_client
         )
 
         # don't use default secgroup since it allows in-tenant traffic
         def_sg = self._create_empty_security_group(
             namestart='secgroup_general-',
             tenant_id=tenant.creds.tenant_id,
-            client=tenant.manager.network_client
+            client=tenant.manager.security_groups_client
         )
         tenant.security_groups.update(access=access_sg, default=def_sg)
         ssh_rule = dict(
@@ -464,7 +464,7 @@
         new_sg = self._create_empty_security_group(
             namestart='secgroup_new-',
             tenant_id=new_tenant.creds.tenant_id,
-            client=new_tenant.manager.network_client)
+            client=new_tenant.manager.security_groups_client)
         icmp_rule = dict(
             protocol='icmp',
             direction='ingress',
@@ -512,7 +512,7 @@
         tenant = self.primary_tenant
         ip = self._get_server_ip(tenant.access_point,
                                  floating=self.floating_ip_access)
-        ssh_login = CONF.compute.image_ssh_user
+        ssh_login = CONF.validation.image_ssh_user
         private_key = tenant.keypair['private_key']
         self.check_vm_connectivity(ip,
                                    should_connect=False)
diff --git a/tempest/services/botoclients.py b/tempest/services/botoclients.py
deleted file mode 100644
index 9d452ff..0000000
--- a/tempest/services/botoclients.py
+++ /dev/null
@@ -1,217 +0,0 @@
-# Copyright 2012 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 contextlib
-import types
-
-import boto
-import boto.ec2
-import boto.s3.connection
-from six.moves import configparser as ConfigParser
-from six.moves.urllib import parse as urlparse
-from tempest_lib import exceptions as lib_exc
-
-from tempest import config
-
-CONF = config.CONF
-
-
-class BotoClientBase(object):
-
-    ALLOWED_METHODS = set()
-
-    def __init__(self, identity_client):
-        self.identity_client = identity_client
-
-        self.ca_cert = CONF.identity.ca_certificates_file
-        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.connection_data = {}
-
-    def _config_boto_timeout(self, timeout, retries):
-        try:
-            boto.config.add_section("Boto")
-        except ConfigParser.DuplicateSectionError:
-            pass
-        boto.config.set("Boto", "http_socket_timeout", timeout)
-        boto.config.set("Boto", "num_retries", retries)
-
-    def _config_boto_ca_certificates_file(self, ca_cert):
-        if ca_cert is None:
-            return
-
-        try:
-            boto.config.add_section("Boto")
-        except ConfigParser.DuplicateSectionError:
-            pass
-        boto.config.set("Boto", "ca_certificates_file", ca_cert)
-
-    def __getattr__(self, name):
-        """Automatically creates methods for the allowed methods set."""
-        if name in self.ALLOWED_METHODS:
-            def func(self, *args, **kwargs):
-                with contextlib.closing(self.get_connection()) as conn:
-                    return getattr(conn, name)(*args, **kwargs)
-
-            func.__name__ = name
-            setattr(self, name, types.MethodType(func, self, self.__class__))
-            setattr(self.__class__, name,
-                    types.MethodType(func, None, self.__class__))
-            return getattr(self, name)
-        else:
-            raise AttributeError(name)
-
-    def get_connection(self):
-        self._config_boto_timeout(self.connection_timeout, self.num_retries)
-        self._config_boto_ca_certificates_file(self.ca_cert)
-
-        ec2_client_args = {'aws_access_key_id': CONF.boto.aws_access,
-                           'aws_secret_access_key': CONF.boto.aws_secret}
-        if not all(ec2_client_args.values()):
-            ec2_client_args = self.get_aws_credentials(self.identity_client)
-
-        self.connection_data.update(ec2_client_args)
-        return self.connect_method(**self.connection_data)
-
-    def get_aws_credentials(self, identity_client):
-        """Obtain existing, or create new AWS credentials
-
-        :param identity_client: identity client with embedded credentials
-        :return: EC2 credentials
-        """
-        ec2_cred_list = identity_client.list_user_ec2_credentials(
-            identity_client.user_id)['credentials']
-        for cred in ec2_cred_list:
-            if cred['tenant_id'] == identity_client.tenant_id:
-                ec2_cred = cred
-                break
-        else:
-            ec2_cred = (identity_client.create_user_ec2_credentials(
-                identity_client.user_id,
-                tenant_id=identity_client.tenant_id)['credential'])
-        if not all((ec2_cred, ec2_cred['access'], ec2_cred['secret'])):
-            raise lib_exc.NotFound("Unable to get access and secret keys")
-        else:
-            ec2_cred_aws = {}
-            ec2_cred_aws['aws_access_key_id'] = ec2_cred['access']
-            ec2_cred_aws['aws_secret_access_key'] = ec2_cred['secret']
-        return ec2_cred_aws
-
-
-class APIClientEC2(BotoClientBase):
-
-    def connect_method(self, *args, **kwargs):
-        return boto.connect_ec2(*args, **kwargs)
-
-    def __init__(self, identity_client):
-        super(APIClientEC2, self).__init__(identity_client)
-        insecure_ssl = CONF.identity.disable_ssl_certificate_validation
-        purl = urlparse.urlparse(CONF.boto.ec2_url)
-
-        region_name = CONF.compute.region
-        if not region_name:
-            region_name = CONF.identity.region
-        region = boto.ec2.regioninfo.RegionInfo(name=region_name,
-                                                endpoint=purl.hostname)
-        port = purl.port
-        if port is None:
-            if purl.scheme is not "https":
-                port = 80
-            else:
-                port = 443
-        else:
-            port = int(port)
-        self.connection_data.update({"is_secure": purl.scheme == "https",
-                                     "validate_certs": not insecure_ssl,
-                                     "region": region,
-                                     "host": purl.hostname,
-                                     "port": port,
-                                     "path": purl.path})
-
-    ALLOWED_METHODS = set(('create_key_pair', 'get_key_pair',
-                           'delete_key_pair', 'import_key_pair',
-                           'get_all_key_pairs',
-                           'get_all_tags',
-                           'create_image', 'get_image',
-                           'register_image', 'deregister_image',
-                           'get_all_images', 'get_image_attribute',
-                           'modify_image_attribute', 'reset_image_attribute',
-                           'get_all_kernels',
-                           'create_volume', 'delete_volume',
-                           'get_all_volume_status', 'get_all_volumes',
-                           'get_volume_attribute', 'modify_volume_attribute'
-                           'bundle_instance', 'cancel_spot_instance_requests',
-                           'confirm_product_instanc',
-                           'get_all_instance_status', 'get_all_instances',
-                           'get_all_reserved_instances',
-                           'get_all_spot_instance_requests',
-                           'get_instance_attribute', 'monitor_instance',
-                           'monitor_instances', 'unmonitor_instance',
-                           'unmonitor_instances',
-                           'purchase_reserved_instance_offering',
-                           'reboot_instances', 'request_spot_instances',
-                           'reset_instance_attribute', 'run_instances',
-                           'start_instances', 'stop_instances',
-                           'terminate_instances',
-                           'attach_network_interface', 'attach_volume',
-                           'detach_network_interface', 'detach_volume',
-                           'get_console_output',
-                           'delete_network_interface', 'create_subnet',
-                           'create_network_interface', 'delete_subnet',
-                           'get_all_network_interfaces',
-                           'allocate_address', 'associate_address',
-                           'disassociate_address', 'get_all_addresses',
-                           'release_address',
-                           'create_snapshot', 'delete_snapshot',
-                           'get_all_snapshots', 'get_snapshot_attribute',
-                           'modify_snapshot_attribute',
-                           'reset_snapshot_attribute', 'trim_snapshots',
-                           'get_all_regions', 'get_all_zones',
-                           'get_all_security_groups', 'create_security_group',
-                           'delete_security_group', 'authorize_security_group',
-                           'authorize_security_group_egress',
-                           'revoke_security_group',
-                           'revoke_security_group_egress'))
-
-
-class ObjectClientS3(BotoClientBase):
-
-    def connect_method(self, *args, **kwargs):
-        return boto.connect_s3(*args, **kwargs)
-
-    def __init__(self, identity_client):
-        super(ObjectClientS3, self).__init__(identity_client)
-        insecure_ssl = CONF.identity.disable_ssl_certificate_validation
-        purl = urlparse.urlparse(CONF.boto.s3_url)
-        port = purl.port
-        if port is None:
-            if purl.scheme is not "https":
-                port = 80
-            else:
-                port = 443
-        else:
-            port = int(port)
-        self.connection_data.update({"is_secure": purl.scheme == "https",
-                                     "validate_certs": not insecure_ssl,
-                                     "host": purl.hostname,
-                                     "port": port,
-                                     "calling_format": boto.s3.connection.
-                                     OrdinaryCallingFormat()})
-
-    ALLOWED_METHODS = set(('create_bucket', 'delete_bucket', 'generate_url',
-                           'get_all_buckets', 'get_bucket', 'delete_key',
-                           'lookup'))
diff --git a/tempest/services/compute/json/floating_ips_client.py b/tempest/services/compute/json/floating_ips_client.py
deleted file mode 100644
index b3e2f2f..0000000
--- a/tempest/services/compute/json/floating_ips_client.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright 2012 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.
-
-from oslo_serialization import jsonutils as json
-from six.moves.urllib import parse as urllib
-from tempest_lib import exceptions as lib_exc
-
-from tempest.api_schema.response.compute.v2_1 import floating_ips as schema
-from tempest.common import service_client
-
-
-class FloatingIPsClient(service_client.ServiceClient):
-
-    def list_floating_ips(self, **params):
-        """Returns a list of all floating IPs filtered by any parameters."""
-        url = 'os-floating-ips'
-        if params:
-            url += '?%s' % urllib.urlencode(params)
-
-        resp, body = self.get(url)
-        body = json.loads(body)
-        self.validate_response(schema.list_floating_ips, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_floating_ip(self, floating_ip_id):
-        """Get the details of a floating IP."""
-        url = "os-floating-ips/%s" % floating_ip_id
-        resp, body = self.get(url)
-        body = json.loads(body)
-        self.validate_response(schema.create_get_floating_ip, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def create_floating_ip(self, **kwargs):
-        """Allocate a floating IP to the project.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#createFloatingIP
-        """
-        url = 'os-floating-ips'
-        post_body = json.dumps(kwargs)
-        resp, body = self.post(url, post_body)
-        body = json.loads(body)
-        self.validate_response(schema.create_get_floating_ip, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_floating_ip(self, floating_ip_id):
-        """Deletes the provided floating IP from the project."""
-        url = "os-floating-ips/%s" % floating_ip_id
-        resp, body = self.delete(url)
-        self.validate_response(schema.add_remove_floating_ip, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def associate_floating_ip_to_server(self, floating_ip, server_id):
-        """Associate the provided floating IP to a specific server."""
-        url = "servers/%s/action" % server_id
-        post_body = {
-            'addFloatingIp': {
-                'address': floating_ip,
-            }
-        }
-
-        post_body = json.dumps(post_body)
-        resp, body = self.post(url, post_body)
-        self.validate_response(schema.add_remove_floating_ip, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def disassociate_floating_ip_from_server(self, floating_ip, server_id):
-        """Disassociate the provided floating IP from a specific server."""
-        url = "servers/%s/action" % server_id
-        post_body = {
-            'removeFloatingIp': {
-                'address': floating_ip,
-            }
-        }
-
-        post_body = json.dumps(post_body)
-        resp, body = self.post(url, post_body)
-        self.validate_response(schema.add_remove_floating_ip, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def is_resource_deleted(self, id):
-        try:
-            self.show_floating_ip(id)
-        except lib_exc.NotFound:
-            return True
-        return False
-
-    @property
-    def resource_type(self):
-        """Returns the primary type of resource this client works with."""
-        return 'floating_ip'
diff --git a/tempest/services/compute/json/security_group_rules_client.py b/tempest/services/compute/json/security_group_rules_client.py
deleted file mode 100644
index 314b1ed..0000000
--- a/tempest/services/compute/json/security_group_rules_client.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2012 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.
-
-from oslo_serialization import jsonutils as json
-
-from tempest.api_schema.response.compute.v2_1 import security_groups as schema
-from tempest.common import service_client
-
-
-class SecurityGroupRulesClient(service_client.ServiceClient):
-
-    def create_security_group_rule(self, **kwargs):
-        """Creating a new security group rules.
-
-        parent_group_id :ID of Security group
-        ip_protocol : ip_proto (icmp, tcp, udp).
-        from_port: Port at start of range.
-        to_port  : Port at end of range.
-        Following optional keyword arguments are accepted:
-        cidr     : CIDR for address range.
-        group_id : ID of the Source group
-        """
-        post_body = json.dumps({'security_group_rule': kwargs})
-        url = 'os-security-group-rules'
-        resp, body = self.post(url, post_body)
-        body = json.loads(body)
-        self.validate_response(schema.create_security_group_rule, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_security_group_rule(self, group_rule_id):
-        """Deletes the provided Security Group rule."""
-        resp, body = self.delete('os-security-group-rules/%s' %
-                                 group_rule_id)
-        self.validate_response(schema.delete_security_group_rule, resp, body)
-        return service_client.ResponseBody(resp, body)
diff --git a/tempest/services/compute/json/server_groups_client.py b/tempest/services/compute/json/server_groups_client.py
deleted file mode 100644
index 44ac015..0000000
--- a/tempest/services/compute/json/server_groups_client.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# Copyright 2013 Hewlett-Packard Development Company, L.P.
-# 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 oslo_serialization import jsonutils as json
-
-from tempest.api_schema.response.compute.v2_1 import servers as schema
-from tempest.common import service_client
-
-
-class ServerGroupsClient(service_client.ServiceClient):
-
-    def create_server_group(self, **kwargs):
-        """Create the server group
-
-        name : Name of the server-group
-        policies : List of the policies - affinity/anti-affinity)
-        """
-        post_body = json.dumps({'server_group': kwargs})
-        resp, body = self.post('os-server-groups', post_body)
-
-        body = json.loads(body)
-        self.validate_response(schema.create_show_server_group, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_server_group(self, server_group_id):
-        """Delete the given server-group."""
-        resp, body = self.delete("os-server-groups/%s" % server_group_id)
-        self.validate_response(schema.delete_server_group, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def list_server_groups(self):
-        """List the server-groups."""
-        resp, body = self.get("os-server-groups")
-        body = json.loads(body)
-        self.validate_response(schema.list_server_groups, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_server_group(self, server_group_id):
-        """Get the details of given server_group."""
-        resp, body = self.get("os-server-groups/%s" % server_group_id)
-        body = json.loads(body)
-        self.validate_response(schema.create_show_server_group, resp, body)
-        return service_client.ResponseBody(resp, body)
diff --git a/tempest/services/compute/json/servers_client.py b/tempest/services/compute/json/servers_client.py
deleted file mode 100644
index c20295b..0000000
--- a/tempest/services/compute/json/servers_client.py
+++ /dev/null
@@ -1,561 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# Copyright 2013 Hewlett-Packard Development Company, L.P.
-# 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
-
-from oslo_serialization import jsonutils as json
-from six.moves.urllib import parse as urllib
-
-from tempest.api_schema.response.compute.v2_1 import servers as schema
-from tempest.common import service_client
-
-
-class ServersClient(service_client.ServiceClient):
-
-    def __init__(self, auth_provider, service, region,
-                 enable_instance_password=True, **kwargs):
-        super(ServersClient, self).__init__(
-            auth_provider, service, region, **kwargs)
-        self.enable_instance_password = enable_instance_password
-
-    def create_server(self, **kwargs):
-        """Create server.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#createServer
-
-        Most parameters except the following are passed to the API without
-        any changes.
-        :param disk_config: The name is changed to OS-DCF:diskConfig
-        :param scheduler_hints: The name is changed to os:scheduler_hints and
-        the parameter is set in the same level as the parameter 'server'.
-        """
-        body = copy.deepcopy(kwargs)
-        if body.get('disk_config'):
-            body['OS-DCF:diskConfig'] = body.pop('disk_config')
-
-        hints = None
-        if body.get('scheduler_hints'):
-            hints = {'os:scheduler_hints': body.pop('scheduler_hints')}
-
-        post_body = {'server': body}
-
-        if hints:
-            post_body = dict(post_body.items() + hints.items())
-
-        post_body = json.dumps(post_body)
-        resp, body = self.post('servers', post_body)
-
-        body = json.loads(body)
-        # NOTE(maurosr): this deals with the case of multiple server create
-        # with return reservation id set True
-        if 'reservation_id' in body:
-            return service_client.ResponseBody(resp, body)
-        if self.enable_instance_password:
-            create_schema = schema.create_server_with_admin_pass
-        else:
-            create_schema = schema.create_server
-        self.validate_response(create_schema, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def update_server(self, server_id, **kwargs):
-        """Update server.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#updateServer
-
-        Most parameters except the following are passed to the API without
-        any changes.
-        :param disk_config: The name is changed to OS-DCF:diskConfig
-        """
-        if kwargs.get('disk_config'):
-            kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
-
-        post_body = json.dumps({'server': kwargs})
-        resp, body = self.put("servers/%s" % server_id, post_body)
-        body = json.loads(body)
-        self.validate_response(schema.update_server, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_server(self, server_id):
-        """Get server details."""
-        resp, body = self.get("servers/%s" % server_id)
-        body = json.loads(body)
-        self.validate_response(schema.get_server, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_server(self, server_id):
-        """Delete server."""
-        resp, body = self.delete("servers/%s" % server_id)
-        self.validate_response(schema.delete_server, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def list_servers(self, detail=False, **params):
-        """List servers.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#listServers
-                          and http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#listDetailServers
-        """
-
-        url = 'servers'
-        _schema = schema.list_servers
-
-        if detail:
-            url += '/detail'
-            _schema = schema.list_servers_detail
-        if params:
-            url += '?%s' % urllib.urlencode(params)
-
-        resp, body = self.get(url)
-        body = json.loads(body)
-        self.validate_response(_schema, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def list_addresses(self, server_id):
-        """Lists all addresses for a server."""
-        resp, body = self.get("servers/%s/ips" % server_id)
-        body = json.loads(body)
-        self.validate_response(schema.list_addresses, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def list_addresses_by_network(self, server_id, network_id):
-        """Lists all addresses of a specific network type for a server."""
-        resp, body = self.get("servers/%s/ips/%s" %
-                              (server_id, network_id))
-        body = json.loads(body)
-        self.validate_response(schema.list_addresses_by_network, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def action(self, server_id, action_name,
-               schema=schema.server_actions_common_schema,
-               **kwargs):
-        post_body = json.dumps({action_name: kwargs})
-        resp, body = self.post('servers/%s/action' % server_id,
-                               post_body)
-        if body:
-            body = json.loads(body)
-        self.validate_response(schema, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def create_backup(self, server_id, **kwargs):
-        """Backup a server instance.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#createBackup
-        """
-        return self.action(server_id, "createBackup", **kwargs)
-
-    def change_password(self, server_id, **kwargs):
-        """Change the root password for the server.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#changePassword
-        """
-        return self.action(server_id, 'changePassword', **kwargs)
-
-    def show_password(self, server_id):
-        resp, body = self.get("servers/%s/os-server-password" %
-                              server_id)
-        body = json.loads(body)
-        self.validate_response(schema.show_password, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_password(self, server_id):
-        """Removes the encrypted server password from the metadata server
-
-        Note that this does not actually change the instance server
-        password.
-        """
-        resp, body = self.delete("servers/%s/os-server-password" %
-                                 server_id)
-        self.validate_response(schema.server_actions_delete_password,
-                               resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def reboot_server(self, server_id, **kwargs):
-        """Reboot a server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#reboot
-        """
-        return self.action(server_id, 'reboot', **kwargs)
-
-    def rebuild_server(self, server_id, image_ref, **kwargs):
-        """Rebuild a server with a new image.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#rebuild
-
-        Most parameters except the following are passed to the API without
-        any changes.
-        :param disk_config: The name is changed to OS-DCF:diskConfig
-        """
-        kwargs['imageRef'] = image_ref
-        if 'disk_config' in kwargs:
-            kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
-        if self.enable_instance_password:
-            rebuild_schema = schema.rebuild_server_with_admin_pass
-        else:
-            rebuild_schema = schema.rebuild_server
-        return self.action(server_id, 'rebuild',
-                           rebuild_schema, **kwargs)
-
-    def resize_server(self, server_id, flavor_ref, **kwargs):
-        """Change the flavor of a server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#resize
-
-        Most parameters except the following are passed to the API without
-        any changes.
-        :param disk_config: The name is changed to OS-DCF:diskConfig
-        """
-        kwargs['flavorRef'] = flavor_ref
-        if 'disk_config' in kwargs:
-            kwargs['OS-DCF:diskConfig'] = kwargs.pop('disk_config')
-        return self.action(server_id, 'resize', **kwargs)
-
-    def confirm_resize_server(self, server_id, **kwargs):
-        """Confirm the flavor change for a server.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#confirmResize
-        """
-        return self.action(server_id, 'confirmResize',
-                           schema.server_actions_confirm_resize,
-                           **kwargs)
-
-    def revert_resize_server(self, server_id, **kwargs):
-        """Revert a server back to its original flavor.
-
-        Available params: see http://developer.openstack.org/
-                              api-ref-compute-v2.1.html#revertResize
-        """
-        return self.action(server_id, 'revertResize', **kwargs)
-
-    def list_server_metadata(self, server_id):
-        resp, body = self.get("servers/%s/metadata" % server_id)
-        body = json.loads(body)
-        self.validate_response(schema.list_server_metadata, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def set_server_metadata(self, server_id, meta, no_metadata_field=False):
-        if no_metadata_field:
-            post_body = ""
-        else:
-            post_body = json.dumps({'metadata': meta})
-        resp, body = self.put('servers/%s/metadata' % server_id,
-                              post_body)
-        body = json.loads(body)
-        self.validate_response(schema.set_server_metadata, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def update_server_metadata(self, server_id, meta):
-        post_body = json.dumps({'metadata': meta})
-        resp, body = self.post('servers/%s/metadata' % server_id,
-                               post_body)
-        body = json.loads(body)
-        self.validate_response(schema.update_server_metadata,
-                               resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_server_metadata_item(self, server_id, key):
-        resp, body = self.get("servers/%s/metadata/%s" % (server_id, key))
-        body = json.loads(body)
-        self.validate_response(schema.set_show_server_metadata_item,
-                               resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def set_server_metadata_item(self, server_id, key, meta):
-        post_body = json.dumps({'meta': meta})
-        resp, body = self.put('servers/%s/metadata/%s' % (server_id, key),
-                              post_body)
-        body = json.loads(body)
-        self.validate_response(schema.set_show_server_metadata_item,
-                               resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_server_metadata_item(self, server_id, key):
-        resp, body = self.delete("servers/%s/metadata/%s" %
-                                 (server_id, key))
-        self.validate_response(schema.delete_server_metadata_item,
-                               resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def stop_server(self, server_id, **kwargs):
-        return self.action(server_id, 'os-stop', **kwargs)
-
-    def start_server(self, server_id, **kwargs):
-        return self.action(server_id, 'os-start', **kwargs)
-
-    def attach_volume(self, server_id, **kwargs):
-        """Attaches a volume to a server instance."""
-        post_body = json.dumps({'volumeAttachment': kwargs})
-        resp, body = self.post('servers/%s/os-volume_attachments' % server_id,
-                               post_body)
-        body = json.loads(body)
-        self.validate_response(schema.attach_volume, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def detach_volume(self, server_id, volume_id):  # noqa
-        """Detaches a volume from a server instance."""
-        resp, body = self.delete('servers/%s/os-volume_attachments/%s' %
-                                 (server_id, volume_id))
-        self.validate_response(schema.detach_volume, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_volume_attachment(self, server_id, attach_id):
-        """Return details about the given volume attachment."""
-        resp, body = self.get('servers/%s/os-volume_attachments/%s' % (
-            server_id, attach_id))
-        body = json.loads(body)
-        self.validate_response(schema.show_volume_attachment, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def list_volume_attachments(self, server_id):
-        """Returns the list of volume attachments for a given instance."""
-        resp, body = self.get('servers/%s/os-volume_attachments' % (
-            server_id))
-        body = json.loads(body)
-        self.validate_response(schema.list_volume_attachments, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def add_security_group(self, server_id, **kwargs):
-        """Add a security group to the server.
-
-        Available params: TODO
-        """
-        # TODO(oomichi): The api-site doesn't contain this API description.
-        # So the above should be changed to the api-site link after
-        # adding the description on the api-site.
-        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1524199
-        return self.action(server_id, 'addSecurityGroup', **kwargs)
-
-    def remove_security_group(self, server_id, **kwargs):
-        """Remove a security group from the server.
-
-        Available params: TODO
-        """
-        # TODO(oomichi): The api-site doesn't contain this API description.
-        # So the above should be changed to the api-site link after
-        # adding the description on the api-site.
-        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1524199
-        return self.action(server_id, 'removeSecurityGroup', **kwargs)
-
-    def live_migrate_server(self, server_id, **kwargs):
-        """This should be called with administrator privileges.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#migrateLive
-        """
-        return self.action(server_id, 'os-migrateLive', **kwargs)
-
-    def migrate_server(self, server_id, **kwargs):
-        """Migrate a server to a new host.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#migrate
-        """
-        return self.action(server_id, 'migrate', **kwargs)
-
-    def lock_server(self, server_id, **kwargs):
-        """Lock the given server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#lock
-        """
-        return self.action(server_id, 'lock', **kwargs)
-
-    def unlock_server(self, server_id, **kwargs):
-        """UNlock the given server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#unlock
-        """
-        return self.action(server_id, 'unlock', **kwargs)
-
-    def suspend_server(self, server_id, **kwargs):
-        """Suspend the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#suspend
-        """
-        return self.action(server_id, 'suspend', **kwargs)
-
-    def resume_server(self, server_id, **kwargs):
-        """Un-suspend the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#resume
-        """
-        return self.action(server_id, 'resume', **kwargs)
-
-    def pause_server(self, server_id, **kwargs):
-        """Pause the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#pause
-        """
-        return self.action(server_id, 'pause', **kwargs)
-
-    def unpause_server(self, server_id, **kwargs):
-        """Un-pause the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#unpause
-        """
-        return self.action(server_id, 'unpause', **kwargs)
-
-    def reset_state(self, server_id, **kwargs):
-        """Reset the state of a server to active/error.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#resetState
-        """
-        return self.action(server_id, 'os-resetState', **kwargs)
-
-    def shelve_server(self, server_id, **kwargs):
-        """Shelve the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#shelve
-        """
-        return self.action(server_id, 'shelve', **kwargs)
-
-    def unshelve_server(self, server_id, **kwargs):
-        """Un-shelve the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#unshelve
-        """
-        return self.action(server_id, 'unshelve', **kwargs)
-
-    def shelve_offload_server(self, server_id, **kwargs):
-        """Shelve-offload the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#shelveOffload
-        """
-        return self.action(server_id, 'shelveOffload', **kwargs)
-
-    def get_console_output(self, server_id, **kwargs):
-        """Get console output.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#getConsoleOutput
-        """
-        return self.action(server_id, 'os-getConsoleOutput',
-                           schema.get_console_output, **kwargs)
-
-    def list_virtual_interfaces(self, server_id):
-        """List the virtual interfaces used in an instance."""
-        resp, body = self.get('/'.join(['servers', server_id,
-                              'os-virtual-interfaces']))
-        body = json.loads(body)
-        self.validate_response(schema.list_virtual_interfaces, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def rescue_server(self, server_id, **kwargs):
-        """Rescue the provided server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#rescue
-        """
-        return self.action(server_id, 'rescue', schema.rescue_server, **kwargs)
-
-    def unrescue_server(self, server_id):
-        """Unrescue the provided server."""
-        return self.action(server_id, 'unrescue')
-
-    def show_server_diagnostics(self, server_id):
-        """Get the usage data for a server."""
-        resp, body = self.get("servers/%s/diagnostics" % server_id)
-        return service_client.ResponseBody(resp, json.loads(body))
-
-    def list_instance_actions(self, server_id):
-        """List the provided server action."""
-        resp, body = self.get("servers/%s/os-instance-actions" %
-                              server_id)
-        body = json.loads(body)
-        self.validate_response(schema.list_instance_actions, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_instance_action(self, server_id, request_id):
-        """Returns the action details of the provided server."""
-        resp, body = self.get("servers/%s/os-instance-actions/%s" %
-                              (server_id, request_id))
-        body = json.loads(body)
-        self.validate_response(schema.show_instance_action, resp, body)
-        return service_client.ResponseBody(resp, body)
-
-    def force_delete_server(self, server_id, **kwargs):
-        """Force delete a server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#forceDelete
-        """
-        return self.action(server_id, 'forceDelete', **kwargs)
-
-    def restore_soft_deleted_server(self, server_id, **kwargs):
-        """Restore a soft-deleted server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#restore
-        """
-        return self.action(server_id, 'restore', **kwargs)
-
-    def reset_network(self, server_id, **kwargs):
-        """Reset the Network of a server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#resetNetwork
-        """
-        return self.action(server_id, 'resetNetwork', **kwargs)
-
-    def inject_network_info(self, server_id, **kwargs):
-        """Inject the Network Info into server.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#injectNetworkInfo
-        """
-        return self.action(server_id, 'injectNetworkInfo', **kwargs)
-
-    def get_vnc_console(self, server_id, **kwargs):
-        """Get URL of VNC console.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#getVNCConsole
-        """
-        return self.action(server_id, "os-getVNCConsole",
-                           schema.get_vnc_console, **kwargs)
-
-    def add_fixed_ip(self, server_id, **kwargs):
-        """Add a fixed IP to server instance.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#addFixedIp
-        """
-        return self.action(server_id, 'addFixedIp', **kwargs)
-
-    def remove_fixed_ip(self, server_id, **kwargs):
-        """Remove input fixed IP from input server instance.
-
-        Available params: http://developer.openstack.org/
-                          api-ref-compute-v2.1.html#removeFixedIp
-        """
-        return self.action(server_id, 'removeFixedIp', **kwargs)
diff --git a/tempest/services/identity/v2/json/identity_client.py b/tempest/services/identity/v2/json/identity_client.py
index f80e22d..ff6c838 100644
--- a/tempest/services/identity/v2/json/identity_client.py
+++ b/tempest/services/identity/v2/json/identity_client.py
@@ -26,60 +26,6 @@
         body = json.loads(body)
         return service_client.ResponseBody(resp, body)
 
-    def create_role(self, name):
-        """Create a role."""
-        post_body = {
-            'name': name,
-        }
-        post_body = json.dumps({'role': post_body})
-        resp, body = self.post('OS-KSADM/roles', post_body)
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def show_role(self, role_id):
-        """Get a role by its id."""
-        resp, body = self.get('OS-KSADM/roles/%s' % role_id)
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_role(self, role_id):
-        """Delete a role."""
-        resp, body = self.delete('OS-KSADM/roles/%s' % str(role_id))
-        self.expected_success(204, resp.status)
-        return resp, body
-
-    def list_user_roles(self, tenant_id, user_id):
-        """Returns a list of roles assigned to a user for a tenant."""
-        url = '/tenants/%s/users/%s/roles' % (tenant_id, user_id)
-        resp, body = self.get(url)
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def assign_user_role(self, tenant_id, user_id, role_id):
-        """Add roles to a user on a tenant."""
-        resp, body = self.put('/tenants/%s/users/%s/roles/OS-KSADM/%s' %
-                              (tenant_id, user_id, role_id), "")
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_user_role(self, tenant_id, user_id, role_id):
-        """Removes a role assignment for a user on a tenant."""
-        resp, body = self.delete('/tenants/%s/users/%s/roles/OS-KSADM/%s' %
-                                 (tenant_id, user_id, role_id))
-        self.expected_success(204, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def list_roles(self):
-        """Returns roles."""
-        resp, body = self.get('OS-KSADM/roles')
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return service_client.ResponseBody(resp, body)
-
     def create_user(self, name, password, tenant_id, email, **kwargs):
         """Create a user."""
         post_body = {
@@ -125,12 +71,17 @@
         body = json.loads(body)
         return service_client.ResponseBody(resp, body)
 
-    def enable_disable_user(self, user_id, enabled):
-        """Enables or disables a user."""
-        put_body = {
-            'enabled': enabled
-        }
-        put_body = json.dumps({'user': put_body})
+    def enable_disable_user(self, user_id, **kwargs):
+        """Enables or disables a user.
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-identity-v2-ext.html#enableUser
+        """
+        # NOTE: The URL (users/<id>/enabled) is different from the api-site
+        # one (users/<id>/OS-KSADM/enabled) , but they are the same API
+        # because of the fact that in keystone/contrib/admin_crud/core.py
+        # both api use same action='set_user_enabled'
+        put_body = json.dumps({'user': kwargs})
         resp, body = self.put('users/%s/enabled' % user_id, put_body)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -213,25 +164,28 @@
         self.expected_success(204, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def update_user_password(self, user_id, new_pass):
+    def update_user_password(self, user_id, **kwargs):
         """Update User Password."""
-        put_body = {
-            'password': new_pass,
-            'id': user_id
-        }
-        put_body = json.dumps({'user': put_body})
+        # TODO(piyush): Current api-site doesn't contain this API description.
+        # After fixing the api-site, we need to fix here also for putting the
+        # link to api-site.
+        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1524147
+        put_body = json.dumps({'user': kwargs})
         resp, body = self.put('users/%s/OS-KSADM/password' % user_id, put_body)
         self.expected_success(200, resp.status)
         body = json.loads(body)
         return service_client.ResponseBody(resp, body)
 
-    def update_user_own_password(self, user_id, new_pass, old_pass):
+    def update_user_own_password(self, user_id, **kwargs):
         """User updates own password"""
-        patch_body = {
-            "password": new_pass,
-            "original_password": old_pass
-        }
-        patch_body = json.dumps({'user': patch_body})
+        # TODO(piyush): Current api-site doesn't contain this API description.
+        # After fixing the api-site, we need to fix here also for putting the
+        # link to api-site.
+        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1524153
+        # NOTE: This API is used for updating user password by itself.
+        # Ref: http://lists.openstack.org/pipermail/openstack-dev/2015-December
+        #      /081803.html
+        patch_body = json.dumps({'user': kwargs})
         resp, body = self.patch('OS-KSCRUD/users/%s' % user_id, patch_body)
         self.expected_success(200, resp.status)
         body = json.loads(body)
diff --git a/tempest/services/identity/v2/json/roles_client.py b/tempest/services/identity/v2/json/roles_client.py
new file mode 100644
index 0000000..ef6dfe9
--- /dev/null
+++ b/tempest/services/identity/v2/json/roles_client.py
@@ -0,0 +1,74 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from oslo_serialization import jsonutils as json
+
+from tempest.common import service_client
+
+
+class RolesClient(service_client.ServiceClient):
+    api_version = "v2.0"
+
+    def create_role(self, **kwargs):
+        """Create a role.
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-identity-v2-ext.html#createRole
+        """
+        post_body = json.dumps({'role': kwargs})
+        resp, body = self.post('OS-KSADM/roles', post_body)
+        self.expected_success(200, resp.status)
+        body = json.loads(body)
+        return service_client.ResponseBody(resp, body)
+
+    def show_role(self, role_id):
+        """Get a role by its id."""
+        resp, body = self.get('OS-KSADM/roles/%s' % role_id)
+        self.expected_success(200, resp.status)
+        body = json.loads(body)
+        return service_client.ResponseBody(resp, body)
+
+    def delete_role(self, role_id):
+        """Delete a role."""
+        resp, body = self.delete('OS-KSADM/roles/%s' % str(role_id))
+        self.expected_success(204, resp.status)
+        return resp, body
+
+    def list_user_roles(self, tenant_id, user_id):
+        """Returns a list of roles assigned to a user for a tenant."""
+        url = '/tenants/%s/users/%s/roles' % (tenant_id, user_id)
+        resp, body = self.get(url)
+        self.expected_success(200, resp.status)
+        body = json.loads(body)
+        return service_client.ResponseBody(resp, body)
+
+    def assign_user_role(self, tenant_id, user_id, role_id):
+        """Add roles to a user on a tenant."""
+        resp, body = self.put('/tenants/%s/users/%s/roles/OS-KSADM/%s' %
+                              (tenant_id, user_id, role_id), "")
+        self.expected_success(200, resp.status)
+        body = json.loads(body)
+        return service_client.ResponseBody(resp, body)
+
+    def delete_user_role(self, tenant_id, user_id, role_id):
+        """Removes a role assignment for a user on a tenant."""
+        resp, body = self.delete('/tenants/%s/users/%s/roles/OS-KSADM/%s' %
+                                 (tenant_id, user_id, role_id))
+        self.expected_success(204, resp.status)
+        return service_client.ResponseBody(resp, body)
+
+    def list_roles(self):
+        """Returns roles."""
+        resp, body = self.get('OS-KSADM/roles')
+        self.expected_success(200, resp.status)
+        body = json.loads(body)
+        return service_client.ResponseBody(resp, body)
diff --git a/tempest/services/identity/v3/json/identity_client.py b/tempest/services/identity/v3/json/identity_client.py
index 972db99..ab8ba2a 100644
--- a/tempest/services/identity/v3/json/identity_client.py
+++ b/tempest/services/identity/v3/json/identity_client.py
@@ -180,12 +180,13 @@
         self.expected_success(204, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def create_role(self, name):
-        """Create a Role."""
-        post_body = {
-            'name': name
-        }
-        post_body = json.dumps({'role': post_body})
+    def create_role(self, **kwargs):
+        """Create a Role.
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-identity-v3.html#createRole
+        """
+        post_body = json.dumps({'role': kwargs})
         resp, body = self.post('roles', post_body)
         self.expected_success(201, resp.status)
         body = json.loads(body)
@@ -205,12 +206,13 @@
         body = json.loads(body)
         return service_client.ResponseBody(resp, body)
 
-    def update_role(self, name, role_id):
-        """Create a Role."""
-        post_body = {
-            'name': name
-        }
-        post_body = json.dumps({'role': post_body})
+    def update_role(self, role_id, **kwargs):
+        """Update a Role.
+
+        Available params: see http://developer.openstack.org/
+                          api-ref-identity-v3.html#updateRole
+        """
+        post_body = json.dumps({'role': kwargs})
         resp, body = self.patch('roles/%s' % str(role_id), post_body)
         self.expected_success(200, resp.status)
         body = json.loads(body)
diff --git a/tempest/services/identity/v3/json/policy_client.py b/tempest/services/identity/v3/json/policies_client.py
similarity index 97%
rename from tempest/services/identity/v3/json/policy_client.py
rename to tempest/services/identity/v3/json/policies_client.py
index 7927ed5..639ed6d 100644
--- a/tempest/services/identity/v3/json/policy_client.py
+++ b/tempest/services/identity/v3/json/policies_client.py
@@ -22,7 +22,7 @@
 from tempest.common import service_client
 
 
-class PolicyClient(service_client.ServiceClient):
+class PoliciesClient(service_client.ServiceClient):
     api_version = "v3"
 
     def create_policy(self, **kwargs):
diff --git a/tempest/services/identity/v3/json/region_client.py b/tempest/services/identity/v3/json/regions_client.py
similarity index 98%
rename from tempest/services/identity/v3/json/region_client.py
rename to tempest/services/identity/v3/json/regions_client.py
index 3595391..bc4b7a1 100644
--- a/tempest/services/identity/v3/json/region_client.py
+++ b/tempest/services/identity/v3/json/regions_client.py
@@ -23,7 +23,7 @@
 from tempest.common import service_client
 
 
-class RegionClient(service_client.ServiceClient):
+class RegionsClient(service_client.ServiceClient):
     api_version = "v3"
 
     def create_region(self, region_id=None, **kwargs):
diff --git a/tempest/services/identity/v3/json/service_client.py b/tempest/services/identity/v3/json/services_client.py
similarity index 97%
rename from tempest/services/identity/v3/json/service_client.py
rename to tempest/services/identity/v3/json/services_client.py
index 3dbfe5e..dd65f1d 100644
--- a/tempest/services/identity/v3/json/service_client.py
+++ b/tempest/services/identity/v3/json/services_client.py
@@ -22,7 +22,7 @@
 from tempest.common import service_client
 
 
-class ServiceClient(service_client.ServiceClient):
+class ServicesClient(service_client.ServiceClient):
     api_version = "v3"
 
     def update_service(self, service_id, **kwargs):
diff --git a/tempest/services/image/v2/json/images_client.py b/tempest/services/image/v2/json/images_client.py
index 44062ea..72b203a 100644
--- a/tempest/services/image/v2/json/images_client.py
+++ b/tempest/services/image/v2/json/images_client.py
@@ -55,6 +55,11 @@
         return self._http
 
     def update_image(self, image_id, patch):
+        """Update an image.
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-image-v2.html#updateImage-v2
+        """
         data = json.dumps(patch)
         headers = {"Content-Type": "application/openstack-images-v2.0"
                                    "-json-patch"}
@@ -63,21 +68,13 @@
         body = json.loads(body)
         return service_client.ResponseBody(resp, body)
 
-    def create_image(self, name, container_format, disk_format, **kwargs):
-        params = {
-            "name": name,
-            "container_format": container_format,
-            "disk_format": disk_format,
-        }
+    def create_image(self, **kwargs):
+        """Create an image.
 
-        for option in kwargs:
-            value = kwargs.get(option)
-            if isinstance(value, dict) or isinstance(value, tuple):
-                params.update(value)
-            else:
-                params[option] = value
-
-        data = json.dumps(params)
+        Available params: see http://developer.openstack.org/
+                              api-ref-image-v2.html#createImage-v2
+        """
+        data = json.dumps(kwargs)
         resp, body = self.post('v2/images', data)
         self.expected_success(201, resp.status)
         body = json.loads(body)
diff --git a/tempest/services/network/json/agents_client.py b/tempest/services/network/json/agents_client.py
new file mode 100644
index 0000000..07f93b2
--- /dev/null
+++ b/tempest/services/network/json/agents_client.py
@@ -0,0 +1,68 @@
+# Copyright 2015 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.services.network.json import base
+
+
+class AgentsClient(base.BaseNetworkClient):
+
+    def update_agent(self, agent_id, **kwargs):
+        """Update agent."""
+        # TODO(piyush): Current api-site doesn't contain this API description.
+        # After fixing the api-site, we need to fix here also for putting the
+        # link to api-site.
+        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1526673
+        uri = '/agents/%s' % agent_id
+        return self.update_resource(uri, kwargs)
+
+    def show_agent(self, agent_id, **fields):
+        uri = '/agents/%s' % agent_id
+        return self.show_resource(uri, **fields)
+
+    def list_agents(self, **filters):
+        uri = '/agents'
+        return self.list_resources(uri, **filters)
+
+    def list_routers_on_l3_agent(self, agent_id):
+        uri = '/agents/%s/l3-routers' % agent_id
+        return self.list_resources(uri)
+
+    def add_router_to_l3_agent(self, agent_id, **kwargs):
+        # TODO(piyush): Current api-site doesn't contain this API description.
+        # After fixing the api-site, we need to fix here also for putting the
+        # link to api-site.
+        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1526670
+        uri = '/agents/%s/l3-routers' % agent_id
+        return self.create_resource(uri, kwargs)
+
+    def remove_router_from_l3_agent(self, agent_id, router_id):
+        uri = '/agents/%s/l3-routers/%s' % (agent_id, router_id)
+        return self.delete_resource(uri)
+
+    def list_networks_hosted_by_one_dhcp_agent(self, agent_id):
+        uri = '/agents/%s/dhcp-networks' % agent_id
+        return self.list_resources(uri)
+
+    def remove_network_from_dhcp_agent(self, agent_id, network_id):
+        uri = '/agents/%s/dhcp-networks/%s' % (agent_id,
+                                               network_id)
+        return self.delete_resource(uri)
+
+    def add_dhcp_agent_to_network(self, agent_id, **kwargs):
+        # TODO(piyush): Current api-site doesn't contain this API description.
+        # After fixing the api-site, we need to fix here also for putting the
+        # link to api-site.
+        # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1526212
+        uri = '/agents/%s/dhcp-networks' % agent_id
+        return self.create_resource(uri, kwargs)
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index 459891f..e8e21d2 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -35,28 +35,6 @@
     quotas
     """
 
-    def create_security_group(self, **kwargs):
-        uri = '/security-groups'
-        post_data = {'security_group': kwargs}
-        return self.create_resource(uri, post_data)
-
-    def update_security_group(self, security_group_id, **kwargs):
-        uri = '/security-groups/%s' % security_group_id
-        post_data = {'security_group': kwargs}
-        return self.update_resource(uri, post_data)
-
-    def show_security_group(self, security_group_id, **fields):
-        uri = '/security-groups/%s' % security_group_id
-        return self.show_resource(uri, **fields)
-
-    def delete_security_group(self, security_group_id):
-        uri = '/security-groups/%s' % security_group_id
-        return self.delete_resource(uri)
-
-    def list_security_groups(self, **filters):
-        uri = '/security-groups'
-        return self.list_resources(uri, **filters)
-
     def create_security_group_rule(self, **kwargs):
         uri = '/security-group-rules'
         post_data = {'security_group_rule': kwargs}
@@ -82,21 +60,32 @@
         uri = '/extensions'
         return self.list_resources(uri, **filters)
 
-    def create_bulk_network(self, names):
-        network_list = [{'name': name} for name in names]
-        post_data = {'networks': network_list}
+    def create_bulk_network(self, **kwargs):
+        """create bulk network
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-networking-v2.html#bulkCreateNetwork
+        """
         uri = '/networks'
-        return self.create_resource(uri, post_data)
+        return self.create_resource(uri, kwargs)
 
-    def create_bulk_subnet(self, subnet_list):
-        post_data = {'subnets': subnet_list}
+    def create_bulk_subnet(self, **kwargs):
+        """create bulk subnet
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-networking-v2.html#bulkCreateSubnet
+        """
         uri = '/subnets'
-        return self.create_resource(uri, post_data)
+        return self.create_resource(uri, kwargs)
 
-    def create_bulk_port(self, port_list):
-        post_data = {'ports': port_list}
+    def create_bulk_port(self, **kwargs):
+        """create bulk port
+
+        Available params: see http://developer.openstack.org/
+                              api-ref-networking-v2.html#bulkCreatePorts
+        """
         uri = '/ports'
-        return self.create_resource(uri, post_data)
+        return self.create_resource(uri, kwargs)
 
     def wait_for_resource_deletion(self, resource_type, id, client=None):
         """Waits for a resource to be deleted."""
@@ -240,63 +229,22 @@
         uri = '/ports?device_id=%s' % uuid
         return self.list_resources(uri)
 
-    def update_agent(self, agent_id, agent_info):
-        """Update agent
-
-        :param agent_info: Agent update information.
-        E.g {"admin_state_up": True}
-        """
-        uri = '/agents/%s' % agent_id
-        agent = {"agent": agent_info}
-        return self.update_resource(uri, agent)
-
-    def show_agent(self, agent_id, **fields):
-        uri = '/agents/%s' % agent_id
-        return self.show_resource(uri, **fields)
-
-    def list_agents(self, **filters):
-        uri = '/agents'
-        return self.list_resources(uri, **filters)
-
-    def list_routers_on_l3_agent(self, agent_id):
-        uri = '/agents/%s/l3-routers' % agent_id
-        return self.list_resources(uri)
-
     def list_l3_agents_hosting_router(self, router_id):
         uri = '/routers/%s/l3-agents' % router_id
         return self.list_resources(uri)
 
-    def add_router_to_l3_agent(self, agent_id, **kwargs):
-        # TODO(piyush): Current api-site doesn't contain this API description.
-        # After fixing the api-site, we need to fix here also for putting the
-        # link to api-site.
-        uri = '/agents/%s/l3-routers' % agent_id
-        return self.create_resource(uri, kwargs)
-
-    def remove_router_from_l3_agent(self, agent_id, router_id):
-        uri = '/agents/%s/l3-routers/%s' % (agent_id, router_id)
-        return self.delete_resource(uri)
-
     def list_dhcp_agent_hosting_network(self, network_id):
         uri = '/networks/%s/dhcp-agents' % network_id
         return self.list_resources(uri)
 
-    def list_networks_hosted_by_one_dhcp_agent(self, agent_id):
-        uri = '/agents/%s/dhcp-networks' % agent_id
-        return self.list_resources(uri)
+    def update_extra_routes(self, router_id, **kwargs):
+        """Update Extra routes.
 
-    def remove_network_from_dhcp_agent(self, agent_id, network_id):
-        uri = '/agents/%s/dhcp-networks/%s' % (agent_id,
-                                               network_id)
-        return self.delete_resource(uri)
-
-    def update_extra_routes(self, router_id, routes):
+        Available params: see http://developer.openstack.org/
+                              api-ref-networking-v2-ext.html#updateExtraRoutes
+        """
         uri = '/routers/%s' % router_id
-        put_body = {
-            'router': {
-                'routes': routes
-            }
-        }
+        put_body = {'router': kwargs}
         return self.update_resource(uri, put_body)
 
     def delete_extra_routes(self, router_id):
@@ -307,30 +255,3 @@
             }
         }
         return self.update_resource(uri, put_body)
-
-    def add_dhcp_agent_to_network(self, agent_id, network_id):
-        post_body = {'network_id': network_id}
-        uri = '/agents/%s/dhcp-networks' % agent_id
-        return self.create_resource(uri, post_body)
-
-    def list_subnetpools(self, **filters):
-        uri = '/subnetpools'
-        return self.list_resources(uri, **filters)
-
-    def create_subnetpools(self, **kwargs):
-        uri = '/subnetpools'
-        post_data = {'subnetpool': kwargs}
-        return self.create_resource(uri, post_data)
-
-    def show_subnetpools(self, subnetpool_id, **fields):
-        uri = '/subnetpools/%s' % subnetpool_id
-        return self.show_resource(uri, **fields)
-
-    def update_subnetpools(self, subnetpool_id, **kwargs):
-        uri = '/subnetpools/%s' % subnetpool_id
-        post_data = {'subnetpool': kwargs}
-        return self.update_resource(uri, post_data)
-
-    def delete_subnetpools(self, subnetpool_id):
-        uri = '/subnetpools/%s' % subnetpool_id
-        return self.delete_resource(uri)
diff --git a/tempest/services/network/json/security_groups_client.py b/tempest/services/network/json/security_groups_client.py
new file mode 100644
index 0000000..a60d2a6
--- /dev/null
+++ b/tempest/services/network/json/security_groups_client.py
@@ -0,0 +1,38 @@
+#    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.services.network.json import base
+
+
+class SecurityGroupsClient(base.BaseNetworkClient):
+
+    def create_security_group(self, **kwargs):
+        uri = '/security-groups'
+        post_data = {'security_group': kwargs}
+        return self.create_resource(uri, post_data)
+
+    def update_security_group(self, security_group_id, **kwargs):
+        uri = '/security-groups/%s' % security_group_id
+        post_data = {'security_group': kwargs}
+        return self.update_resource(uri, post_data)
+
+    def show_security_group(self, security_group_id, **fields):
+        uri = '/security-groups/%s' % security_group_id
+        return self.show_resource(uri, **fields)
+
+    def delete_security_group(self, security_group_id):
+        uri = '/security-groups/%s' % security_group_id
+        return self.delete_resource(uri)
+
+    def list_security_groups(self, **filters):
+        uri = '/security-groups'
+        return self.list_resources(uri, **filters)
diff --git a/tempest/services/network/json/subnetpools_client.py b/tempest/services/network/json/subnetpools_client.py
new file mode 100644
index 0000000..b5aec47
--- /dev/null
+++ b/tempest/services/network/json/subnetpools_client.py
@@ -0,0 +1,40 @@
+# Copyright 2015 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.services.network.json import base
+
+
+class SubnetpoolsClient(base.BaseNetworkClient):
+
+    def list_subnetpools(self, **filters):
+        uri = '/subnetpools'
+        return self.list_resources(uri, **filters)
+
+    def create_subnetpools(self, **kwargs):
+        uri = '/subnetpools'
+        post_data = {'subnetpool': kwargs}
+        return self.create_resource(uri, post_data)
+
+    def show_subnetpools(self, subnetpool_id, **fields):
+        uri = '/subnetpools/%s' % subnetpool_id
+        return self.show_resource(uri, **fields)
+
+    def update_subnetpools(self, subnetpool_id, **kwargs):
+        uri = '/subnetpools/%s' % subnetpool_id
+        post_data = {'subnetpool': kwargs}
+        return self.update_resource(uri, post_data)
+
+    def delete_subnetpools(self, subnetpool_id):
+        uri = '/subnetpools/%s' % subnetpool_id
+        return self.delete_resource(uri)
diff --git a/tempest/services/volume/base/admin/base_types_client.py b/tempest/services/volume/base/admin/base_types_client.py
index de6ea8a..867273e 100644
--- a/tempest/services/volume/base/admin/base_types_client.py
+++ b/tempest/services/volume/base/admin/base_types_client.py
@@ -47,10 +47,10 @@
         """Returns the primary type of resource this client works with."""
         return 'volume-type/encryption-type'
 
-    def list_volume_types(self, params=None):
+    def list_volume_types(self, **params):
         """List all the volume_types created."""
         url = 'types'
-        if params is not None:
+        if params:
             url += '?%s' % urllib.urlencode(params)
 
         resp, body = self.get(url)
@@ -66,19 +66,13 @@
         self.expected_success(200, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def create_volume_type(self, name, **kwargs):
-        """Creates a new Volume_type.
+    def create_volume_type(self, **kwargs):
+        """Create volume type.
 
-        name(Required): Name of volume_type.
-        Following optional keyword arguments are accepted:
-        extra_specs: A dictionary of values to be used as extra_specs.
+        Available params: see http://developer.openstack.org/
+                              api-ref-blockstorage-v2.html#createVolumeType
         """
-        post_body = {
-            'name': name,
-            'extra_specs': kwargs.get('extra_specs'),
-        }
-
-        post_body = json.dumps({'volume_type': post_body})
+        post_body = json.dumps({'volume_type': kwargs})
         resp, body = self.post('types', post_body)
         body = json.loads(body)
         self.expected_success(200, resp.status)
@@ -90,10 +84,17 @@
         self.expected_success(202, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def list_volume_types_extra_specs(self, vol_type_id, params=None):
-        """List all the volume_types extra specs created."""
+    def list_volume_types_extra_specs(self, vol_type_id, **params):
+        """List all the volume_types extra specs created.
+
+        TODO: Current api-site doesn't contain this API description.
+        After fixing the api-site, we need to fix here also for putting
+        the link to api-site.
+
+
+        """
         url = 'types/%s/extra_specs' % str(vol_type_id)
-        if params is not None:
+        if params:
             url += '?%s' % urllib.urlencode(params)
 
         resp, body = self.get(url)
@@ -101,23 +102,23 @@
         self.expected_success(200, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def show_volume_type_extra_specs(self, vol_type_id, extra_spec_name):
+    def show_volume_type_extra_specs(self, vol_type_id, extra_specs_name):
         """Returns the details of a single volume_type extra spec."""
         url = "types/%s/extra_specs/%s" % (str(vol_type_id),
-                                           str(extra_spec_name))
+                                           str(extra_specs_name))
         resp, body = self.get(url)
         body = json.loads(body)
         self.expected_success(200, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def create_volume_type_extra_specs(self, vol_type_id, extra_spec):
+    def create_volume_type_extra_specs(self, vol_type_id, extra_specs):
         """Creates a new Volume_type extra spec.
 
         vol_type_id: Id of volume_type.
         extra_specs: A dictionary of values to be used as extra_specs.
         """
         url = "types/%s/extra_specs" % str(vol_type_id)
-        post_body = json.dumps({'extra_specs': extra_spec})
+        post_body = json.dumps({'extra_specs': extra_specs})
         resp, body = self.post(url, post_body)
         body = json.loads(body)
         self.expected_success(200, resp.status)
@@ -131,7 +132,7 @@
         return service_client.ResponseBody(resp, body)
 
     def update_volume_type_extra_specs(self, vol_type_id, extra_spec_name,
-                                       extra_spec):
+                                       extra_specs):
         """Update a volume_type extra spec.
 
         vol_type_id: Id of volume_type.
@@ -141,7 +142,7 @@
         """
         url = "types/%s/extra_specs/%s" % (str(vol_type_id),
                                            str(extra_spec_name))
-        put_body = json.dumps(extra_spec)
+        put_body = json.dumps(extra_specs)
         resp, body = self.put(url, put_body)
         body = json.loads(body)
         self.expected_success(200, resp.status)
@@ -159,18 +160,14 @@
         return service_client.ResponseBody(resp, body)
 
     def create_encryption_type(self, vol_type_id, **kwargs):
-        """Create a new encryption type for the specified volume type.
+        """Create encryption type.
 
-        vol_type_id: Id of volume_type.
-        provider: Class providing encryption support.
-        cipher: Encryption algorithm/mode to use.
-        key_size: Size of the encryption key, in bits.
-        control_location: Notional service where encryption is performed.
+        TODO: Current api-site doesn't contain this API description.
+        After fixing the api-site, we need to fix here also for putting
+        the link to api-site.
         """
         url = "/types/%s/encryption" % str(vol_type_id)
-        post_body = {}
-        post_body.update(kwargs)
-        post_body = json.dumps({'encryption': post_body})
+        post_body = json.dumps({'encryption': kwargs})
         resp, body = self.post(url, post_body)
         body = json.loads(body)
         self.expected_success(200, resp.status)
diff --git a/tempest/services/volume/base/base_qos_client.py b/tempest/services/volume/base/base_qos_client.py
index c7f6c6e..697e902 100644
--- a/tempest/services/volume/base/base_qos_client.py
+++ b/tempest/services/volume/base/base_qos_client.py
@@ -67,15 +67,13 @@
                 raise exceptions.TimeoutException
             time.sleep(self.build_interval)
 
-    def create_qos(self, name, consumer, **kwargs):
+    def create_qos(self, **kwargs):
         """Create a QoS Specification.
 
-        name : name of the QoS specifications
-        consumer : conumer of Qos ( front-end / back-end / both )
+        Available params: see http://developer.openstack.org/
+                              api-ref-blockstorage-v2.html#createQoSSpec
         """
-        post_body = {'name': name, 'consumer': consumer}
-        post_body.update(kwargs)
-        post_body = json.dumps({'qos_specs': post_body})
+        post_body = json.dumps({'qos_specs': kwargs})
         resp, body = self.post('qos-specs', post_body)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -107,7 +105,8 @@
     def set_qos_key(self, qos_id, **kwargs):
         """Set the specified keys/values of QoS specification.
 
-        kwargs : it is the dictionary of the key=value pairs to set
+        Available params: see http://developer.openstack.org/
+                              api-ref-blockstorage-v2.html#setQoSKey
         """
         put_body = json.dumps({"qos_specs": kwargs})
         resp, body = self.put('qos-specs/%s' % qos_id, put_body)
@@ -118,7 +117,9 @@
     def unset_qos_key(self, qos_id, keys):
         """Unset the specified keys of QoS specification.
 
-        keys : it is the array of the keys to unset
+        :param keys: keys to delete from the QoS specification.
+
+        TODO(jordanP): Add a link once LP #1524877 is fixed.
         """
         put_body = json.dumps({'keys': keys})
         resp, body = self.put('qos-specs/%s/delete_keys' % qos_id, put_body)
diff --git a/tempest/stress/actions/volume_attach_verify.py b/tempest/stress/actions/volume_attach_verify.py
index 2a23291..8bbbfc4 100644
--- a/tempest/stress/actions/volume_attach_verify.py
+++ b/tempest/stress/actions/volume_attach_verify.py
@@ -161,7 +161,7 @@
         self._create_sec_group()
         self._create_keypair()
         private_key = self.key['private_key']
-        username = CONF.compute.image_ssh_user
+        username = CONF.validation.image_ssh_user
         self.remote_client = remote_client.RemoteClient(self.floating['ip'],
                                                         username,
                                                         pkey=private_key)
diff --git a/tempest/stress/driver.py b/tempest/stress/driver.py
index cac848b..4dcaab7 100644
--- a/tempest/stress/driver.py
+++ b/tempest/stress/driver.py
@@ -147,11 +147,13 @@
                 if CONF.identity.auth_version == 'v2':
                     identity_client = admin_manager.identity_client
                     projects_client = admin_manager.tenants_client
+                    roles_client = admin_manager.roles_client
                 else:
                     identity_client = admin_manager.identity_v3_client
                     projects_client = None
+                    roles_client = None
                 credentials_client = cred_client.get_creds_client(
-                    identity_client, projects_client)
+                    identity_client, projects_client, roles_client)
                 project = credentials_client.create_project(
                     name=tenant_name, description=tenant_name)
                 user = credentials_client.create_user(username, password,
@@ -237,14 +239,13 @@
             had_errors = True
         sum_runs += process['statistic']['runs']
         sum_fails += process['statistic']['fails']
-        LOG.info(" Process %d (%s): Run %d actions (%d failed)" %
-                 (process['p_number'],
-                  process['action'],
-                  process['statistic']['runs'],
-                     process['statistic']['fails']))
-    LOG.info("Summary:")
-    LOG.info("Run %d actions (%d failed)" %
-             (sum_runs, sum_fails))
+        print ("Process %d (%s): Run %d actions (%d failed)" % (
+               process['p_number'],
+               process['action'],
+               process['statistic']['runs'],
+               process['statistic']['fails']))
+    print ("Summary:")
+    print ("Run %d actions (%d failed)" % (sum_runs, sum_fails))
 
     if not had_errors and CONF.stress.full_clean_stack:
         LOG.info("cleaning up")
diff --git a/tempest/test.py b/tempest/test.py
index 8e961f4..407df3b 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -437,9 +437,11 @@
         if CONF.identity.auth_version == 'v2':
             client = self.os_admin.identity_client
             project_client = self.os_admin.tenants_client
+            roles_client = self.os_admin.roles_client
         else:
             client = self.os_admin.identity_v3_client
             project_client = None
+            roles_client = None
 
         try:
             domain = client.auth_provider.credentials.project_domain_name
@@ -447,6 +449,7 @@
             domain = 'Default'
 
         return cred_client.get_creds_client(client, project_client,
+                                            roles_client,
                                             project_domain_name=domain)
 
     @classmethod
diff --git a/tempest/test_discover/test_discover.py b/tempest/test_discover/test_discover.py
index dac7d91..330f370 100644
--- a/tempest/test_discover/test_discover.py
+++ b/tempest/test_discover/test_discover.py
@@ -30,8 +30,7 @@
     base_path = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
     base_path = os.path.split(base_path)[0]
     # Load local tempest tests
-    for test_dir in ['tempest/api', 'tempest/scenario',
-                     'tempest/thirdparty']:
+    for test_dir in ['tempest/api', 'tempest/scenario']:
         full_test_dir = os.path.join(base_path, test_dir)
         if not pattern:
             suite.addTests(loader.discover(full_test_dir,
diff --git a/tempest/tests/common/test_dynamic_creds.py b/tempest/tests/common/test_dynamic_creds.py
index 10acd14..a55e556 100644
--- a/tempest/tests/common/test_dynamic_creds.py
+++ b/tempest/tests/common/test_dynamic_creds.py
@@ -24,6 +24,8 @@
 from tempest import exceptions
 from tempest.services.identity.v2.json import identity_client as \
     json_iden_client
+from tempest.services.identity.v2.json import roles_client as \
+    json_roles_client
 from tempest.services.identity.v2.json import tenants_client as \
     json_tenants_client
 from tempest.services.network.json import network_client as json_network_client
@@ -84,7 +86,7 @@
 
     def _mock_list_roles(self, id, name):
         roles_fix = self.useFixture(mockpatch.PatchObject(
-            json_iden_client.IdentityClient,
+            json_roles_client.RolesClient,
             'list_roles',
             return_value=(service_client.ResponseBody
                           (200,
@@ -95,7 +97,7 @@
 
     def _mock_list_2_roles(self):
         roles_fix = self.useFixture(mockpatch.PatchObject(
-            json_iden_client.IdentityClient,
+            json_roles_client.RolesClient,
             'list_roles',
             return_value=(service_client.ResponseBody
                           (200,
@@ -106,7 +108,7 @@
 
     def _mock_assign_user_role(self):
         tenant_fix = self.useFixture(mockpatch.PatchObject(
-            json_iden_client.IdentityClient,
+            json_roles_client.RolesClient,
             'assign_user_role',
             return_value=(service_client.ResponseBody
                           (200, {}))))
@@ -114,7 +116,7 @@
 
     def _mock_list_role(self):
         roles_fix = self.useFixture(mockpatch.PatchObject(
-            json_iden_client.IdentityClient,
+            json_roles_client.RolesClient,
             'list_roles',
             return_value=(service_client.ResponseBody
                           (200, {'roles': [{'id': '1',
@@ -178,11 +180,11 @@
         self._mock_user_create('1234', 'fake_admin_user')
         self._mock_tenant_create('1234', 'fake_admin_tenant')
 
-        user_mock = mock.patch.object(json_iden_client.IdentityClient,
+        user_mock = mock.patch.object(json_roles_client.RolesClient,
                                       'assign_user_role')
         user_mock.start()
         self.addCleanup(user_mock.stop)
-        with mock.patch.object(json_iden_client.IdentityClient,
+        with mock.patch.object(json_roles_client.RolesClient,
                                'assign_user_role') as user_mock:
             admin_creds = creds.get_admin_creds()
         user_mock.assert_has_calls([
@@ -201,11 +203,11 @@
         self._mock_user_create('1234', 'fake_role_user')
         self._mock_tenant_create('1234', 'fake_role_tenant')
 
-        user_mock = mock.patch.object(json_iden_client.IdentityClient,
+        user_mock = mock.patch.object(json_roles_client.RolesClient,
                                       'assign_user_role')
         user_mock.start()
         self.addCleanup(user_mock.stop)
-        with mock.patch.object(json_iden_client.IdentityClient,
+        with mock.patch.object(json_roles_client.RolesClient,
                                'assign_user_role') as user_mock:
             role_creds = creds.get_creds_by_roles(
                 roles=['role1', 'role2'])
@@ -394,15 +396,15 @@
 
         port_list_mock.start()
         secgroup_list_mock = mock.patch.object(
-            creds.network_admin_client,
+            creds.security_groups_admin_client,
             'list_security_groups',
             side_effect=side_effect)
         secgroup_list_mock.start()
 
         return_values = (fake_http.fake_httplib({}, status=204), {})
         remove_secgroup_mock = self.patch(
-            'tempest.services.network.json.network_client.'
-            'NetworkClient.delete', return_value=return_values)
+            'tempest.services.network.json.security_groups_client.'
+            'SecurityGroupsClient.delete', return_value=return_values)
         creds.clear_creds()
         # Verify default security group delete
         calls = remove_secgroup_mock.mock_calls
diff --git a/tempest/tests/common/test_service_clients.py b/tempest/tests/common/test_service_clients.py
index c313071..f248957 100644
--- a/tempest/tests/common/test_service_clients.py
+++ b/tempest/tests/common/test_service_clients.py
@@ -17,10 +17,6 @@
 import six
 
 from tempest.services.baremetal.v1.json import baremetal_client
-from tempest.services.compute.json import floating_ips_client
-from tempest.services.compute.json import security_group_rules_client
-from tempest.services.compute.json import server_groups_client
-from tempest.services.compute.json import servers_client
 from tempest.services.data_processing.v1_1 import data_processing_client
 from tempest.services.database.json import flavors_client as db_flavor_client
 from tempest.services.database.json import versions_client as db_version_client
@@ -30,9 +26,9 @@
 from tempest.services.identity.v3.json import endpoints_client
 from tempest.services.identity.v3.json import identity_client as \
     identity_v3_identity_client
-from tempest.services.identity.v3.json import policy_client
-from tempest.services.identity.v3.json import region_client
-from tempest.services.identity.v3.json import service_client
+from tempest.services.identity.v3.json import policies_client
+from tempest.services.identity.v3.json import regions_client
+from tempest.services.identity.v3.json import services_client
 from tempest.services.image.v1.json import images_client
 from tempest.services.image.v2.json import images_client as images_v2_client
 from tempest.services.messaging.json import messaging_client
@@ -87,10 +83,6 @@
     def test_service_client_creations_with_specified_args(self, mock_init):
         test_clients = [
             baremetal_client.BaremetalClient,
-            floating_ips_client.FloatingIPsClient,
-            security_group_rules_client.SecurityGroupRulesClient,
-            server_groups_client.ServerGroupsClient,
-            servers_client.ServersClient,
             data_processing_client.DataProcessingClient,
             db_flavor_client.DatabaseFlavorsClient,
             db_version_client.DatabaseVersionsClient,
@@ -126,9 +118,9 @@
             credentials_client.CredentialsClient,
             endpoints_client.EndPointClient,
             identity_v3_identity_client.IdentityV3Client,
-            policy_client.PolicyClient,
-            region_client.RegionClient,
-            service_client.ServiceClient,
+            policies_client.PoliciesClient,
+            regions_client.RegionsClient,
+            services_client.ServicesClient,
             images_client.ImagesClient,
             images_v2_client.ImagesClientV2
         ]
diff --git a/tempest/tests/common/utils/linux/test_remote_client.py b/tempest/tests/common/utils/linux/test_remote_client.py
index e596aab..9c2b99e 100644
--- a/tempest/tests/common/utils/linux/test_remote_client.py
+++ b/tempest/tests/common/utils/linux/test_remote_client.py
@@ -29,7 +29,7 @@
         self.useFixture(fake_config.ConfigFixture())
         self.stubs.Set(config, 'TempestConfigPrivate', fake_config.FakePrivate)
         cfg.CONF.set_default('ip_version_for_ssh', 4, group='validation')
-        cfg.CONF.set_default('network_for_ssh', 'public', group='compute')
+        cfg.CONF.set_default('network_for_ssh', 'public', group='validation')
         cfg.CONF.set_default('connect_timeout', 1, group='validation')
 
         self.conn = remote_client.RemoteClient('127.0.0.1', 'user', 'pass')
@@ -79,7 +79,7 @@
     def test_get_number_of_vcpus(self):
         self.ssh_mock.mock.exec_command.return_value = '16'
         self.assertEqual(self.conn.get_number_of_vcpus(), 16)
-        self._assert_exec_called_with('grep -c processor /proc/cpuinfo')
+        self._assert_exec_called_with('grep -c ^processor /proc/cpuinfo')
 
     def test_get_partitions(self):
         proc_partitions = """major minor  #blocks  name
diff --git a/tempest/tests/services/compute/test_floating_ips_client.py b/tempest/tests/services/compute/test_floating_ips_client.py
deleted file mode 100644
index ee22004..0000000
--- a/tempest/tests/services/compute/test_floating_ips_client.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright 2015 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 oslotest import mockpatch
-from tempest_lib import exceptions as lib_exc
-
-from tempest.services.compute.json import floating_ips_client
-from tempest.tests import fake_auth_provider
-from tempest.tests.services.compute import base
-
-
-class TestFloatingIpsClient(base.BaseComputeServiceTest):
-
-    floating_ip = {"fixed_ip": None,
-                   "id": "46d61064-13ba-4bf0-9557-69de824c3d6f",
-                   "instance_id": "a1daa443-a6bb-463e-aea2-104b7d912eb8",
-                   "ip": "10.10.10.1",
-                   "pool": "nova"}
-
-    def setUp(self):
-        super(TestFloatingIpsClient, self).setUp()
-        fake_auth = fake_auth_provider.FakeAuthProvider()
-        self.client = floating_ips_client.FloatingIPsClient(
-            fake_auth, 'compute', 'regionOne')
-
-    def _test_list_floating_ips(self, bytes_body=False):
-        expected = {'floating_ips': [TestFloatingIpsClient.floating_ip]}
-        self.check_service_client_function(
-            self.client.list_floating_ips,
-            'tempest.common.service_client.ServiceClient.get',
-            expected,
-            bytes_body)
-
-    def test_list_floating_ips_str_body(self):
-        self._test_list_floating_ips(bytes_body=False)
-
-    def test_list_floating_ips_byte_body(self):
-        self._test_list_floating_ips(bytes_body=True)
-
-    def _test_show_floating_ip(self, bytes_body=False):
-        expected = {"floating_ip": TestFloatingIpsClient.floating_ip}
-        self.check_service_client_function(
-            self.client.show_floating_ip,
-            'tempest.common.service_client.ServiceClient.get',
-            expected,
-            bytes_body,
-            floating_ip_id='a1daa443-a6bb-463e-aea2-104b7d912eb8')
-
-    def test_show_floating_ip_str_body(self):
-        self._test_show_floating_ip(bytes_body=False)
-
-    def test_show_floating_ip_byte_body(self):
-        self._test_show_floating_ip(bytes_body=True)
-
-    def _test_create_floating_ip(self, bytes_body=False):
-        expected = {"floating_ip": TestFloatingIpsClient.floating_ip}
-        self.check_service_client_function(
-            self.client.create_floating_ip,
-            'tempest.common.service_client.ServiceClient.post',
-            expected,
-            bytes_body,
-            pool_name='nova')
-
-    def test_create_floating_ip_str_body(self):
-        self._test_create_floating_ip(bytes_body=False)
-
-    def test_create_floating_ip_byte_body(self):
-        self._test_create_floating_ip(bytes_body=True)
-
-    def test_delete_floating_ip(self):
-        self.check_service_client_function(
-            self.client.delete_floating_ip,
-            'tempest.common.service_client.ServiceClient.delete',
-            {}, status=202, floating_ip_id='fake-id')
-
-    def test_associate_floating_ip_to_server(self):
-        self.check_service_client_function(
-            self.client.associate_floating_ip_to_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {}, status=202, floating_ip='10.10.10.1',
-            server_id='c782b7a9-33cd-45f0-b795-7f87f456408b')
-
-    def test_disassociate_floating_ip_from_server(self):
-        self.check_service_client_function(
-            self.client.disassociate_floating_ip_from_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {}, status=202, floating_ip='10.10.10.1',
-            server_id='c782b7a9-33cd-45f0-b795-7f87f456408b')
-
-    def test_is_resource_deleted_true(self):
-        self.useFixture(mockpatch.Patch(
-            'tempest.services.compute.json.floating_ips_client.'
-            'FloatingIPsClient.show_floating_ip',
-            side_effect=lib_exc.NotFound()))
-        self.assertTrue(self.client.is_resource_deleted('fake-id'))
-
-    def test_is_resource_deleted_false(self):
-        self.useFixture(mockpatch.Patch(
-            'tempest.services.compute.json.floating_ips_client.'
-            'FloatingIPsClient.show_floating_ip',
-            return_value={"floating_ip": TestFloatingIpsClient.floating_ip}))
-        self.assertFalse(self.client.is_resource_deleted('fake-id'))
diff --git a/tempest/tests/services/compute/test_security_group_rules_client.py b/tempest/tests/services/compute/test_security_group_rules_client.py
deleted file mode 100644
index c182742..0000000
--- a/tempest/tests/services/compute/test_security_group_rules_client.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2015 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.services.compute.json import security_group_rules_client
-from tempest.tests import fake_auth_provider
-from tempest.tests.services.compute import base
-
-
-class TestSecurityGroupRulesClient(base.BaseComputeServiceTest):
-
-    FAKE_SECURITY_GROUP_RULE = {
-        "security_group_rule": {
-            "id": "2d021cf1-ce4b-4292-994f-7a785d62a144",
-            "ip_range": {
-                "cidr": "0.0.0.0/0"
-            },
-            "parent_group_id": "48700ff3-30b8-4e63-845f-a79c9633e9fb",
-            "to_port": 443,
-            "ip_protocol": "tcp",
-            "group": {},
-            "from_port": 443
-        }
-    }
-
-    def setUp(self):
-        super(TestSecurityGroupRulesClient, self).setUp()
-        fake_auth = fake_auth_provider.FakeAuthProvider()
-        self.client = security_group_rules_client.SecurityGroupRulesClient(
-            fake_auth, 'compute', 'regionOne')
-
-    def _test_create_security_group_rule(self, bytes_body=False):
-        req_body = {
-            "from_port": "443",
-            "ip_protocol": "tcp",
-            "to_port": "443",
-            "cidr": "0.0.0.0/0",
-            "parent_group_id": "48700ff3-30b8-4e63-845f-a79c9633e9fb"
-        }
-        self.check_service_client_function(
-            self.client.create_security_group_rule,
-            'tempest.common.service_client.ServiceClient.post',
-            self.FAKE_SECURITY_GROUP_RULE,
-            to_utf=bytes_body, **req_body)
-
-    def test_create_security_group_rule_with_str_body(self):
-        self._test_create_security_group_rule()
-
-    def test_create_security_group_rule_with_bytes_body(self):
-        self._test_create_security_group_rule(bytes_body=True)
-
-    def test_delete_security_group_rule(self):
-        self.check_service_client_function(
-            self.client.delete_security_group_rule,
-            'tempest.common.service_client.ServiceClient.delete',
-            {}, status=202, group_rule_id='group-id')
diff --git a/tempest/tests/services/compute/test_server_groups_client.py b/tempest/tests/services/compute/test_server_groups_client.py
deleted file mode 100644
index e531e2f..0000000
--- a/tempest/tests/services/compute/test_server_groups_client.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright 2015 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.
-
-import httplib2
-
-from oslotest import mockpatch
-from tempest_lib.tests import fake_auth_provider
-
-from tempest.services.compute.json import server_groups_client
-from tempest.tests.services.compute import base
-
-
-class TestServerGroupsClient(base.BaseComputeServiceTest):
-
-    server_group = {
-        "id": "5bbcc3c4-1da2-4437-a48a-66f15b1b13f9",
-        "name": "test",
-        "policies": ["anti-affinity"],
-        "members": [],
-        "metadata": {}}
-
-    def setUp(self):
-        super(TestServerGroupsClient, self).setUp()
-        fake_auth = fake_auth_provider.FakeAuthProvider()
-        self.client = server_groups_client.ServerGroupsClient(
-            fake_auth, 'compute', 'regionOne')
-
-    def _test_create_server_group(self, bytes_body=False):
-        expected = {"server_group": TestServerGroupsClient.server_group}
-        self.check_service_client_function(
-            self.client.create_server_group,
-            'tempest.common.service_client.ServiceClient.post', expected,
-            bytes_body, name='fake-group', policies=['affinity'])
-
-    def test_create_server_group_str_body(self):
-        self._test_create_server_group(bytes_body=False)
-
-    def test_create_server_group_byte_body(self):
-        self._test_create_server_group(bytes_body=True)
-
-    def test_delete_server_group(self):
-        response = (httplib2.Response({'status': 204}), None)
-        self.useFixture(mockpatch.Patch(
-            'tempest.common.service_client.ServiceClient.delete',
-            return_value=response))
-        self.client.delete_server_group('fake-group')
-
-    def _test_list_server_groups(self, bytes_body=False):
-        expected = {"server_groups": [TestServerGroupsClient.server_group]}
-        self.check_service_client_function(
-            self.client.list_server_groups,
-            'tempest.common.service_client.ServiceClient.get',
-            expected, bytes_body)
-
-    def test_list_server_groups_str_body(self):
-        self._test_list_server_groups(bytes_body=False)
-
-    def test_list_server_groups_byte_body(self):
-        self._test_list_server_groups(bytes_body=True)
-
-    def _test_show_server_group(self, bytes_body=False):
-        expected = {"server_group": TestServerGroupsClient.server_group}
-        self.check_service_client_function(
-            self.client.show_server_group,
-            'tempest.common.service_client.ServiceClient.get',
-            expected, bytes_body,
-            server_group_id='5bbcc3c4-1da2-4437-a48a-66f15b1b13f9')
-
-    def test_show_server_group_str_body(self):
-        self._test_show_server_group(bytes_body=False)
-
-    def test_show_server_group_byte_body(self):
-        self._test_show_server_group(bytes_body=True)
diff --git a/tempest/tests/services/compute/test_servers_client.py b/tempest/tests/services/compute/test_servers_client.py
deleted file mode 100644
index 1fd0740..0000000
--- a/tempest/tests/services/compute/test_servers_client.py
+++ /dev/null
@@ -1,999 +0,0 @@
-# Copyright 2015 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.
-
-import copy
-from tempest.services.compute.json import servers_client
-from tempest.tests import fake_auth_provider
-from tempest.tests.services.compute import base
-
-
-class TestServersClient(base.BaseComputeServiceTest):
-
-    FAKE_SERVERS = {'servers': [{
-        "id": "616fb98f-46ca-475e-917e-2563e5a8cd19",
-        "links": [
-            {
-                "href": "http://os.co/v2/616fb98f-46ca-475e-917e-2563e5a8cd19",
-                "rel": "self"
-            },
-            {
-                "href": "http://os.co/616fb98f-46ca-475e-917e-2563e5a8cd19",
-                "rel": "bookmark"
-            }
-        ],
-        "name": u"new\u1234-server-test"}]
-    }
-
-    FAKE_SERVER_DIAGNOSTICS = {
-        "cpu0_time": 17300000000,
-        "memory": 524288,
-        "vda_errors": -1,
-        "vda_read": 262144,
-        "vda_read_req": 112,
-        "vda_write": 5778432,
-        "vda_write_req": 488,
-        "vnet1_rx": 2070139,
-        "vnet1_rx_drop": 0,
-        "vnet1_rx_errors": 0,
-        "vnet1_rx_packets": 26701,
-        "vnet1_tx": 140208,
-        "vnet1_tx_drop": 0,
-        "vnet1_tx_errors": 0,
-        "vnet1_tx_packets": 662
-    }
-
-    FAKE_SERVER_GET = {'server': {
-        "accessIPv4": "",
-        "accessIPv6": "",
-        "addresses": {
-            "private": [
-                {
-                    "addr": "192.168.0.3",
-                    "version": 4
-                }
-            ]
-        },
-        "created": "2012-08-20T21:11:09Z",
-        "flavor": {
-            "id": "1",
-            "links": [
-                {
-                    "href": "http://os.com/openstack/flavors/1",
-                    "rel": "bookmark"
-                }
-            ]
-        },
-        "hostId": "65201c14a29663e06d0748e561207d998b343e1d164bfa0aafa9c45d",
-        "id": "893c7791-f1df-4c3d-8383-3caae9656c62",
-        "image": {
-            "id": "70a599e0-31e7-49b7-b260-868f441e862b",
-            "links": [
-                {
-                    "href": "http://imgs/70a599e0-31e7-49b7-b260-868f441e862b",
-                    "rel": "bookmark"
-                }
-            ]
-        },
-        "links": [
-            {
-                "href": "http://v2/srvs/893c7791-f1df-4c3d-8383-3caae9656c62",
-                "rel": "self"
-            },
-            {
-                "href": "http://srvs/893c7791-f1df-4c3d-8383-3caae9656c62",
-                "rel": "bookmark"
-            }
-        ],
-        "metadata": {
-            u"My Server N\u1234me": u"Apa\u1234che1"
-        },
-        "name": u"new\u1234-server-test",
-        "progress": 0,
-        "status": "ACTIVE",
-        "tenant_id": "openstack",
-        "updated": "2012-08-20T21:11:09Z",
-        "user_id": "fake"}
-    }
-
-    FAKE_SERVER_POST = {"server": {
-        "id": "616fb98f-46ca-475e-917e-2563e5a8cd19",
-        "adminPass": "fake-admin-pass",
-        "security_groups": [
-            'fake-security-group-1',
-            'fake-security-group-2'
-        ],
-        "links": [
-            {
-                "href": "http://os.co/v2/616fb98f-46ca-475e-917e-2563e5a8cd19",
-                "rel": "self"
-            },
-            {
-                "href": "http://os.co/616fb98f-46ca-475e-917e-2563e5a8cd19",
-                "rel": "bookmark"
-            }
-        ],
-        "OS-DCF:diskConfig": "fake-disk-config"}
-    }
-
-    FAKE_ADDRESS = {"addresses": {
-        "private": [
-            {
-                "addr": "192.168.0.3",
-                "version": 4
-            }
-        ]}
-    }
-
-    FAKE_COMMON_VOLUME = {
-        "id": "a6b0875b-6b5d-4a5a-81eb-0c3aa62e5fdb",
-        "device": "fake-device",
-        "volumeId": "a6b0875b-46ca-475e-917e-0c3aa62e5fdb",
-        "serverId": "616fb98f-46ca-475e-917e-2563e5a8cd19"
-    }
-
-    FAKE_VIRTUAL_INTERFACES = {
-        "id": "a6b0875b-46ca-475e-917e-0c3aa62e5fdb",
-        "mac_address": "00:25:90:5b:f8:c3",
-        "OS-EXT-VIF-NET:net_id": "fake-os-net-id"
-    }
-
-    FAKE_INSTANCE_ACTIONS = {
-        "action": "fake-action",
-        "request_id": "16fb98f-46ca-475e-917e-2563e5a8cd19",
-        "user_id": "16fb98f-46ca-475e-917e-2563e5a8cd12",
-        "project_id": "16fb98f-46ca-475e-917e-2563e5a8cd34",
-        "start_time": "09MAR2015 11:15",
-        "message": "fake-msg",
-        "instance_uuid": "16fb98f-46ca-475e-917e-2563e5a8cd12"
-    }
-
-    FAKE_VNC_CONSOLE = {
-        "type": "fake-type",
-        "url": "http://os.co/v2/616fb98f-46ca-475e-917e-2563e5a8cd19"
-    }
-
-    FAKE_INSTANCE_ACTION_EVENTS = {
-        "event": "fake-event",
-        "start_time": "09MAR2015 11:15",
-        "finish_time": "09MAR2015 11:15",
-        "result": "fake-result",
-        "traceback": "fake-trace-back"
-    }
-
-    FAKE_INSTANCE_WITH_EVENTS = copy.deepcopy(FAKE_INSTANCE_ACTIONS)
-    FAKE_INSTANCE_WITH_EVENTS['events'] = [FAKE_INSTANCE_ACTION_EVENTS]
-
-    FAKE_REBUILD_SERVER = copy.deepcopy(FAKE_SERVER_GET)
-    FAKE_REBUILD_SERVER['server']['adminPass'] = 'fake-admin-pass'
-
-    server_id = FAKE_SERVER_GET['server']['id']
-    network_id = 'a6b0875b-6b5d-4a5a-81eb-0c3aa62e5fdb'
-
-    def setUp(self):
-        super(TestServersClient, self).setUp()
-        fake_auth = fake_auth_provider.FakeAuthProvider()
-        self.client = servers_client.ServersClient(
-            fake_auth, 'compute', 'regionOne')
-
-    def test_list_servers_with_str_body(self):
-        self._test_list_servers()
-
-    def test_list_servers_with_bytes_body(self):
-        self._test_list_servers(bytes_body=True)
-
-    def _test_list_servers(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_servers,
-            'tempest.common.service_client.ServiceClient.get',
-            self.FAKE_SERVERS,
-            bytes_body)
-
-    def test_show_server_with_str_body(self):
-        self._test_show_server()
-
-    def test_show_server_with_bytes_body(self):
-        self._test_show_server(bytes_body=True)
-
-    def _test_show_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.show_server,
-            'tempest.common.service_client.ServiceClient.get',
-            self.FAKE_SERVER_GET,
-            bytes_body,
-            server_id=self.server_id
-            )
-
-    def test_delete_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.delete_server,
-            'tempest.common.service_client.ServiceClient.delete',
-            {},
-            status=204,
-            server_id=self.server_id
-            )
-
-    def test_create_server_with_str_body(self):
-        self._test_create_server()
-
-    def test_create_server_with_bytes_body(self):
-        self._test_create_server(True)
-
-    def _test_create_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.create_server,
-            'tempest.common.service_client.ServiceClient.post',
-            self.FAKE_SERVER_POST,
-            bytes_body,
-            status=202,
-            name='fake-name',
-            imageRef='fake-image-ref',
-            flavorRef='fake-flavor-ref'
-            )
-
-    def test_list_addresses_with_str_body(self):
-        self._test_list_addresses()
-
-    def test_list_addresses_with_bytes_body(self):
-        self._test_list_addresses(True)
-
-    def _test_list_addresses(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_addresses,
-            'tempest.common.service_client.ServiceClient.get',
-            self.FAKE_ADDRESS,
-            bytes_body,
-            server_id=self.server_id
-            )
-
-    def test_list_addresses_by_network_with_str_body(self):
-        self._test_list_addresses_by_network()
-
-    def test_list_addresses_by_network_with_bytes_body(self):
-        self._test_list_addresses_by_network(True)
-
-    def _test_list_addresses_by_network(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_addresses_by_network,
-            'tempest.common.service_client.ServiceClient.get',
-            self.FAKE_ADDRESS['addresses'],
-            server_id=self.server_id,
-            network_id=self.network_id
-            )
-
-    def test_action_with_str_body(self):
-        self._test_action()
-
-    def test_action_with_bytes_body(self):
-        self._test_action(True)
-
-    def _test_action(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.action,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            server_id=self.server_id,
-            action_name='fake-action-name',
-            schema={'status_code': 200}
-            )
-
-    def test_create_backup_with_str_body(self):
-        self._test_create_backup()
-
-    def test_create_backup_with_bytes_body(self):
-        self._test_create_backup(True)
-
-    def _test_create_backup(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.create_backup,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            backup_type='fake-backup',
-            rotation='fake-rotation',
-            name='fake-name'
-            )
-
-    def test_change_password_with_str_body(self):
-        self._test_change_password()
-
-    def test_change_password_with_bytes_body(self):
-        self._test_change_password(True)
-
-    def _test_change_password(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.change_password,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            adminPass='fake-admin-pass'
-            )
-
-    def test_show_password_with_str_body(self):
-        self._test_show_password()
-
-    def test_show_password_with_bytes_body(self):
-        self._test_show_password(True)
-
-    def _test_show_password(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.show_password,
-            'tempest.common.service_client.ServiceClient.get',
-            {'password': 'fake-password'},
-            server_id=self.server_id
-            )
-
-    def test_delete_password_with_str_body(self):
-        self._test_delete_password()
-
-    def test_delete_password_with_bytes_body(self):
-        self._test_delete_password(True)
-
-    def _test_delete_password(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.delete_password,
-            'tempest.common.service_client.ServiceClient.delete',
-            {},
-            status=204,
-            server_id=self.server_id
-            )
-
-    def test_reboot_server_with_str_body(self):
-        self._test_reboot_server()
-
-    def test_reboot_server_with_bytes_body(self):
-        self._test_reboot_server(True)
-
-    def _test_reboot_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.reboot_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            type='fake-reboot-type'
-            )
-
-    def test_rebuild_server_with_str_body(self):
-        self._test_rebuild_server()
-
-    def test_rebuild_server_with_bytes_body(self):
-        self._test_rebuild_server(True)
-
-    def _test_rebuild_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.rebuild_server,
-            'tempest.common.service_client.ServiceClient.post',
-            self.FAKE_REBUILD_SERVER,
-            status=202,
-            server_id=self.server_id,
-            image_ref='fake-image-ref'
-            )
-
-    def test_resize_server_with_str_body(self):
-        self._test_resize_server()
-
-    def test_resize_server_with_bytes_body(self):
-        self._test_resize_server(True)
-
-    def _test_resize_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.resize_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            flavor_ref='fake-flavor-ref'
-            )
-
-    def test_confirm_resize_server_with_str_body(self):
-        self._test_confirm_resize_server()
-
-    def test_confirm_resize_server_with_bytes_body(self):
-        self._test_confirm_resize_server(True)
-
-    def _test_confirm_resize_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.confirm_resize_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=204,
-            server_id=self.server_id
-            )
-
-    def test_revert_resize_server_with_str_body(self):
-        self._test_revert_resize()
-
-    def test_revert_resize_server_with_bytes_body(self):
-        self._test_revert_resize(True)
-
-    def _test_revert_resize(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.revert_resize_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_list_server_metadata_with_str_body(self):
-        self._test_list_server_metadata()
-
-    def test_list_server_metadata_with_bytes_body(self):
-        self._test_list_server_metadata()
-
-    def _test_list_server_metadata(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_server_metadata,
-            'tempest.common.service_client.ServiceClient.get',
-            {'metadata': {'fake-key': 'fake-meta-data'}},
-            server_id=self.server_id
-            )
-
-    def test_set_server_metadata_with_str_body(self):
-        self._test_set_server_metadata()
-
-    def test_set_server_metadata_with_bytes_body(self):
-        self._test_set_server_metadata(True)
-
-    def _test_set_server_metadata(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.set_server_metadata,
-            'tempest.common.service_client.ServiceClient.put',
-            {'metadata': {'fake-key': 'fake-meta-data'}},
-            server_id=self.server_id,
-            meta='fake-meta'
-            )
-
-    def test_update_server_metadata_with_str_body(self):
-        self._test_update_server_metadata()
-
-    def test_update_server_metadata_with_bytes_body(self):
-        self._test_update_server_metadata(True)
-
-    def _test_update_server_metadata(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.update_server_metadata,
-            'tempest.common.service_client.ServiceClient.post',
-            {'metadata': {'fake-key': 'fake-meta-data'}},
-            server_id=self.server_id,
-            meta='fake-meta'
-            )
-
-    def test_show_server_metadata_item_with_str_body(self):
-        self._test_show_server_metadata()
-
-    def test_show_server_metadata_item_with_bytes_body(self):
-        self._test_show_server_metadata(True)
-
-    def _test_show_server_metadata(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.show_server_metadata_item,
-            'tempest.common.service_client.ServiceClient.get',
-            {'meta': {'fake-key': 'fake-meta-data'}},
-            server_id=self.server_id,
-            key='fake-key'
-            )
-
-    def test_set_server_metadata_item_with_str_body(self):
-        self._test_set_server_metadata_item()
-
-    def test_set_server_metadata_item_with_bytes_body(self):
-        self._test_set_server_metadata_item(True)
-
-    def _test_set_server_metadata_item(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.set_server_metadata_item,
-            'tempest.common.service_client.ServiceClient.put',
-            {'meta': {'fake-key': 'fake-meta-data'}},
-            server_id=self.server_id,
-            key='fake-key',
-            meta='fake-meta'
-            )
-
-    def test_delete_server_metadata_item_with_str_body(self):
-        self._test_delete_server_metadata()
-
-    def test_delete_server_metadata_item_with_bytes_body(self):
-        self._test_delete_server_metadata(True)
-
-    def _test_delete_server_metadata(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.delete_server_metadata_item,
-            'tempest.common.service_client.ServiceClient.delete',
-            {},
-            status=204,
-            server_id=self.server_id,
-            key='fake-key'
-            )
-
-    def test_stop_server_with_str_body(self):
-        self._test_stop_server()
-
-    def test_stop_server_with_bytes_body(self):
-        self._test_stop_server(True)
-
-    def _test_stop_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.stop_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_start_server_with_str_body(self):
-        self._test_start_server()
-
-    def test_start_server_with_bytes_body(self):
-        self._test_start_server(True)
-
-    def _test_start_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.start_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_attach_volume_with_str_body(self):
-        self._test_attach_volume_server()
-
-    def test_attach_volume_with_bytes_body(self):
-        self._test_attach_volume_server(True)
-
-    def _test_attach_volume_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.attach_volume,
-            'tempest.common.service_client.ServiceClient.post',
-            {'volumeAttachment': self.FAKE_COMMON_VOLUME},
-            server_id=self.server_id
-            )
-
-    def test_detach_volume_with_str_body(self):
-        self._test_detach_volume_server()
-
-    def test_detach_volume_with_bytes_body(self):
-        self._test_detach_volume_server(True)
-
-    def _test_detach_volume_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.detach_volume,
-            'tempest.common.service_client.ServiceClient.delete',
-            {},
-            status=202,
-            server_id=self.server_id,
-            volume_id=self.FAKE_COMMON_VOLUME['volumeId']
-            )
-
-    def test_show_volume_attachment_with_str_body(self):
-        self._test_show_volume_attachment()
-
-    def test_show_volume_attachment_with_bytes_body(self):
-        self._test_show_volume_attachment(True)
-
-    def _test_show_volume_attachment(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.show_volume_attachment,
-            'tempest.common.service_client.ServiceClient.get',
-            {'volumeAttachment': self.FAKE_COMMON_VOLUME},
-            server_id=self.server_id,
-            attach_id='fake-attach-id'
-            )
-
-    def test_list_volume_attachments_with_str_body(self):
-        self._test_list_volume_attachments()
-
-    def test_list_volume_attachments_with_bytes_body(self):
-        self._test_list_volume_attachments(True)
-
-    def _test_list_volume_attachments(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_volume_attachments,
-            'tempest.common.service_client.ServiceClient.get',
-            {'volumeAttachments': [self.FAKE_COMMON_VOLUME]},
-            server_id=self.server_id
-            )
-
-    def test_add_security_group_with_str_body(self):
-        self._test_add_security_group()
-
-    def test_add_security_group_with_bytes_body(self):
-        self._test_add_security_group(True)
-
-    def _test_add_security_group(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.add_security_group,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            name='fake-name'
-            )
-
-    def test_remove_security_group_with_str_body(self):
-        self._test_remove_security_group()
-
-    def test_remove_security_group_with_bytes_body(self):
-        self._test_remove_security_group(True)
-
-    def _test_remove_security_group(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.remove_security_group,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            name='fake-name'
-            )
-
-    def test_live_migrate_server_with_str_body(self):
-        self._test_live_migrate_server()
-
-    def test_live_migrate_server_with_bytes_body(self):
-        self._test_live_migrate_server(True)
-
-    def _test_live_migrate_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.live_migrate_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_migrate_server_with_str_body(self):
-        self._test_migrate_server()
-
-    def test_migrate_server_with_bytes_body(self):
-        self._test_migrate_server(True)
-
-    def _test_migrate_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.migrate_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_lock_server_with_str_body(self):
-        self._test_lock_server()
-
-    def test_lock_server_with_bytes_body(self):
-        self._test_lock_server(True)
-
-    def _test_lock_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.lock_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_unlock_server_with_str_body(self):
-        self._test_unlock_server()
-
-    def test_unlock_server_with_bytes_body(self):
-        self._test_unlock_server(True)
-
-    def _test_unlock_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.unlock_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_suspend_server_with_str_body(self):
-        self._test_suspend_server()
-
-    def test_suspend_server_with_bytes_body(self):
-        self._test_suspend_server(True)
-
-    def _test_suspend_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.suspend_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_resume_server_with_str_body(self):
-        self._test_resume_server()
-
-    def test_resume_server_with_bytes_body(self):
-        self._test_resume_server(True)
-
-    def _test_resume_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.resume_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_pause_server_with_str_body(self):
-        self._test_pause_server()
-
-    def test_pause_server_with_bytes_body(self):
-        self._test_pause_server(True)
-
-    def _test_pause_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.pause_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_unpause_server_with_str_body(self):
-        self._test_unpause_server()
-
-    def test_unpause_server_with_bytes_body(self):
-        self._test_unpause_server(True)
-
-    def _test_unpause_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.unpause_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_reset_state_with_str_body(self):
-        self._test_reset_state()
-
-    def test_reset_state_with_bytes_body(self):
-        self._test_reset_state(True)
-
-    def _test_reset_state(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.reset_state,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id,
-            state='fake-state'
-            )
-
-    def test_shelve_server_with_str_body(self):
-        self._test_shelve_server()
-
-    def test_shelve_server_with_bytes_body(self):
-        self._test_shelve_server(True)
-
-    def _test_shelve_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.shelve_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_unshelve_server_with_str_body(self):
-        self._test_unshelve_server()
-
-    def test_unshelve_server_with_bytes_body(self):
-        self._test_unshelve_server(True)
-
-    def _test_unshelve_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.unshelve_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_shelve_offload_server_with_str_body(self):
-        self._test_shelve_offload_server()
-
-    def test_shelve_offload_server_with_bytes_body(self):
-        self._test_shelve_offload_server(True)
-
-    def _test_shelve_offload_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.shelve_offload_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_get_console_output_with_str_body(self):
-        self._test_get_console_output()
-
-    def test_get_console_output_with_bytes_body(self):
-        self._test_get_console_output(True)
-
-    def _test_get_console_output(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.get_console_output,
-            'tempest.common.service_client.ServiceClient.post',
-            {'output': 'fake-output'},
-            server_id=self.server_id,
-            length='fake-length'
-            )
-
-    def test_list_virtual_interfaces_with_str_body(self):
-        self._test_list_virtual_interfaces()
-
-    def test_list_virtual_interfaces_with_bytes_body(self):
-        self._test_list_virtual_interfaces(True)
-
-    def _test_list_virtual_interfaces(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_virtual_interfaces,
-            'tempest.common.service_client.ServiceClient.get',
-            {'virtual_interfaces': [self.FAKE_VIRTUAL_INTERFACES]},
-            server_id=self.server_id
-            )
-
-    def test_rescue_server_with_str_body(self):
-        self._test_rescue_server()
-
-    def test_rescue_server_with_bytes_body(self):
-        self._test_rescue_server(True)
-
-    def _test_rescue_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.rescue_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {'adminPass': 'fake-admin-pass'},
-            server_id=self.server_id
-            )
-
-    def test_unrescue_server_with_str_body(self):
-        self._test_unrescue_server()
-
-    def test_unrescue_server_with_bytes_body(self):
-        self._test_unrescue_server(True)
-
-    def _test_unrescue_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.unrescue_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_show_server_diagnostics_with_str_body(self):
-        self._test_show_server_diagnostics()
-
-    def test_show_server_diagnostics_with_bytes_body(self):
-        self._test_show_server_diagnostics(True)
-
-    def _test_show_server_diagnostics(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.show_server_diagnostics,
-            'tempest.common.service_client.ServiceClient.get',
-            self.FAKE_SERVER_DIAGNOSTICS,
-            status=200,
-            server_id=self.server_id
-            )
-
-    def test_list_instance_actions_with_str_body(self):
-        self._test_list_instance_actions()
-
-    def test_list_instance_actions_with_bytes_body(self):
-        self._test_list_instance_actions(True)
-
-    def _test_list_instance_actions(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_instance_actions,
-            'tempest.common.service_client.ServiceClient.get',
-            {'instanceActions': [self.FAKE_INSTANCE_ACTIONS]},
-            server_id=self.server_id
-            )
-
-    def test_show_instance_action_with_str_body(self):
-        self._test_show_instance_action()
-
-    def test_show_instance_action_with_bytes_body(self):
-        self._test_show_instance_action(True)
-
-    def _test_show_instance_action(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.show_instance_action,
-            'tempest.common.service_client.ServiceClient.get',
-            {'instanceAction': self.FAKE_INSTANCE_WITH_EVENTS},
-            server_id=self.server_id,
-            request_id='fake-request-id'
-            )
-
-    def test_force_delete_server_with_str_body(self):
-        self._test_force_delete_server()
-
-    def test_force_delete_server_with_bytes_body(self):
-        self._test_force_delete_server(True)
-
-    def _test_force_delete_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.force_delete_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_restore_soft_deleted_server_with_str_body(self):
-        self._test_restore_soft_deleted_server()
-
-    def test_restore_soft_deleted_server_with_bytes_body(self):
-        self._test_restore_soft_deleted_server(True)
-
-    def _test_restore_soft_deleted_server(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.restore_soft_deleted_server,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_reset_network_with_str_body(self):
-        self._test_reset_network()
-
-    def test_reset_network_with_bytes_body(self):
-        self._test_reset_network(True)
-
-    def _test_reset_network(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.reset_network,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_inject_network_info_with_str_body(self):
-        self._test_inject_network_info()
-
-    def test_inject_network_info_with_bytes_body(self):
-        self._test_inject_network_info(True)
-
-    def _test_inject_network_info(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.inject_network_info,
-            'tempest.common.service_client.ServiceClient.post',
-            {},
-            status=202,
-            server_id=self.server_id
-            )
-
-    def test_get_vnc_console_with_str_body(self):
-        self._test_get_vnc_console()
-
-    def test_get_vnc_console_with_bytes_body(self):
-        self._test_get_vnc_console(True)
-
-    def _test_get_vnc_console(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.get_vnc_console,
-            'tempest.common.service_client.ServiceClient.post',
-            {'console': self.FAKE_VNC_CONSOLE},
-            server_id=self.server_id,
-            type='fake-console-type'
-            )
diff --git a/tempest/thirdparty/README.rst b/tempest/thirdparty/README.rst
deleted file mode 100644
index b0bfdf7..0000000
--- a/tempest/thirdparty/README.rst
+++ /dev/null
@@ -1,35 +0,0 @@
-.. _third_party_field_guide:
-
-Tempest Field Guide to Third Party API tests
-============================================
-
-
-What are these tests?
----------------------
-
-Third party tests are tests for non native OpenStack APIs that are
-part of OpenStack projects. If we ship an API, we're really required
-to ensure that it's working.
-
-An example is that Nova Compute currently has EC2 API support in tree,
-which should be tested as part of normal process.
-
-
-Why are these tests in tempest?
--------------------------------
-
-If we ship an API in an OpenStack component, there should be tests in
-tempest to exercise it in some way.
-
-
-Scope of these tests
---------------------
-
-Third party API testing should be limited to the functional testing of
-third party API compliance. Complex scenarios should be avoided, and
-instead exercised with the OpenStack API, unless the third party API
-can't be tested without those scenarios.
-
-Whenever possible third party API testing should use a client as close
-to the third party API as possible. The point of these tests is API
-validation.
diff --git a/tempest/thirdparty/__init__.py b/tempest/thirdparty/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/thirdparty/__init__.py
+++ /dev/null
diff --git a/tempest/thirdparty/boto/__init__.py b/tempest/thirdparty/boto/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/thirdparty/boto/__init__.py
+++ /dev/null
diff --git a/tempest/thirdparty/boto/test.py b/tempest/thirdparty/boto/test.py
deleted file mode 100644
index cfd3747..0000000
--- a/tempest/thirdparty/boto/test.py
+++ /dev/null
@@ -1,694 +0,0 @@
-# Copyright 2012 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 contextlib
-import logging as orig_logging
-import os
-import re
-
-import boto
-from boto import ec2
-from boto import exception
-from boto import s3
-from oslo_log import log as logging
-import six
-from six.moves.urllib import parse as urlparse
-from tempest_lib import exceptions as lib_exc
-
-from tempest.common import credentials_factory as credentials
-from tempest.common.utils import file_utils
-from tempest import config
-from tempest import exceptions
-import tempest.test
-from tempest.thirdparty.boto.utils import wait
-
-CONF = config.CONF
-LOG = logging.getLogger(__name__)
-
-
-def decision_maker():
-    A_I_IMAGES_READY = True  # ari,ami,aki
-    S3_CAN_CONNECT_ERROR = None
-    EC2_CAN_CONNECT_ERROR = None
-    secret_matcher = re.compile("[A-Za-z0-9+/]{32,}")  # 40 in other system
-    id_matcher = re.compile("[A-Za-z0-9]{20,}")
-
-    def all_read(*args):
-        return all(map(file_utils.have_effective_read_access, args))
-
-    materials_path = CONF.boto.s3_materials_path
-    ami_path = materials_path + os.sep + CONF.boto.ami_manifest
-    aki_path = materials_path + os.sep + CONF.boto.aki_manifest
-    ari_path = materials_path + os.sep + CONF.boto.ari_manifest
-
-    A_I_IMAGES_READY = all_read(ami_path, aki_path, ari_path)
-    boto_logger = logging.getLogger('boto')
-    level = boto_logger.logger.level
-    # suppress logging for boto
-    boto_logger.logger.setLevel(orig_logging.CRITICAL)
-
-    def _cred_sub_check(connection_data):
-        if not id_matcher.match(connection_data["aws_access_key_id"]):
-            raise Exception("Invalid AWS access Key")
-        if not secret_matcher.match(connection_data["aws_secret_access_key"]):
-            raise Exception("Invalid AWS secret Key")
-        raise Exception("Unknown (Authentication?) Error")
-    # NOTE(andreaf) Setting up an extra manager here is redundant,
-    # and should be removed.
-    openstack = credentials.ConfiguredUserManager()
-    try:
-        if urlparse.urlparse(CONF.boto.ec2_url).hostname is None:
-            raise Exception("Failed to get hostname from the ec2_url")
-        ec2client = openstack.ec2api_client
-        try:
-            ec2client.get_all_regions()
-        except exception.BotoServerError as exc:
-                if exc.error_code is None:
-                    raise Exception("EC2 target does not looks EC2 service")
-                _cred_sub_check(ec2client.connection_data)
-
-    except lib_exc.Unauthorized:
-        EC2_CAN_CONNECT_ERROR = "AWS credentials not set," +\
-                                " also failed to get it from keystone"
-    except Exception as exc:
-        EC2_CAN_CONNECT_ERROR = str(exc)
-
-    try:
-        if urlparse.urlparse(CONF.boto.s3_url).hostname is None:
-            raise Exception("Failed to get hostname from the s3_url")
-        s3client = openstack.s3_client
-        try:
-            s3client.get_bucket("^INVALID*#()@INVALID.")
-        except exception.BotoServerError as exc:
-            if exc.status == 403:
-                _cred_sub_check(s3client.connection_data)
-    except Exception as exc:
-        S3_CAN_CONNECT_ERROR = str(exc)
-    except lib_exc.Unauthorized:
-        S3_CAN_CONNECT_ERROR = "AWS credentials not set," +\
-                               " failed to get them even by keystoneclient"
-    boto_logger.logger.setLevel(level)
-    return {'A_I_IMAGES_READY': A_I_IMAGES_READY,
-            'S3_CAN_CONNECT_ERROR': S3_CAN_CONNECT_ERROR,
-            'EC2_CAN_CONNECT_ERROR': EC2_CAN_CONNECT_ERROR}
-
-
-class BotoExceptionMatcher(object):
-    STATUS_RE = r'[45]\d\d'
-    CODE_RE = '.*'  # regexp makes sense in group match
-
-    def match(self, exc):
-        """Check boto exception
-
-        :returns: Returns with an error string if it does not match,
-                  returns with None when it matches.
-        """
-        if not isinstance(exc, exception.BotoServerError):
-            return "%r not an BotoServerError instance" % exc
-        LOG.info("Status: %s , error_code: %s", exc.status, exc.error_code)
-        if re.match(self.STATUS_RE, str(exc.status)) is None:
-            return ("Status code (%s) does not match"
-                    "the expected re pattern \"%s\""
-                    % (exc.status, self.STATUS_RE))
-        if re.match(self.CODE_RE, str(exc.error_code)) is None:
-            return ("Error code (%s) does not match" +
-                    "the expected re pattern \"%s\"") %\
-                   (exc.error_code, self.CODE_RE)
-        return None
-
-
-class ClientError(BotoExceptionMatcher):
-    STATUS_RE = r'4\d\d'
-
-
-class ServerError(BotoExceptionMatcher):
-    STATUS_RE = r'5\d\d'
-
-
-def _add_matcher_class(error_cls, error_data, base=BotoExceptionMatcher):
-    """Usable for adding an ExceptionMatcher(s) into the exception tree.
-
-       The not leaf elements does wildcard match
-    """
-    # in error_code just literal and '.' characters expected
-    if not isinstance(error_data, six.string_types):
-        (error_code, status_code) = map(str, error_data)
-    else:
-        status_code = None
-        error_code = error_data
-    parts = error_code.split('.')
-    basematch = ""
-    num_parts = len(parts)
-    max_index = num_parts - 1
-    add_cls = error_cls
-    for i_part in six.moves.xrange(num_parts):
-        part = parts[i_part]
-        leaf = i_part == max_index
-        if not leaf:
-            match = basematch + part + "[.].*"
-        else:
-            match = basematch + part
-
-        basematch += part + "[.]"
-        if not hasattr(add_cls, part):
-            cls_dict = {"CODE_RE": match}
-            if leaf and status_code is not None:
-                cls_dict["STATUS_RE"] = status_code
-            cls = type(part, (base, ), cls_dict)
-            setattr(add_cls, part, cls())
-            add_cls = cls
-        elif leaf:
-            raise LookupError("Tries to redefine an error code \"%s\"" % part)
-        else:
-            add_cls = getattr(add_cls, part)
-
-
-# TODO(afazekas): classmethod handling
-def friendly_function_name_simple(call_able):
-    name = ""
-    if hasattr(call_able, "im_class"):
-        name += call_able.im_class.__name__ + "."
-    name += call_able.__name__
-    return name
-
-
-def friendly_function_call_str(call_able, *args, **kwargs):
-    string = friendly_function_name_simple(call_able)
-    string += "(" + ", ".join(map(str, args))
-    if len(kwargs):
-        if len(args):
-            string += ", "
-    string += ", ".join("=".join(map(str, (key, value)))
-                        for (key, value) in kwargs.items())
-    return string + ")"
-
-
-class BotoTestCase(tempest.test.BaseTestCase):
-    """Recommended to use as base class for boto related test."""
-
-    credentials = ['primary']
-
-    @classmethod
-    def skip_checks(cls):
-        super(BotoTestCase, cls).skip_checks()
-        if not CONF.compute_feature_enabled.ec2_api:
-            raise cls.skipException("The EC2 API is not available")
-        if not CONF.identity_feature_enabled.api_v2 or \
-                not CONF.identity.auth_version == 'v2':
-            raise cls.skipException("Identity v2 is not available")
-
-    @classmethod
-    def resource_setup(cls):
-        super(BotoTestCase, cls).resource_setup()
-        cls.conclusion = decision_maker()
-        # The trash contains cleanup functions and parameters in tuples
-        # (function, *args, **kwargs)
-        cls._resource_trash_bin = {}
-        cls._sequence = -1
-        if (hasattr(cls, "EC2") and
-            cls.conclusion['EC2_CAN_CONNECT_ERROR'] is not None):
-            raise cls.skipException("EC2 " + cls.__name__ + ": " +
-                                    cls.conclusion['EC2_CAN_CONNECT_ERROR'])
-        if (hasattr(cls, "S3") and
-            cls.conclusion['S3_CAN_CONNECT_ERROR'] is not None):
-            raise cls.skipException("S3 " + cls.__name__ + ": " +
-                                    cls.conclusion['S3_CAN_CONNECT_ERROR'])
-
-    @classmethod
-    def addResourceCleanUp(cls, function, *args, **kwargs):
-        """Adds CleanUp callable, used by tearDownClass.
-
-        Recommended to a use (deep)copy on the mutable args.
-        """
-        cls._sequence = cls._sequence + 1
-        cls._resource_trash_bin[cls._sequence] = (function, args, kwargs)
-        return cls._sequence
-
-    @classmethod
-    def cancelResourceCleanUp(cls, key):
-        """Cancel Clean up request."""
-        del cls._resource_trash_bin[key]
-
-    # TODO(afazekas): Add "with" context handling
-    def assertBotoError(self, excMatcher, callableObj,
-                        *args, **kwargs):
-        """Example usage:
-
-            self.assertBotoError(self.ec2_error_code.client.
-                                 InvalidKeyPair.Duplicate,
-                                 self.client.create_keypair,
-                                 key_name)
-        """
-        try:
-            callableObj(*args, **kwargs)
-        except exception.BotoServerError as exc:
-            error_msg = excMatcher.match(exc)
-            if error_msg is not None:
-                raise self.failureException(error_msg)
-        else:
-            raise self.failureException("BotoServerError not raised")
-
-    @classmethod
-    def resource_cleanup(cls):
-        """Calls the callables added by addResourceCleanUp
-
-        when you overwrite this function don't forget to call this too.
-        """
-        fail_count = 0
-        trash_keys = sorted(cls._resource_trash_bin, reverse=True)
-        for key in trash_keys:
-            (function, pos_args, kw_args) = cls._resource_trash_bin[key]
-            try:
-                func_name = friendly_function_call_str(function, *pos_args,
-                                                       **kw_args)
-                LOG.debug("Cleaning up: %s" % func_name)
-                function(*pos_args, **kw_args)
-            except BaseException:
-                fail_count += 1
-                LOG.exception("Cleanup failed %s" % func_name)
-            finally:
-                del cls._resource_trash_bin[key]
-        super(BotoTestCase, cls).resource_cleanup()
-        # NOTE(afazekas): let the super called even on exceptions
-        # The real exceptions already logged, if the super throws another,
-        # does not causes hidden issues
-        if fail_count:
-            raise exceptions.TearDownException(num=fail_count)
-
-    ec2_error_code = BotoExceptionMatcher()
-    # InsufficientInstanceCapacity can be both server and client error
-    ec2_error_code.server = ServerError()
-    ec2_error_code.client = ClientError()
-    s3_error_code = BotoExceptionMatcher()
-    s3_error_code.server = ServerError()
-    s3_error_code.client = ClientError()
-    valid_image_state = set(('available', 'pending', 'failed'))
-    # NOTE(afazekas): 'paused' is not valid status in EC2, but it does not have
-    # a good mapping, because it uses memory, but not really a running machine
-    valid_instance_state = set(('pending', 'running', 'shutting-down',
-                                'terminated', 'stopping', 'stopped', 'paused'))
-    valid_volume_status = set(('creating', 'available', 'in-use',
-                               'deleting', 'deleted', 'error'))
-    valid_snapshot_status = set(('pending', 'completed', 'error'))
-
-    gone_set = set(('_GONE',))
-
-    @classmethod
-    def get_lfunction_gone(cls, obj):
-        # NOTE: If the object is instance of a well know type returns back with
-        # with the corresponding function otherwise it assumes the obj itself
-        # is the function.
-        ec = cls.ec2_error_code
-        if isinstance(obj, ec2.instance.Instance):
-            colusure_matcher = ec.client.InvalidInstanceID.NotFound
-            status_attr = "state"
-        elif isinstance(obj, ec2.image.Image):
-            colusure_matcher = ec.client.InvalidAMIID.NotFound
-            status_attr = "state"
-        elif isinstance(obj, ec2.snapshot.Snapshot):
-            colusure_matcher = ec.client.InvalidSnapshot.NotFound
-            status_attr = "status"
-        elif isinstance(obj, ec2.volume.Volume):
-            colusure_matcher = ec.client.InvalidVolume.NotFound
-            status_attr = "status"
-        else:
-            return obj
-
-        def _status():
-            try:
-                obj.update(validate=True)
-            except ValueError:
-                return "_GONE"
-            except exception.EC2ResponseError as exc:
-                if colusure_matcher.match(exc) is None:
-                    return "_GONE"
-                else:
-                    raise
-            return getattr(obj, status_attr)
-
-        return _status
-
-    def state_wait_gone(self, lfunction, final_set, valid_set):
-        if not isinstance(final_set, set):
-            final_set = set((final_set,))
-        final_set |= self.gone_set
-        lfunction = self.get_lfunction_gone(lfunction)
-        state = wait.state_wait(lfunction, final_set, valid_set)
-        self.assertIn(state, valid_set | self.gone_set)
-        return state
-
-    def waitImageState(self, lfunction, wait_for):
-        return self.state_wait_gone(lfunction, wait_for,
-                                    self.valid_image_state)
-
-    def waitInstanceState(self, lfunction, wait_for):
-        return self.state_wait_gone(lfunction, wait_for,
-                                    self.valid_instance_state)
-
-    def waitSnapshotStatus(self, lfunction, wait_for):
-        return self.state_wait_gone(lfunction, wait_for,
-                                    self.valid_snapshot_status)
-
-    def waitVolumeStatus(self, lfunction, wait_for):
-        return self.state_wait_gone(lfunction, wait_for,
-                                    self.valid_volume_status)
-
-    def assertImageStateWait(self, lfunction, wait_for):
-        state = self.waitImageState(lfunction, wait_for)
-        self.assertIn(state, wait_for)
-
-    def assertInstanceStateWait(self, lfunction, wait_for):
-        state = self.waitInstanceState(lfunction, wait_for)
-        self.assertIn(state, wait_for)
-
-    def assertVolumeStatusWait(self, lfunction, wait_for):
-        state = self.waitVolumeStatus(lfunction, wait_for)
-        self.assertIn(state, wait_for)
-
-    def assertSnapshotStatusWait(self, lfunction, wait_for):
-        state = self.waitSnapshotStatus(lfunction, wait_for)
-        self.assertIn(state, wait_for)
-
-    def assertAddressDisassociatedWait(self, address):
-
-        def _disassociate():
-            cli = self.ec2_client
-            addresses = cli.get_all_addresses(addresses=(address.public_ip,))
-            if len(addresses) != 1:
-                return "INVALID"
-            if addresses[0].instance_id:
-                LOG.info("%s associated to %s",
-                         address.public_ip,
-                         addresses[0].instance_id)
-                return "ASSOCIATED"
-            return "DISASSOCIATED"
-
-        state = wait.state_wait(_disassociate, "DISASSOCIATED",
-                                set(("ASSOCIATED", "DISASSOCIATED")))
-        self.assertEqual(state, "DISASSOCIATED")
-
-    def assertAddressReleasedWait(self, address):
-
-        def _address_delete():
-            # NOTE(afazekas): the filter gives back IP
-            # even if it is not associated to my tenant
-            if (address.public_ip not in map(lambda a: a.public_ip,
-                self.ec2_client.get_all_addresses())):
-                    return "DELETED"
-            return "NOTDELETED"
-
-        state = wait.state_wait(_address_delete, "DELETED")
-        self.assertEqual(state, "DELETED")
-
-    def assertReSearch(self, regexp, string):
-        if re.search(regexp, string) is None:
-            raise self.failureException("regexp: '%s' not found in '%s'" %
-                                        (regexp, string))
-
-    def assertNotReSearch(self, regexp, string):
-        if re.search(regexp, string) is not None:
-            raise self.failureException("regexp: '%s' found in '%s'" %
-                                        (regexp, string))
-
-    def assertReMatch(self, regexp, string):
-        if re.match(regexp, string) is None:
-            raise self.failureException("regexp: '%s' not matches on '%s'" %
-                                        (regexp, string))
-
-    def assertNotReMatch(self, regexp, string):
-        if re.match(regexp, string) is not None:
-            raise self.failureException("regexp: '%s' matches on '%s'" %
-                                        (regexp, string))
-
-    @classmethod
-    def destroy_bucket(cls, connection_data, bucket):
-        """Destroys the bucket and its content, just for teardown."""
-        exc_num = 0
-        try:
-            with contextlib.closing(
-                    boto.connect_s3(**connection_data)) as conn:
-                if isinstance(bucket, basestring):
-                    bucket = conn.lookup(bucket)
-                    assert isinstance(bucket, s3.bucket.Bucket)
-                for obj in bucket.list():
-                    try:
-                        bucket.delete_key(obj.key)
-                        obj.close()
-                    except BaseException:
-                        LOG.exception("Failed to delete key %s " % obj.key)
-                        exc_num += 1
-            conn.delete_bucket(bucket)
-        except BaseException:
-            LOG.exception("Failed to destroy bucket %s " % bucket)
-            exc_num += 1
-        if exc_num:
-            raise exceptions.TearDownException(num=exc_num)
-
-    @classmethod
-    def destroy_reservation(cls, reservation):
-        """Terminate instances in a reservation, just for teardown."""
-        exc_num = 0
-
-        def _instance_state():
-            try:
-                instance.update(validate=True)
-            except ValueError:
-                return "_GONE"
-            except exception.EC2ResponseError as exc:
-                if cls.ec2_error_code.\
-                        client.InvalidInstanceID.NotFound.match(exc) is None:
-                    return "_GONE"
-                # NOTE(afazekas): incorrect code,
-                # but the resource must be destroyed
-                if exc.error_code == "InstanceNotFound":
-                    return "_GONE"
-
-            return instance.state
-
-        for instance in reservation.instances:
-            try:
-                instance.terminate()
-                wait.re_search_wait(_instance_state, "_GONE")
-            except BaseException:
-                LOG.exception("Failed to terminate instance %s " % instance)
-                exc_num += 1
-        if exc_num:
-            raise exceptions.TearDownException(num=exc_num)
-
-    # NOTE(afazekas): The incorrect ErrorCodes makes very, very difficult
-    # to write better teardown
-
-    @classmethod
-    def destroy_security_group_wait(cls, group):
-        """Delete group.
-
-           Use just for teardown!
-        """
-        # NOTE(afazekas): should wait/try until all related instance terminates
-        group.delete()
-
-    @classmethod
-    def destroy_volume_wait(cls, volume):
-        """Delete volume, tries to detach first.
-
-           Use just for teardown!
-        """
-        exc_num = 0
-        snaps = volume.snapshots()
-        if len(snaps):
-            LOG.critical("%s Volume has %s snapshot(s)", volume.id,
-                         map(snaps.id, snaps))
-
-        # NOTE(afazekas): detaching/attaching not valid EC2 status
-        def _volume_state():
-            volume.update(validate=True)
-            try:
-                # NOTE(gmann): Make sure volume is attached.
-                # Checking status as 'not "available"' is not enough to make
-                # sure volume is attached as it can be in "error" state
-                if volume.status == "in-use":
-                    volume.detach(force=True)
-            except BaseException:
-                LOG.exception("Failed to detach volume %s" % volume)
-                # exc_num += 1 "nonlocal" not in python2
-            return volume.status
-
-        try:
-            wait.re_search_wait(_volume_state, "available")
-            # not validates status
-            LOG.info(_volume_state())
-            volume.delete()
-        except BaseException:
-            LOG.exception("Failed to delete volume %s" % volume)
-            exc_num += 1
-        if exc_num:
-            raise exceptions.TearDownException(num=exc_num)
-
-    @classmethod
-    def destroy_snapshot_wait(cls, snapshot):
-        """delete snapshot, wait until it ceases to exist."""
-        snapshot.delete()
-
-        def _update():
-            snapshot.update(validate=True)
-
-        wait.wait_exception(_update)
-
-
-# you can specify tuples if you want to specify the status pattern
-for code in ('AddressLimitExceeded', 'AttachmentLimitExceeded', 'AuthFailure',
-             'Blocked', 'CustomerGatewayLimitExceeded', 'DependencyViolation',
-             'DiskImageSizeTooLarge', 'FilterLimitExceeded',
-             'Gateway.NotAttached', 'IdempotentParameterMismatch',
-             'IncorrectInstanceState', 'IncorrectState',
-             'InstanceLimitExceeded', 'InsufficientInstanceCapacity',
-             'InsufficientReservedInstancesCapacity',
-             'InternetGatewayLimitExceeded', 'InvalidAMIAttributeItemValue',
-             'InvalidAMIID.Malformed', 'InvalidAMIID.NotFound',
-             'InvalidAMIID.Unavailable', 'InvalidAssociationID.NotFound',
-             'InvalidAttachment.NotFound', 'InvalidConversionTaskId',
-             'InvalidCustomerGateway.DuplicateIpAddress',
-             'InvalidCustomerGatewayID.NotFound', 'InvalidDevice.InUse',
-             'InvalidDhcpOptionsID.NotFound', 'InvalidFormat',
-             'InvalidFilter', 'InvalidGatewayID.NotFound',
-             'InvalidGroup.Duplicate', 'InvalidGroupId.Malformed',
-             'InvalidGroup.InUse', 'InvalidGroup.NotFound',
-             'InvalidGroup.Reserved', 'InvalidInstanceID.Malformed',
-             'InvalidInstanceID.NotFound',
-             'InvalidInternetGatewayID.NotFound', 'InvalidIPAddress.InUse',
-             'InvalidKeyPair.Duplicate', 'InvalidKeyPair.Format',
-             'InvalidKeyPair.NotFound', 'InvalidManifest',
-             'InvalidNetworkAclEntry.NotFound',
-             'InvalidNetworkAclID.NotFound', 'InvalidParameterCombination',
-             'InvalidParameterValue', 'InvalidPermission.Duplicate',
-             'InvalidPermission.Malformed', 'InvalidReservationID.Malformed',
-             'InvalidReservationID.NotFound', 'InvalidRoute.NotFound',
-             'InvalidRouteTableID.NotFound',
-             'InvalidSecurity.RequestHasExpired',
-             'InvalidSnapshotID.Malformed', 'InvalidSnapshot.NotFound',
-             'InvalidUserID.Malformed', 'InvalidReservedInstancesId',
-             'InvalidReservedInstancesOfferingId',
-             'InvalidSubnetID.NotFound', 'InvalidVolumeID.Duplicate',
-             'InvalidVolumeID.Malformed', 'InvalidVolumeID.ZoneMismatch',
-             'InvalidVolume.NotFound', 'InvalidVpcID.NotFound',
-             'InvalidVpnConnectionID.NotFound',
-             'InvalidVpnGatewayID.NotFound',
-             'InvalidZone.NotFound', 'LegacySecurityGroup',
-             'MissingParameter', 'NetworkAclEntryAlreadyExists',
-             'NetworkAclEntryLimitExceeded', 'NetworkAclLimitExceeded',
-             'NonEBSInstance', 'PendingSnapshotLimitExceeded',
-             'PendingVerification', 'OptInRequired', 'RequestLimitExceeded',
-             'ReservedInstancesLimitExceeded', 'Resource.AlreadyAssociated',
-             'ResourceLimitExceeded', 'RouteAlreadyExists',
-             'RouteLimitExceeded', 'RouteTableLimitExceeded',
-             'RulesPerSecurityGroupLimitExceeded',
-             'SecurityGroupLimitExceeded',
-             'SecurityGroupsPerInstanceLimitExceeded',
-             'SnapshotLimitExceeded', 'SubnetLimitExceeded',
-             'UnknownParameter', 'UnsupportedOperation',
-             'VolumeLimitExceeded', 'VpcLimitExceeded',
-             'VpnConnectionLimitExceeded',
-             'VpnGatewayAttachmentLimitExceeded', 'VpnGatewayLimitExceeded'):
-    _add_matcher_class(BotoTestCase.ec2_error_code.client,
-                       code, base=ClientError)
-
-for code in ('InsufficientAddressCapacity', 'InsufficientInstanceCapacity',
-             'InsufficientReservedInstanceCapacity', 'InternalError',
-             'Unavailable'):
-    _add_matcher_class(BotoTestCase.ec2_error_code.server,
-                       code, base=ServerError)
-
-
-for code in (('AccessDenied', 403),
-             ('AccountProblem', 403),
-             ('AmbiguousGrantByEmailAddress', 400),
-             ('BadDigest', 400),
-             ('BucketAlreadyExists', 409),
-             ('BucketAlreadyOwnedByYou', 409),
-             ('BucketNotEmpty', 409),
-             ('CredentialsNotSupported', 400),
-             ('CrossLocationLoggingProhibited', 403),
-             ('EntityTooSmall', 400),
-             ('EntityTooLarge', 400),
-             ('ExpiredToken', 400),
-             ('IllegalVersioningConfigurationException', 400),
-             ('IncompleteBody', 400),
-             ('IncorrectNumberOfFilesInPostRequest', 400),
-             ('InlineDataTooLarge', 400),
-             ('InvalidAccessKeyId', 403),
-             'InvalidAddressingHeader',
-             ('InvalidArgument', 400),
-             ('InvalidBucketName', 400),
-             ('InvalidBucketState', 409),
-             ('InvalidDigest', 400),
-             ('InvalidLocationConstraint', 400),
-             ('InvalidPart', 400),
-             ('InvalidPartOrder', 400),
-             ('InvalidPayer', 403),
-             ('InvalidPolicyDocument', 400),
-             ('InvalidRange', 416),
-             ('InvalidRequest', 400),
-             ('InvalidSecurity', 403),
-             ('InvalidSOAPRequest', 400),
-             ('InvalidStorageClass', 400),
-             ('InvalidTargetBucketForLogging', 400),
-             ('InvalidToken', 400),
-             ('InvalidURI', 400),
-             ('KeyTooLong', 400),
-             ('MalformedACLError', 400),
-             ('MalformedPOSTRequest', 400),
-             ('MalformedXML', 400),
-             ('MaxMessageLengthExceeded', 400),
-             ('MaxPostPreDataLengthExceededError', 400),
-             ('MetadataTooLarge', 400),
-             ('MethodNotAllowed', 405),
-             ('MissingAttachment'),
-             ('MissingContentLength', 411),
-             ('MissingRequestBodyError', 400),
-             ('MissingSecurityElement', 400),
-             ('MissingSecurityHeader', 400),
-             ('NoLoggingStatusForKey', 400),
-             ('NoSuchBucket', 404),
-             ('NoSuchKey', 404),
-             ('NoSuchLifecycleConfiguration', 404),
-             ('NoSuchUpload', 404),
-             ('NoSuchVersion', 404),
-             ('NotSignedUp', 403),
-             ('NotSuchBucketPolicy', 404),
-             ('OperationAborted', 409),
-             ('PermanentRedirect', 301),
-             ('PreconditionFailed', 412),
-             ('Redirect', 307),
-             ('RequestIsNotMultiPartContent', 400),
-             ('RequestTimeout', 400),
-             ('RequestTimeTooSkewed', 403),
-             ('RequestTorrentOfBucketError', 400),
-             ('SignatureDoesNotMatch', 403),
-             ('TemporaryRedirect', 307),
-             ('TokenRefreshRequired', 400),
-             ('TooManyBuckets', 400),
-             ('UnexpectedContent', 400),
-             ('UnresolvableGrantByEmailAddress', 400),
-             ('UserKeyMustBeSpecified', 400)):
-    _add_matcher_class(BotoTestCase.s3_error_code.client,
-                       code, base=ClientError)
-
-
-for code in (('InternalError', 500),
-             ('NotImplemented', 501),
-             ('ServiceUnavailable', 503),
-             ('SlowDown', 503)):
-    _add_matcher_class(BotoTestCase.s3_error_code.server,
-                       code, base=ServerError)
diff --git a/tempest/thirdparty/boto/test_ec2_instance_run.py b/tempest/thirdparty/boto/test_ec2_instance_run.py
deleted file mode 100644
index 6c1b362..0000000
--- a/tempest/thirdparty/boto/test_ec2_instance_run.py
+++ /dev/null
@@ -1,363 +0,0 @@
-# Copyright 2012 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.
-
-from oslo_log import log as logging
-
-from tempest.common.utils import data_utils
-from tempest.common.utils.linux import remote_client
-from tempest import config
-from tempest import exceptions
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-from tempest.thirdparty.boto.utils import s3
-from tempest.thirdparty.boto.utils import wait
-
-CONF = config.CONF
-
-LOG = logging.getLogger(__name__)
-
-
-class InstanceRunTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def setup_clients(cls):
-        super(InstanceRunTest, cls).setup_clients()
-        cls.s3_client = cls.os.s3_client
-        cls.ec2_client = cls.os.ec2api_client
-
-    @classmethod
-    def resource_setup(cls):
-        super(InstanceRunTest, cls).resource_setup()
-        if not cls.conclusion['A_I_IMAGES_READY']:
-            raise cls.skipException("".join(("EC2 ", cls.__name__,
-                                    ": requires ami/aki/ari manifest")))
-        cls.zone = CONF.boto.aws_zone
-        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)
-        cls.addResourceCleanUp(cls.ec2_client.delete_key_pair,
-                               cls.keypair_name)
-        bucket = cls.s3_client.create_bucket(cls.bucket_name)
-        cls.addResourceCleanUp(cls.destroy_bucket,
-                               cls.s3_client.connection_data,
-                               cls.bucket_name)
-        s3.s3_upload_dir(bucket, cls.materials_path)
-        cls.images = {"ami":
-                      {"name": data_utils.rand_name("ami-name"),
-                       "location": cls.bucket_name + "/" + ami_manifest},
-                      "aki":
-                      {"name": data_utils.rand_name("aki-name"),
-                       "location": cls.bucket_name + "/" + aki_manifest},
-                      "ari":
-                      {"name": data_utils.rand_name("ari-name"),
-                       "location": cls.bucket_name + "/" + ari_manifest}}
-        for image_type in ("aki", "ari"):
-            image = cls.images[image_type]
-            image["image_id"] = cls.ec2_client.register_image(
-                name=image["name"],
-                image_location=image["location"])
-            cls.addResourceCleanUp(cls.ec2_client.deregister_image,
-                                   image["image_id"])
-        image = cls.images["ami"]
-        image["image_id"] = cls.ec2_client.register_image(
-            name=image["name"],
-            image_location=image["location"],
-            kernel_id=cls.images["aki"]["image_id"],
-            ramdisk_id=cls.images["ari"]["image_id"])
-        cls.addResourceCleanUp(cls.ec2_client.deregister_image,
-                               image["image_id"])
-
-        for image in cls.images.itervalues():
-            def _state():
-                retr = cls.ec2_client.get_image(image["image_id"])
-                return retr.state
-            state = wait.state_wait(_state, "available")
-            if state != "available":
-                for _image in cls.images.itervalues():
-                    cls.ec2_client.deregister_image(_image["image_id"])
-                raise exceptions.EC2RegisterImageException(
-                    image_id=image["image_id"])
-
-    def _terminate_reservation(self, reservation, rcuk):
-        for instance in reservation.instances:
-            instance.terminate()
-        for instance in reservation.instances:
-            self.assertInstanceStateWait(instance, '_GONE')
-        self.cancelResourceCleanUp(rcuk)
-
-    @test.idempotent_id('c881fbb7-d56e-4054-9d76-1c3a60a207b0')
-    def test_run_idempotent_instances(self):
-        # EC2 run instances idempotently
-
-        def _run_instance(client_token):
-            reservation = self.ec2_client.run_instances(
-                image_id=self.images["ami"]["image_id"],
-                kernel_id=self.images["aki"]["image_id"],
-                ramdisk_id=self.images["ari"]["image_id"],
-                instance_type=self.instance_type,
-                client_token=client_token)
-            rcuk = self.addResourceCleanUp(self.destroy_reservation,
-                                           reservation)
-            return (reservation, rcuk)
-
-        reservation_1, rcuk_1 = _run_instance('token_1')
-        reservation_2, rcuk_2 = _run_instance('token_2')
-        reservation_1a, rcuk_1a = _run_instance('token_1')
-
-        self.assertIsNotNone(reservation_1)
-        self.assertIsNotNone(reservation_2)
-        self.assertIsNotNone(reservation_1a)
-
-        # same reservation for token_1
-        self.assertEqual(reservation_1.id, reservation_1a.id)
-
-        # Cancel cleanup -- since it's a duplicate, it's
-        # handled by rcuk1
-        self.cancelResourceCleanUp(rcuk_1a)
-
-        self._terminate_reservation(reservation_1, rcuk_1)
-        self._terminate_reservation(reservation_2, rcuk_2)
-
-    @test.idempotent_id('2ea26a39-f96c-48fc-8374-5c10ec184c67')
-    def test_run_stop_terminate_instance(self):
-        # EC2 run, stop and terminate instance
-        image_ami = self.ec2_client.get_image(self.images["ami"]
-                                              ["image_id"])
-        reservation = image_ami.run(kernel_id=self.images["aki"]["image_id"],
-                                    ramdisk_id=self.images["ari"]["image_id"],
-                                    instance_type=self.instance_type)
-        rcuk = self.addResourceCleanUp(self.destroy_reservation, reservation)
-
-        for instance in reservation.instances:
-            LOG.info("state: %s", instance.state)
-            if instance.state != "running":
-                self.assertInstanceStateWait(instance, "running")
-
-        for instance in reservation.instances:
-            instance.stop()
-            LOG.info("state: %s", instance.state)
-            if instance.state != "stopped":
-                self.assertInstanceStateWait(instance, "stopped")
-
-        self._terminate_reservation(reservation, rcuk)
-
-    @test.idempotent_id('3d77225a-5cec-4e54-a017-9ebf11a266e6')
-    def test_run_stop_terminate_instance_with_tags(self):
-        # EC2 run, stop and terminate instance with tags
-        image_ami = self.ec2_client.get_image(self.images["ami"]
-                                              ["image_id"])
-        reservation = image_ami.run(kernel_id=self.images["aki"]["image_id"],
-                                    ramdisk_id=self.images["ari"]["image_id"],
-                                    instance_type=self.instance_type)
-        rcuk = self.addResourceCleanUp(self.destroy_reservation, reservation)
-
-        for instance in reservation.instances:
-            LOG.info("state: %s", instance.state)
-            if instance.state != "running":
-                self.assertInstanceStateWait(instance, "running")
-            instance.add_tag('key1', value='value1')
-
-        tags = self.ec2_client.get_all_tags()
-        td = dict((item.name, item.value) for item in tags)
-
-        self.assertIn('key1', td)
-        self.assertEqual('value1', td['key1'])
-
-        tags = self.ec2_client.get_all_tags(filters={'key': 'key1'})
-        td = dict((item.name, item.value) for item in tags)
-        self.assertIn('key1', td)
-        self.assertEqual('value1', td['key1'])
-
-        tags = self.ec2_client.get_all_tags(filters={'value': 'value1'})
-        td = dict((item.name, item.value) for item in tags)
-        self.assertIn('key1', td)
-        self.assertEqual('value1', td['key1'])
-
-        tags = self.ec2_client.get_all_tags(filters={'key': 'value2'})
-        td = dict((item.name, item.value) for item in tags)
-        self.assertNotIn('key1', td)
-
-        for instance in reservation.instances:
-            instance.remove_tag('key1', value='value1')
-
-        tags = self.ec2_client.get_all_tags()
-
-        # NOTE: Volume-attach and detach causes metadata (tags) to be created
-        # for the volume. So exclude them while asserting.
-        self.assertNotIn('key1', tags)
-
-        for instance in reservation.instances:
-            instance.stop()
-            LOG.info("state: %s", instance.state)
-            if instance.state != "stopped":
-                self.assertInstanceStateWait(instance, "stopped")
-
-        self._terminate_reservation(reservation, rcuk)
-
-    @test.idempotent_id('252945b5-3294-4fda-ae21-928a42f63f76')
-    def test_run_terminate_instance(self):
-        # EC2 run, terminate immediately
-        image_ami = self.ec2_client.get_image(self.images["ami"]
-                                              ["image_id"])
-        reservation = image_ami.run(kernel_id=self.images["aki"]["image_id"],
-                                    ramdisk_id=self.images["ari"]["image_id"],
-                                    instance_type=self.instance_type)
-
-        for instance in reservation.instances:
-            instance.terminate()
-        self.assertInstanceStateWait(instance, '_GONE')
-
-    @test.idempotent_id('ab836c29-737b-4101-9fb9-87045eaf89e9')
-    def test_compute_with_volumes(self):
-        # EC2 1. integration test (not strict)
-        image_ami = self.ec2_client.get_image(self.images["ami"]["image_id"])
-        sec_group_name = data_utils.rand_name("securitygroup")
-        group_desc = sec_group_name + " security group description "
-        security_group = self.ec2_client.create_security_group(sec_group_name,
-                                                               group_desc)
-        self.addResourceCleanUp(self.destroy_security_group_wait,
-                                security_group)
-        self.assertTrue(
-            self.ec2_client.authorize_security_group(
-                sec_group_name,
-                ip_protocol="icmp",
-                cidr_ip="0.0.0.0/0",
-                from_port=-1,
-                to_port=-1))
-        self.assertTrue(
-            self.ec2_client.authorize_security_group(
-                sec_group_name,
-                ip_protocol="tcp",
-                cidr_ip="0.0.0.0/0",
-                from_port=22,
-                to_port=22))
-        reservation = image_ami.run(kernel_id=self.images["aki"]["image_id"],
-                                    ramdisk_id=self.images["ari"]["image_id"],
-                                    instance_type=self.instance_type,
-                                    key_name=self.keypair_name,
-                                    security_groups=(sec_group_name,))
-
-        LOG.debug("Instance booted - state: %s",
-                  reservation.instances[0].state)
-
-        self.addResourceCleanUp(self.destroy_reservation,
-                                reservation)
-        volume = self.ec2_client.create_volume(CONF.volume.volume_size,
-                                               self.zone)
-        LOG.debug("Volume created - status: %s", volume.status)
-
-        self.addResourceCleanUp(self.destroy_volume_wait, volume)
-        instance = reservation.instances[0]
-        if instance.state != "running":
-            self.assertInstanceStateWait(instance, "running")
-        LOG.debug("Instance now running - state: %s", instance.state)
-
-        address = self.ec2_client.allocate_address()
-        rcuk_a = self.addResourceCleanUp(address.delete)
-        self.assertTrue(address.associate(instance.id))
-
-        rcuk_da = self.addResourceCleanUp(address.disassociate)
-        # TODO(afazekas): ping test. dependecy/permission ?
-
-        self.assertVolumeStatusWait(volume, "available")
-        # NOTE(afazekas): it may be reports available before it is available
-
-        ssh = remote_client.RemoteClient(address.public_ip,
-                                         CONF.compute.ssh_user,
-                                         pkey=self.keypair.material)
-        text = data_utils.rand_name("Pattern text for console output")
-        try:
-            resp = ssh.write_to_console(text)
-        except Exception:
-            if not CONF.compute_feature_enabled.console_output:
-                LOG.debug('Console output not supported, cannot log')
-            else:
-                console_output = instance.get_console_output().output
-                LOG.debug('Console output for %s\nbody=\n%s',
-                          instance.id, console_output)
-            raise
-
-        self.assertFalse(resp)
-
-        def _output():
-            output = instance.get_console_output()
-            return output.output
-
-        wait.re_search_wait(_output, text)
-        part_lines = ssh.get_partitions().split('\n')
-        volume.attach(instance.id, "/dev/vdh")
-
-        def _volume_state():
-            """Return volume state realizing that 'in-use' is overloaded."""
-            volume.update(validate=True)
-            status = volume.status
-            attached = volume.attach_data.status
-            LOG.debug("Volume %s is in status: %s, attach_status: %s",
-                      volume.id, status, attached)
-            # Nova reports 'in-use' on 'attaching' volumes because we
-            # have a single volume status, and EC2 has 2. Ensure that
-            # if we aren't attached yet we return something other than
-            # 'in-use'
-            if status == 'in-use' and attached != 'attached':
-                return 'attaching'
-            else:
-                return status
-
-        wait.re_search_wait(_volume_state, "in-use")
-
-        # NOTE(afazekas):  Different Hypervisor backends names
-        # differently the devices,
-        # now we just test is the partition number increased/decrised
-
-        def _part_state():
-            current = ssh.get_partitions().split('\n')
-            LOG.debug("Partition map for instance: %s", current)
-            if current > part_lines:
-                return 'INCREASE'
-            if current < part_lines:
-                return 'DECREASE'
-            return 'EQUAL'
-
-        wait.state_wait(_part_state, 'INCREASE')
-        part_lines = ssh.get_partitions().split('\n')
-
-        # TODO(afazekas): Resource compare to the flavor settings
-
-        volume.detach()
-
-        self.assertVolumeStatusWait(volume, "available")
-
-        wait.state_wait(_part_state, 'DECREASE')
-
-        instance.stop()
-        address.disassociate()
-        self.assertAddressDisassociatedWait(address)
-        self.cancelResourceCleanUp(rcuk_da)
-        address.release()
-        self.assertAddressReleasedWait(address)
-        self.cancelResourceCleanUp(rcuk_a)
-
-        LOG.debug("Instance %s state: %s", instance.id, instance.state)
-        if instance.state != "stopped":
-            self.assertInstanceStateWait(instance, "stopped")
-        # TODO(afazekas): move steps from teardown to the test case
-
-
-# TODO(afazekas): Snapshot/volume read/write test case
diff --git a/tempest/thirdparty/boto/test_ec2_keys.py b/tempest/thirdparty/boto/test_ec2_keys.py
deleted file mode 100644
index 1b58cb4..0000000
--- a/tempest/thirdparty/boto/test_ec2_keys.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2012 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.
-
-from tempest.common.utils import data_utils
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-
-
-def compare_key_pairs(a, b):
-    return (a.name == b.name and
-            a.fingerprint == b.fingerprint)
-
-
-class EC2KeysTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def setup_clients(cls):
-        super(EC2KeysTest, cls).setup_clients()
-        cls.client = cls.os.ec2api_client
-
-    @classmethod
-    def resource_setup(cls):
-        super(EC2KeysTest, cls).resource_setup()
-        cls.ec = cls.ec2_error_code
-
-# TODO(afazekas): merge create, delete, get test cases
-    @test.idempotent_id('54236804-01b7-4cfe-a6f9-bce1340feec8')
-    def test_create_ec2_keypair(self):
-        # EC2 create KeyPair
-        key_name = data_utils.rand_name("keypair")
-        self.addResourceCleanUp(self.client.delete_key_pair, key_name)
-        keypair = self.client.create_key_pair(key_name)
-        self.assertTrue(compare_key_pairs(keypair,
-                        self.client.get_key_pair(key_name)))
-
-    @test.idempotent_id('3283b898-f90c-4952-b238-3e42b8c3f34f')
-    def test_delete_ec2_keypair(self):
-        # EC2 delete KeyPair
-        key_name = data_utils.rand_name("keypair")
-        self.client.create_key_pair(key_name)
-        self.client.delete_key_pair(key_name)
-        self.assertIsNone(self.client.get_key_pair(key_name))
-
-    @test.idempotent_id('fd89bd26-4d4d-4cf3-a303-65dd9158fcdc')
-    def test_get_ec2_keypair(self):
-        # EC2 get KeyPair
-        key_name = data_utils.rand_name("keypair")
-        self.addResourceCleanUp(self.client.delete_key_pair, key_name)
-        keypair = self.client.create_key_pair(key_name)
-        self.assertTrue(compare_key_pairs(keypair,
-                        self.client.get_key_pair(key_name)))
-
-    @test.idempotent_id('daa73da1-e11c-4558-8d76-a716be79a401')
-    def test_duplicate_ec2_keypair(self):
-        # EC2 duplicate KeyPair
-        key_name = data_utils.rand_name("keypair")
-        self.addResourceCleanUp(self.client.delete_key_pair, key_name)
-        keypair = self.client.create_key_pair(key_name)
-        self.assertBotoError(self.ec.client.InvalidKeyPair.Duplicate,
-                             self.client.create_key_pair,
-                             key_name)
-        self.assertTrue(compare_key_pairs(keypair,
-                        self.client.get_key_pair(key_name)))
diff --git a/tempest/thirdparty/boto/test_ec2_security_groups.py b/tempest/thirdparty/boto/test_ec2_security_groups.py
deleted file mode 100644
index 594dc8b..0000000
--- a/tempest/thirdparty/boto/test_ec2_security_groups.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright 2012 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.
-
-from tempest.common.utils import data_utils
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-
-
-class EC2SecurityGroupTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def setup_clients(cls):
-        super(EC2SecurityGroupTest, cls).setup_clients()
-        cls.client = cls.os.ec2api_client
-
-    @test.idempotent_id('519b566e-0c38-4629-905e-7d6b6355f524')
-    def test_create_authorize_security_group(self):
-        # EC2 Create, authorize/revoke security group
-        group_name = data_utils.rand_name("securty_group")
-        group_description = group_name + " security group description "
-        group = self.client.create_security_group(group_name,
-                                                  group_description)
-        self.addResourceCleanUp(self.client.delete_security_group, group_name)
-        groups_get = self.client.get_all_security_groups(
-            groupnames=(group_name,))
-        self.assertEqual(len(groups_get), 1)
-        group_get = groups_get[0]
-        self.assertEqual(group.name, group_get.name)
-        self.assertEqual(group.name, group_get.name)
-        # ping (icmp_echo) and other icmp allowed from everywhere
-        # from_port and to_port act as icmp type
-        success = self.client.authorize_security_group(group_name,
-                                                       ip_protocol="icmp",
-                                                       cidr_ip="0.0.0.0/0",
-                                                       from_port=-1,
-                                                       to_port=-1)
-        self.assertTrue(success)
-        # allow standard ssh port from anywhere
-        success = self.client.authorize_security_group(group_name,
-                                                       ip_protocol="tcp",
-                                                       cidr_ip="0.0.0.0/0",
-                                                       from_port=22,
-                                                       to_port=22)
-        self.assertTrue(success)
-        # TODO(afazekas): Duplicate tests
-        group_get = self.client.get_all_security_groups(
-            groupnames=(group_name,))[0]
-        # remove listed rules
-        for ip_permission in group_get.rules:
-            for cidr in ip_permission.grants:
-                self.assertTrue(self.client.revoke_security_group(group_name,
-                                ip_protocol=ip_permission.ip_protocol,
-                                cidr_ip=cidr,
-                                from_port=ip_permission.from_port,
-                                to_port=ip_permission.to_port))
-
-        group_get = self.client.get_all_security_groups(
-            groupnames=(group_name,))[0]
-        # all rules should be removed now
-        self.assertEqual(0, len(group_get.rules))
diff --git a/tempest/thirdparty/boto/test_ec2_volumes.py b/tempest/thirdparty/boto/test_ec2_volumes.py
deleted file mode 100644
index 483d4c3..0000000
--- a/tempest/thirdparty/boto/test_ec2_volumes.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2012 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.
-
-from oslo_log import log as logging
-
-from tempest import config
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-
-CONF = config.CONF
-LOG = logging.getLogger(__name__)
-
-
-def compare_volumes(a, b):
-    return (a.id == b.id and
-            a.size == b.size)
-
-
-class EC2VolumesTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def skip_checks(cls):
-        super(EC2VolumesTest, cls).skip_checks()
-        if not CONF.service_available.cinder:
-            skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
-            raise cls.skipException(skip_msg)
-
-    @classmethod
-    def setup_clients(cls):
-        super(EC2VolumesTest, cls).setup_clients()
-        cls.client = cls.os.ec2api_client
-
-    @classmethod
-    def resource_setup(cls):
-        super(EC2VolumesTest, cls).resource_setup()
-        cls.zone = CONF.boto.aws_zone
-
-    @test.idempotent_id('663f0077-c743-48ad-8ae0-46821cbc0918')
-    def test_create_get_delete(self):
-        # EC2 Create, get, delete Volume
-        volume = self.client.create_volume(CONF.volume.volume_size, self.zone)
-        cuk = self.addResourceCleanUp(self.client.delete_volume, volume.id)
-        self.assertIn(volume.status, self.valid_volume_status)
-        retrieved = self.client.get_all_volumes((volume.id,))
-        self.assertEqual(1, len(retrieved))
-        self.assertTrue(compare_volumes(volume, retrieved[0]))
-        self.assertVolumeStatusWait(volume, "available")
-        self.client.delete_volume(volume.id)
-        self.cancelResourceCleanUp(cuk)
-
-    @test.idempotent_id('c6b60d7a-1af7-4f8e-af21-d539d9496149')
-    def test_create_volume_from_snapshot(self):
-        # EC2 Create volume from snapshot
-        volume = self.client.create_volume(CONF.volume.volume_size, self.zone)
-        self.addResourceCleanUp(self.client.delete_volume, volume.id)
-        self.assertVolumeStatusWait(volume, "available")
-        snap = self.client.create_snapshot(volume.id)
-        self.addResourceCleanUp(self.destroy_snapshot_wait, snap)
-        self.assertSnapshotStatusWait(snap, "completed")
-
-        svol = self.client.create_volume(CONF.volume.volume_size, self.zone,
-                                         snapshot=snap)
-        cuk = self.addResourceCleanUp(svol.delete)
-        self.assertVolumeStatusWait(svol, "available")
-        svol.delete()
-        self.cancelResourceCleanUp(cuk)
diff --git a/tempest/thirdparty/boto/test_s3_buckets.py b/tempest/thirdparty/boto/test_s3_buckets.py
deleted file mode 100644
index f008973..0000000
--- a/tempest/thirdparty/boto/test_s3_buckets.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2012 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.
-
-from tempest.common.utils import data_utils
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-
-
-class S3BucketsTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def setup_clients(cls):
-        super(S3BucketsTest, cls).setup_clients()
-        cls.client = cls.os.s3_client
-
-    @test.idempotent_id('4678525d-8da0-4518-81c1-f1f67d595b00')
-    def test_create_and_get_delete_bucket(self):
-        # S3 Create, get and delete bucket
-        bucket_name = data_utils.rand_name("s3bucket")
-        cleanup_key = self.addResourceCleanUp(self.client.delete_bucket,
-                                              bucket_name)
-        bucket = self.client.create_bucket(bucket_name)
-        self.assertTrue(bucket.name == bucket_name)
-        bucket = self.client.get_bucket(bucket_name)
-        self.assertTrue(bucket.name == bucket_name)
-        self.client.delete_bucket(bucket_name)
-        self.assertBotoError(self.s3_error_code.client.NoSuchBucket,
-                             self.client.get_bucket, bucket_name)
-        self.cancelResourceCleanUp(cleanup_key)
diff --git a/tempest/thirdparty/boto/test_s3_ec2_images.py b/tempest/thirdparty/boto/test_s3_ec2_images.py
deleted file mode 100644
index c41c7ac..0000000
--- a/tempest/thirdparty/boto/test_s3_ec2_images.py
+++ /dev/null
@@ -1,126 +0,0 @@
-# Copyright 2012 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 os
-
-from tempest.common.utils import data_utils
-from tempest import config
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-from tempest.thirdparty.boto.utils import s3
-
-CONF = config.CONF
-
-
-class S3ImagesTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def setup_clients(cls):
-        super(S3ImagesTest, cls).setup_clients()
-        cls.s3_client = cls.os.s3_client
-        cls.images_client = cls.os.ec2api_client
-
-    @classmethod
-    def resource_setup(cls):
-        super(S3ImagesTest, cls).resource_setup()
-        if not cls.conclusion['A_I_IMAGES_READY']:
-            raise cls.skipException("".join(("EC2 ", cls.__name__,
-                                    ": requires ami/aki/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
-        cls.bucket_name = data_utils.rand_name("bucket")
-        bucket = cls.s3_client.create_bucket(cls.bucket_name)
-        cls.addResourceCleanUp(cls.destroy_bucket,
-                               cls.s3_client.connection_data,
-                               cls.bucket_name)
-        s3.s3_upload_dir(bucket, cls.materials_path)
-
-    @test.idempotent_id('f9d360a5-0188-4c77-9db2-4c34c28d12a5')
-    def test_register_get_deregister_ami_image(self):
-        # Register and deregister ami image
-        image = {"name": data_utils.rand_name("ami-name"),
-                 "location": self.bucket_name + "/" + self.ami_manifest,
-                 "type": "ami"}
-        image["image_id"] = self.images_client.register_image(
-            name=image["name"],
-            image_location=image["location"])
-        # NOTE(afazekas): delete_snapshot=True might trigger boto lib? bug
-        image["cleanUp"] = self.addResourceCleanUp(
-            self.images_client.deregister_image,
-            image["image_id"])
-        self.assertEqual(image["image_id"][0:3], image["type"])
-        retrieved_image = self.images_client.get_image(image["image_id"])
-        self.assertTrue(retrieved_image.name == image["name"])
-        self.assertTrue(retrieved_image.id == image["image_id"])
-        if retrieved_image.state != "available":
-            self.assertImageStateWait(retrieved_image, "available")
-        self.images_client.deregister_image(image["image_id"])
-        self.assertNotIn(image["image_id"], str(
-            self.images_client.get_all_images()))
-        self.cancelResourceCleanUp(image["cleanUp"])
-
-    @test.idempotent_id('42cca5b0-453b-4618-b99f-dbc039db426f')
-    def test_register_get_deregister_aki_image(self):
-        # Register and deregister aki image
-        image = {"name": data_utils.rand_name("aki-name"),
-                 "location": self.bucket_name + "/" + self.aki_manifest,
-                 "type": "aki"}
-        image["image_id"] = self.images_client.register_image(
-            name=image["name"],
-            image_location=image["location"])
-        image["cleanUp"] = self.addResourceCleanUp(
-            self.images_client.deregister_image,
-            image["image_id"])
-        self.assertEqual(image["image_id"][0:3], image["type"])
-        retrieved_image = self.images_client.get_image(image["image_id"])
-        self.assertTrue(retrieved_image.name == image["name"])
-        self.assertTrue(retrieved_image.id == image["image_id"])
-        self.assertIn(retrieved_image.state, self.valid_image_state)
-        if retrieved_image.state != "available":
-            self.assertImageStateWait(retrieved_image, "available")
-        self.images_client.deregister_image(image["image_id"])
-        self.assertNotIn(image["image_id"], str(
-            self.images_client.get_all_images()))
-        self.cancelResourceCleanUp(image["cleanUp"])
-
-    @test.idempotent_id('1359e860-841c-43bb-80f3-bb389cbfd81d')
-    def test_register_get_deregister_ari_image(self):
-        # Register and deregister ari image
-        image = {"name": data_utils.rand_name("ari-name"),
-                 "location": "/" + self.bucket_name + "/" + self.ari_manifest,
-                 "type": "ari"}
-        image["image_id"] = self.images_client.register_image(
-            name=image["name"],
-            image_location=image["location"])
-        image["cleanUp"] = self.addResourceCleanUp(
-            self.images_client.deregister_image,
-            image["image_id"])
-        self.assertEqual(image["image_id"][0:3], image["type"])
-        retrieved_image = self.images_client.get_image(image["image_id"])
-        self.assertIn(retrieved_image.state, self.valid_image_state)
-        if retrieved_image.state != "available":
-            self.assertImageStateWait(retrieved_image, "available")
-        self.assertIn(retrieved_image.state, self.valid_image_state)
-        self.assertTrue(retrieved_image.name == image["name"])
-        self.assertTrue(retrieved_image.id == image["image_id"])
-        self.images_client.deregister_image(image["image_id"])
-        self.cancelResourceCleanUp(image["cleanUp"])
-
-# TODO(afazekas): less copy-paste style
diff --git a/tempest/thirdparty/boto/test_s3_objects.py b/tempest/thirdparty/boto/test_s3_objects.py
deleted file mode 100644
index c42d85c..0000000
--- a/tempest/thirdparty/boto/test_s3_objects.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2012 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 contextlib
-
-import boto.s3.key
-
-from tempest.common.utils import data_utils
-from tempest import test
-from tempest.thirdparty.boto import test as boto_test
-
-
-class S3BucketsTest(boto_test.BotoTestCase):
-
-    @classmethod
-    def setup_clients(cls):
-        super(S3BucketsTest, cls).setup_clients()
-        cls.client = cls.os.s3_client
-
-    @test.idempotent_id('4eea567a-b46a-405b-a475-6097e1faebde')
-    def test_create_get_delete_object(self):
-        # S3 Create, get and delete object
-        bucket_name = data_utils.rand_name("s3bucket")
-        object_name = data_utils.rand_name("s3object")
-        content = 'x' * 42
-        bucket = self.client.create_bucket(bucket_name)
-        self.addResourceCleanUp(self.destroy_bucket,
-                                self.client.connection_data,
-                                bucket_name)
-
-        self.assertTrue(bucket.name == bucket_name)
-        with contextlib.closing(boto.s3.key.Key(bucket)) as key:
-            key.key = object_name
-            key.set_contents_from_string(content)
-            readback = key.get_contents_as_string()
-            self.assertTrue(readback == content)
-            bucket.delete_key(key)
-            self.assertBotoError(self.s3_error_code.client.NoSuchKey,
-                                 key.get_contents_as_string)
diff --git a/tempest/thirdparty/boto/utils/__init__.py b/tempest/thirdparty/boto/utils/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/thirdparty/boto/utils/__init__.py
+++ /dev/null
diff --git a/tempest/thirdparty/boto/utils/s3.py b/tempest/thirdparty/boto/utils/s3.py
deleted file mode 100644
index 55c1b0a..0000000
--- a/tempest/thirdparty/boto/utils/s3.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2012 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 contextlib
-import os
-import re
-
-import boto
-import boto.s3.key
-
-from oslo_log import log as logging
-
-LOG = logging.getLogger(__name__)
-
-
-def s3_upload_dir(bucket, path, prefix="", connection_data=None):
-    if isinstance(bucket, basestring):
-        with contextlib.closing(boto.connect_s3(**connection_data)) as conn:
-            bucket = conn.lookup(bucket)
-    for root, dirs, files in os.walk(path):
-        for fil in files:
-            with contextlib.closing(boto.s3.key.Key(bucket)) as key:
-                source = root + os.sep + fil
-                target = re.sub("^" + re.escape(path) + "?/", prefix, source)
-                if os.sep != '/':
-                    target = re.sub(re.escape(os.sep), '/', target)
-                key.key = target
-                LOG.info("Uploading %s to %s/%s", source, bucket.name, target)
-                key.set_contents_from_filename(source)
diff --git a/tempest/thirdparty/boto/utils/wait.py b/tempest/thirdparty/boto/utils/wait.py
deleted file mode 100644
index 8771ed7..0000000
--- a/tempest/thirdparty/boto/utils/wait.py
+++ /dev/null
@@ -1,125 +0,0 @@
-# Copyright 2012 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 re
-import time
-
-import boto.exception
-from oslo_log import log as logging
-import testtools
-
-from tempest import config
-
-CONF = config.CONF
-LOG = logging.getLogger(__name__)
-
-
-def state_wait(lfunction, final_set=set(), valid_set=None):
-    # TODO(afazekas): evaluate using ABC here
-    if not isinstance(final_set, set):
-        final_set = set((final_set,))
-    if not isinstance(valid_set, set) and valid_set is not None:
-        valid_set = set((valid_set,))
-    start_time = time.time()
-    old_status = status = lfunction()
-    while True:
-        if status != old_status:
-            LOG.info('State transition "%s" ==> "%s" %d second', old_status,
-                     status, time.time() - start_time)
-        if status in final_set:
-            return status
-        if valid_set is not None and status not in valid_set:
-            return status
-        dtime = time.time() - start_time
-        if dtime > CONF.boto.build_timeout:
-            raise testtools.TestCase\
-                .failureException("State change timeout exceeded!"
-                                  '(%ds) While waiting'
-                                  'for %s at "%s"' %
-                                  (dtime, final_set, status))
-        time.sleep(CONF.boto.build_interval)
-        old_status = status
-        status = lfunction()
-
-
-def re_search_wait(lfunction, regexp):
-    """Stops waiting on success."""
-    start_time = time.time()
-    while True:
-        text = lfunction()
-        result = re.search(regexp, text)
-        if result is not None:
-            LOG.info('Pattern "%s" found in %d second in "%s"',
-                     regexp,
-                     time.time() - start_time,
-                     text)
-            return result
-        dtime = time.time() - start_time
-        if dtime > CONF.boto.build_timeout:
-            raise testtools.TestCase\
-                .failureException('Pattern find timeout exceeded!'
-                                  '(%ds) While waiting for'
-                                  '"%s" pattern in "%s"' %
-                                  (dtime, regexp, text))
-        time.sleep(CONF.boto.build_interval)
-
-
-def wait_no_exception(lfunction, exc_class=None, exc_matcher=None):
-    """Stops waiting on success."""
-    start_time = time.time()
-    if exc_matcher is not None:
-        exc_class = boto.exception.BotoServerError
-
-    if exc_class is None:
-        exc_class = BaseException
-    while True:
-        result = None
-        try:
-            result = lfunction()
-            LOG.info('No Exception in %d second',
-                     time.time() - start_time)
-            return result
-        except exc_class as exc:
-            if exc_matcher is not None:
-                res = exc_matcher.match(exc)
-                if res is not None:
-                    LOG.info(res)
-                    raise exc
-        # Let the other exceptions propagate
-        dtime = time.time() - start_time
-        if dtime > CONF.boto.build_timeout:
-            raise testtools.TestCase\
-                .failureException("Wait timeout exceeded! (%ds)" % dtime)
-        time.sleep(CONF.boto.build_interval)
-
-
-# NOTE(afazekas): EC2/boto normally raise exception instead of empty list
-def wait_exception(lfunction):
-    """Returns with the exception or raises one."""
-    start_time = time.time()
-    while True:
-        try:
-            lfunction()
-        except BaseException as exc:
-            LOG.info('Exception in %d second',
-                     time.time() - start_time)
-            return exc
-        dtime = time.time() - start_time
-        if dtime > CONF.boto.build_timeout:
-            raise testtools.TestCase\
-                .failureException("Wait timeout exceeded! (%ds)" % dtime)
-        time.sleep(CONF.boto.build_interval)
-
-# TODO(afazekas): consider strategy design pattern..