diff --git a/core/lib/Drupal/Core/ControllerResolver.php b/core/lib/Drupal/Core/ControllerResolver.php
index c1674fb..5435560 100644
--- a/core/lib/Drupal/Core/ControllerResolver.php
+++ b/core/lib/Drupal/Core/ControllerResolver.php
@@ -74,7 +74,14 @@ protected function createController($controller) {
         throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
       }
 
-      $controller = new $class();
+      // If the controller has a factory method named 'create', pass the
+      // container to it in order to instantiate the class.
+      if (method_exists($class, 'create')) {
+        $controller = $class::create($this->container);
+      }
+      else {
+        $controller = new $class();
+      }
       if ($controller instanceof ContainerAwareInterface) {
         $controller->setContainer($this->container);
       }
diff --git a/core/modules/user/lib/Drupal/user/UserAutocompleteController.php b/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
index 9b668bf..ae472e2 100644
--- a/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
+++ b/core/modules/user/lib/Drupal/user/UserAutocompleteController.php
@@ -8,6 +8,7 @@
 
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\DependencyInjection\Container;
 
 /**
  * Controller routines for taxonomy user routes.
@@ -32,6 +33,15 @@ public function __construct(UserAutocomplete $user_autocomplete) {
   }
 
   /**
+   * @todo.
+   */
+  public static function create(Container $container) {
+    return new static(
+      $container->get('user.autocomplete')
+    );
+  }
+
+  /**
    * Returns response for the user autocompletion.
    *
    * @param \Symfony\Component\HttpFoundation\Request $request
diff --git a/core/modules/user/lib/Drupal/user/UserBundle.php b/core/modules/user/lib/Drupal/user/UserBundle.php
index 6cf5f52..f7c4a88 100644
--- a/core/modules/user/lib/Drupal/user/UserBundle.php
+++ b/core/modules/user/lib/Drupal/user/UserBundle.php
@@ -27,8 +27,6 @@ public function build(ContainerBuilder $container) {
     $container
       ->register('user.data', 'Drupal\user\UserData')
       ->addArgument(new Reference('database'));
-    $container->register('user.autocomplete_controller', 'Drupal\user\UserAutocompleteController')
-      ->addArgument(new Reference('user.autocomplete'));
     $container->register('user.autocomplete', 'Drupal\user\UserAutocomplete')
       ->addArgument(new Reference('database'))
       ->addArgument(new Reference('config.factory'));
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index ad70759..34b6059 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -8,13 +8,13 @@ user_register:
 user_autocomplete:
   pattern: '/user/autocomplete'
   defaults:
-    _controller: 'user.autocomplete_controller:autocompleteUser'
+    _controller: '\Drupal\user\UserAutocompleteController::autocompleteUser'
   requirements:
     _permission: 'access user profiles'
 
 user_autocomplete_anonymous:
   pattern: '/user/autocomplete/anonymous'
   defaults:
-    _controller: 'user.autocomplete_controller:autocompleteUserAnonymous'
+    _controller: '\Drupal\user\UserAutocompleteController::autocompleteUserAnonymous'
   requirements:
     _permission: 'access user profiles'
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..434f63b 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
@@ -11,6 +11,7 @@
 use Drupal\views\ViewStorageInterface;
 use Drupal\Core\Entity\EntityManager;
 use Drupal\user\TempStoreFactory;
+use Symfony\Component\DependencyInjection\Container;
 
 /**
  * Builds the form to break the lock of an edited view.
@@ -45,6 +46,16 @@ public function __construct(EntityManager $entity_manager, TempStoreFactory $tem
   }
 
   /**
+   * @todo.
+   */
+  public static function create(Container $container) {
+    return new static(
+      $container->get('plugin.manager.entity'),
+      $container->get('user.tempstore')
+    );
+  }
+
+  /**
    * Creates a new instance of this form.
    *
    * @param \Drupal\views\ViewStorageInterface $view
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..979dc34 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
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Config\ConfigFactory;
 use Drupal\system\SystemConfigFormBase;
+use Symfony\Component\DependencyInjection\Container;
 
 /**
  * Form builder for the advanced admin settings page.
@@ -33,6 +34,15 @@ public function __construct(ConfigFactory $config_factory) {
   }
 
   /**
+   * @todo.
+   */
+  public static function create(Container $container) {
+    return new static(
+      $container->get('config.factory')
+    );
+  }
+
+  /**
    * Creates a new instance of this form.
    *
    * @return array
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 b714ab9..d5e092f 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
@@ -14,6 +14,7 @@
 use Drupal\user\TempStore;
 use Drupal\user\TempStoreFactory;
 use Drupal\Core\Entity\EntityManager;
+use Symfony\Component\DependencyInjection\Container;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\RedirectResponse;
@@ -66,6 +67,17 @@ public function __construct(EntityManager $entity_manager, ViewsDataCache $views
   }
 
   /**
+   * @todo.
+   */
+  public static function create(Container $container) {
+    return new static(
+      $container->get('plugin.manager.entity'),
+      $container->get('views.views_data'),
+      $container->get('user.tempstore')
+    );
+  }
+
+  /**
    * Lists all of the views.
    *
    * @return array
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..3d001a6 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
@@ -20,17 +20,6 @@ class ViewsUiBundle extends Bundle {
    * Overrides \Symfony\Component\HttpKernel\Bundle\Bundle::build().
    */
   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'));
-    $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'));
     $container->register('paramconverter.views_ui', 'Drupal\views_ui\ParamConverter\ViewUIConverter')
       ->addArgument(new Reference('user.tempstore'))
       ->addTag('paramconverter');
diff --git a/core/modules/views/views_ui/views_ui.routing.yml b/core/modules/views/views_ui/views_ui.routing.yml
index ed597c2..dbdc128 100644
--- a/core/modules/views/views_ui/views_ui.routing.yml
+++ b/core/modules/views/views_ui/views_ui.routing.yml
@@ -1,49 +1,49 @@
 views_ui.list:
   pattern: '/admin/structure/views'
   defaults:
-    _controller: 'views_ui.controller:listing'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::listing'
   requirements:
     _permission: 'administer views'
 
 views_ui.add:
   pattern: '/admin/structure/views/add'
   defaults:
-    _controller: 'views_ui.controller:add'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::add'
   requirements:
     _permission: 'administer views'
 
 views_ui.settings.basic:
   pattern: '/admin/structure/views/settings'
   defaults:
-    _controller: 'views_ui.form.basic_settings:getForm'
+    _controller: '\Drupal\views_ui\Form\BasicSettingsForm::getForm'
   requirements:
     _permission: 'administer views'
 
 views_ui.settings.advanced:
   pattern: '/admin/structure/views/settings/advanced'
   defaults:
-    _controller: 'views_ui.form.advanced_settings:getForm'
+    _controller: '\Drupal\views_ui\Form\AdvancedSettingsForm::getForm'
   requirements:
     _permission: 'administer views'
 
 views_ui.reports.fields:
   pattern: '/admin/reports/fields/views-fields'
   defaults:
-    _controller: 'views_ui.controller:reportFields'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::reportFields'
   requirements:
     _permission: 'administer views'
 
 views_ui.reports.plugins:
   pattern: '/admin/reports/views-plugins'
   defaults:
-    _controller: 'views_ui.controller:reportPlugins'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::reportPlugins'
   requirements:
     _permission: 'administer views'
 
 views_ui.operation:
   pattern: '/admin/structure/views/view/{view}/{op}'
   defaults:
-    _controller: 'views_ui.controller:ajaxOperation'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::ajaxOperation'
   requirements:
     _permission: 'administer views'
     op: 'enable|disable'
@@ -51,7 +51,7 @@ views_ui.operation:
 views_ui.clone:
   pattern: '/admin/structure/views/view/{view}/clone'
   defaults:
-    _controller: 'views_ui.controller:cloneForm'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::cloneForm'
   requirements:
     _permission: 'administer views'
 
@@ -65,7 +65,7 @@ views_ui.delete:
 views_ui.autocomplete:
   pattern: '/admin/views/ajax/autocomplete/tag'
   defaults:
-    _controller: 'views_ui.controller:autocompleteTag'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::autocompleteTag'
   requirements:
     _permission: 'administer views'
 
@@ -75,7 +75,7 @@ views_ui.edit:
     tempstore:
       view: 'views'
   defaults:
-    _controller: 'views_ui.controller:edit'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::edit'
   requirements:
     _permission: 'administer views'
 
@@ -85,7 +85,7 @@ views_ui.edit.display:
     tempstore:
       view: 'views'
   defaults:
-    _controller: 'views_ui.controller:edit'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::edit'
     display_id: NULL
   requirements:
     _permission: 'administer views'
@@ -96,7 +96,7 @@ views_ui.preview:
     tempstore:
       view: 'views'
   defaults:
-    _controller: 'views_ui.controller:preview'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::preview'
     display_id: NULL
   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'
+    _controller: '\Drupal\views_ui\Form\BreakLockForm::getForm'
     display_id: NULL
   requirements:
     _permission: 'administer views'
@@ -115,7 +115,7 @@ views_ui.ajaxForm:
     tempstore:
       view: 'views'
   defaults:
-    _controller: 'views_ui.controller:ajaxForm'
+    _controller: '\Drupal\views_ui\Routing\ViewsUIController::ajaxForm'
     type: NULL
     id: NULL
   requirements:
