diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/BrokenHandlerTrait.php
similarity index 66%
copy from core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php
copy to core/modules/views/lib/Drupal/views/Plugin/views/BrokenHandlerTrait.php
index dff668b..e1623f7 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/area/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/BrokenHandlerTrait.php
@@ -2,22 +2,20 @@
 
 /**
  * @file
- * Definition of Drupal\views\Plugin\views\area\Broken
+ * Contains \Drupal\views\Plugin\views\BrokenHandlerTrait.
  */
 
-namespace Drupal\views\Plugin\views\area;
+namespace Drupal\views\Plugin\views;
 
 /**
- * A special handler to take the place of missing or broken handlers.
- *
- * @ingroup views_area_handlers
- *
- * @PluginID("broken")
+ * A Trait for Views broken handlers.
  */
-class Broken extends AreaPluginBase {
+trait BrokenHandlerTrait {
 
   /**
-   * {@inheritdoc}
+   * Returns this handlers name in the UI.
+   *
+   * @see \Drupal\views\Plugin\views\PluginBase::defineOptions().
    */
   public function adminLabel($short = FALSE) {
     $args = array(
@@ -27,29 +25,35 @@ public function adminLabel($short = FALSE) {
   }
 
   /**
-   * {@inheritdoc}
+   * The option definition for this handler.
+   *
+   * @see \Drupal\views\Plugin\views\PluginBase::defineOptions().
    */
   public function defineOptions() {
     return array();
   }
 
   /**
-   * {@inheritdoc}
+   * Ensure the main table for this handler is in the query. This is used
+   * a lot.
+   *
+   * @see \Drupal\views\Plugin\views\HandlerBase::ensureMyTable().
    */
   public function ensureMyTable() {
     // No table to ensure.
   }
 
   /**
-   * {@inheritdoc}
+   * Modify the views query.
    */
-  public function render($empty = FALSE) {
-    // Simply render nothing by returning an empty render array.
-    return array();
+  public function query($group_by = FALSE) {
+    /* No query to run */
   }
 
   /**
-   * {@inheritdoc}
+   * Provides a form to edit options for this plugin.
+   *
+   * @see \Drupal\views\Plugin\views\PluginBase::defineOptions().
    */
   public function buildOptionsForm(&$form, &$form_state) {
     if ($this->isOptional()) {
@@ -86,7 +90,11 @@ public function buildOptionsForm(&$form, &$form_state) {
   }
 
   /**
-   * {@inheritdoc}
+   * Determines if the handler is considered 'broken'.
+   *
+   * This means it's a placeholder used when a handler can't be found.
+   *
+   * @see \Drupal\views\Plugin\views\HandlerBase::broken().
    */
   public function broken() {
     return TRUE;
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 dff668b..6a0967c 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,6 +7,8 @@
 
 namespace Drupal\views\Plugin\views\area;
 
+use Drupal\views\Plugin\views\BrokenHandlerTrait;
+
 /**
  * A special handler to take the place of missing or broken handlers.
  *
@@ -15,30 +17,7 @@
  * @PluginID("broken")
  */
 class Broken extends AreaPluginBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function adminLabel($short = FALSE) {
-    $args = array(
-      '@module' => $this->definition['original_configuration']['provider'],
-    );
-    return $this->isOptional() ? t('Optional handler is missing (Module: @module) …', $args) : t('Broken/missing handler (Module: @module) …', $args);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defineOptions() {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function ensureMyTable() {
-    // No table to ensure.
-  }
+  use BrokenHandlerTrait;
 
   /**
    * {@inheritdoc}
@@ -48,48 +27,4 @@ public function render($empty = FALSE) {
     return array();
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, &$form_state) {
-    if ($this->isOptional()) {
-      $description_top = t('The handler for this item is optional. The following details are available:');
-    }
-    else {
-      $description_top = t('The handler for this item is broken or missing. The following details are available:');
-    }
-
-    $items = array(
-      t('Module: @module', array('@module' => $this->definition['original_configuration']['provider'])),
-      t('Table: @table', array('@table' => $this->definition['original_configuration']['table'])),
-      t('Field: @field', array('@field' => $this->definition['original_configuration']['field'])),
-    );
-
-    $description_bottom = t('Enabling the appropriate module will may solve this issue. Otherwise, check to see if there is a module update available.');
-
-    $form['description'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'class' => array('form-item', 'description'),
-      ),
-      'description_top' => array(
-        '#markup' => '<p>' . $description_top . '</p>',
-      ),
-      'detail_list' => array(
-        '#theme' => 'item_list',
-        '#items' => $items,
-      ),
-      'description_bottom' => array(
-        '#markup' => '<p>' . $description_bottom . '</p>',
-      ),
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function broken() {
-    return TRUE;
-  }
-
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/argument/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/argument/Broken.php
index 9e82624..f9f90ac 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/argument/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/argument/Broken.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\views\Plugin\views\argument;
 
+use Drupal\views\Plugin\views\BrokenHandlerTrait;
+
 /**
  * A special handler to take the place of missing or broken handlers.
  *
@@ -15,58 +17,6 @@
  * @PluginID("broken")
  */
 class Broken extends ArgumentPluginBase {
-
-  public function adminLabel($short = FALSE) {
-    $args = array(
-      '@module' => $this->definition['original_configuration']['provider'],
-    );
-    return $this->isOptional() ? t('Optional handler is missing (Module: @module) …', $args) : t('Broken/missing handler (Module: @module) …', $args);
-  }
-
-  public function defineOptions() { return array(); }
-  public function ensureMyTable() { /* No table to ensure! */ }
-  public function query($group_by = FALSE) { /* No query to run */ }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, &$form_state) {
-    if ($this->isOptional()) {
-      $description_top = t('The handler for this item is optional. The following details are available:');
-    }
-    else {
-      $description_top = t('The handler for this item is broken or missing. The following details are available:');
-    }
-
-    $items = array(
-      t('Module: @module', array('@module' => $this->definition['original_configuration']['provider'])),
-      t('Table: @table', array('@table' => $this->definition['original_configuration']['table'])),
-      t('Field: @field', array('@field' => $this->definition['original_configuration']['field'])),
-    );
-
-    $description_bottom = t('Enabling the appropriate module will may solve this issue. Otherwise, check to see if there is a module update available.');
-
-    $form['description'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'class' => array('form-item', 'description'),
-      ),
-      'description_top' => array(
-        '#markup' => '<p>' . $description_top . '</p>',
-      ),
-      'detail_list' => array(
-        '#theme' => 'item_list',
-        '#items' => $items,
-      ),
-      'description_bottom' => array(
-        '#markup' => '<p>' . $description_bottom . '</p>',
-      ),
-    );
-  }
-
-  /**
-   * Determine if the handler is considered 'broken'
-   */
-  public function broken() { return TRUE; }
+  use BrokenHandlerTrait;
 
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/field/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/field/Broken.php
index 062927f..c76431e 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/field/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/field/Broken.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\views\Plugin\views\field;
 
+use Drupal\views\Plugin\views\BrokenHandlerTrait;
+
 /**
  * A special handler to take the place of missing or broken handlers.
  *
@@ -15,58 +17,6 @@
  * @PluginID("broken")
  */
 class Broken extends FieldPluginBase {
-
-  public function adminLabel($short = FALSE) {
-    $args = array(
-      '@module' => $this->definition['original_configuration']['provider'],
-    );
-    return $this->isOptional() ? t('Optional handler is missing (Module: @module) …', $args) : t('Broken/missing handler (Module: @module) …', $args);
-  }
-
-  public function defineOptions() { return array(); }
-  public function ensureMyTable() { /* No table to ensure! */ }
-  public function query($group_by = FALSE) { /* No query to run */ }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, &$form_state) {
-    if ($this->isOptional()) {
-      $description_top = t('The handler for this item is optional. The following details are available:');
-    }
-    else {
-      $description_top = t('The handler for this item is broken or missing. The following details are available:');
-    }
-
-    $items = array(
-      t('Module: @module', array('@module' => $this->definition['original_configuration']['provider'])),
-      t('Table: @table', array('@table' => $this->definition['original_configuration']['table'])),
-      t('Field: @field', array('@field' => $this->definition['original_configuration']['field'])),
-    );
-
-    $description_bottom = t('Enabling the appropriate module will may solve this issue. Otherwise, check to see if there is a module update available.');
-
-    $form['description'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'class' => array('form-item', 'description'),
-      ),
-      'description_top' => array(
-        '#markup' => '<p>' . $description_top . '</p>',
-      ),
-      'detail_list' => array(
-        '#theme' => 'item_list',
-        '#items' => $items,
-      ),
-      'description_bottom' => array(
-        '#markup' => '<p>' . $description_bottom . '</p>',
-      ),
-    );
-  }
-
-  /**
-   * Determine if the handler is considered 'broken'
-   */
-  public function broken() { return TRUE; }
+  use BrokenHandlerTrait;
 
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/filter/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/filter/Broken.php
index e4b1333..2a4abcf 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/filter/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/filter/Broken.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\views\filter;
 
+use Drupal\views\Plugin\views\BrokenHandlerTrait;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\ViewExecutable;
 
@@ -18,64 +19,12 @@
  * @PluginID("broken")
  */
 class Broken extends FilterPluginBase {
-
-  /**
-   * Overrides \Drupal\views\Plugin\views\filter\FilterPluginBase::init().
-   */
-  public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
-  }
-
-  public function adminLabel($short = FALSE) {
-    $args = array(
-      '@module' => $this->definition['original_configuration']['provider'],
-    );
-    return $this->isOptional() ? t('Optional handler is missing (Module: @module) …', $args) : t('Broken/missing handler (Module: @module) …', $args);
-  }
-
-  public function defineOptions() { return array(); }
-  public function ensureMyTable() { /* No table to ensure! */ }
-  public function query($group_by = FALSE) { /* No query to run */ }
+  use BrokenHandlerTrait;
 
   /**
    * {@inheritdoc}
    */
-  public function buildOptionsForm(&$form, &$form_state) {
-    if ($this->isOptional()) {
-      $description_top = t('The handler for this item is optional. The following details are available:');
-    }
-    else {
-      $description_top = t('The handler for this item is broken or missing. The following details are available:');
-    }
-
-    $items = array(
-      t('Module: @module', array('@module' => $this->definition['original_configuration']['provider'])),
-      t('Table: @table', array('@table' => $this->definition['original_configuration']['table'])),
-      t('Field: @field', array('@field' => $this->definition['original_configuration']['field'])),
-    );
-
-    $description_bottom = t('Enabling the appropriate module will may solve this issue. Otherwise, check to see if there is a module update available.');
-
-    $form['description'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'class' => array('form-item', 'description'),
-      ),
-      'description_top' => array(
-        '#markup' => '<p>' . $description_top . '</p>',
-      ),
-      'detail_list' => array(
-        '#theme' => 'item_list',
-        '#items' => $items,
-      ),
-      'description_bottom' => array(
-        '#markup' => '<p>' . $description_bottom . '</p>',
-      ),
-    );
+  public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
   }
 
-  /**
-   * Determine if the handler is considered 'broken'
-   */
-  public function broken() { return TRUE; }
-
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/relationship/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/relationship/Broken.php
index 19d49c7..16ee48c 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/relationship/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/relationship/Broken.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\views\Plugin\views\relationship;
 
+use Drupal\views\Plugin\views\BrokenHandlerTrait;
+
 /**
  * A special handler to take the place of missing or broken handlers.
  *
@@ -15,80 +17,6 @@
  * @PluginID("broken")
  */
 class Broken extends RelationshipPluginBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function adminLabel($short = FALSE) {
-    $args = array(
-      '@module' => $this->definition['original_configuration']['provider'],
-    );
-    return $this->isOptional() ? t('Optional handler is missing (Module: @module) …', $args) : t('Broken/missing handler (Module: @module) …', $args);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function defineOptions() {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function ensureMyTable() {
-    // No table to ensure.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function query() {
-    // No query to run.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, &$form_state) {
-    if ($this->isOptional()) {
-      $description_top = t('The handler for this item is optional. The following details are available:');
-    }
-    else {
-      $description_top = t('The handler for this item is broken or missing. The following details are available:');
-    }
-
-    $items = array(
-      t('Module: @module', array('@module' => $this->definition['original_configuration']['provider'])),
-      t('Table: @table', array('@table' => $this->definition['original_configuration']['table'])),
-      t('Field: @field', array('@field' => $this->definition['original_configuration']['field'])),
-    );
-
-    $description_bottom = t('Enabling the appropriate module will may solve this issue. Otherwise, check to see if there is a module update available.');
-
-    $form['description'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'class' => array('form-item', 'description'),
-      ),
-      'description_top' => array(
-        '#markup' => '<p>' . $description_top . '</p>',
-      ),
-      'detail_list' => array(
-        '#theme' => 'item_list',
-        '#items' => $items,
-      ),
-      'description_bottom' => array(
-        '#markup' => '<p>' . $description_bottom . '</p>',
-      ),
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function broken() {
-    return TRUE;
-  }
+  use BrokenHandlerTrait;
 
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/sort/Broken.php b/core/modules/views/lib/Drupal/views/Plugin/views/sort/Broken.php
index 234ee57..a702625 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/sort/Broken.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/sort/Broken.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\views\Plugin\views\sort;
 
+use Drupal\views\Plugin\views\BrokenHandlerTrait;
+
 /**
  * A special handler to take the place of missing or broken handlers.
  *
@@ -15,58 +17,6 @@
  * @PluginID("broken")
  */
 class Broken extends SortPluginBase {
-
-  public function adminLabel($short = FALSE) {
-    $args = array(
-      '@module' => $this->definition['original_configuration']['provider'],
-    );
-    return $this->isOptional() ? t('Optional handler is missing (Module: @module) …', $args) : t('Broken/missing handler (Module: @module) …', $args);
-  }
-
-  public function defineOptions() { return array(); }
-  public function ensureMyTable() { /* No table to ensure! */ }
-  public function query($group_by = FALSE) { /* No query to run */ }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, &$form_state) {
-    if ($this->isOptional()) {
-      $description_top = t('The handler for this item is optional. The following details are available:');
-    }
-    else {
-      $description_top = t('The handler for this item is broken or missing. The following details are available:');
-    }
-
-    $items = array(
-      t('Module: @module', array('@module' => $this->definition['original_configuration']['provider'])),
-      t('Table: @table', array('@table' => $this->definition['original_configuration']['table'])),
-      t('Field: @field', array('@field' => $this->definition['original_configuration']['field'])),
-    );
-
-    $description_bottom = t('Enabling the appropriate module will may solve this issue. Otherwise, check to see if there is a module update available.');
-
-    $form['description'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'class' => array('form-item', 'description'),
-      ),
-      'description_top' => array(
-        '#markup' => '<p>' . $description_top . '</p>',
-      ),
-      'detail_list' => array(
-        '#theme' => 'item_list',
-        '#items' => $items,
-      ),
-      'description_bottom' => array(
-        '#markup' => '<p>' . $description_bottom . '</p>',
-      ),
-    );
-  }
-
-  /**
-   * Determine if the handler is considered 'broken'
-   */
-  public function broken() { return TRUE; }
+  use BrokenHandlerTrait;
 
 }
