diff --git includes/form.inc includes/form.inc
index 4dd0626..7ae948b 100644
--- includes/form.inc
+++ includes/form.inc
@@ -218,13 +218,12 @@ function drupal_build_form($form_id, &$form_state) {
   // the form will simply be re-rendered with the values still in its
   // fields.
   //
-  // If $form_state['storage'] or $form_state['rebuild'] has been set
-  // and the form has been submitted, we know that we're in a complex
-  // multi-part process of some sort and the form's workflow is NOT
-  // complete. We need to construct a fresh copy of the form, passing
-  // in the latest $form_state in addition to any other variables passed
+  // If $form_state['rebuild'] has been set and the form has been submitted, we
+  // know that we're in a multi-part process of some sort and the form's
+  // workflow is NOT complete. We need to construct a fresh copy of the form,
+  // passing in the latest $form_state in addition to any other variables passed
   // into drupal_get_form().
-  if ((!empty($form_state['storage']) || $form_state['rebuild']) && $form_state['submitted'] && !form_get_errors()) {
+  if ($form_state['rebuild'] && $form_state['submitted'] && !form_get_errors()) {
     $form = drupal_rebuild_form($form_id, $form_state);
   }
 
@@ -752,9 +751,8 @@ function drupal_validate_form($form_id, $form, &$form_state) {
  * - If $form_state['programmed'] is TRUE, the form submission was usually
  *   invoked via drupal_form_submit(), so any redirection would break the script
  *   that invoked drupal_form_submit().
- * - If $form_state['rebuild'] is TRUE or $form_state['storage'] is populated,
- *   the form is most probably a multi-step form and needs to be rebuilt without
- *   redirection.
+ * - If $form_state['rebuild'] is TRUE is populated, the form needs to be
+ *   rebuilt without redirection.
  *
  * @param $form_state
  *   A keyed array containing the current state of the form.
@@ -767,8 +765,8 @@ function drupal_redirect_form($form_state) {
   if (!empty($form_state['programmed'])) {
     return;
   }
-  // Skip redirection for multi-step forms.
-  if (!empty($form_state['rebuild']) || !empty($form_state['storage'])) {
+  // Skip redirection for explictely set form rebuilds.
+  if (!empty($form_state['rebuild'])) {
     return;
   }
   // Skip redirection if it was explicitly disallowed.
diff --git modules/simpletest/tests/form_test.module modules/simpletest/tests/form_test.module
index c34f93a..6b82649 100644
--- modules/simpletest/tests/form_test.module
+++ modules/simpletest/tests/form_test.module
@@ -346,6 +346,7 @@ function form_storage_test_form_submit($form, &$form_state) {
   else {
     drupal_set_message("Title: ". check_plain($form_state['storage']['thing']['title']));
   }
+  $form_state['rebuild'] = TRUE;
   $form_state['storage']['step']++;
   drupal_set_message("Form constructions: ". $_SESSION['constructions']);
 }
diff --git modules/system/system.admin.inc modules/system/system.admin.inc
index df3a0c4..a62e6be 100644
--- modules/system/system.admin.inc
+++ modules/system/system.admin.inc
@@ -965,6 +965,7 @@ function system_modules_submit($form, &$form_state) {
     // the form submission data needed later.
     if (!isset($form_state['values']['confirm'])) {
       $form_state['storage'] = array('more_modules' => $more_modules, 'modules' => $modules);
+      $form_state['rebuild'] = TRUE;
       return;
     }
     // Otherwise, install or enable the modules.
@@ -1176,6 +1177,7 @@ function system_modules_uninstall_submit($form, &$form_state) {
   }
   else {
     $form_state['storage'] = $form_state['values'];
+    $form_state['rebuild'] = TRUE;
   }
 }
 
