diff --git a/core/lib/Drupal/Core/PathProcessor/InboundPathProcessorInterface.php b/core/lib/Drupal/Core/PathProcessor/InboundPathProcessorInterface.php
index 946b29c..5ba073a 100644
--- a/core/lib/Drupal/Core/PathProcessor/InboundPathProcessorInterface.php
+++ b/core/lib/Drupal/Core/PathProcessor/InboundPathProcessorInterface.php
@@ -22,6 +22,9 @@
    *
    * @param \Symfony\Component\HttpFoundation\Request $request
    *   The HttpRequest object representing the current request.
+   *
+   * @return string
+   *   Returns a changed version of the incoming path.
    */
   public function processInbound($path, Request $request);
 
diff --git a/core/modules/user/src/PathProcessor/PathProcessorMe.php b/core/modules/user/src/PathProcessor/PathProcessorMe.php
new file mode 100644
index 0000000..05c42e1
--- /dev/null
+++ b/core/modules/user/src/PathProcessor/PathProcessorMe.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\PathProcessor\PathProcessorMe.
+ */
+
+namespace Drupal\user\PathProcessor;
+
+use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
+use Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
+use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Provides a path processor which replaces /user/me with the current UID.
+ */
+class PathProcessorMe implements InboundPathProcessorInterface {
+
+  /**
+   * The current account.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * Constructs a new PathProcessorMe object.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current acount.
+   */
+  public function __construct(AccountInterface $account) {
+    $this->account = $account;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processInbound($path, Request $request) {
+    // We don't want to replace the URL for anonymous users.
+    if ($uid = $this->account->id()) {
+      if (strpos($path, 'user/me') === 0) {
+        $path = str_replace('user/me', "user/{$uid}", $path);
+      }
+    }
+    return $path;
+  }
+
+}
diff --git a/core/modules/user/tests/src/PathProcessor/PathProcessorMeTest.php b/core/modules/user/tests/src/PathProcessor/PathProcessorMeTest.php
new file mode 100644
index 0000000..9ff8801
--- /dev/null
+++ b/core/modules/user/tests/src/PathProcessor/PathProcessorMeTest.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Tests\PathProcessor\PathProcessorMeTest.
+ */
+
+namespace Drupal\user\Tests\PathProcessor;
+
+use Drupal\Tests\UnitTestCase;
+use Drupal\user\PathProcessor\PathProcessorMe;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Tests the me path processor.
+ *
+ * @coversDefaultClass \Drupal\user\PathProcessor\PathProcessorMe
+ */
+class PathProcessorMeTest extends UnitTestCase {
+
+  /**
+   * The mocked account.
+   *
+   * @var \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $account;
+
+  /**
+   * The tested path processor.
+   *
+   * @var \Drupal\user\PathProcessor\PathProcessorMe
+   */
+  protected $pathProcessor;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->account = $this->getMock('Drupal\Core\Session\AccountInterface');
+    $this->pathProcessor = new PathProcessorMe($this->account);
+  }
+
+  /**
+   * Tests the processInbound method.
+   *
+   * @dataProvider providerTestProcessInbound
+   * @covers ::processInbound
+   */
+  public function testProcessInbound($incoming_path, $expected_path, $uid) {
+    $this->account->expects($this->once())
+      ->method('id')
+      ->willReturn($uid);
+    $request = Request::create("/" . $incoming_path);
+    $this->assertEquals($expected_path, $this->pathProcessor->processInbound($incoming_path, $request));
+  }
+
+  /**
+   * Provides test data for processInbound.
+   *
+   * @return array
+   */
+  public function providerTestProcessInbound() {
+    $data = array();
+    // Tests the frontpage.
+    $data[] = array('/', '/', 1);
+    $data[] = array('user/me', 'user/1', 1);
+    $data[] = array('user/me/edit', 'user/2/edit', 2);
+
+    return $data;
+  }
+
+}
+
diff --git a/core/modules/user/user.links.menu.yml b/core/modules/user/user.links.menu.yml
index 3490a8d..62c7e8f 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
+  url: user/me
   menu_name: account
   class: Drupal\user\Plugin\Menu\MyAccountMenuLink
 user.logout:
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index 087ffec..5b211ee 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -5,7 +5,6 @@ user.register:
     _title: 'Create new account'
   requirements:
     _access_user_register: 'TRUE'
-
 user.logout:
   path: '/user/logout'
   defaults:
@@ -141,6 +140,15 @@ user.view:
   requirements:
     _entity_access: 'user.view'
 
+user.me:
+  path: '/user/me'
+  defaults:
+    _entity_view: 'user.full'
+    _title_callback: 'Drupal\user\Controller\UserController::userTitle'
+    user: 0
+  requirements:
+    _entity_access: 'user.view'
+
 user.login:
   path: '/user/login'
   defaults:
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index c703c0b..9055448 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -41,6 +41,11 @@ services:
     arguments: ['@maintenance_mode', '@current_user']
     tags:
       - { name: event_subscriber }
+  user.path_processor_me:
+    class: Drupal\user\PathProcessor\PathProcessorMe
+    arguments: ['@current_user']
+    tags:
+      - { name: path_processor_inbound }
   theme.negotiator.admin_theme:
     class: Drupal\user\Theme\AdminNegotiator
     arguments: ['@current_user', '@config.factory', '@entity.manager', '@router.admin_context']
