diff --git a/core/core.services.yml b/core/core.services.yml
index dec001f..9861976 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -536,7 +536,7 @@ services:
     arguments: ['@module_handler']
   resolver_manager.entity:
     class: Drupal\Core\Entity\EntityResolverManager
-    arguments: ['@entity.manager', '@controller_resolver', '@class_resolver']
+    arguments: ['@entity.manager', '@class_resolver']
   route_subscriber.entity:
     class: Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber
     tags:
diff --git a/core/lib/Drupal/Core/Entity/EntityResolverManager.php b/core/lib/Drupal/Core/Entity/EntityResolverManager.php
index da05970..1a0e968 100644
--- a/core/lib/Drupal/Core/Entity/EntityResolverManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityResolverManager.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\Core\Entity;
 
-use Drupal\Component\Plugin\Exception\PluginNotFoundException;
-use Drupal\Core\Controller\ControllerResolverInterface;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Symfony\Component\Routing\Route;
 
@@ -28,13 +26,6 @@ class EntityResolverManager {
   protected $entityManager;
 
   /**
-   * The controller resolver.
-   *
-   * @var \Drupal\Core\Controller\ControllerResolverInterface
-   */
-  protected $controllerResolver;
-
-  /**
    * The class resolver.
    *
    * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
@@ -46,49 +37,76 @@ class EntityResolverManager {
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
-   * @param \Drupal\Core\Controller\ControllerResolverInterface $controller_resolver
-   *   The controller resolver.
    * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
    *   The class resolver.
    */
-  public function __construct(EntityManagerInterface $entity_manager, ControllerResolverInterface $controller_resolver, ClassResolverInterface $class_resolver) {
+  public function __construct(EntityManagerInterface $entity_manager, ClassResolverInterface $class_resolver) {
     $this->entityManager = $entity_manager;
-    $this->controllerResolver = $controller_resolver;
     $this->classResolver = $class_resolver;
   }
 
   /**
-   * Creates a controller instance using route defaults.
+   * Gets the controller class using route defaults.
    *
    * By design we cannot support all possible routes, but just the ones which
    * use the defaults provided by core, which are _content, _controller
    * and _form.
    *
+   * Rather than creating an instance of every controller determine the class
+   * and method that would be used. This is not possible for the service:method
+   * notation.
+   *
+   * @see \Drupal\Core\Controller\ControllerResolver::getControllerFromDefinition()
+   * @see \Drupal\Core\Controller\ClassResolver::getInstanceFromDefinition()
+   *
    * @param array $defaults
    *   The default values provided by the route.
    *
-   * @return array|null
-   *   Returns the controller instance if it is possible to instantiate it, NULL
+   * @return string|null
+   *   Returns the controller class, otherwise NULL.
    */
-  protected function getController(array $defaults) {
+  protected function getControllerClass(array $defaults) {
     $controller = NULL;
     if (isset($defaults['_content'])) {
-      $controller = $this->controllerResolver->getControllerFromDefinition($defaults['_content']);
+      $controller = $defaults['_content'];
     }
     if (isset($defaults['_controller'])) {
-      $controller = $this->controllerResolver->getControllerFromDefinition($defaults['_controller']);
+      $controller = $defaults['_controller'];
     }
 
     if (isset($defaults['_form'])) {
-      $form_arg = $defaults['_form'];
-      // Check if the class exists first as the class resolver will throw an
-      // exception if it doesn't. This also means a service cannot be used here.
-      if (class_exists($form_arg)) {
-        $controller = array($this->classResolver->getInstanceFromDefinition($form_arg), 'buildForm');
+      $controller = $defaults['_form'];
+      // Check if the class exists and if so use the buildForm() method from the
+      // interface.
+      if (class_exists($controller)) {
+        return array($controller, 'buildForm');
       }
     }
 
-    return $controller;
+    if (strpos($controller, ':') === FALSE) {
+      if (method_exists($controller, '__invoke')) {
+        return array($controller, '__invoke');
+      }
+      // What to do here? The controller could be a procedural function.
+      return NULL;
+    }
+
+    $count = substr_count($controller, ':');
+    if ($count == 1) {
+      // Controller in the service:method notation. Should we be getting the
+      // service from the container? Or can we get the definition somehow?
+      // Considering that this is called during the kernel destruct event this
+      // is very dangerous as the controller could depend on services that can
+      // not exist at this point.
+      list($class_or_service, $method) = explode(':', $controller, 2);
+      return array($this->classResolver->getInstanceFromDefinition($class_or_service), $method);
+    }
+    elseif (strpos($controller, '::') !== FALSE) {
+      // Controller in the class::method notation.
+      return explode('::', $controller, 2);
+    }
+
+    return NULL;
   }
 
   /**
@@ -183,7 +201,7 @@ protected function setParametersFromEntityInformation(Route $route) {
    *   The route object to add the upcasting information onto.
    */
   public function setRouteOptions(Route $route) {
-    if ($controller = $this->getController($route->getDefaults())) {
+    if ($controller = $this->getControllerClass($route->getDefaults())) {
       // Try to use reflection.
       if ($this->setParametersFromReflection($controller, $route)) {
         return;
diff --git a/core/lib/Drupal/Core/Render/ElementInfoManager.php b/core/lib/Drupal/Core/Render/ElementInfoManager.php
index 1dd2be4..2df59c4 100644
--- a/core/lib/Drupal/Core/Render/ElementInfoManager.php
+++ b/core/lib/Drupal/Core/Render/ElementInfoManager.php
@@ -90,6 +90,16 @@ protected function buildInfo() {
 
   /**
    * {@inheritdoc}
+   */
+  public function clearCachedDefinitions() {
+    parent::clearCachedDefinitions();
+
+    // Force the element info to be rebuilt.
+    unset($this->elementInfo);
+  }
+
+  /**
+   * {@inheritdoc}
    *
    * @return \Drupal\Core\Render\Element\ElementInterface
    */
diff --git a/core/modules/views/src/Element/View.php b/core/modules/views/src/Element/View.php
new file mode 100644
index 0000000..c9e084b
--- /dev/null
+++ b/core/modules/views/src/Element/View.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Element\View.
+ */
+
+namespace Drupal\views\Element;
+
+use Drupal\Core\Render\Element\RenderElement;
+use Drupal\views\Views;
+
+/**
+ * Provides a render element to display a view.
+ *
+ * @RenderElement("view")
+ */
+class View extends RenderElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return array(
+      '#theme_wrappers' => array('container'),
+      '#pre_render' => array(
+        array($class, 'preRenderViewElement'),
+      ),
+      '#name' => NULL,
+      '#display_id' => 'default',
+      '#arguments' => array(),
+    );
+  }
+
+  /**
+   * View element pre render callback.
+   */
+  public static function preRenderViewElement($element) {
+    $element['#attributes']['class'][] = 'views-element-container';
+
+    $view = Views::getView($element['#name']);
+    if ($view && $view->access($element['#display_id'])) {
+      $element['view'] = $view->preview($element['#display_id'], $element['#arguments']);
+    }
+
+    return $element;
+  }
+
+}
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 3294836..3feea55 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -47,20 +47,6 @@ function views_help($route_name, RouteMatchInterface $route_match) {
 }
 
 /**
- * Implements hook_element_info().
- */
-function views_element_info() {
-  $types['view'] = array(
-    '#theme_wrappers' => array('container'),
-    '#pre_render' => array('views_pre_render_view_element'),
-    '#name' => NULL,
-    '#display_id' => 'default',
-    '#arguments' => array(),
-  );
-  return $types;
-}
-
-/**
  * Implements hook_views_pre_render().
  */
 function views_views_pre_render($view) {
@@ -92,20 +78,6 @@ function views_views_pre_render($view) {
 }
 
 /**
- * View element pre render callback.
- */
-function views_pre_render_view_element($element) {
-  $element['#attributes']['class'][] = 'views-element-container';
-
-  $view = Views::getView($element['#name']);
-  if ($view && $view->access($element['#display_id'])) {
-    $element['view'] = $view->preview($element['#display_id'], $element['#arguments']);
-  }
-
-  return $element;
-}
-
-/**
  * Implements hook_theme().
  *
  * Register views theming functions and those that are defined via views plugin
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php
index 23bd5c9..9f3e340 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityResolverManagerTest.php
@@ -37,13 +37,6 @@ class EntityResolverManagerTest extends UnitTestCase {
   protected $entityManager;
 
   /**
-   * The mocked controller resolver.
-   *
-   * @var \Drupal\Core\Controller\ControllerResolverInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $controllerResolver;
-
-  /**
    * The mocked class resolver.
    *
    * @var \Drupal\Core\DependencyInjection\ClassResolverInterface|\PHPUnit_Framework_MockObject_MockObject
@@ -64,11 +57,10 @@ class EntityResolverManagerTest extends UnitTestCase {
    */
   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->classResolver = $this->getClassResolverStub();
 
-    $this->entityResolverManager = new EntityResolverManager($this->entityManager, $this->controllerResolver, $this->classResolver);
+    $this->entityResolverManager = new EntityResolverManager($this->entityManager, $this->classResolver);
   }
 
   /**
@@ -77,13 +69,12 @@ protected function setUp() {
    * We don't have any entity type involved, so we don't need any upcasting.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    */
   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);
@@ -95,14 +86,13 @@ public function testSetRouteOptionsWithStandardRoute() {
    * Tests setRouteOptions() with a controller with a non entity argument.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    */
   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);
@@ -114,14 +104,13 @@ public function testSetRouteOptionsWithStandardRouteWithArgument() {
    * Tests setRouteOptions() with a _content default.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    */
   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);
@@ -133,7 +122,7 @@ public function testSetRouteOptionsWithContentController() {
    * Tests setRouteOptions() with an entity type parameter.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    */
@@ -143,7 +132,6 @@ public function testSetRouteOptionsWithEntityTypeNoUpcasting() {
     $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);
@@ -155,7 +143,7 @@ public function testSetRouteOptionsWithEntityTypeNoUpcasting() {
    * Tests setRouteOptions() with an entity type parameter, upcasting.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    */
@@ -165,7 +153,6 @@ public function testSetRouteOptionsWithEntityTypeUpcasting() {
     $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);
@@ -178,7 +165,7 @@ public function testSetRouteOptionsWithEntityTypeUpcasting() {
    * Tests setRouteOptions() with an entity type parameter form.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    */
@@ -200,7 +187,7 @@ public function testSetRouteOptionsWithEntityFormUpcasting() {
    * Tests setRouteOptions() with entity form upcasting, no create method.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    */
@@ -222,7 +209,7 @@ public function testSetRouteOptionsWithEntityUpcastingNoCreate() {
    * Tests setRouteOptions() with an form parameter without interface.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    */
@@ -243,7 +230,7 @@ public function testSetRouteOptionsWithEntityFormNoUpcasting() {
    * Tests setRouteOptions() with an _entity_view route.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    * @covers ::setParametersFromEntityInformation()
@@ -275,7 +262,7 @@ public function testSetRouteOptionsWithEntityViewRouteAndManualParameters() {
    * Tests setRouteOptions() with an _entity_view route.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    * @covers ::setParametersFromEntityInformation()
@@ -297,7 +284,7 @@ public function testSetRouteOptionsWithEntityViewRoute() {
    * Tests setRouteOptions() with an _entity_list route.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    * @covers ::setParametersFromEntityInformation()
@@ -319,7 +306,7 @@ public function testSetRouteOptionsWithEntityListRoute() {
    * Tests setRouteOptions() with an _entity_form route.
    *
    * @covers ::setRouteOptions()
-   * @covers ::getController()
+   * @covers ::getControllerClass()
    * @covers ::getEntityTypes()
    * @covers ::setParametersFromReflection()
    * @covers ::setParametersFromEntityInformation()
@@ -338,21 +325,6 @@ public function testSetRouteOptionsWithEntityFormRoute() {
   }
 
   /**
-   * 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() {
