diff --git a/core/core.services.yml b/core/core.services.yml
index 4eb462c..1350472 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -468,7 +468,12 @@ services:
     arguments: ['@theme_handler', '@config.factory', '@config.installer', '@module_handler', '@config.manager', '@asset.css.collection_optimizer', '@router.builder', '@logger.channel.default', '@state']
   entity.manager:
     class: Drupal\Core\Entity\EntityManager
-    arguments: ['@container.namespaces', '@module_handler', '@cache.discovery', '@language_manager', '@string_translation', '@class_resolver', '@typed_data_manager', '@keyvalue', '@event_dispatcher']
+    arguments: ['@module_handler', '@cache.discovery', '@language_manager', '@typed_data_manager', '@keyvalue', '@event_dispatcher', '@entity.type.manager']
+    tags:
+      - { name: plugin_manager_cache_clear }
+  entity.type.manager:
+    class: Drupal\Core\Entity\EntityTypeManager
+    arguments: ['@container.namespaces', '@module_handler', '@cache.discovery', '@string_translation', '@class_resolver']
     parent: container.trait
     tags:
       - { name: plugin_manager_cache_clear }
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/CacheBackendTrait.php b/core/lib/Drupal/Component/Plugin/Discovery/CacheBackendTrait.php
new file mode 100644
index 0000000..f7a88cf
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/Discovery/CacheBackendTrait.php
@@ -0,0 +1,103 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Component\Plugin\Discovery\CacheBackendTrait.
+ */
+
+namespace Drupal\Component\Plugin\Discovery;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Cache\CacheBackendInterface;
+
+/**
+ * @todo.
+ */
+trait CacheBackendTrait {
+
+  /**
+   * Cache backend instance.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface
+   */
+  protected $cacheBackend;
+
+  /**
+   * The cache key.
+   *
+   * @var string
+   */
+  protected $cacheKey;
+
+  /**
+   * An array of cache tags to use for the cached definitions.
+   *
+   * @var array
+   */
+  protected $cacheTags = [];
+
+  /**
+   * Flag whether persistent caches should be used.
+   *
+   * @var bool
+   */
+  protected $useCaches = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function useCaches($use_caches = FALSE) {
+    $this->useCaches = $use_caches;
+  }
+
+  /**
+   * Initialize the cache backend.
+   *
+   * Plugin definitions are cached using the provided cache backend. The
+   * interface language is added as a suffix to the cache key.
+   *
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param string $cache_key
+   *   Cache key prefix to use, the language code will be appended
+   *   automatically.
+   * @param array $cache_tags
+   *   (optional) When providing a list of cache tags, the cached plugin
+   *   definitions are tagged with the provided cache tags. These cache tags can
+   *   then be used to clear the corresponding cached plugin definitions. Note
+   *   that this should be used with care! For clearing all cached plugin
+   *   definitions of a plugin manager, call that plugin manager's
+   *   clearCachedDefinitions() method. Only use cache tags when cached plugin
+   *   definitions should be cleared along with other, related cache entries.
+   */
+  public function setCacheBackend(CacheBackendInterface $cache_backend, $cache_key, array $cache_tags = []) {
+    Cache::validateTags($cache_tags);
+    $this->cacheBackend = $cache_backend;
+    $this->cacheKey = $cache_key;
+    $this->cacheTags = $cache_tags;
+  }
+
+  /**
+   * Fetches from the cache backend, respecting the use caches flag.
+   *
+   * @see \Drupal\Core\Cache\CacheBackendInterface::get()
+   */
+  protected function cacheGet($cid) {
+    if ($this->useCaches && $this->cacheBackend) {
+      return $this->cacheBackend->get($cid);
+    }
+    return FALSE;
+  }
+
+  /**
+   * Stores data in the persistent cache, respecting the use caches flag.
+   *
+   * @see \Drupal\Core\Cache\CacheBackendInterface::set()
+   */
+  protected function cacheSet($cid, $data, $expire = Cache::PERMANENT, array $tags = []) {
+    if ($this->cacheBackend && $this->useCaches) {
+      $this->cacheBackend->set($cid, $data, $expire, $tags);
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Component/Plugin/PluginManagerBase.php b/core/lib/Drupal/Component/Plugin/PluginManagerBase.php
index e617ac1..9282d2b 100644
--- a/core/lib/Drupal/Component/Plugin/PluginManagerBase.php
+++ b/core/lib/Drupal/Component/Plugin/PluginManagerBase.php
@@ -73,7 +73,7 @@ public function getDefinitions() {
   /**
    * {@inheritdoc}
    */
-  public function createInstance($plugin_id, array $configuration = array()) {
+  public function createInstance($plugin_id, array $configuration = []) {
     // If this PluginManager has fallback capabilities catch
     // PluginNotFoundExceptions.
     if ($this instanceof FallbackPluginManagerInterface) {
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigDependencyDeleteFormTrait.php b/core/lib/Drupal/Core/Config/Entity/ConfigDependencyDeleteFormTrait.php
index cd28d19..beee149 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigDependencyDeleteFormTrait.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigDependencyDeleteFormTrait.php
@@ -10,6 +10,7 @@
 
 use Drupal\Core\Config\ConfigManagerInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 
 /**
  * Lists affected configuration entities by a dependency removal.
@@ -39,12 +40,12 @@
    *   or 'content' it should be a list of configuration dependency names.
    * @param \Drupal\Core\Config\ConfigManagerInterface $config_manager
    *   The config manager.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
    *   The entity manager.
    *
    * @see \Drupal\Core\Config\ConfigManagerInterface::getConfigEntitiesToChangeOnDependencyRemoval()
    */
-  protected function addDependencyListsToForm(array &$form, $type, array $names, ConfigManagerInterface $config_manager, EntityManagerInterface $entity_manager) {
+  protected function addDependencyListsToForm(array &$form, $type, array $names, ConfigManagerInterface $config_manager, EntityTypeManagerInterface $entity_type_manager) {
     // Get the dependent entities.
     $dependent_entities = $config_manager->getConfigEntitiesToChangeOnDependencyRemoval($type, $names);
     $entity_types = array();
@@ -62,7 +63,7 @@ protected function addDependencyListsToForm(array &$form, $type, array $names, C
       /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface  $entity */
       $entity_type_id = $entity->getEntityTypeId();
       if (!isset($form['entity_updates'][$entity_type_id])) {
-        $entity_type = $entity_manager->getDefinition($entity_type_id);
+        $entity_type = $entity_type_manager->getDefinition($entity_type_id);
         // Store the ID and label to sort the entity types and entities later.
         $label = $entity_type->getLabel();
         $entity_types[$entity_type_id] = $label;
@@ -100,7 +101,7 @@ protected function addDependencyListsToForm(array &$form, $type, array $names, C
     foreach ($dependent_entities['delete'] as $entity) {
       $entity_type_id = $entity->getEntityTypeId();
       if (!isset($form['entity_deletes'][$entity_type_id])) {
-        $entity_type = $entity_manager->getDefinition($entity_type_id);
+        $entity_type = $entity_type_manager->getDefinition($entity_type_id);
         // Store the ID and label to sort the entity types and entities later.
         $label = $entity_type->getLabel();
         $entity_types[$entity_type_id] = $label;
diff --git a/core/lib/Drupal/Core/Entity/EntityDeleteForm.php b/core/lib/Drupal/Core/Entity/EntityDeleteForm.php
index 6d0ef79..121702a 100644
--- a/core/lib/Drupal/Core/Entity/EntityDeleteForm.php
+++ b/core/lib/Drupal/Core/Entity/EntityDeleteForm.php
@@ -34,7 +34,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     if (!($entity instanceof ConfigEntityInterface)) {
       return $form;
     }
-    $this->addDependencyListsToForm($form, $entity->getConfigDependencyKey(), [$entity->getConfigDependencyName()], $this->getConfigManager(), $this->entityManager);
+    $this->addDependencyListsToForm($form, $entity->getConfigDependencyKey(), [$entity->getConfigDependencyName()], $this->getConfigManager(), $this->entityTypeManager);
 
     return $form;
   }
diff --git a/core/lib/Drupal/Core/Entity/EntityForm.php b/core/lib/Drupal/Core/Entity/EntityForm.php
index 5450e25..cf993d5 100644
--- a/core/lib/Drupal/Core/Entity/EntityForm.php
+++ b/core/lib/Drupal/Core/Entity/EntityForm.php
@@ -38,11 +38,11 @@ class EntityForm extends FormBase implements EntityFormInterface {
   protected $moduleHandler;
 
   /**
-   * The entity manager.
+   * The entity type manager.
    *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
    */
-  protected $entityManager;
+  protected $entityTypeManager;
 
   /**
    * The entity being used by this form.
@@ -349,7 +349,7 @@ public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entit
       $entity = $route_match->getParameter($entity_type_id);
     }
     else {
-      $entity = $this->entityManager->getStorage($entity_type_id)->create([]);
+      $entity = $this->entityTypeManager->getStorage($entity_type_id)->create([]);
     }
 
     return $entity;
@@ -399,8 +399,8 @@ public function setModuleHandler(ModuleHandlerInterface $module_handler) {
   /**
    * {@inheritdoc}
    */
-  public function setEntityManager(EntityManagerInterface $entity_manager) {
-    $this->entityManager = $entity_manager;
+  public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager) {
+    $this->entityTypeManager = $entity_type_manager;
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityFormInterface.php b/core/lib/Drupal/Core/Entity/EntityFormInterface.php
index 8ae1a91..5c61c1c 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormInterface.php
@@ -133,11 +133,11 @@ public function setModuleHandler(ModuleHandlerInterface $module_handler);
   /**
    * Sets the entity manager for this form.
    *
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
    *
    * @return $this
    */
-  public function setEntityManager(EntityManagerInterface $entity_manager);
+  public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager);
 
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index ad0002e..e68811a 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -7,14 +7,11 @@
 
 namespace Drupal\Core\Entity;
 
-use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
-use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\Component\Plugin\Discovery\CacheBackendTrait;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Config\Entity\ConfigEntityType;
-use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Entity\Exception\AmbiguousEntityClassException;
-use Drupal\Core\Entity\Exception\InvalidLinkTemplateException;
 use Drupal\Core\Entity\Exception\NoCorrespondingEntityClassException;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
@@ -24,17 +21,11 @@
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Field\FieldStorageDefinitionListenerInterface;
 use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
-use Drupal\Core\KeyValueStore\KeyValueStoreInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
-use Drupal\Core\Plugin\DefaultPluginManager;
-use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
-use Drupal\Core\StringTranslation\TranslationInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
 use Drupal\Core\TypedData\TypedDataManager;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerAwareTrait;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
 /**
@@ -51,9 +42,9 @@
  * @see \Drupal\Core\Entity\EntityTypeInterface
  * @see hook_entity_type_alter()
  */
-class EntityManager extends DefaultPluginManager implements EntityManagerInterface, ContainerAwareInterface {
+class EntityManager implements EntityManagerInterface {
 
-  use ContainerAwareTrait;
+  use CacheBackendTrait;
   use StringTranslationTrait;
 
   /**
@@ -64,13 +55,6 @@ class EntityManager extends DefaultPluginManager implements EntityManagerInterfa
   protected $extraFields = array();
 
   /**
-   * Contains instantiated handlers keyed by handler type and entity type.
-   *
-   * @var array
-   */
-  protected $handlers = array();
-
-  /**
    * Static cache of base field definitions.
    *
    * @var array
@@ -95,20 +79,6 @@ class EntityManager extends DefaultPluginManager implements EntityManagerInterfa
   protected $fieldStorageDefinitions;
 
   /**
-   * The string translationManager.
-   *
-   * @var \Drupal\Core\StringTranslation\TranslationInterface
-   */
-  protected $translationManager;
-
-  /**
-   * The class resolver.
-   *
-   * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
-   */
-  protected $classResolver;
-
-  /**
    * The typed data manager.
    *
    * @var \Drupal\Core\TypedData\TypedDataManager
@@ -178,209 +148,146 @@ class EntityManager extends DefaultPluginManager implements EntityManagerInterfa
   protected $classNameEntityTypeMap = array();
 
   /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
    * Constructs a new Entity plugin manager.
    *
-   * @param \Traversable $namespaces
-   *   An object that implements \Traversable which contains the root paths
-   *   keyed by the corresponding namespace to look for plugin implementations,
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler.
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache
    *   The cache backend to use.
    * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
    *   The language manager.
-   * @param \Drupal\Core\StringTranslation\TranslationInterface $translation_manager
-   *   The string translationManager.
-   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
-   *   The class resolver.
    * @param \Drupal\Core\TypedData\TypedDataManager $typed_data_manager
    *   The typed data manager.
    * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
    *   The keyvalue factory.
    * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
    *   The event dispatcher.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
    */
-  public function __construct(\Traversable $namespaces, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache, LanguageManagerInterface $language_manager, TranslationInterface $translation_manager, ClassResolverInterface $class_resolver, TypedDataManager $typed_data_manager, KeyValueFactoryInterface $key_value_factory, EventDispatcherInterface $event_dispatcher) {
-    parent::__construct('Entity', $namespaces, $module_handler, 'Drupal\Core\Entity\EntityInterface');
-
+  public function __construct(ModuleHandlerInterface $module_handler, CacheBackendInterface $cache, LanguageManagerInterface $language_manager, TypedDataManager $typed_data_manager, KeyValueFactoryInterface $key_value_factory, EventDispatcherInterface $event_dispatcher, EntityTypeManagerInterface $entity_type_manager) {
     $this->setCacheBackend($cache, 'entity_type', array('entity_types'));
-    $this->alterInfo('entity_type');
 
-    $this->discovery = new AnnotatedClassDiscovery('Entity', $namespaces, 'Drupal\Core\Entity\Annotation\EntityType');
+    $this->moduleHandler = $module_handler;
     $this->languageManager = $language_manager;
-    $this->translationManager = $translation_manager;
-    $this->classResolver = $class_resolver;
     $this->typedDataManager = $typed_data_manager;
     $this->keyValueFactory = $key_value_factory;
     $this->eventDispatcher = $event_dispatcher;
+    $this->entityTypeManager = $entity_type_manager;
   }
 
   /**
    * {@inheritdoc}
    */
   public function clearCachedDefinitions() {
-    parent::clearCachedDefinitions();
     $this->clearCachedBundles();
     $this->clearCachedFieldDefinitions();
     $this->classNameEntityTypeMap = array();
-    $this->handlers = array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function processDefinition(&$definition, $plugin_id) {
-    /** @var \Drupal\Core\Entity\EntityTypeInterface $definition */
-    parent::processDefinition($definition, $plugin_id);
-
-    // All link templates must have a leading slash.
-    foreach ((array) $definition->getLinkTemplates() as $link_relation_name => $link_template) {
-      if ($link_template[0] != '/') {
-        throw new InvalidLinkTemplateException("Link template '$link_relation_name' for entity type '$plugin_id' must start with a leading slash, the current link template is '$link_template'");
-      }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function findDefinitions() {
-    $definitions = $this->getDiscovery()->getDefinitions();
-
-    // Directly call the hook implementations to pass the definitions to them
-    // by reference, so new entity types can be added.
-    foreach ($this->moduleHandler->getImplementations('entity_type_build') as $module) {
-      $function = $module . '_' . 'entity_type_build';
-      $function($definitions);
-    }
-    foreach ($definitions as $plugin_id => $definition) {
-      $this->processDefinition($definition, $plugin_id);
-    }
-    if ($this->alterHook) {
-      $this->moduleHandler->alter($this->alterHook, $definitions);
-    }
-    return $definitions;
+    $this->entityTypeManager->clearCachedDefinitions();
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getDefinition($entity_type_id, $exception_on_invalid = TRUE) {
-    if (($entity_type = parent::getDefinition($entity_type_id, FALSE)) && class_exists($entity_type->getClass())) {
-      return $entity_type;
-    }
-    elseif (!$exception_on_invalid) {
-      return NULL;
-    }
-
-    throw new PluginNotFoundException($entity_type_id, sprintf('The "%s" entity type does not exist.', $entity_type_id));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function hasHandler($entity_type, $handler_type) {
-    if ($definition = $this->getDefinition($entity_type, FALSE)) {
-      return $definition->hasHandlerClass($handler_type);
-    }
-    return FALSE;
+    return $this->entityTypeManager->getDefinition($entity_type_id, $exception_on_invalid);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getStorage($entity_type) {
-    return $this->getHandler($entity_type, 'storage');
+    return $this->entityTypeManager->getStorage($entity_type);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getListBuilder($entity_type) {
-    return $this->getHandler($entity_type, 'list_builder');
+    return $this->entityTypeManager->getListBuilder($entity_type);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getFormObject($entity_type, $operation) {
-    if (!isset($this->handlers['form'][$operation][$entity_type])) {
-      if (!$class = $this->getDefinition($entity_type, TRUE)->getFormClass($operation)) {
-        throw new InvalidPluginDefinitionException($entity_type, sprintf('The "%s" entity type did not specify a "%s" form class.', $entity_type, $operation));
-      }
-
-      $form_object = $this->classResolver->getInstanceFromDefinition($class);
-
-      $form_object
-        ->setStringTranslation($this->translationManager)
-        ->setModuleHandler($this->moduleHandler)
-        ->setEntityManager($this)
-        ->setOperation($operation);
-      $this->handlers['form'][$operation][$entity_type] = $form_object;
-    }
-    return $this->handlers['form'][$operation][$entity_type];
+    return $this->entityTypeManager->getFormObject($entity_type, $operation);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getRouteProviders($entity_type) {
-    if (!isset($this->handlers['route_provider'][$entity_type])) {
-      $route_provider_classes = $this->getDefinition($entity_type, TRUE)->getRouteProviderClasses();
-
-      foreach ($route_provider_classes as $type => $class) {
-        $this->handlers['route_provider'][$entity_type][$type] = $this->createHandlerInstance($class, $this->getDefinition($entity_type));
-      }
-    }
-    return isset($this->handlers['route_provider'][$entity_type]) ? $this->handlers['route_provider'][$entity_type] : [];
+    return $this->entityTypeManager->getRouteProviders($entity_type);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getViewBuilder($entity_type) {
-    return $this->getHandler($entity_type, 'view_builder');
+    return $this->entityTypeManager->getViewBuilder($entity_type);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getAccessControlHandler($entity_type) {
-    return $this->getHandler($entity_type, 'access');
+    return $this->entityTypeManager->getAccessControlHandler($entity_type);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function getHandler($entity_type, $handler_type) {
-    if (!isset($this->handlers[$handler_type][$entity_type])) {
-      $definition = $this->getDefinition($entity_type);
-      $class = $definition->getHandlerClass($handler_type);
-      if (!$class) {
-        throw new InvalidPluginDefinitionException($entity_type, sprintf('The "%s" entity type did not specify a %s handler.', $entity_type, $handler_type));
-      }
-      $this->handlers[$handler_type][$entity_type] = $this->createHandlerInstance($class, $definition);
-    }
-    return $this->handlers[$handler_type][$entity_type];
+    return $this->entityTypeManager->getHandler($entity_type, $handler_type);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated
    */
   public function createHandlerInstance($class, EntityTypeInterface $definition = null) {
-    if (is_subclass_of($class, 'Drupal\Core\Entity\EntityHandlerInterface')) {
-      $handler = $class::createInstance($this->container, $definition);
-    }
-    else {
-      $handler = new $class($definition);
-    }
-    if (method_exists($handler, 'setModuleHandler')) {
-      $handler->setModuleHandler($this->moduleHandler);
-    }
-    if (method_exists($handler, 'setStringTranslation')) {
-      $handler->setStringTranslation($this->translationManager);
-    }
-    return $handler;
+    return $this->entityTypeManager->createHandlerInstance($class, $definition);
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated
+   */
+  public function hasHandler($entity_type, $handler_type) {
+    return $this->entityTypeManager->hasHandler($entity_type, $handler_type);
   }
 
   /**
@@ -1368,12 +1275,12 @@ public function getLastInstalledDefinition($entity_type_id) {
    * {@inheritdoc}
    */
   public function useCaches($use_caches = FALSE) {
-    parent::useCaches($use_caches);
     if (!$use_caches) {
-      $this->handlers = [];
       $this->fieldDefinitions = [];
       $this->baseFieldDefinitions = [];
       $this->fieldStorageDefinitions = [];
+
+      $this->entityTypeManager->useCaches($use_caches);
     }
   }
 
@@ -1447,4 +1354,40 @@ protected function deleteLastInstalledFieldStorageDefinition(FieldStorageDefinit
     $this->setLastInstalledFieldStorageDefinitions($entity_type_id, $definitions);
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated
+   */
+  public function getDefinitions() {
+    return $this->entityTypeManager->getDefinitions();
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated
+   */
+  public function hasDefinition($plugin_id) {
+    return $this->entityTypeManager->hasDefinition($plugin_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated
+   */
+  public function createInstance($plugin_id, array $configuration = []) {
+    return $this->entityTypeManager->createInstance($plugin_id, $configuration);
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated
+   */
+  public function getInstance(array $options) {
+    return $this->entityTypeManager->getInstance($options);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
index 7b180d2..74affcc 100644
--- a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
@@ -15,7 +15,7 @@
 /**
  * Provides an interface for entity type managers.
  */
-interface EntityManagerInterface extends PluginManagerInterface, EntityTypeListenerInterface, EntityBundleListenerInterface, FieldStorageDefinitionListenerInterface, FieldDefinitionListenerInterface, CachedDiscoveryInterface {
+interface EntityManagerInterface extends PluginManagerInterface, EntityTypeListenerInterface, EntityBundleListenerInterface, FieldStorageDefinitionListenerInterface, FieldDefinitionListenerInterface, CachedDiscoveryInterface, EntityTypeManagerInterface {
 
   /**
    * Builds a list of entity type labels suitable for a Form API options list.
@@ -144,30 +144,6 @@ public function getFieldMap();
   public function getFieldMapByFieldType($field_type);
 
   /**
-   * Creates a new access control handler instance.
-   *
-   * @param string $entity_type
-   *   The entity type for this access control handler.
-   *
-   * @return \Drupal\Core\Entity\EntityAccessControlHandlerInterface.
-   *   A access control handler instance.
-   */
-  public function getAccessControlHandler($entity_type);
-
-  /**
-   * Creates a new storage instance.
-   *
-   * @param string $entity_type
-   *   The entity type for this storage.
-   *
-   * @return \Drupal\Core\Entity\EntityStorageInterface
-   *   A storage instance.
-   *
-   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
-   */
-  public function getStorage($entity_type);
-
-  /**
    * Get the bundle info of all entity types.
    *
    * @return array
@@ -191,96 +167,6 @@ public function clearCachedFieldDefinitions();
   public function clearCachedBundles();
 
   /**
-   * Creates a new view builder instance.
-   *
-   * @param string $entity_type
-   *   The entity type for this view builder.
-   *
-   * @return \Drupal\Core\Entity\EntityViewBuilderInterface.
-   *   A view builder instance.
-   */
-  public function getViewBuilder($entity_type);
-
-  /**
-   * Creates a new entity list builder.
-   *
-   * @param string $entity_type
-   *   The entity type for this list builder.
-   *
-   * @return \Drupal\Core\Entity\EntityListBuilderInterface
-   *   An entity list builder instance.
-   */
-  public function getListBuilder($entity_type);
-
-  /**
-   * Creates a new form instance.
-   *
-   * @param string $entity_type
-   *   The entity type for this form.
-   * @param string $operation
-   *   The name of the operation to use, e.g., 'default'.
-   *
-   * @return \Drupal\Core\Entity\EntityFormInterface
-   *   A form instance.
-   */
-  public function getFormObject($entity_type, $operation);
-
-  /**
-   * Gets all route provider instances.
-   *
-   * @param string $entity_type
-   *   The entity type for this route providers.
-   *
-   * @return \Drupal\Core\Entity\Routing\EntityRouteProviderInterface[]
-   */
-  public function getRouteProviders($entity_type);
-
-  /**
-   * Checks whether a certain entity type has a certain handler.
-   *
-   * @param string $entity_type
-   *   The name of the entity type.
-   * @param string $handler_type
-   *   The name of the handler.
-   *
-   * @return bool
-   *   Returns TRUE if the entity type has the handler, else FALSE.
-   */
-  public function hasHandler($entity_type, $handler_type);
-
-  /**
-   * Creates a new handler instance for a entity type and handler type.
-   *
-   * @param string $entity_type
-   *   The entity type for this controller.
-   * @param string $handler_type
-   *   The controller type to create an instance for.
-   *
-   * @return object
-   *   A handler instance.
-   *
-   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
-   */
-  public function getHandler($entity_type, $handler_type);
-
-  /**
-   * Creates new handler instance.
-   *
-   * Usually \Drupal\Core\Entity\EntityManagerInterface::getHandler() is
-   * preferred since that method has additional checking that the class exists
-   * and has static caches.
-   *
-   * @param mixed $class
-   *   The handler class to instantiate.
-   * @param \Drupal\Core\Entity\EntityTypeInterface $definition
-   *   The entity type definition.
-   *
-   * @return object
-   *   A handler instance.
-   */
-  public function createHandlerInstance($class, EntityTypeInterface $definition = null);
-
-  /**
    * Gets the bundle info of an entity type.
    *
    * @param string $entity_type
@@ -344,13 +230,6 @@ public function getExtraFields($entity_type_id, $bundle);
   public function getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = array());
 
   /**
-   * {@inheritdoc}
-   *
-   * @return \Drupal\Core\Entity\EntityTypeInterface|null
-   */
-  public function getDefinition($entity_type_id, $exception_on_invalid = TRUE);
-
-  /**
    * Gets the entity type definition in its most recently installed state.
    *
    * During the application lifetime, entity type definitions can change. For
@@ -383,13 +262,6 @@ public function getDefinition($entity_type_id, $exception_on_invalid = TRUE);
   public function getLastInstalledDefinition($entity_type_id);
 
   /**
-   * {@inheritdoc}
-   *
-   * @return \Drupal\Core\Entity\EntityTypeInterface[]
-   */
-  public function getDefinitions();
-
-  /**
    * Gets the entity view mode info for all entity types.
    *
    * @return array
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeManager.php b/core/lib/Drupal/Core/Entity/EntityTypeManager.php
new file mode 100644
index 0000000..d3b4b52
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityTypeManager.php
@@ -0,0 +1,237 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\EntityTypeManager.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\DependencyInjection\ClassResolverInterface;
+use Drupal\Core\Entity\Exception\InvalidLinkTemplateException;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Core\StringTranslation\TranslationInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareTrait;
+
+/**
+ * @todo.
+ */
+class EntityTypeManager extends DefaultPluginManager implements EntityTypeManagerInterface, ContainerAwareInterface {
+
+  use ContainerAwareTrait;
+
+  /**
+   * Contains instantiated handlers keyed by handler type and entity type.
+   *
+   * @var array
+   */
+  protected $handlers = [];
+
+  /**
+   * Constructs a new Entity plugin manager.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations,
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
+   *   The cache backend to use.
+   * @param \Drupal\Core\StringTranslation\TranslationInterface $translation_manager
+   *   The string translationManager.
+   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
+   *   The class resolver.
+   */
+  public function __construct(\Traversable $namespaces, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache, TranslationInterface $translation_manager, ClassResolverInterface $class_resolver) {
+    parent::__construct('Entity', $namespaces, $module_handler, 'Drupal\Core\Entity\EntityInterface');
+
+    $this->setCacheBackend($cache, 'entity_type', ['entity_types']);
+    $this->alterInfo('entity_type');
+
+    $this->discovery = new AnnotatedClassDiscovery('Entity', $namespaces, 'Drupal\Core\Entity\Annotation\EntityType');
+    $this->translationManager = $translation_manager;
+    $this->classResolver = $class_resolver;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processDefinition(&$definition, $plugin_id) {
+    /** @var \Drupal\Core\Entity\EntityTypeInterface $definition */
+    parent::processDefinition($definition, $plugin_id);
+
+    // All link templates must have a leading slash.
+    foreach ((array) $definition->getLinkTemplates() as $link_relation_name => $link_template) {
+      if ($link_template[0] != '/') {
+        throw new InvalidLinkTemplateException("Link template '$link_relation_name' for entity type '$plugin_id' must start with a leading slash, the current link template is '$link_template'");
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function findDefinitions() {
+    $definitions = $this->getDiscovery()->getDefinitions();
+
+    // Directly call the hook implementations to pass the definitions to them
+    // by reference, so new entity types can be added.
+    foreach ($this->moduleHandler->getImplementations('entity_type_build') as $module) {
+      $function = $module . '_' . 'entity_type_build';
+      $function($definitions);
+    }
+    foreach ($definitions as $plugin_id => $definition) {
+      $this->processDefinition($definition, $plugin_id);
+    }
+    if ($this->alterHook) {
+      $this->moduleHandler->alter($this->alterHook, $definitions);
+    }
+    return $definitions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinition($entity_type_id, $exception_on_invalid = TRUE) {
+    if (($entity_type = parent::getDefinition($entity_type_id, FALSE)) && class_exists($entity_type->getClass())) {
+      return $entity_type;
+    }
+    elseif (!$exception_on_invalid) {
+      return NULL;
+    }
+
+    throw new PluginNotFoundException($entity_type_id, sprintf('The "%s" entity type does not exist.', $entity_type_id));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function clearCachedDefinitions() {
+    parent::clearCachedDefinitions();
+    $this->handlers = [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function useCaches($use_caches = FALSE) {
+    parent::useCaches($use_caches);
+    if (!$use_caches) {
+      $this->handlers = [];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasHandler($entity_type, $handler_type) {
+    if ($definition = $this->getDefinition($entity_type, FALSE)) {
+      return $definition->hasHandlerClass($handler_type);
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getStorage($entity_type) {
+    return $this->getHandler($entity_type, 'storage');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getListBuilder($entity_type) {
+    return $this->getHandler($entity_type, 'list_builder');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormObject($entity_type, $operation) {
+    if (!isset($this->handlers['form'][$operation][$entity_type])) {
+      if (!$class = $this->getDefinition($entity_type, TRUE)->getFormClass($operation)) {
+        throw new InvalidPluginDefinitionException($entity_type, sprintf('The "%s" entity type did not specify a "%s" form class.', $entity_type, $operation));
+      }
+
+      $form_object = $this->classResolver->getInstanceFromDefinition($class);
+
+      $form_object
+        ->setStringTranslation($this->translationManager)
+        ->setModuleHandler($this->moduleHandler)
+        ->setEntityTypeManager($this)
+        ->setOperation($operation);
+      $this->handlers['form'][$operation][$entity_type] = $form_object;
+    }
+    return $this->handlers['form'][$operation][$entity_type];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRouteProviders($entity_type) {
+    if (!isset($this->handlers['route_provider'][$entity_type])) {
+      $route_provider_classes = $this->getDefinition($entity_type, TRUE)->getRouteProviderClasses();
+
+      foreach ($route_provider_classes as $type => $class) {
+        $this->handlers['route_provider'][$entity_type][$type] = $this->createHandlerInstance($class, $this->getDefinition($entity_type));
+      }
+    }
+    return isset($this->handlers['route_provider'][$entity_type]) ? $this->handlers['route_provider'][$entity_type] : [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getViewBuilder($entity_type) {
+    return $this->getHandler($entity_type, 'view_builder');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAccessControlHandler($entity_type) {
+    return $this->getHandler($entity_type, 'access');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getHandler($entity_type, $handler_type) {
+    if (!isset($this->handlers[$handler_type][$entity_type])) {
+      $definition = $this->getDefinition($entity_type);
+      $class = $definition->getHandlerClass($handler_type);
+      if (!$class) {
+        throw new InvalidPluginDefinitionException($entity_type, sprintf('The "%s" entity type did not specify a %s handler.', $entity_type, $handler_type));
+      }
+      $this->handlers[$handler_type][$entity_type] = $this->createHandlerInstance($class, $definition);
+    }
+    return $this->handlers[$handler_type][$entity_type];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createHandlerInstance($class, EntityTypeInterface $definition = null) {
+    if (is_subclass_of($class, 'Drupal\Core\Entity\EntityHandlerInterface')) {
+      $handler = $class::createInstance($this->container, $definition);
+    }
+    else {
+      $handler = new $class($definition);
+    }
+    if (method_exists($handler, 'setModuleHandler')) {
+      $handler->setModuleHandler($this->moduleHandler);
+    }
+    if (method_exists($handler, 'setStringTranslation')) {
+      $handler->setStringTranslation($this->translationManager);
+    }
+    return $handler;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeManagerInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeManagerInterface.php
new file mode 100644
index 0000000..f58d000
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityTypeManagerInterface.php
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\EntityTypeManagerInterface.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface;
+use Drupal\Component\Plugin\PluginManagerInterface;
+
+/**
+ * Provides an interface for entity type managers.
+ */
+interface EntityTypeManagerInterface extends PluginManagerInterface, CachedDiscoveryInterface {
+
+  /**
+   * Creates a new access control handler instance.
+   *
+   * @param string $entity_type
+   *   The entity type for this access control handler.
+   *
+   * @return \Drupal\Core\Entity\EntityAccessControlHandlerInterface.
+   *   A access control handler instance.
+   */
+  public function getAccessControlHandler($entity_type);
+
+  /**
+   * Creates a new storage instance.
+   *
+   * @param string $entity_type
+   *   The entity type for this storage.
+   *
+   * @return \Drupal\Core\Entity\EntityStorageInterface
+   *   A storage instance.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  public function getStorage($entity_type);
+
+  /**
+   * Creates a new view builder instance.
+   *
+   * @param string $entity_type
+   *   The entity type for this view builder.
+   *
+   * @return \Drupal\Core\Entity\EntityViewBuilderInterface.
+   *   A view builder instance.
+   */
+  public function getViewBuilder($entity_type);
+
+  /**
+   * Creates a new entity list builder.
+   *
+   * @param string $entity_type
+   *   The entity type for this list builder.
+   *
+   * @return \Drupal\Core\Entity\EntityListBuilderInterface
+   *   An entity list builder instance.
+   */
+  public function getListBuilder($entity_type);
+
+  /**
+   * Creates a new form instance.
+   *
+   * @param string $entity_type
+   *   The entity type for this form.
+   * @param string $operation
+   *   The name of the operation to use, e.g., 'default'.
+   *
+   * @return \Drupal\Core\Entity\EntityFormInterface
+   *   A form instance.
+   */
+  public function getFormObject($entity_type, $operation);
+
+  /**
+   * Gets all route provider instances.
+   *
+   * @param string $entity_type
+   *   The entity type for this route providers.
+   *
+   * @return \Drupal\Core\Entity\Routing\EntityRouteProviderInterface[]
+   */
+  public function getRouteProviders($entity_type);
+
+  /**
+   * Checks whether a certain entity type has a certain handler.
+   *
+   * @param string $entity_type
+   *   The name of the entity type.
+   * @param string $handler_type
+   *   The name of the handler.
+   *
+   * @return bool
+   *   Returns TRUE if the entity type has the handler, else FALSE.
+   */
+  public function hasHandler($entity_type, $handler_type);
+
+  /**
+   * Creates a new handler instance for a entity type and handler type.
+   *
+   * @param string $entity_type
+   *   The entity type for this controller.
+   * @param string $handler_type
+   *   The controller type to create an instance for.
+   *
+   * @return object
+   *   A handler instance.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  public function getHandler($entity_type, $handler_type);
+
+  /**
+   * Creates new handler instance.
+   *
+   * Usually \Drupal\Core\Entity\EntityManagerInterface::getHandler() is
+   * preferred since that method has additional checking that the class exists
+   * and has static caches.
+   *
+   * @param mixed $class
+   *   The handler class to instantiate.
+   * @param \Drupal\Core\Entity\EntityTypeInterface $definition
+   *   The entity type definition.
+   *
+   * @return object
+   *   A handler instance.
+   */
+  public function createHandlerInstance($class, EntityTypeInterface $definition = NULL);
+
+  /**
+   * {@inheritdoc}
+   *
+   * @return \Drupal\Core\Entity\EntityTypeInterface|null
+   */
+  public function getDefinition($entity_type_id, $exception_on_invalid = TRUE);
+
+  /**
+   * {@inheritdoc}
+   *
+   * @return \Drupal\Core\Entity\EntityTypeInterface[]
+   */
+  public function getDefinitions();
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php b/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
index 7c8799a..24cb605 100644
--- a/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
+++ b/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Plugin;
 
 use Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface;
+use Drupal\Component\Plugin\Discovery\CacheBackendTrait;
 use Drupal\Component\Plugin\Discovery\DiscoveryCachedTrait;
 use Drupal\Core\Plugin\Discovery\ContainerDerivativeDiscoveryDecorator;
 use Drupal\Component\Plugin\PluginManagerBase;
@@ -27,27 +28,7 @@
 class DefaultPluginManager extends PluginManagerBase implements PluginManagerInterface, CachedDiscoveryInterface {
 
   use DiscoveryCachedTrait;
-
-  /**
-   * Cache backend instance.
-   *
-   * @var \Drupal\Core\Cache\CacheBackendInterface
-   */
-  protected $cacheBackend;
-
-  /**
-   * The cache key.
-   *
-   * @var string
-   */
-  protected $cacheKey;
-
-  /**
-   * An array of cache tags to use for the cached definitions.
-   *
-   * @var array
-   */
-  protected $cacheTags = array();
+  use CacheBackendTrait;
 
   /**
    * Name of the alter hook if one should be invoked.
@@ -81,13 +62,6 @@ class DefaultPluginManager extends PluginManagerBase implements PluginManagerInt
   protected $defaults = array();
 
   /**
-   * Flag whether persistent caches should be used.
-   *
-   * @var bool
-   */
-  protected $useCaches = TRUE;
-
-  /**
    * The name of the annotation that contains the plugin definition.
    *
    * @var string
@@ -134,33 +108,6 @@ public function __construct($subdir, \Traversable $namespaces, ModuleHandlerInte
   }
 
   /**
-   * Initialize the cache backend.
-   *
-   * Plugin definitions are cached using the provided cache backend. The
-   * interface language is added as a suffix to the cache key.
-   *
-   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
-   *   Cache backend instance to use.
-   * @param string $cache_key
-   *   Cache key prefix to use, the language code will be appended
-   *   automatically.
-   * @param array $cache_tags
-   *   (optional) When providing a list of cache tags, the cached plugin
-   *   definitions are tagged with the provided cache tags. These cache tags can
-   *   then be used to clear the corresponding cached plugin definitions. Note
-   *   that this should be used with care! For clearing all cached plugin
-   *   definitions of a plugin manager, call that plugin manager's
-   *   clearCachedDefinitions() method. Only use cache tags when cached plugin
-   *   definitions should be cleared along with other, related cache entries.
-   */
-  public function setCacheBackend(CacheBackendInterface $cache_backend, $cache_key, array $cache_tags = array()) {
-    Cache::validateTags($cache_tags);
-    $this->cacheBackend = $cache_backend;
-    $this->cacheKey = $cache_key;
-    $this->cacheTags = $cache_tags;
-  }
-
-  /**
    * Initializes the alter hook.
    *
    * @param string $alter_hook
@@ -237,30 +184,6 @@ public function useCaches($use_caches = FALSE) {
   }
 
   /**
-   * Fetches from the cache backend, respecting the use caches flag.
-   *
-   * @see \Drupal\Core\Cache\CacheBackendInterface::get()
-   */
-  protected function cacheGet($cid) {
-    if ($this->useCaches && $this->cacheBackend) {
-      return $this->cacheBackend->get($cid);
-    }
-    return FALSE;
-  }
-
-  /**
-   * Stores data in the persistent cache, respecting the use caches flag.
-   *
-   * @see \Drupal\Core\Cache\CacheBackendInterface::set()
-   */
-  protected function cacheSet($cid, $data, $expire = Cache::PERMANENT, array $tags = array()) {
-    if ($this->cacheBackend && $this->useCaches) {
-      $this->cacheBackend->set($cid, $data, $expire, $tags);
-    }
-  }
-
-
-  /**
    * Performs extra processing on plugin definitions.
    *
    * By default we add defaults for the type to the definition. If a type has
diff --git a/core/modules/field_ui/src/Form/FieldConfigEditForm.php b/core/modules/field_ui/src/Form/FieldConfigEditForm.php
index 52ace95..ad3775b 100644
--- a/core/modules/field_ui/src/Form/FieldConfigEditForm.php
+++ b/core/modules/field_ui/src/Form/FieldConfigEditForm.php
@@ -9,11 +9,13 @@
 
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Entity\EntityForm;
+use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Field\AllowedTagsXssTrait;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\field\FieldConfigInterface;
 use Drupal\field_ui\FieldUI;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a form for the field settings form.
@@ -30,6 +32,32 @@ class FieldConfigEditForm extends EntityForm {
   protected $entity;
 
   /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * Constructs a new FieldConfigEditForm.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(EntityManagerInterface $entity_manager) {
+    $this->entityManager = $entity_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function form(array $form, FormStateInterface $form_state) {
diff --git a/core/modules/system/src/Form/ModulesUninstallConfirmForm.php b/core/modules/system/src/Form/ModulesUninstallConfirmForm.php
index 0208e7c..041ef48 100644
--- a/core/modules/system/src/Form/ModulesUninstallConfirmForm.php
+++ b/core/modules/system/src/Form/ModulesUninstallConfirmForm.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Config\ConfigManagerInterface;
 use Drupal\Core\Config\Entity\ConfigDependencyDeleteFormTrait;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Extension\ModuleInstallerInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
@@ -46,11 +47,11 @@ class ModulesUninstallConfirmForm extends ConfirmFormBase {
   protected $configManager;
 
   /**
-   * The entity manager.
+   * The entity type manager.
    *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
    */
-  protected $entityManager;
+  protected $entityTypeManager;
 
   /**
    * An array of modules to uninstall.
@@ -68,14 +69,14 @@ class ModulesUninstallConfirmForm extends ConfirmFormBase {
    *   The key value expirable factory.
    * @param \Drupal\Core\Config\ConfigManagerInterface $config_manager
    *   The configuration manager.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
    */
-  public function __construct(ModuleInstallerInterface $module_installer, KeyValueStoreExpirableInterface $key_value_expirable, ConfigManagerInterface $config_manager, EntityManagerInterface $entity_manager) {
+  public function __construct(ModuleInstallerInterface $module_installer, KeyValueStoreExpirableInterface $key_value_expirable, ConfigManagerInterface $config_manager, EntityTypeManagerInterface $entity_type_manager) {
     $this->moduleInstaller = $module_installer;
     $this->keyValueExpirable = $key_value_expirable;
     $this->configManager = $config_manager;
-    $this->entityManager = $entity_manager;
+    $this->entityTypeManager = $entity_type_manager;
   }
 
   /**
@@ -86,7 +87,7 @@ public static function create(ContainerInterface $container) {
       $container->get('module_installer'),
       $container->get('keyvalue.expirable')->get('modules_uninstall'),
       $container->get('config.manager'),
-      $container->get('entity.manager')
+      $container->get('entity.type.manager')
     );
   }
 
@@ -149,7 +150,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     );
 
     // List the dependent entities.
-    $this->addDependencyListsToForm($form, 'module', $this->modules ,$this->configManager, $this->entityManager);
+    $this->addDependencyListsToForm($form, 'module', $this->modules ,$this->configManager, $this->entityTypeManager);
 
     return parent::buildForm($form, $form_state);
   }
