diff --git a/core/core.services.yml b/core/core.services.yml
index 18e37f9..62f3c5b 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -386,11 +386,16 @@ services:
     tags:
       - { name: event_subscriber }
     arguments: ['@module_handler']
+  resolver_manager.entity:
+    class: Drupal\Core\Entity\EntityResolverManager
+    arguments: ['@entity.manager', '@controller_resolver']
+    calls:
+      - [setContainer, ['@service_container']]
   route_subscriber.entity:
     class: Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber
     tags:
       - { name: event_subscriber }
-    arguments: ['@entity.manager']
+    arguments: ['@resolver_manager.entity']
   reverse_proxy_subscriber:
     class: Drupal\Core\EventSubscriber\ReverseProxySubscriber
     tags:
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 18b978f..d7200d2 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -597,6 +597,9 @@ public function getTranslationFromContext(EntityInterface $entity, $langcode = N
       // Return the most fitting entity translation.
       foreach ($candidates as $candidate) {
         if ($entity->hasTranslation($candidate)) {
+          debug($candidates);
+          debug($candidate);
+          debug('next');
           $translation = $entity->getTranslation($candidate);
           break;
         }
diff --git a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
index ce964ab..8775372 100644
--- a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
@@ -251,7 +251,7 @@ public function getTranslationFromContext(EntityInterface $entity, $langcode = N
    *   Returns the entity type object, or NULL if the entity type ID is invalid
    *   and $exception_on_invalid is TRUE.
    *
-   * @throws \InvalidArgumentException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
    *   Thrown if $entity_type_id is invalid and $exception_on_invalid is TRUE.
    */
   public function getDefinition($entity_type_id, $exception_on_invalid = FALSE);
diff --git a/core/lib/Drupal/Core/Entity/EntityResolverManager.php b/core/lib/Drupal/Core/Entity/EntityResolverManager.php
new file mode 100644
index 0000000..2531b7d
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityResolverManager.php
@@ -0,0 +1,211 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\EntityResolverManager.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\Core\Controller\ControllerResolverInterface;
+use Symfony\Component\DependencyInjection\ContainerAware;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Sets the entity parameter converter options automatically.
+ *
+ * If the user specified an interface for the variable the upcasting is done
+ * automatically.
+ */
+class EntityResolverManager extends ContainerAware {
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The controller resolver.
+   *
+   * @var \Drupal\Core\Controller\ControllerResolverInterface
+   */
+  protected $controllerResolver;
+
+  /**
+   * Constructs a new EntityRouteAlterSubscriber.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Controller\ControllerResolverInterface $controller_resolver
+   *   The controller resolver.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, ControllerResolverInterface $controller_resolver) {
+    $this->entityManager = $entity_manager;
+    $this->controllerResolver = $controller_resolver;
+  }
+
+  /**
+   * Creates an controller instance out of route defaults.
+   *
+   * By design we cannot support all possible routes, but just the ones which
+   * use the patterns provided by core.
+   *
+   * @param array $defaults
+   *   The default values provided by the route.
+   *
+   * @return array|null
+   *   Returns the controller instance if it is possible to figure out,
+   *   otherwise NULL.
+   */
+  protected function getController(array $defaults) {
+    $controller = NULL;
+    if (isset($defaults['_content'])) {
+      $controller = $this->controllerResolver->getControllerFromDefinition($defaults['_content']);
+    }
+    if (isset($defaults['_controller'])) {
+      $controller = $this->controllerResolver->getControllerFromDefinition($defaults['_controller']);
+    }
+    // @todo https://drupal.org/node/2165475 would make it easier now.
+    if (isset($defaults['_form'])) {
+      $form_arg = $defaults['_form'];
+      if (class_exists($form_arg)) {
+        if (is_subclass_of($form_arg, 'Drupal\Core\DependencyInjection\ContainerInjectionInterface')) {
+          $controller = array($form_arg::create($this->container), 'buildForm');
+        }
+        else {
+          $controller = array(new $form_arg, 'buildForm');
+        }
+
+      }
+    }
+    return $controller;
+  }
+
+  /**
+   * Sets the upcasting information using reflection.
+   *
+   * @param array $controller
+   *   An array of class instance and method name.
+   * @param \Symfony\Component\Routing\Route $route
+   *   The route object.
+   *
+   * @return bool
+   *   Returns TRUE if the upcasting parameters could be set, otherwise FALSE.
+   */
+  protected function setParametersFromReflection(array $controller, Route $route) {
+    $reflection = new \ReflectionMethod($controller[0], $controller[1]);
+    $parameters = $reflection->getParameters();
+    $entity_types = $this->getEntityTypes();
+    $result = FALSE;
+
+    $parameter_definitions = $route->getOption('parameters') ?: array();
+    foreach ($parameters as $parameter) {
+      $parameter_name = $parameter->getName();
+      // If the parameter name matches with an entity type try to set the
+      // upcasting information automatically. Therefore take into account that
+      // the user has specified some interface, so the upasting is intended.
+      // @todo It would be also possible to not rely on the variable name at all
+      //   so for example also upcast NodeInterface $cat automatically.
+      if (isset($entity_types[$parameter_name])) {
+        $entity_type = $entity_types[$parameter_name];
+        $entity_class = $entity_type->getClass();
+        if (!($reflection_class = $parameter->getClass())) {
+          continue;
+        }
+        if (is_subclass_of($entity_class, $reflection_class->name) || $entity_class == $reflection_class->name) {
+          if (!isset($parameter_definitions[$parameter_name])) {
+            $parameter_definitions[$parameter_name] = array();
+          }
+          $parameter_definitions[$parameter_name] += array(
+            'type' => 'entity:' . $parameter_name,
+          );
+          $result = TRUE;
+        }
+      }
+    }
+    if (!empty($parameter_definitions)) {
+      $route->setOption('parameters', $parameter_definitions);
+    }
+    return $result;
+  }
+
+  /**
+   * Sets the upcasting information using _entity_view, _entity_list etc.
+   *
+   * @param \Symfony\Component\Routing\Route $route
+   *   The route object.
+   */
+  protected function setParametersFromEntityInformation(Route $route) {
+    if ($entity_view = $route->getDefault('_entity_view')) {
+      list($entity_type, ) = explode('.', $entity_view);
+    }
+    elseif ($entity_list = $route->getDefault('_entity_list')) {
+      $entity_type = $entity_list;
+    }
+    elseif ($entity_form = $route->getDefault('_entity_form')) {
+      list($entity_type, ) = explode('.', $entity_form);
+    }
+    if (isset($entity_type) && $this->entityManager->getDefinition($entity_type)) {
+      $parameter_definitions = $route->getOption('parameters') ?: array();
+
+      // First try to figure out whether there is already a parameter upcasting
+      // the same entity type already.
+      foreach ($parameter_definitions as $info) {
+        if (isset($info['type'])) {
+          list(, $parameter_entity_type) = explode(':', $info['type']);
+          if ($parameter_entity_type == $entity_type) {
+            return;
+          }
+        }
+      }
+
+      if (!isset($parameter_definitions[$entity_type])) {
+        $parameter_definitions[$entity_type] = array();
+      }
+      $parameter_definitions[$entity_type] += array(
+        'type' => 'entity:' . $entity_type,
+      );
+      if (!empty($parameter_definitions)) {
+        $route->setOption('parameters', $parameter_definitions);
+      }
+    }
+  }
+
+  /**
+   * Set the upcasting route objects.
+   *
+   * @param \Symfony\Component\Routing\Route $route
+   *   The route object to add the upcasting information onto.
+   */
+  public function setRouteOptions(Route $route) {
+    try {
+      if ($controller = $this->getController($route->getDefaults())) {
+        // Try to use reflection.
+        if ($this->setParametersFromReflection($controller, $route)) {
+          return;
+        }
+      }
+      // Try to use _entity_view, _entity_list information on the route.
+      $this->setParametersFromEntityInformation($route);
+    }
+    catch (PluginNotFoundException $e) {
+      // Tests maybe trigger non-existent entity types.
+    }
+  }
+
+  /**
+   * Returns a list of all entity types.
+   *
+   * @return \Drupal\Core\Entity\EntityTypeInterface[]
+   */
+  protected function getEntityTypes() {
+    if (!isset($this->entityTypes)) {
+      $this->entityTypes = $this->entityManager->getDefinitions();
+    }
+    return $this->entityTypes;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
index 6283dae..2e1c6cb 100644
--- a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\EventSubscriber;
 
-use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\EntityResolverManager;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Drupal\Core\Routing\RoutingEvents;
 use Drupal\Core\Routing\RouteBuildEvent;
@@ -26,20 +26,15 @@
 class EntityRouteAlterSubscriber implements EventSubscriberInterface {
 
   /**
-   * Entity manager.
    *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
    */
-  protected $entityManager;
+  protected $resolverManager;
 
   /**
-   * Constructs a new EntityRouteAlterSubscriber.
    *
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
    */
-  public function __construct(EntityManagerInterface $entity_manager) {
-    $this->entityManager = $entity_manager;
+  public function __construct(EntityResolverManager $entity_resolver_manager) {
+    $this->resolverManager = $entity_resolver_manager;
   }
 
   /**
@@ -49,22 +44,8 @@ public function __construct(EntityManagerInterface $entity_manager) {
    *   The event to process.
    */
   public function onRoutingRouteAlterSetType(RouteBuildEvent $event) {
-    $entity_types = array_keys($this->entityManager->getDefinitions());
     foreach ($event->getRouteCollection() as $route) {
-      $parameter_definitions = $route->getOption('parameters') ?: array();
-      // For all route parameter names that match an entity type, add the 'type'
-      // to the parameter definition if it's not already explicitly provided.
-      foreach (array_intersect($route->compile()->getVariables(), $entity_types) as $parameter_name) {
-        if (!isset($parameter_definitions[$parameter_name])) {
-          $parameter_definitions[$parameter_name] = array();
-        }
-        $parameter_definitions[$parameter_name] += array(
-          'type' => 'entity:' . $parameter_name,
-        );
-      }
-      if (!empty($parameter_definitions)) {
-        $route->setOption('parameters', $parameter_definitions);
-      }
+      $this->resolverManager->setRouteOptions($route);
     }
   }
 
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php
index ced4e5c..09ba17d 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php
@@ -15,6 +15,7 @@
 use Drupal\locale\LocaleConfigManager;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
 
 /**
  * Configuration mapper for configuration entities.
@@ -233,4 +234,57 @@ public function getContextualLinkGroup() {
     }
   }
 
+  /**
+   * Add entity upcasting information.
+   *
+   * @param \Symfony\Component\Routing\Route $route
+   *   The route object to add parameter conversion options to.
+   *
+   * @return \Symfony\Component\Routing\Route
+   *   The changed route.
+   */
+  protected function addEntityParameterConversion(Route $route) {
+    $parameters = $route->getOption('parameters') ?: array();
+    $parameters[$this->entityType] = array(
+      'type' => 'entity:' . $this->entityType,
+    );
+    $route->setOption('parameters', $parameters);
+    return $route;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAddRoute() {
+    return $this->addEntityParameterConversion(parent::getAddRoute());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseRoute() {
+    return $this->addEntityParameterConversion(parent::getBaseRoute());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEditRoute() {
+    return $this->addEntityParameterConversion(parent::getEditRoute());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOverviewRoute() {
+    return $this->addEntityParameterConversion(parent::getOverviewRoute());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDeleteRoute() {
+    return $this->addEntityParameterConversion(parent::getDeleteRoute());
+  }
+
 }
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php
index 8198a47..1af410f 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php
@@ -45,6 +45,13 @@ class ConfigNamesMapper extends PluginBase implements ConfigMapperInterface, Con
   protected $configMapperManager;
 
   /**
+   * The route provider.
+   *
+   * @var \Drupal\Core\Routing\RouteProviderInterface
+   */
+  protected $routeProvider;
+
+  /**
    * The base route object that the mapper is attached to.
    *
    * @return \Symfony\Component\Routing\Route
@@ -95,10 +102,9 @@ public function __construct($plugin_id, array $plugin_definition, ConfigFactoryI
     $this->configFactory = $config_factory;
     $this->localeConfigManager = $locale_config_manager;
     $this->configMapperManager = $config_mapper_manager;
+    $this->routeProvider = $route_provider;
 
     $this->setTranslationManager($translation_manager);
-
-    $this->baseRoute = $route_provider->getRouteByName($this->getBaseRouteName());
   }
 
   /**
@@ -145,6 +151,9 @@ public function getBaseRouteParameters() {
    * {@inheritdoc}
    */
   public function getBaseRoute() {
+    if (!isset($this->baseRoute)) {
+      $this->baseRoute = $this->routeProvider->getRouteByName($this->getBaseRouteName());
+    }
     return $this->baseRoute;
   }
 
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationListController.php b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationListController.php
index 5ca474d..ddca820 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationListController.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationListController.php
@@ -10,6 +10,7 @@
 use Drupal\config_translation\ConfigMapperManagerInterface;
 use Drupal\Core\Controller\ControllerBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
 /**
@@ -18,30 +19,20 @@
 class ConfigTranslationListController extends ControllerBase {
 
   /**
-   * The definition of the config mapper.
+   * The mapper manager.
    *
-   * @var array
+   * @var \Drupal\config_translation\ConfigMapperManagerInterface
    */
-  protected $mapperDefinition;
-
-  /**
-   * The config mapper.
-   *
-   * @var \Drupal\config_translation\ConfigEntityMapper
-   */
-  protected $mapper;
+  protected $mapperManager;
 
   /**
    * Constructs a new ConfigTranslationListController object.
    *
    * @param \Drupal\config_translation\ConfigMapperManagerInterface $mapper_manager
    *   The config mapper manager.
-   * @param string $config_translation_mapper
-   *   The config mapper id.
    */
-  public function __construct(ConfigMapperManagerInterface $mapper_manager, $config_translation_mapper) {
-    $this->mapperDefinition = $mapper_manager->getDefinition($config_translation_mapper);
-    $this->mapper = $mapper_manager->createInstance($config_translation_mapper, $this->mapperDefinition);
+  public function __construct(ConfigMapperManagerInterface $mapper_manager) {
+    $this->mapperManager = $mapper_manager;
   }
 
   /**
@@ -49,35 +40,39 @@ public function __construct(ConfigMapperManagerInterface $mapper_manager, $confi
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('plugin.manager.config_translation.mapper'),
-      $container->get('request')->attributes->get('_raw_variables')->get('config_translation_mapper')
+      $container->get('plugin.manager.config_translation.mapper')
     );
   }
 
   /**
    * Provides the listing page for any entity type.
    *
-   * @return array
-   *   A render array as expected by drupal_render().
+   * @param string $config_translation_mapper
+   *   The name of the mapper.
    *
    * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
    *   Throws an exception if a mapper plugin could not be instantiated from the
    *   mapper definition in the constructor.
+   *
+   * @return array
+   *   A render array as expected by drupal_render().
    */
-  public function listing() {
-    if (!$this->mapper) {
+  public function listing($config_translation_mapper) {
+    $mapper_definition = $this->mapperManager->getDefinition($config_translation_mapper);
+    $mapper = $this->mapperManager->createInstance($config_translation_mapper, $mapper_definition);
+    if (!$mapper) {
       throw new NotFoundHttpException();
     }
-    $entity_type = $this->mapper->getType();
+    $entity_type = $mapper->getType();
     // If the mapper, for example the mapper for field instances, has a custom
     // list controller defined, use it. Other mappers, for examples the ones for
     // node_type and block, fallback to the generic configuration translation
     // list controller.
     $build = $this->entityManager()
       ->getController($entity_type, 'config_translation_list')
-      ->setMapperDefinition($this->mapperDefinition)
+      ->setMapperDefinition($mapper_definition)
       ->render();
-    $build['#title'] = $this->mapper->getTypeLabel();
+    $build['#title'] = $mapper->getTypeLabel();
     return $build;
   }
 
diff --git a/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php b/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php
index b7ed1f5..965f373 100644
--- a/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php
+++ b/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php
@@ -66,7 +66,7 @@ public function setUp() {
     $this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
 
     $this->routeProvider
-      ->expects($this->once())
+      ->expects($this->any())
       ->method('getRouteByName')
       ->with('language.edit')
       ->will($this->returnValue(new Route('/admin/config/regional/language/edit/{language_entity}')));
diff --git a/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigNamesMapperTest.php b/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigNamesMapperTest.php
index 6f45771..41a6b1a 100644
--- a/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigNamesMapperTest.php
+++ b/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigNamesMapperTest.php
@@ -97,7 +97,7 @@ public function setUp() {
     $this->baseRoute = new Route('/admin/config/system/site-information');
 
     $this->routeProvider
-      ->expects($this->once())
+      ->expects($this->any())
       ->method('getRouteByName')
       ->with('system.site_information_settings')
       ->will($this->returnValue($this->baseRoute));
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php b/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php
index cab9ac4..c7ee576 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php
@@ -63,6 +63,9 @@ protected function alterRoutes(RouteCollection $collection, $provider) {
             'entity' => array(
               'type' => 'entity:' . $entity_type_id,
             ),
+            $entity_type_id => array(
+              'type' => 'entity:' . $entity_type_id,
+            ),
           ),
         )
       );
@@ -88,6 +91,9 @@ protected function alterRoutes(RouteCollection $collection, $provider) {
             'entity' => array(
               'type' => 'entity:' . $entity_type_id,
             ),
+            $entity_type_id => array(
+              'type' => 'entity:' . $entity_type_id,
+            ),
           ),
         )
       );
@@ -111,6 +117,9 @@ protected function alterRoutes(RouteCollection $collection, $provider) {
             'entity' => array(
               'type' => 'entity:' . $entity_type_id,
             ),
+            $entity_type_id => array(
+              'type' => 'entity:' . $entity_type_id,
+            ),
           ),
         )
       );
@@ -133,6 +142,9 @@ protected function alterRoutes(RouteCollection $collection, $provider) {
             'entity' => array(
               'type' => 'entity:' . $entity_type_id,
             ),
+            $entity_type_id => array(
+              'type' => 'entity:' . $entity_type_id,
+            ),
           ),
           '_access_mode' => 'ANY',
         )
diff --git a/core/modules/node/lib/Drupal/node/Access/NodeAddAccessCheck.php b/core/modules/node/lib/Drupal/node/Access/NodeAddAccessCheck.php
index 8d72223..451b066 100644
--- a/core/modules/node/lib/Drupal/node/Access/NodeAddAccessCheck.php
+++ b/core/modules/node/lib/Drupal/node/Access/NodeAddAccessCheck.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Routing\Access\AccessInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\node\NodeTypeInterface;
 use Symfony\Component\Routing\Route;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -41,8 +42,8 @@ public function __construct(EntityManagerInterface $entity_manager) {
   public function access(Route $route, Request $request, AccountInterface $account) {
     $access_controller = $this->entityManager->getAccessController('node');
     // If a node type is set on the request, just check that.
-    if ($request->attributes->has('node_type')) {
-      return $access_controller->createAccess($request->attributes->get('node_type')->type, $account) ? static::ALLOW : static::DENY;
+    if (($node_type = $request->attributes->get('node_type')) && $node_type instanceof NodeTypeInterface) {
+      return $access_controller->createAccess($node_type->type, $account) ? static::ALLOW : static::DENY;
     }
     foreach (node_permissions_get_configured_types() as $type) {
       if ($access_controller->createAccess($type->type, $account)) {
diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php b/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php
index 6d59e54..0f54ba9 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php
@@ -87,18 +87,7 @@ public function routes() {
 
     $methods = $this->availableMethods();
     foreach ($methods as $method) {
-      $lower_method = strtolower($method);
-      $route = new Route($canonical_path, array(
-        '_controller' => 'Drupal\rest\RequestHandler::handle',
-        // Pass the resource plugin ID along as default property.
-        '_plugin' => $this->pluginId,
-      ), array(
-        // The HTTP method is a requirement for this route.
-        '_method' => $method,
-        '_permission' => "restful $lower_method $this->pluginId",
-      ), array(
-        '_access_mode' => 'ANY',
-      ));
+      $route = $this->getBaseRoute($canonical_path, $method);
 
       switch ($method) {
         case 'POST':
@@ -175,4 +164,32 @@ public function availableMethods() {
     return $available;
   }
 
+  /**
+   * Setups the base route for all HTTP methods.
+   *
+   * @param string $canonical_path
+   *   The canonical path for the resource.
+   * @param string $method
+   *   The HTTP method to be used for the route.
+   *
+   * @return \Symfony\Component\Routing\Route
+   *   The created base route.
+   */
+  protected function getBaseRoute($canonical_path, $method) {
+    $lower_method = strtolower($method);
+
+    $route = new Route($canonical_path, array(
+      '_controller' => 'Drupal\rest\RequestHandler::handle',
+      // Pass the resource plugin ID along as default property.
+      '_plugin' => $this->pluginId,
+    ), array(
+      // The HTTP method is a requirement for this route.
+      '_method' => $method,
+      '_permission' => "restful $lower_method $this->pluginId",
+    ), array(
+      '_access_mode' => 'ANY',
+    ));
+    return $route;
+  }
+
 }
diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php b/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php
index 9b3c792..a0fedb1 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php
@@ -207,4 +207,20 @@ protected function validate(EntityInterface $entity) {
       throw new HttpException(422, $message);
     }
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getBaseRoute($canonical_path, $method) {
+    $route = parent::getBaseRoute($canonical_path, $method);
+    $definition = $this->getPluginDefinition();
+
+    $parameters = $route->getOption('parameters') ?: array();
+    $parameters[$definition['entity_type']]['type'] = 'entity:' . $definition['entity_type'];
+    $route->setOption('parameters', $parameters);
+
+    return $route;
+  }
+
+
 }
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Routing/EntityTestRoutes.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Routing/EntityTestRoutes.php
index 7f608e6..bd2f2b0 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Routing/EntityTestRoutes.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Routing/EntityTestRoutes.php
@@ -36,7 +36,7 @@ public function routes() {
         array('_content' => '\Drupal\entity_test\Controller\EntityTestController::testEdit', '_entity_type' => $entity_type),
         array('_permission' => 'administer entity_test content'),
         array('parameters' => array(
-          'entity' => array('type' => 'entity:' . $entity_type),
+          $entity_type => array('type' => 'entity:' . $entity_type),
         ))
       );
 
diff --git a/core/modules/views_ui/views_ui.routing.yml b/core/modules/views_ui/views_ui.routing.yml
index ee6ad6c..ffa1f5c 100644
--- a/core/modules/views_ui/views_ui.routing.yml
+++ b/core/modules/views_ui/views_ui.routing.yml
@@ -93,6 +93,7 @@ views_ui.edit:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Controller\ViewsUIController::edit'
   requirements:
@@ -104,6 +105,7 @@ views_ui.edit_display:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Controller\ViewsUIController::edit'
     display_id: NULL
@@ -116,6 +118,7 @@ views_ui.preview:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _entity_form: 'view.preview'
     display_id: NULL
@@ -135,6 +138,7 @@ views_ui.form_add_handler:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\AddHandler::getForm'
   requirements:
@@ -147,6 +151,7 @@ views_ui.form_edit_details:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\EditDetails::getForm'
   requirements:
@@ -159,6 +164,7 @@ views_ui.form_reorder_displays:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\ReorderDisplays::getForm'
   requirements:
@@ -171,6 +177,7 @@ views_ui.form_analyze:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\Analyze::getForm'
   requirements:
@@ -183,6 +190,7 @@ views_ui.form_rearrange:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\Rearrange::getForm'
   requirements:
@@ -195,6 +203,7 @@ views_ui.form_rearrange_filter:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\RearrangeFilter::getForm'
   requirements:
@@ -207,6 +216,7 @@ views_ui.form_display:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\Display::getForm'
   requirements:
@@ -219,6 +229,7 @@ views_ui.form_handler:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\ConfigHandler::getForm'
   requirements:
@@ -231,6 +242,7 @@ views_ui.form_handler_extra:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\ConfigHandlerExtra::getForm'
   requirements:
@@ -243,6 +255,7 @@ views_ui.form_handler_group:
     parameters:
       view:
         tempstore: TRUE
+        type: entity:view
   defaults:
     _content: '\Drupal\views_ui\Form\Ajax\ConfigHandlerGroup::getForm'
     form_state: NULL
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php
new file mode 100644
index 0000000..0909220
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php
@@ -0,0 +1,438 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Entity\EntityResolverManagerTest.
+ */
+
+namespace Drupal\Tests\Core\Entity;
+
+use Drupal\Core\Entity\Entity;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityResolverManager;
+use Drupal\Core\Form\FormBase;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Provides a test for the entity resolver.
+ *
+ * @coversDefaultClass \Drupal\Core\Entity\EntityResolverManager
+ */
+class EntityResolverManagerTest extends UnitTestCase {
+
+  /**
+   * The tested entity resolver manager.
+   *
+   * @var \Drupal\Core\Entity\EntityResolverManager
+   */
+  protected $entityResolverManager;
+
+  /**
+   * The mocked entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $entityManager;
+
+  /**
+   * The mocked controller resolver.
+   *
+   * @var \Drupal\Core\Controller\ControllerResolverInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $controllerResolver;
+
+  /**
+   * The mocked dependency Injection container.
+   *
+   * @var \Symfony\Component\DependencyInjection\ContainerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $container;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => '\Drupal\Core\Entity\EntityResolverManager unit test',
+      'description' => '',
+      'group' => 'Entity',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @covers ::__construct()
+   * @covers ::setContainer()
+   */
+  protected function setUp() {
+    $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
+    $this->controllerResolver = $this->getMock('Drupal\Core\Controller\ControllerResolverInterface');
+    $this->container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
+
+    $this->entityResolverManager = new EntityResolverManager($this->entityManager, $this->controllerResolver);
+    $this->entityResolverManager->setContainer($this->container);
+  }
+
+  /**
+   * Tests the setRouteOptions method with no special route/controller.
+   *
+   * We don't have any entity type involved, so we don't need any upcasting.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   */
+  public function testSetRouteOptionsWithStandardRoute() {
+    $route = new Route('/example', array(
+      '_controller' => 'Drupal\Tests\Core\Entity\BasicControllerClass::exampleControllerMethod',
+    ));
+    $this->setupControllerResolver($route->getDefault('_controller'));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $this->assertEmpty($route->getOption('parameters'));
+  }
+
+  /**
+   * Tests the setRouteOptions method with a controller with a non entity arg.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   */
+  public function testSetRouteOptionsWithStandardRouteWithArgument() {
+    $route = new Route('/example/{argument}', array(
+      '_controller' => 'Drupal\Tests\Core\Entity\BasicControllerClass::exampleControllerMethodWithArgument',
+      'argument' => 'test',
+    ));
+    $this->setupControllerResolver($route->getDefault('_controller'));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $this->assertEmpty($route->getOption('parameters'));
+  }
+
+  /**
+   * Tests the setRouteOptions method with a _content controller.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   */
+  public function testSetRouteOptionsWithContentController() {
+    $route = new Route('/example/{argument}', array(
+      '_content' => 'Drupal\Tests\Core\Entity\BasicControllerClass::exampleControllerMethodWithArgument',
+      'argument' => 'test',
+    ));
+    $this->setupControllerResolver($route->getDefault('_content'));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $this->assertEmpty($route->getOption('parameters'));
+  }
+
+  /**
+   * Tests the setRouteOptions method with an entity type parameter.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   */
+  public function testSetRouteOptionsWithEntityTypeNoUpcasting() {
+    $this->setupEntityTypes();
+
+    $route = new Route('/example/{entity_test}', array(
+      '_content' => 'Drupal\Tests\Core\Entity\BasicControllerClass::exampleControllerWithEntityNoUpcasting',
+    ));
+    $this->setupControllerResolver($route->getDefault('_content'));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $this->assertEmpty($route->getOption('parameters'));
+  }
+
+  /**
+   * Tests the setRouteOptions method with an entity type parameter, upcasting.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   */
+  public function testSetRouteOptionsWithEntityTypeUpcasting() {
+    $this->setupEntityTypes();
+
+    $route = new Route('/example/{entity_test}', array(
+      '_content' => 'Drupal\Tests\Core\Entity\BasicControllerClass::exampleControllerWithEntityUpcasting',
+    ));
+    $this->setupControllerResolver($route->getDefault('_content'));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $parameters = $route->getOption('parameters');
+    $this->assertEquals(array('entity_test' => array('type' => 'entity:entity_test')), $parameters);
+  }
+
+  /**
+   * Tests the setRouteOptions method with an entity type parameter form.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   */
+  public function testSetRouteOptionsWithEntityFormUpcasting() {
+    $this->setupEntityTypes();
+
+    $route = new Route('/example/{entity_test}', array(
+      '_form' => 'Drupal\Tests\Core\Entity\BasicForm',
+    ));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $parameters = $route->getOption('parameters');
+    $this->assertEquals(array('entity_test' => array('type' => 'entity:entity_test')), $parameters);
+  }
+
+  /**
+   * Tests the setRouteOptions method with an form parameter without interface.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   */
+  public function testSetRouteOptionsWithEntityFormNoUpcasting() {
+    $this->setupEntityTypes();
+
+    $route = new Route('/example/{entity_test}', array(
+      '_form' => 'Drupal\Tests\Core\Entity\BasicFormNoUpcasting',
+    ));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $this->assertEmpty($route->getOption('parameters'));
+  }
+
+  /**
+   * Tests the setRouteOptions method with an _entity_view route.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   * @covers ::setParametersFromEntityInformation()
+   */
+  public function testSetRouteOptionsWithEntityViewRouteAndManualParameters() {
+    $this->setupEntityTypes();
+    $route = new Route('/example/{foo}',
+      array(
+        '_entity_view' => 'entity_test.view',
+      ),
+      array(),
+      array(
+        'parameters' => array(
+          'foo' => array(
+            'type' => 'entity:entity_test',
+          ),
+        ),
+      )
+    );
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $parameters = $route->getOption('parameters');
+    $this->assertEquals(array('foo' => array('type' => 'entity:entity_test')), $parameters);
+  }
+
+  /**
+   * Tests the setRouteOptions method with an _entity_view route.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   * @covers ::setParametersFromEntityInformation()
+   */
+  public function testSetRouteOptionsWithEntityViewRoute() {
+    $this->setupEntityTypes();
+    $route = new Route('/example/{entity_test}', array(
+      '_entity_view' => 'entity_test.view',
+    ));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $parameters = $route->getOption('parameters');
+    $this->assertEquals(array('entity_test' => array('type' => 'entity:entity_test')), $parameters);
+  }
+
+  /**
+   * Tests the setRouteOptions method with an _entity_list route.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   * @covers ::setParametersFromEntityInformation()
+   */
+  public function testSetRouteOptionsWithEntityListRoute() {
+    $this->setupEntityTypes();
+    $route = new Route('/example/{entity_test}', array(
+      '_entity_list' => 'entity_test',
+    ));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $parameters = $route->getOption('parameters');
+    $this->assertEquals(array('entity_test' => array('type' => 'entity:entity_test')), $parameters);
+  }
+
+  /**
+   * Tests the setRouteOptions method with an _entity_form route.
+   *
+   * @covers ::setRouteOptions()
+   * @covers ::getController()
+   * @covers ::getEntityTypes()
+   * @covers ::setParametersFromReflection()
+   * @covers ::setParametersFromEntityInformation()
+   */
+  public function testSetRouteOptionsWithEntityFormRoute() {
+    $this->setupEntityTypes();
+    $route = new Route('/example/{entity_test}', array(
+      '_entity_form' => 'entity_test.edit',
+    ));
+
+    $defaults = $route->getDefaults();
+    $this->entityResolverManager->setRouteOptions($route);
+    $this->assertEquals($defaults, $route->getDefaults());
+    $parameters = $route->getOption('parameters');
+    $this->assertEquals(array('entity_test' => array('type' => 'entity:entity_test')), $parameters);
+  }
+
+  /**
+   * Setups the controller resolver to return the given controller definition.
+   *
+   * @param string $controller_definition
+   *   The definition of a controller
+   */
+  protected function setupControllerResolver($controller_definition) {
+    $controller = $controller_definition;
+    list($class, $method) = explode('::', $controller);
+    $this->controllerResolver->expects($this->atLeastOnce())
+      ->method('getControllerFromDefinition')
+      ->with($controller_definition)
+      ->will($this->returnValue(array(new $class, $method)));
+  }
+
+  /**
+   * Creates the entity manager mock returning entity type objects.
+   */
+  protected function setupEntityTypes() {
+    $definition = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
+    $definition->expects($this->any())
+      ->method('getClass')
+      ->will($this->returnValue('Drupal\Tests\Core\Entity\EntityTest'));
+    $this->entityManager->expects($this->any())
+      ->method('getDefinitions')
+      ->will($this->returnValue(array(
+        'entity_test' => $definition,
+      )));
+    $this->entityManager->expects($this->any())
+      ->method('getDefinition')
+      ->will($this->returnCallback(function ($entity_type) use ($definition) {
+        if ($entity_type == 'entity_test') {
+          return $definition;
+        }
+        else {
+          return NULL;
+        }
+      }));
+  }
+
+}
+
+/**
+ * A class containing all kind of different controller methods.
+ */
+class BasicControllerClass {
+
+  public function exampleControllerMethod() {
+  }
+
+  public function exampleControllerMethodWithArgument($argument) {
+  }
+
+  public function exampleControllerWithEntityNoUpcasting($entity_test) {
+  }
+
+  public function exampleControllerWithEntityUpcasting(EntityInterface $entity_test) {
+  }
+
+}
+
+/**
+ * A concrete entity.
+ */
+class EntityTest extends Entity {
+
+}
+
+/**
+ * A basic form with a passed entity with an interface.
+ */
+class BasicForm extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, EntityInterface $entity_test = NULL) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+  }
+
+}
+
+/**
+ * A basic form with a passed entity without an interface.
+ */
+class BasicFormNoUpcasting extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $entity_test = NULL) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+  }
+
+}
