diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index c6b6174..c54a2ce 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -3479,33 +3479,14 @@ function _drupal_shutdown_function() {
 }
 
 /**
- * Instantiates and statically caches plugin mapper.
- *
- * @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.
- * @param string $type
- *   The plugin type for the requested scope.
- * @param Drupal\Core\Plugin\Discovery\DiscoveryInterface $discovery
- *   Optional discovery object for overiding discovery behavior.
- *
- * @return Drupal\Component\Plugin\Kernel\PluginKernelInterface
- *   An instantiated mapper class for plugins.
- *
- * @see Drupal\Component\Plugin\Kernel\PluginKernelInterface
+ * Returns a previously created or new object of the specified class.
  */
-function plugin($scope, $type, DiscoveryInterface $discovery = NULL) {
-  $kernels = &drupal_static(__FUNCTION__);
-
-  if (empty($kernels[$scope][$type])) {
-    if (!isset($discovery)) {
-      $discovery = new ConfigDiscovery($scope, $type);
-    }
+function drupal_object($class) {
+  $objects = &drupal_static(__FUNCTION__);
 
-    $kernels[$scope][$type] = new PluginKernel($discovery);
+  if (!isset($objects[$class])) {
+    $objects[$class] = new $class();
   }
 
-  return $kernels[$scope][$type];
+  return $objects[$class];
 }
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 b8c04aa..2d81ed9 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 b33444a..5292f7b 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
deleted file mode 100644
index 327f862..0000000
--- a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernel.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * @file
- * ...
- */
-
-namespace Drupal\Component\Plugin\Kernel;
-use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
-use Drupal\Component\Plugin\Mapper\MapperInterface;
-use Drupal\Component\Plugin\Factory\FactoryInterface;
-
-/**
- *
- */
-class PluginKernel implements PluginKernelInterface {
-
-  /**
-   * @var DiscoveryInterface
-   */
-  protected $discovery;
-
-  /**
-   * @var MapperInterface
-   */
-  protected $mapper;
-
-  /**
-   * @var FactoryInterface
-   */
-  protected $factory;
-
-  public function __construct(DiscoveryInterface $discovery) {
-    $this->discovery = $discovery;
-  }
-
-  /**
-   * Implements PluginKernelInterface::getPluginTypeDefinition().
-   */
-  public function getPluginTypeDefinition() {
-    return $this->discovery->getTypeDefinition();
-  }
-
-  /**
-   * Implements PluginKernelInterface::getPluginDefinition().
-   */
-  public function getPluginDefinition($plugin_id) {
-    return $this->discovery->getPluginDefinition($plugin_id);
-  }
-
-  /**
-   * Implements PluginKernelInterface::getPluginDefinitions().
-   */
-  public function getPluginDefinitions() {
-    return $this->discovery->getPluginDefinitions();
-  }
-
-  /**
-   * Implements PluginKernelInterface::createPluginInstance().
-   */
-  public function createPluginInstance($plugin_id, array $configuration = array()) {
-    return $this->getFactory()->createPluginInstance($plugin_id, $configuration);
-  }
-
-  /**
-   * Implements PluginKernelInterface::getPluginInstance().
-   */
-  public function getPluginInstance(array $options) {
-    return $this->getMapper()->getPluginInstance($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
deleted file mode 100644
index f2a1298..0000000
--- a/core/lib/Drupal/Component/Plugin/Kernel/PluginKernelInterface.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * @file
- * ...
- */
-
-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.
-   *
-   * @param string $plugin_id
-   *   A plugin id.
-   *
-   * @return array
-   *   A plugin definition.
-   */
-  public function getPluginDefinition($plugin_id);
-
-  /**
-   * Get all list of all plugin definitions for a type.
-   *
-   * @return array
-   *   An array of configuration definitions.
-   */
-  public function getPluginDefinitions();
-
-  /**
-   * Instantiates a fully configured plugin instance.
-   *
-   * @param string $plugin_id
-   *   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.
-   *
-   * @return mixed
-   *   A plugin instance whose type is dependent upon the $type parameter
-   *   passed to this mapper object.
-   */
-  public function createPluginInstance($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.
-   */
-  public function getPluginInstance(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..63a8a5f
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/PluginType.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @file
+ * Definition of Drupal\Component\Plugin\PluginType
+ */
+
+namespace Drupal\Component\Plugin;
+
+abstract class PluginType implements PluginTypeInterface {
+
+  protected $discovery;
+  protected $factory;
+  protected $mapper;
+
+  /**
+   * Implements PluginTypeInterface::getPluginDefinition().
+   */
+  public function getPluginDefinition($plugin_id) {
+    return $this->discovery->getPluginDefinition($plugin_id);
+  }
+
+  /**
+   * Implements PluginTypeInterface::getPluginDefinitions().
+   */
+  public function getPluginDefinitions() {
+    return $this->discovery->getPluginDefinitions();
+  }
+
+  /**
+   * Implements PluginTypeInterface::createPluginInstance().
+   */
+  public function createPluginInstance($plugin_id, array $configuration = array()) {
+    return $this->factory->createPluginInstance($plugin_id, $configuration);
+  }
+
+  /**
+   * Implements PluginTypeInterface::getPluginInstance().
+   */
+  public function getPluginInstance(array $options) {
+    return $this->mapper->getPluginInstance($options);
+  }
+
+}
diff --git a/core/lib/Drupal/Component/Plugin/PluginTypeInterface.php b/core/lib/Drupal/Component/Plugin/PluginTypeInterface.php
new file mode 100644
index 0000000..caecdd6
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/PluginTypeInterface.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @file
+ * Definition of Drupal\Component\Plugin\PluginTypeInterface
+ */
+
+namespace Drupal\Component\Plugin;
+
+/**
+ * Interface implemented by all plugin type implementations.
+ */
+interface PluginTypeInterface {
+
+  /**
+   * Gets a specific plugin definition.
+   *
+   * @param string $plugin_id
+   *   A plugin id.
+   *
+   * @return array
+   *   A plugin definition.
+   */
+  public function getPluginDefinition($plugin_id);
+
+  /**
+   * Gets the definition of all plugins for this type.
+   *
+   * @return array
+   *   An array of configuration definitions.
+   */
+  public function getPluginDefinitions();
+
+  /**
+   * Instantiates a fully configured plugin instance.
+   *
+   * @param string $plugin_id
+   *   The plugin id of the plugin being instantiated.
+   *
+   * @param array $configuration
+   *   An optional array of information for configuring the plugin instance.
+   *
+   * @return object
+   *   The configured plugin instance. The class of the object is usually
+   *   determined by the plugin.
+   */
+  public function createPluginInstance($plugin_id, array $configuration = array());
+
+  /**
+   * Instantiates a fully configured plugin instance.
+   *
+   * @param array $options
+   *   An array of options from which the plugin type can determine a suitable
+   *   plugin to instantiate and how to configure it.
+   *
+   * @return object
+   *   The configured plugin instance. The class of the object is usually
+   *   determined by the plugin.
+   */
+  public function getPluginInstance(array $options);
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php b/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php
index 706e744..c160b1a 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/ConfigDiscovery.php
@@ -10,33 +10,19 @@ use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 
 class ConfigDiscovery implements DiscoveryInterface {
 
-  protected $type;
-  protected $scope;
-  protected $type_configuration;
+  protected $definition_root;
 
-  function __construct($scope, $type) {
-    $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;
+  function __construct($definition_root = NULL) {
+    $this->definition_root = $definition_root;
   }
 
   /**
    * 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);
+      $derviative_mapper = new $config['derivative']($this->definition_root, $plugin_id, $config);
       $config = $derviative_mapper->getDerviative($plugin_id);
     }
     return $config;
@@ -47,11 +33,10 @@ 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]);
+        $derviative_mapper = new $plugins[$plugin_id]['derivative']($this->definition_root, $plugin_id, $plugins[$plugin_id]);
         $derivatives = $derviative_mapper->getDerivatives();
         foreach ($derivatives as $derivative_id => $derivative) {
           $plugins[$derivative_id] = $derivative;
@@ -61,17 +46,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 4079c2b..cc07cc6 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,18 @@ 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',
-    ));
-  }
-
-  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.');
+    // @todo After moving the classes of plugin_test.inc to PSR-0 locations,
+    //   remove this line.
+    require_once 'plugins_test.inc';
   }
 
   function testPluginDefintionFetching() {
-    $plugin_definition = plugin('simpletest', 'plugin')->getPluginDefinition('coolaid');
-    $this->assertEqual($plugin_definition['string'], 'oh yeah', 'Plugin definition retrievable by the plugin kernel getPluginDefinition().');
+    $plugin_definition = drupal_object('Drupal\plugins_test\Plugin\TestPluginType')->getPluginDefinition('coolaid');
+    $this->assertEqual($plugin_definition['string'], 'oh yeah', 'Plugin definition retrievable by the test plugin type.');
   }
 
   function testPluginInstanceFetching() {
-    $plugin = plugin('simpletest', 'plugin')->createPluginInstance('coolaid');
-    $this->assertEqual(get_class($plugin), 'PluginBaseTestPluginClass', 'Correct plugin implementation returned by the plugin kernel createPluginInstance().');
+    $plugin = drupal_object('Drupal\plugins_test\Plugin\TestPluginType')->createPluginInstance('coolaid');
+    $this->assertEqual(get_class($plugin), 'Drupal\plugins_test\Plugin\TestPluginInstanceClass', 'Correct plugin instance implementation returned by the test plugin type.');
   }
 }
-
-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..38d3979
--- /dev/null
+++ b/core/modules/simpletest/tests/plugins_test.inc
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @todo Move each of these classes to PSR-0 locations when tests allow for
+ *   that (http://drupal.org/node/1477218).
+ */
+
+namespace Drupal\plugins_test\Plugin;
+use Drupal\Component\Plugin\PluginType;
+use Drupal\Component\Plugin\Discovery\StaticDiscovery;
+use Drupal\Component\Plugin\Mapper\DefaultMapper;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+use Drupal\Component\Plugin\PluginAbstract;
+
+class TestPluginType extends PluginType {
+  public function __construct() {
+    $this->discovery = new StaticDiscovery();
+    $this->discovery->setPluginDefinition('coolaid', array(
+      'string' => 'oh yeah',
+      'class' => 'Drupal\plugins_test\Plugin\TestPluginInstanceClass',
+    ));
+    $this->factory = new DefaultFactory($this->discovery, 'class');
+    $this->mapper = new DefaultMapper($this->discovery, $this->factory);
+  }
+}
+
+class TestPluginInstanceClass extends PluginAbstract {
+}
