diff --git a/core/lib/Drupal/Core/Annotation/AnnotationInterface.php b/core/lib/Drupal/Component/Annotation/AnnotationInterface.php
similarity index 65%
rename from core/lib/Drupal/Core/Annotation/AnnotationInterface.php
rename to core/lib/Drupal/Component/Annotation/AnnotationInterface.php
index 3382d48..55741e4 100644
--- a/core/lib/Drupal/Core/Annotation/AnnotationInterface.php
+++ b/core/lib/Drupal/Component/Annotation/AnnotationInterface.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Definition of Drupal\Core\Annotation\AnnotationInterface.
+ * Definition of Drupal\Component\Annotation\AnnotationInterface.
  */
 
-namespace Drupal\Core\Annotation;
+namespace Drupal\Component\Annotation;
 
 /**
  * Defines a common interface for classed annotations.
diff --git a/core/lib/Drupal/Core/Annotation/Plugin.php b/core/lib/Drupal/Component/Annotation/Plugin.php
similarity index 92%
copy from core/lib/Drupal/Core/Annotation/Plugin.php
copy to core/lib/Drupal/Component/Annotation/Plugin.php
index d4931ee..3d3500c 100644
--- a/core/lib/Drupal/Core/Annotation/Plugin.php
+++ b/core/lib/Drupal/Component/Annotation/Plugin.php
@@ -2,12 +2,10 @@
 
 /**
  * @file
- * Definition of Drupal\Core\Annotation\Plugin.
+ * Definition of Drupal\Component\Annotation\Plugin.
  */
 
-namespace Drupal\Core\Annotation;
-
-use Drupal\Core\Annotation\AnnotationInterface;
+namespace Drupal\Component\Annotation;
 
 /**
  * Defines a Plugin annotation object.
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php b/core/lib/Drupal/Component/Plugin/Discovery/AnnotatedClassDiscovery.php
similarity index 51%
copy from core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php
copy to core/lib/Drupal/Component/Plugin/Discovery/AnnotatedClassDiscovery.php
index bd89a92..e09c996 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/AnnotatedClassDiscovery.php
@@ -2,15 +2,14 @@
 
 /**
  * @file
- * Definition of Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery.
+ * Definition of Drupal\Component\Plugin\Discovery\AnnotatedClassDiscovery.
  */
 
-namespace Drupal\Core\Plugin\Discovery;
+namespace Drupal\Component\Plugin\Discovery;
 
 use DirectoryIterator;
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Component\Reflection\MockFileFinder;
-use Drupal\Core\Annotation\Plugin;
 use Doctrine\Common\Annotations\AnnotationReader;
 use Doctrine\Common\Annotations\AnnotationRegistry;
 use Doctrine\Common\Reflection\StaticReflectionParser;
@@ -21,11 +20,36 @@
 class AnnotatedClassDiscovery implements DiscoveryInterface {
 
   /**
+   * The namespaces within which to find plugin classes.
+   *
+   * @var array
+   */
+  protected $pluginNamespaces;
+
+  /**
+   * The namespaces of classes that can be used as annotations.
+   *
+   * @var array
+   */
+  protected $annotationNamespaces;
+
+  /**
+   * The name of the annotation that contains the plugin definition.
+   *
+   * The class corresponding to this name must implement
+   * Drupal\Component\Annotation\AnnotationInterface.
+   *
+   * @var string
+   */
+  protected $pluginDefinitionAnnotationName;
+
+  /**
    * Constructs an AnnotatedClassDiscovery object.
    */
-  function __construct($owner, $type) {
-    $this->owner = $owner;
-    $this->type = $type;
+  function __construct($plugin_namespaces = array(), $annotation_namespaces = array(), $plugin_definition_annotation_name = 'Drupal\Component\Annotation\Plugin') {
+    $this->pluginNamespaces = $plugin_namespaces;
+    $this->annotationNamespaces = $annotation_namespaces;
+    $this->pluginDefinitionAnnotationName = $plugin_definition_annotation_name;
   }
 
   /**
@@ -45,36 +69,18 @@ public function getDefinitions() {
     // Prevent @endlink from being parsed as an annotation.
     $reader->addGlobalIgnoredName('endlink');
 
-    // Register the namespace of classes that can be used for annotations.
-    AnnotationRegistry::registerAutoloadNamespace('Drupal\Core\Annotation', array(DRUPAL_ROOT . '/core/lib'));
-    // Get all PSR-0 namespaces.
-    $namespaces = drupal_classloader()->getNamespaces();
-    foreach ($namespaces as $ns => $namespace_dirs) {
-
-      // OS-Safe directory separators.
-      $ns = str_replace('\\', DIRECTORY_SEPARATOR, $ns);
-
-      foreach ($namespace_dirs as $dir) {
-        // Check for the pre-determined directory structure to find plugins.
-        $prefix = implode(DIRECTORY_SEPARATOR, array(
-          $ns,
-          'Plugin',
-          $this->owner,
-          $this->type
-        ));
-        $dir .= DIRECTORY_SEPARATOR . $prefix;
-
-        // If the directory structure exists, look for classes.
+    // Register the namespaces of classes that can be used for annotations.
+    AnnotationRegistry::registerAutoloadNamespaces($this->getAnnotationNamespaces());
+
+    // Search for classes within all PSR-0 namespace locations.
+    foreach ($this->getPluginNamespaces() as $namespace => $dirs) {
+      foreach ($dirs as $dir) {
+        $dir .= DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $namespace);
         if (file_exists($dir)) {
-          $directories = new DirectoryIterator($dir);
-          foreach ($directories as $fileinfo) {
+          foreach (new DirectoryIterator($dir) as $fileinfo) {
             // @todo Once core requires 5.3.6, use $fileinfo->getExtension().
             if (pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION) == 'php') {
-              $class = str_replace(
-                DIRECTORY_SEPARATOR,
-                '\\',
-                $prefix . DIRECTORY_SEPARATOR . $fileinfo->getBasename('.php')
-              );
+              $class = $namespace . '\\' . $fileinfo->getBasename('.php');
 
               // The filename is already known, so there is no need to find the
               // file. However, StaticReflectionParser needs a finder, so use a
@@ -82,7 +88,7 @@ public function getDefinitions() {
               $finder = MockFileFinder::create($fileinfo->getPathName());
               $parser = new StaticReflectionParser($class, $finder);
 
-              if ($annotation = $reader->getClassAnnotation($parser->getReflectionClass(), 'Drupal\Core\Annotation\Plugin')) {
+              if ($annotation = $reader->getClassAnnotation($parser->getReflectionClass(), $this->pluginDefinitionAnnotationName)) {
                 // AnnotationInterface::get() returns the array definition
                 // instead of requiring us to work with the annotation object.
                 $definition = $annotation->get();
@@ -97,4 +103,18 @@ public function getDefinitions() {
     return $definitions;
   }
 
+  /**
+   * Returns an array of PSR-0 namespaces to search for plugin classes.
+   */
+  protected function getPluginNamespaces() {
+    return $this->pluginNamespaces;
+  }
+
+  /**
+   * Returns an array of PSR-0 namespaces to search for annotation classes.
+   */
+  protected function getAnnotationNamespaces() {
+    return $this->annotationNamespaces;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Annotation/Plugin.php b/core/lib/Drupal/Core/Annotation/Plugin.php
index d4931ee..2801bc5 100644
--- a/core/lib/Drupal/Core/Annotation/Plugin.php
+++ b/core/lib/Drupal/Core/Annotation/Plugin.php
@@ -7,68 +7,15 @@
 
 namespace Drupal\Core\Annotation;
 
-use Drupal\Core\Annotation\AnnotationInterface;
+use Drupal\Component\Annotation\Plugin as ComponentPlugin;
 
 /**
  * Defines a Plugin annotation object.
  *
- * Annotations in plugin classes can utilize this class in order to pass
- * various metadata about the plugin through the parser to
- * DiscoveryInterface::getDefinitions() calls. This allows the metadata
- * of a class to be located with the class itself, rather than in module-based
- * info hooks.
- *
  * @Annotation
+ *
+ * @todo Remove after globally replacing all plugin classes to "use" the
+ *   Component one instead of this one: http://drupal.org/node/1849752.
  */
-class Plugin implements AnnotationInterface {
-
-  /**
-   * The plugin definiton read from the class annotation.
-   *
-   * @var array
-   */
-  protected $definition;
-
-  /**
-   * Constructs a Plugin object.
-   *
-   * Builds up the plugin definition and invokes the get() method for any
-   * classed annotations that were used.
-   */
-  public function __construct($values) {
-    $this->definition = $this->parse($values);
-  }
-
-  /**
-   * Parses an annotation into its definition.
-   *
-   * @param array $values
-   *   The annotation array.
-   *
-   * @return array
-   *  The parsed annotation as a definition.
-   */
-  protected function parse(array $values) {
-    $definitions = array();
-    foreach ($values as $key => $value) {
-      if ($value instanceof AnnotationInterface) {
-        $definitions[$key] = $value->get();
-      }
-      elseif (is_array($value)) {
-        $definitions[$key] = $this->parse($value);
-      }
-      else {
-        $definitions[$key] = $value;
-      }
-    }
-    return $definitions;
-  }
-
-  /**
-   * Implements Drupal\Core\Annotation\AnnotationInterface::get().
-   */
-  public function get() {
-    return $this->definition;
-  }
-
+class Plugin extends ComponentPlugin {
 }
diff --git a/core/lib/Drupal/Core/Annotation/Translation.php b/core/lib/Drupal/Core/Annotation/Translation.php
index 1e4ec6d..0d6acd1 100644
--- a/core/lib/Drupal/Core/Annotation/Translation.php
+++ b/core/lib/Drupal/Core/Annotation/Translation.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\Annotation;
 
-use Drupal\Core\Annotation\AnnotationInterface;
+use Drupal\Component\Annotation\AnnotationInterface;
 
 /**
  * Defines a translatable annotation object.
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php b/core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php
index bd89a92..9409c98 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php
@@ -7,18 +7,12 @@
 
 namespace Drupal\Core\Plugin\Discovery;
 
-use DirectoryIterator;
-use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
-use Drupal\Component\Reflection\MockFileFinder;
-use Drupal\Core\Annotation\Plugin;
-use Doctrine\Common\Annotations\AnnotationReader;
-use Doctrine\Common\Annotations\AnnotationRegistry;
-use Doctrine\Common\Reflection\StaticReflectionParser;
+use Drupal\Component\Plugin\Discovery\AnnotatedClassDiscovery as ComponentAnnotatedClassDiscovery;
 
 /**
  * Defines a discovery mechanism to find annotated plugins in PSR-0 namespaces.
  */
-class AnnotatedClassDiscovery implements DiscoveryInterface {
+class AnnotatedClassDiscovery extends ComponentAnnotatedClassDiscovery {
 
   /**
    * Constructs an AnnotatedClassDiscovery object.
@@ -26,75 +20,29 @@ class AnnotatedClassDiscovery implements DiscoveryInterface {
   function __construct($owner, $type) {
     $this->owner = $owner;
     $this->type = $type;
+    $annotation_namespaces = array(
+      'Drupal\Component\Annotation' => DRUPAL_ROOT . '/core/lib',
+      'Drupal\Core\Annotation' => DRUPAL_ROOT . '/core/lib',
+    );
+    // @todo Remove the last argument after globally replacing all plugin
+    //   classes to "use" Drupal\Component\Annotation\Plugin instead:
+    //   http://drupal.org/node/1849752.
+    parent::__construct(array(), $annotation_namespaces, 'Drupal\Core\Annotation\Plugin');
   }
 
   /**
-   * Implements Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinition().
+   * Overrides Drupal\Component\Plugin\Discovery\AnnotatedClassDiscovery::getPluginNamespaces().
+   *
+   * This is overridden rather than set in the constructor, because Drupal
+   * modules can be enabled (and therefore, namespaces registered) during the
+   * lifetime of a plugin manager.
    */
-  public function getDefinition($plugin_id) {
-    $plugins = $this->getDefinitions();
-    return isset($plugins[$plugin_id]) ? $plugins[$plugin_id] : NULL;
-  }
-
-  /**
-   * Implements Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinitions().
-   */
-  public function getDefinitions() {
-    $definitions = array();
-    $reader = new AnnotationReader();
-    // Prevent @endlink from being parsed as an annotation.
-    $reader->addGlobalIgnoredName('endlink');
-
-    // Register the namespace of classes that can be used for annotations.
-    AnnotationRegistry::registerAutoloadNamespace('Drupal\Core\Annotation', array(DRUPAL_ROOT . '/core/lib'));
-    // Get all PSR-0 namespaces.
-    $namespaces = drupal_classloader()->getNamespaces();
-    foreach ($namespaces as $ns => $namespace_dirs) {
-
-      // OS-Safe directory separators.
-      $ns = str_replace('\\', DIRECTORY_SEPARATOR, $ns);
-
-      foreach ($namespace_dirs as $dir) {
-        // Check for the pre-determined directory structure to find plugins.
-        $prefix = implode(DIRECTORY_SEPARATOR, array(
-          $ns,
-          'Plugin',
-          $this->owner,
-          $this->type
-        ));
-        $dir .= DIRECTORY_SEPARATOR . $prefix;
-
-        // If the directory structure exists, look for classes.
-        if (file_exists($dir)) {
-          $directories = new DirectoryIterator($dir);
-          foreach ($directories as $fileinfo) {
-            // @todo Once core requires 5.3.6, use $fileinfo->getExtension().
-            if (pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION) == 'php') {
-              $class = str_replace(
-                DIRECTORY_SEPARATOR,
-                '\\',
-                $prefix . DIRECTORY_SEPARATOR . $fileinfo->getBasename('.php')
-              );
-
-              // The filename is already known, so there is no need to find the
-              // file. However, StaticReflectionParser needs a finder, so use a
-              // mock version.
-              $finder = MockFileFinder::create($fileinfo->getPathName());
-              $parser = new StaticReflectionParser($class, $finder);
-
-              if ($annotation = $reader->getClassAnnotation($parser->getReflectionClass(), 'Drupal\Core\Annotation\Plugin')) {
-                // AnnotationInterface::get() returns the array definition
-                // instead of requiring us to work with the annotation object.
-                $definition = $annotation->get();
-                $definition['class'] = $class;
-                $definitions[$definition['id']] = $definition;
-              }
-            }
-          }
-        }
-      }
+  protected function getPluginNamespaces() {
+    $plugin_namespaces = array();
+    foreach (drupal_classloader()->getNamespaces() as $namespace => $dirs) {
+      $plugin_namespaces["$namespace\\Plugin\\{$this->owner}\\{$this->type}"] = $dirs;
     }
-    return $definitions;
+    return $plugin_namespaces;
   }
 
 }
