diff --git a/core/core.services.yml b/core/core.services.yml
index 9fb9ebd..4d3dae5 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -263,6 +263,11 @@ services:
     tags:
       - { name: route_enhancer, priority: 20 }
       - { name: legacy_route_enhancer, priority: 20 }
+  route_enhancer.entity_form:
+    class: Drupal\Core\Entity\Enhancer\EntityFormEnhancer
+    arguments: ['@content_negotiation']
+    tags:
+      - { name: route_enhancer, priority: 15 }
   route_enhancer.form:
     class: Drupal\Core\Routing\Enhancer\FormEnhancer
     arguments: ['@content_negotiation']
diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 25d9915..9c0995e 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -431,30 +431,6 @@ function entity_form_controller($entity_type, $operation = 'default') {
 }
 
 /**
- * Returns the form id for the given entity and operation.
- *
- * @param EntityInterface $entity
- *   The entity to be created or edited.
- * @param $operation
- *   (optional) The operation for the form to be processed.
- *
- * @return
- *   A string representing the entity form id.
- */
-function entity_form_id(EntityInterface $entity, $operation = 'default') {
-  $entity_type = $entity->entityType();
-  $bundle = $entity->bundle();
-  $form_id = $entity_type;
-  if ($bundle != $entity_type) {
-    $form_id = $bundle . '_' . $form_id;
-  }
-  if ($operation != 'default') {
-    $form_id = $form_id . '_' . $operation;
-  }
-  return $form_id . '_form';
-}
-
-/**
  * Returns the default form state for the given entity and operation.
  *
  * @param EntityInterface $entity
@@ -468,9 +444,10 @@ function entity_form_id(EntityInterface $entity, $operation = 'default') {
 function entity_form_state_defaults(EntityInterface $entity, $operation = 'default') {
   $form_state = array();
   $controller = drupal_container()->get('plugin.manager.entity')->getFormController($entity->entityType(), $operation);
-  $form_state['build_info']['callback'] = array($controller, 'build');
-  $form_state['build_info']['base_form_id'] = $entity->entityType() . '_form';
-  $form_state['build_info']['args'] = array($entity);
+  $controller->setEntity($entity);
+  $form_state['build_info']['callback_object'] = $controller;
+  $form_state['build_info']['base_form_id'] = $controller->getBaseFormID();
+  $form_state['build_info']['args'] = array();
   return $form_state;
 }
 
@@ -489,7 +466,7 @@ function entity_form_state_defaults(EntityInterface $entity, $operation = 'defau
  */
 function entity_form_submit(EntityInterface $entity, $operation = 'default', &$form_state = array()) {
   $form_state += entity_form_state_defaults($entity, $operation);
-  $form_id = entity_form_id($entity, $operation);
+  $form_id = $form_state['build_info']['callback_object']->getFormID();
   drupal_form_submit($form_id, $form_state);
 }
 
@@ -513,7 +490,7 @@ function entity_form_submit(EntityInterface $entity, $operation = 'default', &$f
  */
 function entity_get_form(EntityInterface $entity, $operation = 'default', array $form_state = array()) {
   $form_state += entity_form_state_defaults($entity, $operation);
-  $form_id = entity_form_id($entity, $operation);
+  $form_id = $form_state['build_info']['callback_object']->getFormID();
   return drupal_build_form($form_id, $form_state);
 }
 
diff --git a/core/includes/form.inc b/core/includes/form.inc
index ca9e614..8bd89fb 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -7,6 +7,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormInterface;
+use Drupal\Core\Form\BaseFormInterface;
 use Drupal\Core\Database\Database;
 use Drupal\Core\Template\Attribute;
 use Drupal\Core\Datetime\DrupalDateTime;
@@ -119,6 +120,9 @@ function _drupal_form_id($form_arg, &$form_state) {
   // the callback object and determine the form ID.
   if (is_object($form_arg) && $form_arg instanceof FormInterface) {
     $form_state['build_info']['callback_object'] = $form_arg;
+    if ($form_arg instanceof BaseFormInterface) {
+      $form_state['build_info']['base_form_id'] = $form_arg->getBaseFormID();
+    }
     return $form_arg->getFormID();
   }
 
@@ -299,7 +303,8 @@ function drupal_get_form($form_arg) {
  *     recommended way to ensure that the chosen key doesn't conflict with ones
  *     used by the Form API or other modules is to use the module name as the
  *     key name or a prefix for the key name. For example, the entity form
- *     controller classes use $form_state['entity'] in entity forms to store
+ *     controller classes use $this->entity in entity forms, or
+ *     $form_state['controller']->getEntity() outside the controller, to store
  *     information about the entity being edited, and this information stays
  *     available across successive clicks of the "Preview" button (if available)
  *     as well as when the "Save" button is finally clicked.
diff --git a/core/lib/Drupal/Core/Entity/Enhancer/EntityFormEnhancer.php b/core/lib/Drupal/Core/Entity/Enhancer/EntityFormEnhancer.php
new file mode 100644
index 0000000..b6739e0
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/Enhancer/EntityFormEnhancer.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Enhancer\EntityFormEnhancer.
+ */
+
+namespace Drupal\Core\Entity\Enhancer;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
+use Drupal\Core\ContentNegotiation;
+
+/**
+ * Enhances an entity form route with the appropriate controller.
+ */
+class EntityFormEnhancer implements RouteEnhancerInterface {
+
+  /**
+   * Content negotiation library.
+   *
+   * @var \Drupal\CoreContentNegotiation
+   */
+  protected $negotiation;
+
+  /**
+   * Constructs a new \Drupal\Core\Entity\Enhancer\EntityFormEnhancer.
+   *
+   * @param \Drupal\Core\ContentNegotiation $negotiation
+   *   The content negotiation library.
+   */
+  public function __construct(ContentNegotiation $negotiation) {
+    $this->negotiation = $negotiation;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function enhance(array $defaults, Request $request) {
+    if (empty($defaults['_controller']) && !empty($defaults['_entity_form']) && $this->negotiation->getContentType($request) === 'html') {
+      $defaults['_controller'] = '\Drupal\Core\Entity\HtmlEntityFormController::content';
+    }
+    return $defaults;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 6d2c9fb..067fe17 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -23,30 +23,70 @@ class EntityFormController implements EntityFormControllerInterface {
   protected $operation;
 
   /**
+   * The entity being used by this form.
+   *
+   * @var \Drupal\Core\Entity\EntityInterface
+   */
+  protected $entity;
+
+  /**
    * Constructs an EntityFormController object.
    *
+   * @param string|null $operation
+   *   (optional) The name of the current operation, defaults to NULL.
+   */
+  public function __construct($operation = NULL) {
+    $this->setOperation($operation);
+  }
+
+  /**
+   * Sets the operation for this form.
+   *
    * @param string $operation
    *   The name of the current operation.
    */
-  public function __construct($operation) {
-    $this->operation = $operation;
+  public function setOperation($operation) {
+    if ($operation) {
+      $this->operation = $operation;
+    }
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityFormControllerInterface::build().
+   * {@inheritdoc}
    */
-  public function build(array $form, array &$form_state, EntityInterface $entity) {
+  public function getBaseFormID() {
+    return $this->entity->entityType() . '_form';
+  }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    $entity_type = $this->entity->entityType();
+    $bundle = $this->entity->bundle();
+    $form_id = $entity_type;
+    if ($bundle != $entity_type) {
+      $form_id = $bundle . '_' . $form_id;
+    }
+    if ($this->operation != 'default') {
+      $form_id = $form_id . '_' . $this->operation;
+    }
+    return $form_id . '_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state) {
     // During the initial form build, add the entity to the form state for use
     // during form building and processing. During a rebuild, use what is in the
     // form state.
-    if (!$this->getEntity($form_state)) {
-      $this->init($form_state, $entity);
+    if (!isset($form_state['controller'])) {
+      $this->init($form_state);
     }
 
     // Retrieve the form array using the possibly updated entity in form state.
-    $entity = $this->getEntity($form_state);
-    $form = $this->form($form, $form_state, $entity);
+    $form = $this->form($form, $form_state);
 
     // Retrieve and add the form actions array.
     $actions = $this->actionsElement($form, $form_state);
@@ -58,14 +98,25 @@ public function build(array $form, array &$form_state, EntityInterface $entity)
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+  }
+
+  /**
    * Initialize the form state and the entity before the first form build.
    */
-  protected function init(array &$form_state, EntityInterface $entity) {
+  protected function init(array &$form_state) {
     // Add the controller to the form state so it can be easily accessed by
     // module-provided form handlers there.
     $form_state['controller'] = $this;
-    $this->setEntity($entity, $form_state);
-    $this->prepareEntity($entity);
+    $this->prepareEntity();
   }
 
   /**
@@ -73,7 +124,8 @@ protected function init(array &$form_state, EntityInterface $entity) {
    *
    * @see Drupal\Core\Entity\EntityFormController::build()
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
+  public function form(array $form, array &$form_state) {
+    $entity = $this->entity;
     // @todo Exploit the Field API to generate the default widgets for the
     // entity properties.
     $info = $entity->entityInfo();
@@ -99,7 +151,7 @@ protected function actionsElement(array $form, array &$form_state) {
     $element = $this->actions($form, $form_state);
 
     // We cannot delete an entity that has not been created yet.
-    if ($this->getEntity($form_state)->isNew()) {
+    if ($this->entity->isNew()) {
       unset($element['delete']);
     }
     elseif (isset($element['delete'])) {
@@ -198,9 +250,8 @@ public function submit(array $form, array &$form_state) {
 
     $this->updateFormLangcode($form_state);
     $this->submitEntityLanguage($form, $form_state);
-    $entity = $this->buildEntity($form, $form_state);
-    $this->setEntity($entity, $form_state);
-    return $entity;
+    $this->entity = $this->buildEntity($form, $form_state);
+    return $this->entity;
   }
 
   /**
@@ -231,7 +282,7 @@ public function delete(array $form, array &$form_state) {
    * Implements \Drupal\Core\Entity\EntityFormControllerInterface::getFormLangcode().
    */
   public function getFormLangcode(array $form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $translations = $entity->getTranslationLanguages();
 
     if (!empty($form_state['langcode'])) {
@@ -257,7 +308,7 @@ public function getFormLangcode(array $form_state) {
    * Implements \Drupal\Core\Entity\EntityFormControllerInterface::isDefaultFormLangcode().
    */
   public function isDefaultFormLangcode(array $form_state) {
-    return $this->getFormLangcode($form_state) == $this->getEntity($form_state)->language()->langcode;
+    return $this->getFormLangcode($form_state) == $this->entity->language()->langcode;
   }
 
   /**
@@ -282,7 +333,7 @@ protected function updateFormLangcode(array $form_state) {
    *   A reference to a keyed array containing the current state of the form.
    */
   protected function submitEntityLanguage(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $entity_type = $entity->entityType();
 
     if (field_has_translation_handler($entity_type)) {
@@ -313,7 +364,7 @@ protected function submitEntityLanguage(array $form, array &$form_state) {
    * Implements \Drupal\Core\Entity\EntityFormControllerInterface::buildEntity().
    */
   public function buildEntity(array $form, array &$form_state) {
-    $entity = clone $this->getEntity($form_state);
+    $entity = clone $this->entity;
     // @todo Move entity_form_submit_build_entity() here.
     // @todo Exploit the Field API to process the submitted entity field.
     entity_form_submit_build_entity($entity->entityType(), $entity, $form, $form_state);
@@ -323,21 +374,22 @@ public function buildEntity(array $form, array &$form_state) {
   /**
    * Implements \Drupal\Core\Entity\EntityFormControllerInterface::getEntity().
    */
-  public function getEntity(array $form_state) {
-    return isset($form_state['entity']) ? $form_state['entity'] : NULL;
+  public function getEntity() {
+    return $this->entity;
   }
 
   /**
    * Implements \Drupal\Core\Entity\EntityFormControllerInterface::setEntity().
    */
-  public function setEntity(EntityInterface $entity, array &$form_state) {
-    $form_state['entity'] = $entity;
+  public function setEntity(EntityInterface $entity) {
+    $this->entity = $entity;
+    return $this;
   }
 
   /**
    * Prepares the entity object before the form is built first.
    */
-  protected function prepareEntity(EntityInterface $entity) {
+  protected function prepareEntity() {
     // @todo Perform common prepare operations and add a hook.
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityFormControllerInterface.php b/core/lib/Drupal/Core/Entity/EntityFormControllerInterface.php
index 09a06bf..28b2562 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormControllerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormControllerInterface.php
@@ -7,30 +7,12 @@
 
 namespace Drupal\Core\Entity;
 
+use Drupal\Core\Form\BaseFormInterface;
+
 /**
  * Defines a common interface for entity form controller classes.
  */
-interface EntityFormControllerInterface {
-
-  /**
-   * Builds an entity form.
-   *
-   * This is the entity form builder which is invoked via drupal_build_form()
-   * to retrieve the form.
-   *
-   * @param array $form
-   *   A nested array form elements comprising the form.
-   * @param array $form_state
-   *   An associative array containing the current state of the form.
-   * @param string $entity_type
-   *   The type of the entity being edited.
-   * @param \Drupal\Core\Entity\EntityInterface $entity
-   *   The entity being edited.
-   *
-   * @return array
-   *   The array containing the complete form.
-   */
-  public function build(array $form, array &$form_state, EntityInterface $entity);
+interface EntityFormControllerInterface extends BaseFormInterface {
 
   /**
    * Returns the code identifying the active form language.
@@ -73,7 +55,7 @@ public function getOperation();
    * @return \Drupal\Core\Entity\EntityInterface
    *   The current form entity.
    */
-  public function getEntity(array $form_state);
+  public function getEntity();
 
   /**
    * Sets the form entity.
@@ -86,10 +68,8 @@ public function getEntity(array $form_state);
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
    *   The entity the current form should operate upon.
-   * @param array $form_state
-   *   An associative array containing the current state of the form.
    */
-  public function setEntity(EntityInterface $entity, array &$form_state);
+  public function setEntity(EntityInterface $entity);
 
   /**
    * Builds an updated entity object based upon the submitted form values.
diff --git a/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php b/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php
index ef9bc89..8b7676a 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php
@@ -22,7 +22,8 @@ class EntityFormControllerNG extends EntityFormController {
   /**
    * Overrides EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
+  public function form(array $form, array &$form_state) {
+    $entity = $this->entity;
     // @todo Exploit the Field API to generate the default widgets for the
     // entity fields.
     $info = $entity->entityInfo();
@@ -65,7 +66,7 @@ protected function submitEntityLanguage(array $form, array &$form_state) {
    * Overrides EntityFormController::buildEntity().
    */
   public function buildEntity(array $form, array &$form_state) {
-    $entity = clone $this->getEntity($form_state);
+    $entity = clone $this->entity;
     $entity_type = $entity->entityType();
     $info = entity_get_info($entity_type);
     // @todo Exploit the Field API to process the submitted entity fields.
diff --git a/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php b/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php
new file mode 100644
index 0000000..9177a23
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/HtmlEntityFormController.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\HtmlEntityFormController.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Core\HtmlFormController;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Wrapping controller for entity forms that serve as the main page body.
+ */
+class HtmlEntityFormController extends HtmlFormController {
+
+  /**
+   * {@inheritdoc}
+   *
+   * Due to reflection, the argument must be named $_entity_form.
+   */
+  public function content(Request $request, $_entity_form) {
+    return parent::content($request, $_entity_form);
+  }
+
+  /**
+   * Overrides \Drupal\Core\HtmlFormController::getFormObject().
+   *
+   * Instead of a class name or service ID, $arg will be a string representing
+   * the entity and operation being performed.
+   * Consider the following route:
+   * @code
+   *   pattern: '/foo/{node}/bar'
+   *   defaults:
+   *     _entity_form: 'node.edit'
+   * @endcode
+   * This would mean the edit form controller for the node entity should be use.
+   * If the entity type has a default form controller, only the name of the
+   * entity {param} needs to be passed:
+   * @code
+   *   pattern: '/foo/{node}/baz'
+   *   defaults:
+   *     _entity_form: 'node'
+   * @endcode
+   */
+  protected function getFormObject(Request $request, $arg) {
+    $manager = $this->container->get('plugin.manager.entity');
+
+    // If no operation is provided, use 'default'.
+    $arg .= '.default';
+    list ($entity, $operation) = explode('.', $arg);
+
+    if ($request->attributes->has($entity)) {
+      $entity = $request->attributes->get($entity);
+    }
+    elseif (is_string($entity)) {
+      $entity = $manager->getStorageController($entity)->create(array());
+    }
+
+    return $manager->getFormController($entity->entityType(), $operation)->setEntity($entity);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Form/BaseFormInterface.php b/core/lib/Drupal/Core/Form/BaseFormInterface.php
new file mode 100644
index 0000000..fa624cd
--- /dev/null
+++ b/core/lib/Drupal/Core/Form/BaseFormInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Form\BaseFormInterface.
+ */
+
+namespace Drupal\Core\Form;
+
+/**
+ * Provides an interface for a Form that has a base form ID.
+ */
+interface BaseFormInterface extends FormInterface {
+
+  /**
+   * Returns a string identifying the base form.
+   *
+   * @return string|false
+   *   The string identifying the base form or FALSE if this is not a base form.
+   *
+   *   The unique string identifying the form.
+   */
+  public function getBaseFormID();
+
+}
diff --git a/core/lib/Drupal/Core/HtmlFormController.php b/core/lib/Drupal/Core/HtmlFormController.php
index b641341..a589396 100644
--- a/core/lib/Drupal/Core/HtmlFormController.php
+++ b/core/lib/Drupal/Core/HtmlFormController.php
@@ -46,24 +46,12 @@ public function setContainer(ContainerInterface $container = NULL) {
    *   A response object.
    */
   public function content(Request $request, $_form) {
-    // If this is a class, instantiate it.
-    if (class_exists($_form)) {
-      if (in_array('Drupal\Core\ControllerInterface', class_implements($_form))) {
-        $form_arg = $_form::create($this->container);
-      }
-      else {
-        $form_arg = new $_form();
-      }
-    }
-    // Otherwise, it is a service.
-    else {
-      $form_arg = $this->container->get($_form);
-    }
+    $form_object = $this->getFormObject($request, $_form);
 
     // Using reflection, find all of the parameters needed by the form in the
     // request attributes, skipping $form and $form_state.
     $attributes = $request->attributes->all();
-    $reflection = new \ReflectionMethod($form_arg, 'buildForm');
+    $reflection = new \ReflectionMethod($form_object, 'buildForm');
     $params = $reflection->getParameters();
     $args = array();
     foreach (array_splice($params, 2) as $param) {
@@ -73,9 +61,34 @@ public function content(Request $request, $_form) {
     }
     $form_state['build_info']['args'] = $args;
 
-    $form_id = _drupal_form_id($form_arg, $form_state);
+    $form_id = _drupal_form_id($form_object, $form_state);
     $form = drupal_build_form($form_id, $form_state);
     return new Response(drupal_render_page($form));
   }
 
+  /**
+   * Returns the object used to build the form.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The request using this form.
+   * @param string $arg
+   *   Either a class name or a service ID.
+   *
+   * @return \Drupal\Core\Form\FormInterface
+   *   The form object to use.
+   */
+  protected function getFormObject(Request $request, $arg) {
+    // If this is a class, instantiate it.
+    if (class_exists($arg)) {
+      if (in_array('Drupal\Core\ControllerInterface', class_implements($arg))) {
+        return $arg::create($this->container);
+      }
+
+      return new $arg();
+    }
+
+    // Otherwise, it is a service.
+    return $this->container->get($arg);
+  }
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
index 8efd326..459a99b 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\aggregator;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormControllerNG;
 
 /**
@@ -18,7 +17,8 @@ class FeedFormController extends EntityFormControllerNG {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $feed) {
+  public function form(array $form, array &$form_state) {
+    $feed = $this->entity;
     $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
     $period[AGGREGATOR_CLEAR_NEVER] = t('Never');
 
@@ -111,7 +111,7 @@ public function validate(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $feed = $this->getEntity($form_state);
+    $feed = $this->entity;
     $insert = (bool) $feed->id();
     if (!empty($form_state['values']['category'])) {
       // Store category values for post save operations.
@@ -138,8 +138,7 @@ public function save(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $feed = $this->getEntity($form_state);
-    $form_state['redirect'] = 'admin/config/services/aggregator/delete/feed/' . $feed->id();
+    $form_state['redirect'] = 'admin/config/services/aggregator/delete/feed/' . $this->entity->id();
   }
 
 }
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
index 2c9845e..1a09dbf 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
@@ -8,7 +8,6 @@
 namespace Drupal\custom_block;
 
 use Drupal\Core\Datetime\DrupalDateTime;
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormControllerNG;
 
 /**
@@ -24,7 +23,8 @@ class CustomBlockFormController extends EntityFormControllerNG {
    * Fills in a few default values, and then invokes hook_custom_block_prepare()
    * on all modules.
    */
-  protected function prepareEntity(EntityInterface $block) {
+  protected function prepareEntity() {
+    $block = $this->entity;
     // Set up default values, if required.
     $block_type = entity_load('custom_block_type', $block->type->value);
     // If this is a new custom block, fill in the default values.
@@ -40,7 +40,8 @@ protected function prepareEntity(EntityInterface $block) {
   /**
    * Overrides \Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $block) {
+  public function form(array $form, array &$form_state) {
+    $block = $this->entity;
     // Override the default CSS class name, since the user-defined custom block
     // type name in 'TYPE-block-form' potentially clashes with third-party class
     // names.
@@ -158,7 +159,7 @@ public function submit(array $form, array &$form_state) {
    * Overrides \Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $block = $this->getEntity($form_state);
+    $block = $this->entity;
     $insert = empty($block->id->value);
     $block->save();
     $watchdog_args = array('@type' => $block->bundle(), '%info' => $block->label());
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
index 77664e9..6e5de33 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\custom_block;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,9 +17,10 @@ class CustomBlockTypeFormController extends EntityFormController {
   /**
    * Overrides \Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $block_type) {
-    $form = parent::form($form, $form_state, $block_type);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
 
+    $block_type = $this->entity;
     $form['label'] = array(
       '#type' => 'textfield',
       '#title' => t('Label'),
@@ -87,7 +87,7 @@ public function form(array $form, array &$form_state, EntityInterface $block_typ
    * Overrides \Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $block_type = $this->getEntity($form_state);
+    $block_type = $this->entity;
     $status = $block_type->save();
 
     $uri = $block_type->uri();
@@ -107,7 +107,7 @@ public function save(array $form, array &$form_state) {
    * Overrides \Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $block_type = $this->getEntity($form_state);
+    $block_type = $this->entity;
     $form_state['redirect'] = 'admin/structure/custom-blocks/manage/' . $block_type->id() . '/delete';
   }
 
diff --git a/core/modules/block/lib/Drupal/block/BlockBase.php b/core/modules/block/lib/Drupal/block/BlockBase.php
index 0909345..9fbdf07 100644
--- a/core/modules/block/lib/Drupal/block/BlockBase.php
+++ b/core/modules/block/lib/Drupal/block/BlockBase.php
@@ -222,7 +222,7 @@ public function access() {
    * @see \Drupal\block\BlockBase::blockForm()
    */
   public function form($form, &$form_state) {
-    $entity = $form_state['entity'];
+    $entity = $form_state['controller']->getEntity();
     $definition = $this->getDefinition();
     $form['id'] = array(
       '#type' => 'value',
@@ -429,13 +429,14 @@ public function blockForm($form, &$form_state) {
    * @see \Drupal\block\BlockBase::blockValidate()
    */
   public function validate($form, &$form_state) {
+    $entity = $form_state['controller']->getEntity();
     if (!empty($form['machine_name']['#disabled'])) {
       $config_id = explode('.', $form_state['values']['machine_name']);
       $form_state['values']['machine_name'] = array_pop($config_id);
     }
     $form_state['values']['visibility']['role']['roles'] = array_filter($form_state['values']['visibility']['role']['roles']);
-    if ($form_state['entity']->isNew()) {
-      form_set_value($form['id'], $form_state['entity']->get('theme') . '.' . $form_state['values']['machine_name'], $form_state);
+    if ($entity->isNew()) {
+      form_set_value($form['id'], $entity->get('theme') . '.' . $form_state['values']['machine_name'], $form_state);
     }
     $this->blockValidate($form, $form_state);
   }
@@ -471,10 +472,11 @@ public function blockValidate($form, &$form_state) {}
   public function submit($form, &$form_state) {
     if (!form_get_errors()) {
       $this->blockSubmit($form, $form_state);
+      $entity = $form_state['controller']->getEntity();
 
       drupal_set_message(t('The block configuration has been saved.'));
       cache_invalidate_tags(array('content' => TRUE));
-      $form_state['redirect'] = 'admin/structure/block/list/block_plugin_ui:' . $form_state['entity']->get('theme');
+      $form_state['redirect'] = 'admin/structure/block/list/block_plugin_ui:' . $entity->get('theme');
     }
   }
 
diff --git a/core/modules/block/lib/Drupal/block/BlockFormController.php b/core/modules/block/lib/Drupal/block/BlockFormController.php
index 8e95248..175d6b0 100644
--- a/core/modules/block/lib/Drupal/block/BlockFormController.php
+++ b/core/modules/block/lib/Drupal/block/BlockFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\block;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,8 +17,8 @@ class BlockFormController extends EntityFormController {
   /**
    * Overrides \Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
-    return $entity->getPlugin()->form($form, $form_state);
+  public function form(array $form, array &$form_state) {
+    return $this->entity->getPlugin()->form($form, $form_state);
   }
 
   /**
@@ -37,7 +36,7 @@ protected function actions(array $form, array &$form_state) {
   public function validate(array $form, array &$form_state) {
     parent::validate($form, $form_state);
 
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $entity->getPlugin()->validate($form, $form_state);
   }
 
@@ -47,7 +46,7 @@ public function validate(array $form, array &$form_state) {
   public function submit(array $form, array &$form_state) {
     parent::submit($form, $form_state);
 
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     // Call the plugin submit handler.
     $entity->getPlugin()->submit($form, $form_state);
 
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index d97dcf1..ee84fb6 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -318,7 +318,7 @@ function book_get_books() {
  * @see book_pick_book_nojs_submit()
  */
 function book_form_node_form_alter(&$form, &$form_state, $form_id) {
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
   $access = user_access('administer book outlines');
   if (!$access) {
     if (user_access('add content to books') && ((!empty($node->book['mlid']) && !empty($node->nid)) || book_type_is_allowed($node->type))) {
@@ -357,7 +357,7 @@ function book_form_node_form_alter(&$form, &$form_state, $form_id) {
  * @see book_form_node_form_alter()
  */
 function book_pick_book_nojs_submit($form, &$form_state) {
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
   $node->book = $form_state['values']['book'];
   $form_state['rebuild'] = TRUE;
 }
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 5690c72..f2a98c6 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -1106,7 +1106,7 @@ function comment_translation_configuration_element_submit($form, &$form_state) {
  * Implements hook_form_BASE_FORM_ID_alter().
  */
 function comment_form_node_form_alter(&$form, $form_state) {
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
   $form['comment_settings'] = array(
     '#type' => 'details',
     '#access' => user_access('administer comments'),
diff --git a/core/modules/comment/lib/Drupal/comment/CommentFormController.php b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
index a5e5f15..443066e 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentFormController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
@@ -8,7 +8,6 @@
 namespace Drupal\comment;
 
 use Drupal\Core\Datetime\DrupalDateTime;
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormControllerNG;
 
 /**
@@ -19,8 +18,9 @@ class CommentFormController extends EntityFormControllerNG {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $comment) {
+  public function form(array $form, array &$form_state) {
     global $user;
+    $comment = $this->entity;
     $node = $comment->nid->entity;
 
     // Use #comment-form as unique jump target, regardless of node type.
@@ -170,7 +170,7 @@ public function form(array $form, array &$form_state, EntityInterface $comment)
    */
   protected function actions(array $form, array &$form_state) {
     $element = parent::actions($form, $form_state);
-    $comment = $this->getEntity($form_state);
+    $comment = $this->entity;
     $node = $comment->nid->entity;
     $preview_mode = variable_get('comment_preview_' . $node->type, DRUPAL_OPTIONAL);
 
@@ -299,7 +299,7 @@ public function submit(array $form, array &$form_state) {
    *   A reference to a keyed array containing the current state of the form.
    */
   public function preview(array $form, array &$form_state) {
-    $comment = $this->getEntity($form_state);
+    $comment = $this->entity;
     drupal_set_title(t('Preview comment'), PASS_THROUGH);
     $form_state['comment_preview'] = comment_preview($comment);
     $form_state['rebuild'] = TRUE;
@@ -310,7 +310,7 @@ public function preview(array $form, array &$form_state) {
    */
   public function save(array $form, array &$form_state) {
     $node = node_load($form_state['values']['nid']);
-    $comment = $this->getEntity($form_state);
+    $comment = $this->entity;
 
     if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
       // Save the anonymous user information to a cookie for reuse.
diff --git a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestFormController.php b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestFormController.php
index 7e54e1c..efba401 100644
--- a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestFormController.php
+++ b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\config_test;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,9 +17,10 @@ class ConfigTestFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
-    $form = parent::form($form, $form_state, $entity);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
 
+    $entity = $this->entity;
     $form['label'] = array(
       '#type' => 'textfield',
       '#title' => 'Label',
@@ -64,7 +64,7 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $status = $entity->save();
 
     if ($status === SAVED_UPDATED) {
@@ -81,7 +81,7 @@ public function save(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $form_state['redirect'] = 'admin/structure/config_test/manage/' . $entity->id() . '/delete';
   }
 
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index e134ccc..e596ff4 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -338,7 +338,7 @@ function contact_form_user_profile_form_alter(&$form, &$form_state) {
     '#title' => t('Contact settings'),
     '#weight' => 5,
   );
-  $account = $form_state['controller']->getEntity($form_state);
+  $account = $form_state['controller']->getEntity();
   $account_data = drupal_container()->get('user.data')->get('contact', $account->id(), 'enabled');
   $form['contact']['contact'] = array(
     '#type' => 'checkbox',
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryFormController.php b/core/modules/contact/lib/Drupal/contact/CategoryFormController.php
index d60308f..8febed8 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryFormController.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\contact;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,9 +17,10 @@ class CategoryFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $category) {
-    $form = parent::form($form, $form_state, $category);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
 
+    $category = $this->entity;
     $default_category = config('contact.settings')->get('default_category');
 
     $form['label'] = array(
@@ -94,7 +94,7 @@ public function validate(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $category = $this->getEntity($form_state);
+    $category = $this->entity;
     $status = $category->save();
 
     $uri = $category->uri();
@@ -128,7 +128,7 @@ public function save(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $category = $this->getEntity($form_state);
+    $category = $this->entity;
     $form_state['redirect'] = 'admin/structure/contact/manage/' . $category->id() . '/delete';
   }
 
diff --git a/core/modules/contact/lib/Drupal/contact/MessageFormController.php b/core/modules/contact/lib/Drupal/contact/MessageFormController.php
index c4352cf..6f73d96 100644
--- a/core/modules/contact/lib/Drupal/contact/MessageFormController.php
+++ b/core/modules/contact/lib/Drupal/contact/MessageFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\contact;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 use Drupal\user\Plugin\Core\Entity\User;
 
@@ -19,8 +18,9 @@ class MessageFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $message) {
+  public function form(array $form, array &$form_state) {
     global $user;
+    $message = $this->entity;
     $form = parent::form($form, $form_state, $message);
     $form['#attributes']['class'][] = 'contact-form';
 
@@ -128,7 +128,7 @@ public function actions(array $form, array &$form_state) {
    * Form submission handler for the 'preview' action.
    */
   public function preview(array $form, array &$form_state) {
-    $message = $this->getEntity($form_state);
+    $message = $this->entity;
     $message->preview = TRUE;
     $form_state['rebuild'] = TRUE;
   }
@@ -140,7 +140,7 @@ public function save(array $form, array &$form_state) {
     global $user;
 
     $language_interface = language(LANGUAGE_TYPE_INTERFACE);
-    $message = $this->getEntity($form_state);
+    $message = $this->entity;
 
     $sender = clone user_load($user->uid);
     if (!$user->uid) {
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityFormController.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityFormController.php
index 93ef2aa..d5a4508 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityFormController.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\field_test;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,8 +17,10 @@ class TestEntityFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
-    $form = parent::form($form, $form_state, $entity);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
+
+    $entity = $this->entity;
     if (!$entity->isNew()) {
       $form['revision'] = array(
         '#access' => user_access('administer field_test content'),
@@ -36,7 +37,7 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $is_new = $entity->isNew();
     $entity->save();
 
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index eb2c1ec..2b65838 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -597,7 +597,7 @@ function forum_field_storage_pre_update(EntityInterface $entity, &$skip_fields)
  */
 function forum_form_taxonomy_vocabulary_form_alter(&$form, &$form_state, $form_id) {
   $vid = config('forum.settings')->get('vocabulary');
-  $vocabulary = $form_state['controller']->getEntity($form_state);
+  $vocabulary = $form_state['controller']->getEntity();
   if ($vid == $vocabulary->id()) {
     $form['help_forum_vocab'] = array(
       '#markup' => t('This is the designated forum vocabulary. Some of the normal vocabulary options have been removed.'),
diff --git a/core/modules/menu/lib/Drupal/menu/MenuFormController.php b/core/modules/menu/lib/Drupal/menu/MenuFormController.php
index ff42a20..4eeab27 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuFormController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\menu;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,8 +17,9 @@ class MenuFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $menu) {
-    $form = parent::form($form, $form_state, $menu);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
+    $menu = $this->entity;
     $system_menus = menu_list_system_menus();
     $form_state['menu'] = &$menu;
 
@@ -71,7 +71,7 @@ public function form(array $form, array &$form_state, EntityInterface $menu) {
    */
   protected function actions(array $form, array &$form_state) {
     $actions = parent::actions($form, $form_state);
-    $menu = $this->getEntity($form_state);
+    $menu = $this->entity;
 
     $system_menus = menu_list_system_menus();
     $actions['delete']['#access'] = !$menu->isNew() && !isset($system_menus[$menu->id()]);
@@ -83,7 +83,7 @@ protected function actions(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $menu = $this->getEntity($form_state);
+    $menu = $this->entity;
     $system_menus = menu_list_system_menus();
 
     if (!$menu->isNew() || isset($system_menus[$menu->id()])) {
@@ -114,7 +114,7 @@ public function save(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $menu = $this->getEntity($form_state);
+    $menu = $this->entity;
     $form_state['redirect'] = 'admin/structure/menu/manage/' . $menu->id() . '/delete';
   }
 
diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module
index d13655e..9753334 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -541,7 +541,7 @@ function _menu_parent_depth_limit($item) {
 function menu_form_node_form_alter(&$form, $form_state) {
   // Generate a list of possible parents (not including this link or descendants).
   // @todo This must be handled in a #process handler.
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
   $link = $node->menu;
   $type = $node->type;
   $options = menu_parent_options(menu_get_menus(), $link, $type);
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
index 9506602..68b0bcb 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\menu_link;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,7 +17,8 @@ class MenuLinkFormController extends EntityFormController {
   /**
    * Overrides EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $menu_link) {
+  public function form(array $form, array &$form_state) {
+    $menu_link = $this->entity;
     // Since menu_link_load() no longer returns a translated and access checked
     // item, do it here instead.
     _menu_link_translate($menu_link);
@@ -137,7 +137,7 @@ public function form(array $form, array &$form_state, EntityInterface $menu_link
   protected function actions(array $form, array &$form_state) {
     $element = parent::actions($form, $form_state);
     $element['submit']['#button_type'] = 'primary';
-    $element['delete']['#access'] = $this->getEntity($form_state)->module == 'menu';
+    $element['delete']['#access'] = $this->entity->module == 'menu';
 
     return $element;
   }
@@ -202,7 +202,7 @@ public function submit(array $form, array &$form_state) {
    * Overrides EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $menu_link = $this->getEntity($form_state);
+    $menu_link = $this->entity;
 
     $saved = $menu_link->save();
 
@@ -220,7 +220,7 @@ public function save(array $form, array &$form_state) {
    * Overrides EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $menu_link = $this->getEntity($form_state);
+    $menu_link = $this->entity;
     $form_state['redirect'] = 'admin/structure/menu/item/' . $menu_link->id() . '/delete';
   }
 }
diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php
index 63b4189..5145a57 100644
--- a/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Datetime\DrupalDateTime;
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -25,7 +24,8 @@ class NodeFormController extends EntityFormController {
    *
    * Overrides Drupal\Core\Entity\EntityFormController::prepareEntity().
    */
-  protected function prepareEntity(EntityInterface $node) {
+  protected function prepareEntity() {
+    $node = $this->entity;
     // Set up default values, if required.
     $node_options = variable_get('node_options_' . $node->type, array('status', 'promote'));
     // If this is a new node, fill in the default values.
@@ -55,7 +55,8 @@ protected function prepareEntity(EntityInterface $node) {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $node) {
+  public function form(array $form, array &$form_state) {
+    $node = $this->entity;
 
     $user_config = config('user.settings');
     // Some special stuff when previewing a node.
@@ -236,7 +237,7 @@ public function form(array $form, array &$form_state, EntityInterface $node) {
    */
   protected function actions(array $form, array &$form_state) {
     $element = parent::actions($form, $form_state);
-    $node = $this->getEntity($form_state);
+    $node = $this->entity;
     $preview_mode = variable_get('node_preview_' . $node->type, DRUPAL_OPTIONAL);
 
     $element['submit']['#access'] = $preview_mode != DRUPAL_REQUIRED || (!form_get_errors() && isset($form_state['node_preview']));
@@ -390,7 +391,7 @@ public function preview(array $form, array &$form_state) {
     //   classes.
     module_load_include('inc', 'node', 'node.pages');
     drupal_set_title(t('Preview'), PASS_THROUGH);
-    $form_state['node_preview'] = node_preview($this->getEntity($form_state));
+    $form_state['node_preview'] = node_preview($this->entity);
     $form_state['rebuild'] = TRUE;
   }
 
@@ -403,7 +404,7 @@ public function preview(array $form, array &$form_state) {
    *   A reference to a keyed array containing the current state of the form.
    */
   public function publish(array $form, array &$form_state) {
-    $node = $this->getEntity($form_state);
+    $node = $this->entity;
     $node->status = 1;
     return $node;
   }
@@ -417,7 +418,7 @@ public function publish(array $form, array &$form_state) {
    *   A reference to a keyed array containing the current state of the form.
    */
   public function unpublish(array $form, array &$form_state) {
-    $node = $this->getEntity($form_state);
+    $node = $this->entity;
     $node->status = 0;
     return $node;
   }
@@ -426,7 +427,7 @@ public function unpublish(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $node = $this->getEntity($form_state);
+    $node = $this->entity;
     $insert = empty($node->nid);
     $node->save();
     $node_link = l(t('view'), 'node/' . $node->nid);
@@ -467,7 +468,7 @@ public function delete(array $form, array &$form_state) {
       $destination = drupal_get_destination();
       unset($_GET['destination']);
     }
-    $node = $this->getEntity($form_state);
+    $node = $this->entity;
     $form_state['redirect'] = array('node/' . $node->nid . '/delete', array('query' => $destination));
   }
 
diff --git a/core/modules/node/lib/Drupal/node/NodeTranslationController.php b/core/modules/node/lib/Drupal/node/NodeTranslationController.php
index a9e6b7c..4531a8e 100644
--- a/core/modules/node/lib/Drupal/node/NodeTranslationController.php
+++ b/core/modules/node/lib/Drupal/node/NodeTranslationController.php
@@ -61,7 +61,7 @@ public function entityFormEntityBuild($entity_type, EntityInterface $entity, arr
     if (isset($form_state['values']['translation_entity'])) {
       $form_controller = translation_entity_form_controller($form_state);
       $translation = &$form_state['values']['translation_entity'];
-      $translation['status'] = $form_controller->getEntity($form_state)->status;
+      $translation['status'] = $form_controller->getEntity()->status;
       $translation['name'] = $form_state['values']['name'];
       $translation['created'] = $form_state['values']['date'];
     }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 9bd3087..931717c 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1995,7 +1995,7 @@ function theme_node_recent_content($variables) {
  * Adds node-type specific visibility options to block configuration form.
  */
 function node_form_block_form_alter(&$form, &$form_state) {
-  $block = $form_state['entity'];
+  $block = $form_state['controller']->getEntity();
   $visibility = $block->get('visibility');
   $form['visibility']['node_type'] = array(
     '#type' => 'details',
diff --git a/core/modules/node/tests/modules/node_access_test/node_access_test.module b/core/modules/node/tests/modules/node_access_test/node_access_test.module
index 25eddba..eb3a2bb 100644
--- a/core/modules/node/tests/modules/node_access_test/node_access_test.module
+++ b/core/modules/node/tests/modules/node_access_test/node_access_test.module
@@ -183,7 +183,7 @@ function node_access_entity_test_page() {
 function node_access_test_form_node_form_alter(&$form, $form_state) {
   // Only show this checkbox for NodeAccessBaseTableTestCase.
   if (state()->get('node_access_test.private')) {
-    $node = $form_state['controller']->getEntity($form_state);
+    $node = $form_state['controller']->getEntity();
     $form['private'] = array(
       '#type' => 'checkbox',
       '#title' => t('Private'),
diff --git a/core/modules/openid/openid.module b/core/modules/openid/openid.module
index 0f2e04f..ad4da7b 100644
--- a/core/modules/openid/openid.module
+++ b/core/modules/openid/openid.module
@@ -289,7 +289,7 @@ function openid_form_user_register_form_alter(&$form, &$form_state) {
       $timezone = current($ax_timezone_values);
     }
     if (in_array($timezone, timezone_identifiers_list())) {
-      $account = $form_state['controller']->getEntity($form_state);
+      $account = $form_state['controller']->getEntity();
       $account->timezone = $timezone;
     }
 
diff --git a/core/modules/overlay/overlay.module b/core/modules/overlay/overlay.module
index 446d56c..3ef4713 100644
--- a/core/modules/overlay/overlay.module
+++ b/core/modules/overlay/overlay.module
@@ -97,7 +97,7 @@ function overlay_field_extra_fields() {
  * Implements hook_form_FORM_ID_alter().
  */
 function overlay_form_user_profile_form_alter(&$form, &$form_state) {
-  $account = $form_state['controller']->getEntity($form_state);
+  $account = $form_state['controller']->getEntity();
   if (user_access('access overlay', $account)) {
     $account_data = drupal_container()->get('user.data')->get('overlay', $account->id(), 'enabled');
     $form['overlay_control'] = array(
diff --git a/core/modules/path/path.module b/core/modules/path/path.module
index cee17ed..683bbd1 100644
--- a/core/modules/path/path.module
+++ b/core/modules/path/path.module
@@ -96,7 +96,7 @@ function path_menu() {
  * @see path_form_element_validate()
  */
 function path_form_node_form_alter(&$form, $form_state) {
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
   $path = array();
   if (!empty($node->nid)) {
     $conditions = array('source' => 'node/' . $node->nid);
@@ -231,7 +231,7 @@ function path_node_predelete(EntityInterface $node) {
 function path_form_taxonomy_term_form_alter(&$form, $form_state) {
   // Make sure this does not show up on the delete confirmation form.
   if (empty($form_state['confirm_delete'])) {
-    $term = $form_state['controller']->getEntity($form_state);
+    $term = $form_state['controller']->getEntity();
     $path = (isset($term->tid) ? drupal_container()->get('path.crud')->load(array('source' => 'taxonomy/term/' . $term->tid)) : array());
     if ($path === FALSE) {
       $path = array();
diff --git a/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php b/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
index 466e14c..b69a277 100644
--- a/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
+++ b/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\picture;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -28,7 +27,8 @@ class PictureMappingFormController extends EntityFormController {
    * @return array
    *   The array containing the complete form.
    */
-  public function form(array $form, array &$form_state, EntityInterface $picture_mapping) {
+  public function form(array $form, array &$form_state) {
+    $picture_mapping = $this->entity;
     $form['label'] = array(
       '#type' => 'textfield',
       '#title' => t('Label'),
@@ -104,7 +104,7 @@ protected function actions(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::validate().
    */
   public function validate(array $form, array &$form_state) {
-    $picture_mapping = $this->getEntity($form_state);
+    $picture_mapping = $this->entity;
 
     // Only validate on edit.
     if (isset($form_state['values']['mappings'])) {
@@ -126,7 +126,7 @@ public function validate(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $picture_mapping = $this->getEntity($form_state);
+    $picture_mapping = $this->entity;
     $picture_mapping->save();
 
     watchdog('picture', 'Picture mapping @label saved.', array('@label' => $picture_mapping->label()), WATCHDOG_NOTICE);
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutFormController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutFormController.php
index 059de38..2b7b1d6 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutFormController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\shortcut;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,9 +17,10 @@ class ShortcutFormController extends EntityFormController {
   /**
    * Overrides \Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
-    $form = parent::form($form, $form_state, $entity);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
 
+    $entity = $this->entity;
     $form['label'] = array(
       '#type' => 'textfield',
       '#title' => t('Set name'),
@@ -53,7 +53,7 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
   protected function actions(array $form, array &$form_state) {
     // Disable delete of default shortcut set.
     $actions = parent::actions($form, $form_state);
-    $actions['delete']['#access'] = shortcut_set_delete_access($this->getEntity($form_state));
+    $actions['delete']['#access'] = shortcut_set_delete_access($this->entity);
     return $actions;
   }
 
@@ -62,7 +62,7 @@ protected function actions(array $form, array &$form_state) {
    */
   public function validate(array $form, array &$form_state) {
     parent::validate($form, $form_state);
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     // Check to prevent a duplicate title.
     if ($form_state['values']['label'] != $entity->label() && shortcut_set_title_exists($form_state['values']['label'])) {
       form_set_error('label', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['label'])));
@@ -73,7 +73,7 @@ public function validate(array $form, array &$form_state) {
    * Overrides \Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $is_new = !$entity->getOriginalID();
     $entity->save();
 
@@ -90,7 +90,7 @@ public function save(array $form, array &$form_state) {
    * Overrides \Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $form_state['redirect'] = 'admin/config/user-interface/shortcut/manage/' . $entity->id() . '/delete';
   }
 
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 13aa535..fc8adaa 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1130,7 +1130,7 @@ function hook_page_alter(&$page) {
  *
  * One popular use of this hook is to add form elements to the node form. When
  * altering a node form, the node entity can be retrieved by invoking
- * $form_state['controller']->getEntity($form_state).
+ * $form_state['controller']->getEntity().
  *
  * In addition to hook_form_alter(), which is called for all forms, there are
  * two more specific form hooks available. The first,
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index ebe5548..9eb8a86 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2650,7 +2650,7 @@ function system_user_login($account) {
 function system_user_timezone(&$form, &$form_state) {
   global $user;
 
-  $account = $form_state['controller']->getEntity($form_state);
+  $account = $form_state['controller']->getEntity();
   $form['timezone'] = array(
     '#type' => 'details',
     '#title' => t('Locale settings'),
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php
index c08e3b3..acea3a1 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php
@@ -6,7 +6,6 @@
 
 namespace Drupal\entity_test;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormControllerNG;
 
 /**
@@ -17,9 +16,10 @@ class EntityTestFormController extends EntityFormControllerNG {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
-    $form = parent::form($form, $form_state, $entity);
+  public function form(array $form, array &$form_state) {
+    $form = parent::form($form, $form_state);
 
+    $entity = $this->entity;
     $langcode = $this->getFormLangcode($form_state);
     $translation = $entity->getTranslation($langcode);
 
@@ -57,7 +57,7 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $is_new = $entity->isNew();
     $entity->save();
 
@@ -83,7 +83,7 @@ public function save(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $entity = $this->getEntity($form_state);
+    $entity = $this->entity;
     $entity->delete();
     drupal_set_message(t('%entity_type @id has been deleted.', array('@id' => $entity->id(), '%entity_type' => $entity->entityType())));
     $form_state['redirect'] = '<front>';
diff --git a/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module b/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module
index 2c6c00a..b9be670 100644
--- a/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module
+++ b/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module
@@ -91,7 +91,7 @@ function taxonomy_test_entity_view($entity, EntityDisplay $display, $view_mode,
  * Implements hook_form_FORM_ID_alter().
  */
 function taxonomy_test_form_taxonomy_term_form_alter(&$form, $form_state, $form_id) {
-  $term = $form_state['controller']->getEntity($form_state);
+  $term = $form_state['controller']->getEntity();
   $antonym = taxonomy_test_get_antonym($term->tid);
   $form['advanced']['antonym'] = array(
     '#type' => 'textfield',
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
index 3735ad6..31c960c 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\taxonomy;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,7 +17,8 @@ class TermFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $term) {
+  public function form(array $form, array &$form_state) {
+    $term = $this->entity;
     $vocabulary = taxonomy_vocabulary_load($term->bundle());
 
     $parent = array_keys(taxonomy_term_load_parents($term->tid));
@@ -150,7 +150,7 @@ public function submit(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $term = $this->getEntity($form_state);
+    $term = $this->entity;
 
     $status = taxonomy_term_save($term);
     switch ($status) {
@@ -199,7 +199,7 @@ public function delete(array $form, array &$form_state) {
       $destination = drupal_get_destination();
       unset($_GET['destination']);
     }
-    $term = $this->getEntity($form_state);
+    $term = $this->entity;
     $form_state['redirect'] = array('taxonomy/term/' . $term->tid . '/delete', array('query' => $destination));
   }
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php
index ab36a79..22a05db 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php
@@ -32,7 +32,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
    */
   function entityFormSave(array $form, array &$form_state) {
     if ($this->getSourceLangcode($form_state)) {
-      $entity = translation_entity_form_controller($form_state)->getEntity($form_state);
+      $entity = translation_entity_form_controller($form_state)->getEntity();
       // We need a redirect here, otherwise we would get an access denied page,
       // since the current URL would be preserved and we would try to add a
       // translation for a language that already has a translation.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
index 6785335..a498aa7 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\taxonomy;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,7 +17,8 @@ class VocabularyFormController extends EntityFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $vocabulary) {
+  public function form(array $form, array &$form_state) {
+    $vocabulary = $this->entity;
 
     // Check whether we need a deletion confirmation form.
     if (isset($form_state['confirm_delete']) && isset($form_state['values']['vid'])) {
@@ -131,7 +131,7 @@ public function validate(array $form, array &$form_state) {
    * Submit handler to update the bundle for the default language configuration.
    */
   public function languageConfigurationSubmit(array &$form, array &$form_state) {
-    $vocabulary = $this->getEntity($form_state);
+    $vocabulary = $this->entity;
     // Delete the old language settings for the vocabulary, if the machine name
     // is changed.
     if ($vocabulary && $vocabulary->id() && $vocabulary->id() != $form_state['values']['vid']) {
@@ -164,7 +164,7 @@ public function submit(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $vocabulary = $this->getEntity($form_state);
+    $vocabulary = $this->entity;
 
     // Prevent leading and trailing spaces in vocabulary names.
     $vocabulary->name = trim($vocabulary->name);
diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module
index 41d8e83..f62832d 100644
--- a/core/modules/translation/translation.module
+++ b/core/modules/translation/translation.module
@@ -192,7 +192,7 @@ function translation_node_type_language_translation_enabled_validate($element, &
  * @see node_form()
  */
 function translation_form_node_form_alter(&$form, &$form_state) {
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
   if (translation_supported_type($node->type)) {
     if (!empty($node->translation_source)) {
       // We are creating a translation. Add values and lock language field.
@@ -410,7 +410,7 @@ function translation_node_update(EntityInterface $node) {
  */
 function translation_node_validate(EntityInterface $node, $form, &$form_state) {
   // Only act on translatable nodes with a tnid or translation_source.
-  $form_node = $form_state['controller']->getEntity($form_state);
+  $form_node = $form_state['controller']->getEntity();
   if (translation_supported_type($node->type) && (!empty($node->tnid) || !empty($form_node->translation_source->nid))) {
     $tnid = !empty($node->tnid) ? $node->tnid : $form_node->translation_source->nid;
     $translations = translation_node_get_translations($tnid);
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
index ce9d3a0..4ffc6ef 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -465,7 +465,7 @@ function entityFormValidate($form, &$form_state) {
    */
   public function entityFormSourceChange($form, &$form_state) {
     $form_controller = translation_entity_form_controller($form_state);
-    $entity = $form_controller->getEntity($form_state);
+    $entity = $form_controller->getEntity();
     $source = $form_state['values']['source_langcode']['source'];
     $path = $this->getBasePath($entity) . '/translations/add/' . $source . '/' . $form_controller->getFormLangcode($form_state);
     $form_state['redirect'] = array('path' => $path);
@@ -480,7 +480,7 @@ public function entityFormSourceChange($form, &$form_state) {
    */
   function entityFormDelete($form, &$form_state) {
     $form_controller = translation_entity_form_controller($form_state);
-    $entity = $form_controller->getEntity($form_state);
+    $entity = $form_controller->getEntity();
     if (count($entity->getTranslationLanguages()) > 1) {
       drupal_set_message(t('This will delete all the translations of %label.', array('%label' => $entity->label())), 'warning');
     }
@@ -493,7 +493,7 @@ function entityFormDelete($form, &$form_state) {
    */
   function entityFormDeleteTranslation($form, &$form_state) {
     $form_controller = translation_entity_form_controller($form_state);
-    $entity = $form_controller->getEntity($form_state);
+    $entity = $form_controller->getEntity();
     $base_path = $this->getBasePath($entity);
     $form_langcode = $form_controller->getFormLangcode($form_state);
     $form_state['redirect'] = $base_path . '/translations/delete/' . $form_langcode;
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index cb75cb2..2758d5b 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -599,7 +599,7 @@ function translation_entity_permission() {
  * Implements hook_form_alter().
  */
 function translation_entity_form_alter(array &$form, array &$form_state) {
-  if (($form_controller = translation_entity_form_controller($form_state)) && ($entity = $form_controller->getEntity($form_state)) && !$entity->isNew() && $entity->isTranslatable()) {
+  if (($form_controller = translation_entity_form_controller($form_state)) && ($entity = $form_controller->getEntity()) && !$entity->isNew() && $entity->isTranslatable()) {
     $controller = translation_entity_controller($entity->entityType());
     $controller->entityFormAlter($form, $form_state, $entity);
 
diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php
index 8f2f0c5..ca8e638 100644
--- a/core/modules/user/lib/Drupal/user/AccountFormController.php
+++ b/core/modules/user/lib/Drupal/user/AccountFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\user;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityFormController;
 
 /**
@@ -18,7 +17,8 @@
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $account) {
+  public function form(array $form, array &$form_state) {
+    $account = $this->entity;
     global $user;
     $config = config('user.settings');
 
@@ -230,7 +230,7 @@ public function form(array $form, array &$form_state, EntityInterface $account)
   public function validate(array $form, array &$form_state) {
     parent::validate($form, $form_state);
 
-    $account = $this->getEntity($form_state);
+    $account = $this->entity;
     // Validate new or changing username.
     if (isset($form_state['values']['name'])) {
       if ($error = user_validate_name($form_state['values']['name'])) {
diff --git a/core/modules/user/lib/Drupal/user/ProfileFormController.php b/core/modules/user/lib/Drupal/user/ProfileFormController.php
index c2b139d..484a4af 100644
--- a/core/modules/user/lib/Drupal/user/ProfileFormController.php
+++ b/core/modules/user/lib/Drupal/user/ProfileFormController.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\user;
 
-use Drupal\Core\Entity\EntityInterface;
-
 /**
  * Form controller for the profile forms.
  */
@@ -19,7 +17,7 @@ class ProfileFormController extends AccountFormController {
    */
   protected function actions(array $form, array &$form_state) {
     $element = parent::actions($form, $form_state);
-    $account = $this->getEntity($form_state);
+    $account = $this->entity;
 
     $element['delete']['#type'] = 'submit';
     $element['delete']['#value'] = t('Cancel account');
@@ -43,7 +41,7 @@ public function submit(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
-    $account = $this->getEntity($form_state);
+    $account = $this->entity;
     $account->save();
     $form_state['values']['uid'] = $account->id();
 
diff --git a/core/modules/user/lib/Drupal/user/ProfileTranslationController.php b/core/modules/user/lib/Drupal/user/ProfileTranslationController.php
index 582644b..c1b2414 100644
--- a/core/modules/user/lib/Drupal/user/ProfileTranslationController.php
+++ b/core/modules/user/lib/Drupal/user/ProfileTranslationController.php
@@ -32,7 +32,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
    */
   function entityFormSave(array $form, array &$form_state) {
     if ($this->getSourceLangcode($form_state)) {
-      $entity = translation_entity_form_controller($form_state)->getEntity($form_state);
+      $entity = translation_entity_form_controller($form_state)->getEntity();
       // We need a redirect here, otherwise we would get an access denied page
       // since the current URL would be preserved and we would try to add a
       // translation for a language that already has a translation.
diff --git a/core/modules/user/lib/Drupal/user/RegisterFormController.php b/core/modules/user/lib/Drupal/user/RegisterFormController.php
index f84a3df..ceecd65 100644
--- a/core/modules/user/lib/Drupal/user/RegisterFormController.php
+++ b/core/modules/user/lib/Drupal/user/RegisterFormController.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\user;
 
-use Drupal\Core\Entity\EntityInterface;
-
 /**
  * Form controller for the user register forms.
  */
@@ -17,8 +15,9 @@ class RegisterFormController extends AccountFormController {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $account) {
+  public function form(array $form, array &$form_state) {
     global $user;
+    $account = $this->entity;
 
     $admin = user_access('administer users');
 
@@ -94,7 +93,7 @@ public function submit(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::submit().
    */
   public function save(array $form, array &$form_state) {
-    $account = $this->getEntity($form_state);
+    $account = $this->entity;
     $pass = $account->pass;
     $admin = $form_state['values']['administer_users'];
     $notify = !empty($form_state['values']['notify']);
diff --git a/core/modules/user/lib/Drupal/user/UserAutocompleteController.php b/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
index 89c8ea3..7e294f5 100644
--- a/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
+++ b/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
@@ -72,7 +72,7 @@ public function autocompleteUser(Request $request, $include_anonymous = FALSE) {
    * @return \Symfony\Component\HttpFoundation\JsonResponse
    *   A JSON response containing the autocomplete suggestions for existing users.
    *
-   * @see \Drupal\user\UserRouteController\autocompleteUser
+   * @see \Drupal\user\UserAutocomplete::autocompleteUser()
    */
   public function autocompleteUserAnonymous(Request $request) {
     return $this->autocompleteUser($request, TRUE);
diff --git a/core/modules/user/lib/Drupal/user/UserRouteController.php b/core/modules/user/lib/Drupal/user/UserRouteController.php
deleted file mode 100644
index cf3b50e..0000000
--- a/core/modules/user/lib/Drupal/user/UserRouteController.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains of Drupal\user\UserRouteController.
- */
-
-namespace Drupal\user;
-
-use Symfony\Component\DependencyInjection\ContainerAware;
-
-/**
- * Returns responses for User module routes.
- */
-class UserRouteController extends ContainerAware {
-
-  /**
-   * Returns the user registration form.
-   *
-   * @return array
-   *   A renderable array containing the user registration form.
-   */
-  public function register() {
-    $account = entity_create('user', array());
-    return entity_get_form($account, 'register');
-  }
-
-}
diff --git a/core/modules/user/user.pages.inc b/core/modules/user/user.pages.inc
index 140b767..0c5f14c 100644
--- a/core/modules/user/user.pages.inc
+++ b/core/modules/user/user.pages.inc
@@ -204,7 +204,7 @@ function user_edit_cancel_submit($form, &$form_state) {
     unset($_GET['destination']);
   }
   // Note: We redirect from user/uid/edit to user/uid/cancel to make the tabs disappear.
-  $account = $form_state['controller']->getEntity($form_state);
+  $account = $form_state['controller']->getEntity();
   $form_state['redirect'] = array("user/" . $account->uid . "/cancel", array('query' => $destination));
 }
 
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index ae65d3a..0798e1d 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -1,7 +1,7 @@
 user_register:
   pattern: '/user/register'
   defaults:
-    _content: '\Drupal\user\UserRouteController::register'
+    _entity_form: 'user.register'
   requirements:
     _access_user_register: 'TRUE'
 
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php
index ceb64f2..7cb32fd 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php
@@ -86,19 +86,6 @@ public function listing() {
   }
 
   /**
-   * Returns the form to add a new view.
-   *
-   * @return array
-   *   The Views add form.
-   */
-  public function add() {
-    drupal_set_title(t('Add new view'));
-
-    $entity = $this->entityManager->getStorageController('view')->create(array());
-    return entity_get_form($entity, 'add');
-  }
-
-  /**
    * Lists all instances of fields on any views.
    *
    * @return array
@@ -210,20 +197,6 @@ public function ajaxOperation(ViewStorageInterface $view, $op, Request $request)
   }
 
   /**
-   * Returns the form to clone a view.
-   *
-   * @param \Drupal\views\ViewStorageInterface $view
-   *   The view being cloned.
-   *
-   * @return array
-   *   The Views clone form.
-   */
-  public function cloneForm(ViewStorageInterface $view) {
-    drupal_set_title(t('Clone of @label', array('@label' => $view->label())));
-    return entity_get_form($view, 'clone');
-  }
-
-  /**
    * Menu callback for Views tag autocompletion.
    *
    * Like other autocomplete functions, this function inspects the 'q' query
@@ -276,20 +249,4 @@ public function edit(ViewUI $view, $display_id = NULL) {
     return $build;
   }
 
-  /**
-   * Returns the form to preview a view.
-   *
-   * @param \Drupal\views_ui\ViewUI $view
-   *   The view being deleted.
-   * @param string|null $display_id
-   *   (optional) The display ID being edited. Defaults to NULL, which will
-   *   load the first available display.
-   *
-   * @return array
-   *   The Views preview form.
-   */
-  public function preview(ViewUI $view, $display_id = NULL) {
-    return entity_get_form($view, 'preview', array('display_id' => $display_id));
-  }
-
 }
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewAddFormController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewAddFormController.php
index 38a1099..40f0086 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewAddFormController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewAddFormController.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\views_ui;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\views\Plugin\views\wizard\WizardPluginBase;
 use Drupal\views\Plugin\views\wizard\WizardException;
 use Drupal\views\Views;
@@ -18,16 +17,25 @@
 class ViewAddFormController extends ViewFormControllerBase {
 
   /**
+   * {@inheritdoc}
+   */
+  public function init(array &$form_state) {
+    parent::init($form_state);
+
+    drupal_set_title(t('Add new view'));
+  }
+
+  /**
    * Overrides Drupal\Core\Entity\EntityFormController::prepareForm().
    */
-  protected function prepareEntity(EntityInterface $view) {
+  protected function prepareEntity() {
     // Do not prepare the entity while it is being added.
   }
 
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $view) {
+  public function form(array $form, array &$form_state) {
     $form['#attached']['css'] = static::getAdminCSS();
     $form['#attached']['js'][] = drupal_get_path('module', 'views_ui') . '/js/views-admin.js';
     $form['#attributes']['class'] = array('views-admin');
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewCloneFormController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewCloneFormController.php
index d78f89b..5e7666c 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewCloneFormController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewCloneFormController.php
@@ -7,25 +7,32 @@
 
 namespace Drupal\views_ui;
 
-use Drupal\Core\Entity\EntityInterface;
-
 /**
  * Form controller for the Views clone form.
  */
 class ViewCloneFormController extends ViewFormControllerBase {
 
   /**
+   * {@inheritdoc}
+   */
+  public function init(array &$form_state) {
+    parent::init($form_state);
+
+    drupal_set_title(t('Clone of @label', array('@label' => $this->entity->label())));
+  }
+
+  /**
    * Overrides \Drupal\Core\Entity\EntityFormController::prepareForm().
    */
-  protected function prepareEntity(EntityInterface $entity) {
+  protected function prepareEntity() {
     // Do not prepare the entity while it is being added.
   }
 
   /**
    * Overrides \Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $entity) {
-    parent::form($form, $form_state, $entity);
+  public function form(array $form, array &$form_state) {
+    parent::form($form, $form_state);
 
     $form['label'] = array(
       '#type' => 'textfield',
@@ -34,7 +41,7 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
       '#size' => 32,
       '#default_value' => '',
       '#maxlength' => 255,
-      '#default_value' => t('Clone of @label', array('@label' => $entity->label())),
+      '#default_value' => t('Clone of @label', array('@label' => $this->entity->label())),
     );
     $form['id'] = array(
       '#type' => 'machine_name',
@@ -67,14 +74,14 @@ protected function actions(array $form, array &$form_state) {
    * Overrides \Drupal\Core\Entity\EntityFormController::form().
    */
   public function submit(array $form, array &$form_state) {
-    $entity = parent::submit($form, $form_state);
-    $entity->setOriginalID(NULL);
-    $entity->save();
+    $this->entity = parent::submit($form, $form_state);
+    $this->entity->setOriginalID(NULL);
+    $this->entity->save();
 
     // Redirect the user to the view admin form.
-    $uri = $entity->uri();
+    $uri = $this->entity->uri();
     $form_state['redirect'] = $uri['path'] . '/edit';
-    return $entity;
+    return $this->entity;
   }
 
 }
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php
index 72617a6..1c175a6 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php
@@ -10,7 +10,6 @@
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\HtmlCommand;
 use Drupal\Core\Ajax\ReplaceCommand;
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\views\ViewExecutable;
 
@@ -20,23 +19,10 @@
 class ViewEditFormController extends ViewFormControllerBase {
 
   /**
-   * Overrides Drupal\Core\Entity\EntityFormController::getEntity().
-   */
-  public function getEntity(array $form_state) {
-    return isset($form_state['view']) ? $form_state['view'] : NULL;
-  }
-
-  /**
-   * Overrides Drupal\Core\Entity\EntityFormController::setEntity().
-   */
-  public function setEntity(EntityInterface $entity, array &$form_state) {
-    $form_state['view'] = $entity;
-  }
-
-  /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $view) {
+  public function form(array $form, array &$form_state) {
+    $view = $this->entity;
     $display_id = $this->displayID;
     // Do not allow the form to be cached, because $form_state['view'] can become
     // stale between page requests.
@@ -198,8 +184,7 @@ protected function actions(array $form, array &$form_state) {
   public function validate(array $form, array &$form_state) {
     parent::validate($form, $form_state);
 
-    $view = $this->getEntity($form_state);
-
+    $view = $this->entity;
     foreach ($view->get('executable')->validate() as $display_errors) {
       foreach ($display_errors as $error) {
         form_set_error('', $error);
@@ -213,7 +198,7 @@ public function validate(array $form, array &$form_state) {
   public function submit(array $form, array &$form_state) {
     parent::submit($form, $form_state);
 
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     // Go through and remove displayed scheduled for removal.
     $displays = $view->get('display');
     foreach ($displays as $id => $display) {
@@ -280,7 +265,7 @@ public function submit(array $form, array &$form_state) {
    */
   public function cancel(array $form, array &$form_state) {
     // Remove this view from cache so edits will be lost.
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     drupal_container()->get('user.tempstore')->get('views')->delete($view->id());
     $form_state['redirect'] = 'admin/structure/views';
   }
@@ -291,7 +276,7 @@ public function cancel(array $form, array &$form_state) {
   protected function actionsElement(array $form, array &$form_state) {
     $element = parent::actionsElement($form, $form_state);
     $element['#weight'] = 0;
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     if (empty($view->changed)) {
       $element['#attributes'] = array(
         'class' => array(
@@ -536,7 +521,7 @@ public function getDisplayDetails($view, $display) {
    * Submit handler to add a restore a removed display to a view.
    */
   public function submitDisplayUndoDelete($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     // Create the new display
     $id = $form_state['display_id'];
     $displays = $view->get('display');
@@ -554,7 +539,7 @@ public function submitDisplayUndoDelete($form, &$form_state) {
    * Submit handler to enable a disabled display.
    */
   public function submitDisplayEnable($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     $id = $form_state['display_id'];
     // setOption doesn't work because this would might affect upper displays
     $view->get('executable')->displayHandlers->get($id)->setOption('enabled', TRUE);
@@ -570,7 +555,7 @@ public function submitDisplayEnable($form, &$form_state) {
    * Submit handler to disable display.
    */
   public function submitDisplayDisable($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     $id = $form_state['display_id'];
     $view->get('executable')->displayHandlers->get($id)->setOption('enabled', FALSE);
 
@@ -585,7 +570,7 @@ public function submitDisplayDisable($form, &$form_state) {
    * Submit handler to delete a display from a view.
    */
   public function submitDisplayDelete($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     $display_id = $form_state['display_id'];
 
     // Mark the display for deletion.
@@ -745,7 +730,7 @@ public function submitDelayDestination($form, &$form_state) {
    * Submit handler to duplicate a display for a view.
    */
   public function submitDisplayDuplicate($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     $display_id = $this->displayID;
 
     // Create the new display.
@@ -768,7 +753,7 @@ public function submitDisplayDuplicate($form, &$form_state) {
    * Submit handler to add a display to a view.
    */
   public function submitDisplayAdd($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     // Create the new display.
     $parents = $form_state['triggering_element']['#parents'];
     $display_type = array_pop($parents);
@@ -786,7 +771,7 @@ public function submitDisplayAdd($form, &$form_state) {
    * Submit handler to clone a display as another display type.
    */
   public function submitCloneDisplayAsType($form, &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     $display_id = $this->displayID;
 
     // Create the new display.
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewFormControllerBase.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewFormControllerBase.php
index edeb3c0..daadcb8 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewFormControllerBase.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewFormControllerBase.php
@@ -8,7 +8,6 @@
 namespace Drupal\views_ui;
 
 use Drupal\Core\Entity\EntityFormController;
-use Drupal\Core\Entity\EntityInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
@@ -25,25 +24,26 @@
   protected $displayID;
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityFormController::build().
+   * {@inheritdoc}
    */
-  public function build(array $form, array &$form_state, EntityInterface $entity) {
-    if (isset($form_state['display_id'])) {
-      $this->displayID = $form_state['display_id'];
+  public function init(array &$form_state) {
+    parent::init($form_state);
+
+    if ($display_id = \Drupal::request()->attributes->get('display_id')) {
+      $this->displayID = $display_id;
     }
 
     // @todo Remove the need for this.
     form_load_include($form_state, 'inc', 'views_ui', 'admin');
-
-    return parent::build($form, $form_state, $entity);
+    $form_state['view'] = $this->entity;
   }
 
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::prepareForm().
    */
-  protected function prepareEntity(EntityInterface $view) {
+  protected function prepareEntity() {
     // Determine the displays available for editing.
-    if ($tabs = $this->getDisplayTabs($view)) {
+    if ($tabs = $this->getDisplayTabs($this->entity)) {
       // If a display isn't specified, use the first one.
       if (empty($this->displayID)) {
         foreach ($tabs as $id => $tab) {
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php
index 6b6821b..3a8adf6 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\views_ui;
 
-use Drupal\Core\Entity\EntityInterface;
-
 /**
  * Form controller for the Views preview form.
  */
@@ -17,7 +15,9 @@ class ViewPreviewFormController extends ViewFormControllerBase {
   /**
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
-  public function form(array $form, array &$form_state, EntityInterface $view) {
+  public function form(array $form, array &$form_state) {
+    $view = $this->entity;
+
     $form['#prefix'] = '<div id="views-preview-wrapper" class="views-admin clearfix">';
     $form['#suffix'] = '</div>';
     $form['#id'] = 'views-ui-preview-form';
@@ -70,7 +70,7 @@ public function form(array $form, array &$form_state, EntityInterface $view) {
    * Overrides Drupal\Core\Entity\EntityFormController::actions().
    */
   protected function actions(array $form, array &$form_state) {
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     return array(
       '#attributes' => array(
         'id' => 'preview-submit-wrapper',
@@ -97,7 +97,7 @@ protected function actions(array $form, array &$form_state) {
    */
   public function submitPreview($form, &$form_state) {
     // Rebuild the form with a pristine $view object.
-    $view = $this->getEntity($form_state);
+    $view = $this->entity;
     // Attempt to load the view from temp store, otherwise create a new one.
     if (!$new_view = drupal_container()->get('user.tempstore')->get('views')->get($view->id())) {
       $new_view = new ViewUI($view);
diff --git a/core/modules/views/views_ui/views_ui.routing.yml b/core/modules/views/views_ui/views_ui.routing.yml
index 9c64891..f2046f6 100644
--- a/core/modules/views/views_ui/views_ui.routing.yml
+++ b/core/modules/views/views_ui/views_ui.routing.yml
@@ -8,7 +8,7 @@ views_ui.list:
 views_ui.add:
   pattern: '/admin/structure/views/add'
   defaults:
-    _controller: '\Drupal\views_ui\Routing\ViewsUIController::add'
+    _entity_form: 'view.add'
   requirements:
     _permission: 'administer views'
 
@@ -51,7 +51,7 @@ views_ui.operation:
 views_ui.clone:
   pattern: '/admin/structure/views/view/{view}/clone'
   defaults:
-    _controller: '\Drupal\views_ui\Routing\ViewsUIController::cloneForm'
+    _entity_form: 'view.clone'
   requirements:
     _permission: 'administer views'
 
@@ -96,7 +96,7 @@ views_ui.preview:
     tempstore:
       view: 'views'
   defaults:
-    _controller: '\Drupal\views_ui\Routing\ViewsUIController::preview'
+    _entity_form: 'view.preview'
     display_id: NULL
   requirements:
     _permission: 'administer views'
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index fa7124c..61212fe 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -141,7 +141,7 @@ function seven_preprocess_install_page(&$variables) {
  * Changes vertical tabs to container and adds meta information.
  */
 function seven_form_node_form_alter(&$form, &$form_state) {
-  $node = $form_state['controller']->getEntity($form_state);
+  $node = $form_state['controller']->getEntity();
 
   $form['#theme'] = array('node_edit_form');
   $form['#attached'] = array(
