diff --git a/core/core.services.yml b/core/core.services.yml
index afccb31..4b6ff46 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -626,10 +626,18 @@ services:
   menu_link.static.overrides:
     class: Drupal\Core\Menu\StaticMenuLinkOverrides
     arguments: ['@config.factory']
+
+  # Symfony HttpKernel normally manages the request stack, but Drupal needs it
+  # before Symfony HttpKernel is called. Hence there are two, 'request_stack'
+  # is managed by Drupal and 'symfony_request_stack' is managed by Symfony.
   request_stack:
     class: Symfony\Component\HttpFoundation\RequestStack
     tags:
       - { name: persist }
+  symfony_request_stack:
+    class: Symfony\Component\HttpFoundation\RequestStack
+    tags:
+      - { name: persist }
   current_route_match:
      class: Drupal\Core\Routing\CurrentRouteMatch
      arguments: ['@request_stack']
@@ -668,7 +676,16 @@ services:
     class: Stack\StackedHttpKernel
   http_kernel.basic:
     class: Symfony\Component\HttpKernel\HttpKernel
-    arguments: ['@event_dispatcher', '@controller_resolver', '@request_stack']
+    arguments: ['@event_dispatcher', '@controller_resolver', '@symfony_request_stack']
+
+  # RequestStackMiddleware manages the Drupal request stack. It must have the
+  # highest priority so that the current request is pushed / popped from the
+  # request stack before / after any other Middleware runs
+  http_middleware.request_stack:
+    class: Drupal\Core\StackMiddleware\RequestStackMiddleware
+    arguments: ['@request_stack']
+    tags:
+      - { name: http_middleware, priority: 1000 }
   http_middleware.negotiation:
     class: Drupal\Core\StackMiddleware\NegotiationMiddleware
     tags:
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 7b66911..9c684b0 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -452,6 +452,8 @@ function install_begin_request($class_loader, &$install_state) {
     $module_handler->addProfile($profile, $install_state['profiles'][$profile]->getPath());
   }
 
+  // Initialize the request stack
+  $container->get('request_stack')->push($request);
   // Load all modules and perform request related initialization.
   $kernel->preHandle($request);
 
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index 1fa3474..ff32cc9 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -534,9 +534,6 @@ public function preHandle(Request $request) {
     // Initialize legacy request globals.
     $this->initializeRequestGlobals($request);
 
-    // Put the request on the stack.
-    $this->container->get('request_stack')->push($request);
-
     // Set the allowed protocols.
     UrlHelper::setAllowedProtocols($this->container->getParameter('filter_protocols'));
 
diff --git a/core/lib/Drupal/Core/StackMiddleware/RequestStackMiddleware.php b/core/lib/Drupal/Core/StackMiddleware/RequestStackMiddleware.php
new file mode 100644
index 0000000..0b247d9
--- /dev/null
+++ b/core/lib/Drupal/Core/StackMiddleware/RequestStackMiddleware.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\StackMiddleware\RequestStackPush.
+ */
+
+namespace Drupal\Core\StackMiddleware;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+class RequestStackMiddleware implements HttpKernelInterface {
+
+  /**
+   * The wrapped HTTP kernel.
+   *
+   * @var \Symfony\Component\HttpKernel\HttpKernelInterface
+   */
+  protected $httpKernel;
+
+  /**
+   * The request stack.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Creates a new RequestStackPush instance.
+   *
+   * @param \Symfony\Component\HttpKernel\HttpKernelInterface $app
+   *   The wrapped HTTP kernel.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack.
+   */
+  public function __construct(HttpKernelInterface $http_kernel, RequestStack $request_stack) {
+    $this->httpKernel = $http_kernel;
+    $this->requestStack = $request_stack;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
+    $this->requestStack->push($request);
+    $result = $this->httpKernel->handle($request, $type, $catch);
+    $this->requestStack->pop();
+
+    return $result;
+  }
+
+
+}
\ No newline at end of file
diff --git a/core/tests/Drupal/KernelTests/Core/HttpKernel/RequestStackKernelTest.php b/core/tests/Drupal/KernelTests/Core/HttpKernel/RequestStackKernelTest.php
new file mode 100644
index 0000000..b233d34
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/HttpKernel/RequestStackKernelTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\KernelTests\Core\HttpKernel\RequestStackKernelTest.
+ */
+
+namespace Drupal\KernelTests\Core\HttpKernel;
+
+use Drupal\KernelTests\KernelTestBase;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Tests the usage of the request stack as part of request processing.
+ *
+ * @group http_kernel
+ */
+class RequestStackKernelTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system'];
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', 'router');
+    \Drupal::service('router.builder')->rebuild();
+  }
+
+  public function testRequest() {
+    /** @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */
+    $request_stack = \Drupal::service('request_stack');
+
+    /** @var \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel */
+    $http_kernel = \Drupal::service('http_kernel');
+
+    $request = Request::create('/');
+    $http_kernel->handle($request);
+
+    $this->assertNull($request_stack->getCurrentRequest());
+    $this->assertNull($request_stack->getMasterRequest());
+  }
+
+
+
+}
