diff --git a/core/core.services.yml b/core/core.services.yml
index 5877a38..666db04 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -637,10 +637,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']
@@ -679,7 +687,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 1b3b255..8f78b24 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -457,6 +457,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 1a3b943..75fa6c1 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -525,9 +525,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'));
 
@@ -603,7 +600,9 @@ public function terminate(Request $request, Response $response) {
     }
 
     if ($this->getHttpKernel() instanceof TerminableInterface) {
+      $this->container->get('request_stack')->push($request);
       $this->getHttpKernel()->terminate($request, $response);
+      $this->container->get('request_stack')->pop();
     }
   }
 
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..9d2ce7c
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/HttpKernel/RequestStackKernelTest.php
@@ -0,0 +1,53 @@
+<?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');
+
+    /** @var \Drupal\Core\StackMiddleware\RequestStackMiddleware $request_stack_middleware */
+    $request_stack_middleware = \Drupal::service('http_middleware.request_stack');
+
+    $request = Request::create('/');
+    //$http_kernel->handle($request);
+    // Need to let RequestStackMiddleware handle the request to push/pop correctly
+    $request_stack_middleware->handle($request);
+
+    $this->assertNull($request_stack->getCurrentRequest());
+    $this->assertNull($request_stack->getMasterRequest());
+  }
+
+
+
+}
