diff --git a/core/includes/form.inc b/core/includes/form.inc
index 0ef70f8..3e57994 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -1929,7 +1929,16 @@ function form_builder($form_id, &$element, &$form_state) {
     // can be across browsers, if no 'triggering_element' has been identified
     // yet, default it to the first button.
     if (!$form_state['programmed'] && !isset($form_state['triggering_element']) && !empty($form_state['buttons'])) {
-      $form_state['triggering_element'] = $form_state['buttons'][0];
+      $form_state['triggering_element'] = &$form_state['buttons'][0];
+    }
+
+    // If the triggering element specifies a button-level form redirect target,
+    // move it into $form_state['redirect'] and default the button-level submit
+    // handlers to an empty array, in order to prevent form-level submit
+    // handlers from getting invoked.
+    if (isset($form_state['triggering_element']['#redirect'])) {
+      $form_state['redirect'] = $form_state['triggering_element']['#redirect'];
+      $form_state['triggering_element'] += array('#submit' => array());
     }
 
     // If the triggering element specifies "button-level" validation and submit
@@ -2078,7 +2087,7 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
   if ($process_input) {
     // Detect if the element triggered the submission via Ajax.
     if (_form_element_triggered_scripted_submission($element, $form_state)) {
-      $form_state['triggering_element'] = $element;
+      $form_state['triggering_element'] = &$element;
     }
 
     // If the form was submitted by the browser rather than via Ajax, then it
@@ -2088,9 +2097,9 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
       // All buttons in the form need to be tracked for
       // form_state_values_clean() and for the form_builder() code that handles
       // a form submission containing no button information in $_POST.
-      $form_state['buttons'][] = $element;
+      $form_state['buttons'][] = &$element;
       if (_form_button_was_clicked($element, $form_state)) {
-        $form_state['triggering_element'] = $element;
+        $form_state['triggering_element'] = &$element;
       }
     }
   }
