diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 37fb310..09f3005 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -414,30 +414,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
@@ -451,9 +427,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;
 }
 
@@ -472,7 +449,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);
 }
 
@@ -496,7 +473,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 bba0000..32067f5 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -282,7 +282,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/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 4a03975..d5ba5a9 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().
+   * Implements EntityFormControllerInterface::getBaseFormID().
    */
-  public function build(array $form, array &$form_state, EntityInterface $entity) {
+  public function getBaseFormID() {
+    return $this->entity->entityType() . '_form';
+  }
 
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  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';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::buildForm().
+   */
+  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)
   }
 
   /**
+   * Implements \Drupal\Core\Form\FormInterface::validateForm().
+   */
+  public function validateForm(array &$form, array &$form_state) {
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submitForm().
+   */
+  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();
@@ -90,7 +142,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'])) {
@@ -189,9 +241,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;
   }
 
   /**
@@ -222,7 +273,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'])) {
@@ -248,7 +299,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;
   }
 
   /**
@@ -273,7 +324,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)) {
@@ -304,7 +355,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);
@@ -314,21 +365,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..b83b2b4 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\FormInterface;
+
 /**
  * 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 FormInterface {
 
   /**
    * 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.
@@ -134,4 +114,14 @@ public function validate(array $form, array &$form_state);
    */
   public function submit(array $form, array &$form_state);
 
+  /**
+   * 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.
+   *
+   * @todo Move to \Drupal\Core\Form\FormInterface.
+   */
+  public function getBaseFormID();
+
 }
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/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 566b2cc..b140ed9 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -330,4 +330,29 @@ public function getAccessController($entity_type) {
     return $this->controllers['access'][$entity_type];
   }
 
+  /**
+   * Returns the built and processed entity form for the given entity.
+   *
+   * @param EntityInterface|string $entity
+   *   The entity edited, or the entity type of the entity to be created.
+   * @param string $operation
+   *   (optional) The operation identifying the form variation to be returned.
+   *   Defaults to 'default'.
+   *
+   * @return array
+   *   The processed form for the given entity and operation.
+   */
+  public function getForm($entity, $operation = 'default') {
+    if (is_string($entity)) {
+      $entity = $this->getStorageController($entity)->create(array());
+    }
+
+    $controller = $this->getFormController($entity->entityType(), $operation)->setEntity($entity);
+    $form_state['build_info']['callback_object'] = $controller;
+    $form_state['build_info']['base_form_id'] = $controller->getBaseFormID();
+    $form_state['build_info']['args'] = array();
+    $form_id = $controller->getFormID();
+    return drupal_build_form($form_id, $form_state);
+  }
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
index 97fb698..b68ab94 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,7 +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);
+    $feed = $this->entity;
     $feed->delete();
     watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $feed->label()));
     drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $feed->label())));
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 bec8b59..d9cf703 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 9e5bf6c..34e86f1 100644
--- a/core/modules/block/lib/Drupal/block/BlockBase.php
+++ b/core/modules/block/lib/Drupal/block/BlockBase.php
@@ -223,7 +223,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',
@@ -423,13 +423,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);
   }
@@ -465,10 +466,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 a2eae8e..7d9c281 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -322,7 +322,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))) {
@@ -361,7 +361,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 9ee6f81..ce19e8a 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -1115,7 +1115,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 4957052..17ede88 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -341,7 +341,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 e536675..28222a0 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 8b35c3e..f9a4f82 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -590,7 +590,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 c51678f..9ef21fb 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;
 
@@ -84,7 +84,7 @@ public function form(array $form, array &$form_state, EntityInterface $menu) {
    * 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()])) {
@@ -115,7 +115,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 c300ed6..36ed4f0 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -551,7 +551,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 ad79f6d..4fccf40 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -2005,7 +2005,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 4efee88..d248ffd 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 6d31124..9c9a689 100644
--- a/core/modules/openid/openid.module
+++ b/core/modules/openid/openid.module
@@ -287,7 +287,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/options/lib/Drupal/options/Tests/OptionsFieldTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
index e715f55..997be90 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
@@ -63,11 +63,11 @@ function setUp() {
    * Test that allowed values can be updated.
    */
   function testUpdateAllowedValues() {
+    $manager = $this->container->get('plugin.manager.entity');
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // All three options appear.
-    $entity = entity_create('entity_test', array());
-    $form = entity_get_form($entity);
+    $form = $manager->getForm('entity_test');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][1]), 'Option 1 exists');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][2]), 'Option 2 exists');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][3]), 'Option 3 exists');
@@ -92,8 +92,7 @@ function testUpdateAllowedValues() {
     // Removed options do not appear.
     $this->field['settings']['allowed_values'] = array(2 => 'Two');
     field_update_field($this->field);
-    $entity = entity_create('entity_test', array());
-    $form = entity_get_form($entity);
+    $form = $manager->getForm('entity_test');
     $this->assertTrue(empty($form[$this->field_name][$langcode][1]), 'Option 1 does not exist');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][2]), 'Option 2 exists');
     $this->assertTrue(empty($form[$this->field_name][$langcode][3]), 'Option 3 does not exist');
@@ -101,7 +100,7 @@ function testUpdateAllowedValues() {
     // Completely new options appear.
     $this->field['settings']['allowed_values'] = array(10 => 'Update', 20 => 'Twenty');
     field_update_field($this->field);
-    $form = entity_get_form($entity);
+    $form = $manager->getForm($entity);
     $this->assertTrue(empty($form[$this->field_name][$langcode][1]), 'Option 1 does not exist');
     $this->assertTrue(empty($form[$this->field_name][$langcode][2]), 'Option 2 does not exist');
     $this->assertTrue(empty($form[$this->field_name][$langcode][3]), 'Option 3 does not exist');
@@ -122,8 +121,7 @@ function testUpdateAllowedValues() {
       ),
     );
     $this->instance = field_create_instance($this->instance);
-    $entity = entity_create('entity_test', array());
-    $form = entity_get_form($entity);
+    $form = $manager->getForm('entity_test');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][1]), 'Option 1 exists');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][2]), 'Option 2 exists');
     $this->assertTrue(!empty($form[$this->field_name][$langcode][3]), 'Option 3 exists');
diff --git a/core/modules/overlay/overlay.module b/core/modules/overlay/overlay.module
index cc29255..97b3e9a 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 6401a8b..9927eac 100644
--- a/core/modules/path/path.module
+++ b/core/modules/path/path.module
@@ -99,7 +99,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);
@@ -234,7 +234,7 @@ function path_node_predelete(Node $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 2f98dad..7ecdac8 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1129,7 +1129,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 1a659c5..89e64df 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2602,7 +2602,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 a864120..55a4e32 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(Node $node) {
  */
 function translation_node_validate(Node $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 ac00322..975d317 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -602,7 +602,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() && translation_entity_enabled($entity->entityType(), $entity->bundle())) {
+  if (($form_controller = translation_entity_form_controller($form_state)) && ($entity = $form_controller->getEntity()) && !$entity->isNew() && translation_entity_enabled($entity->entityType(), $entity->bundle())) {
     $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 2a84412..b533683 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 9b668bf..e75aabc 100644
--- a/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
+++ b/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
@@ -60,7 +60,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 6559313..9448e14 100644
--- a/core/modules/user/user.pages.inc
+++ b/core/modules/user/user.pages.inc
@@ -198,7 +198,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 ad70759..024b385 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -1,7 +1,9 @@
 user_register:
   pattern: '/user/register'
   defaults:
-    _content: '\Drupal\user\UserRouteController::register'
+    _controller: 'plugin.manager.entity:getForm'
+    entity: 'user'
+    operation: '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 b714ab9..849e00a 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
@@ -76,19 +76,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
@@ -200,20 +187,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 @human_name', array('@human_name' => $view->getHumanName())));
-    return entity_get_form($view, 'clone');
-  }
-
-  /**
    * Menu callback for Views tag autocompletion.
    *
    * Like other autocomplete functions, this function inspects the 'q' query
@@ -266,22 +239,6 @@ public function edit(ViewUI $view, $display_id = NULL) {
   }
 
   /**
-   * 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));
-  }
-
-  /**
    * Provides a generic entry point to handle AJAX forms.
    *
    * @param string $js
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 ca6478d..2e6f61b 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;
 
@@ -17,16 +16,25 @@
 class ViewAddFormController extends ViewFormControllerBase {
 
   /**
+   * Overrides ViewFormControllerBase::init().
+   */
+  protected 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 dcf319a..138fe02 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,8 +7,6 @@
 
 namespace Drupal\views_ui;
 
-use Drupal\Core\Entity\EntityInterface;
-
 /**
  * Form controller for the Views clone form.
  */
@@ -17,16 +15,17 @@ class ViewCloneFormController extends ViewFormControllerBase {
   /**
    * 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);
 
+    drupal_set_title(t('Clone of @human_name', array('@human_name' => $this->entity->getHumanName())));
     $form['human_name'] = array(
       '#type' => 'textfield',
       '#title' => t('View name'),
@@ -34,7 +33,7 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
       '#size' => 32,
       '#default_value' => '',
       '#maxlength' => 255,
-      '#default_value' => t('Clone of @human_name', array('@human_name' => $entity->getHumanName())),
+      '#default_value' => t('Clone of @human_name', array('@human_name' => $this->entity->getHumanName())),
     );
     $form['id'] = array(
       '#type' => 'machine_name',
@@ -67,14 +66,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 80d1b7c..d318fb0 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.
@@ -209,8 +195,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);
-    $errors = $view->get('executable')->validate();
+    $errors = $this->entity->get('executable')->validate();
     if ($errors !== TRUE) {
       foreach ($errors as $error) {
         form_set_error('', $error);
@@ -224,7 +209,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) {
@@ -291,7 +276,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';
   }
@@ -302,7 +287,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(
@@ -545,7 +530,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');
@@ -563,7 +548,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);
@@ -579,7 +564,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);
 
@@ -594,7 +579,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.
@@ -754,7 +739,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.
@@ -777,7 +762,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);
@@ -795,7 +780,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 f05f0de..3cc8262 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,24 @@
   protected $displayID;
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityFormController::build().
+   * Overrides \Drupal\Core\Entity\EntityFormController::init().
    */
-  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);
+
+    $this->displayID = drupal_container()->get('request')->attributes->get('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 ed597c2..e319c22 100644
--- a/core/modules/views/views_ui/views_ui.routing.yml
+++ b/core/modules/views/views_ui/views_ui.routing.yml
@@ -8,7 +8,9 @@ views_ui.list:
 views_ui.add:
   pattern: '/admin/structure/views/add'
   defaults:
-    _controller: 'views_ui.controller:add'
+    _controller: 'plugin.manager.entity:getForm'
+    entity: 'view'
+    operation: 'add'
   requirements:
     _permission: 'administer views'
 
@@ -49,9 +51,13 @@ views_ui.operation:
     op: 'enable|disable'
 
 views_ui.clone:
-  pattern: '/admin/structure/views/view/{view}/clone'
+  pattern: '/admin/structure/views/view/{entity}/clone'
+  options:
+    converters:
+      entity: 'view'
   defaults:
-    _controller: 'views_ui.controller:cloneForm'
+    _controller: 'plugin.manager.entity:getForm'
+    operation: 'clone'
   requirements:
     _permission: 'administer views'
 
@@ -91,13 +97,16 @@ views_ui.edit.display:
     _permission: 'administer views'
 
 views_ui.preview:
-  pattern: '/admin/structure/views/view/{view}/preview/{display_id}'
+  pattern: '/admin/structure/views/view/{entity}/preview/{display_id}'
   options:
+    converters:
+      entity: 'view'
     tempstore:
-      view: 'views'
+      entity: 'views'
   defaults:
-    _controller: 'views_ui.controller:preview'
+    _controller: 'plugin.manager.entity:getForm'
     display_id: NULL
+    operation: 'preview'
   requirements:
     _permission: 'administer views'
 
diff --git a/core/themes/seven/template.php b/core/themes/seven/template.php
index 147e557..e20459f 100644
--- a/core/themes/seven/template.php
+++ b/core/themes/seven/template.php
@@ -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(
