diff --git a/core/modules/views/lib/Drupal/views/Plugin/ViewsHandlerPluginManager.php b/core/modules/views/lib/Drupal/views/Plugin/ViewsHandlerPluginManager.php
new file mode 100644
index 0000000..d6a000e
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/ViewsHandlerPluginManager.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\ViewsHandlerPluginManager.
+ */
+
+namespace Drupal\views\Plugin;
+
+use Drupal\Component\Plugin\Exception\PluginException;
+use Drupal\views\ViewsDataCache;
+
+/**
+ * Extends the default views plugin manager for handler plugin types.
+ */
+class ViewsHandlerPluginManager extends ViewsPluginManager {
+
+  /**
+   * Stores the views data cache.
+   *
+   * @var \Drupal\views\ViewsDataCache
+   */
+  protected $viewsDataCache;
+
+  /**
+   * Constructs a ViewsHandlerPluginManager object.
+   *
+   * @param string $type
+   *   The plugin type, for example filter.
+   * @param \Drupal\views\ViewsDataCache $views_data_cache
+   *   The views data cache object.
+   */
+  public function __construct($type, ViewsDataCache $views_data_cache) {
+    parent::__construct($type);
+
+    $this->viewsDataCache = $views_data_cache;
+  }
+
+  function __sleep() {
+    // TODO: Implement __sleep() method.
+    $foo = 123;
+  }
+
+
+  /**
+   * Creates an instance of a handler for a certain table and field.
+   *
+   * @param string $table
+   *   The name of the table this handler is from.
+   * @param string $field
+   *   The name of the field this handler is from.
+   * @param string $override
+   *   Override the actual handler object with this plugin ID. Used for
+   *   aggregation when the handler is redirected to the aggregation handler.
+   *
+   * @return \Drupal\views\Plugin\views\HandlerBase
+   *   An instance of a handler.
+   */
+  public function getHandler($table, $field, $override = NULL) {
+    // Get the plugin manager for this type.
+    $data = $this->viewsDataCache->get($table);
+
+    if (isset($data[$field][$this->pluginType])) {
+      $definition = $data[$field][$this->pluginType];
+      foreach (array('group', 'title', 'title short', 'help', 'real field', 'real table') as $key) {
+        if (!isset($definition[$key])) {
+          // First check the field level
+          if (!empty($data[$field][$key])) {
+            $definition[$key] = $data[$field][$key];
+          }
+          // Then if that doesn't work, check the table level
+          elseif (!empty($data['table'][$key])) {
+            $definition[$key] = $data['table'][$key];
+          }
+        }
+      }
+
+      // @todo This is crazy. Find a way to remove the override functionality.
+      $plugin_id = $override ?: $definition['id'];
+      // Try to use the overridden handler.
+      try {
+        return $this->createInstance($plugin_id, $definition);
+      }
+      catch (PluginException $e) {
+        // If that fails, use the original handler.
+        try {
+          return $this->createInstance($definition['id'], $definition);
+        }
+        catch (PluginException $e) {
+          // Deliberately empty, this case is handled generically below.
+        }
+      }
+    }
+
+    // Finally, use the 'broken' handler.
+    debug(t("Missing handler: @table @field @type", array('@table' => $table, '@field' => $field, '@type' => $this->pluginType)));
+    return $this->createInstance('broken');
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
index 14fc64a..d3f9126 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
@@ -21,9 +21,20 @@
 class ViewsPluginManager extends PluginManagerBase {
 
   /**
+   * The plugin type that is handled by this plugin manager.
+   *
+   * @var string
+   */
+  protected $pluginType;
+
+  /**
    * Constructs a ViewsPluginManager object.
+   *
+   * @param string $type
+   *   The plugin type, for example filter.
    */
   public function __construct($type) {
+    $this->pluginType = $type;
     $this->discovery = new AnnotatedClassDiscovery('views', $type);
     $this->discovery = new DerivativeDiscoveryDecorator($this->discovery);
     $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
index 0c4d150..18f9c35 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
@@ -839,6 +839,15 @@ public function getHandlers($type) {
     if (!isset($this->handlers[$type])) {
       $this->handlers[$type] = array();
       $types = ViewExecutable::viewsHandlerTypes();
+
+      if (!empty($types[$type]['type'])) {
+        $handler_type = $types[$type]['type'];
+      }
+      else {
+        $handler_type = $type;
+      }
+      $plugin_manager = drupal_container()->get("plugin.manager.views.$handler_type");
+
       $plural = $types[$type]['plural'];
 
       foreach ($this->getOption($plural) as $id => $info) {
@@ -867,14 +876,7 @@ public function getHandlers($type) {
           }
         }
 
-        if (!empty($types[$type]['type'])) {
-          $handler_type = $types[$type]['type'];
-        }
-        else {
-          $handler_type = $type;
-        }
-
-        $handler = views_get_handler($info['table'], $info['field'], $handler_type, $override);
+        $handler = $plugin_manager->getHandler($info['table'], $info['field'], $override);
         if ($handler) {
           // Special override for area types so they know where they come from.
           if ($handler_type == 'area') {
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/exposed_form/InputRequired.php b/core/modules/views/lib/Drupal/views/Plugin/views/exposed_form/InputRequired.php
index 3baebe0..dfa85cd 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/exposed_form/InputRequired.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/exposed_form/InputRequired.php
@@ -83,7 +83,7 @@ function pre_render($values) {
         'content' => $this->options['text_input_required'],
         'format' => $this->options['text_input_required_format'],
       );
-      $handler = views_get_handler('views', 'area', 'area');
+      $handler = drupal_container()->get('plugin.manager.views.area')->getHandler('area', 'area');
       $handler->init($this->view, $options);
       $this->displayHandler->handlers['empty'] = array(
         'area' => $handler,
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/row/RowPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/row/RowPluginBase.php
index 25f546e..678cd89 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/row/RowPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/row/RowPluginBase.php
@@ -69,11 +69,13 @@ public function buildOptionsForm(&$form, &$form_state) {
       $relationships = $executable->display_handler->getOption('relationships');
       $relationship_options = array();
 
+      $container = drupal_container();
+      $relationship_manager = $container->get('plugin.manager.views.relationship');
       foreach ($relationships as $relationship) {
-        $relationship_handler = views_get_handler($relationship['table'], $relationship['field'], 'relationship');
+        $relationship_handler = $relationship_manager->getHandler($relationship['table'], $relationship['field']);
 
         // If this relationship is valid for this type, add it to the list.
-        $data = drupal_container()->get('views.views_data')->get($relationship['table']);
+        $data = $container->get('views.views_data')->get($relationship['table']);
         $base = $data[$relationship['field']]['relationship']['base'];
         if ($base == $this->base_table) {
           $relationship_handler->init($executable, $relationship);
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/sort/GroupByNumeric.php b/core/modules/views/lib/Drupal/views/Plugin/views/sort/GroupByNumeric.php
index 59cefb0..a21c4c6 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/sort/GroupByNumeric.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/sort/GroupByNumeric.php
@@ -27,7 +27,7 @@ public function init(ViewExecutable $view, DisplayPluginBase $display, array &$o
     parent::init($view, $display, $options);
 
     // Initialize the original handler.
-    $this->handler = views_get_handler($options['table'], $options['field'], 'sort');
+    $this->handler = drupal_container()->get('plugin.manager.views.sort')->getHandler($options['table'], $options['field']);
     $this->handler->init($view, $display, $options);
   }
 
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php
index 5b21a67..54cb9c1 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php
@@ -521,15 +521,16 @@ function testIsValueEmpty() {
    */
   public function testClickSortable() {
     // Test that click_sortable is TRUE by default.
-    $plugin = views_get_handler('views_test_data', 'name', 'field');
+    $field_manager = $this->container->get('plugin.manager.views.field');
+    $plugin = $field_manager->getHandler('views_test_data', 'name');
     $this->assertTrue($plugin->click_sortable(), 'TRUE as a default value is correct.');
 
     // Test that click_sortable is TRUE by when set TRUE in the data.
-    $plugin = views_get_handler('views_test_data', 'id', 'field');
+    $plugin = $field_manager->getHandler('views_test_data', 'id');
     $this->assertTrue($plugin->click_sortable(), 'TRUE as a views data value is correct.');
 
     // Test that click_sortable is FALSE by when set FALSE in the data.
-    $plugin = views_get_handler('views_test_data', 'job', 'field');
+    $plugin = $field_manager->getHandler('views_test_data', 'job');
     $this->assertFalse($plugin->click_sortable(), 'FALSE as a views data value is correct.');
   }
 
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerAllTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerAllTest.php
index dca0da1..e983ac9 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerAllTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerAllTest.php
@@ -74,7 +74,7 @@ public function testHandlers() {
             if (isset($field_info[$type]['id'])) {
               $options = array();
               if ($type == 'filter') {
-                $handler = views_get_handler($base_table, $field, $type);
+                $handler = $this->container->get("plugin.manager.views.$type")->getHandler($base_table, $field);
                 if ($handler instanceof InOperator) {
                   $options['value'] = array(1);
                 }
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerTest.php
index 28cc00c..1b19481 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/HandlerTest.php
@@ -101,7 +101,7 @@ function testBreakPhraseString() {
     $null = NULL;
     $this->assertEqual($empty_stdclass, HandlerBase::breakPhraseString('', $null));
 
-    $handler = views_get_handler('node', 'title', 'argument');
+    $handler = $this->container->get('plugin.manager.views.argument')->getHandler('node', 'title');
     $this->assertEqual($handler, HandlerBase::breakPhraseString('', $handler), 'The breakPhraseString() method works correctly.');
 
     // test ors
@@ -156,7 +156,7 @@ function testBreakPhrase() {
     // check defaults
     $this->assertEqual($empty_stdclass, HandlerBase::breakPhrase('', $null));
 
-    $handler = views_get_handler('node', 'title', 'argument');
+    $handler = $this->container->get('plugin.manager.views.argument')->getHandler('node', 'title');
     $this->assertEqual($handler, HandlerBase::breakPhrase('', $handler), 'The breakPhrase() method works correctly.');
 
     // Generate three random numbers which can be used below;
diff --git a/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php b/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php
index 5b9b6cd..0896ade 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php
@@ -84,7 +84,7 @@ public function test_views_trim_text() {
   function testviews_get_handler() {
     $types = array('field', 'area', 'filter');
     foreach ($types as $type) {
-      $handler = views_get_handler($this->randomName(), $this->randomName(), $type);
+      $handler = $this->container->get("plugin.manager.views.$type")->getHandler($this->randomName(), $this->randomName());
       $this->assertEqual('Drupal\views\Plugin\views\\' . $type . '\Broken', get_class($handler), t('Make sure that a broken handler of type: @type are created', array('@type' => $type)));
     }
 
@@ -95,7 +95,7 @@ function testviews_get_handler() {
         $data = $views_data[$table][$field];
         foreach ($data as $id => $field_data) {
           if (!in_array($id, array('title', 'help'))) {
-            $handler = views_get_handler($table, $field, $id);
+            $handler = $this->container->get("plugin.manager.views.$id")->getHandler($table, $field);
             $this->assertInstanceHandler($handler, $table, $field, $id);
           }
         }
@@ -103,7 +103,7 @@ function testviews_get_handler() {
     }
 
     // Test the override handler feature.
-    $handler = views_get_handler('views_test_data', 'job', 'filter', 'standard');
+    $handler = $this->container->get('plugin.manager.views.filter')->getHandler('views_test_data', 'job', 'standard');
     $this->assertEqual('Drupal\\views\\Plugin\\views\\filter\\Standard', get_class($handler));
   }
 
diff --git a/core/modules/views/lib/Drupal/views/ViewsBundle.php b/core/modules/views/lib/Drupal/views/ViewsBundle.php
index dfb6dd6..c62edef 100644
--- a/core/modules/views/lib/Drupal/views/ViewsBundle.php
+++ b/core/modules/views/lib/Drupal/views/ViewsBundle.php
@@ -21,9 +21,29 @@ class ViewsBundle extends Bundle {
    * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
    */
   public function build(ContainerBuilder $container) {
+
+    // Get all possible handler types.
+    $handler_types = array();
+    foreach (ViewExecutable::viewsHandlerTypes() as $type => $info) {
+      if (isset($info['type'])) {
+        $handler_types[$info['type']] = $info['type'];
+      }
+      else {
+        $handler_types[$type] = $type;
+      }
+    }
+
+
     foreach (ViewExecutable::getPluginTypes() as $type) {
-      $container->register("plugin.manager.views.$type", 'Drupal\views\Plugin\ViewsPluginManager')
-        ->addArgument($type);
+      if (in_array($type, $handler_types)) {
+        $container->register("plugin.manager.views.$type", 'Drupal\views\Plugin\ViewsHandlerPluginManager')
+          ->addArgument($type)
+          ->addArgument(new Reference('views.views_data'));
+      }
+      else {
+        $container->register("plugin.manager.views.$type", 'Drupal\views\Plugin\ViewsPluginManager')
+          ->addArgument($type);
+      }
     }
 
     $container
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index dc565b8..f1fea5d 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -11,7 +11,6 @@
 
 use Drupal\Core\Database\Query\AlterableInterface;
 use Drupal\views\ViewExecutable;
-use Drupal\Component\Plugin\Exception\PluginException;
 use Drupal\views\Plugin\Core\Entity\View;
 
 /**
@@ -886,65 +885,6 @@ function views_library_info() {
 }
 
 /**
- * Fetch a handler from the data cache.
- *
- * @param $table
- *   The name of the table this handler is from.
- * @param $field
- *   The name of the field this handler is from.
- * @param $type
- *   The type of handler. i.e, sort, field, argument, filter, relationship
- * @param $override
- *   Override the actual handler object with this class. Used for
- *   aggregation when the handler is redirected to the aggregation
- *   handler.
- *
- * @return views_handler
- *   An instance of a handler object. May be views_handler_broken.
- */
-function views_get_handler($table, $field, $type, $override = NULL) {
-  // Get the plugin manager for this type.
-  $manager = drupal_container()->get("plugin.manager.views.$type");
-  $data = drupal_container()->get('views.views_data')->get($table);
-
-  if (isset($data[$field][$type])) {
-    $definition = $data[$field][$type];
-    foreach (array('group', 'title', 'title short', 'help', 'real field', 'real table') as $key) {
-      if (!isset($definition[$key])) {
-        // First check the field level
-        if (!empty($data[$field][$key])) {
-          $definition[$key] = $data[$field][$key];
-        }
-        // Then if that doesn't work, check the table level
-        elseif (!empty($data['table'][$key])) {
-          $definition[$key] = $data['table'][$key];
-        }
-      }
-    }
-
-    // @todo This is crazy. Find a way to remove the override functionality.
-    $plugin_id = $override ?: $definition['id'];
-    // Try to use the overridden handler.
-    try {
-      return $manager->createInstance($plugin_id, $definition);
-    }
-    catch (PluginException $e) {
-      // If that fails, use the original handler.
-      try {
-        return $manager->createInstance($definition['id'], $definition);
-      }
-      catch (PluginException $e) {
-        // Deliberately empty, this case is handled generically below.
-      }
-    }
-  }
-
-  // Finally, use the 'broken' handler.
-  debug(t("Missing handler: @table @field @type", array('@table' => $table, '@field' => $field, '@type' => $type)));
-  return $manager->createInstance('broken');
-}
-
-/**
  * Fetch a list of all base tables available
  *
  * @return array
diff --git a/core/modules/views/views_ui/admin.inc b/core/modules/views/views_ui/admin.inc
index 9e9f1ba..e7d7746 100644
--- a/core/modules/views/views_ui/admin.inc
+++ b/core/modules/views/views_ui/admin.inc
@@ -1436,7 +1436,7 @@ function views_ui_config_item_form($form, &$form_state) {
         if ($type == 'relationship' && $id == $relationship['id']) {
           break;
         }
-        $relationship_handler = views_get_handler($relationship['table'], $relationship['field'], 'relationship');
+        $relationship_handler = drupal_container()->get('plugin.manager.views.relationship')->getHandler($relationship['table'], $relationship['field']);
         // ignore invalid/broken relationships.
         if (empty($relationship_handler)) {
           continue;
@@ -1558,7 +1558,7 @@ function views_ui_config_item_form_submit_temporary($form, &$form_state) {
 
   // Create a new handler and unpack the options from the form onto it. We
   // can use that for storage.
-  $handler = views_get_handler($item['table'], $item['field'], $handler_type, $override);
+  $handler = drupal_container()->get("plugin.manager.views.$handler_type")->getHandler($item['table'], $item['field'], $override);
   $handler->init($executable, $executable->display_handler, $item);
 
   // Add the incoming options to existing options because items using
@@ -1614,7 +1614,7 @@ function views_ui_config_item_form_submit($form, &$form_state) {
 
   // Create a new handler and unpack the options from the form onto it. We
   // can use that for storage.
-  $handler = views_get_handler($item['table'], $item['field'], $handler_type, $override);
+  $handler = drupal_container()->get("plugin.manager.views.$handler_type")->getHandler($item['table'], $item['field'], $override);
   $handler->init($executable, $executable->display_handler, $item);
 
   // Add the incoming options to existing options because items using
@@ -1690,7 +1690,7 @@ function views_ui_config_item_group_form_submit($form, &$form_state) {
   $type = $form_state['type'];
   $id = $form_state['id'];
 
-  $handler = views_get_handler($item['table'], $item['field'], $type);
+  $handler = drupal_container()->get("plugin.manager.$type")->getHandler($item['table'], $item['field']);
   $executable = $form_state['view']->get('executable');
   $handler->init($executable, $executable->display_handler, $item);
 
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php
index d161c97..dffb886 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -541,6 +541,7 @@ public function submitItemAdd($form, &$form_state) {
       $display->setOverride($section);
     }
 
+    $container = drupal_container();
     if (!empty($form_state['values']['name']) && is_array($form_state['values']['name'])) {
       // Loop through each of the items that were checked and add them to the view.
       foreach (array_keys(array_filter($form_state['values']['name'])) as $field) {
@@ -557,7 +558,8 @@ public function submitItemAdd($form, &$form_state) {
         if (isset($types[$type]['type'])) {
           $key = $types[$type]['type'];
         }
-        $handler = views_get_handler($table, $field, $key);
+
+        $handler = $container->get("plugin.manager.views.$key")->getHandler($table, $field);
         if ($this->executable->displayHandlers->get('default')->useGroupBy() && $handler->usesGroupBy()) {
           $this->addFormToStack('config-item-group', $form_state['display_id'], array($type, $id));
         }
