diff --git a/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php
index 0061530..f965360 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php
@@ -38,8 +38,18 @@ public function __construct(ContentNegotiation $negotiation) {
   public function onRequestSetController(GetResponseEvent $event) {
     $request = $event->getRequest();
 
+    // @todo This should all get converted into one or more RouteEnhancers.
     if (!$request->attributes->has('_controller') && $this->negotiation->getContentType($request) === 'html') {
-      $request->attributes->set('_controller', '\Drupal\Core\HtmlPageController::content');
+      if ($request->attributes->has('_form')) {
+        $request->attributes->set('_controller', '\Drupal\Core\HtmlFormController::content');
+      }
+      elseif ($request->attributes->has('_content')) {
+        $request->attributes->set('_controller', '\Drupal\Core\HtmlPageController::content');
+      }
+      else {
+        throw new \InvalidArgumentException('No valid subcontroller key was found');
+      }
+
     }
   }
 
diff --git a/core/lib/Drupal/Core/HtmlFormController.php b/core/lib/Drupal/Core/HtmlFormController.php
new file mode 100644
index 0000000..f5075e9
--- /dev/null
+++ b/core/lib/Drupal/Core/HtmlFormController.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\HtmlFormController.
+ */
+
+namespace Drupal\Core;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Wrapping controller for forms that serve as the main page body.
+ *
+ * This doesn't use the container yet, but see the @todo inline below for where
+ * we'll be using it shortly.
+ */
+class HtmlFormController implements ContainerAwareInterface {
+
+  /**
+   * The injection container for this object.
+   *
+   * @var \Symfony\Component\DependencyInjection\ContainerInterface
+   */
+  protected $container;
+
+  /**
+   * Injects the service container used by this object.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   The service container this object should use.
+   */
+  public function setContainer(ContainerInterface $container = NULL) {
+    $this->container = $container;
+  }
+
+  /**
+   * Controller method for generic HTML form pages.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The request object.
+   * @param callable $_form
+   *   The name of the form class for this request.
+   *
+   * @return \Symfony\Component\HttpFoundation\Response
+   *   A response object.
+   */
+  public function content(Request $request, $_form) {
+    // @todo Add the ability for forms to have a factory method just like
+    //   controllers. See http://drupal.org/node/1915774#comment-7140912.
+    // If this is a class, instantiate it.
+    if (class_exists($_form)) {
+      $form_arg = new $_form();
+    }
+    // Otherwise, it is a service.
+    else {
+      $form_arg = $this->container->get($_form);
+    }
+
+    // Using reflection, find all of the parameters needed by the form in the
+    // request attributes, skipping $form and $form_state.
+    $attributes = $request->attributes->all();
+    $reflection = new \ReflectionMethod($form_arg, 'buildForm');
+    $params = $reflection->getParameters();
+    $args = array();
+    foreach (array_splice($params, 2) as $param) {
+      if (array_key_exists($param->name, $attributes)) {
+        $args[] = $attributes[$param->name];
+      }
+    }
+    $form_state['build_info']['args'] = $args;
+
+    $form_id = _drupal_form_id($form_arg, $form_state);
+    $form = drupal_build_form($form_id, $form_state);
+    return new Response(drupal_render_page($form));
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Form/MaintenanceModeForm.php b/core/modules/system/lib/Drupal/system/Form/MaintenanceModeForm.php
new file mode 100644
index 0000000..419aabd
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Form/MaintenanceModeForm.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Form\MaintenanceModeForm.
+ */
+
+namespace Drupal\system\Form;
+
+use Drupal\system\SystemConfigFormBase;
+
+/**
+ * Configure the site's maintenance status.
+ */
+class MaintenanceModeForm extends SystemConfigFormBase {
+
+  /**
+   * Overrides \Drupal\system\SystemConfigFormBase::getFormID().
+   */
+  public function getFormID() {
+    return 'system_site_maintenance_mode';
+  }
+
+  /**
+   * Overrides \Drupal\system\SystemConfigFormBase::buildForm().
+   */
+  public function buildForm(array $form, array &$form_state) {
+    config_context_enter('config.context.free');
+    $config = config('system.maintenance');
+    $form['maintenance_mode'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Put site into maintenance mode'),
+      '#default_value' => $config->get('enabled'),
+      '#description' => t('Visitors will only see the maintenance mode message. Only users with the "Access site in maintenance mode" <a href="@permissions-url">permission</a> will be able to access the site. Authorized users can log in directly via the <a href="@user-login">user login</a> page.', array('@permissions-url' => url('admin/config/people/permissions'), '@user-login' => url('user'))),
+    );
+    $form['maintenance_mode_message'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Message to display when in maintenance mode'),
+      '#default_value' => $config->get('message'),
+    );
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * Overrides \Drupal\system\SystemConfigFormBase::submitForm().
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    config_context_enter('config.context.free');
+    config('system.maintenance')
+      ->set('enabled', $form_state['values']['maintenance_mode'])
+      ->set('message', $form_state['values']['maintenance_mode_message'])
+      ->save();
+
+    return parent::submitForm($form, $form_state);
+  }
+}
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index b367033..d7893b4 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -2021,43 +2021,6 @@ function system_regional_settings_submit($form, &$form_state) {
 }
 
 /**
- * Form builder; Configure the site's maintenance status.
- *
- * @ingroup forms
- * @see system_site_maintenance_mode_submit()
- */
-function system_site_maintenance_mode($form, &$form_state) {
-  config_context_enter('config.context.free');
-  $config = config('system.maintenance');
-  $form['maintenance_mode'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Put site into maintenance mode'),
-    '#default_value' => $config->get('enabled'),
-    '#description' => t('Visitors will only see the maintenance mode message. Only users with the "Access site in maintenance mode" <a href="@permissions-url">permission</a> will be able to access the site. Authorized users can log in directly via the <a href="@user-login">user login</a> page.', array('@permissions-url' => url('admin/config/people/permissions'), '@user-login' => url('user'))),
-  );
-  $form['maintenance_mode_message'] = array(
-    '#type' => 'textarea',
-    '#title' => t('Message to display when in maintenance mode'),
-    '#default_value' => $config->get('message'),
-  );
-
-  return system_config_form($form, $form_state);
-}
-
-/**
- * Form submission handler for system_site_maintenance_mode().
- *
- * @ingroup forms
- */
-function system_site_maintenance_mode_submit($form, &$form_state) {
-  config_context_enter('config.context.free');
-  config('system.maintenance')
-    ->set('enabled', $form_state['values']['maintenance_mode'])
-    ->set('message', $form_state['values']['maintenance_mode_message'])
-    ->save();
-}
-
-/**
  * Menu callback: displays the site status report. Can also be used as a pure check.
  *
  * @param $check
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 3f01968..0e2748c 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -848,10 +848,7 @@ function system_menu() {
   $items['admin/config/development/maintenance'] = array(
     'title' => 'Maintenance mode',
     'description' => 'Take the site offline for maintenance or bring it back online.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('system_site_maintenance_mode'),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'system.admin.inc',
+    'page callback' => 'NOT_USED',
     'weight' => -10,
   );
   $items['admin/config/development/performance'] = array(
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index 085895e..1bc6cf2 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -4,3 +4,10 @@ system.cron:
     _controller: '\Drupal\system\CronController::run'
   requirements:
     _access_system_cron: 'TRUE'
+
+system.maintenance:
+    pattern: '/admin/config/development/maintenance'
+    defaults:
+      _form: '\Drupal\system\Form\MaintenanceModeForm'
+    requirements:
+      _permission: 'administer site configuration'
diff --git a/core/modules/system/tests/modules/condition_test/condition_test.routing.yml b/core/modules/system/tests/modules/condition_test/condition_test.routing.yml
index 96fbdca..d242511 100644
--- a/core/modules/system/tests/modules/condition_test/condition_test.routing.yml
+++ b/core/modules/system/tests/modules/condition_test/condition_test.routing.yml
@@ -1,6 +1,6 @@
 condition_test_1:
   pattern: '/condition_test'
   defaults:
-    _controller: '\Drupal\condition_test\FormController::getForm'
+    _form: '\Drupal\condition_test\FormController'
   requirements:
     _access: 'TRUE'
diff --git a/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php b/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php
index 03b918e..2c36a2f 100644
--- a/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php
+++ b/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php
@@ -30,12 +30,11 @@ public function getFormID() {
   }
 
   /**
-   * Provides a simple method the router can fire in order to invoke this form.
+   * Constructs a new \Drupal\condition_test\FormController object.
    */
-  public function getForm() {
+  public function __construct() {
     $manager = new ConditionManager(drupal_container()->getParameter('container.namespaces'));
     $this->condition = $manager->createInstance('node_type');
-    return drupal_get_form($this);
   }
 
   /**
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/BreakLockForm.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/BreakLockForm.php
index f8167e1..d826c9b 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/BreakLockForm.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/BreakLockForm.php
@@ -45,19 +45,6 @@ public function __construct(EntityManager $entity_manager, TempStoreFactory $tem
   }
 
   /**
-   * Creates a new instance of this form.
-   *
-   * @param \Drupal\views\ViewStorageInterface $view
-   *   The view being acted upon.
-   *
-   * @return array
-   *   The built form array.
-   */
-  public function getForm(ViewStorageInterface $view) {
-    return drupal_get_form($this, $view);
-  }
-
-  /**
    * Implements \Drupal\Core\Form\FormInterface::getFormID().
    */
   public function getFormID() {
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/DeleteForm.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/DeleteForm.php
index 3f38679..f9b7272 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/DeleteForm.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/DeleteForm.php
@@ -16,19 +16,6 @@
 class DeleteForm implements FormInterface {
 
   /**
-   * Creates a new instance of this form.
-   *
-   * @param \Drupal\views\ViewStorageInterface $view
-   *   The view being acted upon.
-   *
-   * @return array
-   *   The built form array.
-   */
-  public function getForm(ViewStorageInterface $view) {
-    return drupal_get_form($this, $view);
-  }
-
-  /**
    * Implements \Drupal\Core\Form\FormInterface::getFormID().
    */
   public function getFormID() {
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/SettingsFormBase.php b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/SettingsFormBase.php
index fba4fa1..0848040 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/Form/SettingsFormBase.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/Form/SettingsFormBase.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\views_ui\Form;
 
-use Drupal\Core\Config\ConfigFactory;
 use Drupal\system\SystemConfigFormBase;
 
 /**
@@ -24,22 +23,9 @@
 
   /**
    * Constructs a \Drupal\views_ui\Form\SettingsFormBase object.
-   *
-   * @param \Drupal\Core\Config\ConfigFactory $config_factory
-   *   The factory for the temp store object.
-   */
-  public function __construct(ConfigFactory $config_factory) {
-    $this->config = $config_factory->get('views.settings');
-  }
-
-  /**
-   * Creates a new instance of this form.
-   *
-   * @return array
-   *   The built form array.
    */
-  public function getForm() {
-    return drupal_get_form($this);
+  public function __construct() {
+    $this->config = drupal_container()->get('config.factory')->get('views.settings');
   }
 
 }
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 9c16c0b..d15cd0f 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
@@ -24,10 +24,6 @@ public function build(ContainerBuilder $container) {
       ->addArgument(new Reference('plugin.manager.entity'))
       ->addArgument(new Reference('views.views_data'))
       ->addArgument(new Reference('user.tempstore'));
-    $container->register('views_ui.form.basic_settings', 'Drupal\views_ui\Form\BasicSettingsForm')
-      ->addArgument(new Reference('config.factory'));
-    $container->register('views_ui.form.advanced_settings', 'Drupal\views_ui\Form\AdvancedSettingsForm')
-      ->addArgument(new Reference('config.factory'));
     $container->register('views_ui.form.breakLock', 'Drupal\views_ui\Form\BreakLockForm')
       ->addArgument(new Reference('plugin.manager.entity'))
       ->addArgument(new Reference('user.tempstore'));
diff --git a/core/modules/views/views_ui/views_ui.routing.yml b/core/modules/views/views_ui/views_ui.routing.yml
index dfb53ca..74cf32a 100644
--- a/core/modules/views/views_ui/views_ui.routing.yml
+++ b/core/modules/views/views_ui/views_ui.routing.yml
@@ -15,14 +15,14 @@ views_ui.add:
 views_ui.settings.basic:
   pattern: '/admin/structure/views/settings'
   defaults:
-    _controller: 'views_ui.form.basic_settings:getForm'
+    _form: 'Drupal\views_ui\Form\BasicSettingsForm'
   requirements:
     _permission: 'administer views'
 
 views_ui.settings.advanced:
   pattern: '/admin/structure/views/settings/advanced'
   defaults:
-    _controller: 'views_ui.form.advanced_settings:getForm'
+    _form: 'Drupal\views_ui\Form\AdvancedSettingsForm'
   requirements:
     _permission: 'administer views'
 
@@ -58,7 +58,7 @@ views_ui.clone:
 views_ui.delete:
   pattern: '/admin/structure/views/view/{view}/delete'
   defaults:
-    _controller: 'Drupal\views_ui\Form\DeleteForm::getForm'
+    _form: 'Drupal\views_ui\Form\DeleteForm'
   requirements:
     _permission: 'administer views'
 
@@ -104,7 +104,7 @@ views_ui.preview:
 views_ui.breakLock:
   pattern: '/admin/structure/views/view/{view}/break-lock'
   defaults:
-    _controller: 'views_ui.form.breakLock:getForm'
+    _form: 'views_ui.form.breakLock'
     display_id: NULL
   requirements:
     _permission: 'administer views'
