diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 1566c80..cff52f0 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1207,8 +1207,21 @@ function system_modules_submit($form, &$form_state) {
   krsort($actions['enable']);
 
   // Installs, enables, and disables modules.
-  module_enable($actions['enable'], FALSE);
-  module_disable($actions['disable'], FALSE);
+  $module_batch = array(
+    'title' => t('Processing module enabling/disabling.'),
+    'error_message' => t('There was a problem enabling or disabling modules.'),
+    'operations' => array(),
+  );
+  foreach ($actions['enable'] as $module) {
+    $module_batch['operations'][] = array('module_batch', array($module, 'enable'));
+  }
+  foreach ($actions['disable'] as $module) {
+    $module_batch['operations'][] = array('module_batch', array($module, 'disable'));
+  }
+
+  if (count($module_batch['operations'])) {
+    batch_set($module_batch);
+  }
 
   // Gets module list after install process, flushes caches and displays a
   // message if there are changes.
@@ -1222,6 +1235,20 @@ function system_modules_submit($form, &$form_state) {
 }
 
 /**
+ * Batch callback to enable and disable modules.
+ */
+function module_batch($module, $action, &$context) {
+  if ($action == 'enable') {
+    module_enable(array($module), FALSE);
+    $context['message'] = t('Installed %module module.', array('%module' => $module));
+  }
+  elseif ($action == 'disable') {
+    module_disable(array($module), FALSE);
+    $context['message'] = t('Disabled %module module.', array('%module' => $module));
+  }
+}
+
+/**
  * Uninstall functions
  */
 
