diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index be83839..9d1c173 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -7,11 +7,13 @@
 
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Access\AccessResult;
-use Drupal\Core\Cache\Cache;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
 use Drupal\shortcut\Entity\ShortcutSet;
 use Drupal\shortcut\ShortcutSetInterface;
+use Drupal\user\Entity\User;
+use Drupal\user\UserInterface;
 
 /**
  * Implements hook_help().
@@ -53,56 +55,47 @@ function shortcut_help($route_name, RouteMatchInterface $route_match) {
  *
  * @return \Drupal\Core\Access\AccessResultInterface
  *   The access result.
+ *
+ * @deprecated
+ *   Deprecated in 8.x, will be removed in 9.x. Use
+ *   $shortcut_set->access('update') directly instead.
  */
 function shortcut_set_edit_access(ShortcutSetInterface $shortcut_set = NULL) {
-  $account = \Drupal::currentUser();
-
-  // Shortcut administrators can edit any set.
-  if ($account->hasPermission('administer shortcuts')) {
-    return AccessResult::allowed()->cachePerPermissions();
+  if (!isset($shortcut_set)) {
+    /** @var \Drupal\shortcut\ShortcutSetStorageInterface $shortcut_set_storage */
+    $shortcut_set_storage = \Drupal::entityManager()->getStorage('shortcut_set');
+    $shortcut_set = $shortcut_set_storage->getCurrentSet(\Drupal::currentUser());
   }
-
-  // Sufficiently-privileged users can edit their currently displayed shortcut
-  // set, but not other sets. They must also be able to access shortcuts.
-  $may_edit_current_shortcut_set = $account->hasPermission('customize shortcut links') && (!isset($shortcut_set) || $shortcut_set == shortcut_current_displayed_set()) && $account->hasPermission('access shortcuts');
-  return AccessResult::allowedIf($may_edit_current_shortcut_set)->cachePerPermissions();
+  return $shortcut_set->access('update', NULL, TRUE);
 }
 
 /**
- * Access callback for switching the shortcut set assigned to a user account.
- *
- * @param object $account
- *   (optional) The user account whose shortcuts will be switched. If not set,
- *   permissions will be checked for switching the logged-in user's own
- *   shortcut set.
- *
- * @return \Drupal\Core\Access\AccessResultInterface
- *   The access result.
+ * Implements hook_ENTITY_TYPE_access() for the 'user' entity type.
  */
-function shortcut_set_switch_access($account = NULL) {
-  $user = \Drupal::currentUser();
+function shortcut_user_access(UserInterface $user, $operation, AccountInterface $account, $langcode) {
+  // Only react to the 'switch shortcut set' operation.
+  if ($operation !== 'switch_shortcut_set') {
+    return AccessResult::neutral();
+  }
 
-  if ($user->hasPermission('administer shortcuts')) {
+  if ($account->hasPermission('administer shortcuts')) {
     // Administrators can switch anyone's shortcut set.
     return AccessResult::allowed()->cachePerPermissions();
   }
 
-  if (!$user->hasPermission('access shortcuts')) {
+  if (!$account->hasPermission('access shortcuts')) {
     // The user has no permission to use shortcuts.
     return AccessResult::neutral()->cachePerPermissions();
   }
 
-  if (!$user->hasPermission('switch shortcut sets')) {
+  if (!$account->hasPermission('switch shortcut sets')) {
     // The user has no permission to switch anyone's shortcut set.
     return AccessResult::neutral()->cachePerPermissions();
   }
 
   // Users with the 'switch shortcut sets' permission can switch their own
   // shortcuts sets.
-  if (!isset($account)) {
-    return AccessResult::allowed()->cachePerPermissions();
-  }
-  else if ($user->id() == $account->id()) {
+  if ($user->id() == $account->id()) {
     return AccessResult::allowed()->cachePerPermissions()->cachePerUser();
   }
 
@@ -111,6 +104,30 @@ function shortcut_set_switch_access($account = NULL) {
 }
 
 /**
+ * Access callback for switching the shortcut set assigned to a user account.
+ *
+ * @param \Drupal\Core\Session\AccountInterface|null $account
+ *   (optional) The user account whose shortcuts will be switched. If not set,
+ *   permissions will be checked for switching the logged-in user's own
+ *   shortcut set.
+ *
+ * @return \Drupal\Core\Access\AccessResultInterface
+ *   The access result.
+ *
+ * @deprecated
+ *   Deprecated in 8.x, will be removed in 9.x. Use
+ *   $user->access('switch_shortcut_set') with a user entity instead.
+ */
+function shortcut_set_switch_access(AccountInterface $account = NULL) {
+  if (!$account) {
+    $account = \Drupal::currentUser();
+  }
+  /** @var \Drupal\user\UserInterface $user */
+  $user = User::load($account->id());
+  return $user->access('switch_shortcut_set', NULL, TRUE);
+}
+
+/**
  * Assigns a user to a particular shortcut set.
  *
  * @param $shortcut_set Drupal\shortcut\Entity\Shortcut
@@ -160,32 +177,20 @@ function shortcut_set_unassign_user($account) {
  *   An object representing the shortcut set that should be displayed to the
  *   current user. If the user does not have an explicit shortcut set defined,
  *   the default set is returned.
+ *
+ * @deprecated
+ *   Deprecated in 8.x, will be removed in 9.x. Use
+ *   ShortcutSetStorageInterface::getCurrentSet() directly.
+ *
+ * @see \Drupal\shortcut\ShortcutSetStorageInterface::getCurrentSet()
  */
 function shortcut_current_displayed_set($account = NULL) {
-  $shortcut_sets = &drupal_static(__FUNCTION__, array());
-  $user = \Drupal::currentUser();
-  if (!isset($account)) {
-    $account = $user;
-  }
-  // Try to return a shortcut set from the static cache.
-  if (isset($shortcut_sets[$account->id()])) {
-    return $shortcut_sets[$account->id()];
+  if (!$account) {
+    $account = \Drupal::currentUser();
   }
-  // If none was found, try to find a shortcut set that is explicitly assigned
-  // to this user.
-  $shortcut_set_name = \Drupal::entityManager()
-    ->getStorage('shortcut_set')
-    ->getAssignedToUser($account);
-  if ($shortcut_set_name) {
-    $shortcut_set = ShortcutSet::load($shortcut_set_name);
-  }
-  // Otherwise, use the default set.
-  else {
-    $shortcut_set = shortcut_default_set($account);
-  }
-
-  $shortcut_sets[$account->id()] = $shortcut_set;
-  return $shortcut_set;
+  /** @var \Drupal\shortcut\ShortcutSetStorageInterface $shortcut_set_storage */
+  $shortcut_set_storage = \Drupal::entityManager()->getStorage('shortcut_set');
+  return $shortcut_set_storage->getCurrentSet($account);
 }
 
 /**
@@ -198,26 +203,20 @@ function shortcut_current_displayed_set($account = NULL) {
  *
  * @return
  *   An object representing the default shortcut set.
+ *
+ * @deprecated
+ *   Deprecated in 8.x, will be removed in 9.x. Use
+ *   ShortcutSetStorageInterface::getDefaultSet() directly.
+ *
+ * @see \Drupal\shortcut\ShortcutSetStorageInterface::getDefaultSet()
  */
 function shortcut_default_set($account = NULL) {
-  $user = \Drupal::currentUser();
-  if (!isset($account)) {
-    $account = $user;
+  if (!$account) {
+    $account = \Drupal::currentUser();
   }
-
-  // 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(\Drupal::moduleHandler()->invokeAll('shortcut_default_set', array($account)));
-  $suggestions[] = 'default';
-  foreach ($suggestions as $name) {
-    if ($shortcut_set = ShortcutSet::load($name)) {
-      break;
-    }
-  }
-
-  return $shortcut_set;
+  /** @var \Drupal\shortcut\ShortcutSetStorageInterface $shortcut_set_storage */
+  $shortcut_set_storage = \Drupal::entityManager()->getStorage('shortcut_set');
+  return $shortcut_set_storage->getDefaultSet($account);
 }
 
 /**
@@ -250,42 +249,19 @@ function shortcut_set_title_exists($title) {
  *
  * @return \Drupal\shortcut\ShortcutInterface[]
  *   An array of shortcut links, in the format returned by the menu system.
+ *
+ * @deprecated
+ *   Deprecated in 8.x, will be removed in 9.x. Use
+ *   $shortcut_set->getRenderableLinks() directly instead.
  */
 function shortcut_renderable_links($shortcut_set = NULL) {
-  $shortcut_links = array();
-
   if (!isset($shortcut_set)) {
-    $shortcut_set = shortcut_current_displayed_set();
+    /** @var \Drupal\shortcut\ShortcutSetStorageInterface $shortcut_set_storage */
+    $shortcut_set_storage = \Drupal::entityManager()->getStorage('shortcut_set');
+    $shortcut_set = $shortcut_set_storage->getCurrentSet(\Drupal::currentUser());
   }
 
-  $cache_tags = array();
-  foreach ($shortcut_set->getShortcuts() as $shortcut) {
-    $shortcut = \Drupal::entityManager()->getTranslationFromContext($shortcut);
-    $url = $shortcut->getUrl();
-    if ($url->access()) {
-      $links[$shortcut->id()] = array(
-        'type' => 'link',
-        'title' => $shortcut->label(),
-        'url' => $shortcut->getUrl(),
-      );
-      $cache_tags = Cache::mergeTags($cache_tags, $shortcut->getCacheTags());
-    }
-  }
-
-  if (!empty($links)) {
-    $shortcut_links = array(
-      '#theme' => 'links__toolbar_shortcuts',
-      '#links' => $links,
-      '#attributes' => array(
-        'class' => array('toolbar-menu'),
-      ),
-      '#cache' => array(
-        'tags' => $cache_tags,
-      ),
-    );
-  }
-
-  return $shortcut_links;
+  return $shortcut_set->getRenderableShortcuts();
 }
 
 /**
@@ -301,11 +277,17 @@ function shortcut_preprocess_block(&$variables) {
  * Implements hook_preprocess_HOOK() for page templates.
  */
 function shortcut_preprocess_page(&$variables) {
+  /** @var \Drupal\shortcut\ShortcutSetStorageInterface $shortcut_set_storage */
+  $shortcut_set_storage = \Drupal::entityManager()->getStorage('shortcut_set');
+  $shortcut_set = $shortcut_set_storage->getCurrentSet(\Drupal::currentUser());
+
   // Only display the shortcut link if the user has the ability to edit
   // shortcuts and if the page's actual content is being shown (for example,
   // we do not want to display it on "access denied" or "page not found"
   // pages).
-  if (shortcut_set_edit_access()->isAllowed() && !\Drupal::request()->attributes->has('exception')) {
+  if ($shortcut_set->access('update') && !\Drupal::request()->attributes->has('exception')) {
+    $user = User::load(\Drupal::currentUser()->id());
+
     $link = Url::fromRouteMatch(\Drupal::routeMatch())->getInternalPath();
     $route_match = \Drupal::routeMatch();
 
@@ -314,7 +296,6 @@ function shortcut_preprocess_page(&$variables) {
       'name' => $variables['title'],
     );
 
-    $shortcut_set = shortcut_current_displayed_set();
 
     // Check if $link is already a shortcut and set $link_mode accordingly.
     $shortcuts = \Drupal::entityManager()->getStorage('shortcut')->loadByProperties(array('shortcut_set' => $shortcut_set->id()));
@@ -328,13 +309,13 @@ function shortcut_preprocess_page(&$variables) {
     $link_mode = isset($shortcut_id) ? "remove" : "add";
 
     if ($link_mode == "add") {
-      $link_text = shortcut_set_switch_access()->isAllowed() ? t('Add to %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->label())) : t('Add to shortcuts');
+      $link_text = $user->access('switch_shortcut_set') ? t('Add to %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->label())) : t('Add to shortcuts');
       $route_name = 'shortcut.link_add_inline';
       $route_parameters = array('shortcut_set' => $shortcut_set->id());
     }
     else {
       $query['id'] = $shortcut_id;
-      $link_text = shortcut_set_switch_access()->isAllowed() ? t('Remove from %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->label())) : t('Remove from shortcuts');
+      $link_text = $user->access('switch_shortcut_set') ? t('Remove from %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->label())) : t('Remove from shortcuts');
       $route_name = 'entity.shortcut.link_delete_inline';
       $route_parameters = array('shortcut' => $shortcut_id);
     }
@@ -381,11 +362,13 @@ function shortcut_toolbar() {
   ];
 
   if ($user->hasPermission('access shortcuts')) {
-    $links = shortcut_renderable_links();
-    $shortcut_set = shortcut_current_displayed_set();
+    /** @var \Drupal\shortcut\ShortcutSetStorageInterface $shortcut_set_storage */
+    $shortcut_set_storage = \Drupal::entityManager()->getStorage('shortcut_set');
+    $shortcut_set = $shortcut_set_storage->getCurrentSet($user);
+    $links = $shortcut_set->getRenderableShortcuts();
     \Drupal::service('renderer')->addCacheableDependency($items['shortcuts'], $shortcut_set);
     $configure_link = NULL;
-    if (shortcut_set_edit_access($shortcut_set)->isAllowed()) {
+    if ($shortcut_set->access('update')) {
       $configure_link = array(
         '#type' => 'link',
         '#title' => t('Edit shortcuts'),
diff --git a/core/modules/shortcut/src/Entity/ShortcutSet.php b/core/modules/shortcut/src/Entity/ShortcutSet.php
index 52e3ecc..a815451 100644
--- a/core/modules/shortcut/src/Entity/ShortcutSet.php
+++ b/core/modules/shortcut/src/Entity/ShortcutSet.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\shortcut\Entity;
 
+use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\shortcut\ShortcutSetInterface;
@@ -126,4 +127,41 @@ public function getShortcuts() {
     return $shortcuts;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getRenderableShortcuts() {
+    $shortcut_links = array();
+
+    $cache_tags = array();
+    foreach ($this->getShortcuts() as $shortcut) {
+      /** @var \Drupal\shortcut\ShortcutInterface $shortcut */
+      $shortcut = \Drupal::entityManager()->getTranslationFromContext($shortcut);
+      $url = $shortcut->getUrl();
+      if ($url->access()) {
+        $links[$shortcut->id()] = array(
+          'type' => 'link',
+          'title' => $shortcut->label(),
+          'url' => $shortcut->getUrl(),
+        );
+        $cache_tags = Cache::mergeTags($cache_tags, $shortcut->getCacheTags());
+      }
+    }
+
+    if (!empty($links)) {
+      $shortcut_links = array(
+        '#theme' => 'links__toolbar_shortcuts',
+        '#links' => $links,
+        '#attributes' => array(
+          'class' => array('toolbar-menu'),
+        ),
+        '#cache' => array(
+          'tags' => $cache_tags,
+        ),
+      );
+    }
+
+    return $shortcut_links;
+  }
+
 }
diff --git a/core/modules/shortcut/src/Form/SwitchShortcutSet.php b/core/modules/shortcut/src/Form/SwitchShortcutSet.php
index 5388db5..74cb0f3 100644
--- a/core/modules/shortcut/src/Form/SwitchShortcutSet.php
+++ b/core/modules/shortcut/src/Form/SwitchShortcutSet.php
@@ -74,7 +74,7 @@ public function buildForm(array $form, FormStateInterface $form_state, UserInter
       return SafeMarkup::checkPlain($set->label());
     }, $this->shortcutSetStorage->loadMultiple());
 
-    $current_set = shortcut_current_displayed_set($this->user);
+    $current_set = $this->shortcutSetStorage->getCurrentSet($this->user);
 
     // Only administrators can add shortcut sets.
     $add_access = $account->hasPermission('administer shortcuts');
@@ -228,7 +228,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
    *   The access result.
    */
   public function checkAccess(UserInterface $user = NULL) {
-    return shortcut_set_switch_access($user);
+    return $user->access('switch_shortcut_set', NULL, TRUE);
   }
 
 }
diff --git a/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php b/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php
index 379d74d..58193e3 100644
--- a/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php
+++ b/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php
@@ -9,7 +9,10 @@
 
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a 'Shortcut' block.
@@ -20,14 +23,61 @@
  *   category = @Translation("Menus")
  * )
  */
-class ShortcutsBlock extends BlockBase {
+class ShortcutsBlock extends BlockBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The shortcut set storage.
+   *
+   * @var \Drupal\shortcut\ShortcutSetStorageInterface
+   */
+  protected $shortcutSetStorage;
+
+  /**
+   * The current user account.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * Creates a new instance.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager..
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user account.
+   */
+  function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager, AccountInterface $account) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->shortcutSetStorage = $entity_manager;
+    $this->account = $account;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static (
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.manager'),
+      $container->get('current_user')
+    );
+  }
 
   /**
    * {@inheritdoc}
    */
   public function build() {
     return array(
-      shortcut_renderable_links(shortcut_current_displayed_set()),
+      $this->shortcutSetStorage->getCurrentSet($this->account)->getRenderableShortcuts(),
     );
   }
 
diff --git a/core/modules/shortcut/src/ShortcutAccessControlHandler.php b/core/modules/shortcut/src/ShortcutAccessControlHandler.php
index fa52c60..27a441b 100644
--- a/core/modules/shortcut/src/ShortcutAccessControlHandler.php
+++ b/core/modules/shortcut/src/ShortcutAccessControlHandler.php
@@ -57,7 +57,7 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
    */
   protected function checkAccess(EntityInterface $entity, $operation, $langcode, AccountInterface $account) {
     if ($shortcut_set = $this->shortcutSetStorage->load($entity->bundle())) {
-      return shortcut_set_edit_access($shortcut_set, $account);
+      return $shortcut_set->access('update', $account, TRUE);
     }
     // @todo Fix this bizarre code: how can a shortcut exist without a shortcut
     // set? The above if-test is unnecessary. See https://www.drupal.org/node/2339903.
@@ -69,7 +69,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A
    */
   protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
     if ($shortcut_set = $this->shortcutSetStorage->load($entity_bundle)) {
-      return shortcut_set_edit_access($shortcut_set, $account);
+      return $shortcut_set->access('update', $account, TRUE);
     }
     // @todo Fix this bizarre code: how can a shortcut exist without a shortcut
     // set? The above if-test is unnecessary. See https://www.drupal.org/node/2339903.
diff --git a/core/modules/shortcut/src/ShortcutSetAccessControlHandler.php b/core/modules/shortcut/src/ShortcutSetAccessControlHandler.php
index 493a736..f0d3345 100644
--- a/core/modules/shortcut/src/ShortcutSetAccessControlHandler.php
+++ b/core/modules/shortcut/src/ShortcutSetAccessControlHandler.php
@@ -10,14 +10,47 @@
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityAccessControlHandler;
+use Drupal\Core\Entity\EntityHandlerInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\node\Plugin\views\filter\Access;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines the access control handler for the shortcut set entity type.
  *
  * @see \Drupal\shortcut\Entity\ShortcutSet
  */
-class ShortcutSetAccessControlHandler extends EntityAccessControlHandler {
+class ShortcutSetAccessControlHandler extends EntityAccessControlHandler implements EntityHandlerInterface {
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\shortcut\ShortcutSetStorageInterface
+   */
+  protected $entityStorage;
+
+  /**
+   * Constructs ShortcutSetAccessControlHandler object.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   */
+  function __construct(EntityTypeInterface $entity_type, EntityManagerInterface $entity_manager) {
+    parent::__construct($entity_type);
+    $this->entityStorage = $entity_manager->getStorage($this->entityTypeId);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+    return new static(
+      $entity_type,
+      $container->get('entity.manager')
+    );
+  }
 
   /**
    * {@inheritdoc}
@@ -31,7 +64,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A
         if (!$account->hasPermission('access shortcuts')) {
           return AccessResult::neutral()->cachePerPermissions();
         }
-        return AccessResult::allowedIf($account->hasPermission('customize shortcut links') && $entity == shortcut_current_displayed_set($account))->cachePerPermissions()->cacheUntilEntityChanges($entity);
+        return AccessResult::allowedIf($account->hasPermission('customize shortcut links') && $entity == $this->entityStorage->getCurrentSet($account))->cachePerPermissions()->cacheUntilEntityChanges($entity);
 
       case 'delete':
         return AccessResult::allowedIf($account->hasPermission('administer shortcuts') && $entity->id() != 'default')->cachePerPermissions();
diff --git a/core/modules/shortcut/src/ShortcutSetInterface.php b/core/modules/shortcut/src/ShortcutSetInterface.php
index 9d2f941..d12edc4 100644
--- a/core/modules/shortcut/src/ShortcutSetInterface.php
+++ b/core/modules/shortcut/src/ShortcutSetInterface.php
@@ -34,4 +34,12 @@ public function resetLinkWeights();
    */
   public function getShortcuts();
 
+  /**
+   * Returns a renderable array of shortcut links for this shortcut set.
+   *
+   * @return array
+   *   A renderable array.
+   */
+  public function getRenderableShortcuts();
+
 }
diff --git a/core/modules/shortcut/src/ShortcutSetStorage.php b/core/modules/shortcut/src/ShortcutSetStorage.php
index f575856..61c8b31 100644
--- a/core/modules/shortcut/src/ShortcutSetStorage.php
+++ b/core/modules/shortcut/src/ShortcutSetStorage.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\user\UserInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -29,6 +30,14 @@ class ShortcutSetStorage extends ConfigEntityStorage implements ShortcutSetStora
   protected $moduleHandler;
 
   /**
+   * The currently displayed shortcut set per user.
+   *
+   * @var \Drupal\shortcut\ShortcutSetInterface[]
+   *   An array of shortcut sets keyed by user ID.
+   */
+  protected $userShortcutSets = [];
+
+  /**
    * Constructs a ShortcutSetStorageController object.
    *
    * @param \Drupal\Core\Entity\EntityTypeInterface $entity_info
@@ -77,20 +86,19 @@ public function deleteAssignedShortcutSets(ShortcutSetInterface $entity) {
   /**
    * {@inheritdoc}
    */
-  public function assignUser(ShortcutSetInterface $shortcut_set, $account) {
+  public function assignUser(ShortcutSetInterface $shortcut_set, UserInterface $user) {
     db_merge('shortcut_set_users')
-      ->key('uid', $account->id())
+      ->key('uid', $user->id())
       ->fields(array('set_name' => $shortcut_set->id()))
       ->execute();
-    drupal_static_reset('shortcut_current_displayed_set');
   }
 
   /**
    * {@inheritdoc}
    */
-  public function unassignUser($account) {
+  public function unassignUser(UserInterface $user) {
     $deleted = db_delete('shortcut_set_users')
-      ->condition('uid', $account->id())
+      ->condition('uid', $user->id())
       ->execute();
     return (bool) $deleted;
   }
@@ -98,7 +106,7 @@ public function unassignUser($account) {
   /**
    * {@inheritdoc}
    */
-  public function getAssignedToUser($account) {
+  public function getAssignedToUser(AccountInterface $account) {
     $query = db_select('shortcut_set_users', 'ssu');
     $query->fields('ssu', array('set_name'));
     $query->condition('ssu.uid', $account->id());
@@ -115,6 +123,29 @@ public function countAssignedUsers(ShortcutSetInterface $shortcut_set) {
   /**
    * {@inheritdoc}
    */
+  public function getCurrentSet(AccountInterface $account) {
+    // Try to return a shortcut set from the static cache.
+    if (isset($this->userShortcutSets[$account->id()])) {
+      return $this->userShortcutSets[$account->id()];
+    }
+    // If none was found, try to find a shortcut set that is explicitly assigned
+    // to this user.
+    $shortcut_set_name = $this->getAssignedToUser($account);
+    if ($shortcut_set_name) {
+      $shortcut_set = $this->load($shortcut_set_name);
+    }
+    // Otherwise, use the default set.
+    else {
+      $shortcut_set = $this->getDefaultSet($account);
+    }
+
+    $this->userShortcutSets[$account->id()] = $shortcut_set;
+    return $shortcut_set;
+  }
+
+  /**
+   * {@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
diff --git a/core/modules/shortcut/src/ShortcutSetStorageInterface.php b/core/modules/shortcut/src/ShortcutSetStorageInterface.php
index 8881c84..3c59444 100644
--- a/core/modules/shortcut/src/ShortcutSetStorageInterface.php
+++ b/core/modules/shortcut/src/ShortcutSetStorageInterface.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Config\Entity\ConfigEntityStorageInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\user\UserInterface;
 
 /**
  * Defines an interface for shortcut_set entity storage classes.
@@ -20,25 +21,25 @@
    *
    * @param \Drupal\shortcut\ShortcutSetInterface $shortcut_set
    *   An object representing the shortcut set.
-   * @param $account
-   *   A user account that will be assigned to use the set.
+   * @param \Drupal\user\UserInterface $user
+   *   A user entity that will be assigned to use the set.
    */
-  public function assignUser(ShortcutSetInterface $shortcut_set, $account);
+  public function assignUser(ShortcutSetInterface $shortcut_set, UserInterface $user);
 
   /**
    * Unassigns a user from any shortcut set they may have been assigned to.
    *
    * The user will go back to using whatever default set applies.
    *
-   * @param $account
-   *   A user account that will be removed from the shortcut set assignment.
+   * @param \Drupal\user\UserInterface $user
+   *   A user entity that will be removed from the shortcut set assignment.
    *
    * @return bool
    *   TRUE if the user was previously assigned to a shortcut set and has been
    *   successfully removed from it. FALSE if the user was already not assigned
    *   to any set.
    */
-  public function unassignUser($account);
+  public function unassignUser(UserInterface $user);
 
   /**
    * Delete shortcut sets assigned to users.
@@ -51,13 +52,13 @@ public function deleteAssignedShortcutSets(ShortcutSetInterface $entity);
   /**
    * Get the name of the set assigned to this user.
    *
-   * @param \Drupal\user\Entity\User
+   * @param \Drupal\Core\Session\AccountInterface $account
    *   The user account.
    *
    * @return string
    *   The name of the shortcut set assigned to this user.
    */
-  public function getAssignedToUser($account);
+  public function getAssignedToUser(AccountInterface $account);
 
   /**
    * Get the number of users who have this set assigned to them.
@@ -71,6 +72,21 @@ public function getAssignedToUser($account);
   public function countAssignedUsers(ShortcutSetInterface $shortcut_set);
 
   /**
+   * Returns the current displayed shortcut set for the provided user account.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The user account whose shortcuts will be returned.
+   *
+   * @return \Drupal\shortcut\ShortcutSetInterface|null
+   *   An object representing the shortcut set that should be displayed to the
+   *   current user. If the user does not have an explicit shortcut set defined,
+   *   the default set is returned. NULL can be returned in the very rare case
+   *   that Shortcut module has been enabled but its configuration has not yet
+   *   been installed.
+   */
+  public function getCurrentSet(AccountInterface $account);
+
+  /**
    * Gets the default shortcut set for a given user account.
    *
    * @param \Drupal\Core\Session\AccountInterface $account
