diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index 8e8a82a..3bfca93 100644
--- a/core/lib/Drupal/Core/Form/FormBuilder.php
+++ b/core/lib/Drupal/Core/Form/FormBuilder.php
@@ -1411,12 +1411,19 @@ public function doBuildForm($form_id, &$element, &$form_state) {
         $form_state['triggering_element'] = $form_state['buttons'][0];
       }
 
-      // If the triggering element specifies "button-level" validation and
-      // submit handlers to run instead of the default form-level ones, then add
-      // those to the form state.
+      // If the triggering element specifies "button-level" validation and submit 
+      // handlers to run in addition to or instead of the default form-level ones, 
+      // then add those to the form state.
       foreach (array('validate', 'submit') as $type) {
         if (isset($form_state['triggering_element']['#' . $type])) {
-          $form_state[$type . '_handlers'] = $form_state['triggering_element']['#' . $type];
+          $form_state[$type . '_handlers'] = array();
+          // If requested, add the form's base handlers to the list first.
+          if (!empty($form_state['complete_form']['#'.$type])) {
+            $form_state[$type . '_handlers'] += $form_state['complete_form']['#' . $type];
+          }
+          $form_state[$type . '_handlers'] = array_merge(
+              $form_state[$type . '_handlers'],
+              $form_state['triggering_element']['#' . $type]);
         }
       }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/ValidationTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/ValidationTest.php
index bda5872..badac4b 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Form/ValidationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/ValidationTest.php
@@ -244,4 +244,39 @@ function testCustomRequiredError() {
     }
     $this->assertNoText(t('An illegal choice has been detected. Please contact the site administrator.'));
   }
+  /**
+   * Tests default submit and validate handlers get executed for all submit
+   * button defined in the form, even though the submit button has its own
+   * #validate, #submit handlers defined.
+   */
+  function testFormValidationHandler() {
+    $this->drupalGet('form-test/two-submit-buttons');
+    // Verify default validate handler is executed and errors were raised.
+    $edit = array('name' => 'validate_handler');
+    $this->drupalPostForm(NULL, $edit, 'Save');
+    $this->assertFieldByName('name', '#value changed by form default #validate', 'Form element #value was altered.');
+    $this->assertText('Name field value: value changed by form_set_value() in form default #validate', 'Form element value in $form_state was altered.');
+
+    // Verify default submit handler is executed if no validation errors.
+    $edit = array('name' => 'submit_handler');
+    $this->drupalPostForm(NULL, $edit, 'Save');
+    $this->assertText('Name field value: value changed by form_set_value() in form default #validate', 'Form element value in $form_state was altered.');
+    $this->assertText('The form_test_two_submit_buttons_multiple_handlers form default handler was executed successfully', 'Form Next button submit handler is executed');
+
+    // Verify that next button validate handler is executed along with default
+    // validate handler and errors were raised.
+    $edit = array('name' => 'nextvalidate_handler');
+    $this->drupalPostForm(NULL, $edit, 'Next');
+    $this->assertFieldByName('name', '#value changed by next button #validate', 'Form element #value was altered by next submit button.');
+    $this->assertText('Name field value: value changed by form_set_value() in form next button #validate', 'Form element value in $form_state was altered by next submit button.');
+    $this->assertText('Default Validation handler is also executed when next button is clicked', 'Form default validation handler is executed');
+
+    // Verify that next button submit handler is executed along with
+    // default submit handler.
+    $edit = array('name' => 'nextsubmit_handler');
+    $this->drupalPostForm(NULL, $edit, 'Next');
+    $this->assertText('Name field value: value changed by form_set_value() in form next button #validate', 'Form element value in $form_state was altered by next submit button.');
+    $this->assertText('The form_test_two_submit_buttons_multiple_handlers form next button submit handler was executed', 'Form Next button submit handler is executed');
+    $this->assertText('Default Submit handler is also executed when next button is clicked', 'Form default submit handler is executed');
+  }
 }
diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module
index 0e8bdb9..88a155e 100644
--- a/core/modules/system/tests/modules/form_test/form_test.module
+++ b/core/modules/system/tests/modules/form_test/form_test.module
@@ -2178,3 +2178,65 @@ function form_test_form_state_database_submit($form, &$form_state) {
     $form_state['storage']['database_connection_found'] = TRUE;
   }
 }
+
+function form_test_two_submit_buttons_multiple_handlers($form, &$form_state) {
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Name',
+    '#value' => 'name field value',
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Save',
+  );
+
+  $form['next'] = array(
+    '#type' => 'submit',
+    '#value' => 'Next',
+    '#validate' => array('form_multisubmit_next_validate'),
+    '#submit' => array('form_multisubmit_next_submit'),
+  );
+  return $form;
+}
+
+function form_test_two_submit_buttons_multiple_handlers_validate(&$form, &$form_state) {
+  // Alter the form element.
+  $form['name']['#value'] = '#value changed by form default #validate';
+  // Alter the submitted value in $form_state.
+  form_set_value($form['name'], 'value changed by form_set_value() in form default #validate', $form_state);
+  // Output the element's value from $form_state.
+  drupal_set_message(t('@label field value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state['values']['name'])));
+  if ($form_state['input']['name'] == 'validate_handler') {
+    // Trigger a form validation error to see our changes.
+    form_set_error('', $form_state);
+  }
+  if ($form_state['input']['name'] == 'nextvalidate_handler') {
+    drupal_set_message('Default Validation handler is also executed when next button is clicked');
+  }
+}
+
+function form_test_two_submit_buttons_multiple_handlers_submit(&$form, &$form_state) {
+  drupal_set_message('The form_test_two_submit_buttons_multiple_handlers form default handler was executed successfully.');
+  if ($form_state['input']['name'] == 'nextsubmit_handler') {
+    drupal_set_message('Default Submit handler is also executed when next button is clicked');
+  }
+}
+
+function form_multisubmit_next_validate(&$form, &$form_state) {
+  // Alter the form element.
+  $form['name']['#value'] = '#value changed by next button #validate';
+  // Alter the submitted value in $form_state.
+  form_set_value($form['name'], 'value changed by form_set_value() in form next button #validate', $form_state);
+  // Output the element's value from $form_state.
+  drupal_set_message(t('@label field value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state['values']['name'])));
+
+  if ($form_state['input']['name'] == 'nextvalidate_handler') {
+    // Trigger a form validation error to see our changes.
+    form_set_error('name', $form_state);
+  }
+}
+
+function form_multisubmit_next_submit(&$form, &$form_state) {
+  drupal_set_message('The form_test_two_submit_buttons_multiple_handlers form next button submit handler was executed');
+}
diff --git a/core/modules/system/tests/modules/form_test/form_test.routing.yml b/core/modules/system/tests/modules/form_test/form_test.routing.yml
index 3540177..dce12a0 100644
--- a/core/modules/system/tests/modules/form_test/form_test.routing.yml
+++ b/core/modules/system/tests/modules/form_test/form_test.routing.yml
@@ -424,3 +424,10 @@ form_test.two_instances:
   requirements:
     _module_dependencies: 'node'
     _permission: 'create page content'
+
+form_test.two_submit_buttons:
+  path: '/form-test/two-submit-buttons'
+  defaults:
+    _content: '\Drupal\form_test\Form\FormTestForm::twoSubmitButtons'
+  requirements:
+    _access: 'TRUE'
\ No newline at end of file
diff --git a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Form/FormTestForm.php b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Form/FormTestForm.php
index 7b13932..c5518cd 100644
--- a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Form/FormTestForm.php
+++ b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Form/FormTestForm.php
@@ -399,4 +399,8 @@ public function testFormStateDatabase() {
     return drupal_get_form('form_test_form_state_database');
   }
 
+  public function twoSubmitButtons() {
+    return drupal_get_form('form_test_two_submit_buttons_multiple_handlers');
+  }
+
 }
