diff --git a/core/lib/Drupal/Core/Form/FormSubmitterInterface.php b/core/lib/Drupal/Core/Form/FormSubmitterInterface.php
index af9b3db..7bdca79 100644
--- a/core/lib/Drupal/Core/Form/FormSubmitterInterface.php
+++ b/core/lib/Drupal/Core/Form/FormSubmitterInterface.php
@@ -55,7 +55,7 @@ public function executeSubmitHandlers(&$form, FormStateInterface &$form_state);
    *
    * Here is an example of how to set up a form to redirect to the path 'user':
    * @code
-   * $form_state->setRedirect('user.page');
+   * $form_state->setRedirect('entity.user.canonical');
    * @endcode
    * And here is an example of how to redirect to 'node/123?foo=bar#baz':
    * @code
diff --git a/core/modules/menu_ui/src/MenuForm.php b/core/modules/menu_ui/src/MenuForm.php
index 2415032..2685397 100644
--- a/core/modules/menu_ui/src/MenuForm.php
+++ b/core/modules/menu_ui/src/MenuForm.php
@@ -346,7 +346,7 @@ protected function buildOverviewTreeForm($tree, $delta) {
         if (!$link->isEnabled()) {
           $form[$id]['title']['#markup'] .= ' (' . $this->t('disabled') . ')';
         }
-        elseif (($url = $link->getUrlObject()) && !$url->isExternal() && $url->getRouteName() == 'user.page') {
+        elseif (($url = $link->getUrlObject()) && !$url->isExternal() && $url->getRouteName() == 'entity.user.canonical') {
           $form[$id]['title']['#markup'] .= ' (' . $this->t('logged in users only') . ')';
         }
 
diff --git a/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php b/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php
index 453e465..aa2c457 100644
--- a/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php
+++ b/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php
@@ -49,7 +49,7 @@ protected function getTranslatorPermissions() {
    * {@inheritdoc}
    */
   protected function createEntity($values, $langcode, $bundle_name = NULL) {
-    $values['route_name'] = 'user.page';
+    $values['route_name'] = 'entity.user.canonical';
     return parent::createEntity($values, $langcode, $bundle_name);
   }
 
@@ -70,7 +70,7 @@ protected function doTestBasicTranslation() {
         // Request the front page in this language and assert that the right
         // translation shows up in the shortcut list with the right path.
         $this->drupalGet('<front>', array('language' => $language));
-        $expected_path = \Drupal::urlGenerator()->generateFromRoute('user.page', array(), array('language' => $language));
+        $expected_path = \Drupal::urlGenerator()->generateFromRoute('entity.user.canonical', array(), array('language' => $language));
         $label = $entity->getTranslation($langcode)->label();
         $elements = $this->xpath('//nav[contains(@class, "toolbar-lining")]/ul[@class="menu"]/li/a[contains(@href, :href) and normalize-space(text())=:label]', array(':href' => $expected_path, ':label' => $label));
         $this->assertTrue(!empty($elements), format_string('Translated @language shortcut link @label found.', array('@label' => $label, '@language' => $language->getName())));
diff --git a/core/modules/system/src/Tests/System/TokenReplaceUnitTest.php b/core/modules/system/src/Tests/System/TokenReplaceUnitTest.php
index c512364..f3b1ffe 100644
--- a/core/modules/system/src/Tests/System/TokenReplaceUnitTest.php
+++ b/core/modules/system/src/Tests/System/TokenReplaceUnitTest.php
@@ -100,7 +100,7 @@ public function testSystemSiteTokenReplacement() {
     $tests['[site:mail]'] = $config->get('mail');
     $tests['[site:url]'] = \Drupal::url('<front>', [], $url_options);
     $tests['[site:url-brief]'] = preg_replace(array('!^https?://!', '!/$!'), '', \Drupal::url('<front>', [], $url_options));
-    $tests['[site:login-url]'] = \Drupal::url('user.page', [], $url_options);
+    $tests['[site:login-url]'] = \Drupal::url('user.login', [], $url_options);
 
     // Test to make sure that we generated something for each token.
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
diff --git a/core/modules/system/system.tokens.inc b/core/modules/system/system.tokens.inc
index ff78335..d227a97 100644
--- a/core/modules/system/system.tokens.inc
+++ b/core/modules/system/system.tokens.inc
@@ -128,7 +128,7 @@ function system_tokens($type, $tokens, array $data = array(), array $options = a
           break;
 
         case 'login-url':
-          $replacements[$original] = \Drupal::url('user.page', [], $url_options);
+          $replacements[$original] = \Drupal::url('user.login', [], $url_options);
           break;
       }
     }
diff --git a/core/modules/system/tests/modules/theme_test/src/EventSubscriber/ThemeTestSubscriber.php b/core/modules/system/tests/modules/theme_test/src/EventSubscriber/ThemeTestSubscriber.php
index b4e4393..11effb5 100644
--- a/core/modules/system/tests/modules/theme_test/src/EventSubscriber/ThemeTestSubscriber.php
+++ b/core/modules/system/tests/modules/theme_test/src/EventSubscriber/ThemeTestSubscriber.php
@@ -45,7 +45,7 @@ public function onRequest(GetResponseEvent $event) {
       // returning output and theming the page as a whole.
       $more_link = array(
         '#type' => 'more_link',
-        '#url' => Url::fromRoute('user.page'),
+        '#url' => Url::fromRoute('entity.user.canonical'),
         '#attributes' => array('title' => 'Themed output generated in a KernelEvents::REQUEST listener'),
       );
       $GLOBALS['theme_test_output'] = drupal_render($more_link);
diff --git a/core/modules/user/src/Controller/UserController.php b/core/modules/user/src/Controller/UserController.php
index b5ce805..b096e7c 100644
--- a/core/modules/user/src/Controller/UserController.php
+++ b/core/modules/user/src/Controller/UserController.php
@@ -126,20 +126,6 @@ public function resetPass($uid, $timestamp, $hash) {
   }
 
   /**
-   * Redirects users to their profile page.
-   *
-   * This controller assumes that it is only invoked for authenticated users.
-   * This is enforced for the 'user.page' route with the '_user_is_logged_in'
-   * requirement.
-   *
-   * @return \Symfony\Component\HttpFoundation\RedirectResponse
-   *   Returns a redirect to the profile of the currently logged in user.
-   */
-  public function userPage() {
-    return $this->redirect('entity.user.canonical', array('user' => $this->currentUser()->id()));
-  }
-
-  /**
    * Route title callback.
    *
    * @param \Drupal\user\UserInterface $user
diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
index 036b98e..2e14e97 100644
--- a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
+++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
@@ -53,7 +53,7 @@ public function onException(GetResponseForExceptionEvent $event) {
     $exception = $event->getException();
     if ($exception instanceof AccessDeniedHttpException) {
       $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName();
-      if ($route_name == 'user.page' && !$this->account->isAuthenticated()) {
+      if ($route_name == 'entity.user.canonical' && !$this->account->isAuthenticated()) {
         $event->setResponse($this->redirect('user.login'));
       }
     }
diff --git a/core/modules/user/src/Form/UserPasswordForm.php b/core/modules/user/src/Form/UserPasswordForm.php
index 4d5a012..eb1ef67 100644
--- a/core/modules/user/src/Form/UserPasswordForm.php
+++ b/core/modules/user/src/Form/UserPasswordForm.php
@@ -139,7 +139,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       drupal_set_message($this->t('Further instructions have been sent to your email address.'));
     }
 
-    $form_state->setRedirect('user.page');
+    $form_state->setRedirect('user.login');
   }
 
 }
diff --git a/core/modules/user/src/Tests/UserAccountLinksTests.php b/core/modules/user/src/Tests/UserAccountLinksTests.php
index cc85a86..d0e5ac1 100644
--- a/core/modules/user/src/Tests/UserAccountLinksTests.php
+++ b/core/modules/user/src/Tests/UserAccountLinksTests.php
@@ -137,7 +137,7 @@ function testAccountPageTitles() {
     $this->drupalLogin($this->drupalCreateUser());
     // After login, the client is redirected to /user.
     $this->assertLink(t('My account'), 0, "Page title of /user is 'My Account' in menus for registered users");
-    $this->assertLinkByHref(\Drupal::urlGenerator()->generate('user.page'), 0);
+    $this->assertLinkByHref(\Drupal::urlGenerator()->generate('entity.user.canonical'), 0);
   }
 
 }
diff --git a/core/modules/user/src/Tests/UserTokenReplaceTest.php b/core/modules/user/src/Tests/UserTokenReplaceTest.php
index 897e2aa..17aa827 100644
--- a/core/modules/user/src/Tests/UserTokenReplaceTest.php
+++ b/core/modules/user/src/Tests/UserTokenReplaceTest.php
@@ -89,7 +89,7 @@ function testUserTokenReplacement() {
     $tests['[user:cancel-url]'] = user_cancel_url($account);
 
     // Generate tokens with interface language.
-    $link = \Drupal::url('user.page', [], array('absolute' => TRUE));
+    $link = \Drupal::url('entity.user.canonical', [], array('absolute' => TRUE));
     foreach ($tests as $input => $expected) {
       $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->getId(), 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
       $this->assertTrue(strpos($output, $link) === 0, 'Generated URL is in interface language.');
@@ -98,14 +98,14 @@ function testUserTokenReplacement() {
     // Generate tokens with the user's preferred language.
     $account->preferred_langcode = 'de';
     $account->save();
-    $link = \Drupal::url('user.page', [], array('language' => \Drupal::languageManager()->getLanguage($account->getPreferredLangcode()), 'absolute' => TRUE));
+    $link = \Drupal::url('entity.user.canonical', [], array('language' => \Drupal::languageManager()->getLanguage($account->getPreferredLangcode()), 'absolute' => TRUE));
     foreach ($tests as $input => $expected) {
       $output = $token_service->replace($input, array('user' => $account), array('callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
       $this->assertTrue(strpos($output, $link) === 0, "Generated URL is in the user's preferred language.");
     }
 
     // Generate tokens with one specific language.
-    $link = \Drupal::url('user.page', [], array('language' => \Drupal::languageManager()->getLanguage('de'), 'absolute' => TRUE));
+    $link = \Drupal::url('entity.user.canonical', [], array('language' => \Drupal::languageManager()->getLanguage('de'), 'absolute' => TRUE));
     foreach ($tests as $input => $expected) {
       foreach (array($user1, $user2) as $account) {
         $output = $token_service->replace($input, array('user' => $account), array('langcode' => 'de', 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
diff --git a/core/modules/user/src/UserRouteEnhancer.php b/core/modules/user/src/UserRouteEnhancer.php
new file mode 100644
index 0000000..68bdc80
--- /dev/null
+++ b/core/modules/user/src/UserRouteEnhancer.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\UserRouteEnhancer.
+ */
+
+namespace Drupal\user;
+
+use Drupal\Core\Session\AccountProxyInterface;
+use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Enhances the '/user/{user}' path to default to the currently logged-in user.
+ */
+class UserRouteEnhancer implements RouteEnhancerInterface {
+
+  /**
+   * The current user service.
+   *
+   * @var \Drupal\Core\Session\AccountProxyInterface
+   */
+  protected $currentUser;
+
+  /**
+   * Constructs a UserRouteEnhancer object.
+   *
+   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
+   *   The current user service.
+   */
+  function __construct(AccountProxyInterface $current_user) {
+    $this->currentUser = $current_user;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function enhance(array $defaults, Request $request) {
+    $route = isset($defaults[RouteObjectInterface::ROUTE_OBJECT]) ? $defaults[RouteObjectInterface::ROUTE_OBJECT] : NULL;
+    if ($route && $route->getPath() === '/user/{user}' && $defaults['user'] === NULL) {
+      $defaults['user'] = $this->currentUser->getAccount()->id();
+    }
+
+    return $defaults;
+  }
+
+}
diff --git a/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php b/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php
index b58f86b..b836775 100644
--- a/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php
+++ b/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php
@@ -62,7 +62,6 @@ public function testUserLoginLocalTasks($route, $subtask = array()) {
    */
   public function getUserLoginRoutes() {
     return array(
-      array('user.page', array('user.login',)),
       array('user.login', array('user.login',)),
       array('user.register'),
       array('user.pass'),
diff --git a/core/modules/user/user.links.menu.yml b/core/modules/user/user.links.menu.yml
index 62cfe51..7cdea14 100644
--- a/core/modules/user/user.links.menu.yml
+++ b/core/modules/user/user.links.menu.yml
@@ -1,7 +1,7 @@
 user.page:
   title: 'My account'
   weight: -10
-  route_name: user.page
+  route_name: entity.user.canonical
   menu_name: account
 user.logout:
   title: 'Log out'
diff --git a/core/modules/user/user.links.task.yml b/core/modules/user/user.links.task.yml
index 507c7de..252fd35 100644
--- a/core/modules/user/user.links.task.yml
+++ b/core/modules/user/user.links.task.yml
@@ -10,17 +10,17 @@ user.account_settings_tab:
   base_route: entity.user.admin_form
 
 user.page:
-  route_name: user.page
-  base_route: user.page
+  route_name: user.login
+  base_route: user.login
   title: 'Log in'
   weight: -10
 user.register:
   route_name: user.register
-  base_route: user.page
+  base_route: user.login
   title: 'Create new account'
 user.pass:
   route_name: user.pass
-  base_route: user.page
+  base_route: user.login
   title: 'Request new password'
 # Other authentication methods may add pages below user/login/.
 user.login:
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index bc0e15c..884a7cf 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -1443,7 +1443,7 @@ function user_toolbar() {
     $links = array(
       'account' => array(
         'title' => t('View profile'),
-        'url' => Url::fromRoute('user.page'),
+        'url' => Url::fromRoute('entity.user.canonical'),
         'html' => TRUE,
         'attributes' => array(
           'title' => t('User account'),
@@ -1467,7 +1467,7 @@ function user_toolbar() {
      $links = array(
       'login' => array(
         'title' => t('Log in'),
-        'url' => Url::fromRoute('user.page'),
+        'url' => Url::fromRoute('user.login'),
       ),
     );
   }
@@ -1477,7 +1477,7 @@ function user_toolbar() {
     'tab' => array(
       '#type' => 'link',
       '#title' => $user->getUsername(),
-      '#url' => Url::fromRoute('user.page'),
+      '#url' => Url::fromRoute('entity.user.canonical'),
       '#attributes' => array(
         'title' => t('My account'),
         'class' => array('toolbar-icon', 'toolbar-icon-user'),
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index 2a31da2..161dbd6 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -125,19 +125,12 @@ user.pass:
   options:
     _maintenance_access: TRUE
 
-user.page:
-  path: '/user'
-  defaults:
-    _content: '\Drupal\user\Controller\UserController::userPage'
-    _title: 'My account'
-  requirements:
-    _user_is_logged_in: 'TRUE'
-
 entity.user.canonical:
   path: '/user/{user}'
   defaults:
     _entity_view: 'user.full'
     _title_callback: 'Drupal\user\Controller\UserController::userTitle'
+    user: NULL
   requirements:
     _entity_access: 'user.view'
 
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index e89aa73..ae77dc0e 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -67,6 +67,11 @@ services:
   user.permissions:
     class: Drupal\user\PermissionHandler
     arguments: ['@module_handler', '@string_translation', '@controller_resolver']
+  user.route_enhancer.authentication:
+    class: Drupal\user\UserRouteEnhancer
+    tags:
+      - { name: route_enhancer }
+    arguments: ['@current_user']
 
 parameters:
   user.tempstore.expire: 604800
