diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index c6b6174..7f365a2 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -3479,32 +3479,36 @@ 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. This should be all lowercase,
+ *   start with a letter, and contain only letters, numbers, and underscores.
+ *   The module defining the plugin type must implement a class named
+ *   Drupal\$scope\Plugin\Type\$UpperCamelCasedType that implements the
+ *   Drupal\Component\Plugin\PluginTypeInterface interface. For example, a
+ *   module named 'some_module' defines a 'example_plugin_type' plugin type by
+ *   implementing a Drupal\some_module\Plugin\Type\ExamplePluginType class.
  *
- * @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])) {
+    // @todo After Symfony's dependency injection component is added to Drupal,
+    //   make the PluginKernel class and the logic for finding the plugin type
+    //   class swappable.
+    $scope_namespace = ($scope == 'core') ? 'Core' : $scope;
+    $type_classname = str_replace(' ', '', ucwords(str_replace('_', ' ', $type)));
+    $class = "Drupal\\$scope_namespace\\Plugin\\Type\\$type_classname";
+    $kernels[$scope][$type] = new PluginKernel(new $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..d757372 100644
--- a/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
+++ b/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
@@ -18,12 +18,11 @@ 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 +51,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 +59,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/Factory/FactoryInterface.php b/core/lib/Drupal/Component/Plugin/Factory/FactoryInterface.php
index c3bbe20..d2fcc87 100644
--- a/core/lib/Drupal/Component/Plugin/Factory/FactoryInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Factory/FactoryInterface.php
@@ -13,14 +13,6 @@ use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 interface FactoryInterface {
 
   /**
-   * Construct a plugin factory.
-   *
-   * @param DiscoveryInterface $discovery
-   *   A discovery object for finding out implementation information.
-   */
-  public function __construct(DiscoveryInterface $discovery);
-
-  /**
    * Responsible for returning a preconfigured instance of a plugin.
    *
    * @param string $plugin_id
diff --git a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php b/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php
index d3ed1e8..103b0a6 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;
 
 /**
  *
@@ -15,92 +13,47 @@ use Drupal\Component\Plugin\Factory\FactoryInterface;
 class PluginKernel implements PluginKernelInterface {
 
   /**
-   * @var DiscoveryInterface
+   * @var PluginTypeInterface
    */
-  protected $discovery;
+  protected $type;
 
-  /**
-   * @var MapperInterface
-   */
-  protected $mapper;
-
-  /**
-   * @var FactoryInterface
-   */
-  protected $factory;
-
-  public function __construct(DiscoveryInterface $discovery) {
-    $this->discovery = $discovery;
+  public function __construct(PluginTypeInterface $type) {
+    $this->type = $type;
   }
 
   /**
-   * Implements PluginKernelInterface::getPluginTypeDefinition().
+   * Implements PluginKernelInterface::getType().
    */
-  public function getPluginTypeDefinition() {
-    return $this->discovery->getTypeDefinition();
+  public function getType() {
+    return $this->type;
   }
 
   /**
    * Implements PluginKernelInterface::getPluginDefinition().
    */
   public function getPluginDefinition($plugin_id) {
-    return $this->discovery->getPluginDefinition($plugin_id);
+    return $this->type->getDiscovery()->getPluginDefinition($plugin_id);
   }
 
   /**
    * Implements PluginKernelInterface::getPluginDefinitions().
    */
   public function getPluginDefinitions() {
-    return $this->discovery->getPluginDefinitions();
+    return $this->type->getDiscovery()->getPluginDefinitions();
   }
 
   /**
    * Implements PluginKernelInterface::getPluginInstance().
    */
   public function getPluginInstance($plugin_id, array $configuration = array()) {
-    return $this->getFactory()->getPluginInstance($plugin_id, $configuration);
+    return $this->type->getFactory()->getPluginInstance($plugin_id, $configuration);
   }
 
   /**
    * Implements PluginKernelInterface::mapPluginInstance().
    */
   public function mapPluginInstance(array $options) {
-    return $this->getMapper()->mapPluginInstance($options);
+    return $this->type->getMapper()->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..db86e28 100644
--- a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php
@@ -12,15 +12,15 @@ namespace Drupal\Component\Plugin\Kernel;
 interface PluginKernelInterface {
 
   /**
-   * Get a plugin type.
+   * Gets the plugin type object used by this kernel.
    *
-   * @return array
-   *   The plugin type definition.
+   * @return Drupal\Component\Plugin\PluginTypeInterface
+   *   The plugin type object.
    */
-  public function getPluginTypeDefinition();
+  public function getType();
 
   /**
-   * Get a specific plugin definition for a type.
+   * Gets the definition of a specific plugin.
    *
    * @param string $plugin_id
    *   A plugin id.
@@ -31,10 +31,10 @@ 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.
+   *   An array of plugin definitions keyed by plugin id.
    */
   public function getPluginDefinitions();
 
@@ -45,21 +45,22 @@ interface PluginKernelInterface {
    *   The plugin id of the plugin being instantiated.
    *
    * @param array $configuration
-   *   An optional array passed to the factory class containing configuration
-   *   information for the plugin instance.
+   *   An optional array of configuration information for the plugin instance.
    *
-   * @return mixed
-   *   A plugin instance whose type is dependent upon the $type parameter
-   *   passed to this mapper object.
+   * @return object
+   *   A configured plugin instance.
    */
   public function getPluginInstance($plugin_id, array $configuration = array());
 
   /**
    * Instantiates a fully configured plugin instance.
    *
-   * @return mixed
-   *   A plugin instance whose type is dependent upon the $type parameter
-   *   passed to this mapper object.
+   * @param array $options
+   *   An array of information that the mapper can use for determining both the
+   *   plugin to instantiate and the configuration to instantiate it with.
+   *
+   * @return object
+   *   A configured plugin instance.
    */
   public function mapPluginInstance(array $options);
 
diff --git a/core/lib/Drupal/Component/Plugin/PluginType.php b/core/lib/Drupal/Component/Plugin/PluginType.php
new file mode 100644
index 0000000..3bb89fa
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/PluginType.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @file
+ * Definition of Drupal\Component\Plugin\PluginType
+ */
+
+namespace Drupal\Component\Plugin;
+
+abstract class PluginType implements PluginTypeInterface {
+
+  protected $discovery;
+  protected $factory;
+  protected $mapper;
+
+  public function getDiscovery() {
+    return $this->discovery;
+  }
+
+  public function getFactory() {
+    return $this->factory;
+  }
+
+  public function getMapper() {
+    return $this->mapper;
+  }
+}
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..75a0a09 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,36 +15,23 @@ 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 'plugins_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('plugins_test', 'test_plugin_type');
+    $this->assertEqual(get_class($test_kernel), 'Drupal\Component\Plugin\Kernel\PluginKernel', 'Correct kernel type returned in default case.');
   }
 
   function testPluginDefintionFetching() {
-    $plugin_definition = plugin('simpletest', 'plugin')->getPluginDefinition('coolaid');
+    $plugin_definition = plugin('plugins_test', 'test_plugin_type')->getPluginDefinition('coolaid');
     $this->assertEqual($plugin_definition['string'], 'oh yeah', 'Plugin definition retrievable by the plugin kernel getPluginDefinition().');
   }
 
   function testPluginInstanceFetching() {
-    $plugin = plugin('simpletest', 'plugin')->getPluginInstance('coolaid');
-    $this->assertEqual(get_class($plugin), 'PluginBaseTestPluginClass', 'Correct plugin implementation returned by the plugin kernel getPluginInstance().');
+    $plugin = plugin('plugins_test', 'test_plugin_type')->getPluginInstance('coolaid');
+    $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..7169ba5
--- /dev/null
+++ b/core/modules/simpletest/tests/plugins_test.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @todo Move this to a PSR-0 location when tests allow for that.
+ */
+namespace Drupal\plugins_test\Plugin\Type {
+
+use Drupal\Component\Plugin\PluginType;
+use Drupal\Component\Plugin\Discovery\StaticDiscovery;
+use Drupal\Component\Plugin\Mapper\DefaultMapper;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+
+class TestPluginType extends PluginType {
+  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);
+  }
+}
+
+}
+
+/**
+ * @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 {
+}
+
+}
