diff --git a/README.rst b/README.rst
index 11ed58f..0ea5229 100644
--- a/README.rst
+++ b/README.rst
@@ -33,8 +33,8 @@
     devstack uploaded and set the image_ref value in the [environment]
     section in the tempest.conf to that image UUID.
 
-    In addition, the ``tempest/tools/conf_from_devstack`` script can also be
-    used to generate a tempest.conf based on your localrc file.
+    In addition, the ``<devstack-repo>/tools/configure_tempest.sh`` script can
+    also be used to generate a tempest.conf based on your devstack's rc files.
 
 Tempest is not tied to any single test runner, but Nose been the most commonly
 used tool. After setting up your configuration file, you can execute
diff --git a/tempest/tools/conf_from_devstack b/tempest/tools/conf_from_devstack
deleted file mode 100755
index 81df659..0000000
--- a/tempest/tools/conf_from_devstack
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Simple script that analyzes a devstack environment and constructs
-a Tempest configuration file for the devstack environment.
-"""
-
-import optparse
-import os
-import subprocess
-import sys
-
-SUCCESS = 0
-FAILURE = 1
-
-
-def execute(cmd, raise_error=True):
-    """
-    Executes a command in a subprocess. Returns a tuple
-    of (exitcode, out, err), where out is the string output
-    from stdout and err is the string output from stderr when
-    executing the command.
-
-    :param cmd: Command string to execute
-    :param raise_error: If returncode is not 0 (success), then
-                        raise a RuntimeError? Default: True)
-    """
-
-    process = subprocess.Popen(cmd,
-                               shell=True,
-                               stdin=subprocess.PIPE,
-                               stdout=subprocess.PIPE,
-                               stderr=subprocess.PIPE)
-    result = process.communicate()
-    (out, err) = result
-    exitcode = process.returncode
-    if process.returncode != 0 and raise_error:
-        msg = "Command %(cmd)s did not succeed. Returned an exit "\
-              "code of %(exitcode)d."\
-              "\n\nSTDOUT: %(out)s"\
-              "\n\nSTDERR: %(err)s" % locals()
-        raise RuntimeError(msg)
-    return exitcode, out, err
-
-
-def add_options(parser):
-    """
-    Adds CLI options to a supplied option parser
-
-    :param parser: `optparse.OptionParser`
-    """
-    parser.add_option('-o', '--outfile', metavar="PATH",
-                      help=("File to save generated config to. Default: "
-                            "prints config to stdout."))
-    parser.add_option('-v', '--verbose', default=False, action="store_true",
-                      help="Print more verbose output")
-    parser.add_option('-D', '--devstack-dir', metavar="PATH",
-                      default=os.getcwd(),
-                      help="Directory to find devstack. Default: $PWD")
-
-
-def get_devstack_localrc(options):
-    """
-    Finds the localrc file in the devstack directory and returns a dict
-    representing the key/value pairs in the localrc file.
-    """
-    localrc_path = os.path.join(os.path.abspath(options.devstack_dir), 'localrc')
-    if not os.path.exists(localrc_path):
-        raise RuntimeError("Failed to find localrc file in devstack dir %s" %
-                           options.devstack_dir)
-
-    if options.verbose:
-        print "Reading localrc settings from %s" % localrc_path
-
-    try:
-        settings = dict([line.split('=') for line in
-                        open(localrc_path, 'r').readlines()
-                        if not line.startswith('#')])
-        return settings
-    except (TypeError, ValueError) as e:
-        raise RuntimeError("Failed to read settings from localrc file %s. "
-                           "Got error: %s" % (localrc_path, e))
-
-
-def main():
-    oparser = optparse.OptionParser()
-    add_options(oparser)
-
-    options, args = oparser.parse_args()
-
-    localrc = get_devstack_localrc(options)
-
-    conf_settings = {
-        'service_host': localrc.get('HOST_IP', '127.0.0.1'),
-        'service_port': 5000,  # Make this configurable when devstack does
-        'identity_api_version': 'v2.0',  # Ditto
-        'user': localrc.get('USERNAME', 'admin'),
-        'password': localrc.get('ADMIN_PASSWORD', 'password')
-    }
-
-    # We need to determine the UUID of the base image, so we
-    # query the Glance endpoint for a list of images...
-    cmd = "glance index -A %s" % localrc['SERVICE_TOKEN']
-    retcode, out, err = execute(cmd)
-
-    if retcode != 0:
-        raise RuntimeError("Unable to get list of images from Glance. "
-                           "Got error: %s" % err)
-
-    image_lines = out.split('\n')[2:]
-    for line in image_lines:
-        if 'ami' in line:
-            conf_settings['base_image_uuid'] = line.split()[0]
-            break
-
-    if 'base_image_uuid' not in conf_settings:
-        raise RuntimeError("Unable to find any AMI images in glance index")
-
-    if options.verbose:
-        print "Found base image with UUID %s" % conf_settings['base_image_uuid']
-
-    tempest_conf = """[identity]
-host=%(service_host)s
-port=%(service_port)s
-api_version=%(identity_api_version)s
-path=tokens
-user=%(user)s
-password=%(password)s
-tenant_name=%(user)s
-strategy=keystone
-
-[image]
-host = %(service_host)s
-port = 9292
-username = %(user)s
-password = %(password)s
-tenant = %(user)s
-auth_url = http://127.0.0.1:5000/v2.0/tokens/
-strategy = keystone
-service_token = servicetoken
-
-[compute]
-image_ref=%(base_image_uuid)s
-image_ref_alt=%(base_image_uuid)s
-flavor_ref=1
-flavor_ref_alt=2
-create_image_enabled=true
-resize_available=false
-ssh_timeout=300
-build_interval=10
-build_timeout=600""" % conf_settings
-
-    if options.outfile:
-        outfile_path = os.path.abspath(options.outfile)
-        if os.path.exists(outfile_path):
-            confirm = raw_input("Output file already exists. Overwrite? [y/N]")
-            if confirm != 'Y':
-                print "Exiting"
-                return SUCCESS
-        with open(outfile_path, 'wb') as outfile:
-            outfile.write(tempest_conf)
-        if options.verbose:
-            print "Wrote tempest config to %s" % outfile_path
-    else:
-        print tempest_conf
-
-
-if __name__ == '__main__':
-    try:
-        sys.exit(main())
-    except RuntimeError, e:
-        sys.exit("ERROR: %s" % e)
