diff --git a/core/core.services.yml b/core/core.services.yml
index 2b31f93..a83e783 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -189,6 +189,8 @@ services:
   entity.manager:
     class: Drupal\Core\Entity\EntityManager
     arguments: ['@container.namespaces', '@service_container', '@module_handler', '@cache.cache', '@language_manager', '@string_translation']
+    tags:
+      - { name: plugin_manager_cache_clear }
   entity.form_builder:
     class: Drupal\Core\Entity\EntityFormBuilder
     arguments: ['@entity.manager', '@form_builder']
@@ -216,6 +218,8 @@ services:
   plugin.manager.menu.contextual_link:
     class: Drupal\Core\Menu\ContextualLinkManager
     arguments: ['@controller_resolver', '@module_handler', '@cache.cache', '@language_manager', '@access_manager', '@current_user']
+  plugin.cache_clearer:
+    class: Drupal\Core\Plugin\PluginCacheClearer
   request:
     class: Symfony\Component\HttpFoundation\Request
     synthetic: true
@@ -260,6 +264,8 @@ services:
     parent: default_plugin_manager
     calls:
       - [setValidationConstraintManager, ['@validation.constraint']]
+    tags:
+      - { name: plugin_manager_cache_clear }
   validation.constraint:
     class: Drupal\Core\Validation\ConstraintManager
     parent: default_plugin_manager
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index d99ae28..15c1143 100644
--- a/core/lib/Drupal/Core/CoreServiceProvider.php
+++ b/core/lib/Drupal/Core/CoreServiceProvider.php
@@ -23,6 +23,7 @@
 use Drupal\Core\DependencyInjection\Compiler\RegisterBreadcrumbBuilderPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterAuthenticationPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterTwigExtensionsPass;
+use Drupal\Core\Plugin\PluginManagerPass;
 use Drupal\Core\Theme\ThemeNegotiatorPass;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
@@ -82,6 +83,8 @@ public function register(ContainerBuilder $container) {
     $container->addCompilerPass(new RegisterAuthenticationPass());
     // Register Twig extensions.
     $container->addCompilerPass(new RegisterTwigExtensionsPass());
+    // Register plugin managers.
+    $container->addCompilerPass(new PluginManagerPass());
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index d100546..803a236 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -176,6 +176,17 @@ public function getDefinition($entity_type_id, $exception_on_invalid = FALSE) {
   /**
    * {@inheritdoc}
    */
+  public function getDefinitionsByProvider() {
+    $grouped = array();
+    foreach ($this->getDefinitions() as $entity_type_id => $entity_type) {
+      $grouped[$entity_type->getProvider()][$entity_type_id] = $entity_type_id;
+    }
+    return $grouped;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function hasController($entity_type, $controller_type) {
     if ($definition = $this->getDefinition($entity_type)) {
       return $definition->hasControllerClass($controller_type);
diff --git a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
index 3dde8e9..746b18b 100644
--- a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
@@ -245,4 +245,12 @@ public function getDefinition($entity_type_id, $exception_on_invalid = FALSE);
    */
   public function getDefinitions();
 
+  /**
+   * Gets the definition of all entity types grouped by provider.
+   *
+   * @return \Drupal\Core\Entity\EntityTypeInterface[]
+   *   An array of entity type objects, keyed by provider of the entity type.
+   */
+  public function getDefinitionsByProvider();
+
 }
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index 001e278..bf30b56 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -621,8 +621,8 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
         // Allow modules to react prior to the installation of a module.
         $this->invokeAll('module_preinstall', array($module));
 
-        // Clear the entity info cache before importing new configuration.
-        entity_info_cache_clear();
+        // Clear plugin manager caches.
+        \Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
 
         // Now install the module's schema if necessary.
         drupal_install_schema($module);
@@ -747,8 +747,7 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       // @see system_list_reset()
       system_list_reset();
 
-      // Clear the entity info cache.
-      entity_info_cache_clear();
+      \Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
 
       // Update the kernel to exclude the uninstalled modules.
       \Drupal::service('kernel')->updateModules($module_filenames, $module_filenames);
diff --git a/core/lib/Drupal/Core/Plugin/PluginCacheClearer.php b/core/lib/Drupal/Core/Plugin/PluginCacheClearer.php
new file mode 100644
index 0000000..c2ad8d6
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/PluginCacheClearer.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\PluginCacheClearer.
+ */
+
+namespace Drupal\Core\Plugin;
+use Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface;
+use Drupal\Component\Plugin\Exception\PluginException;
+use Drupal\Component\Plugin\PluginManagerInterface;
+
+/**
+ * Defines a class which is capable of clearing the cache on plugin managers.
+ */
+class PluginCacheClearer {
+
+  /**
+   * The stored plugin managers.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface[]|\Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface[]
+   */
+  protected $pluginManagers;
+
+  /**
+   * Add a plugin manager to the active list.
+   *
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $plugin_manager
+   *   A plugin manager instance.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\PluginException
+   *   Thrown when the plugin manager does not implement the cachedDiscovery
+   *   interface.
+   */
+  public function addPluginManager(PluginManagerInterface $plugin_manager) {
+    if (!$plugin_manager instanceof CachedDiscoveryInterface) {
+      throw new PluginException('The plugin manager does not implement the CachedDiscovery interface.');
+    }
+    $this->pluginManagers[] = $plugin_manager;
+  }
+
+  /**
+   * Clear the cache on all plugin managers.
+   */
+  public function clearCachedDefinitions() {
+    foreach ($this->pluginManagers as $plugin_manager) {
+      $plugin_manager->clearCachedDefinitions();
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/PluginManagerPass.php b/core/lib/Drupal/Core/Plugin/PluginManagerPass.php
new file mode 100644
index 0000000..6cd5c05
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/PluginManagerPass.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\PluginManagerPass.
+ */
+
+namespace Drupal\Core\Plugin;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Registers plugin managers to the plugin.cache_clearer service.
+ */
+class PluginManagerPass implements CompilerPassInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(ContainerBuilder $container) {
+    $cache_clearer_definition = $container->getDefinition('plugin.cache_clearer');
+    foreach ($container->getDefinitions() as $service_id => $definition) {
+      if (strpos($service_id, 'plugin.manager.') === 0 || $definition->hasTag('plugin_manager_cache_clear')) {
+        $cache_clearer_definition->addMethodCall('addPluginManager', array(new Reference($service_id)));
+      }
+    }
+  }
+
+}
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 0c775c8..eb5c529 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -279,6 +279,27 @@ function field_modules_installed($modules) {
 }
 
 /**
+ * Implements hook_module_preuninstall().
+ */
+function field_module_preuninstall($module) {
+  $entity_type_ids = array();
+  $entity_types = \Drupal::entityManager()->getDefinitions();
+  foreach ($entity_types as $entity_type) {
+    if ($entity_type->getProvider() == $module) {
+      $entity_type_ids[] = $entity_type->id();
+    }
+  }
+  if ($entity_type_ids) {
+    $fields = \Drupal::entityQuery('field_instance_config')
+      ->condition('entity_type', $entity_type_ids)
+      ->execute();
+    if ($fields) {
+      throw new \Exception("If you don't eat yer meat, you can't have any pudding");
+    }
+  }
+}
+
+/**
  * Implements hook_modules_uninstalled().
  */
 function field_modules_uninstalled($modules) {
diff --git a/core/modules/forum/forum.install b/core/modules/forum/forum.install
index 847dfee..ec10bc5 100644
--- a/core/modules/forum/forum.install
+++ b/core/modules/forum/forum.install
@@ -88,18 +88,6 @@ function forum_install() {
 }
 
 /**
- * Implements hook_module_preinstall().
- */
-function forum_module_preinstall($module) {
-  $list_boolean = \Drupal::service('plugin.manager.field.field_type')->getDefinition('list_boolean');
-  if (empty($list_boolean) && $module == 'forum') {
-    // Make sure that the list_boolean field type is available before our
-    // default config is installed.
-    field_info_cache_clear();
-  }
-}
-
-/**
  * Implements hook_uninstall().
  */
 function forum_uninstall() {
@@ -115,6 +103,10 @@ function forum_uninstall() {
     $field->delete();
   }
 
+  if ($field = field_info_field('comment', 'comment_body')) {
+    $field->delete();
+  }
+
   // Purge field data now to allow taxonomy and options module to be uninstalled
   // if this is the only field remaining. We need to run it twice because
   // field_purge_batch() will not remove the instance and the field in the same
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index 30aa96a..34c769e 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -2,60 +2,98 @@ services:
   plugin.manager.views.access:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [access, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.area:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [area, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.argument:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [argument, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.argument_default:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [argument_default, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.argument_validator:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [argument_validator, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.cache:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [cache, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.display_extender:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [display_extender, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.display:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [display, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.exposed_form:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [exposed_form, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.field:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [field, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.filter:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [filter, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.join:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [join, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.pager:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [pager, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.query:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [query, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.relationship:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [relationship, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.row:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [row, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.sort:
     class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [sort, '@container.namespaces', '@views.views_data']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.style:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [style, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   plugin.manager.views.wizard:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [wizard, '@container.namespaces', '@cache.views_info', '@language_manager', '@module_handler']
+    tags:
+      - { name: plugin_manager_cache_clear }
   views.views_data:
     class: Drupal\views\ViewsData
     arguments: ['@cache.views_info', '@config.factory', '@module_handler', '@language_manager']
