diff --git a/modules/checkout/includes/commerce_checkout.pages.inc b/modules/checkout/includes/commerce_checkout.pages.inc
index f7435f9..3051110 100644
--- a/modules/checkout/includes/commerce_checkout.pages.inc
+++ b/modules/checkout/includes/commerce_checkout.pages.inc
@@ -106,7 +106,11 @@ function commerce_checkout_form($form, &$form_state, $order, $checkout_page) {
       // submit process with any that were created during the pane generation
       // and merge them into the session's current messages array.
       if (!empty($form_state['storage']['messages'][$pane_id])) {
-        $_SESSION['messages'] = array_merge_recursive($form_state['storage']['messages'][$pane_id], drupal_get_messages());
+        // Make sure that we do not clear the message queue if rules has set a
+        // redirect, because we want to display them on the destination page.
+        $messages = isset($GLOBALS['_rules_action_drupal_goto_do']) ? drupal_get_messages() : drupal_get_messages(NULL, FALSE);
+
+        $_SESSION['messages'] = array_merge_recursive($form_state['storage']['messages'][$pane_id], $messages);
       }
 
       // If there are messages in the session right now for this pane, theme
@@ -119,11 +123,16 @@ function commerce_checkout_form($form, &$form_state, $order, $checkout_page) {
           $show_errors_message = TRUE;
         }
 
-        $form_state['storage']['themed_messages'][$pane_id] = theme('status_messages');
+        // Rendering status messages resets the message session queue, so avoid
+        // doing this if we want to save the messages for the rules redirect
+        // page.
+        if (!isset($GLOBALS['_rules_action_drupal_goto_do'])){
+          $form_state['storage']['themed_messages'][$pane_id] = theme('status_messages');
 
-        $form[$pane_id . '_messages'] = array(
-          '#markup' =>  $form_state['storage']['themed_messages'][$pane_id],
-        );
+          $form[$pane_id . '_messages'] = array(
+            '#markup' =>  $form_state['storage']['themed_messages'][$pane_id],
+          );
+        }
       }
 
       // Create a fieldset for the pane and add the form data defined in the
@@ -144,7 +153,8 @@ function commerce_checkout_form($form, &$form_state, $order, $checkout_page) {
   }
 
   // Restore general messages to the current session's messages array.
-  $_SESSION['messages'] = array_merge_recursive(array_filter($previous_messages), drupal_get_messages());
+  $messages = isset($GLOBALS['_rules_action_drupal_goto_do']) ? drupal_get_messages(NULL, FALSE) : drupal_get_messages();
+  $_SESSION['messages'] = array_merge_recursive(array_filter($previous_messages), $messages);
 
   // If there are errors on the form, add a message to the top of the page.
   if ($show_errors_message) {
