diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php
index f165018..139778e 100644
--- a/core/lib/Drupal/Core/Controller/ControllerResolver.php
+++ b/core/lib/Drupal/Core/Controller/ControllerResolver.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Controller;
 
+use Drupal\Core\Routing\RouteMatch;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
@@ -136,7 +137,29 @@ protected function createController($controller) {
    * {@inheritdoc}
    */
   protected function doGetArguments(Request $request, $controller, array $parameters) {
-    $arguments = parent::doGetArguments($request, $controller, $parameters);
+    $attributes = $request->attributes->all();
+    $arguments = array();
+    foreach ($parameters as $param) {
+      if (array_key_exists($param->name, $attributes)) {
+        $arguments[] = $attributes[$param->name];
+      } elseif ($param->getClass() && $param->getClass()->isInstance($request)) {
+        $arguments[] = $request;
+      } elseif ($param->getClass() && ($param->getClass()->name == 'Drupal\Core\Routing\RouteMatchInterface' || is_subclass_of($param->getClass()->name, 'Drupal\Core\Routing\RouteMatchInterface'))) {
+        $arguments[] = RouteMatch::createFromRequest($request);
+      } elseif ($param->isDefaultValueAvailable()) {
+        $arguments[] = $param->getDefaultValue();
+      } else {
+        if (is_array($controller)) {
+          $repr = sprintf('%s::%s()', get_class($controller[0]), $controller[1]);
+        } elseif (is_object($controller)) {
+          $repr = get_class($controller);
+        } else {
+          $repr = $controller;
+        }
+
+        throw new \RuntimeException(sprintf('Controller "%s" requires that you provide a value for the "$%s" argument (because there is no default value or because there is a non optional argument after this one).', $repr, $param->name));
+      }
+    }
 
     // The parameter converter overrides the raw request attributes with the
     // upcasted objects. However, it keeps a backup copy of the original, raw
diff --git a/core/modules/views/src/Routing/ViewPageController.php b/core/modules/views/src/Routing/ViewPageController.php
index 1898b03..8fe8edb 100644
--- a/core/modules/views/src/Routing/ViewPageController.php
+++ b/core/modules/views/src/Routing/ViewPageController.php
@@ -10,6 +10,7 @@
 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;
@@ -59,12 +60,19 @@ public static function create(ContainerInterface $container) {
   }
 
   /**
-   * Handles a response for a view.
+   * Handler a response for a given view and display.
+   *
+   * @param string $view_id
+   *   The ID of the view
+   * @param string $display_id
+   *   The ID of the display.
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The request.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The route match.
+   * @return null|void
    */
-  public function handle(Request $request) {
-    $view_id = $request->attributes->get('view_id');
-    $display_id = $request->attributes->get('display_id');
-
+  public function handle($view_id, $display_id, Request $request, RouteMatchInterface $route_match) {
     $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,7 +83,7 @@ public function handle(Request $request) {
     $view->initHandlers();
 
     $args = array();
-    $map = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getOption('_view_argument_map', array());
+    $map = $route_match->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.
@@ -86,17 +94,10 @@ public function handle(Request $request) {
       if (isset($map[$attribute])) {
         $attribute = $map[$attribute];
 
-        // 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);
-        }
+        $arg = $route_match->getRawParameter($attribute);
       }
       else {
-        $arg = $request->attributes->get($attribute);
+        $arg = $route_match->getParameter($attribute);
       }
 
       if (isset($arg)) {
diff --git a/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php b/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php
index d245f1c..cd6c739 100644
--- a/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php
+++ b/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php
@@ -11,6 +11,8 @@
 use Drupal\Core\DependencyInjection\ClassResolver;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Routing\RouteMatch;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerAware;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -203,12 +205,30 @@ protected function assertCallableController($controller, $class, $output) {
     $this->assertSame($output, call_user_func($controller));
   }
 
+  /**
+   * Tests getArguments with a route match and a request.
+   *
+   * @covers ::getArguments
+   * @covers ::doGetArguments
+   */
+  public function testGetArgumentsWithRouteMatchAndRequest() {
+    $request = Request::create('/test');
+    $mock_controller = new MockController();
+    $arguments = $this->controllerResolver->getArguments($request, [$mock_controller, 'getControllerWithRequestAndRouteMatch']);
+    $this->assertEquals([RouteMatch::createFromRequest($request), $request], $arguments);
+  }
+
 }
 
 class MockController {
   public function getResult() {
     return 'This is a regular controller.';
   }
+
+  public function getControllerWithRequestAndRouteMatch(RouteMatchInterface $route_match, Request $request) {
+    return 'this is another example controller';
+  }
+
 }
 class MockContainerInjection implements ContainerInjectionInterface {
   protected $result;
