diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php
index 385f198..7d39389 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 Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
 use Symfony\Component\HttpKernel\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
@@ -98,4 +99,21 @@ protected function createController($controller) {
     return array($controller, $method);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function doGetArguments(Request $request, $controller, array $parameters) {
+    $arguments = parent::doGetArguments($request, $controller, $parameters);
+    if ($request->attributes->has('_raw') && $raw = $request->attributes->get('_raw')->all()) {
+      foreach ($parameters as $parameter) {
+        // Use the raw value if a parameter has no typehint.
+        if (!$parameter->getClass()) {
+          $position = $parameter->getPosition();
+          $arguments[$position] = $raw[$parameter->name];
+        }
+      }
+    }
+    return $arguments;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
index be5676e..c1d4b67 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
@@ -10,6 +10,7 @@
 use Symfony\Component\DependencyInjection\ContainerAware;
 use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\HttpFoundation\ParameterBag;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -68,17 +69,23 @@ public function enhance(array $defaults, Request $request) {
     //    a variable again.
     // 2. To check if upcasting was successfull after each converter had
     //    a go. See below.
-    $converters = array();
+    $converted = array();
 
     $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
 
+    // Store a backup of the raw request attributes.
+    $backup = $defaults;
     foreach ($this->converters as $converter) {
-      $converter->process($defaults, $route, $converters);
+      $converter->process($defaults, $route, $converted);
     }
 
+    // Keep the copies the raw values of things that were converted.
+    $backup = array_intersect_key($backup, array_flip($converted));
+    $defaults['_raw'] = new ParameterBag($backup);
+
     // Check if all upcasting yielded a result.
     // If an upcast value is NULL do a 404.
-    foreach ($converters as $variable) {
+    foreach ($converted as $variable) {
       if ($defaults[$variable] === NULL) {
         throw new NotFoundHttpException();
       }
diff --git a/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php b/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php
index ca95200..d3060e6 100644
--- a/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php
+++ b/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php
@@ -8,13 +8,14 @@
 namespace Drupal\paramconverter_test;
 
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\user\UserInterface;
 
 /**
  * Controller routine for testing the paramconverter.
  */
 class TestControllers {
 
-  public function testUserNodeFoo($user, $node, $foo) {
+  public function testUserNodeFoo(UserInterface $user, $node, $foo) {
     $retval = "user: " . (is_object($user) ? $user->label() : $user);
     $retval .= ", node: " . (is_object($node) ? $node->label() : $node);
     $retval .= ", foo: " . (is_object($foo) ? $foo->label() : $foo);
diff --git a/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php b/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php
new file mode 100644
index 0000000..5ecc270
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Controller\ControllerResolverTest.
+ */
+
+namespace Drupal\Tests\Core\Controller;
+
+use Drupal\Core\Controller\ControllerResolver;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\user\UserInterface;
+use Guzzle\Http\Message\Request;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+
+/**
+ * Tests that the Drupal-extended ControllerResolver is functioning properly.
+ *
+ * @see \Drupal\Core\Controller\ControllerResolver
+ */
+class ControllerResolverTest extends UnitTestCase {
+
+  /**
+   * The tested controller resolver.
+   *
+   * @var \Drupal\Core\Controller\ControllerResolver
+   */
+  public $controllerResolver;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Controller Resolver tests',
+      'description' => 'Tests that the Drupal-extended ControllerResolver is functioning properly.',
+      'group' => 'Routing',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $container = new ContainerBuilder();
+    $this->controllerResolver = new ControllerResolver($container);
+  }
+
+  /**
+   * Tests getArguments().
+   *
+   * Ensure that doGetArguments uses converted arguments if available.
+   *
+   * @see \Drupal\Core\Controller\ControllerResolver::getArguments()
+   * @see \Drupal\Core\Controller\ControllerResolver::doGetArguments()
+   */
+  public function testGetArguments() {
+    $controller = function(EntityInterface $entity, $user) {
+    };
+    $mock_entity = $this->getMockBuilder('Drupal\Core\Entity\Entity')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $mock_account = $this->getMock('Drupal\Core\Session\AccountInterface');
+    $request = new \Symfony\Component\HttpFoundation\Request(array(), array(), array(
+      'entity' => $mock_entity,
+      'user' => $mock_account,
+      '_raw' => new ParameterBag(array('entity' => 1, 'user' => 1)),
+    ));
+    $arguments = $this->controllerResolver->getArguments($request, $controller);
+
+    $this->assertEquals($mock_entity, $arguments[0], 'Type hinted variables used no upcasted values.');
+    $this->assertEquals(1, $arguments[1], 'Not type hinted variables used upcasted values.');
+  }
+
+}
