diff --git a/core/core.services.yml b/core/core.services.yml
index c814824..01de6f6 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -188,6 +188,9 @@ services:
   entity.manager:
     class: Drupal\Core\Entity\EntityManager
     arguments: ['@container.namespaces', '@service_container', '@module_handler', '@cache.cache', '@language_manager', '@string_translation']
+  entity.form_builder:
+    class: Drupal\Core\Entity\EntityFormBuilder
+    arguments: ['@entity.manager', '@form_builder']
   plugin.manager.field.field_type:
     class: Drupal\Core\Field\FieldTypePluginManager
     arguments: ['@container.namespaces', '@cache.field', '@language_manager', '@module_handler']
diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 98acf56..c0f62a8 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -443,31 +443,6 @@ function entity_access_controller($entity_type) {
 }
 
 /**
- * Returns the built and processed entity form for the given entity.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- *   The entity to be created or edited.
- * @param string $operation
- *   (optional) The operation identifying the form variation to be returned.
- * @param array $form_state
- *   (optional) An associative array containing the current state of the form.
- *   Use this to pass additional information to the form, such as the langcode.
- *   @code
- *   $form_state['langcode'] = $langcode;
- *   $form = entity_get_form($entity, 'default', $form_state);
- *   @endcode
- *
- * @return array
- *   The processed form for the given entity and operation.
- *
- * @deprecated Use \Drupal::entityManager()->getForm() or _entity_form from a
- *   routing.yml file instead of a page callback.
- */
-function entity_get_form(EntityInterface $entity, $operation = 'default', array $form_state = array()) {
-  return \Drupal::entityManager()->getForm($entity, $operation, $form_state);
-}
-
-/**
  * Returns an entity list controller for a given entity type.
  *
  * @param string $entity_type
diff --git a/core/lib/Drupal/Core/Controller/ControllerBase.php b/core/lib/Drupal/Core/Controller/ControllerBase.php
index 23a2cac..ddcf87c 100644
--- a/core/lib/Drupal/Core/Controller/ControllerBase.php
+++ b/core/lib/Drupal/Core/Controller/ControllerBase.php
@@ -38,6 +38,13 @@
   protected $entityManager;
 
   /**
+   * The entity form builder.
+   *
+   * @var \Drupal\Core\Entity\EntityFormBuilderInterface
+   */
+  protected $entityFormBuilder;
+
+  /**
    * The language manager.
    *
    * @var \Drupal\Core\Language\LanguageManager
@@ -114,6 +121,19 @@ protected function entityManager() {
   }
 
   /**
+   * Retrieves the entity form builder.
+   *
+   * @return \Drupal\Core\Entity\EntityFormBuilderInterface
+   *   The entity form builder.
+   */
+  protected function entityFormBuilder() {
+    if (!$this->entityFormBuilder) {
+      $this->entityFormBuilder = $this->container()->get('entity.form_builder');
+    }
+    return $this->entityFormBuilder;
+  }
+
+  /**
    * Returns the requested cache bin.
    *
    * @param string $bin
diff --git a/core/lib/Drupal/Core/Entity/EntityFormBuilder.php b/core/lib/Drupal/Core/Entity/EntityFormBuilder.php
new file mode 100644
index 0000000..a601b8f
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityFormBuilder.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\EntityFormBuilder.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Core\Form\FormBuilderInterface;
+
+/**
+ * Builds entity forms.
+ */
+class EntityFormBuilder implements EntityFormBuilderInterface {
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The form builder.
+   *
+   * @var \Drupal\Core\Form\FormBuilderInterface
+   */
+  protected $formBuilder;
+
+  /**
+   * Constructs a new EntityFormBuilder.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Form\FormBuilderInterface $form_builder
+   *   The form builder.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, FormBuilderInterface $form_builder) {
+    $this->entityManager = $entity_manager;
+    $this->formBuilder = $form_builder;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getForm(EntityInterface $entity, $operation = 'default', array $form_state = array()) {
+    $controller = $this->entityManager->getFormController($entity->getEntityTypeId(), $operation);
+    $controller->setEntity($entity);
+
+    $form_state['build_info']['callback_object'] = $controller;
+    $form_state['build_info']['base_form_id'] = $controller->getBaseFormID();
+    $form_state['build_info'] += array('args' => array());
+
+    return $this->formBuilder->buildForm($controller->getFormId(), $form_state);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Entity/EntityFormBuilderInterface.php b/core/lib/Drupal/Core/Entity/EntityFormBuilderInterface.php
new file mode 100644
index 0000000..fc3d1a5
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityFormBuilderInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\EntityFormBuilderInterface.
+ */
+
+namespace Drupal\Core\Entity;
+
+/**
+ * Builds entity forms.
+ */
+interface EntityFormBuilderInterface {
+
+  /**
+   * Returns the built and processed entity form for the given entity.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   The entity to be created or edited.
+   * @param string $operation
+   *   (optional) The operation identifying the form variation to be returned.
+   *   Defaults to 'default'.
+   * @param array $form_state
+   *   (optional) An associative array containing the current state of the form.
+   *   Use this to pass additional information to the form, such as the
+   *   langcode. Defaults to an empty array.
+   *
+   * @code
+   *   $form_state['langcode'] = $langcode;
+   *   $form = \Drupal::service('entity.form_builder')->getForm($entity, 'default', $form_state);
+   * @endcode
+   *
+   * @return array
+   *   The processed form for the given entity and operation.
+   */
+  public function getForm(EntityInterface $entity, $operation = 'default', array $form_state = array());
+
+}
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 8f7e929..9ebb7c6 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -282,22 +282,6 @@ public function getController($entity_type, $controller_type, $controller_class_
   /**
    * {@inheritdoc}
    */
-  public function getForm(EntityInterface $entity, $operation = 'default', array $form_state = array()) {
-    $form_state['build_info'] = isset($form_state['build_info']) ? $form_state['build_info'] : array();
-    $controller = $this->getFormController($entity->getEntityTypeId(), $operation);
-    $controller->setEntity($entity);
-    $form_state['build_info'] += array(
-      'callback_object' => $controller,
-      'base_form_id' => $controller->getBaseFormID(),
-      'args' => array(),
-    );
-    $form_id = $controller->getFormID();
-    return \Drupal::formBuilder()->buildForm($form_id, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getAdminRouteInfo($entity_type, $bundle) {
     if (($entity_info = $this->getDefinition($entity_type)) && $admin_form = $entity_info->getLinkTemplate('admin-form')) {
       return array(
diff --git a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
index 35c7280..b68fde8 100644
--- a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
@@ -186,30 +186,6 @@ public function hasController($entity_type, $controller_type);
   public function getController($entity_type, $controller_type);
 
   /**
-   * Returns the built and processed entity form for the given entity.
-   *
-   * @param \Drupal\Core\Entity\EntityInterface $entity
-   *   The entity to be created or edited.
-   * @param string $operation
-   *   (optional) The operation identifying the form variation to be returned.
-   *   Defaults to 'default'.
-   * @param array $form_state
-   *   (optional) An associative array containing the current state of the form.
-   *   Use this to pass additional information to the form, such as the
-   *   langcode. Defaults to an empty array.
-   *
-   * @code
-   *   $form_state['langcode'] = $langcode;
-   *   $manager = \Drupal::entityManager();
-   *   $form = $manager->getForm($entity, 'default', $form_state);
-   * @endcode
-   *
-   * @return array
-   *   The processed form for the given entity and operation.
-   */
-  public function getForm(EntityInterface $entity, $operation = 'default', array $form_state = array());
-
-  /**
    * Get the bundle info of an entity type.
    *
    * @param string $entity_type
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
index f9b25b9..7c39b3e 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
@@ -56,12 +56,11 @@ public static function create(ContainerInterface $container) {
    *   A form array as expected by drupal_render().
    */
   public function feedAdd() {
-    $entity_manager = $this->entityManager();
-    $feed = $entity_manager->getStorageController('aggregator_feed')
+    $feed = $this->entityManager()->getStorageController('aggregator_feed')
       ->create(array(
         'refresh' => 3600,
       ));
-    return $entity_manager->getForm($feed);
+    return $this->entityFormBuilder()->getForm($feed);
   }
 
   /**
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php
index 6469baf..9b01c7a 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Controller/CustomBlockController.php
@@ -18,13 +18,6 @@
 class CustomBlockController extends ControllerBase implements ContainerInjectionInterface {
 
   /**
-   * The entity manager.
-   *
-   * @var \Drupal\Component\Plugin\PluginManagerInterface
-   */
-  protected $entityManager;
-
-  /**
    * The custom block storage controller.
    *
    * @var \Drupal\Core\Entity\EntityStorageControllerInterface
@@ -44,7 +37,6 @@ class CustomBlockController extends ControllerBase implements ContainerInjection
   public static function create(ContainerInterface $container) {
     $entity_manager = $container->get('entity.manager');
     return new static(
-      $entity_manager,
       $entity_manager->getStorageController('custom_block'),
       $entity_manager->getStorageController('custom_block_type')
     );
@@ -53,17 +45,14 @@ public static function create(ContainerInterface $container) {
   /**
    * Constructs a CustomBlock object.
    *
-   * @param \Drupal\Component\Plugin\PluginManagerInterface $entity_manager
-   *   The entity manager.
    * @param \Drupal\Core\Entity\EntityStorageControllerInterface $custom_block_storage
    *   The custom block storage controller.
    * @param \Drupal\Core\Entity\EntityStorageControllerInterface $custom_block_type_storage
    *   The custom block type storage controller.
    */
-  public function __construct(PluginManagerInterface $entity_manager, EntityStorageControllerInterface $custom_block_storage, EntityStorageControllerInterface $custom_block_type_storage) {
+  public function __construct(EntityStorageControllerInterface $custom_block_storage, EntityStorageControllerInterface $custom_block_type_storage) {
     $this->customBlockStorage = $custom_block_storage;
     $this->customBlockTypeStorage = $custom_block_type_storage;
-    $this->entityManager = $entity_manager;
   }
 
   /**
@@ -108,7 +97,7 @@ public function addForm(CustomBlockTypeInterface $custom_block_type, Request $re
       // newly created block in the given theme.
       $block->setTheme($theme);
     }
-    return $this->entityManager->getForm($block);
+    return $this->entityFormBuilder()->getForm($block);
   }
 
   /**
diff --git a/core/modules/block/lib/Drupal/block/Controller/BlockAddController.php b/core/modules/block/lib/Drupal/block/Controller/BlockAddController.php
index 9e0c7c2..716bc6e 100644
--- a/core/modules/block/lib/Drupal/block/Controller/BlockAddController.php
+++ b/core/modules/block/lib/Drupal/block/Controller/BlockAddController.php
@@ -30,7 +30,7 @@ public function blockAddConfigureForm($plugin_id, $theme) {
     // Create a block entity.
     $entity = $this->entityManager()->getStorageController('block')->create(array('plugin' => $plugin_id, 'theme' => $theme));
 
-    return $this->entityManager()->getForm($entity);
+    return $this->entityFormBuilder()->getForm($entity);
   }
 
 }
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 25607de..6898873 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -603,7 +603,7 @@ function comment_add(EntityInterface $entity, $field_name = 'comment', $pid = NU
     'pid' => $pid,
   );
   $comment = entity_create('comment', $values);
-  return \Drupal::entityManager()->getForm($comment);
+  return \Drupal::service('entity.form_builder')->getForm($comment);
 }
 
 /**
diff --git a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
index 73e8cfd..671a5a7 100644
--- a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
+++ b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
@@ -271,7 +271,7 @@ public function getReplyForm(Request $request, $entity_type, $entity_id, $field_
       'entity_type' => $entity->getEntityTypeId(),
       'field_id' => $entity->getEntityTypeId() . '__' . $field_name,
     ));
-    $build['comment_form'] = $this->entityManager()->getForm($comment);
+    $build['comment_form'] = $this->entityFormBuilder()->getForm($comment);
 
     return $build;
   }
diff --git a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestController.php b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestController.php
index 169cf89..836b76a 100644
--- a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestController.php
+++ b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestController.php
@@ -28,7 +28,7 @@ class ConfigTestController extends ControllerBase {
    *   A form array as expected by drupal_render().
    */
   public function edit(ConfigTest $config_test) {
-    $form = $this->entityManager()->getForm($config_test);
+    $form = $this->entityFormBuilder()->getForm($config_test);
     $form['#title'] = String::format('Edit %label', array('%label' => $config_test->label()));
     return $form;
   }
diff --git a/core/modules/contact/lib/Drupal/contact/Controller/ContactController.php b/core/modules/contact/lib/Drupal/contact/Controller/ContactController.php
index ff5f71d..548f652 100644
--- a/core/modules/contact/lib/Drupal/contact/Controller/ContactController.php
+++ b/core/modules/contact/lib/Drupal/contact/Controller/ContactController.php
@@ -91,7 +91,7 @@ public function contactSitePage(CategoryInterface $contact_category = NULL) {
         'category' => $contact_category->id(),
       ));
 
-    $form = $this->entityManager()->getForm($message);
+    $form = $this->entityFormBuilder()->getForm($message);
     $form['#title'] = String::checkPlain($contact_category->label());
     return $form;
   }
@@ -116,7 +116,7 @@ public function contactPersonalPage(UserInterface $user) {
       'recipient' => $user->id(),
     ));
 
-    $form = $this->entityManager()->getForm($message);
+    $form = $this->entityFormBuilder()->getForm($message);
     $form['#title'] = $this->t('Contact @username', array('@username' => $user->getUsername()));
     return $form;
   }
diff --git a/core/modules/content_translation/content_translation.pages.inc b/core/modules/content_translation/content_translation.pages.inc
index 5b3588b..3272296 100644
--- a/core/modules/content_translation/content_translation.pages.inc
+++ b/core/modules/content_translation/content_translation.pages.inc
@@ -189,7 +189,7 @@ function content_translation_add_page(EntityInterface $entity, Language $source
   $form_state['content_translation']['source'] = $source;
   $form_state['content_translation']['target'] = $target;
   $form_state['content_translation']['translation_form'] = !$entity->access('update');
-  return \Drupal::entityManager()->getForm($entity, 'default', $form_state);
+  return \Drupal::service('entity.form_builder')->getForm($entity, 'default', $form_state);
 }
 
 /**
@@ -210,7 +210,7 @@ function content_translation_edit_page(EntityInterface $entity, Language $langua
   $language = !empty($language) ? $language : language(Language::TYPE_CONTENT);
   $form_state['langcode'] = $language->id;
   $form_state['content_translation']['translation_form'] = TRUE;
-  return \Drupal::entityManager()->getForm($entity, 'default', $form_state);
+  return \Drupal::service('entity.form_builder')->getForm($entity, 'default', $form_state);
 }
 
 /**
diff --git a/core/modules/forum/lib/Drupal/forum/Controller/ForumController.php b/core/modules/forum/lib/Drupal/forum/Controller/ForumController.php
index 2372e71..440c54e 100644
--- a/core/modules/forum/lib/Drupal/forum/Controller/ForumController.php
+++ b/core/modules/forum/lib/Drupal/forum/Controller/ForumController.php
@@ -8,9 +8,8 @@
 namespace Drupal\forum\Controller;
 
 use Drupal\Core\Config\Config;
-use Drupal\Core\Controller\ControllerInterface;
+use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\StringTranslation\TranslationInterface;
 use Drupal\forum\ForumManagerInterface;
 use Drupal\taxonomy\TermInterface;
@@ -21,7 +20,7 @@
 /**
  * Controller routines for forum routes.
  */
-class ForumController implements ContainerInjectionInterface {
+class ForumController extends ControllerBase implements ContainerInjectionInterface {
 
   /**
    * Forum manager service.
@@ -31,13 +30,6 @@ class ForumController implements ContainerInjectionInterface {
   protected $forumManager;
 
   /**
-   * Entity Manager Service.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
    * Config object for forum.settings.
    *
    * @var \Drupal\Core\Config\Config
@@ -76,17 +68,14 @@ class ForumController implements ContainerInjectionInterface {
    *   Vocabulary storage controller.
    * @param \Drupal\taxonomy\TermStorageControllerInterface $term_storage_controller
    *   Term storage controller.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager service.
    * @param \Drupal\Core\StringTranslation\TranslationInterface $translation_manager
    *   The translation manager service.
    */
-  public function __construct(Config $config, ForumManagerInterface $forum_manager, VocabularyStorageControllerInterface $vocabulary_storage_controller, TermStorageControllerInterface $term_storage_controller, EntityManagerInterface $entity_manager, TranslationInterface $translation_manager) {
+  public function __construct(Config $config, ForumManagerInterface $forum_manager, VocabularyStorageControllerInterface $vocabulary_storage_controller, TermStorageControllerInterface $term_storage_controller, TranslationInterface $translation_manager) {
     $this->config = $config;
     $this->forumManager = $forum_manager;
     $this->vocabularyStorageController = $vocabulary_storage_controller;
     $this->termStorageController = $term_storage_controller;
-    $this->entityManager = $entity_manager;
     $this->translationManager = $translation_manager;
   }
 
@@ -99,7 +88,6 @@ public static function create(ContainerInterface $container) {
       $container->get('forum_manager'),
       $container->get('entity.manager')->getStorageController('taxonomy_vocabulary'),
       $container->get('entity.manager')->getStorageController('taxonomy_term'),
-      $container->get('entity.manager'),
       $container->get('string_translation')
     );
   }
@@ -193,7 +181,7 @@ public function addForum() {
       'vid' => $vid,
       'forum_controller' => 0,
     ));
-    return $this->entityManager->getForm($taxonomy_term, 'forum');
+    return $this->entityFormBuilder()->getForm($taxonomy_term, 'forum');
   }
 
   /**
@@ -208,7 +196,7 @@ public function addContainer() {
       'vid' => $vid,
       'forum_container' => 1,
     ));
-    return $this->entityManager->getForm($taxonomy_term, 'container');
+    return $this->entityFormBuilder()->getForm($taxonomy_term, 'container');
   }
 
   /**
diff --git a/core/modules/menu/lib/Drupal/menu/Controller/MenuController.php b/core/modules/menu/lib/Drupal/menu/Controller/MenuController.php
index bcf65dc..0223ff7 100644
--- a/core/modules/menu/lib/Drupal/menu/Controller/MenuController.php
+++ b/core/modules/menu/lib/Drupal/menu/Controller/MenuController.php
@@ -8,8 +8,8 @@
 namespace Drupal\menu\Controller;
 
 use Drupal\Component\Utility\Xss;
+use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\menu_link\MenuLinkStorageControllerInterface;
 use Drupal\system\MenuInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -19,7 +19,7 @@
 /**
  * Returns responses for Menu routes.
  */
-class MenuController implements ContainerInjectionInterface {
+class MenuController extends ControllerBase implements ContainerInjectionInterface {
 
   /**
    * The menu link storage.
@@ -29,23 +29,13 @@ class MenuController implements ContainerInjectionInterface {
   protected $menuLinkStorage;
 
   /**
-   * The entity manager.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
    * Constructs a new MenuController.
    *
    * @param \Drupal\menu_link\MenuLinkStorageControllerInterface $menu_link_storage
    *   The storage controller.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
    */
-  public function __construct(MenuLinkStorageControllerInterface $menu_link_storage, EntityManagerInterface $entity_manager) {
+  public function __construct(MenuLinkStorageControllerInterface $menu_link_storage) {
     $this->menuLinkStorage = $menu_link_storage;
-    $this->entityManager = $entity_manager;
   }
 
   /**
@@ -53,8 +43,7 @@ public function __construct(MenuLinkStorageControllerInterface $menu_link_storag
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('entity.manager')->getStorageController('menu_link'),
-      $container->get('entity.manager')
+      $container->get('entity.manager')->getStorageController('menu_link')
     );
   }
 
@@ -94,7 +83,7 @@ public function addLink(MenuInterface $menu) {
       'plid' => 0,
       'menu_name' => $menu->id(),
     ));
-    return $this->entityManager->getForm($menu_link);
+    return $this->entityFormBuilder()->getForm($menu_link);
   }
 
   /**
diff --git a/core/modules/node/lib/Drupal/node/Controller/NodeController.php b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
index 4d62d12..273f441 100644
--- a/core/modules/node/lib/Drupal/node/Controller/NodeController.php
+++ b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
@@ -72,7 +72,7 @@ public function add(NodeTypeInterface $node_type) {
       'langcode' => $langcode ? $langcode : $this->languageManager()->getCurrentLanguage()->id,
     ));
 
-    $form = $this->entityManager()->getForm($node);
+    $form = $this->entityFormBuilder()->getForm($node);
 
     return $form;
   }
diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
index c00cc63..5e80818 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
@@ -35,7 +35,7 @@ public static function getInfo() {
   function testUpdateAllowedValues() {
     // All three options appear.
     $entity = entity_create('entity_test', array());
-    $form = \Drupal::entityManager()->getForm($entity);
+    $form = \Drupal::service('entity.form_builder')->getForm($entity);
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][1]), 'Option 1 exists');
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][2]), 'Option 2 exists');
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][3]), 'Option 3 exists');
@@ -61,7 +61,7 @@ function testUpdateAllowedValues() {
     $this->field->settings['allowed_values'] = array(2 => 'Two');
     $this->field->save();
     $entity = entity_create('entity_test', array());
-    $form = \Drupal::entityManager()->getForm($entity);
+    $form = \Drupal::service('entity.form_builder')->getForm($entity);
     $this->assertTrue(empty($form[$this->fieldName]['widget'][1]), 'Option 1 does not exist');
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][2]), 'Option 2 exists');
     $this->assertTrue(empty($form[$this->fieldName]['widget'][3]), 'Option 3 does not exist');
@@ -72,7 +72,7 @@ function testUpdateAllowedValues() {
     // The entity holds an outdated field object with the old allowed values
     // setting, so we need to reintialize the entity object.
     $entity = entity_create('entity_test', array());
-    $form = \Drupal::entityManager()->getForm($entity);
+    $form = \Drupal::service('entity.form_builder')->getForm($entity);
     $this->assertTrue(empty($form[$this->fieldName]['widget'][1]), 'Option 1 does not exist');
     $this->assertTrue(empty($form[$this->fieldName]['widget'][2]), 'Option 2 does not exist');
     $this->assertTrue(empty($form[$this->fieldName]['widget'][3]), 'Option 3 does not exist');
@@ -93,7 +93,7 @@ function testUpdateAllowedValues() {
       ))
       ->save();
     $entity = entity_create('entity_test', array());
-    $form = \Drupal::entityManager()->getForm($entity);
+    $form = \Drupal::service('entity.form_builder')->getForm($entity);
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][1]), 'Option 1 exists');
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][2]), 'Option 2 exists');
     $this->assertTrue(!empty($form[$this->fieldName]['widget'][3]), 'Option 3 exists');
diff --git a/core/modules/search/lib/Drupal/search/Controller/SearchController.php b/core/modules/search/lib/Drupal/search/Controller/SearchController.php
index 83ca3b5..031f303 100644
--- a/core/modules/search/lib/Drupal/search/Controller/SearchController.php
+++ b/core/modules/search/lib/Drupal/search/Controller/SearchController.php
@@ -88,7 +88,7 @@ public function view(Request $request, SearchPageInterface $entity, $keys = '')
       }
     }
     // The form may be altered based on whether the search was run.
-    $build['search_form'] = $this->entityManager()->getForm($entity, 'search');
+    $build['search_form'] = $this->entityFormBuilder()->getForm($entity, 'search');
     $build['search_results'] = $results;
     return $build;
   }
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Controller/ShortcutController.php b/core/modules/shortcut/lib/Drupal/shortcut/Controller/ShortcutController.php
index a7b0d42..1ed6f0a 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/Controller/ShortcutController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/Controller/ShortcutController.php
@@ -31,7 +31,7 @@ public function addForm(ShortcutSetInterface $shortcut_set) {
     if ($this->moduleHandler()->moduleExists('language')) {
       $shortcut->langcode = language_get_default_langcode('shortcut', $shortcut_set->id());
     }
-    return $this->entityManager()->getForm($shortcut, 'add');
+    return $this->entityFormBuilder()->getForm($shortcut, 'add');
   }
 
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
index c748162..46b81bf 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
@@ -78,7 +78,7 @@ function testEntityFormLanguage() {
     // Explicitly set form langcode.
     $langcode = $this->langcodes[0];
     $form_state['langcode'] = $langcode;
-    \Drupal::entityManager()->getForm($node, 'default', $form_state);
+    \Drupal::service('entity.form_builder')->getForm($node, 'default', $form_state);
     $form_langcode = \Drupal::state()->get('entity_test.form_langcode') ?: FALSE;
     $this->assertTrue($langcode == $form_langcode, 'Form language is the same as the language parameter.');
 
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index 91504fb..29f4ba1 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -287,7 +287,7 @@ function entity_test_form_node_form_alter(&$form, &$form_state, $form_id) {
 function entity_test_add($entity_type) {
   drupal_set_title(t('Create an @type', array('@type' => $entity_type)));
   $entity = entity_create($entity_type, array());
-  return \Drupal::entityManager()->getForm($entity);
+  return \Drupal::service('entity.form_builder')->getForm($entity);
 }
 
 /**
@@ -305,7 +305,7 @@ function entity_test_add($entity_type) {
  */
 function entity_test_edit(EntityInterface $entity) {
   drupal_set_title($entity->label(), PASS_THROUGH);
-  return \Drupal::entityManager()->getForm($entity);
+  return \Drupal::service('entity.form_builder')->getForm($entity);
 }
 
 /**
diff --git a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Controller/FormTestController.php b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Controller/FormTestController.php
index e897184..59a119d 100644
--- a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Controller/FormTestController.php
+++ b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Controller/FormTestController.php
@@ -30,8 +30,8 @@ public function twoFormInstances() {
     );
     $node1 = $this->entityManager()->getStorageController('node')->create($values);
     $node2 = clone($node1);
-    $return['node_form_1'] = $this->entityManager()->getForm($node1);
-    $return['node_form_2'] = $this->entityManager()->getForm($node2);
+    $return['node_form_1'] = $this->entityFormBuilder()->getForm($node1);
+    $return['node_form_2'] = $this->entityFormBuilder()->getForm($node2);
     return $return;
   }
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Controller/TaxonomyController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Controller/TaxonomyController.php
index cf49ec6..9ade6c9 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Controller/TaxonomyController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Controller/TaxonomyController.php
@@ -32,7 +32,7 @@ public function addForm(VocabularyInterface $taxonomy_vocabulary) {
     if ($this->moduleHandler()->moduleExists('language')) {
       $term->langcode = language_get_default_langcode('taxonomy_term', $taxonomy_vocabulary->id());
     }
-    return $this->entityManager()->getForm($term);
+    return $this->entityFormBuilder()->getForm($term);
   }
 
   /**
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Controller/ViewsUIController.php b/core/modules/views_ui/lib/Drupal/views_ui/Controller/ViewsUIController.php
index 0ee468a..25d1cdd 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/Controller/ViewsUIController.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/Controller/ViewsUIController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views_ui\Controller;
 
+use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\views\ViewExecutable;
 use Drupal\views\ViewStorageInterface;
@@ -25,7 +26,7 @@
 /**
  * Returns responses for Views UI routes.
  */
-class ViewsUIController implements ContainerInjectionInterface {
+class ViewsUIController extends ControllerBase implements ContainerInjectionInterface {
 
   /**
    * Stores the Entity manager.
@@ -245,8 +246,8 @@ public function edit(ViewUI $view, $display_id = NULL) {
     }
     $build['#title'] = $name;
 
-    $build['edit'] = $this->entityManager->getForm($view, 'edit', array('display_id' => $display_id));
-    $build['preview'] = $this->entityManager->getForm($view, 'preview', array('display_id' => $display_id));
+    $build['edit'] = $this->entityFormBuilder()->getForm($view, 'edit', array('display_id' => $display_id));
+    $build['preview'] = $this->entityFormBuilder()->getForm($view, 'preview', array('display_id' => $display_id));
     return $build;
   }
 
diff --git a/core/tests/Drupal/Tests/Core/Cache/CacheCollectorTest.php b/core/tests/Drupal/Tests/Core/Cache/CacheCollectorTest.php
index 58e740d..05a987c 100644
--- a/core/tests/Drupal/Tests/Core/Cache/CacheCollectorTest.php
+++ b/core/tests/Drupal/Tests/Core/Cache/CacheCollectorTest.php
@@ -64,16 +64,7 @@ protected function setUp() {
     $this->cid = $this->randomName();
     $this->collector = new CacheCollectorHelper($this->cid, $this->cache, $this->lock);
 
-    $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
-    $container->expects($this->any())
-      ->method('getParameter')
-      ->with('cache_bins')
-      ->will($this->returnValue(array('cache.test' => 'test')));
-    $container->expects($this->any())
-      ->method('get')
-      ->with('cache.test')
-      ->will($this->returnValue($this->cache));
-    \Drupal::setContainer($container);
+    $this->getContainerWithCacheBins($this->cache);
   }
 
 
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityFormBuilderTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityFormBuilderTest.php
new file mode 100644
index 0000000..ecba429
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityFormBuilderTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Drupal\Tests\Core\Entity;
+
+use Drupal\Core\Entity\EntityFormBuilder;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Entity\EntityFormBuilder
+ */
+class EntityFormBuilderTest extends UnitTestCase {
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $entityManager;
+
+  /**
+   * The form builder.
+   *
+   * @var \Drupal\Core\Form\FormBuilderInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $formBuilder;
+
+  /**
+   * The entity form builder.
+   *
+   * @var \Drupal\Core\Entity\EntityFormBuilderInterface
+   */
+  protected $entityFormBuilder;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity Form Builder test',
+      'description' => 'Unit test the entity form builder.',
+      'group' => 'Entity',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->formBuilder = $this->getMock('Drupal\Core\Form\FormBuilderInterface');
+    $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
+    $this->entityFormBuilder = new EntityFormBuilder($this->entityManager, $this->formBuilder);
+  }
+
+  /**
+   * Tests the getForm() method.
+   *
+   * @covers ::getForm()
+   */
+  public function testGetForm() {
+    $this->formBuilder->expects($this->once())
+      ->method('buildForm')
+      ->with('the_form_id', $this->isType('array'))
+      ->will($this->returnValue('the form contents'));
+
+    $form_controller = $this->getMock('Drupal\Core\Entity\EntityFormControllerInterface');
+    $form_controller->expects($this->any())
+      ->method('getFormId')
+      ->will($this->returnValue('the_form_id'));
+    $this->entityManager->expects($this->any())
+      ->method('getFormController')
+      ->with('the_entity_type', 'default')
+      ->will($this->returnValue($form_controller));
+
+    $entity = $this->getMock('Drupal\Core\Entity\EntityInterface');
+    $entity->expects($this->once())
+      ->method('getEntityTypeId')
+      ->will($this->returnValue('the_entity_type'));
+
+    $this->assertSame('the form contents', $this->entityFormBuilder->getForm($entity));
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
index 24df3b7..ed8826d 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
@@ -122,26 +122,12 @@ protected function setUp() {
 
     $this->formBuilder = $this->getMock('Drupal\Core\Form\FormBuilderInterface');
 
-    $this->container = new ContainerBuilder();
-    $this->container->set('cache.cache', $this->cache);
-    $this->container->setParameter('cache_bins', array('cache.cache' => 'cache'));
-    $this->container->set('module_handler', $this->moduleHandler);
-    $this->container->set('form_builder', $this->formBuilder);
-    \Drupal::setContainer($this->container);
+    $this->container = $this->getContainerWithCacheBins($this->cache);
 
     $this->discovery = $this->getMock('Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface');
   }
 
   /**
-   * {@inheritdoc}
-   */
-  protected function tearDown() {
-    parent::tearDown();
-    $container = new ContainerBuilder();
-    \Drupal::setContainer($container);
-  }
-
-  /**
    * Sets up the entity manager to be tested.
    *
    * @param \Drupal\Core\Entity\EntityTypeInterface[]|\PHPUnit_Framework_MockObject_MockObject[] $definitions
@@ -163,7 +149,7 @@ protected function setUpEntityManager($definitions = array()) {
       ->method('getDefinitions')
       ->will($this->returnValue($definitions));
 
-    $this->entityManager = new TestEntityManager(new \ArrayObject(), $this->container, $this->moduleHandler, $this->cache, $this->languageManager, $this->translationManager);
+    $this->entityManager = new TestEntityManager(new \ArrayObject(), $this->container, $this->moduleHandler, $this->cache, $this->languageManager, $this->translationManager, $this->formBuilder);
     $this->entityManager->setDiscovery($this->discovery);
   }
 
@@ -435,47 +421,6 @@ public function testGetControllerMissingController() {
   }
 
   /**
-   * Tests the getForm() method.
-   *
-   * @covers ::getForm()
-   */
-  public function testGetForm() {
-    $this->formBuilder->expects($this->exactly(2))
-      ->method('buildForm')
-      ->with('the_form_id', $this->isType('array'))
-      ->will($this->returnValue('the form contents'));
-
-    $apple = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
-    $apple->expects($this->once())
-      ->method('getFormClass')
-      ->with('default')
-      ->will($this->returnValue('Drupal\Tests\Core\Entity\TestEntityForm'));
-    $banana = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
-    $banana->expects($this->once())
-      ->method('getFormClass')
-      ->with('default')
-      ->will($this->returnValue('Drupal\Tests\Core\Entity\TestEntityFormInjected'));
-    $this->setUpEntityManager(array(
-      'apple' => $apple,
-      'banana' => $banana,
-    ));
-
-    $apple_entity = $this->getMock('Drupal\Core\Entity\EntityInterface');
-    $apple_entity->expects($this->once())
-      ->method('getEntityTypeId')
-      ->will($this->returnValue('apple'));
-
-    $this->assertSame('the form contents', $this->entityManager->getForm($apple_entity));
-
-    $banana_entity = $this->getMock('Drupal\Core\Entity\EntityInterface');
-    $banana_entity->expects($this->once())
-      ->method('getEntityTypeId')
-      ->will($this->returnValue('banana'));
-
-    $this->assertSame('the form contents', $this->entityManager->getForm($banana_entity));
-  }
-
-  /**
    * Tests the getAdminRouteInfo() method.
    *
    * @covers ::getAdminRouteInfo()
diff --git a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
index 25901c1..6efddf7 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
@@ -106,16 +106,7 @@ protected function setUp() {
       ->getMock();
     $this->themeHandler = new TestThemeHandler($this->configFactory, $this->moduleHandler, $this->cacheBackend, $this->infoParser, $this->configInstaller, $this->routeBuilder, $this->systemListingInfo);
 
-    $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
-    $container->expects($this->any())
-      ->method('getParameter')
-      ->with('cache_bins')
-      ->will($this->returnValue(array('cache.test' => 'test')));
-    $container->expects($this->any())
-      ->method('get')
-      ->with('cache.test')
-      ->will($this->returnValue($this->cacheBackend));
-    \Drupal::setContainer($container);
+    $this->getContainerWithCacheBins($this->cacheBackend);
   }
 
   /**
diff --git a/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php b/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php
index e0b9b93..894a6e1 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php
@@ -172,16 +172,7 @@ public function testCacheClearWithTags() {
       ->expects($this->never())
       ->method('deleteMultiple');
 
-    $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
-    $container->expects($this->any())
-      ->method('getParameter')
-      ->with('cache_bins')
-      ->will($this->returnValue(array('cache.test' => 'test')));
-    $container->expects($this->any())
-      ->method('get')
-      ->with('cache.test')
-      ->will($this->returnValue($cache_backend));
-    \Drupal::setContainer($container);
+    $this->getContainerWithCacheBins($cache_backend);
 
     $language = new Language(array('id' => 'en'));
     $language_manager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php
index e79ad2b..a76611c 100644
--- a/core/tests/Drupal/Tests/UnitTestCase.php
+++ b/core/tests/Drupal/Tests/UnitTestCase.php
@@ -9,6 +9,7 @@
 
 use Drupal\Component\Utility\Random;
 use Drupal\Component\Utility\String;
+use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 
 /**
@@ -196,4 +197,28 @@ public function getStringTranslationStub() {
     return $translation;
   }
 
+  /**
+   * Sets up a container with cache bins.
+   *
+   * @param \Drupal\Core\Cache\CacheBackendInterface $backend
+   *   The cache backend to set up.
+   *
+   * @return \Symfony\Component\DependencyInjection\ContainerInterface|\PHPUnit_Framework_MockObject_MockObject
+   *   The container with the cache bins set up.
+   */
+  protected function getContainerWithCacheBins(CacheBackendInterface $backend) {
+    $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
+    $container->expects($this->any())
+      ->method('getParameter')
+      ->with('cache_bins')
+      ->will($this->returnValue(array('cache.test' => 'test')));
+    $container->expects($this->any())
+      ->method('get')
+      ->with('cache.test')
+      ->will($this->returnValue($backend));
+
+    \Drupal::setContainer($container);
+    return $container;
+  }
+
 }
