 .../Core/Menu/DefaultMenuLinkTreeManipulators.php  | 10 ++---
 core/lib/Drupal/Core/Menu/MenuLinkBase.php         |  2 +-
 core/modules/menu_ui/src/MenuForm.php              |  3 ++
 core/modules/menu_ui/src/Tests/MenuTest.php        |  3 +-
 .../src/Tests/PageCacheTagsIntegrationTest.php     | 13 +++---
 .../user/src/Plugin/Menu/LoginLogoutMenuLink.php   | 48 ++++++++++++++++++++++
 .../user/src/Tests/UserAccountLinksTest.php        |  8 ++--
 core/modules/user/user.links.menu.yml              |  5 +--
 .../config/install/block.block.bartik_login.yml    | 18 --------
 core/themes/bartik/css/colors.css                  |  3 +-
 10 files changed, 71 insertions(+), 42 deletions(-)

diff --git a/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php b/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php
index 9461683..948624c 100644
--- a/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php
+++ b/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php
@@ -206,15 +206,13 @@ protected function menuLinkCheckAccess(MenuLinkInterface $instance) {
       $access_result = AccessResult::allowed();
     }
     else {
-      // Use the definition here since that's a lot faster than creating a Url
-      // object that we don't need.
-      $definition = $instance->getPluginDefinition();
-      // 'url' should only be populated for external links.
-      if (!empty($definition['url']) && empty($definition['route_name'])) {
+      $route_name = $instance->getRouteName();
+      // When no route name is specified, this must be an external link.
+      if (empty($route_name)) {
         $access_result = AccessResult::allowed();
       }
       else {
-        $access_result = $this->accessManager->checkNamedRoute($definition['route_name'], $definition['route_parameters'], $this->account, TRUE);
+        $access_result = $this->accessManager->checkNamedRoute($route_name, $instance->getRouteParameters(), $this->account, TRUE);
       }
     }
     return $access_result->cachePerPermissions();
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkBase.php b/core/lib/Drupal/Core/Menu/MenuLinkBase.php
index 6ecfbdf..8f1c112 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkBase.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkBase.php
@@ -130,7 +130,7 @@ public function getUrlObject($title_attribute = TRUE) {
       $options['attributes']['title'] = $description;
     }
     if (empty($this->pluginDefinition['url'])) {
-      return new Url($this->pluginDefinition['route_name'], $this->pluginDefinition['route_parameters'], $options);
+      return new Url($this->getRouteName(), $this->getRouteParameters(), $options);
     }
     else {
       return Url::fromUri($this->pluginDefinition['url'], $options);
diff --git a/core/modules/menu_ui/src/MenuForm.php b/core/modules/menu_ui/src/MenuForm.php
index 8b4f6e7..1d3fa89 100644
--- a/core/modules/menu_ui/src/MenuForm.php
+++ b/core/modules/menu_ui/src/MenuForm.php
@@ -358,6 +358,9 @@ protected function buildOverviewTreeForm($tree, $delta) {
         if (!$link->isEnabled()) {
           $form[$id]['title']['#suffix'] = ' (' . $this->t('disabled') . ')';
         }
+        elseif ($id === 'menu_plugin_id:user.login.logout') {
+          $form[$id]['title']['#suffix'] = ' (' . $this->t('<q>Log in</q> for anonymous users') . ')';
+        }
         elseif (($url = $link->getUrlObject()) && $url->isRouted() && $url->getRouteName() == 'user.page') {
           $form[$id]['title']['#suffix'] = ' (' . $this->t('logged in users only') . ')';
         }
diff --git a/core/modules/menu_ui/src/Tests/MenuTest.php b/core/modules/menu_ui/src/Tests/MenuTest.php
index 128d507..4e502fc 100644
--- a/core/modules/menu_ui/src/Tests/MenuTest.php
+++ b/core/modules/menu_ui/src/Tests/MenuTest.php
@@ -891,8 +891,7 @@ private function getStandardMenuLink() {
     // the front page.
     /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
     $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
-    $result = $menu_link_manager->loadLinksByRoute('user.logout');
-    $instance = reset($result);
+    $instance = $menu_link_manager->getInstance(['id' => 'user.login.logout']);
 
     $this->assertTrue((bool) $instance, 'Standard menu link was loaded');
     return $instance;
diff --git a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
index 58f8fde..e5e2cd6 100644
--- a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
+++ b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
@@ -71,13 +71,14 @@ function testPageCacheTags() {
 
     $cache_contexts = [
       'languages:' . LanguageInterface::TYPE_INTERFACE,
-      'route',
+      'route.menu_active_trails:account',
+      'route.menu_active_trails:footer',
+      'route.menu_active_trails:main',
+      'route.menu_active_trails:tools',
+      'route.name',
       'theme',
       'timezone',
       'user.permissions',
-      // The user login block access depends on whether the current user is
-      // logged in or not.
-      'user.roles:anonymous',
       // The cache contexts associated with the (in)accessible menu links are
       // bubbled.
       'user.roles:authenticated',
@@ -95,7 +96,6 @@ function testPageCacheTags() {
       'config:block.block.bartik_breadcrumbs',
       'config:block.block.bartik_content',
       'config:block.block.bartik_tools',
-      'config:block.block.bartik_login',
       'config:block.block.bartik_footer',
       'config:block.block.bartik_help',
       'config:block.block.bartik_search',
@@ -114,7 +114,6 @@ function testPageCacheTags() {
       'config:system.menu.tools',
       'config:system.menu.footer',
       'config:system.menu.main',
-      'config:system.site',
       // FinishResponseSubscriber adds this cache tag to responses that have the
       // 'user.permissions' cache context for anonymous users.
       'config:user.role.anonymous',
@@ -132,7 +131,6 @@ function testPageCacheTags() {
       'config:block.block.bartik_breadcrumbs',
       'config:block.block.bartik_content',
       'config:block.block.bartik_tools',
-      'config:block.block.bartik_login',
       'config:block.block.bartik_help',
       'config:block.block.bartik_search',
       'config:block.block.' . $block->id(),
@@ -151,7 +149,6 @@ function testPageCacheTags() {
       'config:system.menu.tools',
       'config:system.menu.footer',
       'config:system.menu.main',
-      'config:system.site',
       'comment_list',
       'node_list',
       'config:views.view.comments_recent',
diff --git a/core/modules/user/src/Plugin/Menu/LoginLogoutMenuLink.php b/core/modules/user/src/Plugin/Menu/LoginLogoutMenuLink.php
new file mode 100644
index 0000000..87f892f
--- /dev/null
+++ b/core/modules/user/src/Plugin/Menu/LoginLogoutMenuLink.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Plugin\Menu\MyAccountMenuLink.
+ */
+
+namespace Drupal\user\Plugin\Menu;
+
+use Drupal\Core\Menu\MenuLinkDefault;
+
+/**
+ * A menu link that shows "Log in" or  "Log out" as appropriate.
+ */
+class LoginLogoutMenuLink extends MenuLinkDefault {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTitle() {
+    if (\Drupal::currentUser()->isAuthenticated()) {
+      return $this->t('Log out');
+    }
+    else {
+      return $this->t('Log in');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRouteName() {
+    if (\Drupal::currentUser()->isAuthenticated()) {
+      return 'user.logout';
+    }
+    else {
+      return 'user.login';
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    return ['user.roles:authenticated'];
+  }
+
+}
diff --git a/core/modules/user/src/Tests/UserAccountLinksTest.php b/core/modules/user/src/Tests/UserAccountLinksTest.php
index 0a6f3d7..cb3ea88 100644
--- a/core/modules/user/src/Tests/UserAccountLinksTest.php
+++ b/core/modules/user/src/Tests/UserAccountLinksTest.php
@@ -65,11 +65,13 @@ function testSecondaryMenu() {
     $this->drupalLogout();
     $this->drupalGet('<front>');
 
-    // For a logged-out user, expect no secondary links.
-    $menu = $this->xpath('//ul[@class=:menu_class]', array(
+    // For a logged-out user, expect the secondary menu to have a "Log in" link.
+    $link = $this->xpath('//ul[@class=:menu_class]/li/a[contains(@href, :href) and text()=:text]', array(
       ':menu_class' => 'menu',
+      ':href' => 'user/login',
+      ':text' => 'Log in',
     ));
-    $this->assertEqual(count($menu), 0, 'The secondary links menu is not rendered, because none of its menu links are accessible for the anonymous user.');
+    $this->assertEqual(count($link), 1, 'Log in link is in secondary menu.');
   }
 
   /**
diff --git a/core/modules/user/user.links.menu.yml b/core/modules/user/user.links.menu.yml
index 46a2947..6a57ea9 100644
--- a/core/modules/user/user.links.menu.yml
+++ b/core/modules/user/user.links.menu.yml
@@ -3,11 +3,10 @@ user.page:
   weight: -10
   route_name: user.page
   menu_name: account
-user.logout:
-  title: 'Log out'
-  route_name: user.logout
+user.login.logout:
   weight: 10
   menu_name: account
+  class: Drupal\user\Plugin\Menu\LoginLogoutMenuLink
 entity.user.collection:
   title: People
   route_name: entity.user.collection
diff --git a/core/profiles/standard/config/install/block.block.bartik_login.yml b/core/profiles/standard/config/install/block.block.bartik_login.yml
deleted file mode 100644
index 3a5f543..0000000
--- a/core/profiles/standard/config/install/block.block.bartik_login.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-id: bartik_login
-theme: bartik
-weight: 0
-status: true
-langcode: en
-region: sidebar_first
-plugin: user_login_block
-settings:
-  id: user_login_block
-  label: 'User login'
-  provider: user
-  label_display: visible
-dependencies:
-  module:
-    - user
-  theme:
-    - bartik
-visibility: {  }
diff --git a/core/themes/bartik/css/colors.css b/core/themes/bartik/css/colors.css
index 0c722b2..41dc054 100644
--- a/core/themes/bartik/css/colors.css
+++ b/core/themes/bartik/css/colors.css
@@ -50,7 +50,8 @@ a:active,
 .site-branding,
 .site-branding__text a,
 .site-branding a,
-.region-secondary-menu .menu-item a {
+.region-secondary-menu .menu-item a,
+.region-secondary-menu .menu-item a.is-active {
   color: #fffeff;
 }
 
