diff --git a/ceilometer/tests/tempest/api/__init__.py b/ceilometer/tests/tempest/api/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/ceilometer/tests/tempest/api/__init__.py
+++ /dev/null
diff --git a/ceilometer/tests/tempest/api/base.py b/ceilometer/tests/tempest/api/base.py
deleted file mode 100644
index ac65c3c..0000000
--- a/ceilometer/tests/tempest/api/base.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import time
-
-from oslo_utils import timeutils
-from tempest.common import compute
-from tempest import config
-from tempest.lib.common.utils import data_utils
-from tempest.lib import exceptions as lib_exc
-import tempest.test
-
-from ceilometer.tests.tempest.service import client
-
-
-CONF = config.CONF
-
-
-class ClientManager(client.Manager):
-
-    load_clients = [
-        'servers_client',
-        'compute_networks_client',
-        'compute_floating_ips_client',
-        'flavors_client',
-        'image_client_v2',
-        'telemetry_client',
-    ]
-
-
-class BaseTelemetryTest(tempest.test.BaseTestCase):
-
-    """Base test case class for all Telemetry API tests."""
-
-    credentials = ['primary']
-    client_manager = ClientManager
-
-    @classmethod
-    def skip_checks(cls):
-        super(BaseTelemetryTest, cls).skip_checks()
-        if (not CONF.service_available.ceilometer or
-                not CONF.telemetry.deprecated_api_enabled):
-            raise cls.skipException("Ceilometer API support is required")
-
-    @classmethod
-    def setup_credentials(cls):
-        cls.set_network_resources()
-        super(BaseTelemetryTest, cls).setup_credentials()
-
-    @classmethod
-    def setup_clients(cls):
-        super(BaseTelemetryTest, cls).setup_clients()
-        cls.telemetry_client = cls.os_primary.telemetry_client
-        cls.servers_client = cls.os_primary.servers_client
-        cls.flavors_client = cls.os_primary.flavors_client
-        cls.image_client_v2 = cls.os_primary.image_client_v2
-
-    @classmethod
-    def resource_setup(cls):
-        super(BaseTelemetryTest, cls).resource_setup()
-        cls.nova_notifications = ['memory', 'vcpus', 'disk.root.size',
-                                  'disk.ephemeral.size']
-
-        cls.glance_v2_notifications = ['image.download', 'image.serve']
-
-        cls.server_ids = []
-        cls.image_ids = []
-
-    @classmethod
-    def create_server(cls):
-        tenant_network = cls.get_tenant_network()
-        body, server = compute.create_test_server(
-            cls.os_primary,
-            tenant_network=tenant_network,
-            name=data_utils.rand_name('ceilometer-instance'),
-            wait_until='ACTIVE')
-        cls.server_ids.append(body['id'])
-        return body
-
-    @classmethod
-    def create_image(cls, client, **kwargs):
-        body = client.create_image(name=data_utils.rand_name('image'),
-                                   container_format='bare',
-                                   disk_format='raw',
-                                   **kwargs)
-        # TODO(jswarren) Move ['image'] up to initial body value assignment
-        # once both v1 and v2 glance clients include the full response
-        # object.
-        if 'image' in body:
-            body = body['image']
-        cls.image_ids.append(body['id'])
-        return body
-
-    @staticmethod
-    def cleanup_resources(method, list_of_ids):
-        for resource_id in list_of_ids:
-            try:
-                method(resource_id)
-            except lib_exc.NotFound:
-                pass
-
-    @classmethod
-    def resource_cleanup(cls):
-        cls.cleanup_resources(cls.servers_client.delete_server, cls.server_ids)
-        cls.cleanup_resources(cls.image_client_v2.delete_image, cls.image_ids)
-        super(BaseTelemetryTest, cls).resource_cleanup()
-
-    def await_samples(self, metric, query):
-        """This method is to wait for sample to add it to database.
-
-        There are long time delays when using Postgresql (or Mysql)
-        database as ceilometer backend
-        """
-        timeout = CONF.compute.build_timeout
-        start = timeutils.utcnow()
-        while timeutils.delta_seconds(start, timeutils.utcnow()) < timeout:
-            body = self.telemetry_client.list_samples(metric, query)
-            if body:
-                return body
-            time.sleep(CONF.compute.build_interval)
-
-        raise lib_exc.TimeoutException(
-            'Sample for metric:%s with query:%s has not been added to the '
-            'database within %d seconds' % (metric, query,
-                                            CONF.compute.build_timeout))
-
-
-class BaseTelemetryAdminTest(BaseTelemetryTest):
-    """Base test case class for admin Telemetry API tests."""
-
-    credentials = ['primary', 'admin']
-
-    @classmethod
-    def setup_clients(cls):
-        super(BaseTelemetryAdminTest, cls).setup_clients()
-        cls.telemetry_admin_client = cls.os_admin.telemetry_client
diff --git a/ceilometer/tests/tempest/api/test_telemetry_notification_api.py b/ceilometer/tests/tempest/api/test_telemetry_notification_api.py
deleted file mode 100644
index ec754c8..0000000
--- a/ceilometer/tests/tempest/api/test_telemetry_notification_api.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-# Change-Id: I14e16a1a7d9813b324ee40545c07f0e88fb637b7
-
-import six
-import testtools
-
-from ceilometer.tests.tempest.api import base
-from tempest.common import utils
-from tempest import config
-from tempest.lib.common.utils import data_utils
-from tempest.lib import decorators
-
-
-CONF = config.CONF
-
-
-class TelemetryNotificationAPITest(base.BaseTelemetryTest):
-    @classmethod
-    def skip_checks(cls):
-        super(TelemetryNotificationAPITest, cls).skip_checks()
-
-        if ("gnocchi" in CONF.service_available and
-                CONF.service_available.gnocchi):
-            skip_msg = ("%s skipped as gnocchi is enabled" %
-                        cls.__name__)
-            raise cls.skipException(skip_msg)
-
-    @decorators.idempotent_id('d7f8c1c8-d470-4731-8604-315d3956caae')
-    @utils.services('compute')
-    def test_check_nova_notification(self):
-
-        body = self.create_server()
-
-        query = ('resource', 'eq', body['id'])
-
-        for metric in self.nova_notifications:
-            self.await_samples(metric, query)
-
-    @decorators.idempotent_id('c240457d-d943-439b-8aea-85e26d64fe8f')
-    @utils.services("image")
-    @testtools.skipIf(not CONF.image_feature_enabled.api_v2,
-                      "Glance api v2 is disabled")
-    def test_check_glance_v2_notifications(self):
-        body = self.create_image(self.image_client_v2, visibility='private')
-
-        file_content = data_utils.random_bytes()
-        image_file = six.BytesIO(file_content)
-        self.image_client_v2.store_image_file(body['id'], image_file)
-        self.image_client_v2.show_image_file(body['id'])
-
-        query = 'resource', 'eq', body['id']
-
-        for metric in self.glance_v2_notifications:
-            self.await_samples(metric, query)
-
-
-class TelemetryNotificationAdminAPITest(base.BaseTelemetryAdminTest):
-    @classmethod
-    def skip_checks(cls):
-        super(TelemetryNotificationAdminAPITest, cls).skip_checks()
-
-        if ("gnocchi" in CONF.service_available and
-                CONF.service_available.gnocchi):
-            skip_msg = ("%s skipped as gnocchi is enabled" %
-                        cls.__name__)
-            raise cls.skipException(skip_msg)
-
-    @decorators.idempotent_id('29604198-8b45-4fc0-8af8-1cae4f94ebea')
-    @utils.services('compute')
-    def test_check_nova_notification_event_and_meter(self):
-
-        body = self.create_server()
-
-        query = ('resource', 'eq', body['id'])
-        for metric in self.nova_notifications:
-            self.await_samples(metric, query)
diff --git a/ceilometer/tests/tempest/config.py b/ceilometer/tests/tempest/config.py
index 0df195b..d39874c 100644
--- a/ceilometer/tests/tempest/config.py
+++ b/ceilometer/tests/tempest/config.py
@@ -25,20 +25,6 @@
                                title='Telemetry Service Options')
 
 TelemetryGroup = [
-    cfg.StrOpt('catalog_type',
-               default='metering',
-               help="Catalog type of the Telemetry service."),
-    cfg.StrOpt('endpoint_type',
-               default='publicURL',
-               choices=['public', 'admin', 'internal',
-                        'publicURL', 'adminURL', 'internalURL'],
-               help="The endpoint type to use for the telemetry service."),
-    cfg.BoolOpt('event_enabled',
-                default=True,
-                help="Runs Ceilometer event-related tests"),
-    cfg.BoolOpt('deprecated_api_enabled',
-                default=True,
-                help="Runs Ceilometer deprecated API tests"),
     cfg.IntOpt('notification_wait',
                default=120,
                help="The seconds to wait for notifications which "
diff --git a/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py b/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py
deleted file mode 100644
index e02e454..0000000
--- a/ceilometer/tests/tempest/scenario/test_object_storage_telemetry_middleware.py
+++ /dev/null
@@ -1,146 +0,0 @@
-# Copyright 2014 Red Hat
-#
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-from oslo_log import log as logging
-from tempest.common import utils
-from tempest import config
-from tempest.lib.common.utils import data_utils
-from tempest.lib.common.utils import test_utils
-from tempest.lib import decorators
-from tempest import test
-
-from ceilometer.tests.tempest.service import client
-
-
-CONF = config.CONF
-
-LOG = logging.getLogger(__name__)
-
-
-class ClientManager(client.Manager):
-
-    load_clients = [
-        'telemetry_client',
-        'container_client',
-        'object_client',
-    ]
-
-
-class TestObjectStorageTelemetry(test.BaseTestCase):
-    """Test that swift uses the ceilometer middleware.
-
-     * create container.
-     * upload a file to the created container.
-     * retrieve the file from the created container.
-     * wait for notifications from ceilometer.
-    """
-
-    credentials = ['primary']
-    client_manager = ClientManager
-
-    @classmethod
-    def skip_checks(cls):
-        super(TestObjectStorageTelemetry, cls).skip_checks()
-        if ("gnocchi" in CONF.service_available and
-                CONF.service_available.gnocchi):
-            skip_msg = ("%s skipped as gnocchi is enabled" %
-                        cls.__name__)
-            raise cls.skipException(skip_msg)
-        if not CONF.service_available.swift:
-            skip_msg = ("%s skipped as swift is not available" %
-                        cls.__name__)
-            raise cls.skipException(skip_msg)
-        if not CONF.service_available.ceilometer:
-            skip_msg = ("%s skipped as ceilometer is not available" %
-                        cls.__name__)
-            raise cls.skipException(skip_msg)
-
-    @classmethod
-    def setup_credentials(cls):
-        cls.set_network_resources()
-        super(TestObjectStorageTelemetry, cls).setup_credentials()
-
-    @classmethod
-    def setup_clients(cls):
-        super(TestObjectStorageTelemetry, cls).setup_clients()
-        cls.telemetry_client = cls.os_primary.telemetry_client
-        cls.container_client = cls.os_primary.container_client
-        cls.object_client = cls.os_primary.object_client
-
-    def _confirm_notifications(self, container_name, obj_name):
-        # NOTE: Loop seeking for appropriate notifications about the containers
-        # and objects sent to swift.
-
-        def _check_samples():
-            # NOTE: Return True only if we have notifications about some
-            # containers and some objects and the notifications are about
-            # the expected containers and objects.
-            # Otherwise returning False will case _check_samples to be
-            # called again.
-            results = self.telemetry_client.list_samples(
-                'storage.objects.incoming.bytes')
-            LOG.debug('got samples %s', results)
-
-            # Extract container info from samples.
-            containers, objects = [], []
-            for sample in results:
-                meta = sample['resource_metadata']
-                if meta.get('container') and meta['container'] != 'None':
-                    containers.append(meta['container'])
-                elif (meta.get('target.metadata:container') and
-                      meta['target.metadata:container'] != 'None'):
-                    containers.append(meta['target.metadata:container'])
-
-                if meta.get('object') and meta['object'] != 'None':
-                    objects.append(meta['object'])
-                elif (meta.get('target.metadata:object') and
-                      meta['target.metadata:object'] != 'None'):
-                    objects.append(meta['target.metadata:object'])
-
-            return (container_name in containers and obj_name in objects)
-
-        self.assertTrue(
-            test_utils.call_until_true(_check_samples,
-                                       CONF.telemetry.notification_wait,
-                                       CONF.telemetry.notification_sleep),
-            'Correct notifications were not received after '
-            '%s seconds.' % CONF.telemetry.notification_wait)
-
-    def create_container(self):
-        name = data_utils.rand_name('swift-scenario-container')
-        self.container_client.create_container(name)
-        # look for the container to assure it is created
-        self.container_client.list_container_objects(name)
-        LOG.debug('Container %s created' % (name))
-        self.addCleanup(self.container_client.delete_container,
-                        name)
-        return name
-
-    def upload_object_to_container(self, container_name):
-        obj_name = data_utils.rand_name('swift-scenario-object')
-        obj_data = data_utils.arbitrary_string()
-        self.object_client.create_object(container_name, obj_name, obj_data)
-        self.addCleanup(self.object_client.delete_object,
-                        container_name,
-                        obj_name)
-        return obj_name
-
-    @decorators.idempotent_id('6d6b88e5-3e38-41bc-b34a-79f713a6cb85')
-    @utils.services('object_storage')
-    def test_swift_middleware_notifies(self):
-        container_name = self.create_container()
-        obj_name = self.upload_object_to_container(container_name)
-        self._confirm_notifications(container_name, obj_name)
diff --git a/ceilometer/tests/tempest/service/__init__.py b/ceilometer/tests/tempest/service/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/ceilometer/tests/tempest/service/__init__.py
+++ /dev/null
diff --git a/ceilometer/tests/tempest/service/client.py b/ceilometer/tests/tempest/service/client.py
deleted file mode 100644
index 59c585e..0000000
--- a/ceilometer/tests/tempest/service/client.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# Copyright 2014 OpenStack Foundation
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-from oslo_serialization import jsonutils as json
-from six.moves.urllib import parse as urllib
-
-from tempest import clients
-from tempest import config
-from tempest.lib.common import rest_client
-
-
-CONF = config.CONF
-
-
-class TelemetryClient(rest_client.RestClient):
-
-    version = '2'
-    uri_prefix = "v2"
-
-    def deserialize(self, body):
-        return json.loads(body.replace("\n", ""))
-
-    def serialize(self, body):
-        return json.dumps(body)
-
-    def create_sample(self, meter_name, sample_list):
-        uri = "%s/meters/%s" % (self.uri_prefix, meter_name)
-        body = self.serialize(sample_list)
-        resp, body = self.post(uri, body)
-        self.expected_success(200, resp.status)
-        body = self.deserialize(body)
-        return rest_client.ResponseBody(resp, body)
-
-    def _helper_list(self, uri, query=None, period=None):
-        uri_dict = {}
-        if query:
-            uri_dict = {'q.field': query[0],
-                        'q.op': query[1],
-                        'q.value': query[2]}
-        if period:
-            uri_dict['period'] = period
-        if uri_dict:
-            uri += "?%s" % urllib.urlencode(uri_dict)
-        resp, body = self.get(uri)
-        self.expected_success(200, resp.status)
-        body = self.deserialize(body)
-        return rest_client.ResponseBodyList(resp, body)
-
-    def list_resources(self, query=None):
-        uri = '%s/resources' % self.uri_prefix
-        return self._helper_list(uri, query)
-
-    def list_meters(self, query=None):
-        uri = '%s/meters' % self.uri_prefix
-        return self._helper_list(uri, query)
-
-    def list_statistics(self, meter, period=None, query=None):
-        uri = "%s/meters/%s/statistics" % (self.uri_prefix, meter)
-        return self._helper_list(uri, query, period)
-
-    def list_samples(self, meter_id, query=None):
-        uri = '%s/meters/%s' % (self.uri_prefix, meter_id)
-        return self._helper_list(uri, query)
-
-    def show_resource(self, resource_id):
-        uri = '%s/resources/%s' % (self.uri_prefix, resource_id)
-        resp, body = self.get(uri)
-        self.expected_success(200, resp.status)
-        body = self.deserialize(body)
-        return rest_client.ResponseBody(resp, body)
-
-
-class Manager(clients.Manager):
-
-    default_params = config.service_client_config()
-
-    telemetry_params = {
-        'service': CONF.telemetry.catalog_type,
-        'region': CONF.identity.region,
-        'endpoint_type': CONF.telemetry.endpoint_type,
-    }
-    telemetry_params.update(default_params)
-
-    def __init__(self, credentials):
-        # TODO(andreaf) Overriding Manager is a workaround. The "proper" way
-        # would it to expose the ceilometer service client via the plugin
-        # interface, use tempest.lib.clients and tempest master.
-        # Then ceilometer service client would be loaded and configured
-        # automatically into ServiceClients.
-        # In any case we're about to declare clients.Manager a stable
-        # interface for plugins and we won't change it, so this code won't
-        # break.
-        super(Manager, self).__init__(credentials=credentials)
-        self.set_telemetry_client()
-
-    def set_telemetry_client(self):
-        self.telemetry_client = TelemetryClient(self.auth_provider,
-                                                **self.telemetry_params)
