diff --git a/doc/source/gerrit.rst b/doc/source/gerrit.rst
index d1947f7fa5..09b22c482b 100644
--- a/doc/source/gerrit.rst
+++ b/doc/source/gerrit.rst
@@ -408,49 +408,6 @@ project in question, and about 10 minutes of downtime for all of
 Gerrit. All Gerrit changes, merged and open, will carry over, so
 in-progress changes do not need to be merged before the move.
 
-Note that some of the steps in the process below are repetitive and
-so for larger batches a script can be used to generate the command
-lists for upload to and execution on their respective servers::
-
-  #!/bin/sh
-  #
-  # Expects a renames.list file in the current directory with:
-  #
-  #     stackforge/foo -> openstack/foo
-  #     openstack/oldbar -> openstack/newbar
-
-  echo "\nGerrit database updates\n-----------------------"
-  for r in `sed 's/ -> /@/' renames.list` ; do
-      OLD=`echo $r | cut -d@ -f1`
-      NEW=`echo $r | cut -d@ -f2`
-      echo "update account_project_watches set project_name = \"$NEW\" where
-          project_name = \"$OLD\";"
-      echo "update changes set dest_project_name = \"$NEW\",
-          created_on = created_on where dest_project_name = \"$OLD\";"
-  done
-
-  echo "\nGerrit filesystem updates\n-------------------------"
-  for r in `sed 's/ -> /@/' renames.list` ; do
-      OLD=`echo $r | cut -d@ -f1` ; NEW=`echo $r | cut -d@ -f2`
-      echo "sudo mv ~gerrit2/review_site/git/{$OLD,$NEW}.git"
-      echo "sudo mv /opt/lib/git/{$OLD,$NEW}.git"
-  done
-
-  echo "\nGit farm filesystem updates\n---------------------------"
-  for r in `sed 's/ -> /@/' renames.list` ; do
-      OLD=`echo $r | cut -d@ -f1`
-      NEW=`echo $r | cut -d@ -f2`
-      echo "sudo mv /var/lib/git/{$OLD,$NEW}.git"
-  done
-
-  echo "\nJenkins workspace cleanup\n-------------------------"
-  for r in `sed 's/ -> /@/' renames.list` ; do
-  NAME=`echo $r | cut -d@ -f1 | cut -d/ -f2`
-  echo "sudo ansible-playbook -f 10 \\
-      /etc/ansible/playbooks/clean_workspaces.yaml \\
-      --extra-vars \"project=$NAME\""
-  done
-
 To rename a project:
 
 #. Prepare a change to the project-config repo to update things like
@@ -461,15 +418,6 @@ To rename a project:
    openstack/governance repo, and .gitmodules in the
    openstack/openstack repo if necessary.
 
-#. Stop puppet runs on the puppetmaster to prevent early application
-   of configuration changes::
-
-     sudo crontab -u root -e
-
-   Comment out the crontab entries.  Use ps to make sure that a run is
-   not currently in progress.  When it finishes, make sure the entry
-   has not been added back to the crontab.
-
 #. Prepare a yaml file called repos.yaml that has a single dictionary called
    `repos` with a list of dictionaries each having an old and new entry.
    Optionally also add a `gerrit_groups` dict of the same form::
@@ -481,13 +429,37 @@ To rename a project:
      - old: old-core-group
        new: new-core-group
 
+#. An hour in advance of the maintenance (if possible), stop puppet
+   runs on the puppetmaster to prevent early application of
+   configuration changes::
+
+     sudo crontab -u root -e
+
+   Comment out the crontab entries.  Use ps to make sure that a run is
+   not currently in progress.  When it finishes, make sure the entry
+   has not been added back to the crontab.
+
+#. Export and stop Zuul on zuul.openstack.org::
+
+     python /opt/zuul/tools/zuul-changes.py http://zuul.openstack.org gate >gate.sh
+     python /opt/zuul/tools/zuul-changes.py http://zuul.openstack.org check >check.sh
+     sudo invoke-rc.d zuul stop
+     sudo rm -f /var/run/zuul/zuul.pid /var/run/zuul/zuul.listedock
+
 #. Run the ansible rename repos playbook, passing in the path to your yaml
    file::
 
      sudo ansible-playbook -f 10 /opt/system-config/production/playbooks/rename_repos.yaml -e repolist=ABSOLUTE_PATH_TO_VARS_FILE
 
-#. Merge the prepared Puppet configuration change, removing the
-   original Jenkins jobs via the Jenkins WebUI later if needed.
+#. Start Zuul on zuul.openstack.org::
+
+     sudo invoke-rc.d zuul start
+     sudo bash gate.sh
+     sudo bash check.sh
+
+#. Merge the prepared Puppet configuration changes.
+
+#. Rename the project or transfer ownership in GitHub
 
 #. Re-enable puppet runs on the puppetmaster::
 
diff --git a/playbooks/rename_repos.yaml b/playbooks/rename_repos.yaml
index 6400949123..20b7f35471 100644
--- a/playbooks/rename_repos.yaml
+++ b/playbooks/rename_repos.yaml
@@ -1,74 +1,61 @@
 ---
-- hosts: zuul.openstack.org
-  gather_facts: False
-  remote_user: root
-  sudo: yes
-  tasks:
-  - shell: kill -USR1 $(cat /var/run/zuul/zuul.pid)
-  - shell: rm -f /var/run/zuul/zuul.pid /var/run/zuul/zuul.lock
 - hosts: review.openstack.org
   gather_facts: False
   remote_user: root
-  sudo: yes
   tasks:
   - shell: invoke-rc.d gerrit stop
   - include_vars: "{{ repolist }}"
   - shell: echo 'update account_project_watches set project_name = "{{ item.new }}" where project_name = "{{ item.old }}";' | mysql reviewdb
-    with_items: repos
+    with_items: {{ repos }}
   - shell: echo 'update changes set dest_project_name = "{{ item.new }}", created_on = created_on where dest_project_name = "{{ item.old }}";' | mysql reviewdb
-    with_items: repos
-  - shell: mv {{ item[0] }}{{ item[1].old }} {{ item[0] }}{{ item[1].new }}
+    with_items: {{ repos }}
+  - shell: mv {{ item[0] }}{{ item[1].old }}.git {{ item[0] }}{{ item[1].new }}.git
     with_nested:
-    - [ '~gerrit2/review_site/git/', '/opt/lib/git' ]
-    - repos
+    - [ '~gerrit2/review_site/git/', '/opt/lib/git/' ]
+    - {{ repos }}
 - hosts: 'git0*'
   gather_facts: False
   tasks:
   - include_vars: "{{ repolist }}"
-  - shell: mv {{ item[0] }}{{ item[1].old }} {{ item[0] }}{{ item[1].new }}
+  - shell: mv {{ item[0] }}{{ item[1].old }}.git {{ item[0] }}{{ item[1].new }}.git
     with_nested:
-    - [ '/var/lib/git' ]
-    - repos
+    - [ '/var/lib/git/' ]
+    - {{ repos }}
 - hosts: storyboard.openstack.org
   gather_facts: False
   remote_user: root
-  sudo: yes
   tasks:
   - include_vars: "{{ repolist }}"
-  - shell: echo 'update projects set name="{{ item.new }}" where name="{{ item.old }}";' | mysql storyboard
-    with_items: repos
+  - shell: echo 'update projects set name="{{ item.new }}" where name="{{ item.old }}";' | mysql --defaults-file=/root/.storyboard_db.cnf storyboard
+    with_items: {{ repos }}
 - hosts: review.openstack.org
   gather_facts: False
-  remote_user: gerrit2
-  sudo: yes
+  remote_user: root
+  become: yes
+  become_user: gerrit2
   tasks:
   - shell: cp -ax /home/gerrit2/review_site/index /home/gerrit2/index.backup.$(date +%s)
-  - shell: java -jar /home/gerrit2/review_site/bin/gerrit.war reindex -d /home/gerrit2/review_site
 - hosts: review.openstack.org
   gather_facts: False
   remote_user: root
-  sudo: yes
   tasks:
   - shell: invoke-rc.d gerrit start
-- hosts: zuul.openstack.org
-  gather_facts: False
-  remote_user: root
-  sudo: yes
-  tasks:
-  - shell: invoke-rc.d zuul start
 - hosts: review.openstack.org
   gather_facts: False
-  remote_user: gerrit2
-  sudo: yes
-  tasks:
-  - include_vars: "{{ repolist }}"
-  - shell: ssh -p 29418 review.openstack.org gerrit rename-group {{ item.old }} {{ item.new }}
-    with_items: "{{ gerrit_groups|default([]) }}"
-- hosts: '*.slave.openstack.org'
   remote_user: root
-  sudo: yes
+  become: yes
+  become_user: gerrit2
+  tasks:
+  - pause: prompt="Make sure that Gerrit ssh api is accepting requests. Use Enter or ^C c to continue. ^C a to abort."
+  - include_vars: "{{ repolist }}"
+  - shell: ssh -p 29418 -i /home/gerrit2/review_site/etc/ssh_project_rsa_key openstack-project-creator@review.openstack.org gerrit rename-group {{ item.old }} {{ item.new }}
+    with_items: "{{ gerrit_groups|default([]) }}"
+# TODO: online reindex accounts
+# TODO: online reindex projects
+- hosts: '*.ci.openstack.org:*.slave.openstack.org'
+  remote_user: root
   gather_facts: False
   tasks:
   - include_vars: "{{ repolist }}"
   - shell: 'rm -rf ~jenkins/workspace/*{{ item.old | basename }}*'
-    with_items: repos
+    with_items: {{ repos }}