diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index e242f8c..a932954 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -370,6 +370,30 @@ function shortcut_preprocess_page_title(&$variables) {
   }
 }
 
+function shortcut_toolbar_lazybuilder_links() {
+  $shortcut_set = shortcut_current_displayed_set();
+
+  $links = shortcut_renderable_links();
+
+  $configure_link = NULL;
+  if (shortcut_set_edit_access($shortcut_set)->isAllowed()) {
+    $configure_link = [
+      '#type' => 'link',
+      '#title' => t('Edit shortcuts'),
+      '#url' => Url::fromRoute('entity.shortcut_set.customize_form', ['shortcut_set' => $shortcut_set->id()]),
+      '#options' => ['attributes' => ['class' => ['edit-shortcuts']]],
+    ];
+  }
+
+  $build = [
+    'shortcuts' => $links,
+    'configure' => $configure_link,
+  ];
+  \Drupal::service('renderer')->addCacheableDependency($build, $shortcut_set);
+
+  return $build;
+}
+
 /**
  * Implements hook_toolbar().
  */
@@ -380,28 +404,17 @@ function shortcut_toolbar() {
   $items['shortcuts'] = [
     '#cache' => [
       'contexts' => [
-        // Cacheable per user, because each user can have their own shortcut
-        // set, even if they cannot create or select a shortcut set, because
-        // an administrator may have assigned a non-default shortcut set.
-        'user',
+        'user.permissions',
       ],
     ],
   ];
 
   if ($user->hasPermission('access shortcuts')) {
-    $links = shortcut_renderable_links();
     $shortcut_set = shortcut_current_displayed_set();
-    \Drupal::service('renderer')->addCacheableDependency($items['shortcuts'], $shortcut_set);
-    $configure_link = NULL;
-    if (shortcut_set_edit_access($shortcut_set)->isAllowed()) {
-      $configure_link = [
-        '#type' => 'link',
-        '#title' => t('Edit shortcuts'),
-        '#url' => Url::fromRoute('entity.shortcut_set.customize_form', ['shortcut_set' => $shortcut_set->id()]),
-        '#options' => ['attributes' => ['class' => ['edit-shortcuts']]],
-      ];
-    }
-    if (!empty($links) || !empty($configure_link)) {
+    // @todo Use a cache context to vary this for users that have links and
+    // those who don't.
+    if (TRUE || !empty($links) || !empty($configure_link)) {
+
       $items['shortcuts'] += [
         '#type' => 'toolbar_item',
         'tab' => [
@@ -415,8 +428,14 @@ function shortcut_toolbar() {
         ],
         'tray' => [
           '#heading' => t('User-defined shortcuts'),
-          'shortcuts' => $links,
-          'configure' => $configure_link,
+          'children' => [
+            '#lazy_builder' => ['shortcut_toolbar_lazybuilder_links', []],
+            '#create_placeholder' => TRUE,
+            '#cache' => [
+              'keys' => ['shortcut_set_toolbar_links'],
+              'contexts' => ['user'],
+            ],
+          ],
         ],
         '#weight' => -10,
         '#attached' => [
diff --git a/core/modules/shortcut/tests/src/Functional/ShortcutLinksTest.php b/core/modules/shortcut/tests/src/Functional/ShortcutLinksTest.php
index 238ee4f..b19acb4 100644
--- a/core/modules/shortcut/tests/src/Functional/ShortcutLinksTest.php
+++ b/core/modules/shortcut/tests/src/Functional/ShortcutLinksTest.php
@@ -353,7 +353,7 @@ public function testAccessShortcutsPermission() {
     // Verify that users without the 'administer site configuration' permission
     // can't see the cron shortcuts.
     $this->drupalLogin($this->drupalCreateUser(['access toolbar', 'access shortcuts']));
-    $this->assertNoLink('Shortcuts', 'Shortcut link not found on page.');
+    $this->assertLink('Shortcuts');
     $this->assertNoLink('Cron', 'Cron shortcut link not found on page.');
 
     // Verify that users with the 'access shortcuts' permission can see the
diff --git a/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php b/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php
index 0232545..c439432 100644
--- a/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php
+++ b/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php
@@ -97,7 +97,7 @@ public function testToolbarCacheContextsCaller() {
     // Test with shortcut module enabled.
     $this->installExtraModules(['shortcut']);
     $this->adminUser2 = $this->drupalCreateUser(array_merge($this->perms, ['access shortcuts', 'administer shortcuts']));
-    $this->assertToolbarCacheContexts(['user'], 'Expected cache contexts found with shortcut module enabled.');
+    $this->assertToolbarCacheContexts(['user.permissions'], 'Expected cache contexts found with shortcut module enabled.');
   }
 
   /**
