diff --git a/core/modules/system/src/Tests/Form/ResponseTest.php b/core/modules/system/src/Tests/Form/ResponseTest.php
new file mode 100644
index 0000000..851c123
--- /dev/null
+++ b/core/modules/system/src/Tests/Form/ResponseTest.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Form\ResponseTest.
+ */
+
+namespace Drupal\system\Tests\Form;
+
+use Drupal\Component\Serialization\Json;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the form API Response element.
+ *
+ * @group Form
+ */
+class ResponseTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('form_test');
+
+  /**
+   * Tests that enforced responses propagate through subscribers and middleware.
+   */
+  public function testFormResponse() {
+    $edit = [
+      'content' => $this->randomString(),
+      'status' => 200,
+    ];
+    $content = Json::decode($this->drupalPostForm('form-test/response', $edit, 'Submit'));
+    $this->assertResponse(200);
+    $this->assertIdentical($edit['content'], $content, 'Response content matches');
+    $this->assertIdentical('invoked', $this->drupalGetHeader('X-Form-Test-Response-Event'), 'Response handled by kernel response subscriber');
+    $this->assertIdentical('invoked', $this->drupalGetHeader('X-Form-Test-Stack-Middleware'), 'Response handled by kernel middleware');
+
+    $edit = [
+      'content' => $this->randomString(),
+      'status' => 418,
+    ];
+    $content = Json::decode($this->drupalPostForm('form-test/response', $edit, 'Submit'));
+    $this->assertResponse(418);
+    $this->assertIdentical($edit['content'], $content, 'Response content matches');
+    $this->assertIdentical('invoked', $this->drupalGetHeader('X-Form-Test-Response-Event'), 'Response handled by kernel response subscriber');
+    $this->assertIdentical('invoked', $this->drupalGetHeader('X-Form-Test-Stack-Middleware'), 'Response handled by kernel middleware');
+  }
+
+}
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 bebb71c..49a7c94 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
@@ -294,6 +294,14 @@ form_test.url:
   requirements:
     _access: 'TRUE'
 
+form_test.response:
+  path: '/form-test/response'
+  defaults:
+    _form: '\Drupal\form_test\Form\FormTestResponseForm'
+    _title: 'Response'
+  requirements:
+    _access: 'TRUE'
+
 form_test.disabled_elements:
   path: '/form-test/disabled-elements'
   defaults:
diff --git a/core/modules/system/tests/modules/form_test/form_test.services.yml b/core/modules/system/tests/modules/form_test/form_test.services.yml
index 0201650..472e0bc 100644
--- a/core/modules/system/tests/modules/form_test/form_test.services.yml
+++ b/core/modules/system/tests/modules/form_test/form_test.services.yml
@@ -5,3 +5,7 @@ services:
     class: Drupal\form_test\EventSubscriber\FormTestEventSubscriber
     tags:
       - { name: event_subscriber }
+  form_test.http_middleware:
+    class: Drupal\form_test\StackMiddleware\FormTestMiddleware
+    tags:
+      - { name: http_middleware, priority: 0 }
diff --git a/core/modules/system/tests/modules/form_test/src/EventSubscriber/FormTestEventSubscriber.php b/core/modules/system/tests/modules/form_test/src/EventSubscriber/FormTestEventSubscriber.php
index d560f18..4e891db 100644
--- a/core/modules/system/tests/modules/form_test/src/EventSubscriber/FormTestEventSubscriber.php
+++ b/core/modules/system/tests/modules/form_test/src/EventSubscriber/FormTestEventSubscriber.php
@@ -8,6 +8,7 @@
 namespace Drupal\form_test\EventSubscriber;
 
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 use Symfony\Component\HttpKernel\KernelEvents;
 
@@ -29,10 +30,22 @@ public function onKernelRequest(GetResponseEvent $event) {
   }
 
   /**
+   * Adds custom headers to the response.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The kernel request event.
+   */
+  public function onKernelResponse(FilterResponseEvent $event) {
+    $response = $event->getResponse();
+    $response->headers->set('X-Form-Test-Response-Event', 'invoked');
+  }
+
+  /**
    * {@inheritdoc}
    */
   public static function getSubscribedEvents() {
     $events[KernelEvents::REQUEST][] = array('onKernelRequest');
+    $events[KernelEvents::RESPONSE][] = array('onKernelResponse');
     return $events;
   }
 
diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestResponseForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestResponseForm.php
new file mode 100644
index 0000000..deacf0b
--- /dev/null
+++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestResponseForm.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\form_test\Form\FormTestResponseForm.
+ */
+
+namespace Drupal\form_test\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
+
+/**
+ * Form constructor for testing #type 'url' elements.
+ */
+class FormTestResponseForm extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'form_test_response';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form['content'] = array(
+      '#type' => 'textfield',
+      '#title' => 'Content',
+    );
+    $form['status'] = array(
+      '#type' => 'textfield',
+      '#title' => 'Status',
+      '#default_value' => 200,
+    );
+    $form['submit'] = array(
+      '#type' => 'submit',
+      '#value' => 'Submit',
+    );
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $values = $form_state->getValues();
+    $form_state->setResponse(new JsonResponse($values['content'], (int) $values['status']));
+  }
+
+}
diff --git a/core/modules/system/tests/modules/form_test/src/StackMiddleware/FormTestMiddleware.php b/core/modules/system/tests/modules/form_test/src/StackMiddleware/FormTestMiddleware.php
new file mode 100644
index 0000000..7c632cb
--- /dev/null
+++ b/core/modules/system/tests/modules/form_test/src/StackMiddleware/FormTestMiddleware.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\form_test\StackMiddleware\FormTestMiddleware
+ */
+
+namespace Drupal\form_test\StackMiddleware;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Provides a test middleware which sets a custom response header.
+ */
+class FormTestMiddleware implements HttpKernelInterface {
+
+  /**
+   * The decorated kernel.
+   *
+   * @var \Symfony\Component\HttpKernel\HttpKernelInterface
+   */
+  protected $httpKernel;
+
+  /**
+   * Constructs a FormTestMiddleware object.
+   *
+   * @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel
+   *   The decorated kernel.
+   */
+  public function __construct(HttpKernelInterface $http_kernel) {
+    $this->httpKernel = $http_kernel;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
+    $response = $this->httpKernel->handle($request, $type, $catch);
+    $response->headers->set('X-Form-Test-Stack-Middleware', 'invoked');
+    return $response;
+  }
+
+}
