diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 6401361..818f818 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2251,17 +2251,6 @@ function system_authorized_run($callback, $file, $arguments = array(), $page_tit
 }
 
 /**
- * Use authorize.php to run batch_process().
- *
- * @see batch_process()
- */
-function system_authorized_batch_process() {
-  $finish_url = system_authorized_get_url();
-  $process_url = system_authorized_batch_processing_url();
-  batch_process($finish_url, $process_url);
-}
-
-/**
  * @} End of "defgroup authorize".
  */
 
diff --git a/core/modules/update/update.authorize.inc b/core/modules/update/update.authorize.inc
index 4557453..b64e519 100644
--- a/core/modules/update/update.authorize.inc
+++ b/core/modules/update/update.authorize.inc
@@ -30,6 +30,24 @@
  *   - local_url: The locally installed location of new code to update with.
  */
 function update_authorize_run_update($filetransfer, $projects) {
+  update_authorize_batch_set_update($filetransfer, $projects);
+  batch_process();
+}
+
+/**
+ * Initiates a batch for updating existing projects.
+ *
+ * @param $filetransfer
+ *   The FileTransfer object created by authorize.php for use during this
+ *   operation.
+ * @param $projects
+ *   A nested array of projects to install into the live webroot, keyed by
+ *   project name. Each subarray contains the following keys:
+ *   - 'project': The canonical project short name.
+ *   - 'updater_name': The name of the Updater class to use for this project.
+ *   - 'local_url': The locally installed location of new code to update with.
+ */
+function update_authorize_batch_set_update($filetransfer, $projects) {
   $operations = array();
   foreach ($projects as $project => $project_info) {
     $operations[] = array(
@@ -52,8 +70,10 @@ function update_authorize_run_update($filetransfer, $projects) {
   );
 
   batch_set($batch);
-  // Invoke the batch via authorize.php.
-  system_authorized_batch_process();
+  // Force the batch to be invoked via authorize.php.
+  $batch = &batch_get();
+  $batch['url'] = system_authorized_get_url(array('query' => array('batch' => '1')));
+  $batch['redirect'] = system_authorized_get_url();
 }
 
 /**
@@ -76,6 +96,25 @@ function update_authorize_run_update($filetransfer, $projects) {
  *   already been downloaded and extracted into.
  */
 function update_authorize_run_install($filetransfer, $project, $updater_name, $local_url) {
+  update_authorize_batch_set_install($filetransfer, $project, $updater_name, $local_url);
+  batch_process();
+}
+
+/**
+ * Initiates a batch installing a new project.
+ *
+ * @param FileTransfer $filetransfer
+ *   The FileTransfer object created by authorize.php for use during this
+ *   operation.
+ * @param string $project
+ *   The canonical project short name (e.g. {system}.name).
+ * @param string $updater_name
+ *   The name of the Updater class to use for installing this project.
+ * @param string $local_url
+ *   The URL to the locally installed temp directory where the project has
+ *   already been downloaded and extracted into.
+ */
+function update_authorize_batch_set_install($filetransfer, $project, $updater_name, $local_url) {
   $operations[] = array(
     'update_authorize_batch_copy_project',
     array(
@@ -97,8 +136,10 @@ function update_authorize_run_install($filetransfer, $project, $updater_name, $l
   );
   batch_set($batch);
 
-  // Invoke the batch via authorize.php.
-  system_authorized_batch_process();
+  // Force the batch to be invoked via authorize.php.
+  $batch = &batch_get();
+  $batch['url'] = system_authorized_get_url(array('query' => array('batch' => '1')));
+  $batch['redirect'] = system_authorized_get_url();
 }
 
 /**
diff --git a/core/modules/update/update.manager.inc b/core/modules/update/update.manager.inc
index 062ffca..a8e8484 100644
--- a/core/modules/update/update.manager.inc
+++ b/core/modules/update/update.manager.inc
@@ -453,11 +453,11 @@ function update_manager_update_ready_form_submit($form, &$form_state) {
     // owner of our configuration directory (e.g. sites/default) where we're
     // trying to install the code, there's no need to prompt for FTP/SSH
     // credentials. Instead, we instantiate a Drupal\Core\FileTransfer\Local and
-    // invoke update_authorize_run_update() directly.
+    // start a batch that will update the projects directly.
     if (fileowner($project_real_location) == fileowner(conf_path())) {
       module_load_include('inc', 'update', 'update.authorize');
       $filetransfer = new Local(DRUPAL_ROOT);
-      update_authorize_run_update($filetransfer, $updates);
+      update_authorize_batch_set_update($filetransfer, $updates);
     }
     // Otherwise, go through the regular workflow to prompt for FTP/SSH
     // credentials and invoke update_authorize_run_update() indirectly with
@@ -726,11 +726,11 @@ function update_manager_install_form_submit($form, &$form_state) {
   // owner of our configuration directory (e.g. sites/default) where we're
   // trying to install the code, there's no need to prompt for FTP/SSH
   // credentials. Instead, we instantiate a Drupal\Core\FileTransfer\Local and
-  // invoke update_authorize_run_install() directly.
+  // start a batch that will install the project directly.
   if (fileowner($project_real_location) == fileowner(conf_path())) {
     module_load_include('inc', 'update', 'update.authorize');
     $filetransfer = new Local(DRUPAL_ROOT);
-    call_user_func_array('update_authorize_run_install', array_merge(array($filetransfer), $arguments));
+    call_user_func_array('update_authorize_batch_set_install', array_merge(array($filetransfer), $arguments));
   }
   // Otherwise, go through the regular workflow to prompt for FTP/SSH
   // credentials and invoke update_authorize_run_install() indirectly with
