diff --git a/core/modules/views/src/Plugin/views/exposed_form/ExposedFormPluginBase.php b/core/modules/views/src/Plugin/views/exposed_form/ExposedFormPluginBase.php
index 33267b2..1b2e5b8 100644
--- a/core/modules/views/src/Plugin/views/exposed_form/ExposedFormPluginBase.php
+++ b/core/modules/views/src/Plugin/views/exposed_form/ExposedFormPluginBase.php
@@ -126,10 +126,12 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    * also assign data to the appropriate handlers for use in building the
    * query.
    */
-  public function renderExposedForm($block = FALSE) {
+  public function renderExposedForm($block = FALSE, FormStateInterface $form_state = NULL) {
+    if (!isset($form_state)) {
+      $form_state = new FormState();
+    }
     // Deal with any exposed filters we may have, before building.
-    $form_state = (new FormState())
-      ->setStorage([
+    $form_state->setStorage([
         'view' => $this->view,
         'display' => &$this->view->display_handler->display,
         'rerender' => TRUE,
diff --git a/core/modules/views/src/Tests/Plugin/ExposedFormTest.php b/core/modules/views/src/Tests/Plugin/ExposedFormTest.php
index 3634e23..38483b9 100644
--- a/core/modules/views/src/Tests/Plugin/ExposedFormTest.php
+++ b/core/modules/views/src/Tests/Plugin/ExposedFormTest.php
@@ -40,6 +40,8 @@ class ExposedFormTest extends ViewTestBase {
   protected function setUp() {
     parent::setUp();
 
+    $this->enableViewsTestModule();
+
     $this->drupalCreateContentType(array('type' => 'article'));
 
     // Create some random nodes.
@@ -357,4 +359,24 @@ protected function getExpectedExposedFormId(ViewExecutable $view) {
     return Html::cleanCssIdentifier('views-exposed-form-' . $view->storage->id() . '-' . $view->current_display);
   }
 
+  /**
+   * Tests a view which is rendered after a form with a validation error.
+   */
+  public function testFormErrorWithExposedForm() {
+    $this->drupalGet('views_test_data_error_form_page');
+    $this->assertResponse(200);
+    $form = $this->cssSelect('form.views-exposed-form');
+    $this->assertTrue($form, 'The exposed form element was found.');
+    $this->assertRaw(t('Apply'), 'Ensure the exposed form is rendered before submitting the normal form.');
+    $this->assertRaw('<div class="views-row">', 'Views result shown.');
+
+    $this->drupalPostForm(NULL, array(), t('Submit'));
+    $this->assertResponse(200);
+    $form = $this->cssSelect('form.views-exposed-form');
+    $this->assertTrue($form, 'The exposed form element was found.');
+    $this->assertRaw(t('Apply'), 'Ensure the exposed form is rendered after submitting the normal form.');
+    $this->assertRaw('<div class="views-row">', 'Views result shown.');
+
+  }
+
 }
diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index a9648d9..db6e470 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -1158,6 +1158,7 @@ public function initQuery() {
    *   display fails or NULL if the view has been built already.
    */
   public function build($display_id = NULL) {
+
     if (!empty($this->built)) {
       return;
     }
@@ -1198,8 +1199,9 @@ public function build($display_id = NULL) {
 
     if ($this->display_handler->usesExposed()) {
       $exposed_form = $this->display_handler->getPlugin('exposed_form');
-      $this->exposed_widgets = $exposed_form->renderExposedForm();
-      if (FormState::hasAnyErrors() || !empty($this->build_info['abort'])) {
+      $form_state = new FormState();
+      $this->exposed_widgets = $exposed_form->renderExposedForm(FALSE, $form_state);
+      if ($form_state->getErrors() || !empty($this->build_info['abort'])) {
         $this->built = TRUE;
         // Don't execute the query, $form_state, but rendering will still be executed to display the empty text.
         $this->executed = TRUE;
diff --git a/core/modules/views/tests/modules/views_test_data/src/Controller/ViewsTestDataController.php b/core/modules/views/tests/modules/views_test_data/src/Controller/ViewsTestDataController.php
new file mode 100644
index 0000000..08ccb98
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_data/src/Controller/ViewsTestDataController.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_test_data\Controller\ViewsTestDataController.
+ */
+
+namespace Drupal\views_test_data\Controller;
+
+/**
+ * Controller class for views_test_data callbacks.
+ */
+class ViewsTestDataController {
+
+  /**
+   * Renders an error form page.
+   *
+   * This contains a form that will contain an error and an embedded view with
+   * an exposed form.
+   */
+  public function errorFormPage() {
+    $build = array();
+    $build['view'] = array(
+      '#type' => 'view',
+      '#name' => 'test_exposed_form_buttons',
+    );
+    $build['error_form'] = \Drupal::formBuilder()->getForm('Drupal\views_test_data\Form\ViewsTestDataErrorForm');
+
+    return $build;
+  }
+
+}
diff --git a/core/modules/views/tests/modules/views_test_data/src/Form/ViewsTestDataErrorForm.php b/core/modules/views/tests/modules/views_test_data/src/Form/ViewsTestDataErrorForm.php
new file mode 100644
index 0000000..cac108f
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_data/src/Form/ViewsTestDataErrorForm.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_test_data\Form\ViewsTestDataErrorForm.
+ */
+
+namespace Drupal\views_test_data\Form;
+
+use Drupal\Core\Form\FormInterface;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Simple form page callback to test the view element.
+ */
+class ViewsTestDataErrorForm implements FormInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'views_test_data_error_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form['text'] = array(
+      '#type' => 'textfield',
+    );
+    $form['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Submit'),
+    );
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    $form_state->setErrorByName('text', t('Form validation error'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+  }
+
+}
diff --git a/core/modules/views/tests/modules/views_test_data/views_test_data.routing.yml b/core/modules/views/tests/modules/views_test_data/views_test_data.routing.yml
index cb0ad63..1bf63f4 100644
--- a/core/modules/views/tests/modules/views_test_data/views_test_data.routing.yml
+++ b/core/modules/views/tests/modules/views_test_data/views_test_data.routing.yml
@@ -19,3 +19,11 @@ views_test_data.form_multiple:
     _controller: '\Drupal\views_test_data\Controller\ViewsTestFormMultipleController::testPage'
   requirements:
     _access: 'TRUE'
+
+views_test_data.error_form_page:
+  path: '/views_test_data_error_form_page'
+  defaults:
+    _title: 'Test Views Form Exposed Errors'
+    _controller: '\Drupal\views_test_data\Controller\ViewsTestDataController::errorFormPage'
+  requirements:
+    _access: 'TRUE'
