diff --git a/tempest/manager.py b/tempest/manager.py
index 758f42c..6989a22 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -18,8 +18,10 @@
 import logging
 
 # Default client libs
-import novaclient.client
 import glance.client
+import keystoneclient.v2_0.client
+import novaclient.client
+import quantumclient.v2_0.client
 
 import tempest.config
 from tempest import exceptions
@@ -64,16 +66,7 @@
 
     def __init__(self):
         self.config = tempest.config.TempestConfig()
-        self.client = None
-
-
-class DefaultClientManager(Manager):
-
-    """
-    Manager class that indicates the client provided by the manager
-    is the default Python client that an OpenStack API provides.
-    """
-    pass
+        self.client_attr_names = []
 
 
 class FuzzClientManager(Manager):
@@ -88,23 +81,42 @@
     pass
 
 
-class ComputeDefaultClientManager(DefaultClientManager):
+class DefaultClientManager(Manager):
 
     """
-    Manager that provides the default python-novaclient client object
-    to access the OpenStack Compute API.
+    Manager that provides the default clients to access the various
+    OpenStack APIs.
     """
 
     NOVACLIENT_VERSION = '2'
 
     def __init__(self):
-        super(ComputeDefaultClientManager, self).__init__()
-        username = self.config.compute.username
-        password = self.config.compute.password
-        tenant_name = self.config.compute.tenant_name
+        super(DefaultClientManager, self).__init__()
+        self.compute_client = self._get_compute_client()
+        self.image_client = self._get_image_client()
+        self.identity_client = self._get_identity_client()
+        self.network_client = self._get_network_client()
+        self.client_attr_names = [
+            'compute_client',
+            'image_client',
+            'identity_client',
+            'network_client',
+            ]
+
+    def _get_compute_client(self, username=None, password=None,
+                            tenant_name=None):
+        # Novaclient will not execute operations for anyone but the
+        # identified user, so a new client needs to be created for
+        # each user that operations need to be performed for.
+        if not username:
+            username = self.config.compute.username
+        if not password:
+            password = self.config.compute.password
+        if not tenant_name:
+            tenant_name = self.config.compute.tenant_name
 
         if None in (username, password, tenant_name):
-            msg = ("Missing required credentials. "
+            msg = ("Missing required credentials for compute client. "
                    "username: %(username)s, password: %(password)s, "
                    "tenant_name: %(tenant_name)s") % locals()
             raise exceptions.InvalidConfiguration(msg)
@@ -115,19 +127,12 @@
         client_args = (username, password, tenant_name, auth_url)
 
         # Create our default Nova client to use in testing
-        self.client = novaclient.client.Client(self.NOVACLIENT_VERSION,
+        return novaclient.client.Client(self.NOVACLIENT_VERSION,
                         *client_args,
                         service_type=self.config.compute.catalog_type,
                         no_cache=True)
 
-
-class GlanceDefaultClientManager(DefaultClientManager):
-    """
-    Manager that provides the default glance client object to access
-    the OpenStack Images API
-    """
-    def __init__(self):
-        super(GlanceDefaultClientManager, self).__init__()
+    def _get_image_client(self):
         host = self.config.images.host
         port = self.config.images.port
         strategy = self.config.identity.strategy
@@ -137,7 +142,7 @@
         tenant_name = self.config.images.tenant_name
 
         if None in (host, port, username, password, tenant_name):
-            msg = ("Missing required credentials. "
+            msg = ("Missing required credentials for image client. "
                     "host:%(host)s, port: %(port)s username: %(username)s, "
                     "password: %(password)s, "
                     "tenant_name: %(tenant_name)s") % locals()
@@ -151,7 +156,46 @@
                  'auth_url': auth_url}
 
         # Create our default Glance client to use in testing
-        self.client = glance.client.Client(host, port, creds=creds)
+        return glance.client.Client(host, port, creds=creds)
+
+    def _get_identity_client(self):
+        # This identity client is not intended to check the security
+        # of the identity service, so use admin credentials.
+        username = self.config.identity_admin.username
+        password = self.config.identity_admin.password
+        tenant_name = self.config.identity_admin.tenant_name
+
+        if None in (username, password, tenant_name):
+            msg = ("Missing required credentials for identity client. "
+                   "username: %(username)s, password: %(password)s, "
+                   "tenant_name: %(tenant_name)s") % locals()
+            raise exceptions.InvalidConfiguration(msg)
+
+        auth_url = self.config.identity.auth_url.rstrip('tokens')
+
+        return keystoneclient.v2_0.client.Client(username=username,
+                                                 password=password,
+                                                 tenant_name=tenant_name,
+                                                 endpoint=auth_url)
+
+    def _get_network_client(self):
+        # TODO(mnewby) add network-specific auth configuration
+        username = self.config.compute.username
+        password = self.config.compute.password
+        tenant_name = self.config.compute.tenant_name
+
+        if None in (username, password, tenant_name):
+            msg = ("Missing required credentials for network client. "
+                   "username: %(username)s, password: %(password)s, "
+                   "tenant_name: %(tenant_name)s") % locals()
+            raise exceptions.InvalidConfiguration(msg)
+
+        auth_url = self.config.identity.auth_url.rstrip('tokens')
+
+        return quantumclient.v2_0.client.Client(username=username,
+                                                password=password,
+                                                tenant_name=tenant_name,
+                                                auth_url=auth_url)
 
 
 class ComputeFuzzClientManager(FuzzClientManager):
diff --git a/tempest/smoke.py b/tempest/smoke.py
index 9383559..c929273 100644
--- a/tempest/smoke.py
+++ b/tempest/smoke.py
@@ -38,10 +38,11 @@
     pass
 
 
-class ComputeSmokeTest(test.ComputeDefaultClientTest, SmokeTest):
+class DefaultClientSmokeTest(test.DefaultClientTest, SmokeTest):
 
     """
-    Base smoke test case class for OpenStack Compute API (Nova)
+    Base smoke test case class that provides the default clients to
+    access the various OpenStack APIs.
     """
 
     @classmethod
diff --git a/tempest/test.py b/tempest/test.py
index 33bb3fb..4bb8ca4 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -38,7 +38,12 @@
     def setUpClass(cls):
         cls.manager = cls.manager_class()
         cls.config = cls.manager.config
-        cls.client = cls.manager.client
+        for attr_name in cls.manager.client_attr_names:
+            # Ensure that pre-existing class attributes won't be
+            # accidentally overriden.
+            assert not hasattr(cls, attr_name)
+            client = getattr(cls.manager, attr_name)
+            setattr(cls, attr_name, client)
         cls.resource_keys = {}
         cls.resources = []
 
@@ -57,14 +62,14 @@
         del self.resource_keys[key]
 
 
-class ComputeDefaultClientTest(TestCase):
+class DefaultClientTest(TestCase):
 
     """
-    Base test case class for OpenStack Compute API (Nova)
-    that uses the novaclient libs for calling the API.
+    Base test case class that provides the default clients to access
+    the various OpenStack APIs.
     """
 
-    manager_class = manager.ComputeDefaultClientManager
+    manager_class = manager.DefaultClientManager
 
     def status_timeout(self, things, thing_id, expected_status):
         """
diff --git a/tempest/tests/compute/base.py b/tempest/tests/compute/base.py
index 84269d6..2617fbb 100644
--- a/tempest/tests/compute/base.py
+++ b/tempest/tests/compute/base.py
@@ -20,9 +20,11 @@
 import nose
 
 import unittest2 as unittest
+import nose
 
 from tempest import config
 from tempest import openstack
+from tempest import exceptions
 from tempest.common.utils.data_utils import rand_name
 from tempest.services.identity.json.admin_client import AdminClient
 
diff --git a/tempest/tests/compute/test_images.py b/tempest/tests/compute/test_images.py
index c969a0c..694965f 100644
--- a/tempest/tests/compute/test_images.py
+++ b/tempest/tests/compute/test_images.py
@@ -17,6 +17,7 @@
 
 from nose.plugins.attrib import attr
 import unittest2 as unittest
+import nose
 
 from tempest.common.utils.data_utils import rand_name, parse_image_id
 import tempest.config
@@ -381,6 +382,7 @@
 
     @classmethod
     def setUpClass(cls):
+        raise nose.SkipTest("Until Bug 1046870 is fixed")
         super(ImagesTestJSON, cls).setUpClass()
         cls.client = cls.images_client
         cls.servers_client = cls.servers_client
@@ -407,6 +409,7 @@
 
     @classmethod
     def setUpClass(cls):
+        raise nose.SkipTest("Until Bug 1046870 is fixed")
         super(ImagesTestXML, cls).setUpClass()
         cls.client = cls.images_client
         cls.servers_client = cls.servers_client
diff --git a/tempest/tests/compute/test_server_advanced_ops.py b/tempest/tests/compute/test_server_advanced_ops.py
index d6962f4..4e85b04 100644
--- a/tempest/tests/compute/test_server_advanced_ops.py
+++ b/tempest/tests/compute/test_server_advanced_ops.py
@@ -25,7 +25,7 @@
 LOG = logging.getLogger(__name__)
 
 
-class TestServerAdvancedOps(test.ComputeDefaultClientTest):
+class TestServerAdvancedOps(test.DefaultClientTest):
 
     """
     This test case stresses some advanced server instance operations:
@@ -57,7 +57,7 @@
         i_name = rand_name('instance')
         flavor_id = self.config.compute.flavor_ref
         base_image_id = self.config.compute.image_ref
-        self.instance = self.client.servers.create(
+        self.instance = self.compute_client.servers.create(
                 i_name, base_image_id, flavor_id)
         try:
             self.assertEqual(self.instance.name, i_name)
@@ -67,16 +67,16 @@
 
         self.assertEqual(self.instance.status, 'BUILD')
         instance_id = self.get_resource('instance').id
-        self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+        self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
         instance = self.get_resource('instance')
         instance_id = instance.id
         resize_flavor = self.config.compute.flavor_ref_alt
-
         LOG.debug("Resizing instance %s from flavor %s to flavor %s",
                   instance.id, instance.flavor, resize_flavor)
         instance.resize(resize_flavor)
-        self.status_timeout(self.client.servers, instance_id, 'VERIFY_RESIZE')
+        self.status_timeout(self.compute_client.servers, instance_id,
+                            'VERIFY_RESIZE')
 
         LOG.debug("Confirming resize of instance %s", instance_id)
         instance.confirm_resize()
-        self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+        self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
diff --git a/tempest/tests/compute/test_server_basic_ops.py b/tempest/tests/compute/test_server_basic_ops.py
index 8af5212..04b1451 100644
--- a/tempest/tests/compute/test_server_basic_ops.py
+++ b/tempest/tests/compute/test_server_basic_ops.py
@@ -23,7 +23,7 @@
 LOG = logging.getLogger(__name__)
 
 
-class TestServerBasicOps(smoke.ComputeSmokeTest):
+class TestServerBasicOps(smoke.DefaultClientSmokeTest):
 
     """
     This smoke test case follows this basic set of operations:
@@ -39,7 +39,7 @@
 
     def test_001_create_keypair(self):
         kp_name = rand_name('keypair-smoke')
-        self.keypair = self.client.keypairs.create(kp_name)
+        self.keypair = self.compute_client.keypairs.create(kp_name)
         try:
             self.assertEqual(self.keypair.id, kp_name)
             self.set_resource('keypair', self.keypair)
@@ -49,7 +49,8 @@
     def test_002_create_security_group(self):
         sg_name = rand_name('secgroup-smoke')
         sg_desc = sg_name + " description"
-        self.secgroup = self.client.security_groups.create(sg_name, sg_desc)
+        self.secgroup = self.compute_client.security_groups.create(sg_name,
+                                                                   sg_desc)
         try:
             self.assertEqual(self.secgroup.name, sg_name)
             self.assertEqual(self.secgroup.description, sg_desc)
@@ -76,8 +77,8 @@
         ]
         for ruleset in rulesets:
             try:
-                self.client.security_group_rules.create(
-                                                   self.secgroup.id, **ruleset)
+                self.compute_client.security_group_rules.create(
+                        self.secgroup.id, **ruleset)
             except:
                 self.fail("Failed to create rule in security group.")
 
@@ -88,7 +89,7 @@
         create_kwargs = {
             'key_name': self.get_resource('keypair').id
         }
-        self.instance = self.client.servers.create(
+        self.instance = self.compute_client.servers.create(
                 i_name, base_image_id, flavor_id, **create_kwargs)
         try:
             self.assertEqual(self.instance.name, i_name)
@@ -100,7 +101,7 @@
 
     def test_004_wait_on_active(self):
         instance_id = self.get_resource('instance').id
-        self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+        self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
 
     def test_005_pause_server(self):
         instance = self.get_resource('instance')
@@ -108,7 +109,7 @@
         LOG.debug("Pausing instance %s. Current status: %s",
                   instance_id, instance.status)
         instance.pause()
-        self.status_timeout(self.client.servers, instance_id, 'PAUSED')
+        self.status_timeout(self.compute_client.servers, instance_id, 'PAUSED')
 
     def test_006_unpause_server(self):
         instance = self.get_resource('instance')
@@ -116,7 +117,7 @@
         LOG.debug("Unpausing instance %s. Current status: %s",
                   instance_id, instance.status)
         instance.unpause()
-        self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+        self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
 
     def test_007_suspend_server(self):
         instance = self.get_resource('instance')
@@ -124,7 +125,8 @@
         LOG.debug("Suspending instance %s. Current status: %s",
                   instance_id, instance.status)
         instance.suspend()
-        self.status_timeout(self.client.servers, instance_id, 'SUSPENDED')
+        self.status_timeout(self.compute_client.servers,
+                            instance_id, 'SUSPENDED')
 
     def test_008_resume_server(self):
         instance = self.get_resource('instance')
@@ -132,7 +134,7 @@
         LOG.debug("Resuming instance %s. Current status: %s",
                   instance_id, instance.status)
         instance.resume()
-        self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+        self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
 
     def test_099_terminate_instance(self):
         instance = self.get_resource('instance')
diff --git a/tempest/tests/compute/test_servers_negative.py b/tempest/tests/compute/test_servers_negative.py
index 5d7742b..2558e6d 100644
--- a/tempest/tests/compute/test_servers_negative.py
+++ b/tempest/tests/compute/test_servers_negative.py
@@ -19,6 +19,7 @@
 
 from nose.plugins.attrib import attr
 import unittest2 as unittest
+import nose
 
 from tempest import exceptions
 from tempest import openstack
@@ -30,6 +31,7 @@
 
     @classmethod
     def setUpClass(cls):
+        raise nose.SkipTest("Until Bug 1046870 is fixed")
         super(ServersNegativeTest, cls).setUpClass()
         cls.client = cls.servers_client
         cls.img_client = cls.images_client
diff --git a/tempest/tests/identity/admin/test_roles.py b/tempest/tests/identity/admin/test_roles.py
index 4256da5..813f64a 100644
--- a/tempest/tests/identity/admin/test_roles.py
+++ b/tempest/tests/identity/admin/test_roles.py
@@ -237,10 +237,12 @@
         (user, tenant, role) = self._get_role_params()
         token = self.client.get_auth()
         self.client.delete_token(token)
-        self.assertRaises(exceptions.Unauthorized,
-                          self.client.list_user_roles, tenant['id'],
-                          user['id'])
-        self.client.clear_auth()
+        try:
+            self.assertRaises(exceptions.Unauthorized,
+                              self.client.list_user_roles, tenant['id'],
+                              user['id'])
+        finally:
+            self.client.clear_auth()
 
     def test_list_user_roles_for_non_existent_user(self):
         """Attempt to list roles of a non existent user should fail"""
