diff --git a/jeepyb/cmd/manage_projects.py b/jeepyb/cmd/manage_projects.py
index 853dde2..4f360a6 100644
--- a/jeepyb/cmd/manage_projects.py
+++ b/jeepyb/cmd/manage_projects.py
@@ -525,7 +525,7 @@
                         repo_path,
                         "push origin refs/heads/*:refs/heads/*",
                         env=ssh_env)
-                    git_command(repo_path, 'push --tags', env=ssh_env)
+                    git_command(repo_path, 'push origin --tags', env=ssh_env)
                 except Exception:
                     log.exception(
                         "Error pushing %s to Gerrit." % project)
diff --git a/jeepyb/cmd/run_mirror.py b/jeepyb/cmd/run_mirror.py
deleted file mode 100644
index 5e54583..0000000
--- a/jeepyb/cmd/run_mirror.py
+++ /dev/null
@@ -1,373 +0,0 @@
-#! /usr/bin/env python
-# Copyright (C) 2011 OpenStack, LLC.
-# Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
-# Copyright (C) 2013 OpenStack Foundation
-#
-# 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.
-
-# run_mirror reads a YAML config file like:
-#   cache-root: /tmp/cache
-#
-#   mirrors:
-#     - name: openstack
-#       projects:
-#         - https://github.com/openstack/requirements
-#       output: /tmp/mirror/openstack
-#
-#     - name: openstack-infra
-#       projects:
-#         - https://github.com/openstack-infra/config
-#       output: /tmp/mirror/openstack-infra
-#
-# The algorithm it attempts to follow is:
-#
-# for each project:
-#   clone if necessary and fetch origin
-#   for each project-branch:
-#     create new virtualenv
-#     pip install reqs into virtualenv
-#     if installation succeeds:
-#       pip freeze > full-reqs
-#       create new virtualenv
-#       pip install (download only) full-reqs into virtualenv
-#
-# By default only summary information is printed on stdout (see the
-# -d command line option to get more debug info).
-#
-# If "pip install" for a branch's requirements fails to complete
-# (based on parsing of its output), that output will be copied to
-# stderr and the script will skip ahead to the next branch. This
-# makes it suitable for running in a cron job with only stdout
-# redirected to a log, and also avoids one broken project preventing
-# caching of requirements for others.
-from __future__ import print_function
-
-import argparse
-import datetime
-import md5
-import os
-import pkginfo
-import re
-import shlex
-import shutil
-import subprocess
-import sys
-import tempfile
-import urllib
-import yaml
-
-
-class Mirror(object):
-    def __init__(self):
-        parser = argparse.ArgumentParser(
-            description='Build a pypi mirror from requirements')
-        parser.add_argument('-b', dest='branch',
-                            help='restrict run to a specified branch')
-        parser.add_argument('-c', dest='config',
-                            help='specify the config file')
-        parser.add_argument('-n', dest='noop', action='store_true',
-                            help='do not run any commands')
-        parser.add_argument('--no-pip', dest='no_pip', action='store_true',
-                            help='do not run any pip commands')
-        parser.add_argument('--verbose', dest='debug', action='store_true',
-                            help='output verbose debug information')
-        parser.add_argument('--no-download', dest='no_download',
-                            action='store_true',
-                            help='only process the pip cache into a mirror '
-                            '(do not download)')
-        parser.add_argument('--no-process', dest='no_process',
-                            action='store_true',
-                            help='only download into the pip cache '
-                            '(do not process the cache into a mirror)')
-        parser.add_argument('--no-update', dest='no_update',
-                            action='store_true',
-                            help='do not update any git repos')
-        self.args = parser.parse_args()
-        self.config = yaml.load(open(self.args.config))
-
-    def run_command(self, cmd):
-        cmd_list = shlex.split(str(cmd))
-        self.debug("Run: %s" % cmd)
-        if self.args.noop:
-            return ''
-        if self.args.no_pip and cmd_list[0].endswith('pip'):
-            return ''
-        p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE,
-                             stderr=subprocess.STDOUT)
-        (out, nothing) = p.communicate()
-        out = out.strip()
-        self.debug(out)
-        return out
-
-    def run(self):
-        for mirror in self.config['mirrors']:
-            if not self.args.no_download:
-                self.build_mirror(mirror)
-            if not self.args.no_process:
-                self.process_cache(mirror)
-
-    def chdir(self, dest):
-        self.debug("cd %s" % dest)
-        if not self.args.noop:
-            os.chdir(dest)
-
-    def debug(self, msg):
-        if self.args.debug:
-            print(msg)
-
-    def process_http_requirements(self, reqlist, pip_cache_dir, pip):
-        new_reqs = []
-        for reqfile in reqlist:
-            for req in open(reqfile):
-                req = req.strip()
-                # Handle http://, https://, and git+https?://
-                if not re.search('https?://', req):
-                    new_reqs.append(req)
-                    continue
-                target_url = req.split('#', 1)[0]
-                target_file = os.path.join(pip_cache_dir,
-                                           urllib.quote(target_url, ''))
-                if os.path.exists(target_file):
-                    self.debug("Unlink: %s" % target_file)
-                    os.unlink(target_file)
-                if os.path.exists(target_file + '.content-type'):
-                    self.debug("Unlink: %s.content-type" % target_file)
-                    os.unlink(target_file + '.content-type')
-        return new_reqs
-
-    def find_pkg_info(self, path):
-        versions = set()
-        for root, dirs, files in os.walk(path):
-            if not root.endswith('.egg'):
-                continue
-            if not os.path.exists(os.path.join(root, 'EGG-INFO', 'PKG-INFO')):
-                continue
-            package = pkginfo.Develop(root)
-            versions.add('%s==%s' % (package.name, package.version))
-        return versions
-
-    def build_mirror(self, mirror):
-        print("Building mirror: %s" % mirror['name'])
-        pip_format = ("%s install -U %s --exists-action=w "
-                      "--download-cache=%s --build %s -r %s")
-        venv_format = ("virtualenv --clear --extra-search-dir=%s %s")
-        upgrade_format = ("%s install -U --exists-action=w "
-                          "--download-cache=%s --build %s %s")
-
-        workdir = tempfile.mkdtemp()
-        reqs = os.path.join(workdir, "reqs")
-        venv = os.path.join(workdir, "venv")
-        build = os.path.join(workdir, "build")
-        pip = os.path.join(venv, "bin", "pip")
-
-        project_cache_dir = os.path.join(self.config['cache-root'],
-                                         'projects')
-        pip_cache_dir = os.path.join(self.config['cache-root'],
-                                     'pip', mirror['name'])
-        if not self.args.noop:
-            if not os.path.exists(project_cache_dir):
-                os.makedirs(project_cache_dir)
-            if not os.path.exists(pip_cache_dir):
-                os.makedirs(pip_cache_dir)
-
-        for project in mirror['projects']:
-            print("Updating repository: %s" % project)
-            self.chdir(project_cache_dir)
-            short_project = project.split('/')[-1]
-            if short_project.endswith('.git'):
-                short_project = short_project[:-4]
-            if not os.path.isdir(short_project):
-                out = self.run_command("git clone %s %s" %
-                                       (project, short_project))
-            self.chdir(os.path.join(project_cache_dir,
-                                    short_project))
-            out = self.run_command("git fetch -p origin")
-
-            if self.args.branch:
-                branches = [self.args.branch]
-            else:
-                branches = self.run_command("git branch -a").split("\n")
-            for branch in branches:
-                branch = branch.strip()
-                if (not branch.startswith("remotes/origin")
-                        or "origin/HEAD" in branch):
-                    continue
-                print("Fetching pip requires for %s:%s" %
-                      (project, branch))
-                if not self.args.no_update:
-                    out = self.run_command("git reset --hard %s" % branch)
-                    out = self.run_command("git clean -x -f -d -q")
-                reqlist = []
-                if os.path.exists('global-requirements.txt'):
-                    reqlist.append('global-requirements.txt')
-                else:
-                    for requires_file in ("requirements.txt",
-                                          "test-requirements.txt",
-                                          "tools/pip-requires",
-                                          "tools/test-requires"):
-                        if os.path.exists(requires_file):
-                            reqlist.append(requires_file)
-                if reqlist:
-                    out = self.run_command(venv_format %
-                                           (pip_cache_dir, venv))
-                    out = self.run_command(upgrade_format %
-                                           (pip, pip_cache_dir,
-                                            build, "setuptools"))
-                    out = self.run_command(upgrade_format %
-                                           (pip, pip_cache_dir,
-                                            build, "pip"))
-                    out = self.run_command(upgrade_format %
-                                           (pip, pip_cache_dir,
-                                            build, "virtualenv"))
-                    if os.path.exists(build):
-                        shutil.rmtree(build)
-                    new_reqs = self.process_http_requirements(reqlist,
-                                                              pip_cache_dir,
-                                                              pip)
-                    (reqfp, reqfn) = tempfile.mkstemp()
-                    os.write(reqfp, '\n'.join(new_reqs))
-                    os.close(reqfp)
-                    out = self.run_command(pip_format %
-                                           (pip, "", pip_cache_dir,
-                                            build, reqfn))
-                    if "\nSuccessfully installed " not in out:
-                        sys.stderr.write("Installing pip requires for %s:%s "
-                                         "failed.\n%s\n" %
-                                         (project, branch, out))
-                        print("pip install did not indicate success")
-                    else:
-                        freeze = self.run_command("%s freeze -l" % pip)
-                        requires = self.find_pkg_info(build)
-                        reqfd = open(reqs, "w")
-                        for line in freeze.split("\n"):
-                            if line.startswith("-e ") or (
-                                    "==" in line and " " not in line):
-                                requires.add(line)
-                        for r in requires:
-                            reqfd.write(r + "\n")
-                        reqfd.close()
-                        out = self.run_command(venv_format %
-                                               (pip_cache_dir, venv))
-                        if os.path.exists(build):
-                            shutil.rmtree(build)
-                        out = self.run_command(pip_format %
-                                               (pip, "--no-install",
-                                                pip_cache_dir, build, reqs))
-                        if "\nSuccessfully downloaded " not in out:
-                            sys.stderr.write("Downloading pip requires for "
-                                             "%s:%s failed.\n%s\n" %
-                                             (project, branch, out))
-                            print("pip install did not indicate success")
-                        print("cached:\n%s" % freeze)
-                else:
-                    print("no requirements")
-        shutil.rmtree(workdir)
-
-    def process_cache(self, mirror):
-        if self.args.noop:
-            return
-
-        pip_cache_dir = os.path.join(self.config['cache-root'],
-                                     'pip', mirror['name'])
-        destination_mirror = mirror['output']
-
-        PACKAGE_VERSION_RE = re.compile(r'(.*)-[0-9]')
-        full_html_line = "<a href='{dir}/{name}'>{name}</a><br />\n"
-
-        packages = {}
-        package_count = 0
-
-        if not os.path.exists(destination_mirror):
-            os.makedirs(destination_mirror)
-
-        for filename in os.listdir(pip_cache_dir):
-            if filename.endswith('content-type'):
-                continue
-
-            realname = urllib.unquote(filename)
-            # The ? accounts for sourceforge downloads
-            tarball = os.path.basename(realname).split("?")[0]
-            name_match = PACKAGE_VERSION_RE.search(tarball)
-
-            if name_match is None:
-                continue
-            package_name = name_match.group(1)
-
-            version_list = packages.get(package_name, {})
-            version_list[tarball] = filename
-            packages[package_name] = version_list
-            package_count = package_count + 1
-
-        full_html = open(os.path.join(destination_mirror, ".full.html"), 'w')
-        simple_html = open(os.path.join(destination_mirror, ".index.html"),
-                           'w')
-
-        header = ("<html><head><title>PyPI Mirror</title></head>"
-                  "<body><h1>PyPI Mirror</h1><h2>Last update: %s</h2>\n\n"
-                  % datetime.datetime.utcnow().strftime("%c UTC"))
-        full_html.write(header)
-        simple_html.write(header)
-
-        for package_name, versions in packages.items():
-            destination_dir = os.path.join(destination_mirror, package_name)
-            if not os.path.isdir(destination_dir):
-                os.makedirs(destination_dir)
-            safe_dir = urllib.quote(package_name)
-            simple_html.write("<a href='%s'>%s</a><br />\n" %
-                              (safe_dir, safe_dir))
-            with open(os.path.join(destination_dir, ".index.html"),
-                      'w') as index:
-                index.write("""<html><head>
-          <title>%s &ndash; PyPI Mirror</title>
-        </head><body>\n""" % package_name)
-                for tarball, filename in versions.items():
-                    source_path = os.path.join(pip_cache_dir, filename)
-                    destination_path = os.path.join(destination_dir,
-                                                    tarball)
-                    dot_destination_path = os.path.join(destination_dir,
-                                                        '.' + tarball)
-                    with open(dot_destination_path, 'w') as dest:
-                        src = open(source_path, 'r').read()
-                        md5sum = md5.md5(src).hexdigest()
-                        dest.write(src)
-
-                        safe_name = urllib.quote(tarball)
-
-                        full_html.write(full_html_line.format(dir=safe_dir,
-                                                              name=safe_name))
-                        index.write("<a href='%s#md5=%s'>%s</a>\n" %
-                                    (safe_name, md5sum, safe_name))
-                    os.rename(dot_destination_path, destination_path)
-                index.write("</body></html>\n")
-            os.rename(os.path.join(destination_dir, ".index.html"),
-                      os.path.join(destination_dir, "index.html"))
-        footer = """<p class='footer'>Generated by process_cache.py; %d
-        packages mirrored. </p>
-        </body></html>\n""" % package_count
-        full_html.write(footer)
-        full_html.close()
-        os.rename(os.path.join(destination_mirror, ".full.html"),
-                  os.path.join(destination_mirror, "full.html"))
-        simple_html.write(footer)
-        simple_html.close()
-        os.rename(os.path.join(destination_mirror, ".index.html"),
-                  os.path.join(destination_mirror, "index.html"))
-
-
-def main():
-    mb = Mirror()
-    mb.run()
-
-
-if __name__ == "__main__":
-    main()
diff --git a/setup.cfg b/setup.cfg
index a257d7e..d71104c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -25,7 +25,6 @@
     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
