diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
index e665609..cea4373 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
@@ -49,7 +49,7 @@ function testBlockVisibility() {
     $this->drupalGet('user');
     $this->assertNoText($title, 'Block was not displayed according to block visibility rules.');
 
-    $this->drupalGet('USER/' . $this->adminUser->id());
+    $this->drupalGet('user/' . $this->adminUser->id());
     $this->assertNoText($title, 'Block was not displayed according to block visibility rules regardless of path case.');
 
     // Confirm that the block is not displayed to anonymous users.
diff --git a/core/modules/user/lib/Drupal/user/Controller/UserController.php b/core/modules/user/lib/Drupal/user/Controller/UserController.php
index cd63cb0..7599734 100644
--- a/core/modules/user/lib/Drupal/user/Controller/UserController.php
+++ b/core/modules/user/lib/Drupal/user/Controller/UserController.php
@@ -7,15 +7,45 @@
 
 namespace Drupal\user\Controller;
 
+use Drupal\Core\Controller\ControllerInterface;
+use Drupal\Core\Entity\EntityRenderControllerInterface;
 use Drupal\user\Form\UserLoginForm;
+use Drupal\user\UserInterface;
 use Symfony\Component\DependencyInjection\ContainerAware;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Controller routines for user routes.
  */
-class UserController extends ContainerAware {
+class UserController extends ContainerAware implements ControllerInterface {
+
+  /**
+   * The user render controller.
+   *
+   * @var \Drupal\Core\Entity\EntityRenderControllerInterface
+   */
+  protected $renderController;
+
+  /**
+   * Constructs a new UserController object.
+   *
+   * @param \Drupal\Core\Entity\EntityRenderControllerInterface $render_controller
+   *   The user render controller.
+   */
+  public function __construct(EntityRenderControllerInterface $render_controller) {
+    $this->renderController = $render_controller;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.entity')->getRenderController('user')
+    );
+  }
 
   /**
    * Returns the user page.
@@ -55,4 +85,17 @@ public function logout(Request $request) {
     return new RedirectResponse(url('<front>', array('absolute' => TRUE)));
   }
 
+  /**
+   * Displays a user account page.
+   *
+   * @param \Drupal\user\UserInterface $account
+   *   User account to display.
+   *
+   * @return array
+   *   The user page.
+   */
+  public function viewPage(UserInterface $account) {
+    return $this->renderController->view($account->getBCEntity());
+  }
+
 }
diff --git a/core/modules/user/lib/Drupal/user/Controller/UserViewController.php b/core/modules/user/lib/Drupal/user/Controller/UserViewController.php
new file mode 100644
index 0000000..7599734
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/Controller/UserViewController.php
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Controller\UserController.
+ */
+
+namespace Drupal\user\Controller;
+
+use Drupal\Core\Controller\ControllerInterface;
+use Drupal\Core\Entity\EntityRenderControllerInterface;
+use Drupal\user\Form\UserLoginForm;
+use Drupal\user\UserInterface;
+use Symfony\Component\DependencyInjection\ContainerAware;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Controller routines for user routes.
+ */
+class UserController extends ContainerAware implements ControllerInterface {
+
+  /**
+   * The user render controller.
+   *
+   * @var \Drupal\Core\Entity\EntityRenderControllerInterface
+   */
+  protected $renderController;
+
+  /**
+   * Constructs a new UserController object.
+   *
+   * @param \Drupal\Core\Entity\EntityRenderControllerInterface $render_controller
+   *   The user render controller.
+   */
+  public function __construct(EntityRenderControllerInterface $render_controller) {
+    $this->renderController = $render_controller;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.entity')->getRenderController('user')
+    );
+  }
+
+  /**
+   * Returns the user page.
+   *
+   * Displays user profile if user is logged in, or login form for anonymous
+   * users.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The request object.
+   *
+   * @return \Symfony\Component\HttpFoundation\RedirectResponse|array
+   *   Returns either a redirect to the user page or the render
+   *   array of the login form.
+   */
+  public function userPage(Request $request) {
+    global $user;
+    if ($user->id()) {
+      $response = new RedirectResponse(url('user/' . $user->id(), array('absolute' => TRUE)));
+    }
+    else {
+      $response = drupal_get_form(UserLoginForm::create($this->container), $request);
+    }
+    return $response;
+  }
+
+  /**
+   * Logs the current user out.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request.
+   *
+   * @return \Symfony\Component\HttpFoundation\RedirectResponse
+   *   A redirection to home page.
+   */
+  public function logout(Request $request) {
+    user_logout();
+    return new RedirectResponse(url('<front>', array('absolute' => TRUE)));
+  }
+
+  /**
+   * Displays a user account page.
+   *
+   * @param \Drupal\user\UserInterface $account
+   *   User account to display.
+   *
+   * @return array
+   *   The user page.
+   */
+  public function viewPage(UserInterface $account) {
+    return $this->renderController->view($account->getBCEntity());
+  }
+
+}
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 0a8d4ab..2f624a3 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -917,10 +917,7 @@ function user_menu() {
     'title' => 'My account',
     'title callback' => 'user_page_title',
     'title arguments' => array(1),
-    'page callback' => 'user_view_page',
-    'page arguments' => array(1),
-    'access callback' => 'entity_page_access',
-    'access arguments' => array(1),
+    'route_name' => 'user_view_page',
   );
   $items['user/%user/view'] = array(
     'title' => 'View',
@@ -1081,8 +1078,8 @@ function user_menu_title() {
 /**
  * Menu item title callback - use the user name.
  */
-function user_page_title(UserInterface $account = NULL) {
-  return $account ? $account->getUsername() : '';
+function user_page_title(UserInterface $account) {
+  return $account->getUsername();
 }
 
 /**
@@ -1392,18 +1389,6 @@ function user_delete_multiple(array $uids) {
 }
 
 /**
- * Page callback wrapper for user_view().
- */
-function user_view_page($account) {
-  if (is_object($account)) {
-    return user_view($account);
-  }
-  // An administrator may try to view a non-existent account,
-  // so we give them a 404 (versus a 403 for non-admins).
-  throw new NotFoundHttpException();
-}
-
-/**
  * Generate an array for rendering the given user.
  *
  * When viewing a user profile, the $page array contains:
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index 90570ea..eb04d9e 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -102,3 +102,11 @@ user_login:
     _form: '\Drupal\user\Form\UserLoginForm'
   requirements:
     _access: 'TRUE'
+
+user_view_page:
+  pattern: '/user/{user}'
+  defaults:
+    _entity_view: 'user.full'
+  requirements:
+    user: \d
+    _entity_access: 'user.view'
