diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
index f28906f..2069717b 100644
--- a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
+++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
@@ -12,8 +12,7 @@
 use Drupal\Core\Entity\EntityManager;
 
 /**
- * This class allows the upcasting of entity ids to the respective entity
- * object.
+ * Allows upcasting of entity ids to the respective entity object.
  */
 class EntityConverter implements ParamConverterInterface {
 
@@ -39,9 +38,9 @@ public function __construct(EntityManager $entityManager) {
    *
    * If there is a type denoted in the route options it will try to upcast to
    * it, if there is no definition in the options it will try to upcast to an
-   * entity type of that name. If the chosen enity type does not exists it will
+   * entity type of that name. If the chosen entity type does not exist it will
    * leave the variable untouched.
-   * If the entity type exist, but there is no entity with the given id it will
+   * If the entity type exists, but there is no entity with the given id it will
    * convert the variable to NULL.
    *
    * Example:
@@ -57,49 +56,46 @@ 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 $defaults
+   *   The getRouteDefaults array.
    * @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.
+   *   An associative array of variables which have already been converted keyed
+   *   by variable name.
    */
-  public function process(array &$variables, Route $route, array &$converted) {
+  public function process(array $defaults, Route $route, array &$converted) {
     $variable_names = $route->compile()->getVariables();
 
     $options = $route->getOptions();
-    $configuredTypes = isset($options['converters']) ? $options['converters'] : array();
+    $configured_types = isset($options['converters']) ? $options['converters'] : array();
 
-    $entityTypes = array_keys($this->entityManager->getDefinitions());
+    $entity_types = array_keys($this->entityManager->getDefinitions());
 
     foreach ($variable_names as $name) {
-      // Do not process this variable if it's already marked as converted.
-      if (in_array($name, $converted)) {
+      // Do not process this variable if it is already been converted.
+      if (array_key_exists($name, $converted)) {
         continue;
       }
 
       // Obtain entity type to convert to from the route configuration or just
       // use the variable name as default.
-      if (array_key_exists($name, $configuredTypes)) {
-        $type = $configuredTypes[$name];
+      if (array_key_exists($name, $configured_types)) {
+        $type = $configured_types[$name];
       }
       else {
         $type = $name;
       }
 
-      if (in_array($type, $entityTypes)) {
-        $value = $variables[$name];
+      if (in_array($type, $entity_types)) {
+        $value = $defaults[$name];
 
-        $storageController = $this->entityManager->getStorageController($type);
-        $entities = $storageController->load(array($value));
+        $storage_controller = $this->entityManager->getStorageController($type);
+        $entities = $storage_controller->load(array($value));
 
         // 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;
       }
     }
   }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
index 74307c2..e195c16 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
@@ -17,13 +17,14 @@
   /**
    * Allows to convert variables to their corresponding objects.
    *
-   * @param array &$variables
-   *   Array of values to convert to their corresponding objects, if applicable.
+   * @param array $defaults
+   *   The getRouteDefaults array.
    * @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.
+   *   An associative array of variables which have already been converted keyed
+   *   by variable name.
    */
-  public function process(array &$variables, Route $route, array &$converted);
+  public function process(array $defaults, Route $route, array &$converted);
+
 }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
index be5676e..b08de10 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
@@ -12,14 +12,14 @@
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
 
 use Drupal\Core\ParamConverter\ParamConverterInterface;
 
 /**
- * Provides a service which allows to enhance (say alter) the arguments coming
- * from the URL.
+ * Provides a service which allows to enhance (say alter) the URL arguments.
  *
- * A typical use case for this would be upcasting a node id to a node entity.
+ * A typical use case for this would be upcasting a node id to a node object.
  *
  * This class will not enhance any of the arguments itself, but allow other
  * services to register to do so.
@@ -40,6 +40,9 @@ class ParamConverterManager implements RouteEnhancerInterface {
    *
    * @param \Drupal\Core\ParamConverter\ParamConverterInterface $converter
    *   The converter to add.
+   *
+   * @return \Drupal\Core\ParamConverter\ParamConverterManager
+   *   The param converter object for chaining.
    */
   public function addConverter(ParamConverterInterface $converter) {
     $this->converters[] = $converter;
@@ -47,10 +50,7 @@ public function addConverter(ParamConverterInterface $converter) {
   }
 
   /**
-   * Implements \Symfony\Cmf\Component\Routing\Enhancer\ŖouteEnhancerIterface.
-   *
-   * Iterates over all registered converters and allows them to alter the
-   * defaults.
+   * Implements \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface.
    *
    * @param array $defaults
    *   The getRouteDefaults array.
@@ -59,31 +59,39 @@ public function addConverter(ParamConverterInterface $converter) {
    *
    * @return array
    *   The modified defaults.
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+   *   If one or more variables have been upast to NULL.
    */
   public function enhance(array $defaults, Request $request) {
+    $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
+
     // 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
+    // 1. It might prevent converters later in the pipeline from processing
     //    a variable again.
-    // 2. To check if upcasting was successfull after each converter had
+    // 2. To check if upcasting was successful after each converter had
     //    a go. See below.
-    $converters = array();
-
-    $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
+    $converted = array();
 
+    // Give each each param converter a chance to alter the variables.
+    $variable_names = array_flip($route->compile()->getVariables());
     foreach ($this->converters as $converter) {
-      $converter->process($defaults, $route, $converters);
+      $converter->process($defaults, $route, $converted);
+
+      // Param converters are only allowed to upcast actual variables. Filter out
+      // any unwanted return values.
+      $converted = array_intersect_key($converted, $variable_names);
     }
 
-    // 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();
-      }
+    // Return a 404 if one or more values have been upcast to NULL.
+    if (in_array(NULL, $converted, TRUE)) {
+      throw new NotFoundHttpException();
     }
 
-    return $defaults;
+    // Return the defaults array after merging it with the upcast values.
+    return array_merge($defaults, $converted);
   }
+
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php b/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php
index 14a0422..860eaae 100644
--- a/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php
@@ -13,7 +13,7 @@
 use Drupal\simpletest\WebTestBase;
 
 /**
- * Web tests for the upcasting.
+ * Web tests for upcasting.
  */
 class UpcastingTest extends WebTestBase {
 
@@ -33,11 +33,11 @@ public static function getInfo() {
   /**
    * Confirms that all parameters are converted as expected.
    *
-   * All of these requests end up being proccessed by a controller with this
-   * the signature: f($user, $node, $foo) returning either values or labels
-   * like "user: Dries, node: First post, foo: bar"
+   * All of these requests end up being proccessed by a controller with the
+   * signature testUserNodeFoo($user, $node, $foo) returning either values or
+   * labels like "user: Dries, node: First post, foo: bar".
    *
-   * The tests shuffle the parameters around an checks if the right thing is
+   * The tests shuffle the parameters around and check if the right things are
    * happening.
    */
   public function testUpcasting() {
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php
index 2a15977..3f8e18e 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php
@@ -62,15 +62,15 @@ 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 $defaults
+   *   The getRouteDefaults array.
    * @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.
+   *   An associative array of variables which have already been converted keyed
+   *   by variable name.
    */
-  public function process(array &$variables, Route $route, array &$converted) {
+  public function process(array $defaults, Route $route, array &$converted) {
     // If nothing was specified to convert, return.
     $options = $route->getOptions();
     if (!isset($options['tempstore'])) {
@@ -79,27 +79,26 @@ public function process(array &$variables, Route $route, array &$converted) {
 
     foreach ($options['tempstore'] as $name => $collection) {
       // Only convert if the variable is a view.
-      if ($variables[$name] instanceof ViewStorageInterface) {
+      if (isset($converted[$name]) && $converted[$name] instanceof ViewStorageInterface) {
         // Get the temp store for this variable if it needs one.
         // Attempt to load the view from the temp store, synchronize its
         // status with the existing view, and store the lock metadata.
-        if ($collection && ($temp_store = $this->tempStoreFactory->get($collection)) && ($view = $temp_store->get($variables[$name]->id()))) {
-          if ($variables[$name]->status()) {
+        if ($collection && ($temp_store = $this->tempStoreFactory->get($collection)) && ($view = $temp_store->get($converted[$name]->id()))) {
+          if ($converted[$name]->status()) {
             $view->enable();
           }
           else {
             $view->disable();
           }
-          $view->locked = $temp_store->getMetadata($variables[$name]->id());
+          $view->locked = $temp_store->getMetadata($converted[$name]->id());
         }
         // Otherwise, decorate the existing view for use in the UI.
         else {
-          $view = new ViewUI($variables[$name]);
+          $view = new ViewUI($converted[$name]);
         }
 
-        // Store the new view and mark this variable as converted.
-        $variables[$name] = $view;
-        $converted[] = $name;
+        // Store the new view.
+        $converted[$name] = $view;
       }
     }
   }
