diff --git a/core/core.services.yml b/core/core.services.yml
index 735bd23..e34c3e7 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 721f693..7eb368a 100644
--- a/core/lib/Drupal/Core/Controller/ControllerBase.php
+++ b/core/lib/Drupal/Core/Controller/ControllerBase.php
@@ -40,6 +40,13 @@
   protected $entityManager;
 
   /**
+   * The entity form builder.
+   *
+   * @var \Drupal\Core\Entity\EntityFormBuilderInterface
+   */
+  protected $entityFormBuilder;
+
+  /**
    * The language manager.
    *
    * @var \Drupal\Core\Language\LanguageManager
@@ -123,6 +130,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 e327627..b502581 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
@@ -55,12 +55,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 5f6c211..3ed3842 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
@@ -17,13 +17,6 @@
 class CustomBlockController extends ControllerBase {
 
   /**
-   * The entity manager.
-   *
-   * @var \Drupal\Component\Plugin\PluginManagerInterface
-   */
-  protected $entityManager;
-
-  /**
    * The custom block storage controller.
    *
    * @var \Drupal\Core\Entity\EntityStorageControllerInterface
@@ -43,7 +36,6 @@ class CustomBlockController extends ControllerBase {
   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')
     );
@@ -52,17 +44,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;
   }
 
   /**
@@ -107,7 +96,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 01c51da..be21d45 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -604,7 +604,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 207be27..e299639 100644
--- a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
+++ b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
@@ -270,7 +270,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 213cae4..bd7bdd7 100644
--- a/core/modules/contact/lib/Drupal/contact/Controller/ContactController.php
+++ b/core/modules/contact/lib/Drupal/contact/Controller/ContactController.php
@@ -90,7 +90,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;
   }
@@ -115,7 +115,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 9222d1b..e982429 100644
--- a/core/modules/forum/lib/Drupal/forum/Controller/ForumController.php
+++ b/core/modules/forum/lib/Drupal/forum/Controller/ForumController.php
@@ -157,7 +157,7 @@ public function addForum() {
       'vid' => $vid,
       'forum_controller' => 0,
     ));
-    return $this->entityManager()->getForm($taxonomy_term, 'forum');
+    return $this->entityFormBuilder()->getForm($taxonomy_term, 'forum');
   }
 
   /**
@@ -172,7 +172,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 65bba40..0b77263 100644
--- a/core/modules/menu/lib/Drupal/menu/Controller/MenuController.php
+++ b/core/modules/menu/lib/Drupal/menu/Controller/MenuController.php
@@ -54,7 +54,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 6aa58ba..cd99443 100644
--- a/core/modules/search/lib/Drupal/search/Controller/SearchController.php
+++ b/core/modules/search/lib/Drupal/search/Controller/SearchController.php
@@ -87,7 +87,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 1e3575d..437d76e 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
@@ -8,7 +8,6 @@
 namespace Drupal\views_ui\Controller;
 
 use Drupal\Core\Controller\ControllerBase;
-use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\views\ViewExecutable;
 use Drupal\views\ViewStorageInterface;
 use Drupal\views_ui\ViewUI;
@@ -25,13 +24,6 @@
 class ViewsUIController extends ControllerBase {
 
   /**
-   * Stores the Entity manager.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
    * Stores the Views data cache object.
    *
    * @var \Drupal\views\ViewsData
@@ -41,13 +33,10 @@ class ViewsUIController extends ControllerBase {
   /**
    * Constructs a new \Drupal\views_ui\Controller\ViewsUIController object.
    *
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The Entity manager.
    * @param \Drupal\views\ViewsData views_data
    *   The Views data cache object.
    */
-  public function __construct(EntityManagerInterface $entity_manager, ViewsData $views_data) {
-    $this->entityManager = $entity_manager;
+  public function __construct(ViewsData $views_data) {
     $this->viewsData = $views_data;
   }
 
@@ -56,7 +45,6 @@ public function __construct(EntityManagerInterface $entity_manager, ViewsData $v
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('entity.manager'),
       $container->get('views.views_data')
     );
   }
@@ -68,7 +56,7 @@ public static function create(ContainerInterface $container) {
    *   The Views fields report page.
    */
   public function reportFields() {
-    $views = $this->entityManager->getStorageController('view')->loadMultiple();
+    $views = $this->entityManager()->getStorageController('view')->loadMultiple();
 
     // Fetch all fieldapi fields which are used in views
     // Therefore search in all views, displays and handler-types.
@@ -164,7 +152,7 @@ public function ajaxOperation(ViewStorageInterface $view, $op, Request $request)
 
     // If the request is via AJAX, return the rendered list as JSON.
     if ($request->request->get('js')) {
-      $list = $this->entityManager->getListController('view')->render();
+      $list = $this->entityManager()->getListController('view')->render();
       $response = new AjaxResponse();
       $response->addCommand(new ReplaceCommand('#views-entity-list', drupal_render($list)));
       return $response;
@@ -187,7 +175,7 @@ public function autocompleteTag(Request $request) {
     $matches = array();
     $string = $request->query->get('q');
     // Get matches from default views.
-    $views = $this->entityManager->getStorageController('view')->loadMultiple();
+    $views = $this->entityManager()->getStorageController('view')->loadMultiple();
     foreach ($views as $view) {
       $tag = $view->get('tag');
       if ($tag && strpos($tag, $string) === 0) {
@@ -222,8 +210,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;
+  }
+
 }
