diff --git a/core/core.services.yml b/core/core.services.yml
index 92cb63c329c40c0093053c97615132861b3eb28a..18fca23e6cc01716b60acdbcc7897f849c6e7f46 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -222,10 +222,10 @@ services:
     arguments: ['@container.namespaces']
   plugin.manager.menu.local_action:
     class: Drupal\Core\Menu\LocalActionManager
-    arguments: ['@controller_resolver', '@request', '@router.route_provider', '@module_handler', '@cache.discovery', '@language_manager', '@access_manager', '@current_user']
+    arguments: ['@controller_resolver', '@request_stack', '@router.route_provider', '@module_handler', '@cache.discovery', '@language_manager', '@access_manager', '@current_user']
   plugin.manager.menu.local_task:
     class: Drupal\Core\Menu\LocalTaskManager
-    arguments: ['@controller_resolver', '@request', '@router.route_provider', '@router.builder', '@module_handler', '@cache.discovery', '@language_manager', '@access_manager', '@current_user']
+    arguments: ['@controller_resolver', '@request_stack', '@router.route_provider', '@router.builder', '@module_handler', '@cache.discovery', '@language_manager', '@access_manager', '@current_user']
   plugin.manager.menu.contextual_link:
     class: Drupal\Core\Menu\ContextualLinkManager
     arguments: ['@controller_resolver', '@module_handler', '@cache.discovery', '@language_manager', '@access_manager', '@current_user', '@request_stack']
diff --git a/core/lib/Drupal/Core/Menu/LocalActionManager.php b/core/lib/Drupal/Core/Menu/LocalActionManager.php
index 457af4f917c0e1af198d69fe88b7c7f6b3ce509a..980968080c85e86962ff39dac381892a2ca8b263 100644
--- a/core/lib/Drupal/Core/Menu/LocalActionManager.php
+++ b/core/lib/Drupal/Core/Menu/LocalActionManager.php
@@ -19,7 +19,7 @@
 use Drupal\Core\Plugin\Discovery\YamlDiscovery;
 use Drupal\Core\Plugin\Factory\ContainerFactory;
 use Drupal\Core\Routing\RouteProviderInterface;
-use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
 use Drupal\Core\Session\AccountInterface;
 
@@ -65,11 +65,11 @@ class LocalActionManager extends DefaultPluginManager {
   protected $controllerResolver;
 
   /**
-   * A request object.
+   * The request stack.
    *
-   * @var \Symfony\Component\HttpFoundation\Request
+   * @var \Symfony\Component\HttpFoundation\RequestStack
    */
-  protected $request;
+  protected $requestStack;
 
   /**
    * The route provider to load routes by name.
@@ -92,7 +92,7 @@ class LocalActionManager extends DefaultPluginManager {
    */
   protected $account;
 
-/**
+  /**
    * The plugin instances.
    *
    * @var \Drupal\Core\Menu\LocalActionInterface[]
@@ -104,9 +104,8 @@ class LocalActionManager extends DefaultPluginManager {
    *
    * @param \Symfony\Component\HttpKernel\Controller\ControllerResolverInterface $controller_resolver
    *   An object to use in introspecting route methods.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object to use for building titles and paths for plugin
-   *   instances.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack.
    * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
    *   The route provider.
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
@@ -120,18 +119,18 @@ class LocalActionManager extends DefaultPluginManager {
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The current user.
    */
-  public function __construct(ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend, LanguageManagerInterface $language_manager, AccessManager $access_manager, AccountInterface $account) {
+  public function __construct(ControllerResolverInterface $controller_resolver, RequestStack $request_stack, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend, LanguageManagerInterface $language_manager, AccessManager $access_manager, AccountInterface $account) {
     // Skip calling the parent constructor, since that assumes annotation-based
     // discovery.
     $this->discovery = new YamlDiscovery('local_actions', $module_handler->getModuleDirectories());
     $this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery);
     $this->factory = new ContainerFactory($this);
+    $this->controllerResolver = $controller_resolver;
+    $this->requestStack = $request_stack;
     $this->routeProvider = $route_provider;
     $this->accessManager = $access_manager;
     $this->moduleHandler = $module_handler;
     $this->account = $account;
-    $this->controllerResolver = $controller_resolver;
-    $this->request = $request;
     $this->alterInfo('menu_local_actions');
     $this->setCacheBackend($cache_backend, $language_manager, 'local_action_plugins', array('local_action' => TRUE));
   }
@@ -150,7 +149,7 @@ public function __construct(ControllerResolverInterface $controller_resolver, Re
    */
   public function getTitle(LocalActionInterface $local_action) {
     $controller = array($local_action, 'getTitle');
-    $arguments = $this->controllerResolver->getArguments($this->request, $controller);
+    $arguments = $this->controllerResolver->getArguments($this->requestStack->getCurrentRequest(), $controller);
     return call_user_func_array($controller, $arguments);
   }
 
@@ -182,16 +181,17 @@ public function getActionsForRoute($route_appears) {
       }
     }
     $links = array();
+    $request = $this->requestStack->getCurrentRequest();
     foreach ($this->instances[$route_appears] as $plugin_id => $plugin) {
       $route_name = $plugin->getRouteName();
-      $route_parameters = $plugin->getRouteParameters($this->request);
+      $route_parameters = $plugin->getRouteParameters($request);
       $links[$plugin_id] = array(
         '#theme' => 'menu_local_action',
         '#link' => array(
           'title' => $this->getTitle($plugin),
           'route_name' => $route_name,
           'route_parameters' => $route_parameters,
-          'localized_options' => $plugin->getOptions($this->request),
+          'localized_options' => $plugin->getOptions($request),
         ),
         '#access' => $this->accessManager->checkNamedRoute($route_name, $route_parameters, $this->account),
         '#weight' => $plugin->getWeight(),
diff --git a/core/lib/Drupal/Core/Menu/LocalTaskManager.php b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
index 2b1e0e3009dd4aeeaa841e17903f90f458b73d9e..4aa6730c2f69e58e57ef36d54d099b912d6c3841 100644
--- a/core/lib/Drupal/Core/Menu/LocalTaskManager.php
+++ b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
@@ -21,7 +21,7 @@
 use Drupal\Core\Routing\RouteBuilderInterface;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\Session\AccountInterface;
-use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
 
 /**
  * Manages discovery and instantiation of menu local task plugins.
@@ -64,11 +64,11 @@ class LocalTaskManager extends DefaultPluginManager {
   protected $controllerResolver;
 
   /**
-   * A request object.
+   * The request stack.
    *
-   * @var \Symfony\Component\HttpFoundation\Request
+   * @var \Symfony\Component\HttpFoundation\RequestStack
    */
-  protected $request;
+  protected $requestStack;
 
   /**
    * The plugin instances.
@@ -110,7 +110,7 @@ class LocalTaskManager extends DefaultPluginManager {
    *
    * @param \Drupal\Core\Controller\ControllerResolverInterface $controller_resolver
    *   An object to use in introspecting route methods.
-   * @param \Symfony\Component\HttpFoundation\Request $request
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
    *   The request object to use for building titles and paths for plugin instances.
    * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
    *   The route provider to load routes by name.
@@ -127,12 +127,12 @@ class LocalTaskManager extends DefaultPluginManager {
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The current user.
    */
-  public function __construct(ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, RouteBuilderInterface $route_builder, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache, LanguageManager $language_manager, AccessManager $access_manager, AccountInterface $account) {
+  public function __construct(ControllerResolverInterface $controller_resolver, RequestStack $request_stack, RouteProviderInterface $route_provider, RouteBuilderInterface $route_builder, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache, LanguageManager $language_manager, AccessManager $access_manager, AccountInterface $account) {
     $this->discovery = new YamlDiscovery('local_tasks', $module_handler->getModuleDirectories());
     $this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery);
     $this->factory = new ContainerFactory($this);
     $this->controllerResolver = $controller_resolver;
-    $this->request = $request;
+    $this->requestStack = $request_stack;
     $this->routeProvider = $route_provider;
     $this->routeBuilder = $route_builder;
     $this->accessManager = $access_manager;
@@ -164,7 +164,8 @@ public function processDefinition(&$definition, $plugin_id) {
    */
   public function getTitle(LocalTaskInterface $local_task) {
     $controller = array($local_task, 'getTitle');
-    $arguments = $this->controllerResolver->getArguments($this->request, $controller);
+    $request = $this->requestStack->getCurrentRequest();
+    $arguments = $this->controllerResolver->getArguments($request, $controller);
     return call_user_func_array($controller, $arguments);
   }
 
@@ -312,10 +313,11 @@ public function getTasksBuild($current_route_name) {
     // of SQL queries that would otherwise be triggered by the access manager.
     $routes = $route_names ? $this->routeProvider->getRoutesByNames($route_names) : array();
 
+    $request = $this->requestStack->getCurrentRequest();
     foreach ($tree as $level => $instances) {
       foreach ($instances as $plugin_id => $child) {
         $route_name = $child->getRouteName();
-        $route_parameters = $child->getRouteParameters($this->request);
+        $route_parameters = $child->getRouteParameters($request);
 
         // Find out whether the user has access to the task.
         $access = $this->accessManager->checkNamedRoute($route_name, $route_parameters, $this->account);
@@ -331,7 +333,7 @@ public function getTasksBuild($current_route_name) {
             'title' => $this->getTitle($child),
             'route_name' => $route_name,
             'route_parameters' => $route_parameters,
-            'localized_options' => $child->getOptions($this->request),
+            'localized_options' => $child->getOptions($request),
           );
           $build[$level][$plugin_id] = array(
             '#theme' => 'menu_local_task',
@@ -363,13 +365,14 @@ protected function isRouteActive($current_route_name, $route_name, $route_parame
     // Flag the list element as active if this tab's route and parameters match
     // the current request's route and route variables.
     $active = $current_route_name == $route_name;
+    $request = $this->requestStack->getCurrentRequest();
     if ($active) {
       // The request is injected, so we need to verify that we have the expected
       // _raw_variables attribute.
-      $raw_variables_bag = $this->request->attributes->get('_raw_variables');
+      $raw_variables_bag = $request->attributes->get('_raw_variables');
       // If we don't have _raw_variables, we assume the attributes are still the
       // original values.
-      $raw_variables = $raw_variables_bag ? $raw_variables_bag->all() : $this->request->attributes->all();
+      $raw_variables = $raw_variables_bag ? $raw_variables_bag->all() : $request->attributes->all();
       $active = array_intersect_assoc($route_parameters, $raw_variables) == $route_parameters;
     }
     return $active;
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
index 9453d9ceb40a8161f09ac11521f2bc69bd6d9fb7..d1675675a4d87e6fcb175baa9baa877667ed0d9a 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
@@ -19,6 +19,7 @@
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
 
 /**
@@ -378,7 +379,8 @@ public function __construct(ControllerResolverInterface $controller_resolver, Re
     $this->accessManager = $access_manager;
     $this->account = $account;
     $this->controllerResolver = $controller_resolver;
-    $this->request = $request;
+    $this->requestStack = new RequestStack();
+    $this->requestStack->push($request);
     $this->moduleHandler = $module_handler;
     $this->alterInfo('menu_local_actions');
     $this->setCacheBackend($cache_backend, $language_manager, 'local_action_plugins', array('local_action' => TRUE));
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalTaskIntegrationTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalTaskIntegrationTest.php
index 9106f77d6b6aaa0a0730e4fa0e1ab129ead016c4..8ab7bb666726b4c3d6118433f51acee99aec7fde 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalTaskIntegrationTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalTaskIntegrationTest.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Plugin\Discovery\YamlDiscovery;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpFoundation\RequestStack;
 
 if (!defined('DRUPAL_ROOT')) {
   define('DRUPAL_ROOT', dirname(dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)))));
@@ -63,9 +64,10 @@ protected function getLocalTaskManager($module_dirs, $route_name, $route_params)
 
     // todo mock a request with a route.
     $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
-    $property = new \ReflectionProperty('Drupal\Core\Menu\LocalTaskManager', 'request');
+    $request_stack = new RequestStack();
+    $property = new \ReflectionProperty('Drupal\Core\Menu\LocalTaskManager', 'requestStack');
     $property->setAccessible(TRUE);
-    $property->setValue($manager, $request);
+    $property->setValue($manager, $request_stack);
 
     $accessManager = $this->getMockBuilder('Drupal\Core\Access\AccessManager')
       ->disableOriginalConstructor()
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php
index 4768e98e6e7c7ebbd20c627f5fd5a57a0dbc039e..282bf80d397b8def967202e1dbdc2f03c98c4afc 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Language\Language;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
 use Zend\Stdlib\ArrayObject;
 
 /**
@@ -263,9 +264,11 @@ protected function setupLocalTaskManager() {
     $property->setAccessible(TRUE);
     $property->setValue($this->manager, $this->controllerResolver);
 
-    $property = new \ReflectionProperty('Drupal\Core\Menu\LocalTaskManager', 'request');
+    $request_stack = new RequestStack();
+    $request_stack->push($this->request);
+    $property = new \ReflectionProperty('Drupal\Core\Menu\LocalTaskManager', 'requestStack');
     $property->setAccessible(TRUE);
-    $property->setValue($this->manager, $this->request);
+    $property->setValue($this->manager, $request_stack);
 
     $property = new \ReflectionProperty('Drupal\Core\Menu\LocalTaskManager', 'accessManager');
     $property->setAccessible(TRUE);