diff --git a/core/lib/Drupal/Component/Annotation/PluginID.php b/core/lib/Drupal/Component/Annotation/PluginID.php
new file mode 100644
index 0000000..dcb27aa
--- /dev/null
+++ b/core/lib/Drupal/Component/Annotation/PluginID.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Component\Annotation\PluginID.
+ */
+
+namespace Drupal\Component\Annotation;
+
+/**
+ * Defines a Plugin annotation object that just contains an ID.
+ *
+ * @Annotation
+ */
+class PluginID implements AnnotationInterface {
+
+  /**
+   * The plugin ID.
+   *
+   * When an annotation is given no key, 'value' is assumed by Doctrine.
+   *
+   * @var string
+   */
+  public $value;
+
+  /**
+   * Implements \Drupal\Core\Annotation\AnnotationInterface::get().
+   */
+  public function get() {
+    return array(
+      'id' => $this->value,
+    );
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Discovery/ViewsHandlerDiscovery.php b/core/modules/views/lib/Drupal/views/Plugin/Discovery/ViewsHandlerDiscovery.php
new file mode 100644
index 0000000..291ad44
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/Discovery/ViewsHandlerDiscovery.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\Discovery\ViewsHandlerDiscovery.
+ */
+
+namespace Drupal\views\Plugin\Discovery;
+
+use Drupal\Component\Plugin\Discovery\AnnotatedClassDiscovery;
+
+/**
+ * Defines a discovery mechanism to find Views handlers in PSR-0 namespaces.
+ */
+class ViewsHandlerDiscovery extends AnnotatedClassDiscovery {
+
+  /**
+   * The type of handler being discovered.
+   *
+   * @var string
+   */
+  protected $type;
+
+  /**
+   * Constructs a ViewsHandlerDiscovery object.
+   *
+   * @param string $type
+   *   The plugin type, for example filter.
+   * @param array $root_namespaces
+   *   (optional) Array of root paths keyed by the corresponding namespace to
+   *   look for plugin implementations, \Plugin\views\$type will be appended to
+   *   each namespace. Defaults to an empty array.
+   */
+  function __construct($type, array $root_namespaces = array()) {
+    $this->type = $type;
+    $annotation_namespaces = array(
+      'Drupal\Component\Annotation' => DRUPAL_ROOT . '/core/lib',
+    );
+    $plugin_namespaces = array();
+    foreach ($root_namespaces as $namespace => $dir) {
+      $plugin_namespaces["$namespace\\Plugin\\views\\{$type}"] = array($dir);
+    }
+    parent::__construct($plugin_namespaces, $annotation_namespaces, 'Drupal\Component\Annotation\PluginID');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinitions() {
+    // Add the plugin_type to the definition.
+    $definitions = parent::getDefinitions();
+    foreach ($definitions as $key => $definition) {
+      $definitions[$key]['plugin_type'] = $this->type;
+    }
+    return $definitions;
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/ViewsHandlerManager.php b/core/modules/views/lib/Drupal/views/Plugin/ViewsHandlerManager.php
new file mode 100644
index 0000000..b515452
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/ViewsHandlerManager.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\ViewsHandlerManager.
+ */
+
+namespace Drupal\views\Plugin;
+
+use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+use Drupal\Core\Plugin\Discovery\CacheDecorator;
+use Drupal\views\Plugin\Discovery\ViewsHandlerDiscovery;
+
+/**
+ * Plugin type manager for all views handlers.
+ */
+class ViewsHandlerManager extends PluginManagerBase {
+
+  /**
+   * Constructs a ViewsHandlerManager object.
+   *
+   * @param string $type
+   *   The plugin type, for example filter.
+   * @param array $namespaces
+   *   (optional) An array of paths keyed by it's corresponding namespaces.
+   */
+  public function __construct($type, array $namespaces = array()) {
+    $this->discovery = new ViewsHandlerDiscovery($type, $namespaces);
+    $this->discovery = new CacheDecorator($this->discovery, "views:$type", 'views_info');
+
+    $this->factory = new DefaultFactory($this->discovery);
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php
index 39fc9d0..64a63a0 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php
@@ -7,16 +7,14 @@
 
 namespace Drupal\views\Plugin\views\area;
 
-use Drupal\Component\Annotation\Plugin;
+use Drupal\Component\Annotation\PluginID;
 
 /**
  * A special handler to take the place of missing or broken handlers.
  *
  * @ingroup views_area_handlers
  *
- * @Plugin(
- *   id = "broken"
- * )
+ * @PluginID("broken")
  */
 class Broken extends AreaPluginBase {
 
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index 9865a85..7263f67 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -3,10 +3,10 @@ services:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [access, '%container.namespaces%']
   plugin.manager.views.area:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [area, '%container.namespaces%']
   plugin.manager.views.argument:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [argument, '%container.namespaces%']
   plugin.manager.views.argument_default:
     class: Drupal\views\Plugin\ViewsPluginManager
@@ -27,13 +27,13 @@ services:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [exposed_form, '%container.namespaces%']
   plugin.manager.views.field:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [field, '%container.namespaces%']
   plugin.manager.views.filter:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [filter, '%container.namespaces%']
   plugin.manager.views.join:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [join, '%container.namespaces%']
   plugin.manager.views.pager:
     class: Drupal\views\Plugin\ViewsPluginManager
@@ -42,13 +42,13 @@ services:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [query, '%container.namespaces%']
   plugin.manager.views.relationship:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [relationship, '%container.namespaces%']
   plugin.manager.views.row:
     class: Drupal\views\Plugin\ViewsPluginManager
     arguments: [row, '%container.namespaces%']
   plugin.manager.views.sort:
-    class: Drupal\views\Plugin\ViewsPluginManager
+    class: Drupal\views\Plugin\ViewsHandlerManager
     arguments: [sort, '%container.namespaces%']
   plugin.manager.views.style:
     class: Drupal\views\Plugin\ViewsPluginManager
