diff --git a/core/core.services.yml b/core/core.services.yml
index 0f4d586..5b588c7 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -161,7 +161,7 @@ services:
     arguments: [default]
   form_builder:
     class: Drupal\Core\Form\FormBuilder
-    arguments: ['@form_validator', '@form_submitter', '@form_cache', '@module_handler', '@event_dispatcher', '@request_stack', '@class_resolver', '@theme.manager', '@?csrf_token', '@?http_kernel']
+    arguments: ['@form_validator', '@form_submitter', '@form_cache', '@module_handler', '@event_dispatcher', '@request_stack', '@class_resolver', '@theme.manager', '@?csrf_token']
   form_validator:
     class: Drupal\Core\Form\FormValidator
     arguments: ['@request_stack', '@string_translation', '@csrf_token', '@logger.channel.form']
@@ -787,6 +787,10 @@ services:
     class: Drupal\Core\EventSubscriber\ExceptionTestSiteSubscriber
     tags:
       - { name: event_subscriber }
+  exception.response:
+    class: Drupal\Core\EventSubscriber\ExceptionResponseSubscriber
+    tags:
+      - { name: event_subscriber }
   route_processor_manager:
     class: Drupal\Core\RouteProcessor\RouteProcessorManager
     tags:
diff --git a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php
index 0df6a30..537c93c 100644
--- a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\EventSubscriber;
 
+use Drupal\Core\HttpKernel\HttpResponseException;
 use Drupal\Core\Page\HtmlFragment;
 use Drupal\Core\Page\HtmlFragmentRendererInterface;
 use Drupal\Core\Page\HtmlPageRendererInterface;
@@ -114,7 +115,12 @@ protected function createResponse($title, $body, $response_code) {
     $fragment = new HtmlFragment($body);
     $fragment->setTitle($title);
 
-    $page = $this->fragmentRenderer->render($fragment, $response_code);
+    try {
+      $page = $this->fragmentRenderer->render($fragment, $response_code);
+    }
+    catch (HttpResponseException $e) {
+      return $e->getResponse();
+    }
     return new Response($this->htmlPageRenderer->render($page), $page->getStatusCode());
   }
 
diff --git a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionSubscriber.php
index e35eff4..ba53cb3 100644
--- a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionSubscriber.php
@@ -11,6 +11,7 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\ContentNegotiation;
+use Drupal\Core\HttpKernel\HttpResponseException;
 use Drupal\Core\Page\DefaultHtmlPageRenderer;
 use Drupal\Core\Page\HtmlFragment;
 use Drupal\Core\Page\HtmlFragmentRendererInterface;
@@ -201,7 +202,12 @@ protected function createHtmlResponse($title, $body, $response_code) {
     $fragment = new HtmlFragment($body);
     $fragment->setTitle($title);
 
-    $page = $this->fragmentRenderer->render($fragment, $response_code);
+    try {
+      $page = $this->fragmentRenderer->render($fragment, $response_code);
+    }
+    catch (HttpResponseException $e) {
+      return $e->getResponse();
+    }
     return new Response($this->htmlPageRenderer->render($page), $page->getStatusCode());
   }
 
diff --git a/core/lib/Drupal/Core/EventSubscriber/ExceptionResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ExceptionResponseSubscriber.php
new file mode 100644
index 0000000..9a4e65e
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/ExceptionResponseSubscriber.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\EventSubscriber\ExceptionResponseSubscriber.
+ */
+
+namespace Drupal\Core\EventSubscriber;
+
+use Drupal\Core\HttpKernel\HttpResponseException;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+class ExceptionResponseSubscriber implements EventSubscriberInterface {
+
+  /**
+   * Sets a redirect response in case somehow throwed special response exception.
+   */
+  public function onKernelException(GetResponseForExceptionEvent $event) {
+    if (($exception = $event->getException()) && $exception instanceof HttpResponseException) {
+      // Setting the response stops the event propagation.
+      $event->setResponse($exception->getResponse());
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[KernelEvents::EXCEPTION] = array('onKernelException', 128);
+
+    return $events;
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index 6fb6467..f104f39 100644
--- a/core/lib/Drupal/Core/Form/FormBuilder.php
+++ b/core/lib/Drupal/Core/Form/FormBuilder.php
@@ -15,6 +15,7 @@
 use Drupal\Core\Access\CsrfTokenGenerator;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\HttpKernel\HttpResponseException;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Site\Settings;
 use Drupal\Core\Theme\ThemeManagerInterface;
@@ -61,13 +62,6 @@ class FormBuilder implements FormBuilderInterface, FormValidatorInterface, FormS
   protected $csrfToken;
 
   /**
-   * The HTTP kernel to handle forms returning response objects.
-   *
-   * @var \Symfony\Component\HttpKernel\HttpKernel
-   */
-  protected $httpKernel;
-
-  /**
    * The class resolver.
    *
    * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
@@ -126,10 +120,8 @@ class FormBuilder implements FormBuilderInterface, FormValidatorInterface, FormS
    *   The theme manager.
    * @param \Drupal\Core\Access\CsrfTokenGenerator $csrf_token
    *   The CSRF token generator.
-   * @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel
-   *   The HTTP kernel.
    */
-  public function __construct(FormValidatorInterface $form_validator, FormSubmitterInterface $form_submitter, FormCacheInterface $form_cache, ModuleHandlerInterface $module_handler, EventDispatcherInterface $event_dispatcher, RequestStack $request_stack, ClassResolverInterface $class_resolver, ThemeManagerInterface $theme_manager, CsrfTokenGenerator $csrf_token = NULL, HttpKernelInterface $http_kernel = NULL) {
+  public function __construct(FormValidatorInterface $form_validator, FormSubmitterInterface $form_submitter, FormCacheInterface $form_cache, ModuleHandlerInterface $module_handler, EventDispatcherInterface $event_dispatcher, RequestStack $request_stack, ClassResolverInterface $class_resolver, ThemeManagerInterface $theme_manager, CsrfTokenGenerator $csrf_token = NULL) {
     $this->formValidator = $form_validator;
     $this->formSubmitter = $form_submitter;
     $this->formCache = $form_cache;
@@ -138,7 +130,6 @@ public function __construct(FormValidatorInterface $form_validator, FormSubmitte
     $this->requestStack = $request_stack;
     $this->classResolver = $class_resolver;
     $this->csrfToken = $csrf_token;
-    $this->httpKernel = $http_kernel;
     $this->themeManager = $theme_manager;
   }
 
@@ -263,7 +254,6 @@ public function buildForm($form_id, FormStateInterface &$form_state) {
     // If the form returns some kind of response, deliver it.
     if ($response instanceof Response) {
       $this->sendResponse($response);
-      exit;
     }
 
     // If this was a successful submission of a single-step form or the last step
@@ -406,7 +396,6 @@ public function retrieveForm($form_id, FormStateInterface &$form_state) {
     // If the form returns some kind of response, deliver it.
     if ($form instanceof Response) {
       $this->sendResponse($form);
-      exit;
     }
     $form['#form_id'] = $form_id;
 
@@ -1072,17 +1061,11 @@ protected function buttonWasClicked($element, FormStateInterface &$form_state) {
    *
    * @param \Symfony\Component\HttpFoundation\Response $response
    *   A response object.
+   * @throws \Drupal\Core\HttpKernel\HttpResponseException
+   *
    */
   protected function sendResponse(Response $response) {
-    $request = $this->requestStack->getCurrentRequest();
-    $event = new FilterResponseEvent($this->httpKernel, $request, HttpKernelInterface::MASTER_REQUEST, $response);
-
-    $this->eventDispatcher->dispatch(KernelEvents::RESPONSE, $event);
-    // Prepare and send the response.
-    $event->getResponse()
-      ->prepare($request)
-      ->send();
-    $this->httpKernel->terminate($request, $response);
+    throw new HttpResponseException($response);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/HttpKernel/HttpResponseException.php b/core/lib/Drupal/Core/HttpKernel/HttpResponseException.php
new file mode 100644
index 0000000..8b0ad6d
--- /dev/null
+++ b/core/lib/Drupal/Core/HttpKernel/HttpResponseException.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\HttpKernel\HttpResponseException.
+ */
+
+namespace Drupal\Core\HttpKernel;
+
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Custom exception to break out of the main request and just do a redirect.
+ */
+class HttpResponseException extends \Exception {
+
+  /**
+   * The redirect response.
+   *
+   * @var \Symfony\Component\HttpFoundation\Response
+   */
+  protected $response;
+
+  public function __construct(Response $response, $message = "", $code = 0, \Exception $previous = NULL) {
+    parent::__construct($message, $code, $previous);
+
+    $this->response = $response;
+  }
+
+  /**
+   * Get the redirect response.
+   */
+  public function getResponse() {
+    return $this->response;
+  }
+
+}
+
diff --git a/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php b/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php
index 9e36fcc..cd59a0d 100644
--- a/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php
+++ b/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Form\FormInterface;
 use Drupal\Core\Form\FormState;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\HttpKernel\HttpResponseException;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -115,9 +116,6 @@ public function testHandleFormStateResponse($class, $form_state_key) {
     $response = $this->getMockBuilder($class)
       ->disableOriginalConstructor()
       ->getMock();
-    $response->expects($this->any())
-      ->method('prepare')
-      ->will($this->returnValue($response));
 
     $form_arg = $this->getMockForm($form_id, $expected_form);
     $form_arg->expects($this->any())
@@ -133,8 +131,8 @@ public function testHandleFormStateResponse($class, $form_state_key) {
       $this->simulateFormSubmission($form_id, $form_arg, $form_state, FALSE);
       $this->fail('TestFormBuilder::sendResponse() was not triggered.');
     }
-    catch (\Exception $e) {
-      $this->assertSame('exit', $e->getMessage());
+    catch (HttpResponseException $e) {
+      $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $e->getResponse());
     }
     $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $form_state->getResponse());
   }
@@ -160,16 +158,11 @@ public function testHandleRedirectWithResponse() {
     $response = $this->getMockBuilder('Symfony\Component\HttpFoundation\Response')
       ->disableOriginalConstructor()
       ->getMock();
-    $response->expects($this->once())
-      ->method('prepare')
-      ->will($this->returnValue($response));
 
     // Set up a redirect that will not be called.
     $redirect = $this->getMockBuilder('Symfony\Component\HttpFoundation\RedirectResponse')
       ->disableOriginalConstructor()
       ->getMock();
-    $redirect->expects($this->never())
-      ->method('prepare');
 
     $form_arg = $this->getMockForm($form_id, $expected_form);
     $form_arg->expects($this->any())
@@ -187,8 +180,8 @@ public function testHandleRedirectWithResponse() {
       $this->simulateFormSubmission($form_id, $form_arg, $form_state, FALSE);
       $this->fail('TestFormBuilder::sendResponse() was not triggered.');
     }
-    catch (\Exception $e) {
-      $this->assertSame('exit', $e->getMessage());
+    catch (HttpResponseException $e) {
+      $this->assertSame($response, $e->getResponse());
     }
     $this->assertSame($response, $form_state->getResponse());
   }
@@ -370,9 +363,6 @@ public function testSendResponse() {
     $expected_form = $this->getMockBuilder('Symfony\Component\HttpFoundation\Response')
       ->disableOriginalConstructor()
       ->getMock();
-    $expected_form->expects($this->once())
-      ->method('prepare')
-      ->will($this->returnValue($expected_form));
 
     $form_arg = $this->getMockForm($form_id, $expected_form);
 
