diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index c6b6174..d48fdde 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -3479,32 +3479,27 @@ function _drupal_shutdown_function() {
 }
 
 /**
- * Instantiates and statically caches plugin mapper.
+ * Instantiates and statically caches plugin kernels.
  *
  * @param string $scope
- *   Provides a scoped namespace for the plugin type being requested. This
- *   allows for providers to create identically named plugin types without
- *   needing to worry about panels and views caching plugins being delivered
- *   for core cache plugin requests.
+ *   Provides a scoped namespace for the plugin type being requested. Plugin
+ *   types defined by Drupal core subsystems use the 'Core' scope. Plugin types
+ *   defined by modules use the module name for their scope.
  * @param string $type
- *   The plugin type for the requested scope.
- * @param Drupal\Core\Plugin\Discovery\DiscoveryInterface $discovery
- *   Optional discovery object for overiding discovery behavior.
+ *   The plugin type for the requested scope. The module defining the plugin
+ *   type must implement a class named Drupal\$scope\Plugin\Type\$type that
+ *   implements the Drupal\Component\Plugin\PluginTypeInterface interface.
  *
- * @return Drupal\Component\Plugin\Kernel\PluginKernelInterface
- *   An instantiated mapper class for plugins.
+ * @return Drupal\Component\Plugin\Kernel\PluginKernel
  *
- * @see Drupal\Component\Plugin\Kernel\PluginKernelInterface
+ * @see Drupal\Component\Plugin\Kernel\PluginKernel
  */
-function plugin($scope, $type, DiscoveryInterface $discovery = NULL) {
+function plugin($scope, $type) {
   $kernels = &drupal_static(__FUNCTION__);
 
-  if (empty($kernels[$scope][$type])) {
-    if (!isset($discovery)) {
-      $discovery = new ConfigDiscovery($scope, $type);
-    }
-
-    $kernels[$scope][$type] = new PluginKernel($discovery);
+  if (!isset($kernels[$scope][$type])) {
+    $type_class = "Drupal\\$scope\\Plugin\\Type\\$type";
+    $kernels[$scope][$type] = new PluginKernel(new $type_class());
   }
 
   return $kernels[$scope][$type];
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryInterface.php b/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryInterface.php
index 5dbc065..3f46e8a 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryInterface.php
@@ -9,8 +9,6 @@ namespace Drupal\Component\Plugin\Discovery;
 
 interface DiscoveryInterface {
 
-  public function getPluginTypeDefinition();
-
   public function getPluginDefinition($plugin_id);
 
   public function getPluginDefinitions();
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscovery.php b/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscovery.php
index b9262eb..1d787c3 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscovery.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/StaticDiscovery.php
@@ -11,17 +11,9 @@ namespace Drupal\Component\Plugin\Discovery;
  */
 class StaticDiscovery implements DiscoveryInterface {
 
-  protected $type_definition = array();
   protected $plugin_definitions = array();
 
   /**
-   * Implements DiscoveryInterface::getPluginTypeDefinition().
-   */
-  public function getPluginTypeDefinition() {
-    return empty($this->type_definition) ? array() : $this->type_definition;
-  }
-
-  /**
    * Implements DiscoveryInterface::getPluginDefinition().
    */
   public function getPluginDefinition($plugin) {
@@ -36,20 +28,6 @@ class StaticDiscovery implements DiscoveryInterface {
   }
 
   /**
-   * Set a plugin type definition.
-   */
-  public function setPluginTypeDefinition(array $definition) {
-    $this->type_definition= $definition;
-  }
-
-  /**
-   * Delete a plugin type definition.
-   */
-  public function deletePluginTypeDefinition() {
-    unset($this->type_definition);
-  }
-
-  /**
    * Set a plugin definition.
    */
   public function setPluginDefinition($plugin, array $definition) {
diff --git a/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php b/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
index ba0b85f..3d33f80 100644
--- a/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
+++ b/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
@@ -18,12 +18,14 @@ use Drupal\Component\Plugin\Derivative\DerivativeInterface;
 class DefaultFactory implements FactoryInterface {
 
   protected $discovery;
+  protected $class_key;
 
   /**
    * Implements FactoryInterface::__construct().
    */
-  public function __construct(DiscoveryInterface $discovery) {
+  public function __construct(DiscoveryInterface $discovery, $class_key) {
     $this->discovery = $discovery;
+    $this->class_key = $class_key;
   }
 
   /**
@@ -52,7 +54,7 @@ class DefaultFactory implements FactoryInterface {
   }
 
   /**
-   *  Responsible for finding the class relevant for a given plugin.
+   * Responsible for finding the class relevant for a given plugin.
    *
    *  @param array $config
    *    An array of configuration about the class.
@@ -60,23 +62,20 @@ class DefaultFactory implements FactoryInterface {
    *  @return string
    *    The appropriate class name.
    */
-  public function getPluginClass($plugin_id) {
-    $plugin_type_definition = $this->discovery->getPluginTypeDefinition();
-    $class = $plugin_type_definition['class'];
-
-    if (empty($class)) {
-      throw new PluginException("The plugin type class parameter is not specified.");
+  protected function getPluginClass($plugin_id) {
+    if (empty($this->class_key)) {
+      throw new PluginException("The plugin type did not specify a valid key for determining the plugin instance class.");
     }
 
     $plugin_definition = $this->discovery->getPluginDefinition($plugin_id);
-    if (empty($plugin_definition[$class])) {
-      throw new PluginException("Plugin class was not specified.");
+    if (empty($plugin_definition[$this->class_key])) {
+      throw new PluginException("The plugin did not specify an instance class.");
     }
 
-    $class = $plugin_definition[$class];
+    $class = $plugin_definition[$this->class_key];
 
     if (!class_exists($class)) {
-      throw new PluginException(t("Plugin class @class does not exist.", array('@class' => $class)));
+      throw new PluginException(t("Plugin instance class @class does not exist.", array('@class' => $class)));
     }
 
     return $class;
diff --git a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php b/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php
index d3ed1e8..ab5ff67 100644
--- a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php
+++ b/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php
@@ -5,9 +5,7 @@
  */
 
 namespace Drupal\Component\Plugin\Kernel;
-use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
-use Drupal\Component\Plugin\Mapper\MapperInterface;
-use Drupal\Component\Plugin\Factory\FactoryInterface;
+use Drupal\Component\Plugin\PluginTypeInterface;
 
 /**
  *
@@ -29,15 +27,10 @@ class PluginKernel implements PluginKernelInterface {
    */
   protected $factory;
 
-  public function __construct(DiscoveryInterface $discovery) {
-    $this->discovery = $discovery;
-  }
-
-  /**
-   * Implements PluginKernelInterface::getPluginTypeDefinition().
-   */
-  public function getPluginTypeDefinition() {
-    return $this->discovery->getTypeDefinition();
+  public function __construct(PluginTypeInterface $pluginType) {
+    $this->discovery = $pluginType->getDiscovery();
+    $this->factory = $pluginType->getFactory();
+    $this->mapper = $pluginType->getMapper();
   }
 
   /**
@@ -58,49 +51,14 @@ class PluginKernel implements PluginKernelInterface {
    * Implements PluginKernelInterface::getPluginInstance().
    */
   public function getPluginInstance($plugin_id, array $configuration = array()) {
-    return $this->getFactory()->getPluginInstance($plugin_id, $configuration);
+    return $this->factory->getPluginInstance($plugin_id, $configuration);
   }
 
   /**
    * Implements PluginKernelInterface::mapPluginInstance().
    */
   public function mapPluginInstance(array $options) {
-    return $this->getMapper()->mapPluginInstance($options);
+    return $this->mapper->mapPluginInstance($options);
   }
 
-  /**
-   * ...
-   *
-   * TODO - Is this an interface method or implementation method?
-   *
-   * @return MapperInterface
-   */
-  public function getMapper() {
-
-    if (!isset($this->mapper)) {
-      $type_definition = $this->discovery->getPluginTypeDefinition();
-      $mapper = $type_definition['mapper'];
-      $this->mapper = new $mapper($this->discovery, $this->getFactory());
-    }
-
-    return $this->mapper;
-  }
-
-  /**
-   * ...
-   *
-   * TODO - Is this an interface method or implementation method?
-   *
-   * @return FactoryInterface
-   */
-  public function getFactory() {
-
-    if (!isset($this->factory)) {
-      $type_definition = $this->discovery->getPluginTypeDefinition();
-      $factory = $type_definition['factory'];
-      $this->factory = new $factory($this->discovery);
-    }
-
-    return $this->factory;
-  }
 }
diff --git a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php b/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php
index c0bd2fc..d049d8f 100644
--- a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php
@@ -12,15 +12,7 @@ namespace Drupal\Component\Plugin\Kernel;
 interface PluginKernelInterface {
 
   /**
-   * Get a plugin type.
-   *
-   * @return array
-   *   The plugin type definition.
-   */
-  public function getPluginTypeDefinition();
-
-  /**
-   * Get a specific plugin definition for a type.
+   * Gets the definition of a specific plugin.
    *
    * @param string $plugin_id
    *   A plugin id.
@@ -31,7 +23,7 @@ interface PluginKernelInterface {
   public function getPluginDefinition($plugin_id);
 
   /**
-   * Get all list of all plugin definitions for a type.
+   * Gets the list of all plugin definitions managed by this kernel.
    *
    * @return array
    *   An array of configuration definitions.
diff --git a/core/lib/Drupal/Component/Plugin/PluginTypeInterface.php b/core/lib/Drupal/Component/Plugin/PluginTypeInterface.php
new file mode 100644
index 0000000..2597881
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/PluginTypeInterface.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @file
+ * Definition of Drupal\Component\Plugin\PluginTypeInterface
+ */
+
+namespace Drupal\Component\Plugin;
+
+/**
+ * Interface implemented by all plugin type implementations.
+ */
+interface PluginTypeInterface {
+
+  /**
+   * Gets the plugin discovery object for this plugin type.
+   *
+   * @return Drupal\Component\Plugin\Discovery\DiscoveryInterface
+   *   An object that can discover plugins for this plugin type.
+   */
+  public function getDiscovery();
+
+  /**
+   * Gets the plugin instance factory for this plugin type.
+   *
+   * @return Drupal\Component\Plugin\Factory\FactoryInterface
+   *   An object that can create configured plugin instances for plugins of this
+   *   plugin type.
+   */
+  public function getFactory();
+
+  /**
+   * Gets the plugin mapper object for this plugin type.
+   *
+   * @return Drupal\Component\Plugin\Mapper\MapperInterface
+   *
+   * @todo Explain what a mapper is. Do all plugin types need them? Can we
+   *   refactor accordingly?
+   */
+  public function getMapper();
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php b/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php
index 706e744..872d56b 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php
@@ -12,29 +12,19 @@ class ConfigDiscovery implements DiscoveryInterface {
 
   protected $type;
   protected $scope;
-  protected $type_configuration;
+  protected $definition_root;
 
-  function __construct($scope, $type) {
+  function __construct($scope, $type, $definition_root = NULL) {
     $this->scope = $scope;
     $this->type = $type;
-  }
-
-  /**
-   * Implements DicoveryInterface::getPluginTypeDefinition().
-   */
-  function getPluginTypeDefinition() {
-    if (empty($this->type_configuration)) {
-      $this->type_configuration = config("plugin.type.$this->scope.$this->type")->get();
-    }
-    return $this->type_configuration;
+    $this->definition_root = isset($definition_root) ? $definition_root : "plugin.definition.$scope.$type";
   }
 
   /**
    * Implements DicoveryInterface::getPluginDefinition().
    */
   public function getPluginDefinition($plugin_id) {
-    $definition_root = $this->getDefinitionRoot();
-    $config = config("$definition_root.$this->scope.$this->type.$plugin_id")->get();
+    $config = config("{$this->definition_root}.$plugin_id")->get();
     if ($config['derivative']) {
       $derviative_mapper = new $config['derivative']($this->scope, $this->type, $plugin_id, $config);
       $config = $derviative_mapper->getDerviative($plugin_id);
@@ -47,9 +37,8 @@ class ConfigDiscovery implements DiscoveryInterface {
    */
   public function getPluginDefinitions() {
     $plugins = array();
-    $definition_root = $this->getDefinitionRoot();
-    foreach (config_get_signed_file_storage_names_with_prefix("$definition_root.$this->scope.$this->type") as $plugin_id) {
-      $plugins[$plugin_id] = config("$plugin_id")->get();
+    foreach (config_get_signed_file_storage_names_with_prefix($this->definition_root) as $plugin_id) {
+      $plugins[$plugin_id] = config($plugin_id)->get();
       if (!empty($plugins[$plugin_id]['derivative'])) {
         $derviative_mapper = new $plugins[$plugin_id]['derivative']($this->scope, $this->type, $plugin_id, $plugins[$plugin_id]);
         $derivatives = $derviative_mapper->getDerivatives();
@@ -61,17 +50,4 @@ class ConfigDiscovery implements DiscoveryInterface {
     }
     return $plugins;
   }
-
-  /**
-   * Helper function that gets the config root for a plugin definition.
-   */
-  protected function getDefinitionRoot() {
-    $plugin_type = $this->getPluginTypeDefinition();
-
-    if (!empty($plugin_type['definition'])) {
-      return $plugin_type['definition'];
-    }
-
-    return "plugin.definition";
-  }
 }
diff --git a/core/modules/simpletest/tests/plugins.test b/core/modules/simpletest/tests/plugins.test
index 3f01dc0..fd9fa09 100644
--- a/core/modules/simpletest/tests/plugins.test
+++ b/core/modules/simpletest/tests/plugins.test
@@ -1,8 +1,5 @@
 <?php
 
-use Drupal\Component\Plugin\Discovery\StaticDiscovery;
-use Drupal\Component\Plugin\PluginAbstract;
-
 class PluginBaseTestCase extends DrupalUnitTestCase {
   public static function getInfo() {
     return array(
@@ -18,24 +15,14 @@ class PluginBaseTestCase extends DrupalUnitTestCase {
     spl_autoload_unregister('drupal_autoload_class');
     spl_autoload_unregister('drupal_autoload_interface');
 
-    // Setup a plugin type to test.
-    $discovery = new StaticDiscovery();
-    // Initialize the plugin singleton with a discovery class for our test type.
-    plugin('simpletest', 'plugin', $discovery);
-
-    $discovery->setPluginTypeDefinition(array(
-      'class' => 'class',
-      'factory' => 'Drupal\\Component\\Plugin\\Factory\\DefaultFactory'
-    ));
-    $discovery->setPluginDefinition('coolaid', array(
-      'string' => 'oh yeah',
-      'class' => 'PluginBaseTestPluginClass',
-    ));
+    // @todo After moving the classes of plugin_test.inc to PSR-0 locations,
+    //   remove this line.
+    require_once 'plugin_test.inc';
   }
 
   function testDefaultPluginMapper() {
-    $test_kernel = plugin('core', 'cache');
-    $this->assertEqual(get_class($test_kernel), 'Drupal\\Component\\Plugin\\Kernel\\PluginKernel', 'Correct kernel type returned in default case.');
+    $test_kernel = plugin('simpletest', 'plugin');
+    $this->assertEqual(get_class($test_kernel), 'Drupal\Component\Plugin\Kernel\PluginKernel', 'Correct kernel type returned in default case.');
   }
 
   function testPluginDefintionFetching() {
@@ -45,9 +32,6 @@ class PluginBaseTestCase extends DrupalUnitTestCase {
 
   function testPluginInstanceFetching() {
     $plugin = plugin('simpletest', 'plugin')->getPluginInstance('coolaid');
-    $this->assertEqual(get_class($plugin), 'PluginBaseTestPluginClass', 'Correct plugin implementation returned by the plugin kernel getPluginInstance().');
+    $this->assertEqual(get_class($plugin), 'Drupal\plugins_test\Plugin\PluginBaseTestPluginClass', 'Correct plugin implementation returned by the plugin kernel getPluginInstance().');
   }
 }
-
-class PluginBaseTestPluginClass extends PluginAbstract {
-}
diff --git a/core/modules/simpletest/tests/plugins_test.inc b/core/modules/simpletest/tests/plugins_test.inc
new file mode 100644
index 0000000..57965f1
--- /dev/null
+++ b/core/modules/simpletest/tests/plugins_test.inc
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @todo Move this to a PSR-0 location when tests allow for that.
+ */
+namespace Drupal\plugins_test\Plugin\Type {
+
+use Drupal\Component\Plugin\PluginTypeInterface;
+use Drupal\Component\Plugin\Discovery\StaticDiscovery;
+use Drupal\Component\Plugin\Mapper\DefaultMapper;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+
+class plugin implements PluginTypeInterface {
+
+  protected $discovery;
+  protected $factory;
+  protected $mapper;
+
+  public function __construct() {
+    $this->discovery = new StaticDiscovery();
+    $this->discovery->setPluginDefinition('coolaid', array(
+      'string' => 'oh yeah',
+      'class' => 'Drupal\plugins_test\Plugin\PluginBaseTestPluginClass',
+    ));
+    $this->factory = new DefaultFactory($this->discovery, 'class');
+    $this->mapper = new DefaultMapper($this->discovery, $this->factory);
+  }
+
+  public function getDiscovery() {
+    return $this->discovery;
+  }
+
+  public function getFactory() {
+    return $this->factory;
+  }
+
+  public function getMapper() {
+    return $this->mapper;
+  }
+}
+
+}
+
+/**
+ * @todo Move this to a PSR-0 location when tests allow for that.
+ */
+namespace Drupal\plugins_test\Plugin {
+
+use Drupal\Component\Plugin\PluginAbstract;
+
+class PluginBaseTestPluginClass extends PluginAbstract {
+}
+
+}
