diff --git a/includes/admin.inc b/includes/admin.inc
index 29c4757..9b7ed4c 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -327,7 +327,7 @@ function views_ui_add_form($form, &$form_state) {
 
   // Create the "Show" dropdown, which allows the base table of the view to be
   // selected.
-  $wizard_plugins = views_ui_get_wizards();
+  $wizard_plugins = drupal_container()->get('plugin.manager.views.wizard')->getDefinitions();
   $options = array();
   foreach ($wizard_plugins as $key => $wizard) {
     $options[$key] = $wizard['title'];
@@ -654,7 +654,8 @@ function views_ui_nojs_submit($form, &$form_state) {
  * Validate the add view form.
  */
 function views_ui_wizard_form_validate($form, &$form_state) {
-  $wizard = views_ui_get_wizard($form_state['values']['show']['wizard_key']);
+  $wizard_type = $form_state['values']['show']['wizard_key'];
+  $wizard = drupal_container()->get('plugin.manager.views.wizard')->getDefinition($wizard_type);
   $form_state['wizard'] = $wizard;
   $form_state['wizard_instance'] = views_get_plugin('wizard', $wizard['id']);
   $errors = $form_state['wizard_instance']->validateView($form, $form_state);
diff --git a/lib/Drupal/views/Plugin/Type/ViewsPluginManager.php b/lib/Drupal/views/Plugin/Type/ViewsPluginManager.php
index 535ac61..26fe5d1 100644
--- a/lib/Drupal/views/Plugin/Type/ViewsPluginManager.php
+++ b/lib/Drupal/views/Plugin/Type/ViewsPluginManager.php
@@ -25,7 +25,7 @@ class ViewsPluginManager extends PluginManagerBase {
     // @todo Remove this hack in http://drupal.org/node/1708404.
     views_init();
 
-    $this->discovery = new CacheDecorator(new AnnotatedClassDiscovery('views', $type), 'views:' . $type, 'views');
+    $this->discovery = new CacheDecorator(new AnnotatedClassDiscovery('views', $type), 'views:' . $type, 'views_info');
     $this->factory = new DefaultFactory($this);
     $this->coreModules = views_core_modules();
     $this->defaults += array(
diff --git a/lib/Drupal/views/Plugin/Type/ViewsWizardPluginManager.php b/lib/Drupal/views/Plugin/Type/ViewsWizardPluginManager.php
new file mode 100644
index 0000000..6cb01cd
--- /dev/null
+++ b/lib/Drupal/views/Plugin/Type/ViewsWizardPluginManager.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\Plugin\Type\ViewsWizardPluginManager.
+ */
+
+namespace Drupal\views\Plugin\Type;
+
+use Drupal\Core\Plugin\Discovery\CacheDecorator;
+
+/**
+ * A plugin manager specific for views wizard plugins.
+ */
+class ViewsWizardPluginManager extends ViewsPluginManager {
+
+  /**
+   * Constructs a Drupal\views\Plugin\Type\ViewsWizardPluginManager object.
+   */
+  public function __construct($type) {
+    parent::__construct($type);
+    $this->discovery = new CacheDecorator(new WizardDiscovery('views', $type), 'views:' . $type, 'views_info');
+  }
+
+}
diff --git a/lib/Drupal/views/Plugin/Type/WizardDiscovery.php b/lib/Drupal/views/Plugin/Type/WizardDiscovery.php
new file mode 100644
index 0000000..8e3bc36
--- /dev/null
+++ b/lib/Drupal/views/Plugin/Type/WizardDiscovery.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\Plugin\Type\WizardDiscovery.
+ */
+
+namespace Drupal\views\Plugin\Type;
+
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+
+class WizardDiscovery extends AnnotatedClassDiscovery {
+  /**
+   * Provides a default definition array for a certain table.
+   *
+   * @param string $table
+   *   The table name which is used for the plugin definition.
+   *
+   * @return array
+   *   A plugin definition array
+   */
+  protected function defaultDefinition($table) {
+    if ($info = views_fetch_data($table)) {
+      $definition['title'] = $info['table']['base']['title'];
+      $definition['base_table'] = $table;
+      $definition['id'] = $table;
+      $definition['class'] = 'Drupal\views\Plugin\views\wizard\Standard';
+      return $definition;
+    }
+    else {
+      return array();
+    }
+  }
+
+  /**
+   * Overrides Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery::getDefinitions().
+   *
+   * @return array
+   */
+  public function getDefinitions() {
+    $definitions = parent::getDefinitions();
+
+    $base_tables = array_keys(views_fetch_base_tables());
+    // Find base tables with no wizard and add a default plugin in.
+    // @todo Maybe handle this in an alter hook.
+    foreach ($base_tables as $table) {
+      if (!isset($definitions[$table])) {
+        $definitions[$table] = array();
+        $definitions[$table] += $this->defaultDefinition($table);
+      }
+    }
+    unset($definitions['standard']);
+
+    return $definitions;
+  }
+}
diff --git a/lib/Drupal/views/Plugin/views/argument/ArgumentPluginBase.php b/lib/Drupal/views/Plugin/views/argument/ArgumentPluginBase.php
index 1efbfda..26e79dd 100644
--- a/lib/Drupal/views/Plugin/views/argument/ArgumentPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/argument/ArgumentPluginBase.php
@@ -301,7 +301,7 @@ abstract class ArgumentPluginBase extends HandlerBase {
       ),
     );
 
-    $plugins = views_get_plugin_definitions('argument_validator');
+    $plugins = drupal_container()->get('plugin.manager.views.argument_validator')->getDefinitions();
     foreach ($plugins as $id => $info) {
       if (!empty($info['no_ui'])) {
         continue;
@@ -496,7 +496,7 @@ abstract class ArgumentPluginBase extends HandlerBase {
    * default action is set to provide default argument.
    */
   function default_argument_form(&$form, &$form_state) {
-    $plugins = views_get_plugin_definitions('argument_default');
+    $plugins = drupal_container()->get('plugin.manager.views.argument_default')->getDefinitions();
     $options = array();
 
     $form['default_argument_skip_url'] = array(
@@ -560,7 +560,7 @@ abstract class ArgumentPluginBase extends HandlerBase {
    * default action is set to display one.
    */
   function default_summary_form(&$form, &$form_state) {
-    $style_plugins = views_get_plugin_definitions('style');
+    $style_plugins = drupal_container()->get('plugin.manager.views.style')->getDefinitions();
     $summary_plugins = array();
     $format_options = array();
     foreach ($style_plugins as $key => $plugin) {
@@ -1053,7 +1053,7 @@ abstract class ArgumentPluginBase extends HandlerBase {
       $options = $this->options[$options_name];
     }
 
-    $plugin = views_get_plugin($type, $name);
+    $plugin = drupal_container()->get("plugin.manager.views.$type")->createInstance($name);
     if ($plugin) {
       // Style plugins expects different parameters as argument related plugins.
       if ($type == 'style') {
diff --git a/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
index 1026ae4..a66adc2 100644
--- a/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
@@ -94,8 +94,9 @@ abstract class DisplayPluginBase extends PluginBase {
     $this->extender = array();
     $extenders = views_get_enabled_display_extenders();
     if (!empty($extenders)) {
+      $container = drupal_container();
       foreach ($extenders as $extender) {
-        $plugin = views_get_plugin('display_extender', $extender);
+        $plugin = $container->get('plugin.manager.views.display_extender')->createInstance($extender);
         if ($plugin) {
           $plugin->init($this->view, $this);
           $this->extender[$extender] = $plugin;
@@ -756,13 +757,7 @@ abstract class DisplayPluginBase extends PluginBase {
           $options = $options['options'];
       }
 
-      if ($type != 'query') {
-        $plugin = views_get_plugin($type, $name);
-      }
-      else {
-        $plugin = views_get_plugin('query', $name);
-      }
-
+      $plugin = drupal_container()->get("plugin.manager.views.$type")->createInstance($name);
       if (!$plugin) {
         return;
       }
@@ -1056,9 +1051,10 @@ abstract class DisplayPluginBase extends PluginBase {
       'desc' => t('Change the title that this display will use.'),
     );
 
+    $container = drupal_container();
     $style_options = $this->getOption('style');
     $name = $style_options['type'];
-    $style_plugin = views_get_plugin_definition('style', $name);
+    $style_plugin = $container->get('plugin.manager.views.style')->getDefinition($name);
     $style_plugin_instance = $this->getPlugin('style');
     $style_summary = empty($style_plugin['title']) ? t('Missing style plugin') : $style_plugin_instance->summaryTitle();
     $style_title = empty($style_plugin['title']) ? t('Missing style plugin') : $style_plugin_instance->pluginTitle();
@@ -1081,7 +1077,7 @@ abstract class DisplayPluginBase extends PluginBase {
     if ($style_plugin_instance->usesRowPlugin()) {
       $row_options = $this->getOption('row');
       $name = $row_options['type'];
-      $row_plugin = views_get_plugin_definition('row', $name);
+      $row_plugin = $container->get('plugin.manager.views.row')->getDefinition($name);
       $row_plugin_instance = $this->getPlugin('row', $name);
       $row_summary = empty($row_plugin['title']) ? t('Missing style plugin') : $row_plugin_instance->summaryTitle();
       $row_title = empty($row_plugin['title']) ? t('Missing style plugin') : $row_plugin_instance->pluginTitle();
diff --git a/lib/Drupal/views/Plugin/views/wizard/Standard.php b/lib/Drupal/views/Plugin/views/wizard/Standard.php
new file mode 100644
index 0000000..e11fdba
--- /dev/null
+++ b/lib/Drupal/views/Plugin/views/wizard/Standard.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\Plugin\views\wizard\Standard.
+ */
+
+namespace Drupal\views\Plugin\views\wizard;
+
+use Drupal\Core\Annotation\Plugin;
+
+/**
+ * @Plugin(
+ *   id = "standard",
+ *   table = "replacement"
+ * )
+ */
+class Standard extends WizardPluginBase {
+
+}
diff --git a/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php b/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
index 990a40c..660c90c 100644
--- a/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
@@ -760,7 +760,7 @@ abstract class WizardPluginBase extends PluginBase implements WizardInterface {
       $table_data = views_fetch_data($table);
       // If the 'in' operator is being used, map the values to an array.
       $handler = $table_data[$bundle_key]['filter']['id'];
-      $handler_definition = views_get_plugin_definition('filter', $handler);
+      $handler_definition = drupal_container()->get('plugin.manager.views.filter')->getDefinition($handler);
       if ($handler == 'in_operator' || is_subclass_of($handler_definition['class'], 'Drupal\\views\\Plugin\\views\\filter\\InOperator')) {
         $value = drupal_map_assoc(array($form_state['values']['show']['type']));
       }
diff --git a/lib/Drupal/views/ViewStorage.php b/lib/Drupal/views/ViewStorage.php
index 676855e..e3f537f 100644
--- a/lib/Drupal/views/ViewStorage.php
+++ b/lib/Drupal/views/ViewStorage.php
@@ -240,7 +240,7 @@ class ViewStorage extends ConfigEntityBase implements ViewStorageInterface {
       return FALSE;
     }
 
-    $plugin = views_get_plugin_definition('display', $plugin_id);
+    $plugin = drupal_container()->get('plugin.manager.views.display')->getDefinition($plugin_id);
     if (empty($plugin)) {
       $plugin['title'] = t('Broken');
     }
diff --git a/lib/Drupal/views/ViewsBundle.php b/lib/Drupal/views/ViewsBundle.php
index a432e35..54f62e8 100644
--- a/lib/Drupal/views/ViewsBundle.php
+++ b/lib/Drupal/views/ViewsBundle.php
@@ -21,8 +21,14 @@ class ViewsBundle extends Bundle {
    */
   public function build(ContainerBuilder $container) {
     foreach (ViewExecutable::getPluginTypes() as $type) {
-      $container->register("plugin.manager.views.$type", 'Drupal\views\Plugin\Type\ViewsPluginManager')
-        ->addArgument($type);
+      if ($type == 'wizard') {
+        $container->register("plugin.manager.views.wizard", 'Drupal\views\Plugin\Type\ViewsWizardPluginManager')
+          ->addArgument($type);
+      }
+      else {
+        $container->register("plugin.manager.views.$type", 'Drupal\views\Plugin\Type\ViewsPluginManager')
+          ->addArgument($type);
+      }
     }
   }
 
diff --git a/views.module b/views.module
index 52b7674..256099f 100644
--- a/views.module
+++ b/views.module
@@ -901,7 +901,8 @@ function views_add_contextual_links(&$render_element, $location, ViewExecutable
     // Also do not do anything if the display plugin has not defined any
     // contextual links that are intended to be displayed in the requested
     // location.
-    $plugin = views_get_plugin_definition('display', $view->displayHandlers[$display_id]->display['display_plugin']);
+    $plugin_id = $view->displayHandlers[$display_id]->getPluginId();
+    $plugin = drupal_container()->get('plugin.manager.views.display')->getDefinition($plugin_id);
     // If contextual_links_locations are not set, provide a sane default. (To
     // avoid displaying any contextual links at all, a display plugin can still
     // set 'contextual_links_locations' to, e.g., {""}.)
@@ -1274,6 +1275,7 @@ function views_include_handlers($reset = FALSE) {
  */
 function views_get_handler($table, $field, $type, $override = NULL) {
   static $recursion_protection = array();
+  $manager = drupal_container()->get("plugin.manager.views.$type");
 
   $data = views_fetch_data($table, FALSE);
   $handler = NULL;
@@ -1339,7 +1341,6 @@ function views_get_handler($table, $field, $type, $override = NULL) {
     }
 
     // @todo This is crazy. Find a way to remove the override functionality.
-    $manager = drupal_container()->get("plugin.manager.views.$type");
     $plugin_id = !empty($definition['override handler']) ? $definition['override handler'] : $definition['id'];
     // Try to use the overridden handler.
     try {
@@ -1358,7 +1359,7 @@ function views_get_handler($table, $field, $type, $override = NULL) {
 
   // Finally, use the 'broken' handler.
   debug(t("Missing handler: @table @field @type", array('@table' => $table, '@field' => $field, '@type' => $type)));
-  return views_get_plugin($type, 'broken');
+  return $manager->createInstance('broken');
 }
 
 /**
@@ -1387,7 +1388,7 @@ function views_fetch_data($table = NULL, $move = TRUE, $reset = FALSE) {
  *   A keyed array of in the form of 'base_table' => 'Description'.
  */
 function views_fetch_plugin_names($type, $key = NULL, $base = array()) {
-  $definitions = views_get_plugin_definitions($type);
+  $definitions = drupal_container()->get("plugin.manager.views.$type")->getDefinitions();
   $plugins = array();
 
   foreach ($definitions as $id => $plugin) {
@@ -1433,23 +1434,16 @@ function views_get_plugin($type, $plugin_id) {
 /**
  * Gets all the views plugin definitions.
  *
- * @param string|false $type
- *   Either the plugin type, or FALSE to load all definitions.
- *
  * @return array
- *   An array of plugin definitions for a single type, or an associative array
- *   of plugin definitions keyed by plugin type.
+ *   An array of plugin definitions for all types.
  */
-function views_get_plugin_definitions($type = FALSE) {
-  $plugins = array();
-  $plugin_types = $type ? array($type) : ViewExecutable::getPluginTypes();
+function views_get_plugin_definitions() {
   $container = drupal_container();
-  foreach ($plugin_types as $plugin_type) {
+  $plugins = array();
+  foreach (ViewExecutable::getPluginTypes() as $plugin_type) {
     $plugins[$plugin_type] = $container->get("plugin.manager.views.$plugin_type")->getDefinitions();
   }
-  if ($type) {
-    return $plugins[$type];
-  }
+
   return $plugins;
 }
 
diff --git a/views_ui.module b/views_ui.module
index c6dfae1..e45f3e0 100644
--- a/views_ui.module
+++ b/views_ui.module
@@ -519,75 +519,6 @@ function views_ui_view_preview_section_rows_links(ViewUI $view) {
   return $links;
 }
 
-/**
- * Fetch metadata on a specific views ui wizard plugin.
- *
- * @param $wizard_type
- *   Name of a wizard, or name of a base table.
- *
- * @return
- *   An array with information about the requested wizard type.
- */
-function views_ui_get_wizard($wizard_type) {
-  $wizard = views_get_plugin_definition('wizard', $wizard_type);
-  // @todo - handle this via an alter hook instead.
-  if (!$wizard) {
-    // Must be a base table using the default wizard plugin.
-    $base_tables = views_fetch_base_tables();
-    if (!empty($base_tables[$wizard_type])) {
-      $wizard = views_ui_views_wizard_defaults();
-      $wizard['base_table'] = $wizard_type;
-      $wizard['title'] = $base_tables[$wizard_type]['title'];
-    }
-  }
-  return $wizard;
-}
-
-/**
- * Fetch metadata for all content_type plugins.
- *
- * @return
- *   An array of arrays with information about all available views wizards.
- */
-function views_ui_get_wizards() {
-  $wizard_plugins = views_get_plugin_definitions('wizard');
-  $wizard_tables = array();
-  foreach ($wizard_plugins as $name => $info) {
-    $wizard_tables[$info['base_table']] = TRUE;
-  }
-  $base_tables = views_fetch_base_tables();
-  $default_wizard = views_ui_views_wizard_defaults();
-  // Find base tables with no wizard.
-  // @todo - handle this via an alter hook for plugins?
-  foreach ($base_tables as $table => $info) {
-    if (!isset($wizard_tables[$table])) {
-      $wizard = $default_wizard;
-      $wizard['title'] = $info['title'];
-      $wizard['base_table'] = $table;
-      $wizard_plugins[$table] = $wizard;
-    }
-  }
-  return $wizard_plugins;
-}
-
-/**
- * Helper function to define the default values for a Views wizard plugin.
- *
- * @return
- *   An array of defaults for a views wizard.
- */
-function views_ui_views_wizard_defaults() {
-  return array(
-    // The children may, for example, be a different variant for each node type.
-    'get children' => NULL,
-    'get child' => NULL,
-    // title and base table must be populated.  They are empty here just
-    // so they are documented.
-    'title' => '',
-    'base_table' => NULL,
-  );
-}
-
 function views_ui_get_form_wizard_instance($wizard) {
   return views_get_plugin('wizard', $wizard['name']);
 }
