diff --git a/core/lib/Drupal/Core/Plugin/Factory/MethodFactory.php b/core/lib/Drupal/Core/Plugin/Factory/MethodFactory.php
new file mode 100644
index 0000000..70315ea
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Factory/MethodFactory.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Factory\MethodFactory.
+ */
+
+namespace Drupal\Core\Plugin\Factory;
+
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+
+/**
+ * Plugin factory to use a factory method.
+ */
+class MethodFactory extends DefaultFactory {
+
+  /**
+   * Overrides \Drupal\Component\Plugin\Factory\DefaultFactory::createInstance().
+   */
+  public function createInstance($plugin_id, array $configuration) {
+    $plugin_class = static::getPluginClass($plugin_id, $this->discovery);
+    return $plugin_class::create(drupal_container(), $configuration, $plugin_id, $this->discovery);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/MethodFactoryPluginBase.php b/core/lib/Drupal/Core/Plugin/MethodFactoryPluginBase.php
new file mode 100644
index 0000000..674c374
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/MethodFactoryPluginBase.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\MethodFactoryPluginBase.
+ *
+ * @todo That's a horrible name.
+ */
+namespace Drupal\Core\Plugin;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Component\Plugin\PluginBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Defines a base plugin that can pull it's dependencies from the container.
+ */
+
+class MethodFactoryPluginBase extends PluginBase {
+
+  /**
+   * Creates an instance of the plugin.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   The container to pull out services used in the plugin.
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface $discovery
+   *   The Discovery class that holds access to the plugin implementation
+   *   definition.
+   *
+   * @return static
+   *   Returns an instance of this plugin.
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, DiscoveryInterface $discovery) {
+    return new static($configuration, $plugin_id, $discovery);
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
index 56633f8..b47fb88 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
+use Drupal\Core\Plugin\Factory\MethodFactory;
 
 /**
  * Plugin type manager for all views plugins.
@@ -35,7 +36,7 @@ public function __construct($type, array $namespaces = array()) {
     $this->discovery = new AlterDecorator($this->discovery, 'views_plugins_' . $type);
     $this->discovery = new CacheDecorator($this->discovery, 'views:' . $type, 'views_info');
 
-    $this->factory = new DefaultFactory($this->discovery);
+    $this->factory = new MethodFactory($this);
 
     $this->defaults += array(
       'parent' => 'parent',
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php
index 8bf057b..0e87da4 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php
@@ -8,11 +8,11 @@
 namespace Drupal\views\Plugin\views;
 
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Core\Plugin\MethodFactoryPluginBase;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
-use Drupal\Component\Plugin\PluginBase as ComponentPluginBase;
 use Drupal\views\ViewExecutable;
 
-abstract class PluginBase extends ComponentPluginBase {
+abstract class PluginBase extends MethodFactoryPluginBase {
 
   /**
    * Options for this plugin will be held here.
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/join/JoinPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/join/JoinPluginBase.php
index 34e185c..2f672b3 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/join/JoinPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/join/JoinPluginBase.php
@@ -6,8 +6,9 @@
  */
 
 namespace Drupal\views\Plugin\views\join;
-use Drupal\Component\Plugin\PluginBase;
+
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Core\Plugin\MethodFactoryPluginBase;
 
 /**
  * @defgroup views_join_handlers Views join handlers
@@ -50,7 +51,7 @@
  *
  * Extensions of this class can be used to create more interesting joins.
  */
-class JoinPluginBase extends PluginBase {
+class JoinPluginBase extends MethodFactoryPluginBase {
 
   /**
    * The table to join (right table).
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php b/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php
index 5a3e907..92b20fd 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php
@@ -7,9 +7,13 @@
 
 namespace Drupal\views\Plugin\views\style;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\views\Plugin\views\wizard\WizardInterface;
 use Drupal\Core\Annotation\Plugin;
 use Drupal\Core\Annotation\Translation;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Style plugin to render each item as a row in a table.
@@ -59,6 +63,30 @@ class Table extends StylePluginBase {
    */
   public $order;
 
+  /**
+   * Contains the current request object.
+   *
+   * @var \Symfony\Component\HttpFoundation\Request
+   */
+  protected $request;
+
+  /**
+   * Overrides \Drupal\Core\Plugin\MethodFactoryPluginBase::create().
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, DiscoveryInterface $discovery) {
+    return new static($configuration, $plugin_id, $discovery, $container->get('request'));
+  }
+
+  /**
+   * Constructs a Table object.
+   */
+  public function __construct(array $configuration, $plugin_id, DiscoveryInterface $discovery, Request $request) {
+    parent::__construct($configuration, $plugin_id, $discovery);
+
+    $this->request = $request;
+  }
+
+
   protected function defineOptions() {
     $options = parent::defineOptions();
 
@@ -80,7 +108,7 @@ protected function defineOptions() {
    * @return bool
    */
   function build_sort() {
-    $order = drupal_container()->get('request')->query->get('order');
+    $order = $this->request->query->get('order');
     if (!isset($order) && ($this->options['default'] == -1 || empty($this->view->field[$this->options['default']]))) {
       return TRUE;
     }
@@ -98,7 +126,7 @@ function build_sort() {
    * Add our actual sort criteria
    */
   function build_sort_post() {
-    $query = drupal_container()->get('request')->query;
+    $query = $this->request->query;
     $order = $query->get('order');
     if (!isset($order)) {
       // check for a 'default' clicksort. If there isn't one, exit gracefully.
