diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php b/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php
new file mode 100644
index 0000000..cca89bb
--- /dev/null
+++ b/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Form\SetCustomize.
+ */
+
+namespace Drupal\shortcut\Form;
+
+use Drupal\Core\ControllerInterface;
+use Drupal\Core\Entity\EntityManager;
+use Drupal\Core\Form\FormInterface;
+use Drupal\menu_link\MenuLinkStorageController;
+use Drupal\shortcut\Plugin\Core\Entity\Shortcut;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Builds the shortcut set customize form.
+ */
+class SetCustomize implements ControllerInterface, FormInterface {
+
+  /**
+   * The entity storage controller for menu links.
+   *
+   * @var \Drupal\menu_link\MenuLinkStorageController
+   */
+  protected $storageController;
+
+  /**
+   * Constructs a SetCustomize object.
+   *
+   * @param \Drupal\menu_link\MenuLinkStorageController $storage_controller
+   *   The entity manager.
+   */
+  public function __construct(MenuLinkStorageController $storage_controller) {
+    $this->storageController = $storage_controller;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.entity')->getStorageController('menu_link')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'shortcut_set_customize';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, Shortcut $shortcut = NULL) {
+    $form['#shortcut_set_name'] = $shortcut->id();
+    $form['shortcuts'] = array(
+      '#tree' => TRUE,
+      '#weight' => -20,
+      'links' => array(),
+    );
+
+    foreach ($shortcut->links as $uuid => $link) {
+      $mlid = $link->id();
+      $form['shortcuts']['links'][$mlid]['name']['#markup'] = l($link->link_title, $link->link_path);
+      $form['shortcuts']['links'][$mlid]['weight'] = array(
+        '#type' => 'weight',
+        '#title' => t('Weight for @title', array('@title' => $link->link_title)),
+        '#title_display' => 'invisible',
+        '#delta' => 50,
+        '#default_value' => $link['weight'],
+        '#attributes' => array('class' => array('shortcut-weight')),
+      );
+
+      $links['edit'] = array(
+        'title' => t('Edit'),
+        'href' => "admin/config/user-interface/shortcut/link/$mlid",
+      );
+      $links['delete'] = array(
+        'title' => t('Delete'),
+        'href' => "admin/config/user-interface/shortcut/link/$mlid/delete",
+      );
+      $form['shortcuts']['links'][$mlid]['operations'] = array(
+        '#type' => 'operations',
+        '#links' => $links,
+      );
+    }
+
+    $form['actions'] = array(
+      '#type' => 'actions',
+      '#access' => !empty($shortcut->links),
+    );
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save changes'),
+    );
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateform(array &$form, array &$form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $mlids = array_keys($form_state['values']['shortcuts']['links']);
+    $menu_links = $this->storageController->load($mlids);
+    foreach ($form_state['values']['shortcuts']['links'] as $mlid => $data) {
+      $link = $menu_links[$mlid];
+      debug($mlid);
+      debug($data['weight']);
+      $link->weight = $data['weight'];
+      $this->storageController->save($link);
+    }
+    drupal_set_message(t('The shortcut set has been updated.'));
+  }
+
+}
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php
index 2a9c397..29f2d69 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php
@@ -36,6 +36,20 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, U
         }
         return $entity->id() != 'default';
         break;
+      case 'customize':
+        // Sufficiently-privileged users can edit their currently displayed shortcut
+        // set, but not other sets. Shortcut administrators can edit any set.
+        if (user_access('administer shortcuts')) {
+          return TRUE;
+        }
+        if (user_access('customize shortcut links')) {
+          return !isset($entity) || $entity == shortcut_current_displayed_set();
+        }
+        return FALSE;
+        break;
+
+      default:
+        return FALSE;
     }
   }
 }
diff --git a/core/modules/shortcut/shortcut.admin.inc b/core/modules/shortcut/shortcut.admin.inc
index 2f7acf6..a341438 100644
--- a/core/modules/shortcut/shortcut.admin.inc
+++ b/core/modules/shortcut/shortcut.admin.inc
@@ -179,80 +179,6 @@ function shortcut_set_add() {
 }
 
 /**
- * Form callback: builds the form for customizing 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 $shortcut_set Drupal\shortcut\Plugin\Core\Entity\Shortcut
- *   An object representing the shortcut set which is being edited.
- *
- * @return
- *   An array representing the form definition.
- *
- * @ingroup forms
- * @see shortcut_set_customize_submit()
- */
-function shortcut_set_customize($form, &$form_state, $shortcut_set) {
-  $form['#shortcut_set_name'] = $shortcut_set->id();
-  $form['shortcuts'] = array(
-    '#tree' => TRUE,
-    '#weight' => -20,
-    'links' => array(),
-  );
-
-  foreach ($shortcut_set->links as $uuid => $link) {
-    $mlid = $link['mlid'];
-    $form['shortcuts']['links'][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']);
-    $form['shortcuts']['links'][$mlid]['weight'] = array(
-      '#type' => 'weight',
-      '#title' => t('Weight for @title', array('@title' => $link['link_title'])),
-      '#title_display' => 'invisible',
-      '#delta' => 50,
-      '#default_value' => $link['weight'],
-      '#attributes' => array('class' => array('shortcut-weight')),
-    );
-
-    $links['edit'] = array(
-      'title' => t('Edit'),
-      'href' => "admin/config/user-interface/shortcut/link/$mlid",
-    );
-    $links['delete'] = array(
-      'title' => t('Delete'),
-      'href' => "admin/config/user-interface/shortcut/link/$mlid/delete",
-    );
-    $form['shortcuts']['links'][$mlid]['operations'] = array(
-      '#type' => 'operations',
-      '#links' => $links,
-    );
-  }
-
-  $form['actions'] = array(
-    '#type' => 'actions',
-    '#access' => !empty($shortcut_set->links),
-  );
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save changes'),
-  );
-
-  return $form;
-}
-
-/**
- * Submit handler for shortcut_set_customize().
- */
-function shortcut_set_customize_submit($form, &$form_state) {
-  foreach ($form_state['values']['shortcuts']['links'] as $mlid => $data) {
-    $link = menu_link_load($mlid);
-    $link['weight'] = $data['weight'];
-    menu_link_save($link);
-  }
-  drupal_set_message(t('The shortcut set has been updated.'));
-}
-
-/**
  * Returns HTML for a shortcut set customization form.
  *
  * @param $variables
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index db284c5..af0a9d7 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -98,13 +98,7 @@ function shortcut_menu() {
   );
   $items['admin/config/user-interface/shortcut/manage/%shortcut_set'] = array(
     'title' => 'Edit shortcuts',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('shortcut_set_customize', 5),
-    'title callback' => 'entity_page_label',
-    'title arguments' => array(5),
-    'access callback' => 'shortcut_set_edit_access',
-    'access arguments' => array(5),
-    'file' => 'shortcut.admin.inc',
+    'route_name' => 'shortcut_set_customize',
   );
   $items['admin/config/user-interface/shortcut/manage/%shortcut_set/links'] = array(
     'title' => 'List links',
diff --git a/core/modules/shortcut/shortcut.routing.yml b/core/modules/shortcut/shortcut.routing.yml
index 761067f..0114cec 100644
--- a/core/modules/shortcut/shortcut.routing.yml
+++ b/core/modules/shortcut/shortcut.routing.yml
@@ -18,9 +18,17 @@ shortcut_set_admin:
     _content: 'Drupal\shortcut\Controller\ShortcutController::shortcutSetAdmin'
   requirements:
     _permission: 'administer shortcuts'
+
 shortcut_set_edit:
   pattern: '/admin/config/user-interface/shortcut/manage/{shortcut}/edit'
   defaults:
     _entity_form: 'shortcut.edit'
   requirements:
     _entity_access: 'shortcut.edit'
+
+shortcut_set_customize:
+  pattern: '/admin/config/user-interface/shortcut/manage/{shortcut}'
+  defaults:
+    _form: 'Drupal\shortcut\Form\SetCustomize'
+  requirements:
+    _entity_access: 'shortcut.customize'
