diff --git includes/batch.inc includes/batch.inc
index 0f30bc4..511b1e4 100644
--- includes/batch.inc
+++ includes/batch.inc
@@ -95,6 +95,26 @@ function _batch_page() {
 }
 
 /**
+ * Delivery callback for batch requests.
+ *
+ * @see drupal_deliver_page()
+ * @see drupal_deliver_html_page()
+ */
+function batch_deliver_page($page_callback_result) {
+  if ($page_callback_result === FALSE) {
+    drupal_deliver_html_page(MENU_ACCESS_DENIED);
+  }
+  elseif (isset($page_callback_result) && (is_string($page_callback_result) || is_array($page_callback_result))) {
+    // Force a page without blocks or messages to display a list of collected
+    // messages later.
+    drupal_set_page_content($page_callback_result);
+    $page = element_info('page');
+    $page['#show_messages'] = FALSE;
+    drupal_deliver_html_page($page);
+  }
+}
+
+/**
  * Initialize the batch processing.
  *
  * JavaScript-enabled clients are identified by the 'has_js' cookie set in
diff --git modules/system/system.admin.inc modules/system/system.admin.inc
index f374e17..f81808b 100644
--- modules/system/system.admin.inc
+++ modules/system/system.admin.inc
@@ -2276,26 +2276,6 @@ function system_php() {
 }
 
 /**
- * Default page callback for batches.
- */
-function system_batch_page() {
-  require_once DRUPAL_ROOT . '/includes/batch.inc';
-  $output = _batch_page();
-
-  if ($output === FALSE) {
-    drupal_access_denied();
-  }
-  elseif (isset($output)) {
-    // Force a page without blocks or messages to
-    // display a list of collected messages later.
-    drupal_set_page_content($output);
-    $page = element_info('page');
-    $page['#show_messages'] = FALSE;
-    return $page;
-  }
-}
-
-/**
  * Returns HTML for an administrative block for display.
  *
  * @param $variables
diff --git modules/system/system.module modules/system/system.module
index 89f1d48..a71b178 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -1047,11 +1047,17 @@ function system_menu() {
 
   // Default page for batch operations.
   $items['batch'] = array(
-    'page callback' => 'system_batch_page',
+    'page callback' => '_batch_page',
+     // Depending on the client configuration, the _batch_page() callback
+     // returns either an HTML page or plain JSON. Using the regular
+     // drupal_deliver_html_page() callback would break with modules using
+     // hook_page_delivery_callback_alter() and expecting an HTML page.
+    'delivery callback' => 'batch_deliver_page',
     'access callback' => TRUE,
     'theme callback' => '_system_batch_theme',
     'type' => MENU_CALLBACK,
-    'file' => 'system.admin.inc',
+    'file path' => 'includes',
+    'file' => 'batch.inc',
   );
   return $items;
 }
