diff --git a/HACKING.rst b/HACKING.rst
index 03e7dc3..5153fe1 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -20,6 +20,7 @@
 
 - [T102] Cannot import OpenStack python clients in tempest/api tests
 - [T103] tempest/tests is deprecated
+- [T104] Scenario tests require a services decorator
 
 Test Data/Configuration
 -----------------------
@@ -96,6 +97,24 @@
 credentials management, testresources and so on. These facilities, MUST be able
 to work even if just one ``test_method`` selected for execution.
 
+Service Tagging
+---------------
+Service tagging is used to specify which services are exercised by a particular
+test method. You specify the services with the tempest.test.services decorator.
+For example:
+
+@services('compute', 'image')
+
+Valid service tag names are the same as the list of directories in tempest.api
+that have tests.
+
+For scenario tests having a service tag is required. For the api tests service
+tags are only needed if the test method makes an api call (either directly or
+indirectly through another service) that differs from the parent directory
+name. For example, any test that make an api call to a service other than nova
+in tempest.api.compute would require a service tag for those services, however
+they do not need to be tagged as compute.
+
 Guidelines
 ----------
 - Do not submit changesets with only testcases which are skipped as
diff --git a/bin/tempest b/bin/tempest
deleted file mode 100755
index 87ba6d5..0000000
--- a/bin/tempest
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env bash
-
-function usage {
-  echo "Usage: $0 [OPTION]..."
-  echo "Run Tempest test suite"
-  echo ""
-  echo "  -s, --smoke              Only run smoke tests"
-  echo "  -w, --whitebox           Only run whitebox tests"
-  echo "  -h, --help               Print this usage message"
-  echo "  -d. --debug              Debug this script -- set -o xtrace"
-  exit
-}
-
-function process_option {
-  case "$1" in
-    -h|--help) usage;;
-    -d|--debug) set -o xtrace;;
-    -s|--smoke) noseargs="$noseargs --attr=type=smoke";;
-    -w|--whitebox) noseargs="$noseargs --attr=type=whitebox";;
-    *) noseargs="$noseargs $1"
-  esac
-}
-
-noseargs=""
-
-export NOSE_WITH_OPENSTACK=1
-export NOSE_OPENSTACK_COLOR=1
-export NOSE_OPENSTACK_RED=15.00
-export NOSE_OPENSTACK_YELLOW=3.00
-export NOSE_OPENSTACK_SHOW_ELAPSED=1
-export NOSE_OPENSTACK_STDOUT=1
-
-for arg in "$@"; do
-  process_option $arg
-done
-
-
-# only add tempest default if we don't specify a test
-if [[ "x$noseargs" =~ "tempest" ]]; then
-  noseargs="$noseargs"
-else
-  noseargs="$noseargs tempest"
-fi
-
-
-function run_tests {
-  $NOSETESTS
-}
-
-NOSETESTS="nosetests $noseargs"
-
-run_tests || exit
diff --git a/doc/source/field_guide/whitebox.rst b/doc/source/field_guide/whitebox.rst
deleted file mode 120000
index 47f6069..0000000
--- a/doc/source/field_guide/whitebox.rst
+++ /dev/null
@@ -1 +0,0 @@
-../../../tempest/whitebox/README.rst
\ No newline at end of file
diff --git a/doc/source/index.rst b/doc/source/index.rst
index f70cdd1..1c32b9c 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -31,7 +31,6 @@
    field_guide/scenario
    field_guide/stress
    field_guide/thirdparty
-   field_guide/whitebox
    field_guide/unit_tests
 
 ------------------
diff --git a/etc/tempest.conf.sample b/etc/tempest.conf.sample
index 8d96858..cd57354 100644
--- a/etc/tempest.conf.sample
+++ b/etc/tempest.conf.sample
@@ -53,6 +53,9 @@
 # The above administrative user's tenant name
 admin_tenant_name = admin
 
+# The role that is required to administrate keystone.
+admin_role = admin
+
 [compute]
 # This section contains configuration options used when executing tests
 # against the OpenStack Compute API.
@@ -119,6 +122,10 @@
 # Number of seconds to wait to authenticate to an instance
 ssh_timeout = 300
 
+# Additinal wait time for clean state, when there is
+# no OS-EXT-STS extension availiable
+ready_wait = 0
+
 # Number of seconds to wait for output from ssh channel
 ssh_channel_timeout = 60
 
@@ -161,29 +168,6 @@
 # Expected first device name when a volume is attached to an instance
 volume_device_name = vdb
 
-[whitebox]
-# Whitebox options for compute. Whitebox options enable the
-# whitebox test cases, which look at internal Nova database state,
-# SSH into VMs to check instance state, etc.
-
-# Should we run whitebox tests for Compute?
-whitebox_enabled = true
-
-# Path of nova source directory
-source_dir = /opt/stack/nova
-
-# Path of nova configuration file
-config_path = /etc/nova/nova.conf
-
-# Directory containing nova binaries such as nova-manage
-bin_dir = /usr/local/bin
-
-# Connection string to the database of Compute service
-db_uri = mysql://nova:secret@localhost/nova
-
-# Path to a private key file for SSH access to remote hosts
-path_to_private_key = /home/user/.ssh/id_rsa
-
 [compute-admin]
 # This should be the username of a user WITH administrative privileges
 # If not defined the admin user from the identity section will be used
@@ -246,6 +230,8 @@
 # Unless you have a custom Keystone service catalog implementation, you
 # probably want to leave this value as "volume"
 catalog_type = volume
+# The disk format to use when copying a volume to image
+disk_format = raw
 # Number of seconds to wait while looping to check the status of a
 # volume that is being made available
 build_interval = 10
diff --git a/requirements.txt b/requirements.txt
index 877b23c..ab48ec5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -18,6 +18,4 @@
 keyring>=1.6.1
 testrepository>=0.0.17
 oslo.config>=1.1.0
-# Needed for whitebox testing
-SQLAlchemy>=0.7.8,<=0.7.99
 eventlet>=0.13.0
diff --git a/run_tests.sh b/run_tests.sh
index d672b62..710fbaa 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -10,7 +10,6 @@
   echo "  -f, --force              Force a clean re-build of the virtual environment. Useful when dependencies have been added."
   echo "  -u, --update             Update the virtual environment with any newer package versions"
   echo "  -s, --smoke              Only run smoke tests"
-  echo "  -w, --whitebox           Only run whitebox tests"
   echo "  -t, --serial             Run testr serially"
   echo "  -c, --nova-coverage      Enable Nova coverage collection"
   echo "  -C, --config             Config file location"
@@ -38,7 +37,7 @@
 logging=0
 logging_config=etc/logging.conf
 
-if ! options=$(getopt -o VNnfuswtcphdC:lL: -l virtual-env,no-virtual-env,no-site-packages,force,update,smoke,whitebox,serial,nova-coverage,pep8,help,debug,config:,logging,logging-config: -- "$@")
+if ! options=$(getopt -o VNnfustcphdC:lL: -l virtual-env,no-virtual-env,no-site-packages,force,update,smoke,serial,nova-coverage,pep8,help,debug,config:,logging,logging-config: -- "$@")
 then
     # parse error
     usage
@@ -60,7 +59,6 @@
     -C|--config) config_file=$2; shift;;
     -p|--pep8) let just_pep8=1;;
     -s|--smoke) testrargs="$testrargs smoke";;
-    -w|--whitebox) testrargs="$testrargs whitebox";;
     -t|--serial) serial=1;;
     -l|--logging) logging=1;;
     -L|--logging-config) logging_config=$2; shift;;
diff --git a/setup.cfg b/setup.cfg
index 7cfc4ce..a4cf118 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -21,10 +21,6 @@
 setup-hooks =
     pbr.hooks.setup_hook
 
-[files]
-scripts =
-    bin/tempest
-
 [build_sphinx]
 all_files = 1
 build-dir = doc/build
diff --git a/tempest/README.rst b/tempest/README.rst
index 33021c8..dbac809 100644
--- a/tempest/README.rst
+++ b/tempest/README.rst
@@ -18,7 +18,6 @@
 |    scenario/ - complex scenario tests
 |    stress/ - stress tests
 |    thirdparty/ - 3rd party api tests
-|    whitebox/ - white box testing
 
 Each of these directories contains different types of tests. What
 belongs in each directory, the rules and examples for good tests, are
@@ -78,11 +77,3 @@
 completely legitimate for Tempest to include tests of 3rdparty APIs,
 but those should be kept separate from the normal OpenStack
 validation.
-
-
-whitebox
---------
-
-Whitebox tests are tests which require access to the database of the
-target OpenStack machine to verify internal state after operations
-are made. White box tests are allowed to use the python clients.
diff --git a/tempest/api/compute/admin/test_flavors_extra_specs.py b/tempest/api/compute/admin/test_flavors_extra_specs.py
index f2f82b5..ace77a6 100644
--- a/tempest/api/compute/admin/test_flavors_extra_specs.py
+++ b/tempest/api/compute/admin/test_flavors_extra_specs.py
@@ -17,6 +17,8 @@
 
 from tempest.api import compute
 from tempest.api.compute import base
+from tempest.common.utils.data_utils import rand_int_id
+from tempest.common.utils.data_utils import rand_name
 from tempest import exceptions
 from tempest.test import attr
 
@@ -39,12 +41,12 @@
             raise cls.skipException(msg)
 
         cls.client = cls.os_adm.flavors_client
-        flavor_name = 'test_flavor2'
+        flavor_name = rand_name('test_flavor')
         ram = 512
         vcpus = 1
         disk = 10
         ephemeral = 10
-        cls.new_flavor_id = 12345
+        cls.new_flavor_id = rand_int_id(start=1000)
         swap = 1024
         rxtx = 1
         # Create a flavor so as to set/get/unset extra specs
diff --git a/tempest/api/identity/admin/v3/test_credentials.py b/tempest/api/identity/admin/v3/test_credentials.py
new file mode 100644
index 0000000..efd2f83
--- /dev/null
+++ b/tempest/api/identity/admin/v3/test_credentials.py
@@ -0,0 +1,120 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack Foundation
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.api.identity import base
+from tempest.common.utils.data_utils import rand_name
+from tempest.test import attr
+
+
+class CredentialsTestJSON(base.BaseIdentityAdminTest):
+    _interface = 'json'
+
+    @classmethod
+    def setUpClass(cls):
+        super(CredentialsTestJSON, cls).setUpClass()
+        cls.projects = list()
+        cls.creds_list = [['project_id', 'user_id', 'id'],
+                          ['access', 'secret']]
+        u_name = rand_name('user-')
+        u_desc = '%s description' % u_name
+        u_email = '%s@testmail.tm' % u_name
+        u_password = rand_name('pass-')
+        for i in range(2):
+            resp, cls.project = cls.v3_client.create_project(
+                rand_name('project-'), description=rand_name('project-desc-'))
+            assert resp['status'] == '201', "Expected %s" % resp['status']
+            cls.projects.append(cls.project['id'])
+
+        resp, cls.user_body = cls.v3_client.create_user(
+            u_name, description=u_desc, password=u_password,
+            email=u_email, project_id=cls.projects[0])
+        assert resp['status'] == '201', "Expected: %s" % resp['status']
+
+    @classmethod
+    def tearDownClass(cls):
+        resp, _ = cls.v3_client.delete_user(cls.user_body['id'])
+        assert resp['status'] == '204', "Expected: %s" % resp['status']
+        for p in cls.projects:
+            resp, _ = cls.v3_client.delete_project(p)
+            assert resp['status'] == '204', "Expected: %s" % resp['status']
+        super(CredentialsTestJSON, cls).tearDownClass()
+
+    def _delete_credential(self, cred_id):
+        resp, body = self.creds_client.delete_credential(cred_id)
+        self.assertEqual(resp['status'], '204')
+
+    @attr(type='smoke')
+    def test_credentials_create_get_update_delete(self):
+        keys = [rand_name('Access-'), rand_name('Secret-')]
+        resp, cred = self.creds_client.create_credential(
+            keys[0], keys[1], self.user_body['id'],
+            self.projects[0])
+        self.addCleanup(self._delete_credential, cred['id'])
+        self.assertEqual(resp['status'], '201')
+        for value1 in self.creds_list[0]:
+            self.assertIn(value1, cred)
+        for value2 in self.creds_list[1]:
+            self.assertIn(value2, cred['blob'])
+
+        new_keys = [rand_name('NewAccess-'), rand_name('NewSecret-')]
+        resp, update_body = self.creds_client.update_credential(
+            cred['id'], access_key=new_keys[0], secret_key=new_keys[1],
+            project_id=self.projects[1])
+        self.assertEqual(resp['status'], '200')
+        self.assertEqual(cred['id'], update_body['id'])
+        self.assertEqual(self.projects[1], update_body['project_id'])
+        self.assertEqual(self.user_body['id'], update_body['user_id'])
+        self.assertEqual(update_body['blob']['access'], new_keys[0])
+        self.assertEqual(update_body['blob']['secret'], new_keys[1])
+
+        resp, get_body = self.creds_client.get_credential(cred['id'])
+        self.assertEqual(resp['status'], '200')
+        for value1 in self.creds_list[0]:
+            self.assertEqual(update_body[value1],
+                             get_body[value1])
+        for value2 in self.creds_list[1]:
+            self.assertEqual(update_body['blob'][value2],
+                             get_body['blob'][value2])
+
+    @attr(type='smoke')
+    def test_credentials_list_delete(self):
+        created_cred_ids = list()
+        fetched_cred_ids = list()
+
+        for i in range(2):
+            resp, cred = self.creds_client.create_credential(
+                rand_name('Access-'), rand_name('Secret-'),
+                self.user_body['id'], self.projects[0])
+            self.assertEqual(resp['status'], '201')
+            created_cred_ids.append(cred['id'])
+            self.addCleanup(self._delete_credential, cred['id'])
+
+        resp, creds = self.creds_client.list_credentials()
+        self.assertEqual(resp['status'], '200')
+
+        for i in creds:
+            fetched_cred_ids.append(i['id'])
+        missing_creds = [c for c in created_cred_ids
+                         if c not in fetched_cred_ids]
+        self.assertEqual(0, len(missing_creds),
+                         "Failed to find cred %s in fetched list" %
+                         ', '.join(m_cred for m_cred
+                         in missing_creds))
+
+
+class CredentialsTestXML(CredentialsTestJSON):
+    _interface = 'xml'
diff --git a/tempest/api/identity/base.py b/tempest/api/identity/base.py
index bfb5372..2a168de 100644
--- a/tempest/api/identity/base.py
+++ b/tempest/api/identity/base.py
@@ -34,6 +34,7 @@
         cls.service_client = os.service_client
         cls.policy_client = os.policy_client
         cls.v3_token = os.token_v3_client
+        cls.creds_client = os.credentials_client
 
         if not cls.client.has_admin_extensions():
             raise cls.skipException("Admin extensions disabled")
diff --git a/tempest/api/network/test_networks.py b/tempest/api/network/test_networks.py
index f3d1485..7e116b9 100644
--- a/tempest/api/network/test_networks.py
+++ b/tempest/api/network/test_networks.py
@@ -58,6 +58,8 @@
     def setUpClass(cls):
         super(NetworksTestJSON, cls).setUpClass()
         cls.network = cls.create_network()
+        cls.network1 = cls.create_network()
+        cls.network2 = cls.create_network()
         cls.name = cls.network['name']
         cls.subnet = cls.create_subnet(cls.network)
         cls.cidr = cls.subnet['cidr']
@@ -75,6 +77,30 @@
         for n in created_networks:
             self.assertNotIn(n['id'], networks_list)
 
+    def _delete_subnets(self, created_subnets):
+        for n in created_subnets:
+            resp, body = self.client.delete_subnet(n['id'])
+            self.assertEqual(204, resp.status)
+        # Asserting that the subnets are not found in the list after deletion
+        resp, body = self.client.list_subnets()
+        subnets_list = list()
+        for subnet in body['subnets']:
+            subnets_list.append(subnet['id'])
+        for n in created_subnets:
+            self.assertNotIn(n['id'], subnets_list)
+
+    def _delete_ports(self, created_ports):
+        for n in created_ports:
+            resp, body = self.client.delete_port(n['id'])
+            self.assertEqual(204, resp.status)
+        # Asserting that the ports are not found in the list after deletion
+        resp, body = self.client.list_ports()
+        ports_list = list()
+        for port in body['ports']:
+            ports_list.append(port['id'])
+        for n in created_ports:
+            self.assertNotIn(n['id'], ports_list)
+
     @attr(type='smoke')
     def test_create_update_delete_network_subnet(self):
         # Creates a network
@@ -208,6 +234,12 @@
         self.assertRaises(exceptions.NotFound, self.client.show_subnet,
                           non_exist_id)
 
+    @attr(type=['negative', 'smoke'])
+    def test_show_non_existent_port(self):
+        non_exist_id = rand_name('port')
+        self.assertRaises(exceptions.NotFound, self.client.show_port,
+                          non_exist_id)
+
     @attr(type='smoke')
     def test_bulk_create_delete_network(self):
         # Creates 2 networks in one request
@@ -225,6 +257,74 @@
             self.assertIsNotNone(n['id'])
             self.assertIn(n['id'], networks_list)
 
+    @attr(type='smoke')
+    def test_bulk_create_delete_subnet(self):
+        # Creates 2 subnets in one request
+        cidr = netaddr.IPNetwork(self.network_cfg.tenant_network_cidr)
+        mask_bits = self.network_cfg.tenant_network_mask_bits
+        cidrs = []
+        for subnet_cidr in cidr.subnet(mask_bits):
+            cidrs.append(subnet_cidr)
+        names = []
+        networks = [self.network1['id'], self.network2['id']]
+        for i in range(len(networks)):
+            names.append(rand_name('subnet-'))
+        subnet_list = []
+        # TODO(raies): "for IPv6, version list [4, 6] will be used.
+        # and cidr for IPv6 will be of IPv6"
+        ip_version = [4, 4]
+        for i in range(len(names)):
+            p1 = {
+                'network_id': networks[i],
+                'cidr': str(cidrs[(i)]),
+                'name': names[i],
+                'ip_version': ip_version[i]
+            }
+            subnet_list.append(p1)
+        del subnet_list[1]['name']
+        resp, body = self.client.create_bulk_subnet(subnet_list)
+        created_subnets = body['subnets']
+        self.addCleanup(self._delete_subnets, created_subnets)
+        self.assertEqual('201', resp['status'])
+        # Asserting that the subnets are found in the list after creation
+        resp, body = self.client.list_subnets()
+        subnets_list = list()
+        for subnet in body['subnets']:
+            subnets_list.append(subnet['id'])
+        for n in created_subnets:
+            self.assertIsNotNone(n['id'])
+            self.assertIn(n['id'], subnets_list)
+
+    @attr(type='smoke')
+    def test_bulk_create_delete_port(self):
+        # Creates 2 ports in one request
+        names = []
+        networks = [self.network1['id'], self.network2['id']]
+        for i in range(len(networks)):
+            names.append(rand_name('port-'))
+        port_list = []
+        state = [True, False]
+        for i in range(len(names)):
+            p1 = {
+                'network_id': networks[i],
+                'name': names[i],
+                'admin_state_up': state[i],
+            }
+            port_list.append(p1)
+        del port_list[1]['name']
+        resp, body = self.client.create_bulk_port(port_list)
+        created_ports = body['ports']
+        self.addCleanup(self._delete_ports, created_ports)
+        self.assertEqual('201', resp['status'])
+        # Asserting that the ports are found in the list after creation
+        resp, body = self.client.list_ports()
+        ports_list = list()
+        for port in body['ports']:
+            ports_list.append(port['id'])
+        for n in created_ports:
+            self.assertIsNotNone(n['id'])
+            self.assertIn(n['id'], ports_list)
+
 
 class NetworksTestXML(NetworksTestJSON):
     _interface = 'xml'
diff --git a/tempest/api/network/test_security_groups.py b/tempest/api/network/test_security_groups.py
new file mode 100644
index 0000000..24f8286
--- /dev/null
+++ b/tempest/api/network/test_security_groups.py
@@ -0,0 +1,127 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack Foundation
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.api.network import base
+from tempest.common.utils.data_utils import rand_name
+from tempest import exceptions
+from tempest.test import attr
+
+
+class SecGroupTest(base.BaseNetworkTest):
+    _interface = 'json'
+
+    @classmethod
+    def setUpClass(cls):
+        super(SecGroupTest, cls).setUpClass()
+
+    def _delete_security_group(self, secgroup_id):
+        resp, _ = self.client.delete_security_group(secgroup_id)
+        self.assertEqual(204, resp.status)
+        # Asserting that the secgroup is not found in the list
+        # after deletion
+        resp, list_body = self.client.list_security_groups()
+        self.assertEqual('200', resp['status'])
+        secgroup_list = list()
+        for secgroup in list_body['security_groups']:
+            secgroup_list.append(secgroup['id'])
+        self.assertNotIn(secgroup_id, secgroup_list)
+
+    def _delete_security_group_rule(self, rule_id):
+        resp, _ = self.client.delete_security_group_rule(rule_id)
+        self.assertEqual(204, resp.status)
+        # Asserting that the secgroup is not found in the list
+        # after deletion
+        resp, list_body = self.client.list_security_group_rules()
+        self.assertEqual('200', resp['status'])
+        rules_list = list()
+        for rule in list_body['security_group_rules']:
+            rules_list.append(rule['id'])
+        self.assertNotIn(rule_id, rules_list)
+
+    @attr(type='smoke')
+    def test_list_security_groups(self):
+        # Verify the that security group belonging to tenant exist in list
+        resp, body = self.client.list_security_groups()
+        self.assertEqual('200', resp['status'])
+        security_groups = body['security_groups']
+        found = None
+        for n in security_groups:
+            if (n['name'] == 'default'):
+                found = n['id']
+        msg = "Security-group list doesn't contain default security-group"
+        self.assertIsNotNone(found, msg)
+
+    @attr(type='smoke')
+    def test_create_show_delete_security_group_and_rule(self):
+        # Create a security group
+        name = rand_name('secgroup-')
+        resp, group_create_body = self.client.create_security_group(name)
+        self.assertEqual('201', resp['status'])
+        self.addCleanup(self._delete_security_group,
+                        group_create_body['security_group']['id'])
+        self.assertEqual(group_create_body['security_group']['name'], name)
+
+        # Show details of the created security group
+        resp, show_body = self.client.show_security_group(
+            group_create_body['security_group']['id'])
+        self.assertEqual('200', resp['status'])
+        self.assertEqual(show_body['security_group']['name'], name)
+
+        # List security groups and verify if created group is there in response
+        resp, list_body = self.client.list_security_groups()
+        self.assertEqual('200', resp['status'])
+        secgroup_list = list()
+        for secgroup in list_body['security_groups']:
+            secgroup_list.append(secgroup['id'])
+        self.assertIn(group_create_body['security_group']['id'], secgroup_list)
+        # No Udpate in security group
+        # Create rule
+        resp, rule_create_body = self.client.create_security_group_rule(
+            group_create_body['security_group']['id']
+        )
+        self.assertEqual('201', resp['status'])
+        self.addCleanup(self._delete_security_group_rule,
+                        rule_create_body['security_group_rule']['id'])
+        # Show details of the created security rule
+        resp, show_rule_body = self.client.show_security_group_rule(
+            rule_create_body['security_group_rule']['id']
+        )
+        self.assertEqual('200', resp['status'])
+
+        # List rules and verify created rule is in response
+        resp, rule_list_body = self.client.list_security_group_rules()
+        self.assertEqual('200', resp['status'])
+        rule_list = [rule['id']
+                     for rule in rule_list_body['security_group_rules']]
+        self.assertIn(rule_create_body['security_group_rule']['id'], rule_list)
+
+    @attr(type=['negative', 'smoke'])
+    def test_show_non_existent_security_group(self):
+        non_exist_id = rand_name('secgroup-')
+        self.assertRaises(exceptions.NotFound, self.client.show_security_group,
+                          non_exist_id)
+
+    @attr(type=['negative', 'smoke'])
+    def test_show_non_existent_security_group_rule(self):
+        non_exist_id = rand_name('rule-')
+        self.assertRaises(exceptions.NotFound,
+                          self.client.show_security_group_rule,
+                          non_exist_id)
+
+
+class SecGroupTestXML(SecGroupTest):
+    _interface = 'xml'
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index e6e8d17..1d16b2f 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -73,6 +73,11 @@
         cls.data = DataGenerator(cls.identity_admin_client)
 
     @classmethod
+    def tearDownClass(cls):
+        cls.isolated_creds.clear_isolated_creds()
+        super(BaseObjectTest, cls).tearDownClass()
+
+    @classmethod
     def _assign_member_role(cls):
         primary_user = cls.isolated_creds.get_primary_user()
         alt_user = cls.isolated_creds.get_alt_user()
diff --git a/tempest/api/volume/test_volumes_actions.py b/tempest/api/volume/test_volumes_actions.py
index 960785d..ad80505 100644
--- a/tempest/api/volume/test_volumes_actions.py
+++ b/tempest/api/volume/test_volumes_actions.py
@@ -18,6 +18,7 @@
 from tempest.api.volume.base import BaseVolumeTest
 from tempest.common.utils.data_utils import rand_name
 from tempest.test import attr
+from tempest.test import services
 from tempest.test import stresstest
 
 
@@ -55,6 +56,7 @@
 
     @stresstest(class_setup_per='process')
     @attr(type='smoke')
+    @services('compute')
     def test_attach_detach_volume_to_instance(self):
         # Volume is attached and detached successfully from an instance
         mountpoint = '/dev/vdc'
@@ -69,6 +71,7 @@
 
     @stresstest(class_setup_per='process')
     @attr(type='gate')
+    @services('compute')
     def test_get_volume_attachment(self):
         # Verify that a volume's attachment information is retrieved
         mountpoint = '/dev/vdc'
@@ -93,13 +96,16 @@
         self.assertEqual(self.volume['id'], attachment['volume_id'])
 
     @attr(type='gate')
+    @services('image')
     def test_volume_upload(self):
         # NOTE(gfidente): the volume uploaded in Glance comes from setUpClass,
         # it is shared with the other tests. After it is uploaded in Glance,
         # there is no way to delete it from Cinder, so we delete it from Glance
         # using the Glance image_client and from Cinder via tearDownClass.
         image_name = rand_name('Image-')
-        resp, body = self.client.upload_volume(self.volume['id'], image_name)
+        resp, body = self.client.upload_volume(self.volume['id'],
+                                               image_name,
+                                               self.config.volume.disk_format)
         image_id = body["image_id"]
         self.addCleanup(self.image_client.delete_image, image_id)
         self.assertEqual(202, resp.status)
diff --git a/tempest/api/volume/test_volumes_get.py b/tempest/api/volume/test_volumes_get.py
index e5e350e..12b03b5 100644
--- a/tempest/api/volume/test_volumes_get.py
+++ b/tempest/api/volume/test_volumes_get.py
@@ -18,6 +18,7 @@
 from tempest.api.volume import base
 from tempest.common.utils.data_utils import rand_name
 from tempest.test import attr
+from tempest.test import services
 
 
 class VolumesGetTest(base.BaseVolumeTest):
@@ -97,6 +98,7 @@
         self._volume_create_get_delete()
 
     @attr(type='smoke')
+    @services('image')
     def test_volume_create_get_delete_from_image(self):
         self._volume_create_get_delete(imageRef=self.config.compute.image_ref)
 
diff --git a/tempest/clients.py b/tempest/clients.py
index 48e4939..49b9283 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -71,6 +71,8 @@
     VolumesExtensionsClientXML
 from tempest.services.identity.json.identity_client import IdentityClientJSON
 from tempest.services.identity.json.identity_client import TokenClientJSON
+from tempest.services.identity.v3.json.credentials_client import \
+    CredentialsClientJSON
 from tempest.services.identity.v3.json.endpoints_client import \
     EndPointClientJSON
 from tempest.services.identity.v3.json.identity_client import \
@@ -79,6 +81,8 @@
 from tempest.services.identity.v3.json.policy_client import PolicyClientJSON
 from tempest.services.identity.v3.json.service_client import \
     ServiceClientJSON
+from tempest.services.identity.v3.xml.credentials_client import \
+    CredentialsClientXML
 from tempest.services.identity.v3.xml.endpoints_client import EndPointClientXML
 from tempest.services.identity.v3.xml.identity_client import \
     IdentityV3ClientXML
@@ -252,6 +256,11 @@
     "xml": V3TokenClientXML,
 }
 
+CREDENTIALS_CLIENT = {
+    "json": CredentialsClientJSON,
+    "xml": CredentialsClientXML,
+}
+
 
 class Manager(object):
 
@@ -336,6 +345,8 @@
             self.policy_client = POLICY_CLIENT[interface](*client_args)
             self.hypervisor_client = HYPERVISOR_CLIENT[interface](*client_args)
             self.token_v3_client = V3_TOKEN_CLIENT[interface](*client_args)
+            self.credentials_client = \
+                CREDENTIALS_CLIENT[interface](*client_args)
 
             if client_args_v3_auth:
                 self.servers_client_v3_auth = SERVERS_CLIENTS[interface](
diff --git a/tempest/common/isolated_creds.py b/tempest/common/isolated_creds.py
index 22e1bd2..d6b4466 100644
--- a/tempest/common/isolated_creds.py
+++ b/tempest/common/isolated_creds.py
@@ -141,10 +141,11 @@
             role = None
             try:
                 roles = self._list_roles()
+                admin_role = self.config.identity.admin_role
                 if self.tempest_client:
-                    role = next(r for r in roles if r['name'] == 'admin')
+                    role = next(r for r in roles if r['name'] == admin_role)
                 else:
-                    role = next(r for r in roles if r.name == 'admin')
+                    role = next(r for r in roles if r.name == admin_role)
             except StopIteration:
                 msg = "No admin role found"
                 raise exceptions.NotFound(msg)
diff --git a/tempest/common/waiters.py b/tempest/common/waiters.py
new file mode 100644
index 0000000..15569cd
--- /dev/null
+++ b/tempest/common/waiters.py
@@ -0,0 +1,82 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+
+import time
+
+from tempest import config
+from tempest import exceptions
+from tempest.openstack.common import log as logging
+
+CONFIG = config.TempestConfig()
+LOG = logging.getLogger(__name__)
+
+
+# NOTE(afazekas): This function needs to know a token and a subject.
+def wait_for_server_status(client, server_id, status, ready_wait=True):
+    """Waits for a server to reach a given status."""
+
+    def _get_task_state(body):
+        task_state = body.get('OS-EXT-STS:task_state', None)
+        return task_state
+
+    # NOTE(afazekas): UNKNOWN status possible on ERROR
+    # or in a very early stage.
+    resp, body = client.get_server(server_id)
+    old_status = server_status = body['status']
+    old_task_state = task_state = _get_task_state(body)
+    start_time = int(time.time())
+    while True:
+        # NOTE(afazekas): Now the BUILD status only reached
+        # between the UNKOWN->ACTIVE transition.
+        # TODO(afazekas): enumerate and validate the stable status set
+        if status == 'BUILD' and server_status != 'UNKNOWN':
+            return
+        if server_status == status:
+            if ready_wait:
+                if status == 'BUILD':
+                    return
+                # NOTE(afazekas): The instance is in "ready for action state"
+                # when no task in progress
+                # NOTE(afazekas): Converted to string bacuse of the XML
+                # responses
+                if str(task_state) == "None":
+                    # without state api extension 3 sec usually enough
+                    time.sleep(CONFIG.compute.ready_wait)
+                    return
+            else:
+                return
+
+        time.sleep(client.build_interval)
+        resp, body = client.get_server(server_id)
+        server_status = body['status']
+        task_state = _get_task_state(body)
+        if (server_status != old_status) or (task_state != old_task_state):
+            LOG.info('State transition "%s" ==> "%s" after %d second wait',
+                     '/'.join((old_status, str(old_task_state))),
+                     '/'.join((server_status, str(task_state))),
+                     time.time() - start_time)
+        if server_status == 'ERROR':
+            raise exceptions.BuildErrorException(server_id=server_id)
+
+        timed_out = int(time.time()) - start_time >= client.build_timeout
+
+        if timed_out:
+            message = ('Server %s failed to reach %s status within the '
+                       'required time (%s s).' %
+                       (server_id, status, client.build_timeout))
+            message += ' Current status: %s.' % server_status
+            raise exceptions.TimeoutException(message)
+        old_status = server_status
+        old_task_state = task_state
diff --git a/tempest/config.py b/tempest/config.py
index 7245b10..b386968 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -51,6 +51,9 @@
     cfg.StrOpt('tenant_name',
                default='demo',
                help="Tenant name to use for Nova API requests."),
+    cfg.StrOpt('admin_role',
+               default='admin',
+               help="Role required to administrate keystone."),
     cfg.StrOpt('password',
                default='pass',
                help="API key to use when authenticating.",
@@ -174,6 +177,10 @@
                default=300,
                help="Timeout in seconds to wait for authentication to "
                     "succeed."),
+    cfg.IntOpt('ready_wait',
+               default=0,
+               help="Additinal wait time for clean state, when there is"
+                    " no OS-EXT-STS extension availiable"),
     cfg.IntOpt('ssh_channel_timeout',
                default=60,
                help="Timeout in seconds to wait for output from ssh "
@@ -238,36 +245,6 @@
     for opt in ComputeAdminGroup:
         conf.register_opt(opt, group='compute-admin')
 
-
-whitebox_group = cfg.OptGroup(name='whitebox',
-                              title="Whitebox Options")
-
-WhiteboxGroup = [
-    cfg.BoolOpt('whitebox_enabled',
-                default=False,
-                help="Does the test environment support whitebox tests for "
-                     "Compute?"),
-    cfg.StrOpt('db_uri',
-               default=None,
-               help="Connection string to the database of Compute service"),
-    cfg.StrOpt('source_dir',
-               default="/opt/stack/nova",
-               help="Path of nova source directory"),
-    cfg.StrOpt('config_path',
-               default='/etc/nova/nova.conf',
-               help="Path of nova configuration file"),
-    cfg.StrOpt('bin_dir',
-               default="/usr/local/bin/",
-               help="Directory containing nova binaries such as nova-manage"),
-]
-
-
-def register_whitebox_opts(conf):
-    conf.register_group(whitebox_group)
-    for opt in WhiteboxGroup:
-        conf.register_opt(opt, group='whitebox')
-
-
 image_group = cfg.OptGroup(name='image',
                            title="Image Service Options")
 
@@ -353,6 +330,9 @@
     cfg.StrOpt('vendor_name',
                default='Open Source',
                help='Backend vendor to target when creating volume types'),
+    cfg.StrOpt('disk_format',
+               default='raw',
+               help='Disk format to use when copying a volume to image'),
 ]
 
 
@@ -650,7 +630,6 @@
 
         register_compute_opts(cfg.CONF)
         register_identity_opts(cfg.CONF)
-        register_whitebox_opts(cfg.CONF)
         register_image_opts(cfg.CONF)
         register_network_opts(cfg.CONF)
         register_volume_opts(cfg.CONF)
@@ -663,7 +642,6 @@
         register_scenario_opts(cfg.CONF)
         register_service_available_opts(cfg.CONF)
         self.compute = cfg.CONF.compute
-        self.whitebox = cfg.CONF.whitebox
         self.identity = cfg.CONF.identity
         self.images = cfg.CONF.image
         self.network = cfg.CONF.network
diff --git a/tempest/hacking/checks.py b/tempest/hacking/checks.py
index 8cfd548..aa97211 100644
--- a/tempest/hacking/checks.py
+++ b/tempest/hacking/checks.py
@@ -22,6 +22,8 @@
 SKIP_DECORATOR_RE = re.compile(r'\s*@testtools.skip\((.*)\)')
 SKIP_STR_RE = re.compile(r'.*Bug #\d+.*')
 PYTHON_CLIENT_RE = re.compile('import (%s)client' % '|'.join(PYTHON_CLIENTS))
+TEST_DEFINITION = re.compile(r'^\s*def test.*')
+SCENARIO_DECORATOR = re.compile(r'\s*@.*services\(')
 
 
 def skip_bugs(physical_line):
@@ -53,6 +55,21 @@
                      " in tempest/api/* tests"))
 
 
+def scenario_tests_need_service_tags(physical_line, filename,
+                                     previous_logical):
+    """Check that scenario tests have service tags
+
+    T104: Scenario tests require a services decorator
+    """
+
+    if 'tempest/scenario' in filename:
+        if TEST_DEFINITION.match(physical_line):
+            if not SCENARIO_DECORATOR.match(previous_logical):
+                return (physical_line.find('def'),
+                        "T104: Scenario tests require a service decorator")
+
+
 def factory(register):
     register(skip_bugs)
     register(import_no_clients_in_api)
+    register(scenario_tests_need_service_tags)
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 90b3fca..21c37b9 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -16,6 +16,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import logging
 import os
 import subprocess
 
@@ -28,6 +29,7 @@
 from neutronclient.common import exceptions as exc
 import neutronclient.v2_0.client
 import novaclient.client
+from novaclient import exceptions as nova_exceptions
 
 from tempest.api.network import common as net_common
 from tempest.common import isolated_creds
@@ -36,11 +38,18 @@
 from tempest.common.utils.linux.remote_client import RemoteClient
 from tempest import exceptions
 import tempest.manager
-from tempest.openstack.common import log as logging
+from tempest.openstack.common import log
 import tempest.test
 
 
-LOG = logging.getLogger(__name__)
+LOG = log.getLogger(__name__)
+
+# NOTE(afazekas): Workaround for the stdout logging
+LOG_nova_client = logging.getLogger('novaclient.client')
+LOG_nova_client.addHandler(log.NullHandler())
+
+LOG_cinder_client = logging.getLogger('cinderclient.client')
+LOG_cinder_client.addHandler(log.NullHandler())
 
 
 class OfficialClientManager(tempest.manager.Manager):
@@ -88,7 +97,8 @@
                                         *client_args,
                                         service_type=service_type,
                                         no_cache=True,
-                                        insecure=dscv)
+                                        insecure=dscv,
+                                        http_log_debug=True)
 
     def _get_image_client(self):
         token = self.identity_client.auth_token
@@ -104,7 +114,8 @@
                                           username,
                                           password,
                                           tenant_name,
-                                          auth_url)
+                                          auth_url,
+                                          http_log_debug=True)
 
     def _get_orchestration_client(self, username=None, password=None,
                                   tenant_name=None):
@@ -276,27 +287,57 @@
         expected status to show. At any time, if the returned
         status of the thing is ERROR, fail out.
         """
+        self._status_timeout(things, thing_id, expected_status=expected_status)
+
+    def delete_timeout(self, things, thing_id):
+        """
+        Given a thing, do a loop, sleeping
+        for a configurable amount of time, checking for the
+        deleted status to show. At any time, if the returned
+        status of the thing is ERROR, fail out.
+        """
+        self._status_timeout(things,
+                             thing_id,
+                             allow_notfound=True)
+
+    def _status_timeout(self,
+                        things,
+                        thing_id,
+                        expected_status=None,
+                        allow_notfound=False):
+
+        log_status = expected_status if expected_status else ''
+        if allow_notfound:
+            log_status += ' or NotFound' if log_status != '' else 'NotFound'
+
         def check_status():
             # python-novaclient has resources available to its client
             # that all implement a get() method taking an identifier
             # for the singular resource to retrieve.
-            thing = things.get(thing_id)
+            try:
+                thing = things.get(thing_id)
+            except nova_exceptions.NotFound:
+                if allow_notfound:
+                    return True
+                else:
+                    raise
+
             new_status = thing.status
             if new_status == 'ERROR':
                 message = "%s failed to get to expected status. \
                           In ERROR state." % (thing)
                 raise exceptions.BuildErrorException(message)
-            elif new_status == expected_status:
+            elif new_status == expected_status and expected_status is not None:
                 return True  # All good.
             LOG.debug("Waiting for %s to get to %s status. "
                       "Currently in %s status",
-                      thing, expected_status, new_status)
+                      thing, log_status, new_status)
         if not tempest.test.call_until_true(
             check_status,
             self.config.compute.build_timeout,
             self.config.compute.build_interval):
             message = "Timed out waiting for thing %s \
-                      to become %s" % (thing_id, expected_status)
+                      to become %s" % (thing_id, log_status)
             raise exceptions.TimeoutException(message)
 
     def create_loginable_secgroup_rule(self, client=None, secgroup_id=None):
diff --git a/tempest/scenario/orchestration/test_autoscaling.py b/tempest/scenario/orchestration/test_autoscaling.py
index b31a0a7..88f2ebd 100644
--- a/tempest/scenario/orchestration/test_autoscaling.py
+++ b/tempest/scenario/orchestration/test_autoscaling.py
@@ -17,6 +17,7 @@
 from tempest.scenario import manager
 from tempest.test import attr
 from tempest.test import call_until_true
+from tempest.test import services
 
 
 class AutoScalingTest(manager.OrchestrationScenarioTest):
@@ -59,6 +60,7 @@
             self.set_resource('stack', self.stack)
 
     @attr(type='slow')
+    @services('orchestration', 'compute')
     def test_scale_up_then_down(self):
 
         self.assign_keypair()
diff --git a/tempest/scenario/test_dashboard_basic_ops.py b/tempest/scenario/test_dashboard_basic_ops.py
index 9a45572..1081a3e 100644
--- a/tempest/scenario/test_dashboard_basic_ops.py
+++ b/tempest/scenario/test_dashboard_basic_ops.py
@@ -20,6 +20,7 @@
 from lxml import html
 
 from tempest.scenario import manager
+from tempest.test import services
 
 
 class TestDashboardBasicOps(manager.OfficialClientTest):
@@ -66,6 +67,7 @@
         response = self.opener.open(self.config.dashboard.dashboard_url)
         self.assertIn('Overview', response.read())
 
+    @services('dashboard')
     def test_basic_scenario(self):
         self.check_login_page()
         self.user_login()
diff --git a/tempest/scenario/test_large_ops.py b/tempest/scenario/test_large_ops.py
index 39b1e10..33b7adc 100644
--- a/tempest/scenario/test_large_ops.py
+++ b/tempest/scenario/test_large_ops.py
@@ -18,6 +18,7 @@
 from tempest.common.utils.data_utils import rand_name
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
+from tempest.test import services
 
 
 LOG = logging.getLogger(__name__)
@@ -96,6 +97,7 @@
         self.addCleanup(delete, self.servers)
         self._wait_for_server_status('ACTIVE')
 
+    @services('compute', 'image')
     def test_large_ops_scenario(self):
         if self.config.scenario.large_ops_number < 1:
             return
diff --git a/tempest/scenario/test_minimum_basic.py b/tempest/scenario/test_minimum_basic.py
index 5cddde2..ce4d1bd 100644
--- a/tempest/scenario/test_minimum_basic.py
+++ b/tempest/scenario/test_minimum_basic.py
@@ -18,6 +18,7 @@
 from tempest.common.utils.data_utils import rand_name
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
+from tempest.test import services
 
 
 LOG = logging.getLogger(__name__)
@@ -145,6 +146,7 @@
         volume = self.volume_client.volumes.get(self.volume.id)
         self.assertEqual('available', volume.status)
 
+    @services('compute', 'volume', 'image', 'network')
     def test_minimum_basic_scenario(self):
         self.glance_image_create()
         self.nova_keypair_add()
diff --git a/tempest/scenario/test_network_basic_ops.py b/tempest/scenario/test_network_basic_ops.py
index 930ffae..662e919 100644
--- a/tempest/scenario/test_network_basic_ops.py
+++ b/tempest/scenario/test_network_basic_ops.py
@@ -22,6 +22,7 @@
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
 from tempest.test import attr
+from tempest.test import services
 
 LOG = logging.getLogger(__name__)
 
@@ -251,6 +252,7 @@
                 self._check_vm_connectivity(ip_address, ssh_login, private_key)
 
     @attr(type='smoke')
+    @services('compute', 'network')
     def test_network_basic_ops(self):
         self._create_keypairs()
         self._create_security_groups()
diff --git a/tempest/scenario/test_network_quotas.py b/tempest/scenario/test_network_quotas.py
index 8259feb..3268066 100644
--- a/tempest/scenario/test_network_quotas.py
+++ b/tempest/scenario/test_network_quotas.py
@@ -18,6 +18,7 @@
 from neutronclient.common import exceptions as exc
 
 from tempest.scenario.manager import NetworkScenarioTest
+from tempest.test import services
 
 MAX_REASONABLE_ITERATIONS = 51  # more than enough. Default for port is 50.
 
@@ -42,6 +43,7 @@
         cls.subnets = []
         cls.ports = []
 
+    @services('network')
     def test_create_network_until_quota_hit(self):
         hit_limit = False
         for n in xrange(MAX_REASONABLE_ITERATIONS):
@@ -56,6 +58,7 @@
                 break
         self.assertTrue(hit_limit, "Failed: Did not hit quota limit !")
 
+    @services('network')
     def test_create_subnet_until_quota_hit(self):
         if not self.networks:
             self.networks.append(
@@ -74,6 +77,7 @@
                 break
         self.assertTrue(hit_limit, "Failed: Did not hit quota limit !")
 
+    @services('network')
     def test_create_ports_until_quota_hit(self):
         if not self.networks:
             self.networks.append(
diff --git a/tempest/scenario/test_server_advanced_ops.py b/tempest/scenario/test_server_advanced_ops.py
index 8ee740e..cf72cd4 100644
--- a/tempest/scenario/test_server_advanced_ops.py
+++ b/tempest/scenario/test_server_advanced_ops.py
@@ -18,6 +18,7 @@
 from tempest.common.utils.data_utils import rand_name
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
+from tempest.test import services
 
 LOG = logging.getLogger(__name__)
 
@@ -45,6 +46,7 @@
             msg = "Skipping test - flavor_ref and flavor_ref_alt are identical"
             raise cls.skipException(msg)
 
+    @services('compute')
     def test_resize_server_confirm(self):
         # We create an instance for use in this test
         i_name = rand_name('instance')
@@ -73,6 +75,7 @@
         self.status_timeout(
             self.compute_client.servers, instance_id, 'ACTIVE')
 
+    @services('compute')
     def test_server_sequence_suspend_resume(self):
         # We create an instance for use in this test
         i_name = rand_name('instance')
diff --git a/tempest/scenario/test_server_basic_ops.py b/tempest/scenario/test_server_basic_ops.py
index 8e14b06..04204eb 100644
--- a/tempest/scenario/test_server_basic_ops.py
+++ b/tempest/scenario/test_server_basic_ops.py
@@ -18,6 +18,7 @@
 from tempest.common.utils.data_utils import rand_name
 from tempest.openstack.common import log as logging
 from tempest.scenario import manager
+from tempest.test import services
 
 LOG = logging.getLogger(__name__)
 
@@ -100,6 +101,7 @@
         instance.delete()
         self.remove_resource('instance')
 
+    @services('compute', 'network')
     def test_server_basicops(self):
         self.add_keypair()
         self.create_security_group()
diff --git a/tempest/scenario/test_snapshot_pattern.py b/tempest/scenario/test_snapshot_pattern.py
index 003c264..8c2cc76 100644
--- a/tempest/scenario/test_snapshot_pattern.py
+++ b/tempest/scenario/test_snapshot_pattern.py
@@ -16,6 +16,7 @@
 #    under the License.
 
 from tempest.scenario import manager
+from tempest.test import services
 
 
 class TestSnapshotPattern(manager.OfficialClientTest):
@@ -61,6 +62,7 @@
     def _set_floating_ip_to_server(self, server, floating_ip):
         server.add_floating_ip(floating_ip)
 
+    @services('compute', 'network', 'image')
     def test_snapshot_pattern(self):
         # prepare for booting a instance
         self._add_keypair()
diff --git a/tempest/scenario/test_stamp_pattern.py b/tempest/scenario/test_stamp_pattern.py
index 5af4bb2..c5a4aaf 100644
--- a/tempest/scenario/test_stamp_pattern.py
+++ b/tempest/scenario/test_stamp_pattern.py
@@ -144,6 +144,7 @@
         self.assertEqual(self.timestamp, got_timestamp)
 
     @testtools.skip("Skipped until the Bug #1205344 is resolved.")
+    @tempest.test.services('compute', 'network', 'volume', 'image')
     def test_stamp_pattern(self):
         # prepare for booting a instance
         self._add_keypair()
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
new file mode 100644
index 0000000..3572166
--- /dev/null
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -0,0 +1,163 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+#    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.data_utils import rand_name
+from tempest.scenario import manager
+from tempest.test import services
+
+
+class TestVolumeBootPattern(manager.OfficialClientTest):
+
+    """
+    This test case attempts to reproduce the following steps:
+
+     * Create in Cinder some bootable volume importing a Glance image
+     * Boot an instance from the bootable volume
+     * Write content to the volume
+     * Delete an instance and Boot a new instance from the volume
+     * Check written content in the instance
+     * Create a volume snapshot while the instance is running
+     * Boot an additional instance from the new snapshot based volume
+     * Check written content in the instance booted from snapshot
+    """
+
+    def _create_volume_from_image(self):
+        img_uuid = self.config.compute.image_ref
+        vol_name = rand_name('volume-origin')
+        return self.create_volume(name=vol_name, imageRef=img_uuid)
+
+    def _boot_instance_from_volume(self, vol_id, keypair):
+        # NOTE(gfidente): the syntax for block_device_mapping is
+        # dev_name=id:type:size:delete_on_terminate
+        # where type needs to be "snap" if the server is booted
+        # from a snapshot, size instead can be safely left empty
+        bd_map = {
+            'vda': vol_id + ':::0'
+        }
+        create_kwargs = {
+            'block_device_mapping': bd_map,
+            'key_name': keypair.name
+        }
+        return self.create_server(self.compute_client,
+                                  create_kwargs=create_kwargs)
+
+    def _create_snapshot_from_volume(self, vol_id):
+        volume_snapshots = self.volume_client.volume_snapshots
+        snap_name = rand_name('snapshot')
+        snap = volume_snapshots.create(volume_id=vol_id,
+                                       force=True,
+                                       display_name=snap_name)
+        self.set_resource(snap.id, snap)
+        self.status_timeout(volume_snapshots,
+                            snap.id,
+                            'available')
+        return snap
+
+    def _create_volume_from_snapshot(self, snap_id):
+        vol_name = rand_name('volume')
+        return self.create_volume(name=vol_name, snapshot_id=snap_id)
+
+    def _stop_instances(self, instances):
+        # NOTE(gfidente): two loops so we do not wait for the status twice
+        for i in instances:
+            self.compute_client.servers.stop(i)
+        for i in instances:
+            self.status_timeout(self.compute_client.servers,
+                                i.id,
+                                'SHUTOFF')
+
+    def _detach_volumes(self, volumes):
+        # NOTE(gfidente): two loops so we do not wait for the status twice
+        for v in volumes:
+            self.volume_client.volumes.detach(v)
+        for v in volumes:
+            self.status_timeout(self.volume_client.volumes,
+                                v.id,
+                                'available')
+
+    def _ssh_to_server(self, server, keypair):
+        if self.config.compute.use_floatingip_for_ssh:
+            floating_ip = self.compute_client.floating_ips.create()
+            fip_name = rand_name('scenario-fip')
+            self.set_resource(fip_name, floating_ip)
+            server.add_floating_ip(floating_ip)
+            ip = floating_ip.ip
+        else:
+            network_name_for_ssh = self.config.compute.network_for_ssh
+            ip = server.networks[network_name_for_ssh][0]
+
+        client = self.get_remote_client(ip,
+                                        private_key=keypair.private_key)
+        return client.ssh_client
+
+    def _get_content(self, ssh_client):
+        return ssh_client.exec_command('cat /tmp/text')
+
+    def _write_text(self, ssh_client):
+        text = rand_name('text-')
+        ssh_client.exec_command('echo "%s" > /tmp/text; sync' % (text))
+
+        return self._get_content(ssh_client)
+
+    def _delete_server(self, server):
+        self.compute_client.servers.delete(server)
+        self.delete_timeout(self.compute_client.servers, server.id)
+
+    def _check_content_of_written_file(self, ssh_client, expected):
+        actual = self._get_content(ssh_client)
+        self.assertEqual(expected, actual)
+
+    @services('compute', 'volume', 'image')
+    def test_volume_boot_pattern(self):
+        keypair = self.create_keypair()
+        self.create_loginable_secgroup_rule()
+
+        # create an instance from volume
+        volume_origin = self._create_volume_from_image()
+        instance_1st = self._boot_instance_from_volume(volume_origin.id,
+                                                       keypair)
+
+        # write content to volume on instance
+        ssh_client_for_instance_1st = self._ssh_to_server(instance_1st,
+                                                          keypair)
+        text = self._write_text(ssh_client_for_instance_1st)
+
+        # delete instance
+        self._delete_server(instance_1st)
+
+        # create a 2nd instance from volume
+        instance_2nd = self._boot_instance_from_volume(volume_origin.id,
+                                                       keypair)
+
+        # check the content of written file
+        ssh_client_for_instance_2nd = self._ssh_to_server(instance_2nd,
+                                                          keypair)
+        self._check_content_of_written_file(ssh_client_for_instance_2nd, text)
+
+        # snapshot a volume
+        snapshot = self._create_snapshot_from_volume(volume_origin.id)
+
+        # create a 3rd instance from snapshot
+        volume = self._create_volume_from_snapshot(snapshot.id)
+        instance_from_snapshot = self._boot_instance_from_volume(volume.id,
+                                                                 keypair)
+
+        # check the content of written file
+        ssh_client = self._ssh_to_server(instance_from_snapshot, keypair)
+        self._check_content_of_written_file(ssh_client, text)
+
+        # NOTE(gfidente): ensure resources are in clean state for
+        # deletion operations to succeed
+        self._stop_instances([instance_2nd, instance_from_snapshot])
+        self._detach_volumes([volume_origin, volume])
diff --git a/tempest/scenario/test_volume_snapshot_pattern.py b/tempest/scenario/test_volume_snapshot_pattern.py
deleted file mode 100644
index d873d30..0000000
--- a/tempest/scenario/test_volume_snapshot_pattern.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-#    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.data_utils import rand_name
-from tempest.scenario import manager
-
-
-class TestVolumeSnapshotPattern(manager.OfficialClientTest):
-
-    """
-    This test case attempts to reproduce the following steps:
-
-     * Create in Cinder some bootable volume importing a Glance image
-     * Boot an instance from the bootable volume
-     * Create a volume snapshot while the instance is running
-     * Boot an additional instance from the new snapshot based volume
-    """
-
-    def _create_volume_from_image(self):
-        img_uuid = self.config.compute.image_ref
-        vol_name = rand_name('volume-origin')
-        return self.create_volume(name=vol_name, imageRef=img_uuid)
-
-    def _boot_instance_from_volume(self, vol_id):
-        # NOTE(gfidente): the syntax for block_device_mapping is
-        # dev_name=id:type:size:delete_on_terminate
-        # where type needs to be "snap" if the server is booted
-        # from a snapshot, size instead can be safely left empty
-        bd_map = {
-            'vda': vol_id + ':::0'
-        }
-        create_kwargs = {
-            'block_device_mapping': bd_map
-        }
-        return self.create_server(self.compute_client,
-                                  create_kwargs=create_kwargs)
-
-    def _create_snapshot_from_volume(self, vol_id):
-        volume_snapshots = self.volume_client.volume_snapshots
-        snap_name = rand_name('snapshot')
-        snap = volume_snapshots.create(volume_id=vol_id,
-                                       force=True,
-                                       display_name=snap_name)
-        self.set_resource(snap.id, snap)
-        self.status_timeout(volume_snapshots,
-                            snap.id,
-                            'available')
-        return snap
-
-    def _create_volume_from_snapshot(self, snap_id):
-        vol_name = rand_name('volume')
-        return self.create_volume(name=vol_name, snapshot_id=snap_id)
-
-    def _stop_instances(self, instances):
-        # NOTE(gfidente): two loops so we do not wait for the status twice
-        for i in instances:
-            self.compute_client.servers.stop(i)
-        for i in instances:
-            self.status_timeout(self.compute_client.servers,
-                                i.id,
-                                'SHUTOFF')
-
-    def _detach_volumes(self, volumes):
-        # NOTE(gfidente): two loops so we do not wait for the status twice
-        for v in volumes:
-            self.volume_client.volumes.detach(v)
-        for v in volumes:
-            self.status_timeout(self.volume_client.volumes,
-                                v.id,
-                                'available')
-
-    def test_volume_snapshot_pattern(self):
-        volume_origin = self._create_volume_from_image()
-        i_origin = self._boot_instance_from_volume(volume_origin.id)
-        snapshot = self._create_snapshot_from_volume(volume_origin.id)
-        volume = self._create_volume_from_snapshot(snapshot.id)
-        i = self._boot_instance_from_volume(volume.id)
-        # NOTE(gfidente): ensure resources are in clean state for
-        # deletion operations to succeed
-        self._stop_instances([i_origin, i])
-        self._detach_volumes([volume_origin, volume])
diff --git a/tempest/services/compute/json/servers_client.py b/tempest/services/compute/json/servers_client.py
index c5827f6..1f2daec 100644
--- a/tempest/services/compute/json/servers_client.py
+++ b/tempest/services/compute/json/servers_client.py
@@ -21,6 +21,7 @@
 import urllib
 
 from tempest.common.rest_client import RestClient
+from tempest.common import waiters
 from tempest import exceptions
 
 
@@ -152,28 +153,7 @@
 
     def wait_for_server_status(self, server_id, status):
         """Waits for a server to reach a given status."""
-        resp, body = self.get_server(server_id)
-        server_status = body['status']
-        start = int(time.time())
-
-        while(server_status != status):
-            if status == 'BUILD' and server_status != 'UNKNOWN':
-                return
-            time.sleep(self.build_interval)
-            resp, body = self.get_server(server_id)
-            server_status = body['status']
-
-            if server_status == 'ERROR':
-                raise exceptions.BuildErrorException(server_id=server_id)
-
-            timed_out = int(time.time()) - start >= self.build_timeout
-
-            if server_status != status and timed_out:
-                message = ('Server %s failed to reach %s status within the '
-                           'required time (%s s).' %
-                           (server_id, status, self.build_timeout))
-                message += ' Current status: %s.' % server_status
-                raise exceptions.TimeoutException(message)
+        return waiters.wait_for_server_status(self, server_id, status)
 
     def wait_for_server_termination(self, server_id, ignore_error=False):
         """Waits for server to reach termination."""
diff --git a/tempest/services/compute/xml/servers_client.py b/tempest/services/compute/xml/servers_client.py
index ec9464a..bf72bdc 100644
--- a/tempest/services/compute/xml/servers_client.py
+++ b/tempest/services/compute/xml/servers_client.py
@@ -22,6 +22,7 @@
 from lxml import etree
 
 from tempest.common.rest_client import RestClientXML
+from tempest.common import waiters
 from tempest import exceptions
 from tempest.openstack.common import log as logging
 from tempest.services.compute.xml.common import Document
@@ -46,9 +47,14 @@
     # expanded xml namespace.
     type_ns_prefix = ('{http://docs.openstack.org/compute/ext/extended_ips/'
                       'api/v1.1}type')
+    mac_ns_prefix = ('{http://docs.openstack.org/compute/ext/extended_ips_mac'
+                     '/api/v1.1}mac_addr')
+
     if type_ns_prefix in ip:
-        ip['OS-EXT-IPS:type'] = ip[type_ns_prefix]
-        ip.pop(type_ns_prefix)
+        ip['OS-EXT-IPS:type'] = ip.pop(type_ns_prefix)
+
+    if mac_ns_prefix in ip:
+        ip['OS-EXT-IPS-MAC:mac_addr'] = ip.pop(mac_ns_prefix)
     return ip
 
 
@@ -101,11 +107,35 @@
         json['addresses'] = json_addresses
     else:
         json = xml_to_json(xml_dom)
-    diskConfig = '{http://docs.openstack.org/compute/ext/disk_config/api/v1.1'\
-                 '}diskConfig'
+    diskConfig = ('{http://docs.openstack.org'
+                  '/compute/ext/disk_config/api/v1.1}diskConfig')
+    terminated_at = ('{http://docs.openstack.org/'
+                     'compute/ext/server_usage/api/v1.1}terminated_at')
+    launched_at = ('{http://docs.openstack.org'
+                   '/compute/ext/server_usage/api/v1.1}launched_at')
+    power_state = ('{http://docs.openstack.org'
+                   '/compute/ext/extended_status/api/v1.1}power_state')
+    availability_zone = ('{http://docs.openstack.org'
+                         '/compute/ext/extended_availability_zone/api/v2}'
+                         'availability_zone')
+    vm_state = ('{http://docs.openstack.org'
+                '/compute/ext/extended_status/api/v1.1}vm_state')
+    task_state = ('{http://docs.openstack.org'
+                  '/compute/ext/extended_status/api/v1.1}task_state')
     if diskConfig in json:
-        json['OS-DCF:diskConfig'] = json[diskConfig]
-        del json[diskConfig]
+        json['OS-DCF:diskConfig'] = json.pop(diskConfig)
+    if terminated_at in json:
+        json['OS-SRV-USG:terminated_at'] = json.pop(terminated_at)
+    if launched_at in json:
+        json['OS-SRV-USG:launched_at'] = json.pop(launched_at)
+    if power_state in json:
+        json['OS-EXT-STS:power_state'] = json.pop(power_state)
+    if availability_zone in json:
+        json['OS-EXT-AZ:availability_zone'] = json.pop(availability_zone)
+    if vm_state in json:
+        json['OS-EXT-STS:vm_state'] = json.pop(vm_state)
+    if task_state in json:
+        json['OS-EXT-STS:task_state'] = json.pop(task_state)
     return json
 
 
@@ -307,28 +337,7 @@
 
     def wait_for_server_status(self, server_id, status):
         """Waits for a server to reach a given status."""
-        resp, body = self.get_server(server_id)
-        server_status = body['status']
-        start = int(time.time())
-
-        while(server_status != status):
-            if status == 'BUILD' and server_status != 'UNKNOWN':
-                return
-            time.sleep(self.build_interval)
-            resp, body = self.get_server(server_id)
-            server_status = body['status']
-
-            if server_status == 'ERROR':
-                raise exceptions.BuildErrorException(server_id=server_id)
-
-            timed_out = int(time.time()) - start >= self.build_timeout
-
-            if server_status != status and timed_out:
-                message = ('Server %s failed to reach %s status within the '
-                           'required time (%s s).' %
-                           (server_id, status, self.build_timeout))
-                message += ' Current status: %s.' % server_status
-                raise exceptions.TimeoutException(message)
+        return waiters.wait_for_server_status(self, server_id, status)
 
     def wait_for_server_termination(self, server_id, ignore_error=False):
         """Waits for server to reach termination."""
diff --git a/tempest/services/identity/v3/json/credentials_client.py b/tempest/services/identity/v3/json/credentials_client.py
new file mode 100644
index 0000000..c3f788a
--- /dev/null
+++ b/tempest/services/identity/v3/json/credentials_client.py
@@ -0,0 +1,97 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack Foundation
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import json
+from urlparse import urlparse
+
+from tempest.common.rest_client import RestClient
+
+
+class CredentialsClientJSON(RestClient):
+
+    def __init__(self, config, username, password, auth_url, tenant_name=None):
+        super(CredentialsClientJSON, self).__init__(config, username, password,
+                                                    auth_url, tenant_name)
+        self.service = self.config.identity.catalog_type
+        self.endpoint_url = 'adminURL'
+
+    def request(self, method, url, headers=None, body=None, wait=None):
+        """Overriding the existing HTTP request in super class rest_client."""
+        self._set_auth()
+        self.base_url = self.base_url.replace(urlparse(self.base_url).path,
+                                              "/v3")
+        return super(CredentialsClientJSON, self).request(method, url,
+                                                          headers=headers,
+                                                          body=body)
+
+    def create_credential(self, access_key, secret_key, user_id, project_id):
+        """Creates a credential."""
+        blob = "{\"access\": \"%s\", \"secret\": \"%s\"}" % (
+            access_key, secret_key)
+        post_body = {
+            "blob": blob,
+            "project_id": project_id,
+            "type": "ec2",
+            "user_id": user_id
+        }
+        post_body = json.dumps({'credential': post_body})
+        resp, body = self.post('credentials', post_body,
+                               self.headers)
+        body = json.loads(body)
+        body['credential']['blob'] = json.loads(body['credential']['blob'])
+        return resp, body['credential']
+
+    def update_credential(self, credential_id, **kwargs):
+        """Updates a credential."""
+        resp, body = self.get_credential(credential_id)
+        cred_type = kwargs.get('type', body['type'])
+        access_key = kwargs.get('access_key', body['blob']['access'])
+        secret_key = kwargs.get('secret_key', body['blob']['secret'])
+        project_id = kwargs.get('project_id', body['project_id'])
+        user_id = kwargs.get('user_id', body['user_id'])
+        blob = "{\"access\": \"%s\", \"secret\": \"%s\"}" % (
+            access_key, secret_key)
+        post_body = {
+            "blob": blob,
+            "project_id": project_id,
+            "type": cred_type,
+            "user_id": user_id
+        }
+        post_body = json.dumps({'credential': post_body})
+        resp, body = self.patch('credentials/%s' % credential_id, post_body,
+                                self.headers)
+        body = json.loads(body)
+        body['credential']['blob'] = json.loads(body['credential']['blob'])
+        return resp, body['credential']
+
+    def get_credential(self, credential_id):
+        """To GET Details of a credential."""
+        resp, body = self.get('credentials/%s' % credential_id)
+        body = json.loads(body)
+        body['credential']['blob'] = json.loads(body['credential']['blob'])
+        return resp, body['credential']
+
+    def list_credentials(self):
+        """Lists out all the available credentials."""
+        resp, body = self.get('credentials')
+        body = json.loads(body)
+        return resp, body['credentials']
+
+    def delete_credential(self, credential_id):
+        """Deletes a credential."""
+        resp, body = self.delete('credentials/%s' % credential_id)
+        return resp, body
diff --git a/tempest/services/identity/v3/xml/credentials_client.py b/tempest/services/identity/v3/xml/credentials_client.py
new file mode 100644
index 0000000..dc0ade1
--- /dev/null
+++ b/tempest/services/identity/v3/xml/credentials_client.py
@@ -0,0 +1,121 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack Foundation
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import json
+from urlparse import urlparse
+
+from lxml import etree
+
+from tempest.common.rest_client import RestClientXML
+from tempest.services.compute.xml.common import Document
+from tempest.services.compute.xml.common import Element
+from tempest.services.compute.xml.common import Text
+from tempest.services.compute.xml.common import xml_to_json
+
+
+XMLNS = "http://docs.openstack.org/identity/api/v3"
+
+
+class CredentialsClientXML(RestClientXML):
+
+    def __init__(self, config, username, password, auth_url, tenant_name=None):
+        super(CredentialsClientXML, self).__init__(config, username, password,
+                                                   auth_url, tenant_name)
+        self.service = self.config.identity.catalog_type
+        self.endpoint_url = 'adminURL'
+
+    def request(self, method, url, headers=None, body=None, wait=None):
+        """Overriding the existing HTTP request in super class rest_client."""
+        self._set_auth()
+        self.base_url = self.base_url.replace(urlparse(self.base_url).path,
+                                              "/v3")
+        return super(CredentialsClientXML, self).request(method, url,
+                                                         headers=headers,
+                                                         body=body)
+
+    def _parse_body(self, body):
+        data = xml_to_json(body)
+        return data
+
+    def _parse_creds(self, node):
+        array = []
+        for child in node.getchildren():
+            tag_list = child.tag.split('}', 1)
+            if tag_list[1] == "credential":
+                array.append(xml_to_json(child))
+        return array
+
+    def create_credential(self, access_key, secret_key, user_id, project_id):
+        """Creates a credential."""
+        cred_type = 'ec2'
+        access = "&quot;access&quot;: &quot;%s&quot;" % access_key
+        secret = "&quot;secret&quot;: &quot;%s&quot;" % secret_key
+        blob = Element('blob',
+                       xmlns=XMLNS)
+        blob.append(Text("{%s , %s}"
+                         % (access, secret)))
+        credential = Element('credential', project_id=project_id,
+                             type=cred_type, user_id=user_id)
+        credential.append(blob)
+        resp, body = self.post('credentials', str(Document(credential)),
+                               self.headers)
+        body = self._parse_body(etree.fromstring(body))
+        body['blob'] = json.loads(body['blob'])
+        return resp, body
+
+    def update_credential(self, credential_id, **kwargs):
+        """Updates a credential."""
+        resp, body = self.get_credential(credential_id)
+        cred_type = kwargs.get('type', body['type'])
+        access_key = kwargs.get('access_key', body['blob']['access'])
+        secret_key = kwargs.get('secret_key', body['blob']['secret'])
+        project_id = kwargs.get('project_id', body['project_id'])
+        user_id = kwargs.get('user_id', body['user_id'])
+        access = "&quot;access&quot;: &quot;%s&quot;" % access_key
+        secret = "&quot;secret&quot;: &quot;%s&quot;" % secret_key
+        blob = Element('blob',
+                       xmlns=XMLNS)
+        blob.append(Text("{%s , %s}"
+                         % (access, secret)))
+        credential = Element('credential', project_id=project_id,
+                             type=cred_type, user_id=user_id)
+        credential.append(blob)
+        resp, body = self.patch('credentials/%s' % credential_id,
+                                str(Document(credential)),
+                                self.headers)
+        body = self._parse_body(etree.fromstring(body))
+        body['blob'] = json.loads(body['blob'])
+        return resp, body
+
+    def get_credential(self, credential_id):
+        """To GET Details of a credential."""
+        resp, body = self.get('credentials/%s' % credential_id, self.headers)
+        body = self._parse_body(etree.fromstring(body))
+        body['blob'] = json.loads(body['blob'])
+        return resp, body
+
+    def list_credentials(self):
+        """Lists out all the available credentials."""
+        resp, body = self.get('credentials', self.headers)
+        body = self._parse_creds(etree.fromstring(body))
+        return resp, body
+
+    def delete_credential(self, credential_id):
+        """Deletes a credential."""
+        resp, body = self.delete('credentials/%s' % credential_id,
+                                 self.headers)
+        return resp, body
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index ef12a00..10e64f8 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -242,7 +242,7 @@
         update_body['admin_state_up'] = kwargs.get(
             'admin_state_up', body['router']['admin_state_up'])
         # Must uncomment/modify these lines once LP question#233187 is solved
-        #update_body['external_gateway_info'] = kwargs.get(
+        # update_body['external_gateway_info'] = kwargs.get(
         # 'external_gateway_info', body['router']['external_gateway_info'])
         update_body = dict(router=update_body)
         update_body = json.dumps(update_body)
@@ -296,18 +296,55 @@
         body = json.loads(body)
         return resp, body
 
+    def list_security_groups(self):
+        uri = '%s/security-groups' % (self.uri_prefix)
+        resp, body = self.get(uri, self.headers)
+        body = json.loads(body)
+        return resp, body
+
+    def delete_security_group(self, secgroup_id):
+        uri = '%s/security-groups/%s' % (self.uri_prefix, secgroup_id)
+        resp, body = self.delete(uri, self.headers)
+        return resp, body
+
+    def create_security_group(self, name, **kwargs):
+        post_body = {
+            'security_group': {
+                'name': name,
+            }
+        }
+        for key, value in kwargs.iteritems():
+            post_body['security_group'][str(key)] = value
+        body = json.dumps(post_body)
+        uri = '%s/security-groups' % (self.uri_prefix)
+        resp, body = self.post(uri, headers=self.headers, body=body)
+        body = json.loads(body)
+        return resp, body
+
     def show_floating_ip(self, floating_ip_id):
         uri = '%s/floatingips/%s' % (self.uri_prefix, floating_ip_id)
         resp, body = self.get(uri, self.headers)
         body = json.loads(body)
         return resp, body
 
+    def show_security_group(self, secgroup_id):
+        uri = '%s/security-groups/%s' % (self.uri_prefix, secgroup_id)
+        resp, body = self.get(uri, self.headers)
+        body = json.loads(body)
+        return resp, body
+
     def list_floating_ips(self):
         uri = '%s/floatingips' % (self.uri_prefix)
         resp, body = self.get(uri, self.headers)
         body = json.loads(body)
         return resp, body
 
+    def list_security_group_rules(self):
+        uri = '%s/security-group-rules' % (self.uri_prefix)
+        resp, body = self.get(uri, self.headers)
+        body = json.loads(body)
+        return resp, body
+
     def delete_floating_ip(self, floating_ip_id):
         uri = '%s/floatingips/%s' % (self.uri_prefix, floating_ip_id)
         resp, body = self.delete(uri, self.headers)
@@ -321,3 +358,46 @@
         resp, body = self.put(uri, headers=self.headers, body=body)
         body = json.loads(body)
         return resp, body
+
+    def create_security_group_rule(self, secgroup_id,
+                                   direction='ingress', **kwargs):
+        post_body = {
+            'security_group_rule': {
+                'direction': direction,
+                'security_group_id': secgroup_id
+            }
+        }
+        for key, value in kwargs.iteritems():
+            post_body['security_group_rule'][str(key)] = value
+        body = json.dumps(post_body)
+        uri = '%s/security-group-rules' % (self.uri_prefix)
+        resp, body = self.post(uri, headers=self.headers, body=body)
+        body = json.loads(body)
+        return resp, body
+
+    def create_bulk_subnet(self, subnet_list):
+        post_body = {'subnets': subnet_list}
+        body = json.dumps(post_body)
+        uri = '%s/subnets' % (self.uri_prefix)
+        resp, body = self.post(uri, headers=self.headers, body=body)
+        body = json.loads(body)
+        return resp, body
+
+    def delete_security_group_rule(self, rule_id):
+        uri = '%s/security-group-rules/%s' % (self.uri_prefix, rule_id)
+        resp, body = self.delete(uri, self.headers)
+        return resp, body
+
+    def show_security_group_rule(self, rule_id):
+        uri = '%s/security-group-rules/%s' % (self.uri_prefix, rule_id)
+        resp, body = self.get(uri, self.headers)
+        body = json.loads(body)
+        return resp, body
+
+    def create_bulk_port(self, port_list):
+        post_body = {'ports': port_list}
+        body = json.dumps(post_body)
+        uri = '%s/ports' % (self.uri_prefix)
+        resp, body = self.post(uri, headers=self.headers, body=body)
+        body = json.loads(body)
+        return resp, body
diff --git a/tempest/services/network/xml/network_client.py b/tempest/services/network/xml/network_client.py
index d4fb656..8303bc0 100755
--- a/tempest/services/network/xml/network_client.py
+++ b/tempest/services/network/xml/network_client.py
@@ -161,6 +161,94 @@
         body = _root_tag_fetcher_and_xml_to_json_parse(body)
         return resp, body
 
+    def create_security_group(self, name):
+        uri = '%s/security-groups' % (self.uri_prefix)
+        post_body = Element("security_group")
+        p2 = Element("name", name)
+        post_body.append(p2)
+        resp, body = self.post(uri, str(Document(post_body)), self.headers)
+        body = _root_tag_fetcher_and_xml_to_json_parse(body)
+        return resp, body
+
+    def list_security_groups(self):
+        url = '%s/security-groups' % (self.uri_prefix)
+        resp, body = self.get(url, self.headers)
+        secgroups = self._parse_array(etree.fromstring(body))
+        secgroups = {"security_groups": secgroups}
+        return resp, secgroups
+
+    def delete_security_group(self, secgroup_id):
+        uri = '%s/security-groups/%s' % (self.uri_prefix, str(secgroup_id))
+        return self.delete(uri, self.headers)
+
+    def show_security_group(self, secgroup_id):
+        uri = '%s/security-groups/%s' % (self.uri_prefix, str(secgroup_id))
+        resp, body = self.get(uri, self.headers)
+        body = _root_tag_fetcher_and_xml_to_json_parse(body)
+        return resp, body
+
+    def list_security_group_rules(self):
+        url = '%s/security-group-rules' % (self.uri_prefix)
+        resp, body = self.get(url, self.headers)
+        rules = self._parse_array(etree.fromstring(body))
+        rules = {"security_group_rules": rules}
+        return resp, rules
+
+    def create_security_group_rule(self, secgroup_id,
+                                   direction='ingress', **kwargs):
+        uri = '%s/security-group-rules' % (self.uri_prefix)
+        rule = Element("security_group_rule")
+        p1 = Element('security_group_id', secgroup_id)
+        p2 = Element('direction', direction)
+        rule.append(p1)
+        rule.append(p2)
+        for key, val in kwargs.items():
+            key = Element(key, val)
+            rule.append(key)
+        resp, body = self.post(uri, str(Document(rule)), self.headers)
+        body = _root_tag_fetcher_and_xml_to_json_parse(body)
+        return resp, body
+
+    def delete_security_group_rule(self, rule_id):
+        uri = '%s/security-group-rules/%s' % (self.uri_prefix, str(rule_id))
+        return self.delete(uri, self.headers)
+
+    def show_security_group_rule(self, rule_id):
+        uri = '%s/security-group-rules/%s' % (self.uri_prefix, str(rule_id))
+        resp, body = self.get(uri, self.headers)
+        body = _root_tag_fetcher_and_xml_to_json_parse(body)
+        return resp, body
+
+    def create_bulk_subnet(self, subnet_list):
+        uri = '%s/subnets' % (self.uri_prefix)
+        post_body = Element("subnets")
+        for i in range(len(subnet_list)):
+            v = subnet_list[i]
+            p1 = Element("subnet")
+            for k, kv in v.iteritems():
+                p2 = Element(k, kv)
+                p1.append(p2)
+            post_body.append(p1)
+        resp, body = self.post(uri, str(Document(post_body)), self.headers)
+        subnets = self._parse_array(etree.fromstring(body))
+        subnets = {"subnets": subnets}
+        return resp, subnets
+
+    def create_bulk_port(self, port_list):
+        uri = '%s/ports' % (self.uri_prefix)
+        post_body = Element("ports")
+        for i in range(len(port_list)):
+            v = port_list[i]
+            p1 = Element("port")
+            for k, kv in v.iteritems():
+                p2 = Element(k, kv)
+                p1.append(p2)
+            post_body.append(p1)
+        resp, body = self.post(uri, str(Document(post_body)), self.headers)
+        ports = self._parse_array(etree.fromstring(body))
+        ports = {"ports": ports}
+        return resp, ports
+
 
 def _root_tag_fetcher_and_xml_to_json_parse(xml_returned_body):
     body = ET.fromstring(xml_returned_body)
diff --git a/tempest/services/volume/json/volumes_client.py b/tempest/services/volume/json/volumes_client.py
index 2ae73b1..c35452e 100644
--- a/tempest/services/volume/json/volumes_client.py
+++ b/tempest/services/volume/json/volumes_client.py
@@ -89,10 +89,11 @@
         """Deletes the Specified Volume."""
         return self.delete("volumes/%s" % str(volume_id))
 
-    def upload_volume(self, volume_id, image_name):
+    def upload_volume(self, volume_id, image_name, disk_format):
         """Uploads a volume in Glance."""
         post_body = {
             'image_name': image_name,
+            'disk_format': disk_format
         }
         post_body = json.dumps({'os-volume_upload_image': post_body})
         url = 'volumes/%s/action' % (volume_id)
diff --git a/tempest/services/volume/xml/volumes_client.py b/tempest/services/volume/xml/volumes_client.py
index 49cbe28..9fa7a1e 100644
--- a/tempest/services/volume/xml/volumes_client.py
+++ b/tempest/services/volume/xml/volumes_client.py
@@ -203,10 +203,11 @@
             body = xml_to_json(etree.fromstring(body))
         return resp, body
 
-    def upload_volume(self, volume_id, image_name):
+    def upload_volume(self, volume_id, image_name, disk_format):
         """Uploads a volume in Glance."""
         post_body = Element("os-volume_upload_image",
-                            image_name=image_name)
+                            image_name=image_name,
+                            disk_format=disk_format)
         url = 'volumes/%s/action' % str(volume_id)
         resp, body = self.post(url, str(Document(post_body)), self.headers)
         volume = xml_to_json(etree.fromstring(body))
diff --git a/tempest/whitebox/README.rst b/tempest/whitebox/README.rst
deleted file mode 100644
index 0e45421..0000000
--- a/tempest/whitebox/README.rst
+++ /dev/null
@@ -1,46 +0,0 @@
-Tempest Guide to Whitebox tests
-===============================
-
-
-What are these tests?
----------------------
-
-When you hit the OpenStack API, this causes internal state changes in
-the system. This might be database transitions, vm modifications,
-other deep state changes which aren't really accessible from the
-OpenStack API. These side effects are sometimes important to
-validate.
-
-White box testing is an approach there. In white box testing you are
-given database access to the environment, and can verify internal
-record changes after an API call.
-
-This is an optional part of testing, and requires extra setup, but can
-be useful for validating Tempest internals.
-
-
-Why are these tests in tempest?
--------------------------------
-
-Especially when it comes to something like VM state changing, which is
-a coordination of numerous running daemons, and a functioning VM, it's
-very difficult to get a realistic test like this in unit tests.
-
-
-Scope of these tests
---------------------
-
-White box tests should be limitted to tests where black box testing
-(using the OpenStack API to verify results) isn't sufficient.
-
-As these poke at internals of OpenStack, it should also be realized
-that these tests are very tightly coupled to current implementation of
-OpenStack. They will need to be maintained agressively to keep up with
-internals changes in OpenStack projects.
-
-
-Example of a good test
-----------------------
-
-Pushing VMs through a series of state transitions, and ensuring along
-the way the database state transitions match what's expected.
diff --git a/tempest/whitebox/__init__.py b/tempest/whitebox/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/whitebox/__init__.py
+++ /dev/null
diff --git a/tempest/whitebox/manager.py b/tempest/whitebox/manager.py
deleted file mode 100644
index 3b1b107..0000000
--- a/tempest/whitebox/manager.py
+++ /dev/null
@@ -1,146 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack, LLC
-# 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
-import shlex
-import subprocess
-import sys
-
-from sqlalchemy import create_engine, MetaData
-
-from tempest.common.ssh import Client
-from tempest.common.utils.data_utils import rand_name
-from tempest import exceptions
-from tempest.openstack.common import log as logging
-from tempest.scenario import manager
-
-LOG = logging.getLogger(__name__)
-
-
-class WhiteboxTest(object):
-
-    """
-    Base test case class mixin for "whitebox tests"
-
-    Whitebox tests are tests that have the following characteristics:
-
-     * Test common and advanced operations against a set of servers
-     * Use a client that it is possible to send random or bad data with
-     * SSH into either a host or a guest in order to validate server state
-     * May execute SQL queries directly against internal databases to verify
-       the state of data records
-    """
-    pass
-
-
-class ComputeWhiteboxTest(manager.OfficialClientTest):
-
-    """
-    Base smoke test case class for OpenStack Compute API (Nova)
-    """
-
-    @classmethod
-    def setUpClass(cls):
-        super(ComputeWhiteboxTest, cls).setUpClass()
-        if not cls.config.whitebox.whitebox_enabled:
-            msg = "Whitebox testing disabled"
-            raise cls.skipException(msg)
-
-        # Add some convenience attributes that tests use...
-        cls.nova_dir = cls.config.whitebox.source_dir
-        cls.compute_bin_dir = cls.config.whitebox.bin_dir
-        cls.compute_config_path = cls.config.whitebox.config_path
-        cls.build_interval = cls.config.compute.build_interval
-        cls.build_timeout = cls.config.compute.build_timeout
-        cls.ssh_user = cls.config.compute.ssh_user
-        cls.image_ref = cls.config.compute.image_ref
-        cls.image_ref_alt = cls.config.compute.image_ref_alt
-        cls.flavor_ref = cls.config.compute.flavor_ref
-        cls.flavor_ref_alt = cls.config.compute.flavor_ref_alt
-
-    # NOTE(afazekas): Mimics the helper method used in the api tests
-    @classmethod
-    def create_server(cls, **kwargs):
-        flavor_ref = cls.config.compute.flavor_ref
-        image_ref = cls.config.compute.image_ref
-        name = rand_name(cls.__name__ + "-instance")
-        if 'name' in kwargs:
-            name = kwargs.pop('name')
-        flavor = kwargs.get('flavor', flavor_ref)
-        image_id = kwargs.get('image_id', image_ref)
-
-        server = cls.compute_client.servers.create(
-            name, image_id, flavor, **kwargs)
-
-        if 'wait_until' in kwargs:
-            cls.status_timeout(cls.compute_client.servers, server.id,
-                               server['id'], kwargs['wait_until'])
-
-        server = cls.compute_client.servers.get(server.id)
-        cls.set_resource(name, server)
-        return server
-
-    @classmethod
-    def get_db_handle_and_meta(cls, database='nova'):
-        """Return a connection handle and metadata of an OpenStack database."""
-        engine_args = {"echo": False,
-                       "convert_unicode": True,
-                       "pool_recycle": 3600
-                       }
-
-        try:
-            engine = create_engine(cls.config.whitebox.db_uri, **engine_args)
-            connection = engine.connect()
-            meta = MetaData()
-            meta.reflect(bind=engine)
-
-        except Exception as e:
-            raise exceptions.SQLException(message=e)
-
-        return connection, meta
-
-    def nova_manage(self, category, action, params):
-        """Executes nova-manage command for the given action."""
-
-        nova_manage_path = os.path.join(self.compute_bin_dir, 'nova-manage')
-        cmd = ' '.join([nova_manage_path, category, action, params])
-
-        if self.deploy_mode == 'devstack-local':
-            if not os.path.isdir(self.nova_dir):
-                sys.exit("Cannot find Nova source directory: %s" %
-                         self.nova_dir)
-
-            cmd = shlex.split(cmd)
-            result = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-
-        # TODO(rohitk): Need to define host connection parameters in config
-        else:
-            client = self.get_ssh_connection(self.config.whitebox.api_host,
-                                             self.config.whitebox.api_user,
-                                             self.config.whitebox.api_passwd)
-            result = client.exec_command(cmd)
-
-        return result
-
-    def get_ssh_connection(self, host, username, password):
-        """Create an SSH connection object to a host."""
-        ssh_timeout = self.config.compute.ssh_timeout
-        ssh_client = Client(host, username, password, ssh_timeout)
-        if not ssh_client.test_connection_auth():
-            raise exceptions.SSHTimeout()
-        else:
-            return ssh_client
diff --git a/tempest/whitebox/test_images_whitebox.py b/tempest/whitebox/test_images_whitebox.py
deleted file mode 100644
index 06dcd7f..0000000
--- a/tempest/whitebox/test_images_whitebox.py
+++ /dev/null
@@ -1,163 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack, LLC
-# 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.data_utils import rand_name
-from tempest.openstack.common import log as logging
-from tempest.whitebox import manager
-
-from novaclient import exceptions
-
-LOG = logging.getLogger(__name__)
-
-
-class ImagesWhiteboxTest(manager.ComputeWhiteboxTest):
-    _interface = 'json'
-
-    @classmethod
-    def setUpClass(cls):
-        super(ImagesWhiteboxTest, cls).setUpClass()
-        cls.create_image = cls.compute_client.servers.create_image
-        cls.connection, cls.meta = cls.get_db_handle_and_meta()
-        cls.shared_server = cls.create_server()
-        cls.image_ids = []
-
-    @classmethod
-    def tearDownClass(cls):
-        """Delete images and server after a test is executed."""
-        for image_id in cls.image_ids:
-            cls.client.delete_image(image_id)
-            cls.image_ids.remove(image_id)
-        super(ImagesWhiteboxTest, cls).tearDownClass()
-
-    @classmethod
-    def update_state(self, server_id, vm_state, task_state, deleted=0):
-        """Update states of an instance in database for validation."""
-        if not task_state:
-            task_state = "NULL"
-
-        instances = self.meta.tables['instances']
-        stmt = instances.update().where(instances.c.uuid == server_id).values(
-            deleted=deleted,
-            vm_state=vm_state,
-            task_state=task_state)
-
-        self.connection.execute(stmt, autocommit=True)
-
-    def _test_create_image_409_base(self, vm_state, task_state, deleted=0):
-        """Base method for create image tests based on vm and task states."""
-        try:
-            self.update_state(self.shared_server.id, vm_state,
-                              task_state, deleted)
-
-            image_name = rand_name('snap-')
-            self.assertRaises(exceptions.Conflict,
-                              self.create_image,
-                              self.shared_server.id, image_name)
-        except Exception:
-            LOG.error("Should not allow create image when vm_state=%s and "
-                      "task_state=%s" % (vm_state, task_state))
-            raise
-        finally:
-            self.update_state(self.shared_server.id, 'active', None)
-
-    def test_create_image_when_vm_eq_building_task_eq_scheduling(self):
-        # 409 error when instance states are building,scheduling
-        self._test_create_image_409_base("building", "scheduling")
-
-    def test_create_image_when_vm_eq_building_task_eq_networking(self):
-        # 409 error when instance states are building,networking
-        self._test_create_image_409_base("building", "networking")
-
-    def test_create_image_when_vm_eq_building_task_eq_bdm(self):
-        # 409 error when instance states are building,block_device_mapping
-        self._test_create_image_409_base("building", "block_device_mapping")
-
-    def test_create_image_when_vm_eq_building_task_eq_spawning(self):
-        # 409 error when instance states are building,spawning
-        self._test_create_image_409_base("building", "spawning")
-
-    def test_create_image_when_vm_eq_active_task_eq_image_backup(self):
-        # 409 error when instance states are active,image_backup
-        self._test_create_image_409_base("active", "image_backup")
-
-    def test_create_image_when_vm_eq_resized_task_eq_resize_prep(self):
-        # 409 error when instance states are resized,resize_prep
-        self._test_create_image_409_base("resized", "resize_prep")
-
-    def test_create_image_when_vm_eq_resized_task_eq_resize_migrating(self):
-        # 409 error when instance states are resized,resize_migrating
-        self._test_create_image_409_base("resized", "resize_migrating")
-
-    def test_create_image_when_vm_eq_resized_task_eq_resize_migrated(self):
-        # 409 error when instance states are resized,resize_migrated
-        self._test_create_image_409_base("resized", "resize_migrated")
-
-    def test_create_image_when_vm_eq_resized_task_eq_resize_finish(self):
-        # 409 error when instance states are resized,resize_finish
-        self._test_create_image_409_base("resized", "resize_finish")
-
-    def test_create_image_when_vm_eq_resized_task_eq_resize_reverting(self):
-        # 409 error when instance states are resized,resize_reverting
-        self._test_create_image_409_base("resized", "resize_reverting")
-
-    def test_create_image_when_vm_eq_resized_task_eq_resize_confirming(self):
-        # 409 error when instance states are resized,resize_confirming
-        self._test_create_image_409_base("resized", "resize_confirming")
-
-    def test_create_image_when_vm_eq_active_task_eq_resize_verify(self):
-        # 409 error when instance states are active,resize_verify
-        self._test_create_image_409_base("active", "resize_verify")
-
-    def test_create_image_when_vm_eq_active_task_eq_updating_password(self):
-        # 409 error when instance states are active,updating_password
-        self._test_create_image_409_base("active", "updating_password")
-
-    def test_create_image_when_vm_eq_active_task_eq_rebuilding(self):
-        # 409 error when instance states are active,rebuilding
-        self._test_create_image_409_base("active", "rebuilding")
-
-    def test_create_image_when_vm_eq_active_task_eq_rebooting(self):
-        # 409 error when instance states are active,rebooting
-        self._test_create_image_409_base("active", "rebooting")
-
-    def test_create_image_when_vm_eq_building_task_eq_deleting(self):
-        # 409 error when instance states are building,deleting
-        self._test_create_image_409_base("building", "deleting")
-
-    def test_create_image_when_vm_eq_active_task_eq_deleting(self):
-        # 409 error when instance states are active,deleting
-        self._test_create_image_409_base("active", "deleting")
-
-    def test_create_image_when_vm_eq_error_task_eq_building(self):
-        # 409 error when instance states are error,building
-        self._test_create_image_409_base("error", "building")
-
-    def test_create_image_when_vm_eq_error_task_eq_none(self):
-        # 409 error when instance states are error,None
-        self._test_create_image_409_base("error", None)
-
-    def test_create_image_when_vm_eq_deleted_task_eq_none(self):
-        # 409 error when instance states are deleted,None
-        self._test_create_image_409_base("deleted", None)
-
-    def test_create_image_when_vm_eq_resized_task_eq_none(self):
-        # 409 error when instance states are resized,None
-        self._test_create_image_409_base("resized", None)
-
-    def test_create_image_when_vm_eq_error_task_eq_resize_prep(self):
-        # 409 error when instance states are error,resize_prep
-        self._test_create_image_409_base("error", "resize_prep")
diff --git a/tempest/whitebox/test_servers_whitebox.py b/tempest/whitebox/test_servers_whitebox.py
deleted file mode 100644
index b6c888c..0000000
--- a/tempest/whitebox/test_servers_whitebox.py
+++ /dev/null
@@ -1,184 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack, LLC
-# 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.identity.base import BaseIdentityAdminTest
-from tempest import exceptions
-from tempest.openstack.common import log as logging
-from tempest.whitebox import manager
-
-LOG = logging.getLogger(__name__)
-
-
-class ServersWhiteboxTest(manager.ComputeWhiteboxTest):
-    _interface = 'json'
-
-    @classmethod
-    def setUpClass(cls):
-        super(ServersWhiteboxTest, cls).setUpClass()
-        # NOTE(afazekas): Strange relationship
-        BaseIdentityAdminTest.setUpClass()
-        cls.client = cls.servers_client
-        cls.img_client = cls.images_client
-        cls.admin_client = BaseIdentityAdminTest.client
-
-        cls.connection, cls.meta = cls.get_db_handle_and_meta()
-
-        resp, tenants = cls.admin_client.list_tenants()
-        cls.tenant_id = [
-            tnt['id']
-            for tnt in tenants if tnt['name'] == cls.config.compute.tenant_name
-        ][0]
-
-        cls.shared_server = cls.create_server()
-
-    def tearDown(cls):
-        for server in cls.servers:
-            try:
-                cls.client.delete_server(server['id'])
-            except exceptions.NotFound:
-                continue
-
-    def update_state(self, server_id, vm_state, task_state, deleted=0):
-        """Update states of an instance in database for validation."""
-        if not task_state:
-            task_state = 'NULL'
-
-        instances = self.meta.tables['instances']
-        stmt = instances.update().where(instances.c.uuid == server_id).values(
-            deleted=deleted,
-            vm_state=vm_state,
-            task_state=task_state)
-        self.connection.execute(stmt, autocommit=True)
-
-    def _test_delete_server_base(self, vm_state, task_state):
-        """
-        Base method for delete server tests based on vm and task states.
-        Validates for successful server termination.
-        """
-        server = self.create_server()
-        self.update_state(server['id'], vm_state, task_state)
-
-        resp, body = self.client.delete_server(server['id'])
-        self.assertEqual('204', resp['status'])
-        self.client.wait_for_server_termination(server['id'],
-                                                ignore_error=True)
-
-        instances = self.meta.tables['instances']
-        stmt = instances.select().where(instances.c.uuid == server['id'])
-        result = self.connection.execute(stmt).first()
-
-        self.assertEqual(True, result.deleted > 0)
-        self.assertEqual('deleted', result.vm_state)
-        self.assertEqual(None, result.task_state)
-
-    def _test_delete_server_403_base(self, vm_state, task_state):
-        """
-        Base method for delete server tests based on vm and task states.
-        Validates for 403 error code.
-        """
-        try:
-            self.update_state(self.shared_server['id'], vm_state, task_state)
-
-            self.assertRaises(exceptions.Unauthorized,
-                              self.client.delete_server,
-                              self.shared_server['id'])
-        except Exception:
-            LOG.error("Should not allow delete server when vm_state=%s and "
-                      "task_state=%s" % (vm_state, task_state))
-            raise
-        finally:
-            self.update_state(self.shared_server['id'], 'active', None)
-
-    def test_delete_server_when_vm_eq_building_task_eq_networking(self):
-        # Delete server when instance states are building,networking
-        self._test_delete_server_base('building', 'networking')
-
-    def test_delete_server_when_vm_eq_building_task_eq_bdm(self):
-        # Delete server when instance states are building,block device mapping
-        self._test_delete_server_base('building', 'block_device_mapping')
-
-    def test_delete_server_when_vm_eq_building_task_eq_spawning(self):
-        # Delete server when instance states are building,spawning
-        self._test_delete_server_base('building', 'spawning')
-
-    def test_delete_server_when_vm_eq_active_task_eq_image_backup(self):
-        # Delete server when instance states are active,image_backup
-        self._test_delete_server_base('active', 'image_backup')
-
-    def test_delete_server_when_vm_eq_active_task_eq_rebuilding(self):
-        # Delete server when instance states are active,rebuilding
-        self._test_delete_server_base('active', 'rebuilding')
-
-    def test_delete_server_when_vm_eq_error_task_eq_spawning(self):
-        # Delete server when instance states are error,spawning
-        self._test_delete_server_base('error', 'spawning')
-
-    def test_delete_server_when_vm_eq_resized_task_eq_resize_prep(self):
-        # Delete server when instance states are resized,resize_prep
-        self._test_delete_server_403_base('resized', 'resize_prep')
-
-    def test_delete_server_when_vm_eq_resized_task_eq_resize_migrating(self):
-        # Delete server when instance states are resized,resize_migrating
-        self._test_delete_server_403_base('resized', 'resize_migrating')
-
-    def test_delete_server_when_vm_eq_resized_task_eq_resize_migrated(self):
-        # Delete server when instance states are resized,resize_migrated
-        self._test_delete_server_403_base('resized', 'resize_migrated')
-
-    def test_delete_server_when_vm_eq_resized_task_eq_resize_finish(self):
-        # Delete server when instance states are resized,resize_finish
-        self._test_delete_server_403_base('resized', 'resize_finish')
-
-    def test_delete_server_when_vm_eq_resized_task_eq_resize_reverting(self):
-        # Delete server when instance states are resized,resize_reverting
-        self._test_delete_server_403_base('resized', 'resize_reverting')
-
-    def test_delete_server_when_vm_eq_resized_task_eq_resize_confirming(self):
-        # Delete server when instance states are resized,resize_confirming
-        self._test_delete_server_403_base('resized', 'resize_confirming')
-
-    def test_delete_server_when_vm_eq_active_task_eq_resize_verify(self):
-        # Delete server when instance states are active,resize_verify
-        self._test_delete_server_base('active', 'resize_verify')
-
-    def test_delete_server_when_vm_eq_active_task_eq_rebooting(self):
-        # Delete server when instance states are active,rebooting
-        self._test_delete_server_base('active', 'rebooting')
-
-    def test_delete_server_when_vm_eq_building_task_eq_deleting(self):
-        # Delete server when instance states are building,deleting
-        self._test_delete_server_base('building', 'deleting')
-
-    def test_delete_server_when_vm_eq_active_task_eq_deleting(self):
-        # Delete server when instance states are active,deleting
-        self._test_delete_server_base('active', 'deleting')
-
-    def test_delete_server_when_vm_eq_error_task_eq_none(self):
-        # Delete server when instance states are error,None
-        self._test_delete_server_base('error', None)
-
-    def test_delete_server_when_vm_eq_resized_task_eq_none(self):
-        # Delete server when instance states are resized,None
-        self._test_delete_server_403_base('resized', None)
-
-    def test_delete_server_when_vm_eq_error_task_eq_resize_prep(self):
-        # Delete server when instance states are error,resize_prep
-        self._test_delete_server_base('error', 'resize_prep')
-
-    def test_delete_server_when_vm_eq_error_task_eq_error(self):
-        # Delete server when instance states are error,error
-        self._test_delete_server_base('error', 'error')
