diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php
index 385f198..5cd778c 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,46 @@ protected function createController($controller) {
     return array($controller, $method);
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * Change the way how the controller resolver work, by just passing in the
+   * upcasted values, if there is a type hinting.
+   */
+  protected function doGetArguments(Request $request, $controller, array $parameters) {
+    $attributes = $request->attributes->all();
+    $arguments = array();
+    foreach ($parameters as $param) {
+      if (array_key_exists($param->name, $attributes)) {
+        if ($param->getClass()) {
+          $arguments[] = $attributes['_converted_' . $param->name];
+        }
+        else {
+          $arguments[] = $attributes[$param->name];
+        }
+      }
+      elseif ($param->getClass() && $param->getClass()->isInstance($request)) {
+        $arguments[] = $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));
+      }
+    }
+
+    return $arguments;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityAccessCheck.php b/core/lib/Drupal/Core/Entity/EntityAccessCheck.php
index f55567e..eb5766c 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->has('_converted_' . $entity_type)) {
+      $entity = $request->attributes->get('_converted_' . $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..b79fd90 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->has('_converted_' . $entity_type)) {
+      $entity = $request->attributes->get('_converted_' . $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 f28906f..1baf99a 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.
@@ -96,11 +98,11 @@ public function process(array &$variables, Route $route, array &$converted) {
 
         // Make sure $entities is null, if upcasting fails.
         $entity = $entities ? reset($entities) : NULL;
-        $variables[$name] = $entity;
-
-        // Mark this variable as converted.
-        $converted[] = $name;
+        $converted[$name] = $entity;
       }
     }
+
+    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..68f1bf2 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
@@ -29,7 +29,7 @@ class ParamConverterManager implements RouteEnhancerInterface {
   /**
    * Converters managed by the ParamConverterManager.
    *
-   * @var array
+   * @var \Drupal\Core\ParamConverter\ParamConverterInterface[]
    */
   protected $converters;
 
@@ -68,19 +68,20 @@ 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();
 
     $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
 
     foreach ($this->converters as $converter) {
-      $converter->process($defaults, $route, $converters);
-    }
-
-    // Check if all upcasting yielded a result.
-    // If an upcast value is NULL do a 404.
-    foreach ($converters as $variable) {
-      if ($defaults[$variable] === NULL) {
-        throw new NotFoundHttpException();
+      $converted = $converter->process($defaults, $route);
+      foreach ($converted as $key => $value) {
+        // Check if all upcasting yielded a result.
+        // If an upcast value is NULL do a 404.
+        if ($value === NULL) {
+          throw new NotFoundHttpException();
+        }
+        else {
+          $defaults['_converted_' . $key] = $value;
+        }
       }
     }
 
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
index e139d0e..334d2a3 100644
--- a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
@@ -49,7 +49,7 @@ public function accessEditEntityField(EntityInterface $entity, $field_name) {
    */
   protected function validateAndUpcastRequestAttributes(Request $request) {
     // Load the entity.
-    if (!is_object($entity = $request->attributes->get('entity'))) {
+    if (!is_object($entity = $request->attributes->get('_converted_entity'))) {
       $entity_id = $entity;
       $entity_type = $request->attributes->get('entity_type');
       if (!$entity_type || !entity_get_info($entity_type)) {
@@ -59,7 +59,8 @@ protected function validateAndUpcastRequestAttributes(Request $request) {
       if (!$entity) {
         throw new NotFoundHttpException();
       }
-      $request->attributes->set('entity', $entity);
+      // @todo Why does the field access check converts the parameters.
+      $request->attributes->set('_converted_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..20c6912 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_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..beeaf6f 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_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..c1cc60d 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_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..72ebe4d 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_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;
   }
 
 }
