diff --git a/jeepyb/cmd/close_pull_requests.py b/jeepyb/cmd/close_pull_requests.py
index 2fd509a..8abeda9 100644
--- a/jeepyb/cmd/close_pull_requests.py
+++ b/jeepyb/cmd/close_pull_requests.py
@@ -40,9 +40,9 @@
 
 import ConfigParser
 import github
+import logging
 import os
 import yaml
-import logging
 
 MESSAGE = """Thank you for contributing to %(project)s!
 
diff --git a/jeepyb/cmd/expire_old_reviews.py b/jeepyb/cmd/expire_old_reviews.py
index c37f46a..9aaad0f 100644
--- a/jeepyb/cmd/expire_old_reviews.py
+++ b/jeepyb/cmd/expire_old_reviews.py
@@ -17,10 +17,10 @@
 # using the following rules:
 # 1. if negative comment and no activity in 1 week, expire
 
-import paramiko
+import argparse
 import json
 import logging
-import argparse
+import paramiko
 
 logger = logging.getLogger('expire_reviews')
 logger.setLevel(logging.INFO)
diff --git a/jeepyb/cmd/fetch_remotes.py b/jeepyb/cmd/fetch_remotes.py
index f808a9d..7829097 100644
--- a/jeepyb/cmd/fetch_remotes.py
+++ b/jeepyb/cmd/fetch_remotes.py
@@ -29,8 +29,8 @@
 
 import logging
 import os
-import subprocess
 import shlex
+import subprocess
 import yaml
 
 
diff --git a/jeepyb/cmd/manage_projects.py b/jeepyb/cmd/manage_projects.py
index b78d1a2..f5da082 100644
--- a/jeepyb/cmd/manage_projects.py
+++ b/jeepyb/cmd/manage_projects.py
@@ -55,8 +55,8 @@
 import tempfile
 import yaml
 
-import github
 import gerritlib.gerrit
+import github
 
 import jeepyb.gerritdb
 
diff --git a/jeepyb/cmd/notify_impact.py b/jeepyb/cmd/notify_impact.py
index 875f332..b089cbb 100644
--- a/jeepyb/cmd/notify_impact.py
+++ b/jeepyb/cmd/notify_impact.py
@@ -20,12 +20,12 @@
 import argparse
 import os
 import re
-import subprocess
 import smtplib
+import subprocess
 
-from email.mime.text import MIMEText
-from launchpadlib.launchpad import Launchpad
-from launchpadlib.uris import LPNET_SERVICE_ROOT
+from email.mime import text
+from launchpadlib import launchpad
+from launchpadlib import uris
 
 BASE_DIR = '/home/gerrit2/review_site'
 EMAIL_TEMPLATE = """
@@ -55,32 +55,33 @@
 
 
 def process_impact(git_log, args):
-    """
+    """Process DocImpact flag.
+
     If the 'DocImpact' flag is present, create a new documentation bug in
     the openstack-manuals launchpad project based on the git_log, then
     (and for non-documentation impacts) notify the mailing list of impact
     """
     if args.impact.lower() == 'docimpact':
-        launchpad = Launchpad.login_with('Gerrit User Sync',
-                                         LPNET_SERVICE_ROOT,
-                                         GERRIT_CACHE_DIR,
-                                         credentials_file=GERRIT_CREDENTIALS,
-                                         version='devel')
+        lpconn = launchpad.Launchpad.login_with(
+            'Gerrit User Sync',
+            uris.LPNET_SERVICE_ROOT,
+            GERRIT_CACHE_DIR,
+            credentials_file=GERRIT_CREDENTIALS,
+            version='devel')
         lines_in_log = git_log.split("\n")
         bug_title = lines_in_log[4]
         bug_descr = args.change_url + '\n' + git_log
         project_name = 'openstack-manuals'
-        project = launchpad.projects[project_name]
+        project = lpconn.projects[project_name]
 
         # check for existing bugs by searching for the title, to avoid
         # creating multiple bugs per review
         potential_dupes = project.searchTasks(search_text=bug_title)
 
         if len(potential_dupes) == 0:
-            buginfo = launchpad.bugs.createBug(target=project,
-                                               title=bug_title,
-                                               description=bug_descr,
-                                               tags=args.project.split('/')[1])
+            buginfo = lpconn.bugs.createBug(
+                target=project, title=bug_title,
+                description=bug_descr, tags=args.project.split('/')[1])
             buglink = buginfo.web_link
             email_content = DOC_EMAIL_TEMPLATE % (args.impact,
                                                   args.change_url,
@@ -89,7 +90,7 @@
         email_content = EMAIL_TEMPLATE % (args.impact,
                                           args.change_url, git_log)
 
-    msg = MIMEText(email_content)
+    msg = text.MIMEText(email_content)
     msg['Subject'] = '[%s] %s review request change %s' % \
         (args.project, args.impact, args.change)
     msg['From'] = 'gerrit2@review.openstack.org'
@@ -102,12 +103,12 @@
 
 
 def impacted(git_log, impact_string):
-    """Determine if a changes log indicates there is an impact"""
+    """Determine if a changes log indicates there is an impact."""
     return re.search(impact_string, git_log, re.IGNORECASE)
 
 
 def extract_git_log(args):
-    """Extract git log of all merged commits"""
+    """Extract git log of all merged commits."""
     cmd = ['git',
            '--git-dir=' + BASE_DIR + '/git/' + args.project + '.git',
            'log', '--no-merges', args.commit + '^1..' + args.commit]
diff --git a/jeepyb/cmd/openstackwatch.py b/jeepyb/cmd/openstackwatch.py
index 042806f..1515a6a 100644
--- a/jeepyb/cmd/openstackwatch.py
+++ b/jeepyb/cmd/openstackwatch.py
@@ -19,13 +19,14 @@
 # path to a configuration file.
 # -*- encoding: utf-8 -*-
 __author__ = "Chmouel Boudjnah <chmouel@chmouel.com>"
-import json
+
+import ConfigParser
+import cStringIO
 import datetime
+import json
 import os
 import sys
 import time
-import cStringIO
-import ConfigParser
 import urllib
 
 import PyRSS2Gen
@@ -108,7 +109,7 @@
 
 
 def upload_rss(xml, output_object):
-    if not 'swift' in CONFIG:
+    if 'swift' not in CONFIG:
         print xml
         return
 
diff --git a/jeepyb/cmd/trivial_rebase.py b/jeepyb/cmd/trivial_rebase.py
index d9de410..b00191d 100644
--- a/jeepyb/cmd/trivial_rebase.py
+++ b/jeepyb/cmd/trivial_rebase.py
@@ -98,7 +98,7 @@
 
 
 def GsqlQuery(sql_query, options):
-    """Runs a gerrit gsql query and returns the result"""
+    """Runs a gerrit gsql query and returns the result."""
     gsql_cmd = "gerrit gsql --format JSON -c %s" % sql_query
     gsql_out = Gssh(options, gsql_cmd)
     new_out = gsql_out.replace('}}\n', '}}\nsplit here\n')
@@ -106,7 +106,7 @@
 
 
 def FindPrevRev(options):
-    """Finds the revision of the previous patch set on the change"""
+    """Finds the revision of the previous patch set on the change."""
     sql_query = ("\"SELECT revision FROM patch_sets,changes WHERE "
                  "patch_sets.change_id = changes.change_id AND "
                  "patch_sets.patch_set_id = %s AND "
@@ -119,9 +119,10 @@
 
 
 def GetApprovals(options):
-    """Get all the approvals on a specific patch set
+    """Get all the approvals on a specific patch set.
 
-    Returns a list of approval dicts"""
+    Returns a list of approval dicts
+    """
     sql_query = ("\"SELECT value,account_id,category_id"
                  " FROM patch_set_approvals"
                  " WHERE patch_set_id = %s"
diff --git a/jeepyb/cmd/update_blueprint.py b/jeepyb/cmd/update_blueprint.py
index af382d0..cc9247d 100644
--- a/jeepyb/cmd/update_blueprint.py
+++ b/jeepyb/cmd/update_blueprint.py
@@ -17,15 +17,15 @@
 # patchsets for strings like "blueprint FOO" or "bp FOO" and updates
 # corresponding Launchpad blueprints with links back to the change.
 
-from launchpadlib.launchpad import Launchpad
-from launchpadlib.uris import LPNET_SERVICE_ROOT
-import os
 import argparse
+import ConfigParser
+import os
 import re
+import StringIO
 import subprocess
 
-import StringIO
-import ConfigParser
+from launchpadlib import launchpad
+from launchpadlib import uris
 import MySQLdb
 
 BASE_DIR = '/home/gerrit2/review_site'
@@ -45,7 +45,7 @@
 
 
 def get_broken_config(filename):
-    """ gerrit config ini files are broken and have leading tabs """
+    """gerrit config ini files are broken and have leading tabs."""
     text = ""
     with open(filename, "r") as conf:
         for line in conf.readlines():
@@ -132,14 +132,13 @@
 
     args = parser.parse_args()
 
-    launchpad = Launchpad.login_with('Gerrit User Sync', LPNET_SERVICE_ROOT,
-                                     GERRIT_CACHE_DIR,
-                                     credentials_file=GERRIT_CREDENTIALS,
-                                     version='devel')
+    lpconn = launchpad.Launchpad.login_with(
+        'Gerrit User Sync', uris.LPNET_SERVICE_ROOT, GERRIT_CACHE_DIR,
+        credentials_file=GERRIT_CREDENTIALS, version='devel')
 
     conn = MySQLdb.connect(user=DB_USER, passwd=DB_PASS, db=DB_DB)
 
-    find_specs(launchpad, conn, args)
+    find_specs(lpconn, conn, args)
 
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/update_bug.py b/jeepyb/cmd/update_bug.py
index 409da62..1041da2 100644
--- a/jeepyb/cmd/update_bug.py
+++ b/jeepyb/cmd/update_bug.py
@@ -17,14 +17,15 @@
 # patchsets for strings like "bug FOO" and updates corresponding Launchpad
 # bugs status.
 
-from launchpadlib.launchpad import Launchpad
-from launchpadlib.uris import LPNET_SERVICE_ROOT
-import jeepyb.gerritdb
-import os
 import argparse
+import os
 import re
 import subprocess
 
+from launchpadlib import launchpad
+from launchpadlib import uris
+
+import jeepyb.gerritdb
 
 BASE_DIR = '/home/gerrit2/review_site'
 GERRIT_CACHE_DIR = os.path.expanduser(
@@ -98,28 +99,28 @@
 
 
 def set_fix_committed(bugtask):
-    """Set bug fix committed"""
+    """Set bug fix committed."""
 
     bugtask.status = "Fix Committed"
     bugtask.lp_save()
 
 
 def set_fix_released(bugtask):
-    """Set bug fix released"""
+    """Set bug fix released."""
 
     bugtask.status = "Fix Released"
     bugtask.lp_save()
 
 
 def release_fixcommitted(bugtask):
-    """Set bug FixReleased if it was FixCommitted"""
+    """Set bug FixReleased if it was FixCommitted."""
 
     if bugtask.status == u'Fix Committed':
         set_fix_released(bugtask)
 
 
 def tag_in_branchname(bugtask, branch):
-    """Tag bug with in-branch-name tag (if name is appropriate)"""
+    """Tag bug with in-branch-name tag (if name is appropriate)."""
 
     lp_bug = bugtask.bug
     branch_name = branch.replace('/', '-')
@@ -130,12 +131,12 @@
 
 
 def short_project(full_project_name):
-    """Return the project part of the git repository name"""
+    """Return the project part of the git repository name."""
     return full_project_name.split('/')[-1]
 
 
 def git2lp(full_project_name):
-    """Convert Git repo name to Launchpad project"""
+    """Convert Git repo name to Launchpad project."""
     project_map = {
         'openstack/api-site': 'openstack-api-site',
         'openstack/quantum': 'neutron',
@@ -278,7 +279,7 @@
 
 
 def find_bugs(launchpad, git_log, args):
-    """Find bugs referenced in the git log and return related bugtasks"""
+    """Find bugs referenced in the git log and return related bugtasks."""
 
     bug_regexp = r'([Bb]ug|[Ll][Pp])[\s#:]*(\d+)'
     tokens = re.split(bug_regexp, git_log)
@@ -301,7 +302,7 @@
 
 
 def extract_git_log(args):
-    """Extract git log of all merged commits"""
+    """Extract git log of all merged commits."""
     cmd = ['git',
            '--git-dir=' + BASE_DIR + '/git/' + args.project + '.git',
            'log', '--no-merges', args.commit + '^1..' + args.commit]
@@ -326,17 +327,16 @@
     args = parser.parse_args()
 
     # Connect to Launchpad
-    launchpad = Launchpad.login_with('Gerrit User Sync', LPNET_SERVICE_ROOT,
-                                     GERRIT_CACHE_DIR,
-                                     credentials_file=GERRIT_CREDENTIALS,
-                                     version='devel')
+    lpconn = launchpad.Launchpad.login_with(
+        'Gerrit User Sync', uris.LPNET_SERVICE_ROOT, GERRIT_CACHE_DIR,
+        credentials_file=GERRIT_CREDENTIALS, version='devel')
 
     # Get git log
     git_log = extract_git_log(args)
 
     # Process bugtasks found in git log
-    for bugtask in find_bugs(launchpad, git_log, args):
-        process_bugtask(launchpad, bugtask, git_log, args)
+    for bugtask in find_bugs(lpconn, git_log, args):
+        process_bugtask(lpconn, bugtask, git_log, args)
 
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/gerritdb.py b/jeepyb/gerritdb.py
index a395565..c3be3d7 100644
--- a/jeepyb/gerritdb.py
+++ b/jeepyb/gerritdb.py
@@ -30,7 +30,7 @@
 
 
 def get_broken_config(filename):
-    """ gerrit config ini files are broken and have leading tabs """
+    """gerrit config ini files are broken and have leading tabs."""
     text = ""
     for line in open(filename, "r"):
         text += line.lstrip()
diff --git a/jeepyb/openstack/__init__.py b/jeepyb/openstack/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/jeepyb/openstack/__init__.py
+++ /dev/null
diff --git a/jeepyb/openstack/common/__init__.py b/jeepyb/openstack/common/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/jeepyb/openstack/common/__init__.py
+++ /dev/null
diff --git a/jeepyb/openstack/common/setup.py b/jeepyb/openstack/common/setup.py
deleted file mode 100644
index 2be72e6..0000000
--- a/jeepyb/openstack/common/setup.py
+++ /dev/null
@@ -1,351 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2011 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.
-
-"""
-Utilities with minimum-depends for use in setup.py
-"""
-
-import datetime
-import os
-import re
-import subprocess
-import sys
-
-from setuptools.command import sdist
-
-
-def parse_mailmap(mailmap='.mailmap'):
-    mapping = {}
-    if os.path.exists(mailmap):
-        fp = open(mailmap, 'r')
-        for l in fp:
-            l = l.strip()
-            if not l.startswith('#') and ' ' in l:
-                canonical_email, alias = [x for x in l.split(' ')
-                                          if x.startswith('<')]
-                mapping[alias] = canonical_email
-    return mapping
-
-
-def canonicalize_emails(changelog, mapping):
-    """Takes in a string and an email alias mapping and replaces all
-       instances of the aliases in the string with their real email.
-    """
-    for alias, email in mapping.iteritems():
-        changelog = changelog.replace(alias, email)
-    return changelog
-
-
-# Get requirements from the first file that exists
-def get_reqs_from_files(requirements_files):
-    reqs_in = []
-    for requirements_file in requirements_files:
-        if os.path.exists(requirements_file):
-            return open(requirements_file, 'r').read().split('\n')
-    return []
-
-
-def parse_requirements(requirements_files=['requirements.txt',
-                                           'tools/pip-requires']):
-    requirements = []
-    for line in get_reqs_from_files(requirements_files):
-        # For the requirements list, we need to inject only the portion
-        # after egg= so that distutils knows the package it's looking for
-        # such as:
-        # -e git://github.com/openstack/nova/master#egg=nova
-        if re.match(r'\s*-e\s+', line):
-            requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
-                                line))
-        # such as:
-        # http://github.com/openstack/nova/zipball/master#egg=nova
-        elif re.match(r'\s*https?:', line):
-            requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1',
-                                line))
-        # -f lines are for index locations, and don't get used here
-        elif re.match(r'\s*-f\s+', line):
-            pass
-        # argparse is part of the standard library starting with 2.7
-        # adding it to the requirements list screws distro installs
-        elif line == 'argparse' and sys.version_info >= (2, 7):
-            pass
-        else:
-            requirements.append(line)
-
-    return requirements
-
-
-def parse_dependency_links(requirements_files=['requirements.txt',
-                                               'tools/pip-requires']):
-    dependency_links = []
-    # dependency_links inject alternate locations to find packages listed
-    # in requirements
-    for line in get_reqs_from_files(requirements_files):
-        # skip comments and blank lines
-        if re.match(r'(\s*#)|(\s*$)', line):
-            continue
-        # lines with -e or -f need the whole line, minus the flag
-        if re.match(r'\s*-[ef]\s+', line):
-            dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line))
-        # lines that are only urls can go in unmolested
-        elif re.match(r'\s*https?:', line):
-            dependency_links.append(line)
-    return dependency_links
-
-
-def write_requirements():
-    venv = os.environ.get('VIRTUAL_ENV', None)
-    if venv is not None:
-        with open("requirements.txt", "w") as req_file:
-            output = subprocess.Popen(["pip", "-E", venv, "freeze", "-l"],
-                                      stdout=subprocess.PIPE)
-            requirements = output.communicate()[0].strip()
-            req_file.write(requirements)
-
-
-def _run_shell_command(cmd):
-    output = subprocess.Popen(["/bin/sh", "-c", cmd],
-                              stdout=subprocess.PIPE)
-    out = output.communicate()
-    if len(out) == 0:
-        return None
-    if len(out[0].strip()) == 0:
-        return None
-    return out[0].strip()
-
-
-def _get_git_next_version_suffix(branch_name):
-    datestamp = datetime.datetime.now().strftime('%Y%m%d')
-    if branch_name == 'milestone-proposed':
-        revno_prefix = "r"
-    else:
-        revno_prefix = ""
-    _run_shell_command("git fetch origin +refs/meta/*:refs/remotes/meta/*")
-    milestone_cmd = "git show meta/openstack/release:%s" % branch_name
-    milestonever = _run_shell_command(milestone_cmd)
-    if not milestonever:
-        milestonever = ""
-    post_version = _get_git_post_version()
-    # post version should look like:
-    # 0.1.1.4.gcc9e28a
-    # where the bit after the last . is the short sha, and the bit between
-    # the last and second to last is the revno count
-    (revno, sha) = post_version.split(".")[-2:]
-    first_half = "%(milestonever)s~%(datestamp)s" % locals()
-    second_half = "%(revno_prefix)s%(revno)s.%(sha)s" % locals()
-    return ".".join((first_half, second_half))
-
-
-def _get_git_current_tag():
-    return _run_shell_command("git tag --contains HEAD")
-
-
-def _get_git_tag_info():
-    return _run_shell_command("git describe --tags")
-
-
-def _get_git_post_version():
-    current_tag = _get_git_current_tag()
-    if current_tag is not None:
-        return current_tag
-    else:
-        tag_info = _get_git_tag_info()
-        if tag_info is None:
-            base_version = "0.0"
-            cmd = "git --no-pager log --oneline"
-            out = _run_shell_command(cmd)
-            revno = len(out.split("\n"))
-            sha = _run_shell_command("git describe --always")
-        else:
-            tag_infos = tag_info.split("-")
-            base_version = "-".join(tag_infos[:-2])
-            (revno, sha) = tag_infos[-2:]
-        return "%s.%s.%s" % (base_version, revno, sha)
-
-
-def write_git_changelog():
-    """Write a changelog based on the git changelog."""
-    if os.path.isdir('.git'):
-        git_log_cmd = 'git log --stat'
-        changelog = _run_shell_command(git_log_cmd)
-        mailmap = parse_mailmap()
-        with open("ChangeLog", "w") as changelog_file:
-            changelog_file.write(canonicalize_emails(changelog, mailmap))
-
-
-def generate_authors():
-    """Create AUTHORS file using git commits."""
-    jenkins_email = 'jenkins@review.openstack.org'
-    old_authors = 'AUTHORS.in'
-    new_authors = 'AUTHORS'
-    if os.path.isdir('.git'):
-        # don't include jenkins email address in AUTHORS file
-        git_log_cmd = ("git log --format='%aN <%aE>' | sort -u | "
-                       "grep -v " + jenkins_email)
-        changelog = _run_shell_command(git_log_cmd)
-        mailmap = parse_mailmap()
-        with open(new_authors, 'w') as new_authors_fh:
-            new_authors_fh.write(canonicalize_emails(changelog, mailmap))
-            if os.path.exists(old_authors):
-                with open(old_authors, "r") as old_authors_fh:
-                    new_authors_fh.write('\n' + old_authors_fh.read())
-
-_rst_template = """%(heading)s
-%(underline)s
-
-.. automodule:: %(module)s
-  :members:
-  :undoc-members:
-  :show-inheritance:
-"""
-
-
-def read_versioninfo(project):
-    """Read the versioninfo file. If it doesn't exist, we're in a github
-       zipball, and there's really no way to know what version we really
-       are, but that should be ok, because the utility of that should be
-       just about nil if this code path is in use in the first place."""
-    versioninfo_path = os.path.join(project, 'versioninfo')
-    if os.path.exists(versioninfo_path):
-        with open(versioninfo_path, 'r') as vinfo:
-            version = vinfo.read().strip()
-    else:
-        version = "0.0.0"
-    return version
-
-
-def write_versioninfo(project, version):
-    """Write a simple file containing the version of the package."""
-    open(os.path.join(project, 'versioninfo'), 'w').write("%s\n" % version)
-
-
-def get_cmdclass():
-    """Return dict of commands to run from setup.py."""
-
-    cmdclass = dict()
-
-    def _find_modules(arg, dirname, files):
-        for filename in files:
-            if filename.endswith('.py') and filename != '__init__.py':
-                arg["%s.%s" % (dirname.replace('/', '.'),
-                               filename[:-3])] = True
-
-    class LocalSDist(sdist.sdist):
-        """Builds the ChangeLog and Authors files from VC first."""
-
-        def run(self):
-            write_git_changelog()
-            generate_authors()
-            # sdist.sdist is an old style class, can't use super()
-            sdist.sdist.run(self)
-
-    cmdclass['sdist'] = LocalSDist
-
-    # If Sphinx is installed on the box running setup.py,
-    # enable setup.py to build the documentation, otherwise,
-    # just ignore it
-    try:
-        from sphinx.setup_command import BuildDoc
-
-        class LocalBuildDoc(BuildDoc):
-            def generate_autoindex(self):
-                print "**Autodocumenting from %s" % os.path.abspath(os.curdir)
-                modules = {}
-                option_dict = self.distribution.get_option_dict('build_sphinx')
-                source_dir = os.path.join(option_dict['source_dir'][1], 'api')
-                if not os.path.exists(source_dir):
-                    os.makedirs(source_dir)
-                for pkg in self.distribution.packages:
-                    if '.' not in pkg:
-                        os.path.walk(pkg, _find_modules, modules)
-                module_list = modules.keys()
-                module_list.sort()
-                autoindex_filename = os.path.join(source_dir, 'autoindex.rst')
-                with open(autoindex_filename, 'w') as autoindex:
-                    autoindex.write(""".. toctree::
-   :maxdepth: 1
-
-""")
-                    for module in module_list:
-                        output_filename = os.path.join(source_dir,
-                                                       "%s.rst" % module)
-                        heading = "The :mod:`%s` Module" % module
-                        underline = "=" * len(heading)
-                        values = dict(module=module, heading=heading,
-                                      underline=underline)
-
-                        print "Generating %s" % output_filename
-                        with open(output_filename, 'w') as output_file:
-                            output_file.write(_rst_template % values)
-                        autoindex.write("   %s.rst\n" % module)
-
-            def run(self):
-                if not os.getenv('SPHINX_DEBUG'):
-                    self.generate_autoindex()
-
-                for builder in ['html', 'man']:
-                    self.builder = builder
-                    self.finalize_options()
-                    self.project = self.distribution.get_name()
-                    self.version = self.distribution.get_version()
-                    self.release = self.distribution.get_version()
-                    BuildDoc.run(self)
-        cmdclass['build_sphinx'] = LocalBuildDoc
-    except ImportError:
-        pass
-
-    return cmdclass
-
-
-def get_git_branchname():
-    for branch in _run_shell_command("git branch --color=never").split("\n"):
-        if branch.startswith('*'):
-            _branch_name = branch.split()[1].strip()
-    if _branch_name == "(no":
-        _branch_name = "no-branch"
-    return _branch_name
-
-
-def get_pre_version(projectname, base_version):
-    """Return a version which is leading up to a version that will
-       be released in the future."""
-    if os.path.isdir('.git'):
-        current_tag = _get_git_current_tag()
-        if current_tag is not None:
-            version = current_tag
-        else:
-            branch_name = os.getenv('BRANCHNAME',
-                                    os.getenv('GERRIT_REFNAME',
-                                              get_git_branchname()))
-            version_suffix = _get_git_next_version_suffix(branch_name)
-            version = "%s~%s" % (base_version, version_suffix)
-        write_versioninfo(projectname, version)
-        return version
-    else:
-        version = read_versioninfo(projectname)
-    return version
-
-
-def get_post_version(projectname):
-    """Return a version which is equal to the tag that's on the current
-    revision if there is one, or tag plus number of additional revisions
-    if the current revision has no tag."""
-
-    if os.path.isdir('.git'):
-        version = _get_git_post_version()
-        write_versioninfo(projectname, version)
-        return version
-    return read_versioninfo(projectname)
diff --git a/jeepyb/openstack/common/version.py b/jeepyb/openstack/common/version.py
deleted file mode 100644
index ca350ed..0000000
--- a/jeepyb/openstack/common/version.py
+++ /dev/null
@@ -1,149 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-#    Copyright 2012 OpenStack LLC
-#
-#    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.
-
-"""
-Utilities for consuming the auto-generated versioninfo files.
-"""
-
-import datetime
-import pkg_resources
-import os
-
-import setup
-
-
-class _deferred_version_string(object):
-    """Internal helper class which provides delayed version calculation."""
-    def __init__(self, version_info, prefix):
-        self.version_info = version_info
-        self.prefix = prefix
-
-    def __str__(self):
-        return "%s%s" % (self.prefix, self.version_info.version_string())
-
-    def __repr__(self):
-        return "%s%s" % (self.prefix, self.version_info.version_string())
-
-
-class VersionInfo(object):
-
-    def __init__(self, package, python_package=None, pre_version=None):
-        """Object that understands versioning for a package
-        :param package: name of the top level python namespace. For glance,
-                        this would be "glance" for python-glanceclient, it
-                        would be "glanceclient"
-        :param python_package: optional name of the project name. For
-                               glance this can be left unset. For
-                               python-glanceclient, this would be
-                               "python-glanceclient"
-        :param pre_version: optional version that the project is working to
-        """
-        self.package = package
-        if python_package is None:
-            self.python_package = package
-        else:
-            self.python_package = python_package
-        self.pre_version = pre_version
-        self.version = None
-
-    def _generate_version(self):
-        """Defer to the openstack.common.setup routines for making a
-        version from git."""
-        if self.pre_version is None:
-            return setup.get_post_version(self.python_package)
-        else:
-            return setup.get_pre_version(self.python_package, self.pre_version)
-
-    def _newer_version(self, pending_version):
-        """Check to see if we're working with a stale version or not.
-        We expect a version string that either looks like:
-          2012.2~f3~20120708.10.4426392
-        which is an unreleased version of a pre-version, or:
-          0.1.1.4.gcc9e28a
-        which is an unreleased version of a post-version, or:
-          0.1.1
-        Which is a release and which should match tag.
-        For now, if we have a date-embedded version, check to see if it's
-        old, and if so re-generate. Otherwise, just deal with it.
-        """
-        try:
-            version_date = int(self.version.split("~")[-1].split('.')[0])
-            if version_date < int(datetime.date.today().strftime('%Y%m%d')):
-                return self._generate_version()
-            else:
-                return pending_version
-        except Exception:
-            return pending_version
-
-    def version_string_with_vcs(self, always=False):
-        """Return the full version of the package including suffixes indicating
-        VCS status.
-
-        For instance, if we are working towards the 2012.2 release,
-        canonical_version_string should return 2012.2 if this is a final
-        release, or else something like 2012.2~f1~20120705.20 if it's not.
-
-        :param always: if true, skip all version caching
-        """
-        if always:
-            self.version = self._generate_version()
-
-        if self.version is None:
-
-            requirement = pkg_resources.Requirement.parse(self.python_package)
-            versioninfo = "%s/versioninfo" % self.package
-            try:
-                raw_version = pkg_resources.resource_string(requirement,
-                                                             versioninfo)
-                self.version = self._newer_version(raw_version.strip())
-            except (IOError, pkg_resources.DistributionNotFound):
-                self.version = self._generate_version()
-
-        return self.version
-
-    def canonical_version_string(self, always=False):
-        """Return the simple version of the package excluding any suffixes.
-
-        For instance, if we are working towards the 2012.2 release,
-        canonical_version_string should return 2012.2 in all cases.
-
-        :param always: if true, skip all version caching
-        """
-        return self.version_string_with_vcs(always).split('~')[0]
-
-    def version_string(self, always=False):
-        """Return the base version of the package.
-
-        For instance, if we are working towards the 2012.2 release,
-        version_string should return 2012.2 if this is a final release, or
-        2012.2-dev if it is not.
-
-        :param always: if true, skip all version caching
-        """
-        version_parts = self.version_string_with_vcs(always).split('~')
-        if len(version_parts) == 1:
-            return version_parts[0]
-        else:
-            return '%s-dev' % (version_parts[0],)
-
-    def deferred_version_string(self, prefix=""):
-        """Generate an object which will expand in a string context to
-        the results of version_string(). We do this so that don't
-        call into pkg_resources every time we start up a program when
-        passing version information into the CONF constructor, but
-        rather only do the calculation when and if a version is requested
-        """
-        return _deferred_version_string(self, prefix)
diff --git a/jeepyb/version.py b/jeepyb/version.py
deleted file mode 100644
index 6581383..0000000
--- a/jeepyb/version.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-#    Copyright 2011 OpenStack LLC
-#    Copyright 2012 Hewlett-Packard Development Company, L.P.
-#
-#    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 jeepyb.openstack.common import version as common_version
-
-version_info = common_version.VersionInfo('jeepyb')
diff --git a/openstack-common.conf b/openstack-common.conf
deleted file mode 100644
index 119b087..0000000
--- a/openstack-common.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-[DEFAULT]
-
-# The list of modules to copy from openstack-common
-modules=setup,version
-
-# The base module to hold the copy of openstack.common
-base=jeepyb
diff --git a/tools/pip-requires b/requirements.txt
similarity index 100%
rename from tools/pip-requires
rename to requirements.txt
diff --git a/setup.cfg b/setup.cfg
index 2612dc5..ef88ce8 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,15 +1,35 @@
-[nosetests]
-cover-package = jeepyb
-cover-html = true
-cover-erase = true
-cover-inclusive = true
-verbosity=2
-detailed-errors=1
+[metadata]
+name = jeepyb
+summary = Tools for managing gerrit projects and external sources.
+description-file =
+    README.rst
+author = OpenStack Infrastructure Team
+author-email = openstack-infra@lists.openstack.org
+home-page = http://ci.openstack.org/
+classifier =
+    Intended Audience :: Information Technology
+    Intended Audience :: System Administrators
+    License :: OSI Approved :: Apache Software License
+    Operating System :: POSIX :: Linux
+    Programming Language :: Python
+    Programming Language :: Python :: 2
+    Programming Language :: Python :: 2.7
+    Programming Language :: Python :: 2.6
 
-[build_sphinx]
-source-dir = doc/source
-build-dir = doc/build
-all_files = 1
+[global]
+setup-hooks =
+    pbr.hooks.setup_hook
 
-[upload_sphinx]
-upload-dir = doc/build/html
+[entry_points]
+console_scripts =
+    close-pull-requests = jeepyb.cmd.close_pull_requests:main
+    expire-old-reviews = jeepyb.cmd.expire_old_reviews:main
+    fetch-remotes = jeepyb.cmd.fetch_remotes:main
+    manage-projects = jeepyb.cmd.manage_projects:main
+    notify-impact = jeepyb.cmd.notify_impact:main
+    openstackwatch = jeepyb.cmd.openstackwatch:main
+    process-cache = jeepyb.cmd.process_cache:main
+    run-mirror = jeepyb.cmd.run_mirror:main
+    trivial-rebase = jeepyb.cmd.trivial_rebase:main
+    update-blueprint = jeepyb.cmd.update_blueprint:main
+    update-bug = jeepyb.cmd.update_bug:main
diff --git a/setup.py b/setup.py
index cb35457..59a0090 100644
--- a/setup.py
+++ b/setup.py
@@ -1,70 +1,21 @@
-# Copyright (c) 2012 Hewlett-Packard Development Company, L.P.
+#!/usr/bin/env python
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
 #
 # 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
+#    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.
+# 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 setuptools
 
-
-from jeepyb.openstack.common import setup
-from jeepyb.version import version_info as version
-
-requires = setup.parse_requirements()
-tests_require = setup.parse_requirements(['tools/test-requires'])
-depend_links = setup.parse_dependency_links()
-
-
-def read_file(file_name):
-    return open(os.path.join(os.path.dirname(__file__), file_name)).read()
-
-
 setuptools.setup(
-    name="jeepyb",
-    version=version.canonical_version_string(always=True),
-    author='Hewlett-Packard Development Company, L.P.',
-    author_email='openstack@lists.launchpad.net',
-    description="Tools for managing gerrit projects and external sources.",
-    license="Apache License, Version 2.0",
-    url="https://github.com/openstack-ci/jeepyb",
-    packages=setuptools.find_packages(exclude=['tests', 'tests.*']),
-    include_package_data=True,
-    setup_requires=['setuptools_git>=0.4'],
-    cmdclass=setup.get_cmdclass(),
-    install_requires=requires,
-    dependency_links=depend_links,
-    tests_require=tests_require,
-    test_suite="nose.collector",
-    classifiers=[
-        "Environment :: Console",
-        "Intended Audience :: Developers",
-        "Intended Audience :: Information Technology",
-        "License :: OSI Approved :: Apache Software License",
-        "Operating System :: OS Independent",
-        "Programming Language :: Python"
-    ],
-    entry_points={
-        'console_scripts': [
-            'close-pull-requests=jeepyb.cmd.close_pull_requests:main',
-            'expire-old-reviews=jeepyb.cmd.expire_old_reviews:main',
-            'fetch-remotes=jeepyb.cmd.fetch_remotes:main',
-            'manage-projects=jeepyb.cmd.manage_projects:main',
-            'notify-impact=jeepyb.cmd.notify_impact:main',
-            'openstackwatch=jeepyb.cmd.openstackwatch:main',
-            'process-cache=jeepyb.cmd.process_cache:main',
-            'run-mirror=jeepyb.cmd.run_mirror:main',
-            'trivial-rebase=jeepyb.cmd.trivial_rebase:main',
-            'update-blueprint=jeepyb.cmd.update_blueprint:main',
-            'update-bug=jeepyb.cmd.update_bug:main',
-        ],
-    }
-)
+    setup_requires=['d2to1', 'pbr'],
+    d2to1=True)
diff --git a/test-requirements.txt b/test-requirements.txt
new file mode 100644
index 0000000..587f4e2
--- /dev/null
+++ b/test-requirements.txt
@@ -0,0 +1,3 @@
+distribute>=0.6.24
+
+hacking>=0.5.3,<0.6
diff --git a/tools/test-requires b/tools/test-requires
deleted file mode 100644
index a2789cd..0000000
--- a/tools/test-requires
+++ /dev/null
@@ -1,8 +0,0 @@
-distribute>=0.6.24
-
-fixtures
-pep8==1.3
-pyflakes
-python-subunit
-sphinx>=1.1.2
-testtools
diff --git a/tox.ini b/tox.ini
index b36dc95..47067e0 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,24 +1,20 @@
 [tox]
-envlist = py26,py27,pep8
+envlist = pep8
 
 [testenv]
 setenv = VIRTUAL_ENV={envdir}
-deps = -r{toxinidir}/tools/pip-requires
-       -r{toxinidir}/tools/test-requires
-commands = nosetests {posargs}
+deps = -r{toxinidir}/requirements.txt
+       -r{toxinidir}/test-requirements.txt
 
 [testenv:pep8]
-deps = pep8==1.3.3
-commands =
-  pep8 --exclude=.venv,.tox,dist,doc,openstack,*lib/python*,*egg \
-       --repeat --show-source .
-
-[testenv:cover]
-setenv = NOSE_WITH_COVERAGE=1
+commands = flake8
 
 [testenv:pyflakes]
-deps = pyflakes
-commands = pyflakes jeepyb/cmd
+commands = flake8
 
 [testenv:venv]
 commands = {posargs}
+
+[flake8]
+show-source = True
+exclude = .venv,.tox,dist,doc,build,*.egg
