diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index c6002f9..d27a524 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1252,9 +1252,38 @@ function system_modules_submit($form, &$form_state) {
   // Reverse the 'enable' list, to order dependencies before dependents.
   krsort($actions['enable']);
 
-  // Installs, enables, and disables modules.
-  module_enable($actions['enable'], FALSE);
-  module_disable($actions['disable'], FALSE);
+  // Installs and enables modules in a batch.
+  $ops_enable = array();
+  foreach ($actions['enable'] as $module) {
+    $ops_enable[] = array('_install_module_batch', array($module, $module));
+  }
+  if ($ops_enable) {
+    $batch_enable = array(
+      'operations' => $operations,
+      'title' => t('Installing modules'),
+      'error_message' => t('Installing a module failed.'),
+  //    'finished' => '',
+    );
+    batch_set($batch_enable);
+  }
+
+  // Disables modules
+  $ops_disable = array();
+  foreach ($actions['disable'] as $module) {
+    $ops_disable[] = array('_system_module_disable_batch', array($module, $module));
+  }
+  if ($ops_disable) {
+    $batch_disable = array(
+      'operations' => $operations,
+      'title' => t('Installing modules'),
+      'error_message' => t('Disabling a module failed.'),
+  //    'finished' => '',
+    );
+    batch_set($batch_disable);
+  }
+
+  // Runs batch
+  batch_process();
 
   // Gets module list after install process, flushes caches and displays a
   // message if there are changes.
@@ -1268,6 +1297,15 @@ function system_modules_submit($form, &$form_state) {
 }
 
 /**
+ * Batch callback for batch disabling modules.
+ */
+function _system_module_disable_batch($module, $module_name, &$context) {
+  module_disable(array($module), FALSE);
+  $context['results'][] = $module;
+  $context['message'] = st('Disabled %module module.', array('%module' => $module_name));
+}
+
+/**
  * Uninstall functions
  */
 
