diff --git a/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php b/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php
index 2645476..0232545 100644
--- a/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php
+++ b/core/modules/toolbar/tests/src/Functional/ToolbarCacheContextsTest.php
@@ -59,6 +59,18 @@ protected function setUp() {
   }
 
   /**
+   * Tests toolbar cache integration.
+   */
+  public function testCacheIntegration() {
+    $this->installExtraModules(['dynamic_page_cache']);
+    $this->drupalLogin($this->adminUser);
+    $this->drupalGet('test-page');
+    $this->assertSame('MISS', $this->getSession()->getResponseHeader('X-Drupal-Dynamic-Cache'));
+    $this->drupalGet('test-page');
+    $this->assertSame('HIT', $this->getSession()->getResponseHeader('X-Drupal-Dynamic-Cache'));
+  }
+
+  /**
    * Tests toolbar cache contexts.
    */
   public function testToolbarCacheContextsCaller() {
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 2d7d24a..e303de3 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -9,7 +9,6 @@
 use Drupal\Component\Render\PlainTextOutput;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Asset\AttachedAssetsInterface;
-use Drupal\Core\Cache\Cache;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Render\Element;
@@ -1328,72 +1327,24 @@ function user_cookie_delete($cookie_name) {
 function user_toolbar() {
   $user = \Drupal::currentUser();
 
-  // Add logout & user account links or login link.
-  $links_cache_contexts = [];
-  if ($user->isAuthenticated()) {
-    $links = [
-      'account' => [
-        'title' => t('View profile'),
-        'url' => Url::fromRoute('user.page'),
-        'attributes' => [
-          'title' => t('User account'),
-        ],
-      ],
-      'account_edit' => [
-        'title' => t('Edit profile'),
-        'url' => Url::fromRoute('entity.user.edit_form', ['user' => $user->id()]),
-        'attributes' => [
-          'title' => t('Edit user account'),
-        ],
-      ],
-      'logout' => [
-        'title' => t('Log out'),
-        'url' => Url::fromRoute('user.logout'),
-      ],
-    ];
-    // The "Edit user account" link is per-user.
-    $links_cache_contexts[] = 'user';
-  }
-  else {
-    $links = [
-      'login' => [
-        'title' => t('Log in'),
-        'url' => Url::fromRoute('user.page'),
-      ],
-    ];
-  }
-
   $items['user'] = [
     '#type' => 'toolbar_item',
     'tab' => [
       '#type' => 'link',
-      '#title' => $user->getDisplayName(),
+      '#title' => $user->isAnonymous() ? $user->getDisplayName() : t('My account'),
       '#url' => Url::fromRoute('user.page'),
       '#attributes' => [
         'title' => t('My account'),
         'class' => ['toolbar-icon', 'toolbar-icon-user'],
       ],
       '#cache' => [
-        'contexts' => [
-          // Cacheable per user, because the current user's name is shown.
-          'user',
-        ],
+        // Cacheable per "anonymous or not", because the links to
+        // display depend on that.
+        'contexts' => ['user.roles:anonymous'],
       ],
     ],
     'tray' => [
       '#heading' => t('User account actions'),
-      'user_links' => [
-        '#cache' => [
-          // Cacheable per "authenticated or not", because the links to
-          // display depend on that.
-          'contexts' => Cache::mergeContexts(['user.roles:authenticated'], $links_cache_contexts),
-        ],
-        '#theme' => 'links__toolbar_user',
-        '#links' => $links,
-        '#attributes' => [
-          'class' => ['toolbar-menu'],
-        ],
-      ],
     ],
     '#weight' => 100,
     '#attached' => [
@@ -1403,6 +1354,28 @@ function user_toolbar() {
     ],
   ];
 
+  if ($user->isAnonymous()) {
+    $links = [
+      'login' => [
+        'title' => t('Log in'),
+        'url' => Url::fromRoute('user.page'),
+      ],
+    ];
+    $items['user']['tray']['user_links'] = [
+      '#theme' => 'links__toolbar_user',
+      '#links' => $links,
+      '#attributes' => [
+        'class' => ['toolbar-menu'],
+      ],
+    ];
+  }
+  else {
+    $items['user']['tray']['user_links'] = [
+      '#lazy_builder' => ['user.toolbar_handler:lazyBuilder', []],
+      '#create_placeholder' => TRUE,
+    ];
+  }
+
   return $items;
 }
 
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index c273cb3..dfbbe0f 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -66,6 +66,9 @@ services:
     arguments: ['@current_user', '@entity.manager']
     tags:
       - { name: 'context_provider' }
+  user.toolbar_handler:
+    class: Drupal\user\ToolbarHandler
+    arguments: ['@current_user']
 
 parameters:
   user.tempstore.expire: 604800
