diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 97a4673..78da082 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1158,14 +1158,12 @@ function system_modules_submit($form, &$form_state) {
   $actions = array(
     'enable' => array(),
     'disable' => array(),
-    'install' => array(),
   );
 
   // Builds arrays of modules that need to be enabled, disabled, and installed.
   foreach ($modules as $name => $module) {
     if ($module['enabled']) {
       if (drupal_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) {
-        $actions['install'][] = $name;
         $actions['enable'][] = $name;
       }
       elseif (!module_exists($name)) {
@@ -1177,27 +1175,56 @@ 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 = module_list();
-  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);
+  $batch = array(
+    'title' => t('Modules'),
+    'operations' => array(),
+    'finished' => 'system_modules_batch_finished',
+  );
 
-  // Gets module list after install process, flushes caches and displays a
-  // message if there are changes.
-  $post_install_list = module_list(TRUE);
-  if ($pre_install_list != $post_install_list) {
-    drupal_flush_all_caches();
-    drupal_set_message(t('The configuration options have been saved.'));
+  foreach ($actions['enable'] as $module) {
+    $batch['operations'][] = array('system_modules_batch_process', array($module, TRUE));
+  }
+  foreach ($actions['disable'] as $module) {
+    $batch['operations'][] = array('system_modules_batch_process', array($module, FALSE));
   }
+  $batch['operations'][] = array('module_list', array(TRUE));
+  $batch['operations'][] = array('drupal_flush_all_caches');
+
+  batch_set($batch);
+  batch_process('admin/modules');
+}
 
-  $form_state['redirect'] = 'admin/modules';
+/**
+ * Batch Callback; Enable or disable a module.
+ */
+function system_modules_batch_process($module, $enable, &$context) {
+  if ($enable) {
+    $context['message'] = t('Enabling %module.', array('%module' => $module));
+    module_enable(array($module), FALSE);
+    $context['result'][] = t('Enabled %module.', array('%module' => $module));
+  }
+  else {
+    $context['message'] = t('Disabling %module.', array('%module' => $module));
+    module_disable(array($module), FALSE);
+    $context['result'][] = t('Disabled %module.', array('%module' => $module));
+  }
+}
+
+/**
+ * Batch Callback; Finished processing the modules page changes.
+ */
+function system_modules_batch_finished($success, $results, $operations) {
+  if ($success) {
+    $message = t('The configuration options have been saved.');
+  }
+  else {
+    $message = t('An error occurred while saving the configuration.');
+  }
+  drupal_set_message($message);
 }
 
 /**
