diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 2dc1c57..9252e19 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1148,30 +1148,59 @@ function system_modules_submit($form, &$form_state) {
     }
   }
 
-  // Gets list of modules prior to install process, unsets $form_state['storage']
-  // so we don't get redirected back to the confirmation form.
-  $pre_install_list = drupal_container()->get('module_handler')->getModuleList();
+  // Unsets $form_state['storage'] so we don't get redirected back to
+  // the confirmation form.
   unset($form_state['storage']);
 
   // 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);
+  $module_batch = array(
+    'title' => t('Processing configuration options.'),
+    'error_message' => t('There was a problem saving the configuration options.'),
+    'finished' => 'system_modules_batch_finish',
+    'operations' => array(),
+  );
+  foreach ($actions['enable'] as $module) {
+    $module_batch['operations'][] = array('system_modules_batch', array($module, 'enable'));
+  }
+  foreach ($actions['disable'] as $module) {
+    $module_batch['operations'][] = array('system_modules_batch', array($module, 'disable'));
+  }
 
-  // Gets module list after install process, flushes caches and displays a
-  // message if there are changes.
-  $post_install_list = drupal_container()->get('module_handler')->getModuleList();
-  if ($pre_install_list != $post_install_list) {
-    drupal_flush_all_caches();
-    drupal_set_message(t('The configuration options have been saved.'));
+  if (count($module_batch['operations'])) {
+    batch_set($module_batch);
   }
 
   $form_state['redirect'] = 'admin/modules';
 }
 
 /**
+ * Batch callback to enable and disable modules.
+ */
+function system_modules_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));
+  }
+}
+
+/**
+ * Batch callback to perform finishing tasks.
+ */
+function system_modules_batch_finish($success) {
+  if ($success) {
+    drupal_flush_all_caches();
+    drupal_set_message(t('The configuration options have been saved.'));
+  }
+}
+
+/**
  * Uninstall functions
  */
 
