diff --git a/core/lib/Drupal/Core/Plugin/DrupalPluginManagerBase.php b/core/lib/Drupal/Core/Plugin/DrupalPluginManagerBase.php
new file mode 100644
index 0000000..fd0b42d
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/DrupalPluginManagerBase.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Plugin\DrupalPluginManagerBase
+ */
+
+namespace Drupal\Core\Plugin;
+
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
+use Drupal\Component\Plugin\Discovery\ProcessDecorator;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Plugin\Discovery\CacheDecorator;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Core\Plugin\Discovery\AlterDecorator;
+
+/**
+ * Base class for plugin managers.
+ */
+abstract class DrupalPluginManagerBase extends CacheDecorator implements PluginManagerInterface {
+
+  /**
+   * The object that discovers plugins managed by this manager.
+   *
+   * @var Drupal\Component\Plugin\Discovery\DiscoveryInterface
+   */
+  protected $discovery;
+
+  /**
+   * The object that instantiates plugins managed by this manager.
+   *
+   * @var Drupal\Component\Plugin\Factory\FactoryInterface
+   */
+  protected $factory;
+
+  /**
+   * The object that returns the preconfigured plugin instance appropriate for a particular runtime condition.
+   *
+   * @var Drupal\Component\Plugin\Mapper\MapperInterface
+   */
+  protected $mapper;
+
+  /**
+   * A set of defaults to be referenced by $this->processDefinition() if
+   * additional processing of plugins is necessary or helpful for development
+   * purposes.
+   *
+   * @var array
+   */
+  protected $defaults = array();
+
+  /**
+   * Constructs a Drupal\Core\Plugin\DrupalPluginManagerBase object.
+   *
+   * Provides a Drupal ready plugin manager base class that implements caching
+   * appropriately and simplifies developer experience for creating new plugin
+   * managers.
+   *
+   * @param string $owner
+   *   The module that creates this plugin type.
+   * @param string $type
+   *   The plugin type name.
+   * @param string $cache_key
+   *   The cache identifier used for storage of the definition list.
+   * @param string $alter_hook
+   *   An optional string to define the alter hook name that will be available
+   *   for altering plugin definitions of this type.
+   */
+  public function __construct($owner, $type, $cache_key, $alter_hook = '') {
+    $alter_hook = $alter_hook ? $alter_hook : $owner . '_' . $type;
+    $this->discovery = new AnnotatedClassDiscovery($owner, $type);
+    $this->discovery = new DerivativeDiscoveryDecorator($this->discovery);
+    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
+    $this->discovery = new AlterDecorator($this->discovery, $alter_hook);
+    parent::__construct($this->discovery, $cache_key . ':' . language(LANGUAGE_TYPE_INTERFACE)->langcode, 'cache', CacheBackendInterface::CACHE_PERMANENT, array());
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginManagerInterface::createInstance().
+   */
+  public function createInstance($plugin_id, array $configuration = array()) {
+    return $this->factory->createInstance($plugin_id, $configuration);
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginManagerInterface::getInstance().
+   */
+  public function getInstance(array $options) {
+    if (!empty($this->mapper)) {
+      return $this->mapper->getInstance($options);
+    }
+  }
+
+  /**
+   * Performs extra processing on plugin definitions.
+   *
+   * By default we add defaults for the type to the definition. If a type has
+   * additional processing logic they can do that by replacing or extending the
+   * method.
+   */
+  public function processDefinition(&$definition, $plugin_id) {
+    $definition = NestedArray::mergeDeep($this->defaults, $definition);
+  }
+
+}
