diff --git a/core/includes/form.inc b/core/includes/form.inc
index 95470f9..44f0ad6 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Form\FormInterface;
 use Drupal\Core\Database\Database;
 use Drupal\Core\Template\Attribute;
 use Drupal\Core\Utility\Color;
@@ -106,8 +107,9 @@
  * is not needed (i.e., when initially rendering the form) and is often
  * used as a menu callback.
  *
- * @param $form_id
- *   The unique string identifying the desired form. If a function with that
+ * @param \Drupal\Core\Form\FormInterface|string $form_arg
+ *   A form object to use to build the form, or the unique string identifying
+ *   the desired form. If $form_arg is a string and a function with that
  *   name exists, it is called to build the form array. Modules that need to
  *   generate the same form (or very similar forms) using different $form_ids
  *   can implement hook_forms(), which maps different $form_id values to the
@@ -126,36 +128,23 @@
  *
  * @see drupal_build_form()
  */
-function drupal_get_form($form_id) {
+function drupal_get_form($form_arg) {
   $form_state = array();
 
   $args = func_get_args();
-  // Remove $form_id from the arguments.
+  // Remove $form_arg from the arguments.
   array_shift($args);
   $form_state['build_info']['args'] = $args;
 
-  return drupal_build_form($form_id, $form_state);
-}
+  // Determine the form ID.
+  if (is_object($form_arg) && $form_arg instanceof FormInterface) {
+    $form_state['build_info']['callback_object'] = $form_arg;
+    $form_id = $form_arg->getFormID();
+  }
+  else {
+    $form_id = $form_arg;
+  }
 
-/**
- * Returns a renderable form array using a specific callback.
- *
- * When using drupal_get_form(), the $form_id or information from hook_forms()
- * is used to determine the callback used to build the form. If the callback
- * needs to be explicitly specified, or if it is a method, use this function.
- *
- * @param string $form_id
- *   The unique string identifying the desired form.
- * @param callable $callback
- *   A callback to be used for building the form.
- * @param array $args
- *   (optional) An array of arguments to pass to the form callback. Defaults to
- *   an empty array.
- */
-function drupal_get_callback_form($form_id, $callback, array $args = array()) {
-  $form_state = array();
-  $form_state['build_info']['args'] = $args;
-  $form_state['build_info']['callback'] = $callback;
   return drupal_build_form($form_id, $form_state);
 }
 
@@ -773,7 +762,13 @@ function drupal_retrieve_form($form_id, &$form_state) {
 
   // If an explicit form builder callback is defined we just use it, otherwise
   // we look for a function named after the $form_id.
-  $callback = !empty($form_state['build_info']['callback']) ? $form_state['build_info']['callback'] : $form_id;
+  $callback = $form_id;
+  if (!empty($form_state['build_info']['callback'])) {
+    $callback = $form_state['build_info']['callback'];
+  }
+  elseif (!empty($form_state['build_info']['callback_object'])) {
+    $callback = array($form_state['build_info']['callback_object'], 'build');
+  }
 
   // We first check to see if there is a valid form builder callback defined.
   // If there is, we simply pass the arguments on to it to get the form.
@@ -1081,8 +1076,11 @@ function drupal_prepare_form($form_id, &$form, &$form_state) {
   if (!isset($form['#validate'])) {
     // Ensure that modules can rely on #validate being set.
     $form['#validate'] = array();
+    if (isset($form_state['build_info']['callback_object'])) {
+      $form['#validate'][] = array($form_state['build_info']['callback_object'], 'validate');
+    }
     // Check for a handler specific to $form_id.
-    if (function_exists($form_id . '_validate')) {
+    elseif (function_exists($form_id . '_validate')) {
       $form['#validate'][] = $form_id . '_validate';
     }
     // Otherwise check whether this is a shared form and whether there is a
@@ -1095,8 +1093,11 @@ function drupal_prepare_form($form_id, &$form, &$form_state) {
   if (!isset($form['#submit'])) {
     // Ensure that modules can rely on #submit being set.
     $form['#submit'] = array();
+    if (isset($form_state['build_info']['callback_object'])) {
+      $form['#submit'][] = array($form_state['build_info']['callback_object'], 'submit');
+    }
     // Check for a handler specific to $form_id.
-    if (function_exists($form_id . '_submit')) {
+    elseif (function_exists($form_id . '_submit')) {
       $form['#submit'][] = $form_id . '_submit';
     }
     // Otherwise check whether this is a shared form and whether there is a
diff --git a/core/lib/Drupal/Core/Form/FormInterface.php b/core/lib/Drupal/Core/Form/FormInterface.php
new file mode 100644
index 0000000..5789dd7
--- /dev/null
+++ b/core/lib/Drupal/Core/Form/FormInterface.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Form\FormInterface.
+ */
+
+namespace Drupal\Core\Form;
+
+/**
+ * Provides an interface for a Form.
+ */
+interface FormInterface {
+
+  /**
+   * Returns a unique string identifying the form.
+   *
+   * @return string
+   *   The unique string identifying the form.
+   */
+  public function getFormID();
+
+  /**
+   * Form constructor.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   An associative array containing the current state of the form.
+   *
+   * @return array
+   *   The form structure.
+   */
+  public function build(array $form, array &$form_state);
+
+  /**
+   * Form validation handler.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   An associative array containing the current state of the form.
+   */
+  public function validate(array $form, array &$form_state);
+
+  /**
+   * Form submission handler.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   An associative array containing the current state of the form.
+   */
+  public function submit(array $form, array &$form_state);
+
+}
diff --git a/core/modules/block/lib/Drupal/block/BlockListController.php b/core/modules/block/lib/Drupal/block/BlockListController.php
index fc82771..fb7b868 100644
--- a/core/modules/block/lib/Drupal/block/BlockListController.php
+++ b/core/modules/block/lib/Drupal/block/BlockListController.php
@@ -9,11 +9,12 @@
 
 use Drupal\Core\Config\Entity\ConfigEntityListController;
 use Drupal\block\Plugin\Core\Entity\Block;
+use Drupal\Core\Form\FormInterface;
 
 /**
  * Defines the block list controller.
  */
-class BlockListController extends ConfigEntityListController {
+class BlockListController extends ConfigEntityListController implements FormInterface {
 
   /**
    * The regions containing the blocks.
@@ -55,7 +56,7 @@ public function render($theme = NULL) {
     // If no theme was specified, use the current theme.
     $this->theme = $theme ?: $GLOBALS['theme_key'];
 
-    return drupal_get_callback_form('block_admin_display_form', array($this, 'form'));
+    return drupal_get_form($this);
   }
 
   /**
@@ -92,9 +93,18 @@ protected function sort(Block $a, Block $b) {
   }
 
   /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'block_admin_display_form';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   *
    * Form constructor for the main block administration form.
    */
-  public function form($form, &$form_state) {
+  public function build(array $form, array &$form_state) {
     $entities = $this->load();
     $form['#attached']['css'][] = drupal_get_path('module', 'block') . '/block.admin.css';
     $form['#attached']['library'][] = array('system', 'drupal.tableheader');
@@ -175,15 +185,23 @@ public function form($form, &$form_state) {
       '#type' => 'submit',
       '#value' => t('Save blocks'),
       '#button_type' => 'primary',
-      '#submit' => array(array($this, 'submit')),
     );
     return $form;
   }
 
   /**
+   * Implements \Drupal\Core\Form\FormInterface::validate().
+   */
+  public function validate(array $form, array &$form_state) {
+    // No validation.
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submit().
+   *
    * Form submission handler for the main block administration form.
    */
-  public function submit($form, &$form_state) {
+  public function submit(array $form, array &$form_state) {
     $entities = entity_load_multiple('block', array_keys($form_state['values']['blocks']));
     foreach ($entities as $entity_id => $entity) {
       $entity->set('weight', $form_state['values']['blocks'][$entity_id]['weight']);
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index 4056e4a..566959b 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -313,9 +313,7 @@ function field_ui_field_overview($entity_type, $bundle) {
   $bundle = field_extract_bundle($entity_type, $bundle);
   field_ui_inactive_message($entity_type, $bundle);
 
-  $field_overview = new FieldOverview($entity_type, $bundle);
-
-  return drupal_get_callback_form('field_ui_field_overview_form', array($field_overview, 'form'), array($entity_type, $bundle));
+  return drupal_get_form(new FieldOverview($entity_type, $bundle));
 }
 
 /**
@@ -360,9 +358,7 @@ function field_ui_display_overview($entity_type, $bundle, $view_mode) {
   $bundle = field_extract_bundle($entity_type, $bundle);
   field_ui_inactive_message($entity_type, $bundle);
 
-  $display_overview = new DisplayOverview($entity_type, $bundle, $view_mode);
-
-  return drupal_get_callback_form('field_ui_display_overview_form', array($display_overview, 'form'), array($entity_type, $bundle, $view_mode));
+  return drupal_get_form(new DisplayOverview($entity_type, $bundle, $view_mode));
 }
 
 /**
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
index 4314fb4..f3666bc 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -32,19 +32,16 @@ public function getRegions() {
   }
 
   /**
-   * Overrides Drupal\field_ui\OverviewBase::form().
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
-   *
-   * @return array
-   *   The array containing the complete form.
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
    */
-  public function form(array $form, array &$form_state) {
-    $form = parent::form($form, $form_state);
+  public function getFormID() {
+    return 'field_ui_display_overview_form';
+  }
 
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state) {
     // Gather type information.
     $instances = field_info_instances($this->entity_type, $this->bundle);
     $field_types = field_info_field_types();
@@ -410,12 +407,7 @@ public function form(array $form, array &$form_state) {
   }
 
   /**
-   * Overrides Drupal\field_ui\OverviewBase::submit().
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
+   * Overrides \Drupal\field_ui\OverviewBase::submit().
    */
   public function submit(array $form, array &$form_state) {
     $form_values = $form_state['values'];
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
index a977df9..426010e 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
@@ -43,19 +43,16 @@ public function getRegions() {
   }
 
   /**
-   * Overrides Drupal\field_ui\OverviewBase::form().
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
-   *
-   * @return array
-   *   The array containing the complete form.
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
    */
-  public function form(array $form, array &$form_state) {
-    $form = parent::form($form, $form_state);
+  public function getFormID() {
+    return 'field_ui_field_overview_form';
+  }
 
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state) {
     // When displaying the form, make sure the list of fields is up-to-date.
     if (empty($form_state['post'])) {
       field_info_cache_clear();
@@ -423,12 +420,7 @@ public function form(array $form, array &$form_state) {
   }
 
   /**
-   * Overrides Drupal\field_ui\OverviewBase::validate().
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
+   * Overrides \Drupal\field_ui\OverviewBase::validate().
    */
   public function validate(array $form, array &$form_state) {
     $this->validateAddNew($form, $form_state);
@@ -532,12 +524,7 @@ protected function validateAddExisting(array $form, array &$form_state) {
   }
 
   /**
-   * Overrides Drupal\field_ui\OverviewBase::submit().
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
+   * Overrides \Drupal\field_ui\OverviewBase::submit().
    */
   public function submit(array $form, array &$form_state) {
     $form_values = $form_state['values']['fields'];
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
index 0313efd..d44d2cf 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\field_ui;
 
+use Drupal\Core\Form\FormInterface;
+
 /**
  * Abstract base class for Field UI overview forms.
  */
-abstract class OverviewBase {
+abstract class OverviewBase implements FormInterface {
 
   /**
    * The name of the entity type.
@@ -59,41 +61,13 @@ public function __construct($entity_type, $bundle, $view_mode = NULL) {
   }
 
   /**
-   * Creates a field UI overview form.
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
-   *
-   * @return array
-   *   The array containing the complete form.
-   */
-  public function form(array $form, array &$form_state) {
-    // Add the validate and submit behavior.
-    $form['#validate'] = array(array($this, 'validate'));
-    $form['#submit'] = array(array($this, 'submit'));
-    return $form;
-  }
-
-  /**
-   * Validate handler for the field UI overview form.
-   *
-   * @param array $form
-   *   The root element or form.
-   * @param array $form_state
-   *   The state of the form.
+   * Implements \Drupal\Core\Form\FormInterface::validate().
    */
   public function validate(array $form, array &$form_state) {
   }
 
   /**
-   * Submit handler for the field UI overview form.
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
+   * Implements \Drupal\Core\Form\FormInterface::submit().
    */
   public function submit(array $form, array &$form_state) {
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/CallbackBuilderTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/CallbackBuilderTest.php
deleted file mode 100644
index f1a146d..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/Form/CallbackBuilderTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\system\Tests\Form\CallbackBuilderTest.
- */
-
-namespace Drupal\system\Tests\Form;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests form builder callbacks.
- */
-class CallbackBuilderTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('form_test');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Form builder callbacks',
-      'description' => 'Tests form builder callbacks.',
-      'group' => 'Form API',
-    );
-  }
-
-  /**
-   * Tests using a static method to build a form.
-   */
-  function testStaticMethodCallback() {
-    $this->drupalGet('form-test/callback-builder');
-    $this->assertText('The Callbacks::buildForm() method was used for this form.');
-    $elements = $this->xpath('//form[@id="form-test-callback-builder-form"]');
-    $this->assertTrue(!empty($elements), 'The correct form ID was used even when it is not the callback function name.');
-  }
-
-}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/FormObjectTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/FormObjectTest.php
new file mode 100644
index 0000000..9aee405
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/FormObjectTest.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Form\FormObjectTest.
+ */
+
+namespace Drupal\system\Tests\Form;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests building a form from an object.
+ */
+class FormObjectTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('form_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form object tests',
+      'description' => 'Tests building a form from an object.',
+      'group' => 'Form API',
+    );
+  }
+
+  /**
+   * Tests using an object as the form callback.
+   */
+  function testObjectFormCallback() {
+    $this->drupalGet('form-test/object-builder');
+    $this->assertText('The FormTestObject::build() method was used for this form.');
+    $elements = $this->xpath('//form[@id="form-test-form-test-object"]');
+    $this->assertTrue(!empty($elements), 'The correct form ID was used.');
+    $this->drupalPost('form-test/object-builder', NULL, t('Save'));
+    $this->assertText('The FormTestObject::validate() method was used for this form.');
+    $this->assertText('The FormTestObject::submit() method was used for this form.');
+  }
+
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 223af2e..8fa0993 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -3284,7 +3284,10 @@ function system_config_form($form, &$form_state) {
   // primary submit handler, do that first, using the same logic.
   if (!isset($form['#submit'])) {
     $form['#submit'] = array();
-    if (function_exists($form_state['build_info']['form_id'] . '_submit')) {
+    if (isset($form_state['build_info']['callback_object'])) {
+      $form['#submit'][] = array($form_state['build_info']['callback_object'], 'submit');
+    }
+    elseif (function_exists($form_state['build_info']['form_id'] . '_submit')) {
       $form['#submit'][] = $form_state['build_info']['form_id'] . '_submit';
     }
     elseif (isset($form_state['build_info']['base_form_id']) && function_exists($form_state['build_info']['base_form_id'] . '_submit')) {
diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module
index 8c17e01..569cbae 100644
--- a/core/modules/system/tests/modules/form_test/form_test.module
+++ b/core/modules/system/tests/modules/form_test/form_test.module
@@ -6,6 +6,7 @@
  */
 
 use Drupal\form_test\Callbacks;
+use Drupal\form_test\FormTestObject;
 
 /**
  * Implements hook_menu().
@@ -25,10 +26,9 @@ function form_test_menu() {
     'access callback' => TRUE,
     'type' => MENU_CALLBACK,
   );
-  $items['form-test/callback-builder'] = array(
-    'title' => 'Form callback builder test',
-    'page callback' => 'drupal_get_callback_form',
-    'page arguments' => array('form_test_callback_builder_form', '\Drupal\form_test\Callbacks::buildForm'),
+  $items['form-test/object-builder'] = array(
+    'title' => 'Form object builder test',
+    'page callback' => 'form_test_object_builder',
     'access callback' => TRUE,
     'type' => MENU_CALLBACK,
   );
@@ -369,6 +369,13 @@ function form_test_permission() {
 }
 
 /**
+ * Page callback: Displays a form built from an object.
+ */
+function form_test_object_builder() {
+  return drupal_get_form(new FormTestObject());
+}
+
+/**
  * Form submit handler to return form values as JSON.
  */
 function _form_test_submit_values_json($form, &$form_state) {
diff --git a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php
index ac43172..d9b0fe7 100644
--- a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php
+++ b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php
@@ -48,12 +48,4 @@ public function validateName(&$element, &$form_state) {
     }
   }
 
-  /**
-   * Form constructor for the Form callback builder test form.
-   */
-  public static function buildForm($form, &$form_state) {
-    $form['element'] = array('#markup' => 'The Callbacks::buildForm() method was used for this form.');
-    return $form;
-  }
-
 }
diff --git a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/FormTestObject.php b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/FormTestObject.php
new file mode 100644
index 0000000..1498861
--- /dev/null
+++ b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/FormTestObject.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\form_test\FormTestObject.
+ */
+
+namespace Drupal\form_test;
+
+use Drupal\Core\Form\FormInterface;
+
+/**
+ * Provides a test form object.
+ */
+class FormTestObject implements FormInterface {
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'form_test_form_test_object';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state) {
+    $form['element'] = array('#markup' => 'The FormTestObject::build() method was used for this form.');
+
+    $form['actions']['#type'] = 'actions';
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save'),
+    );
+    return $form;
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::validate().
+   */
+  public function validate(array $form, array &$form_state) {
+    drupal_set_message(t('The FormTestObject::validate() method was used for this form.'));
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    drupal_set_message(t('The FormTestObject::submit() method was used for this form.'));
+  }
+
+}
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 bb3fbdf..6bbfdf3 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
@@ -103,7 +103,7 @@ public function initDisplay(ViewExecutable $view, array &$display, array &$optio
 
     // Load extenders as soon as possible.
     $this->extender = array();
-    $extenders = views_get_enabled_display_extenders();
+    $extenders = array_filter(config('views.settings')->get('display_extenders'));
     if (!empty($extenders)) {
       $manager = drupal_container()->get('plugin.manager.views.display_extender');
       foreach ($extenders as $extender) {
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
index 50013dc..6226dae 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
@@ -13,6 +13,7 @@
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\Plugin\views\PluginBase;
 use Drupal\views\Plugin\views\wizard\WizardInterface;
+use Drupal\views\Plugin\views\wizard\WizardException;
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 
 /**
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayExtenderTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayExtenderTest.php
index 3ab1a9b..26a644b 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayExtenderTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayExtenderTest.php
@@ -41,8 +41,9 @@ protected function setUp() {
    * Test display extenders.
    */
   public function testDisplayExtenders() {
-    config('views.settings')->set('display_extenders', array('display_extender_test'))->save();
-    $this->assertEqual(count(views_get_enabled_display_extenders()), 1, 'Make sure that there is only one enabled display extender.');
+    $config = $this->container->get('config.factory')->get('views.settings');
+    $config->set('display_extenders', array('display_extender_test'))->save();
+    $this->assertEqual(count(array_filter($config->get('display_extenders'))), 1, 'Make sure that there is only one enabled display extender.');
 
     $view = views_get_view('test_view');
     $view->initDisplay();
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 8dc5f5a..62762b2 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -987,15 +987,6 @@ function views_get_plugin_definitions() {
 }
 
 /**
- * Get enabled display extenders.
- */
-function views_get_enabled_display_extenders() {
-  $enabled = array_filter((array) config('views.settings')->get('display_extenders'));
-
-  return drupal_map_assoc($enabled);
-}
-
-/**
  * Return a list of all views and display IDs that have a particular
  * setting in their display's plugin settings.
  *
diff --git a/core/modules/views/views_ui/admin.inc b/core/modules/views/views_ui/admin.inc
index b3bcda1..7205ace 100644
--- a/core/modules/views/views_ui/admin.inc
+++ b/core/modules/views/views_ui/admin.inc
@@ -6,19 +6,8 @@
  */
 
 use Drupal\Component\Utility\NestedArray;
-use Drupal\Core\Database\Database;
-use Drupal\views\Ajax\ReplaceTitleCommand;
-use Drupal\views\Ajax\TriggerPreviewCommand;
-use Drupal\views\Ajax\ShowButtonsCommand;
-use Drupal\views\Ajax\DismissFormCommand;
-use Drupal\Core\Ajax\AjaxResponse;
-use Symfony\Component\HttpFoundation\JsonResponse;
-use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
-use Drupal\views_ui\ViewUI;
-use Drupal\views_ui\ViewFormControllerBase;
 use Drupal\views\Analyzer;
 use Drupal\views\ViewExecutable;
-use Drupal\views\Plugin\views\wizard\WizardException;
 
 /**
  * Converts a form element in the add view wizard to be AJAX-enabled.
@@ -265,45 +254,6 @@ function views_ui_taxonomy_autocomplete_validate($element, &$form_state) {
 }
 
 /**
- * Page to delete a view.
- */
-function views_ui_break_lock_confirm($form, &$form_state, ViewUI $view) {
-  $form_state['view'] = &$view;
-  $form = array();
-
-  if (empty($view->locked)) {
-    $form['message']['#markup'] = t('There is no lock on view %name to break.', array('%name' => $view->id()));
-    return $form;
-  }
-
-  $cancel = drupal_container()->get('request')->query->get('cancel');
-  if (empty($cancel)) {
-    $cancel = 'admin/structure/views/view/' . $view->id() . '/edit';
-  }
-
-  $account = user_load($view->locked->owner);
-  $form = confirm_form($form,
-                  t('Do you want to break the lock on view %name?',
-                  array('%name' => $view->id())),
-                  $cancel,
-                  t('By breaking this lock, any unsaved changes made by !user will be lost.', array('!user' => theme('username', array('account' => $account)))),
-                  t('Break lock'),
-                  t('Cancel'));
-  $form['actions']['submit']['#submit'][] = array($view, 'submitBreakLock');
-  return $form;
-}
-
-/**
- * Page callback for the Edit View page.
- */
-function views_ui_edit_page(ViewUI $view, $display_id = NULL) {
-  $view->displayID = $display_id;
-  $build['edit'] = entity_get_form($view, 'edit');
-  $build['preview'] = entity_get_form($view, 'preview');
-  return $build;
-}
-
-/**
  * Move form elements into details for presentation purposes.
  *
  * Many views forms use #tree = TRUE to keep their values in a hierarchy for
@@ -441,76 +391,12 @@ function views_ui_standard_display_dropdown(&$form, &$form_state, $section) {
 
 }
 
-
-/**
- * Returns information about subforms for editing the pieces of a view.
- *
- * @param string|null $key
- *   The form for which to retrieve data. If NULL, the list of all forms is
- *   returned.
- */
-function views_ui_ajax_forms($key = NULL) {
-  $forms = array(
-    'display' => array(
-      'form_id' => 'views_ui_edit_display_form',
-      'args' => array('section'),
-    ),
-    'remove-display' => array(
-      'form_id' => 'views_ui_remove_display_form',
-      'args' => array(),
-    ),
-    'rearrange' => array(
-      'form_id' => 'views_ui_rearrange_form',
-      'args' => array('type'),
-    ),
-    'rearrange-filter' => array(
-      'form_id' => 'views_ui_rearrange_filter_form',
-      'args' => array('type'),
-    ),
-    'reorder-displays' => array(
-      'form_id' => 'views_ui_reorder_displays_form',
-      'args' => array(),
-      'callback' => 'buildDisplaysReorderForm',
-    ),
-    'add-item' => array(
-      'form_id' => 'views_ui_add_item_form',
-      'args' => array('type'),
-    ),
-    'config-item' => array(
-      'form_id' => 'views_ui_config_item_form',
-      'args' => array('type', 'id'),
-    ),
-    'config-item-extra' => array(
-      'form_id' => 'views_ui_config_item_extra_form',
-      'args' => array('type', 'id'),
-    ),
-    'config-item-group' => array(
-      'form_id' => 'views_ui_config_item_group_form',
-      'args' => array('type', 'id'),
-    ),
-    'edit-details' => array(
-      'form_id' => 'views_ui_edit_details_form',
-      'args' => array(),
-    ),
-    'analyze' => array(
-      'form_id' => 'views_ui_analyze_view_form',
-      'args' => array(),
-    ),
-  );
-
-  if ($key) {
-    return !empty($forms[$key]) ? $forms[$key] : NULL;
-  }
-
-  return $forms;
-}
-
 /**
  * Create the URL for one of our standard AJAX forms based upon known
  * information about the form.
  */
 function views_ui_build_form_url($form_state) {
-  $form = views_ui_ajax_forms($form_state['form_key']);
+  $form = $form_state['view']->forms[$form_state['form_key']];
   $ajax = empty($form_state['ajax']) ? 'nojs' : 'ajax';
   $name = $form_state['view']->id();
   $url = "admin/structure/views/$ajax/$form_state[form_key]/$name/$form_state[display_id]";
@@ -521,102 +407,6 @@ function views_ui_build_form_url($form_state) {
 }
 
 /**
- * Generic entry point to handle forms.
- *
- * We do this for consistency and to make it easy to chain forms
- * together.
- */
-function views_ui_ajax_form($js, $key, ViewUI $view, $display_id = '') {
-  // Reset the cache of IDs. Drupal rather aggressively prevents ID
-  // duplication but this causes it to remember IDs that are no longer even
-  // being used.
-  $seen_ids_init = &drupal_static('drupal_html_id:init');
-  $seen_ids_init = array();
-
-  $form = views_ui_ajax_forms($key);
-  if (empty($form)) {
-    throw new NotFoundHttpException();
-  }
-
-  module_load_include('inc', 'views', 'includes/ajax');
-  $args = func_get_args();
-  // Remove the known args
-  array_splice($args, 0, 4);
-
-  $form_state = $view->buildFormState($js, $key, $display_id, $args);
-  // check to see if this is the top form of the stack. If it is, pop
-  // it off; if it isn't, the user clicked somewhere else and the stack is
-  // now irrelevant.
-  if (!empty($view->stack)) {
-    $identifier = $view->buildIdentifier($key, $display_id, $args);
-    // Retrieve the first form from the stack without changing the integer keys,
-    // as they're being used for the "2 of 3" progress indicator.
-    reset($view->stack);
-    list($key, $top) = each($view->stack);
-    unset($view->stack[$key]);
-
-    if (array_shift($top) != $identifier) {
-      $view->stack = array();
-    }
-  }
-
-  // Automatically remove the form cache if it is set and the key does
-  // not match. This way navigating away from the form without hitting
-  // update will work.
-  if (isset($view->form_cache) && $view->form_cache['key'] != $key) {
-    unset($view->form_cache);
-  }
-
-  // With the below logic, we may end up rendering a form twice (or two forms
-  // each sharing the same element ids), potentially resulting in
-  // drupal_add_js() being called twice to add the same setting. drupal_get_js()
-  // is ok with that, but until ajax_render() is (http://drupal.org/node/208611),
-  // reset the drupal_add_js() static before rendering the second time.
-  $drupal_add_js_original = drupal_add_js();
-  $drupal_add_js = &drupal_static('drupal_add_js');
-  $response = views_ajax_form_wrapper($form_state['form_id'], $form_state);
-  if ($form_state['submitted'] && empty($form_state['rerender'])) {
-    // Sometimes we need to re-generate the form for multi-step type operations.
-    $object = NULL;
-    if (!empty($view->stack)) {
-      $drupal_add_js = $drupal_add_js_original;
-      $stack = $view->stack;
-      $top = array_shift($stack);
-      $top[0] = $js;
-      $form_state = call_user_func_array(array($view, 'buildFormState'), $top);
-      $form_state['input'] = array();
-      $form_state['url'] = url(views_ui_build_form_url($form_state));
-      if (!$js) {
-        return drupal_goto(views_ui_build_form_url($form_state));
-      }
-      $response = views_ajax_form_wrapper($form_state['form_id'], $form_state);
-    }
-    elseif (!$js) {
-      // if nothing on the stack, non-js forms just go back to the main view editor.
-      return drupal_goto("admin/structure/views/view/{$view->id()}/edit");
-    }
-    else {
-      $response = new AjaxResponse();
-      $response->addCommand(new DismissFormCommand());
-      $response->addCommand(new ShowButtonsCommand());
-      $response->addCommand(new TriggerPreviewCommand());
-      if (!empty($form_state['#page_title'])) {
-        $response->addCommand(new ReplaceTitleCommand($form_state['#page_title']));
-      }
-    }
-    // If this form was for view-wide changes, there's no need to regenerate
-    // the display section of the form.
-    if ($display_id !== '') {
-      drupal_container()->get('plugin.manager.entity')
-        ->getFormController('view', 'edit')
-        ->rebuildCurrentTab($view, $response, $display_id);
-    }
-  }
-
-  return $response;
-}
-
-/**
  * Form constructor callback to display analysis information on a view
  */
 function views_ui_analyze_view_form($form, &$form_state) {
@@ -1553,9 +1343,11 @@ function views_ui_config_item_form_submit_temporary($form, &$form_state) {
   $executable = $form_state['view']->get('executable');
   $executable->temporary_options[$type][$form_state['id']] = $handler->options;
 
-  // @todo: Figure out whether views_ui_ajax_form is perhaps the better place to fix the issue.
-  // views_ui_ajax_form() drops the current form from the stack, even if it's an #ajax.
-  // So add the item back to the top of the stack.
+  // @todo Decide if \Drupal\views_ui\Routing\ViewsUIController::ajaxForm() is
+  //   perhaps the better place to fix the issue.
+  // \Drupal\views_ui\Routing\ViewsUIController::ajaxForm() drops the current
+  // form from the stack, even if it's an #ajax. So add the item back to the top
+  // of the stack.
   $form_state['view']->addFormToStack($form_state['form_key'], $form_state['display_id'], array($type, $item['id']), TRUE);
 
   $form_state['rerender'] = TRUE;
@@ -1796,225 +1588,6 @@ function views_ui_config_item_extra_form_submit($form, &$form_state) {
 }
 
 /**
- * Form builder for the admin display defaults page.
- */
-function views_ui_admin_settings_basic($form, &$form_state) {
-  $form = array();
-  $form['#attached']['css'] = ViewFormControllerBase::getAdminCSS();
-
-  $config = config('views.settings');
-
-  $options = array();
-  foreach (list_themes() as $name => $theme) {
-    if ($theme->status) {
-      $options[$name] = $theme->info['name'];
-    }
-  }
-
-  // This is not currently a fieldset but we may want it to be later,
-  // so this will make it easier to change if we do.
-  $form['basic'] = array();
-
-  $form['basic']['ui_show_master_display'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Always show the master display'),
-    '#description' => t('Advanced users of views may choose to see the master (i.e. default) display.'),
-    '#default_value' => $config->get('ui.show.master_display'),
-  );
-
-  $form['basic']['ui_show_advanced_column'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Always show advanced display settings'),
-    '#description' => t('Default to showing advanced display settings, such as relationships and contextual filters.'),
-    '#default_value' => $config->get('ui.show.advanced_column'),
-  );
-
-  $form['basic']['ui_show_display_embed'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Show the embed display in the ui.'),
-    '#description' => t('Allow advanced user to use the embed view display. The plugin itself works if it\'s not visible in the ui'),
-    '#default_value' => $config->get('ui.show.display_embed'),
-  );
-
-  $form['basic']['ui_exposed_filter_any_label'] = array(
-    '#type' => 'select',
-    '#title' => t('Label for "Any" value on non-required single-select exposed filters'),
-    '#options' => array('old_any' => '<Any>', 'new_any' => t('- Any -')),
-    '#default_value' => $config->get('ui.exposed_filter_any_label'),
-  );
-
-  $form['live_preview'] = array(
-    '#type' => 'details',
-    '#title' => t('Live preview settings'),
-  );
-
-  $form['live_preview']['ui_always_live_preview'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Automatically update preview on changes'),
-    '#default_value' => $config->get('ui.always_live_preview'),
-  );
-
-  $form['live_preview']['ui_show_preview_information'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Show information and statistics about the view during live preview'),
-    '#default_value' => $config->get('ui.show.preview_information'),
-  );
-
-  $form['live_preview']['options'] = array(
-    '#type' => 'container',
-    '#states' => array(
-      'visible' => array(
-        ':input[name="ui_show_preview_information"]' => array('checked' => TRUE),
-      ),
-    ),
-  );
-
-  $form['live_preview']['options']['ui_show_sql_query_where'] = array(
-    '#type' => 'radios',
-    '#options' => array(
-      'above' => t('Above the preview'),
-      'below' => t('Below the preview'),
-    ),
-    '#default_value' => $config->get('ui.show.sql_query.where'),
-  );
-
-  $form['live_preview']['options']['ui_show_sql_query_enabled'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Show the SQL query'),
-    '#default_value' => $config->get('ui.show.sql_query.enabled'),
-  );
-  $form['live_preview']['options']['ui_show_performance_statistics'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Show performance statistics'),
-    '#default_value' => $config->get('ui.show.performance_statistics'),
-  );
-
-  $form['live_preview']['options']['ui_show_additional_queries'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Show other queries run during render during live preview'),
-    '#description' => t("Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview."),
-    '#default_value' => $config->get('ui.show.additional_queries'),
-  );
-
-  return system_config_form($form, $form_state);
-}
-
-/**
- * Form builder submit handler; Handle submission the basic views settings.
- * @ingroup forms
- * @see system_settings_form()
- */
-function views_ui_admin_settings_basic_submit(&$form, &$form_state) {
-  config('views.settings')
-    ->set('ui.show.master_display', $form_state['values']['ui_show_master_display'])
-    ->set('ui.show.advanced_column', $form_state['values']['ui_show_advanced_column'])
-    ->set('ui.show.display_embed', $form_state['values']['ui_show_display_embed'])
-    ->set('ui.exposed_filter_any_label', $form_state['values']['ui_exposed_filter_any_label'])
-    ->set('ui.always_live_preview', $form_state['values']['ui_always_live_preview'])
-    ->set('ui.show.preview_information', $form_state['values']['ui_show_preview_information'])
-    ->set('ui.show.sql_query.where', $form_state['values']['ui_show_sql_query_where'])
-    ->set('ui.show.sql_query.enabled', $form_state['values']['ui_show_sql_query_enabled'])
-    ->set('ui.show.performance_statistics', $form_state['values']['ui_show_performance_statistics'])
-    ->set('ui.show.additional_queries', $form_state['values']['ui_show_additional_queries'])
-    ->save();
-}
-
-/**
- * Form builder for the advanced admin settings page.
- */
-function views_ui_admin_settings_advanced() {
-  $form = array();
-  $form['#attached']['css'] = ViewFormControllerBase::getAdminCSS();
-
-  $config = config('views.settings');
-
-  $form['cache'] = array(
-    '#type' => 'details',
-    '#title' => t('Caching'),
-  );
-
-  $form['cache']['skip_cache'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Disable views data caching'),
-    '#description' => t("Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site."),
-    '#default_value' => $config->get('skip_cache'),
-  );
-
-  $form['cache']['clear_cache'] = array(
-    '#type' => 'submit',
-    '#value' => t("Clear Views' cache"),
-    '#submit' => array('views_ui_tools_clear_cache'),
-  );
-
-  $form['debug'] = array(
-    '#type' => 'details',
-    '#title' => t('Debugging'),
-  );
-
-  $form['debug']['sql_signature'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Add Views signature to all SQL queries'),
-    '#description' => t("All Views-generated queries will include the name of the views and display 'view-name:display-name' as a string  at the end of the SELECT clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting."),
-
-    '#default_value' => $config->get('sql_signature'),
-  );
-
-  $form['debug']['no_javascript'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Disable JavaScript with Views'),
-    '#description' => t("If you are having problems with the JavaScript, you can disable it here. The Views UI should degrade and still be usable without javascript; it's just not as good."),
-    '#default_value' => $config->get('no_javascript'),
-  );
-
-  $options = views_fetch_plugin_names('display_extender');
-  if (!empty($options)) {
-    $form['extenders'] = array(
-      '#type' => 'details',
-    );
-    ;
-    $form['extenders']['display_extenders'] = array(
-      '#title' => t('Display extenders'),
-      '#default_value' => views_get_enabled_display_extenders(),
-      '#options' => $options,
-      '#type' => 'checkboxes',
-      '#description' => t('Select extensions of the views interface.')
-    );
-  }
-
-  $form['actions']['#type'] = 'actions';
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save configuration'),
-    '#button_type' => 'primary',
-  );
-  $form['#submit'][] = 'views_ui_admin_settings_advanced_submit';
-
-  return $form;
-}
-
-/**
- * Form builder submit handler; Handle submission the basic views settings..
- * @ingroup forms
- * @see system_settings_form()
- */
-function views_ui_admin_settings_advanced_submit(&$form, &$form_state) {
-  config('views.settings')
-    ->set('skip_cache', $form_state['values']['skip_cache'])
-    ->set('sql_signature', $form_state['values']['sql_signature'])
-    ->set('no_javascript', $form_state['values']['no_javascript'])
-    ->set('display_extenders', isset($form_state['values']['display_extenders']) ? $form_state['values']['display_extenders'] : array())
-    ->save();
-}
-
-/**
- * Submit hook to clear the views cache.
- */
-function views_ui_tools_clear_cache() {
-  views_invalidate_cache();
-  drupal_set_message(t('The cache has been cleared.'));
-}
-
-/**
  * Submit hook to clear Drupal's theme registry (thereby triggering
  * a templates rescan).
  */
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIAdvancedSettings.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIAdvancedSettings.php
new file mode 100644
index 0000000..af82316
--- /dev/null
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIAdvancedSettings.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Form\ViewsUIAdvancedSettings.
+ */
+
+namespace Drupal\views_ui\Form;
+
+use Drupal\Core\Config\Config;
+
+/**
+ * Form builder for the advanced admin settings page.
+ */
+class ViewsUIAdvancedSettings extends ViewsUIFormBase {
+
+  /**
+   * Stores the views configuration.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $config;
+
+  /**
+   * Constructs a \Drupal\views_ui\Form\ViewsUIAdvancedSettings object.
+   */
+  public function __construct(Config $config) {
+    $this->config = $config;
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'views_ui_admin_settings_advanced';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state) {
+    $form['cache'] = array(
+      '#type' => 'details',
+      '#title' => t('Caching'),
+    );
+
+    $form['cache']['skip_cache'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Disable views data caching'),
+      '#description' => t("Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site."),
+      '#default_value' => $this->config->get('skip_cache'),
+    );
+
+    $form['cache']['clear_cache'] = array(
+      '#type' => 'submit',
+      '#value' => t("Clear Views' cache"),
+      '#submit' => array(array($this, 'cacheSubmit')),
+    );
+
+    $form['debug'] = array(
+      '#type' => 'details',
+      '#title' => t('Debugging'),
+    );
+
+    $form['debug']['sql_signature'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Add Views signature to all SQL queries'),
+      '#description' => t("All Views-generated queries will include the name of the views and display 'view-name:display-name' as a string  at the end of the SELECT clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting."),
+
+      '#default_value' => $this->config->get('sql_signature'),
+    );
+
+    $form['debug']['no_javascript'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Disable JavaScript with Views'),
+      '#description' => t("If you are having problems with the JavaScript, you can disable it here. The Views UI should degrade and still be usable without javascript; it's just not as good."),
+      '#default_value' => $this->config->get('no_javascript'),
+    );
+
+    $options = views_fetch_plugin_names('display_extender');
+    if (!empty($options)) {
+      $form['extenders'] = array(
+        '#type' => 'details',
+      );
+      $form['extenders']['display_extenders'] = array(
+        '#title' => t('Display extenders'),
+        '#default_value' => array_filter($this->config->get('display_extenders')),
+        '#options' => $options,
+        '#type' => 'checkboxes',
+        '#description' => t('Select extensions of the views interface.')
+      );
+    }
+
+    return system_config_form($form, &$form_state);
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    $this->config
+      ->set('skip_cache', $form_state['values']['skip_cache'])
+      ->set('sql_signature', $form_state['values']['sql_signature'])
+      ->set('no_javascript', $form_state['values']['no_javascript'])
+      ->set('display_extenders', isset($form_state['values']['display_extenders']) ? $form_state['values']['display_extenders'] : array())
+      ->save();
+  }
+
+  /**
+   * Submission handler to clear the Views cache.
+   */
+  public function cacheSubmit() {
+    views_invalidate_cache();
+    drupal_set_message(t('The cache has been cleared.'));
+  }
+
+}
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIBasicSettings.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIBasicSettings.php
new file mode 100644
index 0000000..ac4c664
--- /dev/null
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIBasicSettings.php
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Form\ViewsUIBasicSettings.
+ */
+
+namespace Drupal\views_ui\Form;
+
+use Drupal\Core\Config\Config;
+
+/**
+ * Form builder for the admin display defaults page.
+ */
+class ViewsUIBasicSettings extends ViewsUIFormBase {
+
+  /**
+   * Stores the views configuration.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $config;
+
+  /**
+   * Constructs a \Drupal\views_ui\Form\ViewsUIBasicSettings object.
+   */
+  public function __construct(Config $config) {
+    $this->config = $config;
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'views_ui_admin_settings_basic';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state) {
+    $options = array();
+    foreach (list_themes() as $name => $theme) {
+      if ($theme->status) {
+        $options[$name] = $theme->info['name'];
+      }
+    }
+
+    // This is not currently a fieldset but we may want it to be later,
+    // so this will make it easier to change if we do.
+    $form['basic'] = array();
+
+    $form['basic']['ui_show_master_display'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Always show the master display'),
+      '#description' => t('Advanced users of views may choose to see the master (i.e. default) display.'),
+      '#default_value' => $this->config->get('ui.show.master_display'),
+    );
+
+    $form['basic']['ui_show_advanced_column'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Always show advanced display settings'),
+      '#description' => t('Default to showing advanced display settings, such as relationships and contextual filters.'),
+      '#default_value' => $this->config->get('ui.show.advanced_column'),
+    );
+
+    $form['basic']['ui_show_display_embed'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show the embed display in the ui.'),
+      '#description' => t('Allow advanced user to use the embed view display. The plugin itself works if it\'s not visible in the ui'),
+      '#default_value' => $this->config->get('ui.show.display_embed'),
+    );
+
+    $form['basic']['ui_exposed_filter_any_label'] = array(
+      '#type' => 'select',
+      '#title' => t('Label for "Any" value on non-required single-select exposed filters'),
+      '#options' => array('old_any' => '<Any>', 'new_any' => t('- Any -')),
+      '#default_value' => $this->config->get('ui.exposed_filter_any_label'),
+    );
+
+    $form['live_preview'] = array(
+      '#type' => 'details',
+      '#title' => t('Live preview settings'),
+    );
+
+    $form['live_preview']['ui_always_live_preview'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Automatically update preview on changes'),
+      '#default_value' => $this->config->get('ui.always_live_preview'),
+    );
+
+    $form['live_preview']['ui_show_preview_information'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show information and statistics about the view during live preview'),
+      '#default_value' => $this->config->get('ui.show.preview_information'),
+    );
+
+    $form['live_preview']['options'] = array(
+      '#type' => 'container',
+      '#states' => array(
+        'visible' => array(
+          ':input[name="ui_show_preview_information"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+
+    $form['live_preview']['options']['ui_show_sql_query_where'] = array(
+      '#type' => 'radios',
+      '#options' => array(
+        'above' => t('Above the preview'),
+        'below' => t('Below the preview'),
+      ),
+      '#default_value' => $this->config->get('ui.show.sql_query.where'),
+    );
+
+    $form['live_preview']['options']['ui_show_sql_query_enabled'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show the SQL query'),
+      '#default_value' => $this->config->get('ui.show.sql_query.enabled'),
+    );
+    $form['live_preview']['options']['ui_show_performance_statistics'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show performance statistics'),
+      '#default_value' => $this->config->get('ui.show.performance_statistics'),
+    );
+
+    $form['live_preview']['options']['ui_show_additional_queries'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show other queries run during render during live preview'),
+      '#description' => t("Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview."),
+      '#default_value' => $this->config->get('ui.show.additional_queries'),
+    );
+
+    return system_config_form($form, $form_state);
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    $this->config
+      ->set('ui.show.master_display', $form_state['values']['ui_show_master_display'])
+      ->set('ui.show.advanced_column', $form_state['values']['ui_show_advanced_column'])
+      ->set('ui.show.display_embed', $form_state['values']['ui_show_display_embed'])
+      ->set('ui.exposed_filter_any_label', $form_state['values']['ui_exposed_filter_any_label'])
+      ->set('ui.always_live_preview', $form_state['values']['ui_always_live_preview'])
+      ->set('ui.show.preview_information', $form_state['values']['ui_show_preview_information'])
+      ->set('ui.show.sql_query.where', $form_state['values']['ui_show_sql_query_where'])
+      ->set('ui.show.sql_query.enabled', $form_state['values']['ui_show_sql_query_enabled'])
+      ->set('ui.show.performance_statistics', $form_state['values']['ui_show_performance_statistics'])
+      ->set('ui.show.additional_queries', $form_state['values']['ui_show_additional_queries'])
+      ->save();
+  }
+
+}
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIBreakLock.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIBreakLock.php
new file mode 100644
index 0000000..252ac8f
--- /dev/null
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIBreakLock.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Form\ViewsUIBreakLock.
+ */
+
+namespace Drupal\views_ui\Form;
+
+use Drupal\views_ui\ViewUI;
+use Drupal\user\TempStore;
+
+/**
+ * Builds the form to break the lock of an edited view.
+ */
+class ViewsUIBreakLock extends ViewsUIFormBase {
+
+  /**
+   * Stores the Entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManager
+   */
+  protected $entityManager;
+
+  /**
+   * Stores the user tempstore.
+   *
+   * @var \Drupal\user\TempStore
+   */
+  protected $tempStore;
+
+  /**
+   * Constructs a \Drupal\views_ui\Form\ViewsUIBreakLock object.
+   */
+  public function __construct(EntityManager $entity_manager, TempStore $temp_store) {
+    $this->entityManager = $entity_manager;
+    $this->tempstore = $temp_store;
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'views_ui_break_lock_confirm';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state, ViewUI $view = NULL) {
+    $form_state['view'] = $view;
+
+    if (empty($view->locked)) {
+      $form['message']['#markup'] = t('There is no lock on view %name to break.', array('%name' => $view->id()));
+      return $form;
+    }
+
+    $account = $this->entityManager->getStorageController('user')->load(array($view->locked->owner));
+    return confirm_form($form,
+      t('Do you want to break the lock on view %name?', array('%name' => $view->id())),
+      'admin/structure/views/view/' . $view->id(),
+      t('By breaking this lock, any unsaved changes made by !user will be lost.', array('!user' => theme('username', array('account' => reset($account))))),
+      t('Break lock'),
+      t('Cancel')
+    );
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    $this->tempStore->delete($form_state['view']->id());
+    $form_state['redirect'] = 'admin/structure/views/view/' . $form_state['view']->id();
+    drupal_set_message(t('The lock has been broken and you may now edit this view.'));
+  }
+
+}
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIDelete.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIDelete.php
new file mode 100644
index 0000000..436e0a2
--- /dev/null
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIDelete.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Form\ViewsUIDelete.
+ */
+
+namespace Drupal\views_ui\Form;
+
+use Drupal\views\ViewStorageInterface;
+
+/**
+ * Builds the form to delete a view.
+ */
+class ViewsUIDelete extends ViewsUIFormBase {
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'views_ui_confirm_delete';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::build().
+   */
+  public function build(array $form, array &$form_state, ViewStorageInterface $view = NULL) {
+    $form_state['view'] = $view;
+    return confirm_form($form,
+      t('Are you sure you want to delete the %name view?', array('%name' => $view->getHumanName())),
+      'admin/structure/views',
+      t('This action cannot be undone.'),
+      t('Delete'),
+      t('Cancel')
+    );
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    $form_state['view']->delete();
+    $form_state['redirect'] = 'admin/structure/views';
+  }
+
+}
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIFormBase.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIFormBase.php
new file mode 100644
index 0000000..d6f7b4b
--- /dev/null
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/ViewsUIFormBase.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Form\ViewsUIFormBase.
+ */
+
+namespace Drupal\views_ui\Form;
+
+use Drupal\Core\Form\FormInterface;
+
+/**
+ * Provides a generic Views UI form class.
+ */
+abstract class ViewsUIFormBase implements FormInterface {
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::validate().
+   */
+  public function validate(array $form, array &$form_state) {
+  }
+
+}
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php
index c0fbf9e..d98218d 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Routing/ViewsUIController.php
@@ -12,6 +12,7 @@
 use Drupal\views_ui\ViewUI;
 use Drupal\views\ViewsDataCache;
 use Drupal\user\TempStoreFactory;
+use Drupal\Core\Config\ConfigFactory;
 use Drupal\Core\Entity\EntityManager;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\JsonResponse;
@@ -19,6 +20,9 @@
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\ReplaceCommand;
 
+use Drupal\views_ui\Form;
+use Drupal\views\Ajax;
+
 /**
  * Returns responses for Views UI routes.
  */
@@ -46,6 +50,13 @@ class ViewsUIController {
   protected $tempStore;
 
   /**
+   * The configuration factory object.
+   *
+   * @var \Drupal\Core\Config\ConfigFactory
+   */
+  protected $configFactory;
+
+  /**
    * Constructs a new \Drupal\views_ui\Routing\ViewsUIController object.
    *
    * @param \Drupal\Core\Entity\EntityManager $entity_manager
@@ -55,10 +66,11 @@ class ViewsUIController {
    * @param \Drupal\user\TempStoreFactory $temp_store_factory
    *   The factory for the temp store object.
    */
-  public function __construct(EntityManager $entity_manager, ViewsDataCache $views_data, TempStoreFactory $temp_store_factory) {
+  public function __construct(EntityManager $entity_manager, ViewsDataCache $views_data, TempStoreFactory $temp_store_factory, ConfigFactory $config_factory) {
     $this->entityManager = $entity_manager;
     $this->viewsData = $views_data;
     $this->tempStore = $temp_store_factory->get('views');
+    $this->configFactory = $config_factory;
   }
 
   /**
@@ -91,9 +103,7 @@ public function add() {
    *   The Views basic settings form.
    */
   public function settingsBasic() {
-    // @todo Remove the need for this.
-    module_load_include('inc', 'views_ui', 'admin');
-    return drupal_get_form('views_ui_admin_settings_basic');
+    return drupal_get_form(new Form\ViewsUIBasicSettings($this->configFactory->get('views.settings')));
   }
 
   /**
@@ -103,9 +113,7 @@ public function settingsBasic() {
    *   The Views advanced settings form.
    */
   public function settingsAdvanced() {
-    // @todo Remove the need for this.
-    module_load_include('inc', 'views_ui', 'admin');
-    return drupal_get_form('views_ui_admin_settings_advanced');
+    return drupal_get_form(new Form\ViewsUIAdvancedSettings($this->configFactory->get('views.settings')));
   }
 
   /**
@@ -243,7 +251,7 @@ public function cloneForm(ViewStorageInterface $view) {
    *   The Views delete form.
    */
   public function deleteForm(ViewStorageInterface $view) {
-    return drupal_get_form('views_ui_confirm_delete', $view);
+    return drupal_get_form(new Form\ViewsUIDelete(), $view);
   }
 
   /**
@@ -330,10 +338,7 @@ public function preview(ViewStorageInterface $view, $display_id = NULL) {
    *   The Views 'break lock' form.
    */
   public function breakLock(ViewStorageInterface $view) {
-    // @todo Remove the need for this.
-    module_load_include('inc', 'views_ui', 'admin');
-
-    return drupal_get_form('views_ui_break_lock_confirm', $this->getViewUI($view));
+    return drupal_get_form(new Form\ViewsUIBreakLock($this->entityManager, $this->tempStore), $this->getViewUI($view));
   }
 
   /**
@@ -344,7 +349,7 @@ public function breakLock(ViewStorageInterface $view) {
    *   be 'nojs'. This determines the response.
    * @param string $key
    *   A string representing a section of the Views UI. Available keys are in
-   *   views_ui_ajax_forms().
+   *   \Drupal\views_ui\ViewUI::$forms.
    * @param \Drupal\views\ViewStorageInterface $view
    *   The view being edited.
    * @param string|null $display_id
@@ -373,8 +378,91 @@ public function ajaxForm($js, $key, ViewStorageInterface $view, $display_id, $ty
 
     // @todo Remove the need for this.
     module_load_include('inc', 'views_ui', 'admin');
+    module_load_include('inc', 'views', 'includes/ajax');
+
+    $view = $this->getViewUI($view);
+    $args = array($type, $id);
+
+    // Reset the cache of IDs. Drupal rather aggressively prevents ID
+    // duplication but this causes it to remember IDs that are no longer even
+    // being used.
+    $seen_ids_init = &drupal_static('drupal_html_id:init');
+    $seen_ids_init = array();
+
+    if (empty($view->forms[$key])) {
+      throw new NotFoundHttpException();
+    }
+
+    $form_state = $view->buildFormState($js, $key, $display_id, $args);
+    // check to see if this is the top form of the stack. If it is, pop
+    // it off; if it isn't, the user clicked somewhere else and the stack is
+    // now irrelevant.
+    if (!empty($view->stack)) {
+      $identifier = $view->buildIdentifier($key, $display_id, $args);
+      // Retrieve the first form from the stack without changing the integer keys,
+      // as they're being used for the "2 of 3" progress indicator.
+      reset($view->stack);
+      list($key, $top) = each($view->stack);
+      unset($view->stack[$key]);
+
+      if (array_shift($top) != $identifier) {
+        $view->stack = array();
+      }
+    }
+
+    // Automatically remove the form cache if it is set and the key does
+    // not match. This way navigating away from the form without hitting
+    // update will work.
+    if (isset($view->form_cache) && $view->form_cache['key'] != $key) {
+      unset($view->form_cache);
+    }
+
+    // With the below logic, we may end up rendering a form twice (or two forms
+    // each sharing the same element ids), potentially resulting in
+    // drupal_add_js() being called twice to add the same setting. drupal_get_js()
+    // is ok with that, but until ajax_render() is (http://drupal.org/node/208611),
+    // reset the drupal_add_js() static before rendering the second time.
+    $drupal_add_js_original = drupal_add_js();
+    $drupal_add_js = &drupal_static('drupal_add_js');
+    $response = views_ajax_form_wrapper($form_state['form_id'], $form_state);
+    if ($form_state['submitted'] && empty($form_state['rerender'])) {
+      // Sometimes we need to re-generate the form for multi-step type operations.
+      $object = NULL;
+      if (!empty($view->stack)) {
+        $drupal_add_js = $drupal_add_js_original;
+        $stack = $view->stack;
+        $top = array_shift($stack);
+        $top[0] = $js;
+        $form_state = call_user_func_array(array($view, 'buildFormState'), $top);
+        $form_state['input'] = array();
+        $form_url = views_ui_build_form_url($form_state);
+        if (!$js) {
+          return new RedirectResponse(url($form_url, array('absolute' => TRUE)));
+        }
+        $form_state['url'] = url($form_url);
+        $response = views_ajax_form_wrapper($form_state['form_id'], $form_state);
+      }
+      elseif (!$js) {
+        // if nothing on the stack, non-js forms just go back to the main view editor.
+        return new RedirectResponse(url("admin/structure/views/view/{$view->id()}/edit", array('absolute' => TRUE)));
+      }
+      else {
+        $response = new AjaxResponse();
+        $response->addCommand(new Ajax\DismissFormCommand());
+        $response->addCommand(new Ajax\ShowButtonsCommand());
+        $response->addCommand(new Ajax\TriggerPreviewCommand());
+        if (!empty($form_state['#page_title'])) {
+          $response->addCommand(new Ajax\ReplaceTitleCommand($form_state['#page_title']));
+        }
+      }
+      // If this form was for view-wide changes, there's no need to regenerate
+      // the display section of the form.
+      if ($display_id !== '') {
+        $this->entityManager->getFormController('view', 'edit')->rebuildCurrentTab($view, $response, $display_id);
+      }
+    }
 
-    return views_ui_ajax_form($js, $key, $this->getViewUI($view), $display_id, $type, $id);
+    return $response;
   }
 
   /**
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 ab5a00f..a46a2a9 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
@@ -123,6 +123,54 @@ class ViewUI implements ViewStorageInterface {
    */
   protected $additionalQueries;
 
+  public $forms = array(
+    'display' => array(
+      'form_id' => 'views_ui_edit_display_form',
+      'args' => array('section'),
+    ),
+    'remove-display' => array(
+      'form_id' => 'views_ui_remove_display_form',
+      'args' => array(),
+    ),
+    'rearrange' => array(
+      'form_id' => 'views_ui_rearrange_form',
+      'args' => array('type'),
+    ),
+    'rearrange-filter' => array(
+      'form_id' => 'views_ui_rearrange_filter_form',
+      'args' => array('type'),
+    ),
+    'reorder-displays' => array(
+      'form_id' => 'views_ui_reorder_displays_form',
+      'args' => array(),
+      'callback' => 'buildDisplaysReorderForm',
+    ),
+    'add-item' => array(
+      'form_id' => 'views_ui_add_item_form',
+      'args' => array('type'),
+    ),
+    'config-item' => array(
+      'form_id' => 'views_ui_config_item_form',
+      'args' => array('type', 'id'),
+    ),
+    'config-item-extra' => array(
+      'form_id' => 'views_ui_config_item_extra_form',
+      'args' => array('type', 'id'),
+    ),
+    'config-item-group' => array(
+      'form_id' => 'views_ui_config_item_group_form',
+      'args' => array('type', 'id'),
+    ),
+    'edit-details' => array(
+      'form_id' => 'views_ui_edit_details_form',
+      'args' => array(),
+    ),
+    'analyze' => array(
+      'form_id' => 'views_ui_analyze_view_form',
+      'args' => array(),
+    ),
+  );
+
   /**
    * Constructs a View UI object.
    *
@@ -271,13 +319,14 @@ public function getStandardButtons(&$form, &$form_state, $form_id, $name = NULL,
         '#button_type' => 'primary',
       );
       // Form API button click detection requires the button's #value to be the
-      // same between the form build of the initial page request, and the initial
-      // form build of the request processing the form submission. Ideally, the
-      // button's #value shouldn't change until the form rebuild step. However,
-      // views_ui_ajax_form() implements a different multistep form workflow than
-      // the Form API does, and adjusts $view->stack prior to form processing, so
-      // we compensate by extending button click detection code to support any of
-      // the possible button labels.
+      // same between the form build of the initial page request, and the
+      // initial form build of the request processing the form submission.
+      // Ideally, the button's #value shouldn't change until the form rebuild
+      // step. However, \Drupal\views_ui\Routing\ViewsUIController::ajaxForm()
+      // implements a different multistep form workflow than the Form API does,
+      // and adjusts $view->stack prior to form processing, so we compensate by
+      // extending button click detection code to support any of the possible
+      // button labels.
       if (isset($names)) {
         $form['buttons']['submit']['#values'] = $names;
         $form['buttons']['submit']['#process'] = array_merge(array('views_ui_form_button_was_clicked'), element_info_property($form['buttons']['submit']['#type'], '#process', array()));
@@ -361,15 +410,6 @@ public function getOverrideValues($form, $form_state) {
   }
 
   /**
-   * Submit handler to break_lock a view.
-   */
-  public function submitBreakLock(&$form, &$form_state) {
-    drupal_container()->get('user.tempstore')->get('views')->delete($this->id());
-    $form_state['redirect'] = 'admin/structure/views/view/' . $this->id() . '/edit';
-    drupal_set_message(t('The lock has been broken and you may now edit this view.'));
-  }
-
-  /**
    * Form constructor callback to reorder displays on a view
    */
   public function buildDisplaysReorderForm($form, &$form_state) {
@@ -849,7 +889,7 @@ public function getFormProgress() {
    * we do a lot of spiffy concatenation here.
    */
   public function buildIdentifier($key, $display_id, $args) {
-    $form = views_ui_ajax_forms($key);
+    $form = $this->forms[$key];
     // Automatically remove the single-form cache if it exists and
     // does not match the key.
     $identifier = implode('-', array($key, $this->id(), $display_id));
@@ -877,7 +917,7 @@ public static function sortPosition($display1, $display2) {
    * based on known information about a form.
    */
   public function buildFormState($js, $key, $display_id, $args) {
-    $form = views_ui_ajax_forms($key);
+    $form = $this->forms[$key];
     // Build up form state
     $form_state = array(
       'form_key' => $key,
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewsUiBundle.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewsUiBundle.php
index 9459721..6ba14a1 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewsUiBundle.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewsUiBundle.php
@@ -23,7 +23,8 @@ public function build(ContainerBuilder $container) {
     $container->register('views_ui.controller', 'Drupal\views_ui\Routing\ViewsUIController')
       ->addArgument(new Reference('plugin.manager.entity'))
       ->addArgument(new Reference('views.views_data'))
-      ->addArgument(new Reference('user.tempstore'));
+      ->addArgument(new Reference('user.tempstore'))
+      ->addArgument(new Reference('config.factory'));
   }
 
 }
diff --git a/core/modules/views/views_ui/views_ui.module b/core/modules/views/views_ui/views_ui.module
index 24d54ef..2dbdcc6 100644
--- a/core/modules/views/views_ui/views_ui.module
+++ b/core/modules/views/views_ui/views_ui.module
@@ -489,30 +489,3 @@ function views_ui_truncate($string, $length) {
 function views_ui_load($name) {
   return views_get_view($name);
 }
-
-/**
- * Form constructor for the View deletion form.
- *
- * @param \Drupal\views\ViewExectuable $view
- *   The View being deleted.
- *
- * @see views_ui_confirm_delete_submit()
- */
-function views_ui_confirm_delete($form, &$form_state, ViewStorageInterface $view) {
-  $form['view'] = array('#type' => 'value', '#value' => $view);
-  return confirm_form($form,
-    t('Are you sure you want to delete the %name view?', array('%name' => $view->getHumanName())),
-    'admin/structure/views',
-    t('This action cannot be undone.'),
-    t('Delete'),
-    t('Cancel')
-  );
-}
-
-/**
- * Form submission handler for views_ui_confirm_delete().
- */
-function views_ui_confirm_delete_submit($form, &$form_state) {
-  $form_state['values']['view']->delete();
-  $form_state['redirect'] = 'admin/structure/views';
-}
