diff --git a/.zuul.yaml b/.zuul.yaml
index e2628cb..9bac031 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -7,7 +7,6 @@
             voting: false
         - tox-pep8
         - tox-py35
-        - tox-tarball
     gate:
       jobs:
         - tox-docs
diff --git a/tests/base.py b/tests/base.py
index 028a8b1..680c2a7 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -481,6 +481,25 @@
         self.changes[self.change_number] = c
         return c
 
+    def getFakeBranchCreatedEvent(self, project, branch):
+        path = os.path.join(self.upstream_root, project)
+        repo = git.Repo(path)
+        oldrev = 40 * '0'
+
+        event = {
+            "type": "ref-updated",
+            "submitter": {
+                "name": "User Name",
+            },
+            "refUpdate": {
+                "oldRev": oldrev,
+                "newRev": repo.heads[branch].commit.hexsha,
+                "refName": branch,
+                "project": project,
+            }
+        }
+        return event
+
     def review(self, project, changeid, message, action):
         number, ps = changeid.split(',')
         change = self.changes[int(number)]
diff --git a/tests/unit/test_v3.py b/tests/unit/test_v3.py
index adb6bed..e4e71d9 100755
--- a/tests/unit/test_v3.py
+++ b/tests/unit/test_v3.py
@@ -444,6 +444,9 @@
         file_dict = {'.zuul.yaml': in_repo_conf,
                      'playbooks/project-test2.yaml': in_repo_playbook}
         self.create_branch('org/project', 'stable')
+        self.fake_gerrit.addEvent(
+            self.fake_gerrit.getFakeBranchCreatedEvent(
+                'org/project', 'stable'))
         A = self.fake_gerrit.addFakeChange('org/project', 'stable', 'A',
                                            files=file_dict)
         A.addApproval('Code-Review', 2)
@@ -484,6 +487,9 @@
         # it from a different branch on a different repo.
 
         self.create_branch('org/project1', 'stable')
+        self.fake_gerrit.addEvent(
+            self.fake_gerrit.getFakeBranchCreatedEvent(
+                'org/project1', 'stable'))
 
         in_repo_conf = textwrap.dedent(
             """
diff --git a/zuul/ansible/callback/zuul_stream.py b/zuul/ansible/callback/zuul_stream.py
index 34d4406..a9c1155 100644
--- a/zuul/ansible/callback/zuul_stream.py
+++ b/zuul/ansible/callback/zuul_stream.py
@@ -326,7 +326,7 @@
             # We have a custom zuul module that doesn't want the parameters
             # from its returned splatted to stdout. This is typically for
             # modules that are collecting data to be displayed some other way.
-            for key in result_dict.keys():
+            for key in list(result_dict.keys()):
                 if key != 'changed':
                     result_dict.pop(key)
 
diff --git a/zuul/configloader.py b/zuul/configloader.py
index aead0d8..7da54cd 100644
--- a/zuul/configloader.py
+++ b/zuul/configloader.py
@@ -1402,7 +1402,17 @@
                     tenant, config_semaphore)
                 if 'semaphore' not in classes:
                     continue
-                layout.addSemaphore(SemaphoreParser.fromYaml(config_semaphore))
+                semaphore = SemaphoreParser.fromYaml(config_semaphore)
+                old_semaphore = layout.semaphores.get(semaphore.name)
+                if (old_semaphore and
+                    (old_semaphore.source_context.project ==
+                     semaphore.source_context.project)):
+                    # If a semaphore shows up twice in the same
+                    # project, it's probably due to showing up in
+                    # two branches.  Ignore subsequent
+                    # definitions.
+                    continue
+                layout.addSemaphore(semaphore)
 
         for config_template in data.project_templates:
             classes = TenantParser._getLoadClasses(tenant, config_template)
@@ -1494,7 +1504,9 @@
         if trusted:
             branches = ['master']
         else:
-            branches = project.source.getProjectBranches(project, tenant)
+            # Use the cached branch list; since this is a dynamic
+            # reconfiguration there should not be any branch changes.
+            branches = project.unparsed_branch_config.keys()
 
         for branch in branches:
             fns1 = []
diff --git a/zuul/driver/gerrit/gerritconnection.py b/zuul/driver/gerrit/gerritconnection.py
index de72c69..daec0f5 100644
--- a/zuul/driver/gerrit/gerritconnection.py
+++ b/zuul/driver/gerrit/gerritconnection.py
@@ -122,6 +122,17 @@
                              "from Gerrit. Can not get account information." %
                              (event.type,))
 
+        # This checks whether the event created or deleted a branch so
+        # that Zuul may know to perform a reconfiguration on the
+        # project.
+        if event.type == 'ref-updated' and not event.ref.startswith('refs/'):
+            if event.oldrev == '0' * 40:
+                event.branch_created = True
+                event.branch = event.ref
+            if event.newrev == '0' * 40:
+                event.branch_deleted = True
+                event.branch = event.ref
+
         if event.change_number:
             # TODO(jhesketh): Check if the project exists?
             # and self.connection.sched.getProject(event.project_name):
diff --git a/zuul/driver/github/githubconnection.py b/zuul/driver/github/githubconnection.py
index 616e774..2d9dd94 100644
--- a/zuul/driver/github/githubconnection.py
+++ b/zuul/driver/github/githubconnection.py
@@ -163,6 +163,14 @@
             # necessary for the scheduler to match against particular branches
             event.branch = ref_parts[2]
 
+        # This checks whether the event created or deleted a branch so
+        # that Zuul may know to perform a reconfiguration on the
+        # project.
+        if event.oldrev == '0' * 40:
+            event.branch_created = True
+        if event.newrev == '0' * 40:
+            event.branch_deleted = True
+
         return event
 
     def _event_pull_request(self, body):
diff --git a/zuul/executor/server.py b/zuul/executor/server.py
index 45937ef..9340f09 100644
--- a/zuul/executor/server.py
+++ b/zuul/executor/server.py
@@ -1406,17 +1406,13 @@
             callback_path = '%s:%s' % (
                 self.executor_server.callback_dir,
                 os.path.dirname(ara_callbacks.__file__))
-            callback_whitelist = 'zuul_json,ara'
         else:
             callback_path = self.executor_server.callback_dir
-            callback_whitelist = 'zuul_json'
         with open(jobdir_playbook.ansible_config, 'w') as config:
             config.write('[defaults]\n')
             config.write('hostfile = %s\n' % self.jobdir.inventory)
             config.write('local_tmp = %s/local_tmp\n' %
                          self.jobdir.ansible_cache_root)
-            config.write('remote_tmp = %s/remote_tmp\n' %
-                         self.jobdir.ansible_cache_root)
             config.write('retry_files_enabled = False\n')
             config.write('gathering = smart\n')
             config.write('fact_caching = jsonfile\n')
@@ -1427,7 +1423,6 @@
             config.write('command_warnings = False\n')
             config.write('callback_plugins = %s\n' % callback_path)
             config.write('stdout_callback = zuul_stream\n')
-            config.write('callback_whitelist = %s\n' % callback_whitelist)
             # bump the timeout because busy nodes may take more than
             # 10s to respond
             config.write('timeout = 30\n')
diff --git a/zuul/model.py b/zuul/model.py
index 5a157bc..850bbe2 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -1996,6 +1996,8 @@
         # common
         self.type = None
         self.branch_updated = False
+        self.branch_created = False
+        self.branch_deleted = False
         self.ref = None
         # For management events (eg: enqueue / promote)
         self.tenant_name = None
diff --git a/zuul/scheduler.py b/zuul/scheduler.py
index a64d9e0..52b34ec 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -753,12 +753,15 @@
                                    "source %s",
                                    e.change, project.source)
                     continue
-                if (event.branch_updated and
-                    hasattr(change, 'files') and
-                    change.updatesConfig()):
-                    # The change that just landed updates the config.
-                    # Clear out cached data for this project and
-                    # perform a reconfiguration.
+                if ((event.branch_updated and
+                     hasattr(change, 'files') and
+                     change.updatesConfig()) or
+                    event.branch_created or
+                    event.branch_deleted):
+                    # The change that just landed updates the config
+                    # or a branch was just created or deleted.  Clear
+                    # out cached data for this project and perform a
+                    # reconfiguration.
                     change.project.unparsed_config = None
                     self.reconfigureTenant(tenant)
                 for pipeline in tenant.layout.pipelines.values():
