diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetEditAccessCheck.php b/core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetEditAccessCheck.php
deleted file mode 100644
index 283825a..0000000
--- a/core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetEditAccessCheck.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\shortcut\Access\ShortcutSetEditAccessCheck.
- */
-
-namespace Drupal\shortcut\Access;
-
-use Drupal\Core\Access\StaticAccessCheckInterface;
-use Drupal\Core\Session\AccountInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Provides an access check for shortcut link delete routes.
- */
-class ShortcutSetEditAccessCheck implements StaticAccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function appliesTo() {
-    return array('_access_shortcut_set_edit');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function access(Route $route, Request $request, AccountInterface $account) {
-    $account = \Drupal::currentUser();
-    $shortcut_set = $request->attributes->get('shortcut_set');
-    // Sufficiently-privileged users can edit their currently displayed shortcut
-    // set, but not other sets. Shortcut administrators can edit any set.
-    if ($account->hasPermission('administer shortcuts')) {
-      return static::ALLOW;
-    }
-    if ($account->hasPermission('customize shortcut links')) {
-      return !isset($shortcut_set) || $shortcut_set == shortcut_current_displayed_set() ? static::ALLOW : static::DENY;
-    }
-    return static::DENY;
-  }
-
-}
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetSwitchAccessCheck.php b/core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetSwitchAccessCheck.php
deleted file mode 100644
index d39f630..0000000
--- a/core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetSwitchAccessCheck.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\shortcut\Access\ShortcutSetSwitchAccessCheck.
- */
-
-namespace Drupal\shortcut\Access;
-
-use Drupal\Core\Access\StaticAccessCheckInterface;
-use Drupal\Core\Session\AccountInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Provides an access check for shortcut link delete routes.
- */
-class ShortcutSetSwitchAccessCheck implements StaticAccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function appliesTo() {
-    return array('_access_shortcut_set_switch');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function access(Route $route, Request $request, AccountInterface $account) {
-    if ($account->hasPermission('administer shortcuts')) {
-      // Administrators can switch anyone's shortcut set.
-      return static::ALLOW;
-    }
-
-    if (!$account->hasPermission('switch shortcut sets')) {
-      // The user has no permission to switch anyone's shortcut set.
-      return static::DENY;
-    }
-
-    $user = $request->attributes->get('account');
-    if (!isset($user) || $user->id() == $account->id()) {
-      // Users with the 'switch shortcut sets' permission can switch their own
-      // shortcuts sets.
-      return static::ALLOW;
-    }
-    return static::DENY;
-  }
-
-}
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutForm.php b/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutForm.php
deleted file mode 100644
index 9c2cf5e..0000000
--- a/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutForm.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\shortcut\Form\ShortcutForm.
- */
-
-namespace Drupal\shortcut\Form;
-
-use Drupal\user\UserInterface;
-
-/**
- * Temporary form controller for shortcut module.
- */
-class ShortcutForm {
-
-  /**
-   * Wraps shortcut_set_switch().
-   *
-   * @todo Remove shortcut_set_switch().
-   */
-  public function overview(UserInterface $user) {
-    module_load_include('admin.inc', 'shortcut');
-    return drupal_get_form('shortcut_set_switch', $user);
-  }
-
-}
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Form/SwitchShortcutSet.php b/core/modules/shortcut/lib/Drupal/shortcut/Form/SwitchShortcutSet.php
new file mode 100644
index 0000000..d301477
--- /dev/null
+++ b/core/modules/shortcut/lib/Drupal/shortcut/Form/SwitchShortcutSet.php
@@ -0,0 +1,252 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Form\SwitchShortcutSet.
+ */
+
+namespace Drupal\shortcut\Form;
+
+use Drupal\Component\Utility\String;
+use Drupal\Core\Access\AccessInterface;
+use Drupal\Core\Form\FormBase;
+use Drupal\shortcut\ShortcutSetStorageControllerInterface;
+use Drupal\user\UserInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Builds the shortcut set switch form.
+ */
+class SwitchShortcutSet extends FormBase {
+
+  /**
+   * The account the shortcut set is for.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $user;
+
+  /**
+   * The shortcut storage controller.
+   *
+   * @var \Drupal\shortcut\ShortcutSetStorageControllerInterface
+   */
+  protected $storageController;
+
+  /**
+   * Constructs a SwitchShortcutSet object.
+   *
+   * @param \Drupal\shortcut\ShortcutSetStorageControllerInterface $shortcut_set_storage_controller
+   *   The shortcut set storage controller.
+   */
+  public function __construct(ShortcutSetStorageControllerInterface $shortcut_set_storage_controller) {
+    $this->storageController = $shortcut_set_storage_controller;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager')->getStorageController('shortcut_set')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'shortcut_set_switch';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, UserInterface $user = NULL) {
+    $account = $this->currentUser();
+
+    $this->user = $user;
+
+    // Prepare the list of shortcut sets.
+    $options = array_map(function ($set) {
+      return String::checkPlain($set->label());
+    }, $this->storageController->loadMultiple());
+
+    $current_set = shortcut_current_displayed_set($this->user);
+
+    // Only administrators can add shortcut sets.
+    $add_access = $account->hasPermission('administer shortcuts');
+    if ($add_access) {
+      $options['new'] = $this->t('New set');
+    }
+
+    $account_is_user = $this->user->id() == $account->id();
+    if (count($options) > 1) {
+      $form['set'] = array(
+        '#type' => 'radios',
+        '#title' => $account_is_user ? $this->t('Choose a set of shortcuts to use') : $this->t('Choose a set of shortcuts for this user'),
+        '#options' => $options,
+        '#default_value' => $current_set->id(),
+      );
+
+      $form['label'] = array(
+        '#type' => 'textfield',
+        '#title' => $this->t('Label'),
+        '#title_display' => 'invisible',
+        '#description' => $this->t('The new set is created by copying items from your default shortcut set.'),
+        '#access' => $add_access,
+      );
+      $form['id'] = array(
+        '#type' => 'machine_name',
+        '#machine_name' => array(
+          'exists' => array($this, 'exists'),
+          'replace_pattern' => '[^a-z0-9-]+',
+          'replace' => '-',
+        ),
+        // This ID could be used for menu name.
+        '#maxlength' => 23,
+        '#states' => array(
+          'required' => array(
+            ':input[name="set"]' => array('value' => 'new'),
+          ),
+        ),
+        '#required' => FALSE,
+      );
+
+      if (!$account_is_user) {
+        $default_set = $this->storageController->getDefaultSet($this->user);
+        $form['new']['#description'] = $this->t('The new set is created by copying items from the %default set.', array('%default' => $default_set->label()));
+      }
+
+      $form['#attached'] = array(
+        'library' => array(array('shortcut', 'drupal.shortcut.admin')),
+      );
+
+      $form['actions'] = array('#type' => 'actions');
+      $form['actions']['submit'] = array(
+        '#type' => 'submit',
+        '#value' => $this->t('Change set'),
+      );
+    }
+    else {
+      // There is only 1 option, so output a message in the $form array.
+      $form['info'] = array(
+        '#markup' => '<p>' . $this->t('You are currently using the %set-name shortcut set.', array('%set-name' => $current_set->label())) . '</p>',
+      );
+    }
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+    if ($form_state['values']['set'] == 'new') {
+      // Check to prevent creating a shortcut set with an empty title.
+      if (trim($form_state['values']['label']) == '') {
+        $this->setFormError('new', $form_state, $this->t('The new set label is required.'));
+      }
+      // Check to prevent a duplicate title.
+      if (shortcut_set_title_exists($form_state['values']['label'])) {
+        $this->setFormError('label', $form_state, $this->t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['label'])));
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $account = $this->currentUser();
+
+    $account_is_user = $this->user->id() == $account->id();
+    if ($form_state['values']['set'] == 'new') {
+      // Save a new shortcut set with links copied from the user's default set.
+      $default_set = $this->storageController->getDefaultSet($this->user);
+      $set = $this->storageController->create(array(
+        'id' => $form_state['values']['id'],
+        'label' => $form_state['values']['label'],
+        'links' => $default_set->getShortcuts(),
+      ));
+      $set->save();
+      $replacements = array(
+        '%user' => $this->user->label(),
+        '%set_name' => $set->label(),
+        // @todo Convert once https://drupal.org/node/2073813 is in.
+        '@switch-url' => $this->urlGenerator()->generateFromPath($this->getRequest()->attributes->get('_system_path')),
+      );
+      if ($account_is_user) {
+        // Only administrators can create new shortcut sets, so we know they have
+        // access to switch back.
+        drupal_set_message($this->t('You are now using the new %set_name shortcut set. You can edit it from this page or <a href="@switch-url">switch back to a different one.</a>', $replacements));
+      }
+      else {
+        drupal_set_message($this->t('%user is now using a new shortcut set called %set_name. You can edit it from this page.', $replacements));
+      }
+      $form_state['redirect_route'] = array(
+        'route_name' => 'shortcut.set_customize',
+        'route_parameters' => array(
+          'shortcut_set' => $set->id(),
+        ),
+      );
+    }
+    else {
+      // Switch to a different shortcut set.
+      $set = $this->storageController->load($form_state['values']['set']);
+      $replacements = array(
+        '%user' => $this->user->label(),
+        '%set_name' => $set->label(),
+      );
+      drupal_set_message($account_is_user ? $this->t('You are now using the %set_name shortcut set.', $replacements) : $this->t('%user is now using the %set_name shortcut set.', $replacements));
+    }
+
+    // Assign the shortcut set to the provided user account.
+    $this->storageController->assignUser($set, $this->user);
+  }
+
+  /**
+   * Determines if a shortcut set exists already.
+   *
+   * @param string $id
+   *   The set ID to check.
+   *
+   * @return bool
+   *   TRUE if the shortcut set exists, FALSE otherwise.
+   */
+  public function exists($id) {
+    return (bool) $this->storageController->getQuery()
+      ->condition('id', $id)
+      ->execute();
+  }
+
+  /**
+   * Checks access for the shortcut set switch form.
+   *
+   * @param \Drupal\user\UserInterface $user
+   *   The user whose shortcut sets are being switched.
+   *
+   * @return bool|null
+   *   AccessInterface::ALLOW, AccessInterface::DENY, or AccessInterface::KILL.
+   */
+  public function checkAccess(UserInterface $user) {
+    $account = $this->currentUser();
+    if ($account->hasPermission('administer shortcuts')) {
+      // Administrators can switch anyone's shortcut set.
+      return AccessInterface::ALLOW;
+    }
+
+    if (!$account->hasPermission('switch shortcut sets')) {
+      // The user has no permission to switch anyone's shortcut set.
+      return AccessInterface::DENY;
+    }
+
+    if ($account->id() == $user->id()) {
+      // Users with the 'switch shortcut sets' permission can switch their own
+      // shortcuts sets.
+      return AccessInterface::ALLOW;
+    }
+    return AccessInterface::DENY;
+  }
+
+}
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageController.php
index 76f9582..1c04d91 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageController.php
@@ -7,7 +7,14 @@
 
 namespace Drupal\shortcut;
 
+use Drupal\Component\Uuid\UuidInterface;
+use Drupal\Core\Config\ConfigFactory;
 use Drupal\Core\Config\Entity\ConfigStorageController;
+use Drupal\Core\Config\StorageInterface;
+use Drupal\Core\Entity\Query\QueryFactory;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines a storage controller for shortcut_set entities.
@@ -15,6 +22,52 @@
 class ShortcutSetStorageController extends ConfigStorageController implements ShortcutSetStorageControllerInterface {
 
   /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * Constructs a ShortcutSetStorageController object.
+   *
+   * @param string $entity_type
+   *   The entity type for which the instance is created.
+   * @param array $entity_info
+   *   An array of entity info for the entity type.
+   * @param \Drupal\Core\Config\ConfigFactory $config_factory
+   *   The config factory service.
+   * @param \Drupal\Core\Config\StorageInterface $config_storage
+   *   The config storage service.
+   * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query_factory
+   *   The entity query factory.
+   * @param \Drupal\Component\Uuid\UuidInterface $uuid_service
+   *   The UUID service.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   */
+  public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, UuidInterface $uuid_service, ModuleHandlerInterface $module_handler) {
+    parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory, $uuid_service);
+
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) {
+    return new static(
+      $entity_type,
+      $entity_info,
+      $container->get('config.factory'),
+      $container->get('config.storage'),
+      $container->get('entity.query'),
+      $container->get('uuid'),
+      $container->get('module_handler')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function deleteAssignedShortcutSets(ShortcutSetInterface $entity) {
@@ -63,4 +116,24 @@ public function countAssignedUsers(ShortcutSetInterface $shortcut_set) {
     return db_query('SELECT COUNT(*) FROM {shortcut_set_users} WHERE set_name = :name', array(':name' => $shortcut_set->id()))->fetchField();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultSet(AccountInterface $account) {
+    // Allow modules to return a default shortcut set name. Since we can only
+    // have one, we allow the last module which returns a valid result to take
+    // precedence. If no module returns a valid set, fall back on the site-wide
+    // default, which is the lowest-numbered shortcut set.
+    $suggestions = array_reverse($this->moduleHandler->invokeAll('shortcut_default_set', $account));
+    $suggestions[] = 'default';
+    $shortcut_set = NULL;
+    foreach ($suggestions as $name) {
+      if ($shortcut_set = $this->load($name)) {
+        break;
+      }
+    }
+
+    return $shortcut_set;
+  }
+
 }
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageControllerInterface.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageControllerInterface.php
index b4e9d97..ab1e1eb 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageControllerInterface.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetStorageControllerInterface.php
@@ -8,6 +8,7 @@
 namespace Drupal\shortcut;
 
 use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\shortcut\ShortcutSetInterface;
 
 /**
@@ -69,4 +70,16 @@ public function getAssignedToUser($account);
    *   The number of users who have this set assigned to them.
    */
   public function countAssignedUsers(ShortcutSetInterface $shortcut_set);
+
+  /**
+   * Gets the default shortcut set for a given user account.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The user account whose default shortcut set will be returned.
+   *
+   * @return \Drupal\shortcut\ShortcutSetInterface
+   *   An object representing the default shortcut set.
+   */
+  public function getDefaultSet(AccountInterface $account);
+
 }
diff --git a/core/modules/shortcut/shortcut.admin.inc b/core/modules/shortcut/shortcut.admin.inc
deleted file mode 100644
index 876c9f8..0000000
--- a/core/modules/shortcut/shortcut.admin.inc
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-
-/**
- * @file
- * Administrative page callbacks for the shortcut module.
- */
-
-/**
- * Form callback: builds the form for switching shortcut sets.
- *
- * @param $form
- *   An associative array containing the structure of the form.
- * @param $form_state
- *   An associative array containing the current state of the form.
- * @param $account
- *   (optional) The user account whose shortcuts will be switched. Defaults to
- *   the current logged-in user.
- *
- * @return
- *   An array representing the form definition.
- *
- * @ingroup forms
- * @see shortcut_set_switch_validate()
- * @see shortcut_set_switch_submit()
- *
- * @deprecated Use \Drupal\shortcut\Form\ShortcutForm::overview()
- */
-function shortcut_set_switch($form, &$form_state, $account = NULL) {
-  $user = \Drupal::currentUser();
-
-  if (!isset($account)) {
-    $account = $user;
-  }
-
-  // Prepare the list of shortcut sets.
-  $sets = entity_load_multiple('shortcut_set');
-  $current_set = shortcut_current_displayed_set($account);
-
-  $options = array();
-  foreach ($sets as $name => $set) {
-    $options[$name] = check_plain($set->label());
-  }
-
-  // Only administrators can add shortcut sets.
-  $add_access = $user->hasPermission('administer shortcuts');
-  if ($add_access) {
-    $options['new'] = t('New set');
-  }
-
-  if (count($options) > 1) {
-    $form['account'] = array(
-      '#type' => 'value',
-      '#value' => $account,
-    );
-
-    $form['set'] = array(
-      '#type' => 'radios',
-      '#title' => $user->id() == $account->id() ? t('Choose a set of shortcuts to use') : t('Choose a set of shortcuts for this user'),
-      '#options' => $options,
-      '#default_value' => $current_set->id(),
-    );
-
-    $form['label'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Label'),
-      '#title_display' => 'invisible',
-      '#description' => t('The new set is created by copying items from your default shortcut set.'),
-      '#access' => $add_access,
-    );
-    $form['id'] = array(
-      '#type' => 'machine_name',
-      '#machine_name' => array(
-        'exists' => 'shortcut_set_load',
-        'source' => array('label'),
-        'replace_pattern' => '[^a-z0-9-]+',
-        'replace' => '-',
-      ),
-      // This id could be used for menu name.
-      '#maxlength' => 23,
-      '#states' => array(
-        'required' => array(
-          ':input[name="set"]' => array('value' => 'new'),
-        ),
-      ),
-      '#required' => FALSE,
-    );
-
-    if ($user->id() != $account->id()) {
-      $default_set = shortcut_default_set($account);
-      $form['new']['#description'] = t('The new set is created by copying items from the %default set.', array('%default' => $default_set->label()));
-    }
-
-    $form['#attached'] = array(
-      'library' => array(array('shortcut', 'drupal.shortcut.admin')),
-    );
-
-    $form['actions'] = array('#type' => 'actions');
-    $form['actions']['submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Change set'),
-    );
-  }
-  else {
-    // There is only 1 option, so output a message in the $form array.
-    $form['info'] = array(
-      '#markup' => '<p>' . t('You are currently using the %set-name shortcut set.', array('%set-name' => $current_set->label())) . '</p>',
-    );
-  }
-
-  return $form;
-}
-
-/**
- * Validation handler for shortcut_set_switch().
- */
-function shortcut_set_switch_validate($form, &$form_state) {
-  if ($form_state['values']['set'] == 'new') {
-    // Check to prevent creating a shortcut set with an empty title.
-    if (trim($form_state['values']['label']) == '') {
-      form_set_error('new', $form_state, t('The new set label is required.'));
-    }
-    // Check to prevent a duplicate title.
-    if (shortcut_set_title_exists($form_state['values']['label'])) {
-      form_set_error('label', $form_state, t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['label'])));
-    }
-  }
-}
-
-/**
- * Submit handler for shortcut_set_switch().
- */
-function shortcut_set_switch_submit($form, &$form_state) {
-  $user = \Drupal::currentUser();
-  $account = $form_state['values']['account'];
-
-  if ($form_state['values']['set'] == 'new') {
-    // Save a new shortcut set with links copied from the user's default set.
-    $default_set = shortcut_default_set($account);
-    $set = entity_create('shortcut_set', array(
-      'id' => $form_state['values']['id'],
-      'label' => $form_state['values']['label'],
-    ));
-    $set->save();
-    $replacements = array(
-      '%user' => $account->getUsername(),
-      '%set_name' => $set->label(),
-      '@switch-url' => url(current_path()),
-    );
-    if ($account->id() == $user->id()) {
-      // Only administrators can create new shortcut sets, so we know they have
-      // access to switch back.
-      drupal_set_message(t('You are now using the new %set_name shortcut set. You can edit it from this page or <a href="@switch-url">switch back to a different one.</a>', $replacements));
-    }
-    else {
-      drupal_set_message(t('%user is now using a new shortcut set called %set_name. You can edit it from this page.', $replacements));
-    }
-    $form_state['redirect_route'] = array(
-      'route_name' => 'shortcut.set_customize',
-      'route_parameters' => array(
-        'shortcut_set' => $set->id(),
-      ),
-    );
-  }
-  else {
-    // Switch to a different shortcut set.
-    $set = shortcut_set_load($form_state['values']['set']);
-    $replacements = array(
-      '%user' => $account->getUsername(),
-      '%set_name' => $set->label(),
-    );
-    drupal_set_message($account->id() == $user->id() ? t('You are now using the %set_name shortcut set.', $replacements) : t('%user is now using the %set_name shortcut set.', $replacements));
-  }
-
-  // Assign the shortcut set to the provided user account.
-  shortcut_set_assign_user($set, $account);
-}
diff --git a/core/modules/shortcut/shortcut.local_tasks.yml b/core/modules/shortcut/shortcut.local_tasks.yml
index e25ecd7..ef0c0e4 100644
--- a/core/modules/shortcut/shortcut.local_tasks.yml
+++ b/core/modules/shortcut/shortcut.local_tasks.yml
@@ -1,5 +1,5 @@
-shortcut.overview:
-  route_name: shortcut.overview
+shortcut.set_switch:
+  route_name: shortcut.set_switch
   tab_root_id: user.view
   title: 'Shortcuts'
 
diff --git a/core/modules/shortcut/shortcut.routing.yml b/core/modules/shortcut/shortcut.routing.yml
index a702470..bb7df7a 100644
--- a/core/modules/shortcut/shortcut.routing.yml
+++ b/core/modules/shortcut/shortcut.routing.yml
@@ -67,11 +67,11 @@ shortcut.link_delete:
   requirements:
     _entity_access: 'shortcut.delete'
 
-shortcut.overview:
+shortcut.set_switch:
   path: '/user/{user}/shortcuts'
   defaults:
-    _content: '\Drupal\shortcut\Form\ShortcutForm::overview'
+    _form: 'Drupal\shortcut\Form\SwitchShortcutSet'
     _title: 'Shortcuts'
   requirements:
-    _access_shortcut_set_switch: 'TRUE'
+    _custom_access: 'Drupal\shortcut\Form\SwitchShortcutSet::checkAccess'
 
diff --git a/core/modules/shortcut/shortcut.services.yml b/core/modules/shortcut/shortcut.services.yml
deleted file mode 100644
index 3a04d99..0000000
--- a/core/modules/shortcut/shortcut.services.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-services:
-  access_check.shortcut.shortcut_set_edit:
-    class: Drupal\shortcut\Access\ShortcutSetEditAccessCheck
-    tags:
-      - { name: access_check }
-
-  access_check.shortcut.shortcut_set_switch:
-    class: Drupal\shortcut\Access\ShortcutSetSwitchAccessCheck
-    tags:
-      - { name: access_check }
diff --git a/core/modules/shortcut/tests/Drupal/shortcut/Tests/Menu/ShortcutLocalTasksTest.php b/core/modules/shortcut/tests/Drupal/shortcut/Tests/Menu/ShortcutLocalTasksTest.php
index edc5e8b..bc8ef95 100644
--- a/core/modules/shortcut/tests/Drupal/shortcut/Tests/Menu/ShortcutLocalTasksTest.php
+++ b/core/modules/shortcut/tests/Drupal/shortcut/Tests/Menu/ShortcutLocalTasksTest.php
@@ -40,7 +40,7 @@ public function setUp() {
    */
   public function testShortcutPageLocalTasks($route) {
     $tasks = array(
-      0 => array('shortcut.overview', 'user.view', 'user.edit',),
+      0 => array('shortcut.set_switch', 'user.view', 'user.edit',),
     );
     $this->assertLocalTasks($route, $tasks);
   }
@@ -52,7 +52,7 @@ public function getShortcutPageRoutes() {
     return array(
       array('user.view'),
       array('user.edit'),
-      array('shortcut.overview'),
+      array('shortcut.set_switch'),
     );
   }
 
