diff --git a/includes/batch.inc b/includes/batch.inc
index 5cdcec0bd905543cf1a2ac05c087ffa743ecdcf2..095b9e78b9f6568081220eccd2952928b131c86e 100644
--- a/includes/batch.inc
+++ b/includes/batch.inc
@@ -445,7 +445,10 @@ function _batch_finished() {
     // If no redirection happened, save the final $form_state value to be
     // retrieved by drupal_get_form() and redirect to the originating page.
     $_SESSION['batch_form_state'] = $_batch['form_state'];
-    drupal_goto($_batch['source_page']);
+    $function = $_batch['redirect_callback'];
+    if (function_exists($function)) {
+      $function($_batch['source_url'], array('op' => 'finish', 'id' => $_batch['id']));
+    }
   }
 }
 
diff --git a/includes/form.inc b/includes/form.inc
index 82d84b4f8f5c7636bf5d221ff918adf4a77bc885..ce7171e28ba31569730173cba8688bf73eab74ce 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -2895,25 +2895,34 @@ function batch_set($batch_definition) {
  * @param $url
  *   (optional - should only be used for separate scripts like update.php)
  *   URL of the batch processing page.
+ * @param $redirect_callback
+ *   (optional) Specify a function to be called to redirect to the progressive
+ *   processing page. By default drupal_goto() will be used to redirect to a
+ *   page which will do the progressive page. Specifying another function will
+ *   allow the progressive processing to be processed differently.
  */
-function batch_process($redirect = NULL, $url = NULL) {
+function batch_process($redirect = NULL, $url = 'batch', $redirect_callback = 'drupal_goto') {
   $batch =& batch_get();
 
   drupal_theme_initialize();
   
   if (isset($batch)) {
     // Add process information
-    $url = isset($url) ? $url : 'batch';
     $process_info = array(
       'current_set' => 0,
       'progressive' => TRUE,
-      'url' => isset($url) ? $url : 'batch',
+      'url' => $url,
       'source_page' => $_GET['q'],
       'redirect' => $redirect,
       'theme' => $GLOBALS['theme_key'],
+      'redirect_callback' => $redirect_callback,
     );
     $batch += $process_info;
 
+    // The batch is now completely built. Allow other modules to make changes to the 
+    // batch so that it is easier to reuse batch processes in other enviroments.
+    drupal_alter('batch', $batch);
+
     if ($batch['progressive']) {
       // Clear the way for the drupal_goto() redirection to the batch processing
       // page, by saving and unsetting the 'destination', if there is any.
@@ -2948,7 +2957,10 @@ function batch_process($redirect = NULL, $url = NULL) {
       // Set the batch number in the session to guarantee that it will stay alive.
       $_SESSION['batches'][$batch['id']] = TRUE;
 
-      drupal_goto($batch['url'], array('op' => 'start', 'id' => $batch['id']));
+      $function = $batch['redirect_callback'];
+      if (function_exists($function)) {
+        $function($batch['url'], array('op' => 'start', 'id' => $batch['id']));
+      }
     }
     else {
       // Non-progressive execution: bypass the whole progressbar workflow
diff --git a/includes/update.inc b/includes/update.inc
index 89deb3ba91d5c0e0169c7195ba4d1d1422196e15..a4005d3ef21393502e2c74f38ae1652088714281 100644
--- a/includes/update.inc
+++ b/includes/update.inc
@@ -361,8 +361,11 @@ class DrupalUpdateException extends Exception { }
  *   scripts like update.php).
  * @param $batch
  *   Optional parameters to pass into the batch API.
+ * @param $redirect_callback
+ *   (optional) Specify a function to be called to redirect to the progressive
+ *   processing page.
  */
-function update_batch($start, $redirect = NULL, $url = NULL, $batch = array()) {
+function update_batch($start, $redirect = NULL, $url = NULL, $batch = array(), $redirect_callback = 'drupal_goto') {
   // During the update, bring the site offline so that schema changes do not
   // affect visiting users.
   $_SESSION['maintenance_mode'] = variable_get('maintenance_mode', FALSE);
@@ -393,7 +396,7 @@ function update_batch($start, $redirect = NULL, $url = NULL, $batch = array()) {
     'file' => 'includes/update.inc',
   );
   batch_set($batch);
-  batch_process($redirect, $url);
+  batch_process($redirect, $url, $redirect_callback);
 }
 
 /**