diff --git a/core/lib/Drupal/Core/Authentication/AuthenticationManager.php b/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
index 1a7ca6e..74b30c9 100644
--- a/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
+++ b/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Authentication;
 
+use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Session\AnonymousUserSession;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
@@ -178,7 +179,7 @@ public function cleanup(Request $request) {
   public function handleException(GetResponseForExceptionEvent $event) {
     $request = $event->getRequest();
 
-    $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
+    $route = RouteMatch::createFromRequest($request)->getRouteObject();
     $active_providers = ($route && $route->getOption('_auth')) ? $route->getOption('_auth') : array($this->defaultProviderId());
 
     // Get the sorted list of active providers for the given route.
diff --git a/core/lib/Drupal/Core/Controller/DialogController.php b/core/lib/Drupal/Core/Controller/DialogController.php
index 08e46c2..6b87f85 100644
--- a/core/lib/Drupal/Core/Controller/DialogController.php
+++ b/core/lib/Drupal/Core/Controller/DialogController.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\OpenDialogCommand;
 use Drupal\Core\Page\HtmlPage;
+use Drupal\Core\Routing\RouteMatch;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
@@ -93,7 +94,8 @@ public function dialog(Request $request, $_content, $modal = FALSE) {
     }
 
     $content = drupal_render($page_content);
-    $title = isset($page_content['#title']) ? $page_content['#title'] : $this->titleResolver->getTitle($request, $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
+    $route_match = RouteMatch::createFromRequest($request);
+    $title = isset($page_content['#title']) ? $page_content['#title'] : $this->titleResolver->getTitle($request, $route_match->getRouteObject());
     $response = new AjaxResponse();
     // Fetch any modal options passed in from data-dialog-options.
     $options = $request->request->get('dialogOptions', array());
@@ -116,7 +118,7 @@ public function dialog(Request $request, $_content, $modal = FALSE) {
       }
       else {
         // Generate a target based on the route id.
-        $route_name = $request->attributes->get(RouteObjectInterface::ROUTE_NAME);
+        $route_name = $route_match->getRouteName();
         $target = '#' . drupal_html_id("drupal-dialog-$route_name");
       }
     }
diff --git a/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
index 0c31999..2eb95f4 100644
--- a/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Core\Access\AccessManager;
+use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpKernel\KernelEvents;
@@ -64,17 +65,16 @@ public function onKernelRequestAccessCheck(GetResponseEvent $event) {
     // The controller is being handled by the HTTP kernel, so add an attribute
     // to tell us this is the controller request.
     $request->attributes->set('_controller_request', TRUE);
+    $route_match = RouteMatch::createFromRequest($request);
 
-    if (!$request->attributes->has(RouteObjectInterface::ROUTE_OBJECT)) {
-      // If no Route is available it is likely a static resource and access is
-      // handled elsewhere.
+    if (!$route_object = $route_match->getRouteObject()) {
       return;
     }
 
     // Wrap this in a try/catch to ensure the '_controller_request' attribute
     // can always be removed.
     try {
-      $access = $this->accessManager->check($request->attributes->get(RouteObjectInterface::ROUTE_OBJECT), $request, $this->currentUser);
+      $access = $this->accessManager->check($route_object, $request, $this->currentUser);
     }
     catch (\Exception $e) {
       $request->attributes->remove('_controller_request');
diff --git a/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
index 1b665f3..8f16d3e 100644
--- a/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
@@ -11,6 +11,7 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Page\DefaultHtmlPageRenderer;
+use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Routing\UrlGeneratorInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\State\StateInterface;
@@ -121,6 +122,7 @@ public function onKernelRequestDetermineSiteStatus(GetResponseEvent $event) {
    */
   public function onKernelRequestMaintenance(GetResponseEvent $event) {
     $request = $event->getRequest();
+    $route_match = RouteMatch::createFromRequest($request);
     $response = $event->getResponse();
     // Continue if the site is online and the response is not a redirection.
     if ($request->attributes->get('_maintenance') != static::SITE_ONLINE && !($response instanceof RedirectResponse)) {
@@ -140,7 +142,7 @@ public function onKernelRequestMaintenance(GetResponseEvent $event) {
     // Ensure that the maintenance mode message is displayed only once
     // (allowing for page redirects) and specifically suppress its display on
     // the maintenance mode settings page.
-    $is_maintenance_route = $request->attributes->get(RouteObjectInterface::ROUTE_NAME) == 'system.site_maintenance_mode';
+    $is_maintenance_route = $route_match->getRouteName() == 'system.site_maintenance_mode';
     if ($is_maintenance && $can_access_maintenance && !$is_maintenance_route) {
       if ($this->account->hasPermission('administer site configuration')) {
         $this->drupalSetMessage($this->t('Operating in maintenance mode. <a href="@url">Go online.</a>', array('@url' => $this->urlGenerator->generate('system.site_maintenance_mode'))), 'status', FALSE);
diff --git a/core/lib/Drupal/Core/Form/FormBase.php b/core/lib/Drupal/Core/Form/FormBase.php
index b94a3ed..b2d6531 100644
--- a/core/lib/Drupal/Core/Form/FormBase.php
+++ b/core/lib/Drupal/Core/Form/FormBase.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
+use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Routing\UrlGeneratorInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -30,6 +31,13 @@
   protected $request;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * The URL generator.
    *
    * @var \Drupal\Core\Routing\UrlGeneratorInterface
@@ -164,6 +172,19 @@ public function setRequest(Request $request) {
   }
 
   /**
+   * Gets the current route match.
+   *
+   * @return \Drupal\Core\Routing\RouteMatchInterface
+   *   The current route match.
+   */
+  public function getRouteMatch() {
+    if (!$this->routeMatch) {
+      $this->routeMatch = RouteMatch::createFromRequest($this->getRequest());
+    }
+    return $this->routeMatch;
+  }
+
+  /**
    * Gets the current user.
    *
    * @return \Drupal\Core\Session\AccountInterface
diff --git a/core/lib/Drupal/Core/Routing/AdminContext.php b/core/lib/Drupal/Core/Routing/AdminContext.php
index dac5839..3524931 100644
--- a/core/lib/Drupal/Core/Routing/AdminContext.php
+++ b/core/lib/Drupal/Core/Routing/AdminContext.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\Core\Routing;
 
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\Routing\Route;
 
@@ -62,7 +61,7 @@ public function isAdminRoute(Route $route = NULL) {
   protected function getRouteFromRequest() {
     $request = $this->requestStack->getCurrentRequest();
     if ($request) {
-      return $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
+      return RouteMatch::createFromRequest($request)->getRouteObject();
     }
   }
 
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 8930d76..7b98661 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -730,9 +730,9 @@ function comment_view_multiple($comments, $view_mode = 'full', $langcode = NULL)
  * Implements hook_form_FORM_ID_alter().
  */
 function comment_form_field_ui_field_overview_form_alter(&$form, $form_state) {
-  $request = \Drupal::request();
-  if ($form['#entity_type'] == 'comment' && $request->attributes->has('commented_entity_type')) {
-    $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($request->attributes->get('commented_entity_type'), $request->attributes->get('field_name'));
+  $route_match = \Drupal::routeMatch();
+  if ($form['#entity_type'] == 'comment' && $commented_entity_type = $route_match->getParameter('commented_entity_type')) {
+    $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($commented_entity_type, $route_match->getParameter('field_name'));
   }
   $entity_type_id = $form['#entity_type'];
   if (!_comment_entity_uses_integer_id($entity_type_id)) {
@@ -745,9 +745,9 @@ function comment_form_field_ui_field_overview_form_alter(&$form, $form_state) {
  * Implements hook_form_FORM_ID_alter().
  */
 function comment_form_field_ui_form_display_overview_form_alter(&$form, $form_state) {
-  $request = \Drupal::request();
-  if ($form['#entity_type'] == 'comment' && $request->attributes->has('commented_entity_type')) {
-    $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($request->attributes->get('commented_entity_type'), $request->attributes->get('field_name'));
+  $route_match = \Drupal::routeMatch();
+  if ($form['#entity_type'] == 'comment' && $commented_entity_type = $route_match->getParameter('commented_entity_type')) {
+    $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($commented_entity_type, $route_match->getParameter('field_name'));
   }
 }
 
@@ -755,9 +755,9 @@ function comment_form_field_ui_form_display_overview_form_alter(&$form, $form_st
  * Implements hook_form_FORM_ID_alter().
  */
 function comment_form_field_ui_display_overview_form_alter(&$form, $form_state) {
-  $request = \Drupal::request();
-  if ($form['#entity_type'] == 'comment' && $request->attributes->has('commented_entity_type')) {
-    $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($request->attributes->get('commented_entity_type'), $request->attributes->get('field_name'));
+  $route_match = \Drupal::routeMatch();
+  if ($form['#entity_type'] == 'comment' && $commented_entity_type = $route_match->getParameter('commented_entity_type')) {
+    $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($commented_entity_type, $route_match->getParameter('field_name'));
   }
 }
 
diff --git a/core/modules/config_translation/config_translation.services.yml b/core/modules/config_translation/config_translation.services.yml
index f4ed510..d2cd504 100644
--- a/core/modules/config_translation/config_translation.services.yml
+++ b/core/modules/config_translation/config_translation.services.yml
@@ -7,13 +7,13 @@ services:
 
   config_translation.access.overview:
     class: Drupal\config_translation\Access\ConfigTranslationOverviewAccess
-    arguments: ['@plugin.manager.config_translation.mapper']
+    arguments: ['@plugin.manager.config_translation.mapper', '@current_route_match']
     tags:
       - { name: access_check, applies_to: _config_translation_overview_access }
 
   config_translation.access.form:
     class: Drupal\config_translation\Access\ConfigTranslationFormAccess
-    arguments: ['@plugin.manager.config_translation.mapper']
+    arguments: ['@plugin.manager.config_translation.mapper', '@current_route_match']
     tags:
       - { name: access_check, applies_to: _config_translation_form_access }
 
diff --git a/core/modules/config_translation/src/Access/ConfigTranslationFormAccess.php b/core/modules/config_translation/src/Access/ConfigTranslationFormAccess.php
index 10c5f25..933330e 100644
--- a/core/modules/config_translation/src/Access/ConfigTranslationFormAccess.php
+++ b/core/modules/config_translation/src/Access/ConfigTranslationFormAccess.php
@@ -8,7 +8,6 @@
 namespace Drupal\config_translation\Access;
 
 use Drupal\Core\Session\AccountInterface;
-use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -19,12 +18,12 @@ class ConfigTranslationFormAccess extends ConfigTranslationOverviewAccess {
   /**
    * {@inheritdoc}
    */
-  public function access(Route $route, Request $request, AccountInterface $account) {
+  public function access(Route $route, AccountInterface $account) {
     // For the translation forms we have a target language, so we need some
     // checks in addition to the checks performed for the translation overview.
-    $base_access = parent::access($route, $request, $account);
+    $base_access = parent::access($route, $account);
     if ($base_access === static::ALLOW) {
-      $target_language = language_load($request->attributes->get('langcode'));
+      $target_language = language_load($this->routeMatch->getParameter('langcode'));
 
       // Make sure that the target language is not locked, and that the target
       // language is not the original submission language. Although technically
diff --git a/core/modules/config_translation/src/Access/ConfigTranslationOverviewAccess.php b/core/modules/config_translation/src/Access/ConfigTranslationOverviewAccess.php
index 529bc4a..8f35030 100644
--- a/core/modules/config_translation/src/Access/ConfigTranslationOverviewAccess.php
+++ b/core/modules/config_translation/src/Access/ConfigTranslationOverviewAccess.php
@@ -9,6 +9,7 @@
 
 use Drupal\config_translation\ConfigMapperManagerInterface;
 use Drupal\Core\Routing\Access\AccessInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Route;
@@ -26,6 +27,13 @@ class ConfigTranslationOverviewAccess implements AccessInterface {
   protected $configMapperManager;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * The source language.
    *
    * @var \Drupal\Core\Language\LanguageInterface
@@ -37,9 +45,12 @@ class ConfigTranslationOverviewAccess implements AccessInterface {
    *
    * @param \Drupal\config_translation\ConfigMapperManagerInterface $config_mapper_manager
    *   The mapper plugin discovery service.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
    */
-  public function __construct(ConfigMapperManagerInterface $config_mapper_manager) {
+  public function __construct(ConfigMapperManagerInterface $config_mapper_manager, RouteMatchInterface $route_match) {
     $this->configMapperManager = $config_mapper_manager;
+    $this->routeMatch = $route_match;
   }
 
   /**
@@ -47,18 +58,16 @@ public function __construct(ConfigMapperManagerInterface $config_mapper_manager)
    *
    * @param \Symfony\Component\Routing\Route $route
    *   The route to check against.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object.
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The currently logged in account.
    *
    * @return string
    *   A \Drupal\Core\Access\AccessInterface constant value.
    */
-  public function access(Route $route, Request $request, AccountInterface $account) {
+  public function access(Route $route, AccountInterface $account) {
     /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */
     $mapper = $this->configMapperManager->createInstance($route->getDefault('plugin_id'));
-    $mapper->populateFromRequest($request);
+    $mapper->populateFromRouteMatch($this->routeMatch);
 
     $this->sourceLanguage = $mapper->getLanguageWithFallback();
 
diff --git a/core/modules/config_translation/src/ConfigEntityMapper.php b/core/modules/config_translation/src/ConfigEntityMapper.php
index b16d27d..f600d74 100644
--- a/core/modules/config_translation/src/ConfigEntityMapper.php
+++ b/core/modules/config_translation/src/ConfigEntityMapper.php
@@ -10,11 +10,11 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\StringTranslation\TranslationInterface;
 use Drupal\locale\LocaleConfigManager;
 use Symfony\Component\DependencyInjection\ContainerInterface;
-use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -100,10 +100,11 @@ public static function create(ContainerInterface $container, array $configuratio
   /**
    * {@inheritdoc}
    */
-  public function populateFromRequest(Request $request) {
-    parent::populateFromRequest($request);
-    $entity = $request->attributes->get($this->entityType);
+  public function populateFromRouteMatch(RouteMatchInterface $route_match) {
+    parent::populateFromRouteMatch($route_match);
+    $entity = $route_match->getParameter($this->entityType);
     $this->setEntity($entity);
+    return $this;
   }
 
   /**
diff --git a/core/modules/config_translation/src/ConfigMapperInterface.php b/core/modules/config_translation/src/ConfigMapperInterface.php
index ba75aa2..10ca92a 100644
--- a/core/modules/config_translation/src/ConfigMapperInterface.php
+++ b/core/modules/config_translation/src/ConfigMapperInterface.php
@@ -8,6 +8,7 @@
 namespace Drupal\config_translation;
 
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\RouteCollection;
 
@@ -281,10 +282,12 @@ public function hasTranslation(LanguageInterface $language);
   /**
    * Populate the config mapper with request data.
    *
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   Page request object.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
+   *
+   * @return $this
    */
-  public function populateFromRequest(Request $request);
+  public function populateFromRouteMatch(RouteMatchInterface $route_match);
 
   /**
    * Returns the name of the contextual link group to add contextual links to.
diff --git a/core/modules/config_translation/src/ConfigNamesMapper.php b/core/modules/config_translation/src/ConfigNamesMapper.php
index 68c0623..21e61b8 100644
--- a/core/modules/config_translation/src/ConfigNamesMapper.php
+++ b/core/modules/config_translation/src/ConfigNamesMapper.php
@@ -365,13 +365,9 @@ public function getWeight() {
   /**
    * {@inheritdoc}
    */
-  public function populateFromRequest(Request $request) {
-    if ($request->attributes->has('langcode')) {
-      $this->langcode = $request->attributes->get('langcode');
-    }
-    else {
-      $this->langcode = NULL;
-    }
+  public function populateFromRouteMatch(\Drupal\Core\Routing\RouteMatchInterface $route_match) {
+    $this->langcode = $route_match->getParameter('langcode');
+    return $this;
   }
 
   /**
diff --git a/core/modules/config_translation/src/Controller/ConfigTranslationController.php b/core/modules/config_translation/src/Controller/ConfigTranslationController.php
index 827b99e..078e0c8 100644
--- a/core/modules/config_translation/src/Controller/ConfigTranslationController.php
+++ b/core/modules/config_translation/src/Controller/ConfigTranslationController.php
@@ -14,6 +14,8 @@
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\ParamConverter\ParamNotConvertedException;
 use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
+use Drupal\Core\Routing\RouteMatch;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -69,6 +71,13 @@ class ConfigTranslationController extends ControllerBase {
   protected $languageManager;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * Constructs a ConfigTranslationController.
    *
    * @param \Drupal\config_translation\ConfigMapperManagerInterface $config_mapper_manager
@@ -84,13 +93,14 @@ class ConfigTranslationController extends ControllerBase {
    * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
    *   The language manager.
    */
-  public function __construct(ConfigMapperManagerInterface $config_mapper_manager, AccessManager $access_manager, RequestMatcherInterface $router, InboundPathProcessorInterface $path_processor, AccountInterface $account, LanguageManagerInterface $language_manager) {
+  public function __construct(ConfigMapperManagerInterface $config_mapper_manager, AccessManager $access_manager, RequestMatcherInterface $router, InboundPathProcessorInterface $path_processor, AccountInterface $account, LanguageManagerInterface $language_manager, RouteMatchInterface $route_match) {
     $this->configMapperManager = $config_mapper_manager;
     $this->accessManager = $access_manager;
     $this->router = $router;
     $this->pathProcessor = $path_processor;
     $this->account = $account;
     $this->languageManager = $language_manager;
+    $this->routeMatch = $route_match;
   }
 
   /**
@@ -103,7 +113,8 @@ public static function create(ContainerInterface $container) {
       $container->get('router'),
       $container->get('path_processor_manager'),
       $container->get('current_user'),
-      $container->get('language_manager')
+      $container->get('language_manager'),
+      $container->get('current_route_match')
     );
   }
 
@@ -121,7 +132,7 @@ public static function create(ContainerInterface $container) {
   public function itemPage(Request $request, $plugin_id) {
     /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */
     $mapper = $this->configMapperManager->createInstance($plugin_id);
-    $mapper->populateFromRequest($request);
+    $mapper->populateFromRouteMatch($this->routeMatch);
 
     $page = array();
     $page['#title'] = $this->t('Translations for %label', array('%label' => $mapper->getTitle()));
@@ -142,7 +153,7 @@ public function itemPage(Request $request, $plugin_id) {
     }
 
     // We create a fake request object to pass into
-    // ConfigMapperInterface::populateFromRequest() for the different languages.
+    // ConfigMapperInterface::populateFromRouteMatch() for the different languages.
     // Creating a separate request for each language and route is neither easily
     // possible nor performant.
     $fake_request = $request->duplicate();
@@ -158,7 +169,8 @@ public function itemPage(Request $request, $plugin_id) {
       // ConfigMapperInterface::getAddRouteParameters(), for example,
       // needs to return the correct language code for each table row.
       $fake_request->attributes->set('langcode', $langcode);
-      $mapper->populateFromRequest($fake_request);
+      $route_match = RouteMatch::createFromRequest($fake_request);
+      $mapper->populateFromRouteMatch($route_match);
 
       // Prepare the language name and the operations depending on whether this
       // is the original language or not.
diff --git a/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php b/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php
index a9a0a83..8cc9e7a 100644
--- a/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php
+++ b/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php
@@ -115,10 +115,10 @@ public function getFormID() {
   /**
    * {@inheritdoc}
    */
-  public function buildForm(array $form, array &$form_state, Request $request = NULL, $plugin_id = NULL, $langcode = NULL) {
+  public function buildForm(array $form, array &$form_state, $plugin_id = NULL, $langcode = NULL) {
     /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */
     $mapper = $this->configMapperManager->createInstance($plugin_id);
-    $mapper->populateFromRequest($request);
+    $mapper->populateFromRouteMatch($this->getRouteMatch());
 
     $language = language_load($langcode);
     if (!$language) {
diff --git a/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php b/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
index 5b6125a..39e0f5e 100644
--- a/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
+++ b/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
@@ -140,8 +140,6 @@ public function getBaseFormID() {
    *   An associative array containing the structure of the form.
    * @param array $form_state
    *   An associative array containing the current state of the form.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   (optional) Page request object.
    * @param string $plugin_id
    *   (optional) The plugin ID of the mapper.
    * @param string $langcode
@@ -155,10 +153,10 @@ public function getBaseFormID() {
    *   Throws an exception if the language code provided as a query parameter in
    *   the request does not match an active language.
    */
-  public function buildForm(array $form, array &$form_state, Request $request = NULL, $plugin_id = NULL, $langcode = NULL) {
+  public function buildForm(array $form, array &$form_state, $plugin_id = NULL, $langcode = NULL) {
     /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */
     $mapper = $this->configMapperManager->createInstance($plugin_id);
-    $mapper->populateFromRequest($request);
+    $mapper->populateFromRouteMatch($this->getRouteMatch());
 
     $language = language_load($langcode);
     if (!$language) {
diff --git a/core/modules/config_translation/tests/src/ConfigNamesMapperTest.php b/core/modules/config_translation/tests/src/ConfigNamesMapperTest.php
index 41a6b1a..950fa6e 100644
--- a/core/modules/config_translation/tests/src/ConfigNamesMapperTest.php
+++ b/core/modules/config_translation/tests/src/ConfigNamesMapperTest.php
@@ -208,9 +208,12 @@ public function testGetAddRouteName() {
    * Tests ConfigNamesMapper::getAddRouteParameters().
    */
   public function testGetAddRouteParameters() {
-    $request = Request::create('');
-    $request->attributes->set('langcode', 'xx');
-    $this->configNamesMapper->populateFromRequest($request);
+    $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
+    $route_match->expects($this->once())
+      ->method('getParameter')
+      ->with('langcode')
+      ->will($this->returnValue('xx'));
+    $this->configNamesMapper->populateFromRouteMatch($route_match);
 
     $expected = array('langcode' => 'xx');
     $result = $this->configNamesMapper->getAddRouteParameters();
@@ -247,9 +250,12 @@ public function testGetEditRouteName() {
    * Tests ConfigNamesMapper::getEditRouteParameters().
    */
   public function testGetEditRouteParameters() {
-    $request = Request::create('');
-    $request->attributes->set('langcode', 'xx');
-    $this->configNamesMapper->populateFromRequest($request);
+    $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
+    $route_match->expects($this->once())
+      ->method('getParameter')
+      ->with('langcode')
+      ->will($this->returnValue('xx'));
+    $this->configNamesMapper->populateFromRouteMatch($route_match);
 
     $expected = array('langcode' => 'xx');
     $result = $this->configNamesMapper->getEditRouteParameters();
@@ -286,9 +292,12 @@ public function testGetDeleteRouteName() {
    * Tests ConfigNamesMapper::getDeleteRouteParameters().
    */
   public function testGetDeleteRouteParameters() {
-    $request = Request::create('');
-    $request->attributes->set('langcode', 'xx');
-    $this->configNamesMapper->populateFromRequest($request);
+    $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
+    $route_match->expects($this->once())
+      ->method('getParameter')
+      ->with('langcode')
+      ->will($this->returnValue('xx'));
+    $this->configNamesMapper->populateFromRouteMatch($route_match);
 
     $expected = array('langcode' => 'xx');    $result = $this->configNamesMapper->getDeleteRouteParameters();
     $this->assertSame($expected, $result);
@@ -339,25 +348,28 @@ public function testGetWeight() {
   }
 
   /**
-   * Tests ConfigNamesMapper::populateFromRequest().
+   * Tests ConfigNamesMapper::populateFromRouteMatch().
    */
   public function testPopulateFromRequest() {
     // Make sure the language code is not set initially.
     $this->assertSame(NULL, $this->configNamesMapper->getInternalLangcode());
 
     // Test that an empty request does not set the language code.
-    $request = Request::create('');
-    $this->configNamesMapper->populateFromRequest($request);
+    $route_match_empty = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
+    $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
+    $route_match->expects($this->once())
+      ->method('getParameter')
+      ->with('langcode')
+      ->will($this->returnValue('xx'));
+    $this->configNamesMapper->populateFromRouteMatch($route_match_empty);
     $this->assertSame(NULL, $this->configNamesMapper->getInternalLangcode());
 
     // Test that a request with a 'langcode' attribute sets the language code.
-    $request->attributes->set('langcode', 'xx');
-    $this->configNamesMapper->populateFromRequest($request);
+    $this->configNamesMapper->populateFromRouteMatch($route_match);
     $this->assertSame('xx', $this->configNamesMapper->getInternalLangcode());
 
     // Test that the language code gets unset with the wrong request.
-    $request->attributes->remove('langcode');
-    $this->configNamesMapper->populateFromRequest($request);
+    $this->configNamesMapper->populateFromRouteMatch($route_match_empty);
     $this->assertSame(NULL, $this->configNamesMapper->getInternalLangcode());
   }
 
diff --git a/core/modules/field_ui/field_ui.services.yml b/core/modules/field_ui/field_ui.services.yml
index 4f5ef7a..074f650 100644
--- a/core/modules/field_ui/field_ui.services.yml
+++ b/core/modules/field_ui/field_ui.services.yml
@@ -6,11 +6,11 @@ services:
      - { name: event_subscriber }
   access_check.field_ui.view_mode:
     class: Drupal\field_ui\Access\ViewModeAccessCheck
-    arguments: ['@entity.manager']
+    arguments: ['@entity.manager', '@current_route_match']
     tags:
      - { name: access_check, applies_to: _field_ui_view_mode_access }
   access_check.field_ui.form_mode:
     class: Drupal\field_ui\Access\FormModeAccessCheck
-    arguments: ['@entity.manager']
+    arguments: ['@entity.manager', '@current_route_match']
     tags:
      - { name: access_check, applies_to: _field_ui_form_mode_access }
diff --git a/core/modules/field_ui/src/Access/FormModeAccessCheck.php b/core/modules/field_ui/src/Access/FormModeAccessCheck.php
index d35dd15..0407e3a 100644
--- a/core/modules/field_ui/src/Access/FormModeAccessCheck.php
+++ b/core/modules/field_ui/src/Access/FormModeAccessCheck.php
@@ -9,9 +9,9 @@
 
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Routing\Access\AccessInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Defines an access check for entity form mode routes.
@@ -28,13 +28,23 @@ class FormModeAccessCheck implements AccessInterface {
   protected $entityManager;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * Creates a new FormModeAccessCheck.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
    */
-  public function __construct(EntityManagerInterface $entity_manager) {
+  public function __construct(EntityManagerInterface $entity_manager, RouteMatchInterface $route_match) {
     $this->entityManager = $entity_manager;
+    $this->routeMatch = $route_match;
   }
 
   /**
@@ -42,8 +52,6 @@ public function __construct(EntityManagerInterface $entity_manager) {
    *
    * @param \Symfony\Component\Routing\Route $route
    *   The route to check against.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object.
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The currently logged in account.
    * @param string $form_mode_name
@@ -60,11 +68,11 @@ public function __construct(EntityManagerInterface $entity_manager) {
    * @return string
    *   A \Drupal\Core\Access\AccessInterface constant value.
    */
-  public function access(Route $route, Request $request, AccountInterface $account, $form_mode_name = 'default', $bundle = NULL) {
+  public function access(Route $route, AccountInterface $account, $form_mode_name = 'default', $bundle = NULL) {
     if ($entity_type_id = $route->getDefault('entity_type_id')) {
       if (!isset($bundle)) {
         $entity_type = $this->entityManager->getDefinition($entity_type_id);
-        $bundle = $request->attributes->get('_raw_variables')->get($entity_type->getBundleEntityType());
+        $bundle = $this->routeMatch->getRawParameter($entity_type->getBundleEntityType());
       }
 
       $visibility = FALSE;
diff --git a/core/modules/field_ui/src/Access/ViewModeAccessCheck.php b/core/modules/field_ui/src/Access/ViewModeAccessCheck.php
index 8e93040..1f30f62 100644
--- a/core/modules/field_ui/src/Access/ViewModeAccessCheck.php
+++ b/core/modules/field_ui/src/Access/ViewModeAccessCheck.php
@@ -9,9 +9,9 @@
 
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Routing\Access\AccessInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Defines an access check for entity view mode routes.
@@ -28,13 +28,23 @@ class ViewModeAccessCheck implements AccessInterface {
   protected $entityManager;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * Creates a new ViewModeAccessCheck.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
    */
-  public function __construct(EntityManagerInterface $entity_manager) {
+  public function __construct(EntityManagerInterface $entity_manager, RouteMatchInterface $route_match) {
     $this->entityManager = $entity_manager;
+    $this->routeMatch = $route_match;
   }
 
   /**
@@ -42,8 +52,6 @@ public function __construct(EntityManagerInterface $entity_manager) {
    *
    * @param \Symfony\Component\Routing\Route $route
    *   The route to check against.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object.
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The currently logged in account.
    * @param string $view_mode_name
@@ -60,11 +68,11 @@ public function __construct(EntityManagerInterface $entity_manager) {
    * @return string
    *   A \Drupal\Core\Access\AccessInterface constant value.
    */
-  public function access(Route $route, Request $request, AccountInterface $account, $view_mode_name = 'default', $bundle = NULL) {
+  public function access(Route $route, AccountInterface $account, $view_mode_name = 'default', $bundle = NULL) {
     if ($entity_type_id = $route->getDefault('entity_type_id')) {
       if (!isset($bundle)) {
         $entity_type = $this->entityManager->getDefinition($entity_type_id);
-        $bundle = $request->attributes->get('_raw_variables')->get($entity_type->getBundleEntityType());
+        $bundle = $this->routeMatch->getRawParameter($entity_type->getBundleEntityType());
       }
 
       $visibility = FALSE;
diff --git a/core/modules/field_ui/src/DisplayOverview.php b/core/modules/field_ui/src/DisplayOverview.php
index f93ae84..93fbb7a 100644
--- a/core/modules/field_ui/src/DisplayOverview.php
+++ b/core/modules/field_ui/src/DisplayOverview.php
@@ -77,11 +77,8 @@ public function getFormId() {
   /**
    * {@inheritdoc}
    */
-  public function buildForm(array $form, array &$form_state, $entity_type_id = NULL, $bundle = NULL) {
-    if ($this->getRequest()->attributes->has('view_mode_name')) {
-      $this->mode = $this->getRequest()->attributes->get('view_mode_name');
-    }
-
+  public function buildForm(array $form, array &$form_state, $entity_type_id = NULL, $bundle = NULL, $view_mode_name = NULL) {
+    $this->mode = $view_mode_name;
     return parent::buildForm($form, $form_state, $entity_type_id, $bundle);
   }
 
diff --git a/core/modules/field_ui/src/FormDisplayOverview.php b/core/modules/field_ui/src/FormDisplayOverview.php
index 3a2546b..41a3b33 100644
--- a/core/modules/field_ui/src/FormDisplayOverview.php
+++ b/core/modules/field_ui/src/FormDisplayOverview.php
@@ -76,11 +76,8 @@ public function getFormId() {
   /**
    * {@inheritdoc}
    */
-  public function buildForm(array $form, array &$form_state, $entity_type_id = NULL, $bundle = NULL) {
-    if ($this->getRequest()->attributes->has('form_mode_name')) {
-      $this->mode = $this->getRequest()->attributes->get('form_mode_name');
-    }
-
+  public function buildForm(array $form, array &$form_state, $entity_type_id = NULL, $bundle = NULL, $form_mode_name = NULL) {
+    $this->mode = $form_mode_name;
     return parent::buildForm($form, $form_state, $entity_type_id, $bundle);
   }
 
diff --git a/core/modules/field_ui/src/OverviewBase.php b/core/modules/field_ui/src/OverviewBase.php
index 17104e0..8aed37b 100644
--- a/core/modules/field_ui/src/OverviewBase.php
+++ b/core/modules/field_ui/src/OverviewBase.php
@@ -79,7 +79,7 @@ public function buildForm(array $form, array &$form_state, $entity_type_id = NUL
     $this->bundleEntityType = $entity_type->getBundleEntityType();
     if (!isset($form_state['bundle'])) {
       if (!$bundle) {
-        $bundle = $this->getRequest()->attributes->get('_raw_variables')->get($this->bundleEntityType);
+        $bundle = $this->getRouteMatch()->getRawParameter($this->bundleEntityType);
       }
       $form_state['bundle'] = $bundle;
     }
diff --git a/core/modules/node/src/Plugin/views/argument_default/Node.php b/core/modules/node/src/Plugin/views/argument_default/Node.php
index f232cea..f3a0985 100644
--- a/core/modules/node/src/Plugin/views/argument_default/Node.php
+++ b/core/modules/node/src/Plugin/views/argument_default/Node.php
@@ -26,7 +26,7 @@ class Node extends ArgumentDefaultPluginBase {
    * {@inheritdoc}
    */
   public function getArgument() {
-    if (($node = $this->view->getRequest()->attributes->get('node')) && $node instanceof NodeInterface) {
+    if (($node = $this->view->getRouteMatch()->getParameter('node')) && $node instanceof NodeInterface) {
       return $node->id();
     }
   }
diff --git a/core/modules/rest/src/RequestHandler.php b/core/modules/rest/src/RequestHandler.php
index a5551b2..b8efd30 100644
--- a/core/modules/rest/src/RequestHandler.php
+++ b/core/modules/rest/src/RequestHandler.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\rest;
 
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Drupal\Core\Routing\RouteMatch;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerAwareTrait;
 use Symfony\Component\HttpFoundation\Request;
@@ -35,7 +35,8 @@ class RequestHandler implements ContainerAwareInterface {
    */
   public function handle(Request $request) {
 
-    $plugin = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getDefault('_plugin');
+    $route_match = RouteMatch::createFromRequest($request);
+    $plugin = $route_match->getRouteObject()->getDefault('_plugin');
     $method = strtolower($request->getMethod());
 
     $resource = $this->container
@@ -74,7 +75,7 @@ public function handle(Request $request) {
 
     // Determine the request parameters that should be passed to the resource
     // plugin.
-    $route_parameters = $request->attributes->get('_route_params');
+    $route_parameters = $route_match->getParameters();
     $parameters = array();
     // Filter out all internal parameters starting with "_".
     foreach ($route_parameters as $key => $parameter) {
@@ -87,7 +88,7 @@ public function handle(Request $request) {
     // All REST routes are restricted to exactly one format, so instead of
     // parsing it out of the Accept headers again, we can simply retrieve the
     // format requirement. If there is no format associated, just pick JSON.
-    $format = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getRequirement('_format') ?: 'json';
+    $format = $route_match->getRouteObject()->getRequirement('_format') ?: 'json';
     try {
       $response = call_user_func_array(array($resource, $method), array_merge($parameters, array($unserialized, $request)));
     }
diff --git a/core/modules/system/src/PathBasedBreadcrumbBuilder.php b/core/modules/system/src/PathBasedBreadcrumbBuilder.php
index c5d5706..ab26c95 100644
--- a/core/modules/system/src/PathBasedBreadcrumbBuilder.php
+++ b/core/modules/system/src/PathBasedBreadcrumbBuilder.php
@@ -13,11 +13,11 @@
 use Drupal\Core\Access\AccessManager;
 use Drupal\Core\ParamConverter\ParamNotConvertedException;
 use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
+use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Component\Utility\Unicode;
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
 use Symfony\Component\Routing\RequestContext;
 use Symfony\Component\Routing\Exception\MethodNotAllowedException;
@@ -135,13 +135,13 @@ public function build(RouteMatchInterface $route_match) {
       // Copy the path elements for up-casting.
       $route_request = $this->getRequestForPath(implode('/', $path_elements), $exclude);
       if ($route_request) {
-        $route_name = $route_request->attributes->get(RouteObjectInterface::ROUTE_NAME);
+        $route_match = RouteMatch::createFromRequest($route_request);
         // Note that the parameters don't really matter here since we're
         // passing in the request which already has the upcast attributes.
         $parameters = array();
-        $access = $this->accessManager->checkNamedRoute($route_name, $parameters, $this->currentUser, $route_request);
+        $access = $this->accessManager->checkNamedRoute($route_match->getRouteName(), $parameters, $this->currentUser, $route_request);
         if ($access) {
-          $title = $this->titleResolver->getTitle($route_request, $route_request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
+          $title = $this->titleResolver->getTitle($route_request, $route_match->getRouteObject());
         }
         if ($access) {
           if (!isset($title)) {
@@ -151,7 +151,7 @@ public function build(RouteMatchInterface $route_match) {
           }
           // @todo Replace with a #type => link render element so that the alter
           // hook can work with the actual data.
-          $links[] = $this->l($title, $route_request->attributes->get(RouteObjectInterface::ROUTE_NAME), $route_request->attributes->get('_raw_variables')->all(), array('html' => TRUE));
+          $links[] = $this->l($title, $route_match->getRouteName(), $route_match->getRawParameters()->all(), array('html' => TRUE));
         }
       }
 
diff --git a/core/modules/system/src/SystemManager.php b/core/modules/system/src/SystemManager.php
index 696efc1..7853d20 100644
--- a/core/modules/system/src/SystemManager.php
+++ b/core/modules/system/src/SystemManager.php
@@ -8,10 +8,9 @@
 
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Entity\EntityManagerInterface;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Extension\ModuleHandlerInterface;
-use Symfony\Component\HttpFoundation\RequestStack;
 
 /**
  * System Manager Service.
@@ -40,11 +39,11 @@ class SystemManager {
   protected $menuLinkStorage;
 
   /**
-   * The request stack.
+   * The current route match.
    *
-   * @var \Symfony\Component\HttpFoundation\RequestStack
+   * @var \Drupal\Core\Routing\RouteMatchInterface
    */
-  protected $requestStack;
+  protected $routeMatch;
 
   /**
    * A static cache of menu items.
@@ -77,14 +76,14 @@ class SystemManager {
    *   The database connection.
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
-   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
-   *   The request stack.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
    */
-  public function __construct(ModuleHandlerInterface $module_handler, Connection $database, EntityManagerInterface $entity_manager, RequestStack $request_stack) {
+  public function __construct(ModuleHandlerInterface $module_handler, Connection $database, EntityManagerInterface $entity_manager, RouteMatchInterface $route_match) {
     $this->moduleHandler = $module_handler;
     $this->database = $database;
     $this->menuLinkStorage = $entity_manager->getStorage('menu_link');
-    $this->requestStack = $request_stack;
+    $this->routeMatch = $route_match;
   }
 
   /**
@@ -171,8 +170,7 @@ public function getMaxSeverity(&$requirements) {
    *   A render array suitable for drupal_render.
    */
   public function getBlockContents() {
-    $request = $this->requestStack->getCurrentRequest();
-    $route_name = $request->attributes->get(RouteObjectInterface::ROUTE_NAME);
+    $route_name = $this->routeMatch->getRouteName();
     $items = $this->menuLinkStorage->loadByProperties(array('route_name' => $route_name));
     $item = reset($items);
     if ($content = $this->getAdminBlock($item)) {
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 2eef874..aa066e3 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -388,7 +388,7 @@ function hook_page_build(&$page) {
   }
 
   // Append a standard disclaimer to the content region on a node detail page.
-  if (\Drupal::request()->attributes->get('node')) {
+  if (\Drupal::routeMatch()->getParameter('node')) {
     $page['content']['disclaimer'] = array(
       '#markup' => t('Acme, Inc. is not responsible for the contents of this sample code.'),
       '#weight' => 25,
diff --git a/core/modules/system/system.services.yml b/core/modules/system/system.services.yml
index 2b7046c..af4ce1e 100644
--- a/core/modules/system/system.services.yml
+++ b/core/modules/system/system.services.yml
@@ -5,7 +5,7 @@ services:
       - { name: access_check, applies_to: _access_system_cron }
   system.manager:
     class: Drupal\system\SystemManager
-    arguments: ['@module_handler', '@database', '@entity.manager', '@request_stack']
+    arguments: ['@module_handler', '@database', '@entity.manager', '@current_route_match']
   system.breadcrumb.default:
     class: Drupal\system\PathBasedBreadcrumbBuilder
     arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory',  '@title_resolver', '@current_user']
diff --git a/core/modules/taxonomy/src/Plugin/views/argument_default/Tid.php b/core/modules/taxonomy/src/Plugin/views/argument_default/Tid.php
index 6dfd7bd..b45beb1 100644
--- a/core/modules/taxonomy/src/Plugin/views/argument_default/Tid.php
+++ b/core/modules/taxonomy/src/Plugin/views/argument_default/Tid.php
@@ -124,14 +124,14 @@ public function submitOptionsForm(&$form, &$form_state, &$options = array()) {
   public function getArgument() {
     // Load default argument from taxonomy page.
     if (!empty($this->options['term_page'])) {
-      if (($taxonomy_term = $this->request->attributes->get('taxonomy_term')) && $taxonomy_term instanceof TermInterface) {
+      if (($taxonomy_term = $this->view->getRouteMatch()->getParameter('taxonomy_term')) && $taxonomy_term instanceof TermInterface) {
         return $taxonomy_term->id();
       }
     }
     // Load default argument from node.
     if (!empty($this->options['node'])) {
       // Just check, if a node could be detected.
-      if (($node = $this->view->getRequest()->attributes->has('node')) && $node instanceof NodeInterface) {
+      if (($node = $this->view->getRouteMatch()->getParameter('node')) && $node instanceof NodeInterface) {
         $taxonomy = array();
         foreach ($node->getFieldDefinitions() as $field) {
           if ($field->getType() == 'taxonomy_term_reference') {
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index 967cc8b..3ab51c1 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -100,7 +100,7 @@ function update_help($route_name, RouteMatchInterface $route_match) {
 function update_page_build() {
   /** @var \Drupal\Core\Routing\AdminContext $admin_context */
   $admin_context = \Drupal::service('router.admin_context');
-  if ($admin_context->isAdminRoute(\Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_OBJECT)) && \Drupal::currentUser()->hasPermission('administer site configuration')) {
+  if ($admin_context->isAdminRoute(\Drupal::routeMatch()->getRouteObject()) && \Drupal::currentUser()->hasPermission('administer site configuration')) {
     $current_path = current_path();
     switch ($current_path) {
       // These pages don't need additional nagging.
diff --git a/core/modules/user/src/Plugin/Block/UserLoginBlock.php b/core/modules/user/src/Plugin/Block/UserLoginBlock.php
index 2cd54f4..16e75b9 100644
--- a/core/modules/user/src/Plugin/Block/UserLoginBlock.php
+++ b/core/modules/user/src/Plugin/Block/UserLoginBlock.php
@@ -7,9 +7,11 @@
 
 namespace Drupal\user\Plugin\Block;
 
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\block\BlockBase;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a 'User login' block.
@@ -20,14 +22,50 @@
  *   category = @Translation("Forms")
  * )
  */
-class UserLoginBlock extends BlockBase {
+class UserLoginBlock extends BlockBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * Constructs a UserLoginBlock object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin ID for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->routeMatch = $route_match;
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('current_route_match')
+    );
+  }
 
   /**
    * {@inheritdoc}
    */
   protected function blockAccess(AccountInterface $account) {
-    $route_name = \Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_NAME);
-    return ($account->isAnonymous() && !in_array($route_name, array('user.register', 'user.login', 'user.logout')));
+    return ($account->isAnonymous() && !in_array($this->routeMatch->getRouteName(), array('user.register', 'user.login', 'user.logout')));
   }
 
   /**
diff --git a/core/modules/user/src/Plugin/views/argument_default/User.php b/core/modules/user/src/Plugin/views/argument_default/User.php
index fad8743..0551b98 100644
--- a/core/modules/user/src/Plugin/views/argument_default/User.php
+++ b/core/modules/user/src/Plugin/views/argument_default/User.php
@@ -50,19 +50,14 @@ public function buildOptionsForm(&$form, &$form_state) {
   public function getArgument() {
 
     // If there is a user object in the current route.
-    if ($this->view->getRequest()->attributes->has('user')) {
-      $user = $this->view->getRequest()->attributes->get('user');
-      if ($user instanceof UserInterface) {
-        return $user->id();
-      }
+    $route_match = $this->view->getRouteMatch();
+    if (($user = $route_match->getParameter('user')) && $user instanceof UserInterface) {
+      return $user->id();
     }
 
     // If option to use node author; and node in current route.
-    if (!empty($this->options['user']) && $this->view->getRequest()->attributes->has('node')) {
-      $node = $this->view->getRequest()->attributes->get('node');
-      if ($node instanceof NodeInterface) {
-        return $node->getOwnerId();
-      }
+    if (!empty($this->options['user']) && ($node = $route_match->getParameter('node')) && $node instanceof NodeInterface) {
+      return $node->getOwnerId();
     }
 
     // If the current page is a view that takes uid as an argument.
diff --git a/core/modules/views/src/Plugin/views/argument/Date.php b/core/modules/views/src/Plugin/views/argument/Date.php
index 67c0055..4712e8c 100644
--- a/core/modules/views/src/Plugin/views/argument/Date.php
+++ b/core/modules/views/src/Plugin/views/argument/Date.php
@@ -65,7 +65,7 @@ public function getDefaultArgument($raw = FALSE) {
       return date($this->argFormat, REQUEST_TIME);
     }
     elseif (!$raw && in_array($this->options['default_argument_type'], array('node_created', 'node_changed'))) {
-      $node = $this->view->getRequest()->attributes->get('node');
+      $node = $this->view->getRouteMatch()->getParameter('node');
 
       if (!($node instanceof NodeInterface)) {
         return parent::getDefaultArgument();
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index 288a84b..98684db 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -16,7 +16,6 @@
 use Drupal\views\ViewExecutable;
 use Drupal\views\Plugin\views\PluginBase;
 use Drupal\views\Views;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\DependencyInjection\Exception\RuntimeException as DependencyInjectionRuntimeException;
 
 /**
@@ -2410,7 +2409,7 @@ public function getSpecialBlocks() {
    */
   public function viewExposedFormBlocks() {
     // Avoid interfering with the admin forms.
-    $route_name = \Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_NAME);
+    $route_name = \Drupal::routeMatch()->getRouteName();
     if (strpos($route_name, 'views_ui.') === 0) {
       return;
     }
diff --git a/core/modules/views/src/Routing/ViewPageController.php b/core/modules/views/src/Routing/ViewPageController.php
index 1898b03..f54a5cd 100644
--- a/core/modules/views/src/Routing/ViewPageController.php
+++ b/core/modules/views/src/Routing/ViewPageController.php
@@ -10,8 +10,8 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\views\ViewExecutableFactory;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -36,16 +36,26 @@ class ViewPageController implements ContainerInjectionInterface {
   protected $executableFactory;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * Constructs a ViewPageController object.
    *
    * @param \Drupal\Core\Entity\EntityStorageInterface $storage
    *   The entity storage.
    * @param \Drupal\views\ViewExecutableFactory $executable_factory
    *   The view executable factory
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
    */
-  public function __construct(EntityStorageInterface $storage, ViewExecutableFactory $executable_factory) {
+  public function __construct(EntityStorageInterface $storage, ViewExecutableFactory $executable_factory, RouteMatchInterface $route_match) {
     $this->storage = $storage;
     $this->executableFactory = $executable_factory;
+    $this->routeMatch = $route_match;
   }
 
   /**
@@ -54,17 +64,15 @@ public function __construct(EntityStorageInterface $storage, ViewExecutableFacto
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager')->getStorage('view'),
-      $container->get('views.executable')
+      $container->get('views.executable'),
+      $container->get('current_route_match')
     );
   }
 
   /**
    * Handles a response for a view.
    */
-  public function handle(Request $request) {
-    $view_id = $request->attributes->get('view_id');
-    $display_id = $request->attributes->get('display_id');
-
+  public function handle(Request $request, $view_id, $display_id) {
     $entity = $this->storage->load($view_id);
     if (empty($entity)) {
       throw new NotFoundHttpException(String::format('Page controller for view %id requested, but view was not found.', array('%id' => $view_id)));
@@ -75,10 +83,9 @@ public function handle(Request $request) {
     $view->initHandlers();
 
     $args = array();
-    $map = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getOption('_view_argument_map', array());
+    $map = $this->routeMatch->getRouteObject()->getOption('_view_argument_map', array());
     $arguments_length = count($view->argument);
     for ($argument_index = 0; $argument_index < $arguments_length; $argument_index++) {
-      // Allow parameters be pulled from the request.
       // The map stores the actual name of the parameter in the request. Views
       // which override existing controller, use for example 'node' instead of
       // arg_nid as name.
@@ -88,15 +95,12 @@ public function handle(Request $request) {
 
         // First try to get from the original values then on the not converted
         // ones.
-        if ($request->attributes->has('_raw_variables')) {
-          $arg = $request->attributes->get('_raw_variables')->get($attribute);
-        }
-        else {
-          $arg = $request->attributes->get($attribute);
+        if (!$arg = $this->routeMatch->getRawParameter($attribute)) {
+          $arg = $this->routeMatch->getParameter($attribute);
         }
       }
       else {
-        $arg = $request->attributes->get($attribute);
+        $arg = $this->routeMatch->getParameter($attribute);
       }
 
       if (isset($arg)) {
diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index ad8e801..054252f 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -8,6 +8,7 @@
 namespace Drupal\views;
 
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
+use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\views\Plugin\views\query\QueryPluginBase;
 use Drupal\views\ViewStorageInterface;
@@ -340,6 +341,13 @@ class ViewExecutable {
   protected $request;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * Does this view already have loaded it's handlers.
    *
    * @todo Group with other static properties.
@@ -1608,6 +1616,19 @@ public function getRequest() {
   }
 
   /**
+   * Gets the current route match.
+   *
+   * @return \Drupal\Core\Routing\RouteMatchInterface
+   *   The current route match.
+   */
+  public function getRouteMatch() {
+    if (!$this->routeMatch) {
+      $this->routeMatch = RouteMatch::createFromRequest($this->getRequest());
+    }
+    return $this->routeMatch;
+  }
+
+  /**
    * Get the view's current title. This can change depending upon how it
    * was built.
    */
diff --git a/core/modules/views/tests/src/Routing/ViewPageControllerTest.php b/core/modules/views/tests/src/Routing/ViewPageControllerTest.php
index 94ce9a7..4099af5 100644
--- a/core/modules/views/tests/src/Routing/ViewPageControllerTest.php
+++ b/core/modules/views/tests/src/Routing/ViewPageControllerTest.php
@@ -9,10 +9,7 @@
 
 use Drupal\Tests\UnitTestCase;
 use Drupal\views\Routing\ViewPageController;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
-use Symfony\Component\HttpFoundation\ParameterBag;
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -46,6 +43,13 @@ class ViewPageControllerTest extends UnitTestCase {
    */
   protected $executableFactory;
 
+  /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $routeMatch;
+
   public static function getInfo() {
     return array(
       'name' => 'View page controller test',
@@ -61,8 +65,9 @@ protected function setUp() {
     $this->executableFactory = $this->getMockBuilder('Drupal\views\ViewExecutableFactory')
       ->disableOriginalConstructor()
       ->getMock();
+    $this->routeMatch = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
 
-    $this->pageController = new ViewPageController($this->storage, $this->executableFactory);
+    $this->pageController = new ViewPageController($this->storage, $this->executableFactory, $this->routeMatch);
   }
 
   /**
@@ -89,17 +94,20 @@ public function testPageController() {
       ->with('default', array())
       ->will($this->returnValue(array('#markup' => 'example output')));
 
+    $request = new Request();
+    $executable->expects($this->once())
+      ->method('setRequest')
+      ->with($request);
+
     $this->executableFactory->expects($this->any())
       ->method('get')
       ->with($view)
       ->will($this->returnValue($executable));
+    $this->routeMatch->expects($this->once())
+      ->method('getRouteObject')
+      ->will($this->returnValue(new Route('')));
 
-    $request = new Request();
-    $request->attributes->set('view_id', 'test_page_view');
-    $request->attributes->set('display_id', 'default');
-    $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route(''));
-
-    $output = $this->pageController->handle($request);
+    $output = $this->pageController->handle($request, 'test_page_view', 'default');
     $this->assertInternalType('array', $output);
     $this->assertEquals(array('#markup' => 'example output'), $output);
   }
@@ -134,19 +142,25 @@ public function testHandleWithArgumentsWithoutOverridden() {
       ->method('executeDisplay')
       ->with('page_1', array('test-argument'));
 
+    $request = new Request();
+    $executable->expects($this->once())
+      ->method('setRequest')
+      ->with($request);
+
     $this->executableFactory->expects($this->any())
       ->method('get')
       ->with($view)
       ->will($this->returnValue($executable));
 
-    $request = new Request();
-    $request->attributes->set('view_id', 'test_page_view');
-    $request->attributes->set('display_id', 'page_1');
-    // Add the argument to the request.
-    $request->attributes->set('arg_0', 'test-argument');
-    $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route(''));
+    $this->routeMatch->expects($this->once())
+      ->method('getRouteObject')
+      ->will($this->returnValue(new Route('')));
+    $this->routeMatch->expects($this->once())
+      ->method('getParameter')
+      ->with('arg_0')
+      ->will($this->returnValue('test-argument'));
 
-    $this->pageController->handle($request);
+    $this->pageController->handle($request, 'test_page_view', 'page_1');
   }
 
   /**
@@ -181,21 +195,27 @@ public function testHandleWithArgumentsOnOveriddenRoute() {
       ->method('executeDisplay')
       ->with('page_1', array('test-argument'));
 
+    $request = new Request();
+    $executable->expects($this->once())
+      ->method('setRequest')
+      ->with($request);
+
     $this->executableFactory->expects($this->any())
       ->method('get')
       ->with($view)
       ->will($this->returnValue($executable));
 
-    $request = new Request();
-    $request->attributes->set('view_id', 'test_page_view');
-    $request->attributes->set('display_id', 'page_1');
-    // Add the argument to the request.
-    $request->attributes->set('parameter', 'test-argument');
-    $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('', array(), array(), array('_view_argument_map' => array(
-      'arg_0' => 'parameter',
-    ))));
+    $this->routeMatch->expects($this->once())
+      ->method('getRouteObject')
+      ->will($this->returnValue(new Route('', array(), array(), array('_view_argument_map' => array(
+        'arg_0' => 'parameter',
+      )))));
+    $this->routeMatch->expects($this->once())
+      ->method('getParameter')
+      ->with('parameter')
+      ->will($this->returnValue('test-argument'));
 
-    $this->pageController->handle($request);
+    $this->pageController->handle($request, 'test_page_view', 'page_1');
   }
 
   /**
@@ -231,24 +251,29 @@ public function testHandleWithArgumentsOnOveriddenRouteWithUpcasting() {
       ->method('executeDisplay')
       ->with('page_1', array('example_id'));
 
+    $request = new Request();
+    $executable->expects($this->once())
+      ->method('setRequest')
+      ->with($request);
+
     $this->executableFactory->expects($this->any())
       ->method('get')
       ->with($view)
       ->will($this->returnValue($executable));
 
-    $request = new Request();
-    $request->attributes->set('view_id', 'test_page_view');
-    $request->attributes->set('display_id', 'page_1');
-    // Add the argument to the request.
-    $request->attributes->set('test_entity', $this->getMock('Drupal\Core\Entity\EntityInterface'));
-    $raw_variables = new ParameterBag(array('test_entity' => 'example_id'));
-    $request->attributes->set('_raw_variables', $raw_variables);
+    $this->routeMatch->expects($this->once())
+      ->method('getRouteObject')
+      ->will($this->returnValue(new Route('', array(), array(), array('_view_argument_map' => array(
+        'arg_0' => 'test_entity',
+      )))));
+    $this->routeMatch->expects($this->never())
+      ->method('getParameter');
+    $this->routeMatch->expects($this->once())
+      ->method('getRawParameter')
+      ->with('test_entity')
+      ->will($this->returnValue('example_id'));
 
-    $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('', array(), array(), array('_view_argument_map' => array(
-      'arg_0' => 'test_entity',
-    ))));
-
-    $this->pageController->handle($request);
+    $this->pageController->handle($request, 'test_page_view', 'page_1');
   }
 
   /**
@@ -261,9 +286,7 @@ public function testHandleWithNotExistingView() {
     $random_view_id = $this->randomName();
 
     $request = new Request();
-    $request->attributes->set('view_id', $random_view_id);
-    $request->attributes->set('display_id', 'default');
-    $this->pageController->handle($request);
+    $this->pageController->handle($request, $random_view_id, 'default');
   }
 
 }
diff --git a/core/modules/views_ui/src/ViewFormBase.php b/core/modules/views_ui/src/ViewFormBase.php
index 61b872f..3af0a1d 100644
--- a/core/modules/views_ui/src/ViewFormBase.php
+++ b/core/modules/views_ui/src/ViewFormBase.php
@@ -23,25 +23,29 @@
    */
   protected $displayID;
 
-  /**
-   * {@inheritdoc}
-   */
-  public function init(array &$form_state) {
-    parent::init($form_state);
+  public function buildForm(array $form, array &$form_state, $display_id = NULL) {
+    // If a display ID was specified by the $form_state, override the one from
+    // the request.
+    if (isset($form_state['display_id'])) {
+      $display_id = $form_state['display_id'];
+    }
 
-    if ($display_id = \Drupal::request()->attributes->get('display_id')) {
+    // Store the display ID.
+    if ($display_id) {
       $this->displayID = $display_id;
     }
 
     // @todo Remove the need for this.
     form_load_include($form_state, 'inc', 'views_ui', 'admin');
-    $form_state['view'] = $this->entity;
+    return parent::buildForm($form, $form_state);
   }
 
   /**
    * {@inheritdoc}
    */
   protected function prepareEntity() {
+    $form_state['view'] = $this->entity;
+
     // Determine the displays available for editing.
     if ($tabs = $this->getDisplayTabs($this->entity)) {
       // If a display isn't specified, use the first one.
diff --git a/core/modules/views_ui/src/ViewPreviewForm.php b/core/modules/views_ui/src/ViewPreviewForm.php
index e2d2899..0c07bb7 100644
--- a/core/modules/views_ui/src/ViewPreviewForm.php
+++ b/core/modules/views_ui/src/ViewPreviewForm.php
@@ -127,13 +127,6 @@ protected function actions(array $form, array &$form_state) {
    * Form submission handler for the Preview button.
    */
   public function submitPreview($form, &$form_state) {
-    // Rebuild the form with a pristine $view object.
-    $view = $this->entity;
-    // Attempt to load the view from temp store, otherwise create a new one.
-    if (!$new_view = $this->tempStore->get($view->id())) {
-      $new_view = new ViewUI($view);
-    }
-    $form_state['build_info']['args'][0] = $new_view;
     $form_state['show_preview'] = TRUE;
     $form_state['rebuild'] = TRUE;
   }
diff --git a/core/tests/Drupal/Tests/Core/EventSubscriber/AccessSubscriberTest.php b/core/tests/Drupal/Tests/Core/EventSubscriber/AccessSubscriberTest.php
index 5ec7f81..92c82b3 100644
--- a/core/tests/Drupal/Tests/Core/EventSubscriber/AccessSubscriberTest.php
+++ b/core/tests/Drupal/Tests/Core/EventSubscriber/AccessSubscriberTest.php
@@ -86,9 +86,7 @@ public function setUp() {
       ->disableOriginalConstructor()
       ->getMock();
 
-    $this->route = $this->getMockBuilder('Symfony\Component\Routing\Route')
-      ->disableOriginalConstructor()
-      ->getMock();
+    $this->route = new Route('');
 
     $this->request->attributes = $this->parameterBag;
 
@@ -113,14 +111,18 @@ public function setUp() {
   public function testAccessSubscriberThrowsAccessDeniedException() {
 
     $this->parameterBag->expects($this->any())
+      ->method('all')
+      ->will($this->returnValue(array()));
+    $this->parameterBag->expects($this->any())
       ->method('has')
       ->with(RouteObjectInterface::ROUTE_OBJECT)
       ->will($this->returnValue(TRUE));
 
     $this->parameterBag->expects($this->any())
       ->method('get')
-      ->with(RouteObjectInterface::ROUTE_OBJECT)
-      ->will($this->returnValue($this->route));
+      ->will($this->returnValueMap(array(
+        array(RouteObjectInterface::ROUTE_OBJECT, NULL, FALSE, $this->route),
+      )));
 
     $this->accessManager->expects($this->any())
       ->method('check')
@@ -151,14 +153,18 @@ public function testAccessSubscriberOnlyChecksForRequestsWithRouteObject() {
    */
   public function testAccessSubscriberDoesNotAlterRequestIfAccessManagerGrantsAccess() {
     $this->parameterBag->expects($this->any())
+      ->method('all')
+      ->will($this->returnValue(array()));
+    $this->parameterBag->expects($this->any())
       ->method('has')
       ->with(RouteObjectInterface::ROUTE_OBJECT)
       ->will($this->returnValue(TRUE));
 
     $this->parameterBag->expects($this->any())
       ->method('get')
-      ->with(RouteObjectInterface::ROUTE_OBJECT)
-      ->will($this->returnValue($this->route));
+      ->will($this->returnValueMap(array(
+        array(RouteObjectInterface::ROUTE_OBJECT, NULL, FALSE, $this->route),
+      )));
 
     $this->accessManager->expects($this->any())
       ->method('check')
