diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index 94d0e57..4c2a367 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -985,7 +985,10 @@ function menu_item_route_access(Route $route, $href, &$map) {
     if (isset($path_bits[$index]) && preg_match('/{(?<placeholder>.*)}/', $path_bits[$index], $matches)) {
       // If that placeholder is present on the request attributes, replace the
       // placeholder in the map with the value.
-      if ($request->attributes->has($matches['placeholder'])) {
+      if ($request->attributes->get('converted')->has($matches['placeholder'])) {
+        $map[$index] = $request->attributes->get('converted')->get($matches['placeholder']);
+      }
+      elseif ($request->attributes->has($matches['placeholder'])) {
         $map[$index] = $request->attributes->get($matches['placeholder']);
       }
     }
diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php
index 385f198..5c3537a 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,24 @@ 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('converted')) {
+      return $arguments;
+    }
+
+    $converted = $request->attributes->get('converted')->all();
+    foreach ($parameters as $parameter) {
+      // Use the converted/upcast value if a parameter has a typehint.
+      if ($parameter->getClass() && isset($converted[$parameter->name])) {
+        $position = $parameter->getPosition();
+        $arguments[$position] = $converted[$parameter->name];
+      }
+    }
+    return $arguments;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityAccessCheck.php b/core/lib/Drupal/Core/Entity/EntityAccessCheck.php
index f55567e..7b91561 100644
--- a/core/lib/Drupal/Core/Entity/EntityAccessCheck.php
+++ b/core/lib/Drupal/Core/Entity/EntityAccessCheck.php
@@ -42,8 +42,8 @@ public function access(Route $route, Request $request) {
     $requirement = $route->getRequirement('_entity_access');
     list($entity_type, $operation) = explode('.', $requirement);
     // If there is valid entity of the given entity type, check its access.
-    if ($request->attributes->has($entity_type)) {
-      $entity = $request->attributes->get($entity_type);
+    if ($request->attributes->get('converted')->has($entity_type)) {
+      $entity = $request->attributes->get('converted')->get($entity_type);
       if ($entity instanceof EntityInterface) {
         return $entity->access($operation);
       }
diff --git a/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php b/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php
index 8f62a40..be28296 100644
--- a/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php
@@ -52,8 +52,8 @@ protected function getFormObject(Request $request, $form_arg) {
     $form_arg .= '.default';
     list ($entity_type, $operation) = explode('.', $form_arg);
 
-    if ($request->attributes->has($entity_type)) {
-      $entity = $request->attributes->get($entity_type);
+    if ($request->attributes->get('converted')->has($entity_type)) {
+      $entity = $request->attributes->get('converted')->get($entity_type);
     }
     else {
       $entity = $manager->getStorageController($entity_type)->create(array());
diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
index 50b7d7c..0324a3b 100644
--- a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
+++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
@@ -57,21 +57,23 @@ public function __construct(EntityManager $entityManager) {
    * It will not process variables which are marked as converted. It will mark
    * any variable it processes as converted.
    *
-   * @param array &$variables
-   *   Array of values to convert to their corresponding objects, if applicable.
+   * @param array $variables
+   *   Array of original values to convert to their corresponding objects,
+   *   if applicable.
    * @param \Symfony\Component\Routing\Route $route
    *   The route object.
-   * @param array &$converted
-   *   Array collecting the names of all variables which have been
-   *   altered by a converter.
+   *
+   * @return array
+   *   The converted values.
    */
-  public function process(array &$variables, Route $route, array &$converted) {
+  public function process(array $variables, Route $route) {
     $variable_names = $route->compile()->getVariables();
 
     $options = $route->getOptions();
     $configuredTypes = isset($options['converters']) ? $options['converters'] : array();
 
     $entityTypes = array_keys($this->entityManager->getDefinitions());
+    $converted = array();
 
     foreach ($variable_names as $name) {
       // Do not process this variable if it's already marked as converted.
@@ -92,12 +94,11 @@ public function process(array &$variables, Route $route, array &$converted) {
         $value = $variables[$name];
 
         $storageController = $this->entityManager->getStorageController($type);
-        $entity = $storageController->load($value);
-        $variables[$name] = $entity;
-
-        // Mark this variable as converted.
-        $converted[] = $name;
+        $converted[$name] = $storageController->load($value);
       }
     }
+
+    return $converted;
   }
+
 }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
index 74307c2..aef511c 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
@@ -17,13 +17,15 @@
   /**
    * Allows to convert variables to their corresponding objects.
    *
-   * @param array &$variables
-   *   Array of values to convert to their corresponding objects, if applicable.
+   * @param array $variables
+   *   Array of original values to convert to their corresponding objects,
+   *   if applicable.
    * @param \Symfony\Component\Routing\Route $route
    *   The route object.
-   * @param array &$converted
-   *   Array collecting the names of all variables which have been
-   *   altered by a converter.
+   *
+   * @return array
+   *   The converted values.
    */
-  public function process(array &$variables, Route $route, array &$converted);
+  public function process(array $variables, Route $route);
+
 }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
index be5676e..e7c14ac 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;
 
@@ -29,7 +30,7 @@ class ParamConverterManager implements RouteEnhancerInterface {
   /**
    * Converters managed by the ParamConverterManager.
    *
-   * @var array
+   * @var \Drupal\Core\ParamConverter\ParamConverterInterface[]
    */
   protected $converters;
 
@@ -61,25 +62,18 @@ public function addConverter(ParamConverterInterface $converter) {
    *   The modified defaults.
    */
   public function enhance(array $defaults, Request $request) {
-    // This array will collect the names of all variables which have been
-    // altered by a converter.
-    // This serves two purposes:
-    // 1. It might prevent converters later in the pipeline to process
-    //    a variable again.
-    // 2. To check if upcasting was successfull after each converter had
-    //    a go. See below.
-    $converters = array();
-
     $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
-
+    $defaults['converted'] = new ParameterBag();
     foreach ($this->converters as $converter) {
-      $converter->process($defaults, $route, $converters);
+      // Invoke every parameter converter and add its return values to the
+      // array of converted variables.
+      $defaults['converted']->add($converter->process($defaults, $route));
     }
 
-    // Check if all upcasting yielded a result.
-    // If an upcast value is NULL do a 404.
-    foreach ($converters as $variable) {
-      if ($defaults[$variable] === NULL) {
+    // Check if all upcasting yielded a result. If an upcast value is NULL
+    // return a 404.
+    foreach ($defaults['converted'] as $value) {
+      if ($value === NULL) {
         throw new NotFoundHttpException();
       }
     }
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php
index 9dfbfd1..96e1023 100644
--- a/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php
@@ -35,7 +35,7 @@ public function access(Route $route, Request $request) {
     //   http://drupal.org/node/1798214.
     $this->validateAndUpcastRequestAttributes($request);
 
-    return $this->accessEditEntity($request->attributes->get('entity'));
+    return $this->accessEditEntity($request->attributes->get('converted')->get('entity'));
   }
 
   /**
@@ -50,8 +50,8 @@ public function accessEditEntity(EntityInterface $entity) {
    */
   protected function validateAndUpcastRequestAttributes(Request $request) {
     // Load the entity.
-    if (!is_object($entity = $request->attributes->get('entity'))) {
-      $entity_id = $entity;
+    if (!$request->attributes->get('converted')->get('entity')) {
+      $entity_id = $request->attributes->get('entity');
       $entity_type = $request->attributes->get('entity_type');
       if (!$entity_type || !entity_get_info($entity_type)) {
         throw new NotFoundHttpException();
@@ -60,7 +60,7 @@ protected function validateAndUpcastRequestAttributes(Request $request) {
       if (!$entity) {
         throw new NotFoundHttpException();
       }
-      $request->attributes->set('entity', $entity);
+      $request->attributes->get('converted')->set('entity', $entity);
     }
   }
 
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
index 46b62ff..18f5b25 100644
--- a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
@@ -35,7 +35,7 @@ public function access(Route $route, Request $request) {
     //   http://drupal.org/node/1798214.
     $this->validateAndUpcastRequestAttributes($request);
 
-    return $this->accessEditEntityField($request->attributes->get('entity'), $request->attributes->get('field_name'));
+    return $this->accessEditEntityField($request->attributes->get('converted')->get('entity'), $request->attributes->get('field_name'));
   }
 
   /**
@@ -50,8 +50,8 @@ public function accessEditEntityField(EntityInterface $entity, $field_name) {
    */
   protected function validateAndUpcastRequestAttributes(Request $request) {
     // Load the entity.
-    if (!is_object($entity = $request->attributes->get('entity'))) {
-      $entity_id = $entity;
+    if (!$request->attributes->get('converted')->get('entity')) {
+      $entity_id = $request->attributes->get('entity');
       $entity_type = $request->attributes->get('entity_type');
       if (!$entity_type || !entity_get_info($entity_type)) {
         throw new NotFoundHttpException();
@@ -60,7 +60,7 @@ protected function validateAndUpcastRequestAttributes(Request $request) {
       if (!$entity) {
         throw new NotFoundHttpException();
       }
-      $request->attributes->set('entity', $entity);
+      $request->attributes->get('converted')->set('entity', $entity);
     }
 
     // Validate the field name and language.
diff --git a/core/modules/filter/lib/Drupal/filter/Access/FilterAccessCheck.php b/core/modules/filter/lib/Drupal/filter/Access/FilterAccessCheck.php
index 39363ac..c447147 100644
--- a/core/modules/filter/lib/Drupal/filter/Access/FilterAccessCheck.php
+++ b/core/modules/filter/lib/Drupal/filter/Access/FilterAccessCheck.php
@@ -27,7 +27,7 @@ public function applies(Route $route) {
    * {@inheritdoc}
    */
   public function access(Route $route, Request $request) {
-    if ($format = $request->attributes->get('filter_format')) {
+    if ($format = $request->attributes->get('converted')->get('filter_format')) {
       // Handle special cases up front. All users have access to the fallback
       // format.
       if ($format->format == filter_fallback_format()) {
diff --git a/core/modules/filter/lib/Drupal/filter/Access/FormatDisableCheck.php b/core/modules/filter/lib/Drupal/filter/Access/FormatDisableCheck.php
index de5acea..eab9db2 100644
--- a/core/modules/filter/lib/Drupal/filter/Access/FormatDisableCheck.php
+++ b/core/modules/filter/lib/Drupal/filter/Access/FormatDisableCheck.php
@@ -27,7 +27,7 @@ public function applies(Route $route) {
    * Implements \Drupal\Core\Access\AccessCheckInterface::access().
    */
   public function access(Route $route, Request $request) {
-    if ($format = $request->attributes->get('filter_format')) {
+    if ($format = $request->attributes->get('converted')->get('filter_format')) {
       return user_access('administer filters') && ($format->format != filter_fallback_format());
     }
 
diff --git a/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php b/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php
index f4438e7..4df0d40 100644
--- a/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php
+++ b/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php
@@ -27,7 +27,7 @@ public function applies(Route $route) {
    * {@inheritdoc}
    */
   public function access(Route $route, Request $request) {
-    if (user_access('administer menu') && $menu_link = $request->attributes->get('menu_link')) {
+    if (user_access('administer menu') && $menu_link = $request->attributes->get('converted')->get('menu_link')) {
       // Links defined via hook_menu may not be deleted. Updated items are an
       // exception, as they can be broken.
       return $menu_link->module !== 'system' || $menu_link->updated;
diff --git a/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php b/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php
index ef00dd0..42c3f6a 100644
--- a/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php
+++ b/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php
@@ -27,7 +27,7 @@ public function applies(Route $route) {
    * {@inheritdoc}
    */
   public function access(Route $route, Request $request) {
-    if (user_access('administer menu') && $menu = $request->attributes->get('menu')) {
+    if (user_access('administer menu') && $menu = $request->attributes->get('converted')->get('menu')) {
       // System-defined menus may not be deleted.
       $system_menus = menu_list_system_menus();
       return !isset($system_menus[$menu->id()]);
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/modules/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php b/core/modules/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php
index f828de1..d874747 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php
@@ -62,21 +62,23 @@ public function __construct(TempStoreFactory $temp_store_factory) {
    * It will still process variables which are marked as converted. It will mark
    * any variable it processes as converted.
    *
-   * @param array &$variables
-   *   Array of values to convert to their corresponding objects, if applicable.
+   * @param array $variables
+   *   Array of original values to convert to their corresponding objects,
+   *   if applicable.
    * @param \Symfony\Component\Routing\Route $route
    *   The route object.
-   * @param array &$converted
-   *   Array collecting the names of all variables which have been
-   *   altered by a converter.
+   *
+   * @return array
+   *   The converted values.
    */
-  public function process(array &$variables, Route $route, array &$converted) {
+  public function process(array $variables, Route $route) {
     // If nothing was specified to convert, return.
     $options = $route->getOptions();
     if (!isset($options['tempstore'])) {
-      return;
+      return array();
     }
 
+    $converted = array();
     foreach ($options['tempstore'] as $name => $collection) {
       // Only convert if the variable is a view.
       if ($variables[$name] instanceof ViewStorageInterface) {
@@ -98,10 +100,11 @@ public function process(array &$variables, Route $route, array &$converted) {
         }
 
         // Store the new view and mark this variable as converted.
-        $variables[$name] = $view;
-        $converted[] = $name;
+        $converted[$name] = $view;
       }
     }
+
+    return $converted;
   }
 
 }
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..36b9c9d
--- /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' => 1,
+      'user' => 1,
+      'converted' => new ParameterBag(array('entity' => $mock_entity, 'user' => $mock_account)),
+    ));
+    $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.');
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php
index 895a198..6528346 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php
@@ -7,7 +7,9 @@
 
 namespace Drupal\Tests\Core\Entity;
 
+use Symfony\Component\HttpFoundation\ParameterBag;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
 use Symfony\Component\Routing\Route;
 use Drupal\Core\Entity\EntityAccessCheck;
 use Drupal\Tests\UnitTestCase;
@@ -65,7 +67,7 @@ public function testAccess() {
       ->method('access')
       ->will($this->returnValue(TRUE));
     $access_check = new EntityAccessCheck();
-    $request->attributes->set('node', $node);
+    $request->attributes->set('converted', new ParameterBag(array('node' => $node)));
     $access = $access_check->access($route, $request);
     $this->assertEquals(TRUE, $access);
   }
diff --git a/core/tests/Drupal/Tests/Core/ParamConverter/ParamConverterManagerTest.php b/core/tests/Drupal/Tests/Core/ParamConverter/ParamConverterManagerTest.php
new file mode 100644
index 0000000..3afbcaf
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/ParamConverter/ParamConverterManagerTest.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\ParamConverter\paramConverterManagerTest.
+ */
+
+namespace Drupal\Tests\Core\ParamConverter;
+
+use Drupal\Core\ParamConverter\ParamConverterManager;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Tests the param converter manager.
+ *
+ * @see \Drupal\Core\ParamConverter\ParamConverterManager
+ */
+class ParamConverterManagerTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\Core\ParamConverter\ParamConverterManager
+   */
+  public $paramConverterManager;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Parameter converter manager',
+      'description' => 'Tests the param converter manager.',
+      'group' => 'Routing',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->paramConverterManager = new ParamConverterManager();
+  }
+
+  /**
+   * Tests the enhance method.
+   *
+   * @see \Drupal\Core\ParamConverter\ParamConverterManager::enhance().
+   */
+  public function testEnhance() {
+    $defaults = array();
+
+    // Setup the defaults.
+    $route = new Route('/test');
+    $defaults[RouteObjectInterface::ROUTE_OBJECT] = $route;
+    $defaults['test'] = 123;
+    $converted_value = new \stdClass();
+
+    $converter = $this->getMock('Drupal\Core\ParamConverter\ParamConverterInterface');
+    $converter->expects($this->once())
+      ->method('process')
+      ->will($this->returnValue(array('test' => $converted_value)));
+
+    $this->paramConverterManager->addConverter($converter);
+
+    $request = new Request();
+    $result = $this->paramConverterManager->enhance($defaults, $request);
+
+    $this->assertEquals($converted_value, $result['converted']->get('test'));
+  }
+
+  /**
+   * Tests the enhance method if a parameter was not converted.
+   *
+   * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+   *
+   * @see \Drupal\Core\ParamConverter\ParamConverterManager::enhance().
+   */
+  public function testEnhanceNotConverted() {
+    $defaults = array();
+
+    // Setup the defaults.
+    $route = new Route('/test');
+    $defaults[RouteObjectInterface::ROUTE_OBJECT] = $route;
+    $defaults['test'] = 123;
+
+    $converter = $this->getMock('Drupal\Core\ParamConverter\ParamConverterInterface');
+    $converter->expects($this->once())
+      ->method('process')
+      ->will($this->returnValue(array('test' => NULL)));
+
+    $this->paramConverterManager->addConverter($converter);
+
+    $request = new Request();
+    $this->paramConverterManager->enhance($defaults, $request);
+  }
+
+
+}
