diff --git a/core/lib/Drupal/Core/Routing/RouteCompiler.php b/core/lib/Drupal/Core/Routing/RouteCompiler.php
index bd6c7b4..6e845cc 100644
--- a/core/lib/Drupal/Core/Routing/RouteCompiler.php
+++ b/core/lib/Drupal/Core/Routing/RouteCompiler.php
@@ -124,7 +124,7 @@ public static function getFit($path) {
    * @return string
    *   The path string, stripped of placeholders that have default values.
    */
-  protected static function getPathWithoutDefaults(Route $route) {
+  public static function getPathWithoutDefaults(Route $route) {
     $path = $route->getPattern();
     $defaults = $route->getDefaults();
 
diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/views/display/RestExport.php b/core/modules/rest/lib/Drupal/rest/Plugin/views/display/RestExport.php
index 6ffdd9a..6c6a463 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/views/display/RestExport.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/views/display/RestExport.php
@@ -8,6 +8,7 @@
 namespace Drupal\rest\Plugin\views\display;
 
 
+use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\views\Annotation\ViewsDisplay;
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\ContentNegotiation;
@@ -100,9 +101,11 @@ class RestExport extends PathPluginBase {
    *   The content negotiation library.
    * @param \Symfony\Component\HttpFoundation\Request $request
    *   The request object.
+   * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
+   *   The route provider
    */
-  public function __construct(array $configuration, $plugin_id, array $plugin_definition, ContentNegotiation $content_negotiation, Request $request) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, RouteProviderInterface $route_provider, ContentNegotiation $content_negotiation, Request $request) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $route_provider);
     $this->contentNegotiation = $content_negotiation;
     $this->request = $request;
   }
@@ -115,6 +118,7 @@ public static function create(ContainerInterface $container, array $configuratio
       $configuration,
       $plugin_id,
       $plugin_definition,
+      $container->get('router.route_provider'),
       $container->get('content_negotiation'),
       $container->get('request')
     );
diff --git a/core/modules/rest/tests/Drupal/rest/Tests/CollectRoutesTest.php b/core/modules/rest/tests/Drupal/rest/Tests/CollectRoutesTest.php
index 7f27170..cd417b4 100644
--- a/core/modules/rest/tests/Drupal/rest/Tests/CollectRoutesTest.php
+++ b/core/modules/rest/tests/Drupal/rest/Tests/CollectRoutesTest.php
@@ -77,6 +77,11 @@ protected function setUp() {
       ->getMock();
     $container->set('plugin.manager.views.access', $access_manager);
 
+    $route_provider = $this->getMockBuilder('\Drupal\Core\Routing\RouteProviderInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $container->set('router.route_provider', $route_provider);
+
     $style_manager = $this->getMockBuilder('\Drupal\views\Plugin\ViewsPluginManager')
       ->disableOriginalConstructor()
       ->getMock();
diff --git a/core/modules/user/lib/Drupal/user/Controller/UserAdmin.php b/core/modules/user/lib/Drupal/user/Controller/UserAdmin.php
new file mode 100644
index 0000000..c5da477
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/Controller/UserAdmin.php
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Controller\UserAdmin.
+ */
+
+namespace Drupal\user\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Database\Connection;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Entity\Query\QueryInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\user\UserStorageControllerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a user administrative listing.
+ *
+ * @todo Convert this to a entity list controller once table sort is supported.
+ */
+class UserAdmin extends ControllerBase implements ContainerInjectionInterface {
+
+  /**
+   * The database connection.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $connection;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The user storage controller.
+   *
+   * @var \Drupal\user\UserStorageControllerInterface
+   */
+  protected $storageController;
+
+  /**
+   * The entity query.
+   *
+   * @var \Drupal\Core\Entity\Query\QueryInterface
+   */
+  protected $entityQuery;
+
+  /**
+   * Constructs a new UserAdmin object.
+   *
+   * @param \Drupal\Core\Database\Connection $connection
+   *   The database connection.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\user\UserStorageControllerInterface $storage_controller
+   *   The user storage controller.
+   * @param \Drupal\Core\Entity\Query\QueryInterface $entity_query
+   *   The entity query.
+   */
+  public function __construct(Connection $connection, ModuleHandlerInterface $module_handler, UserStorageControllerInterface $storage_controller, QueryInterface $entity_query) {
+    $this->connection = $connection;
+    $this->moduleHandler = $module_handler;
+    $this->storageController = $storage_controller;
+    $this->entityQuery = $entity_query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('database'),
+      $container->get('module_handler'),
+      $container->get('entity.manager')->getStorageController('user'),
+      $container->get('entity.query')->get('user')
+    );
+  }
+
+  /**
+   * User administrative listing.
+   *
+   * @return array
+   *   A render array as expected by drupal_render().
+   */
+  public function userList() {
+    $header = array(
+      'username' => array('data' => $this->t('Username'), 'field' => 'name', 'specifier' => 'name'),
+      'status' => array('data' => $this->t('Status'), 'field' => 'status', 'specifier' => 'status', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
+      'roles' => array('data' => $this->t('Roles'), 'class' => array(RESPONSIVE_PRIORITY_LOW)),
+      'member_for' => array('data' => $this->t('Member for'), 'field' => 'created', 'specifier' => 'created', 'sort' => 'desc', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
+      'access' => array('data' => $this->t('Last access'), 'field' => 'access', 'specifier' => 'access', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
+      'operations' => $this->t('Operations'),
+    );
+
+    $this->entityQuery->condition('uid', 0, '<>');
+    $this->entityQuery->pager(50);
+    $this->entityQuery->tableSort($header);
+    $uids = $this->entityQuery->execute();
+    $accounts = $this->storageController->loadMultiple($uids);
+
+    $destination = drupal_get_destination();
+    $status = array($this->t('blocked'), $this->t('active'));
+    $roles = array_map('\Drupal\Component\Utility\String::checkPlain', user_role_names(TRUE));
+    unset($roles[DRUPAL_AUTHENTICATED_RID]);
+    $options = array();
+    foreach ($accounts as $account) {
+      $users_roles = array();
+      foreach ($account->getRoles() as $role) {
+        if (isset($roles[$role])) {
+          $users_roles[] = $roles[$role];
+        }
+      }
+      asort($users_roles);
+      $options[$account->id()]['username']['data'] = array(
+        '#theme' => 'username',
+        '#account' => $account,
+      );
+      $options[$account->id()]['status'] = $status[$account->isActive()];
+      $options[$account->id()]['roles']['data'] = array(
+        '#theme' => 'item_list',
+        '#items' => $users_roles,
+      );
+      $options[$account->id()]['member_for'] = format_interval(REQUEST_TIME - $account->getCreatedTime());
+      $options[$account->id()]['access'] = $account->access ? $this->t('@time ago', array('@time' => format_interval(REQUEST_TIME - $account->getLastAccessedTime()))) : t('never');
+      $links = array();
+      $links['edit'] = array(
+        'title' => $this->t('Edit'),
+        'href' => 'user/' . $account->id() . '/edit',
+        'query' => $destination,
+      );
+      if ($this->moduleHandler->invoke('content_translation', 'translate_access', array($account))) {
+        $links['translate'] = array(
+          'title' => $this->t('Translate'),
+          'href' => 'user/' . $account->id() . '/translations',
+          'query' => $destination,
+        );
+      }
+      $options[$account->id()]['operations']['data'] = array(
+        '#type' => 'operations',
+        '#links' => $links,
+      );
+    }
+
+    $build['accounts'] = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $options,
+      '#empty' => $this->t('No people available.'),
+    );
+    $build['pager'] = array(
+      '#theme' =>'pager',
+    );
+
+    return $build;
+  }
+
+}
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index 4caec43..9a6ca2a 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -6,91 +6,6 @@
  */
 
 /**
- * Page callback: User administration page.
- */
-function user_admin_account() {
-  $header = array(
-    'username' => array('data' => t('Username'), 'field' => 'u.name'),
-    'status' => array('data' => t('Status'), 'field' => 'u.status', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
-    'roles' => array('data' => t('Roles'), 'class' => array(RESPONSIVE_PRIORITY_LOW)),
-    'member_for' => array('data' => t('Member for'), 'field' => 'u.created', 'sort' => 'desc', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
-    'access' => array('data' => t('Last access'), 'field' => 'u.access', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
-    'operations' => t('Operations'),
-  );
-
-  $query = db_select('users', 'u');
-  $query->condition('u.uid', 0, '<>');
-
-  $count_query = clone $query;
-  $count_query->addExpression('COUNT(u.uid)');
-
-  $query = $query
-    ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
-    ->extend('Drupal\Core\Database\Query\TableSortExtender');
-  $query
-    ->fields('u', array('uid'))
-    ->limit(50)
-    ->orderByHeader($header)
-    ->setCountQuery($count_query);
-  $uids = $query->execute()
-    ->fetchCol('uid');
-
-  $destination = drupal_get_destination();
-  $accounts = user_load_multiple($uids);
-
-  foreach ($accounts as $account) {
-    $users_roles = $account->getRoles();
-    unset($users_roles[0]);
-    asort($users_roles);
-    $username = array(
-      '#theme' => 'username',
-      '#account' => $account,
-    );
-    $item_list = array(
-      '#theme' => 'item_list',
-      '#items' => $users_roles,
-    );
-    $options[$account->id()] = array(
-      'username' => drupal_render($username),
-      'status' => $account->isActive() ? t('active') : t('blocked'),
-      'roles' => drupal_render($item_list),
-      'member_for' => format_interval(REQUEST_TIME - $account->getCreatedTime()),
-      'access' => $account->getLastAccessedTime() ? t('@time ago', array('@time' => format_interval(REQUEST_TIME - $account->getLastAccessedTime()))) : t('never'),
-    );
-    $links = array();
-    $links['edit'] = array(
-      'title' => t('Edit'),
-      'href' => 'user/' . $account->id() . '/edit',
-      'query' => $destination,
-    );
-    if (module_invoke('content_translation', 'translate_access', $account)) {
-      $links['translate'] = array(
-        'title' => t('Translate'),
-        'href' => 'user/' . $account->id() . '/translations',
-        'query' => $destination,
-      );
-    }
-    $options[$account->id()]['operations']['data'] = array(
-      '#type' => 'operations',
-      '#links' => $links,
-    );
-
-  }
-
-  $form['accounts'] = array(
-    '#theme' => 'table',
-    '#header' => $header,
-    '#rows' => $options,
-    '#empty' => t('No people available.'),
-  );
-  $form['pager'] = array(
-    '#theme' =>'pager',
-  );
-
-  return $form;
-}
-
-/**
  * Returns HTML for an individual permission description.
  *
  * @param $variables
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 1f50de0..9726658 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -768,11 +768,13 @@ function user_menu() {
   $items['admin/people'] = array(
     'title' => 'People',
     'description' => 'Manage user accounts, roles, and permissions.',
-    'page callback' => 'user_admin_account',
-    'access arguments' => array('administer users'),
+    'route_name' => 'user_admin_account',
     'position' => 'left',
     'weight' => -4,
-    'file' => 'user.admin.inc',
+  );
+  $items['admin/people/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
   );
   // Permissions and role forms.
   $items['admin/people/permissions'] = array(
@@ -811,7 +813,7 @@ function user_menu() {
   $items['admin/people/create'] = array(
     'title' => 'Add user',
     'route_name' => 'user_admin_create',
-    'type' => MENU_LOCAL_ACTION,
+    'type' => MENU_SIBLING_LOCAL_TASK,
   );
   $items['admin/people/cancel'] = array(
     'title' => 'Cancel user',
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index ba75389..7c3228a 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -40,6 +40,13 @@ user_account_settings:
   requirements:
     _permission: 'administer account settings'
 
+user_admin_account:
+  pattern: '/admin/people'
+  defaults:
+    _controller: '\Drupal\user\Controller\UserAdmin::userList'
+  requirements:
+    _permission: 'administer users'
+
 user_admin_create:
   pattern: '/admin/people/create'
   defaults:
diff --git a/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php b/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php
index e3dbde3..9005d89 100644
--- a/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php
+++ b/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php
@@ -7,9 +7,11 @@
 
 namespace Drupal\views\EventSubscriber;
 
+use Drupal\Core\Entity\EntityManager;
 use Drupal\Core\Routing\RouteBuildEvent;
 use Drupal\Core\Routing\RoutingEvents;
 use Drupal\views\Plugin\views\display\DisplayRouterInterface;
+use Drupal\views\ViewExecutable;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
@@ -18,14 +20,64 @@
 class RouteSubscriber implements EventSubscriberInterface {
 
   /**
+   * Stores a list of view,display IDs containing routes.
+   *
+   * @var array
+   */
+  protected $viewsDisplayPairs;
+
+  /**
+   * The view storage controller.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageControllerInterface
+   */
+  protected $viewStorageController;
+
+  /**
+   * Constructs a \Drupal\views\EventSubscriber\RouteSubscriber instance.
+   *
+   * @param \Drupal\Core\Entity\EntityManager $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(EntityManager $entity_manager) {
+    $this->viewStorageController = $entity_manager->getStorageController('view');
+  }
+
+  /**
+   * Resets the internal state of the route subscriber
+   */
+  public function reset() {
+    $this->viewsDisplayPairs = NULL;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public static function getSubscribedEvents() {
     $events[RoutingEvents::DYNAMIC] = 'dynamicRoutes';
+    $events[RoutingEvents::ALTER] = 'alterRoutes';
     return $events;
   }
 
   /**
+   * Gets all the views and display IDs using a route.
+   */
+  protected function getViewsDisplayIDsWithRoute() {
+    if (!isset($this->viewsDisplayPairs)) {
+      $this->viewsDisplayPairs = array();
+
+      // @todo Convert this method to some service.
+      $views = views_get_applicable_views('uses_route');
+      foreach ($views as $data) {
+        list($view, $display_id) = $data;
+        $id = $view->storage->id();
+        $this->viewsDisplayPairs[$id . ':' . $display_id] = $id . ':' . $display_id;
+      }
+    }
+    return $this->viewsDisplayPairs;
+  }
+
+  /**
    * Adds routes defined by all views.
    *
    * @param \Drupal\Core\Routing\RouteBuildEvent $event
@@ -34,15 +86,43 @@ public static function getSubscribedEvents() {
   public function dynamicRoutes(RouteBuildEvent $event) {
     $collection = $event->getRouteCollection();
 
-    $views = views_get_applicable_views('uses_route');
-    foreach ($views as $data) {
-      list($view, $display_id) = $data;
-      if ($view->setDisplay($display_id) && $display = $view->displayHandlers->get($display_id)) {
-        if ($display instanceof DisplayRouterInterface) {
-          $display->collectRoutes($collection);
+
+    foreach ($this->getViewsDisplayIDsWithRoute() as $pair) {
+      list($view_id, $display_id) = explode(':', $pair);
+      $view = $this->viewStorageController->load($view_id);
+      // @todo This should have a executable factory injected.
+      if (($view = $view->getExecutable()) && $view instanceof ViewExecutable) {
+        if ($view->setDisplay($display_id) && $display = $view->displayHandlers->get($display_id)) {
+          if ($display instanceof DisplayRouterInterface) {
+            $display->collectRoutes($collection);
+          }
+        }
+        $view->destroy();
+      }
+    }
+  }
+
+  /**
+   * Alters existing routes.
+   *
+   * @param \Drupal\Core\Routing\RouteBuildEvent $event
+   *   The route building event.
+   */
+  public function alterRoutes(RouteBuildEvent $event) {
+    foreach ($this->getViewsDisplayIDsWithRoute() as $pair) {
+      list($view_id, $display_id) = explode(':', $pair);
+      $view = $this->viewStorageController->load($view_id);
+      // @todo This should have a executable factory injected.
+      if (($view = $view->getExecutable()) && $view instanceof ViewExecutable) {
+        if ($view->setDisplay($display_id) && $display = $view->displayHandlers->get($display_id)) {
+          if ($display instanceof DisplayRouterInterface) {
+            // If the display returns TRUE a route item was found, so it does not
+            // have to be added.
+            $display->alterRoutes($event->getRouteCollection());
+          }
         }
+        $view->destroy();
       }
-      $view->destroy();
     }
   }
 
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayRouterInterface.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayRouterInterface.php
index 68cbe68..834514d 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayRouterInterface.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayRouterInterface.php
@@ -7,13 +7,14 @@
 
 namespace Drupal\views\Plugin\views\display;
 
+use Symfony\Component\Routing\RouteCollection;
+
 /**
  * Defines an interface for displays that can collect routes.
  *
  * In addition to implementing the interface, specify 'uses_routes' in the
  * plugin definition.
  */
-use Symfony\Component\Routing\RouteCollection;
 
 interface DisplayRouterInterface {
 
@@ -25,4 +26,17 @@
    */
   public function collectRoutes(RouteCollection $collection);
 
+  /**
+   * Alters a collection of routes and replaces definitions to the view.
+   *
+   * Most of the collections won't have the needed route, so by the return value
+   * the method can specify to break the search.
+   *
+   * @param \Symfony\Component\Routing\RouteCollection $collection
+   *
+   * @return bool
+   *   Returns TRUE if an existing route was found, otherwise FALSE.
+   */
+  public function alterRoutes(RouteCollection $collection);
+
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/display/PathPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/PathPluginBase.php
index 57691f1..f0578fd 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/display/PathPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/PathPluginBase.php
@@ -7,8 +7,11 @@
 
 namespace Drupal\views\Plugin\views\display;
 
+use Drupal\Core\Routing\RouteCompiler;
+use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\views\Views;
 
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\Routing\Route;
@@ -20,6 +23,43 @@
 abstract class PathPluginBase extends DisplayPluginBase implements DisplayRouterInterface {
 
   /**
+   * The route provider.
+   *
+   * @var \Drupal\Core\Routing\RouteProviderInterface
+   */
+  protected $routeProvider;
+
+  /**
+   * Constructs a PathPluginBase object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param array $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
+   *   The route provider.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, RouteProviderInterface $route_provider) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->routeProvider = $route_provider;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('router.route_provider')
+    );
+  }
+
+  /**
    * Overrides \Drupal\views\Plugin\views\display\DisplayPluginBase::hasPath().
    */
   public function hasPath() {
@@ -60,12 +100,17 @@ protected function defineOptions() {
   }
 
   /**
-   * {@inheritdoc}
+   * Generates a route entry for a given view and display.
+   *
+   * @param string $view_id
+   *   The ID of the view.
+   * @param string $display_id
+   *   The current display ID.
+   *
+   * @return \Symfony\Component\Routing\Route
+   *   The route for the view.
    */
-  public function collectRoutes(RouteCollection $collection) {
-    $view_id = $this->view->storage->id();
-    $display_id = $this->display['id'];
-
+  protected function getRoute($view_id, $display_id) {
     $defaults = array(
       '_controller' => 'Drupal\views\Routing\ViewPageController::handle',
       'view_id' => $view_id,
@@ -126,11 +171,44 @@ public function collectRoutes(RouteCollection $collection) {
       $access_plugin = Views::pluginManager('access')->createInstance('none');
     }
     $access_plugin->alterRouteDefinition($route);
+    return $route;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function collectRoutes(RouteCollection $collection) {
+    $view_id = $this->view->storage->id();
+    $display_id = $this->display['id'];
+
+    $route = $this->getRoute($view_id, $display_id);
 
     $collection->add("view.$view_id.$display_id", $route);
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function alterRoutes(RouteCollection $collection) {
+    $found = FALSE;
+    $view_path = $this->getPath();
+    foreach ($collection->all() as $name => $route) {
+      // Find all paths which match the path of the current display..
+      $route_path = RouteCompiler::getPathWithoutDefaults($route);
+      $route_path = RouteCompiler::getPatternOutline($route_path);
+      if (!$route->hasDefault('view_id') &&  '/' . $view_path == $route_path) {
+        // @todo Figure out whether we need to merge some settings (like
+        // requirements).
+        // Replace the existing route with a new one based on views.
+        $collection->remove($name);
+        $found = TRUE;
+      }
+    }
+
+    return $found;
+  }
+
+  /**
    * Overrides \Drupal\views\Plugin\views\display\DisplayPluginBase::executeHookMenu().
    */
   public function executeHookMenu($callbacks) {
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayPageTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayPageTest.php
index d3ddcf0..163c7ec 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayPageTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayPageTest.php
@@ -86,6 +86,7 @@ public function testPageResponses() {
     $view = views_get_view('test_page_display');
     // Disable the view, rebuild menu, and request the page again.
     $view->storage->disable()->save();
+
     $subrequest = Request::create('/test_page_display_200', 'GET');
     $response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
     $this->assertEqual($response->getStatusCode(), 404);
@@ -95,7 +96,7 @@ public function testPageResponses() {
    * Checks that the router items are properly registered
    */
   public function testPageRouterItems() {
-    $subscriber = new RouteSubscriber();
+    $subscriber = new RouteSubscriber($this->container->get('entity.manager'));
     $collection = new RouteCollection();
     $subscriber->dynamicRoutes(new RouteBuildEvent($collection, 'dynamic_routes'));
 
diff --git a/core/modules/views/tests/Drupal/views/Tests/Plugin/display/PathPluginBaseTest.php b/core/modules/views/tests/Drupal/views/Tests/Plugin/display/PathPluginBaseTest.php
new file mode 100644
index 0000000..c251c41
--- /dev/null
+++ b/core/modules/views/tests/Drupal/views/Tests/Plugin/display/PathPluginBaseTest.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Plugin\display\PathPluginBaseTest.
+ */
+
+namespace Drupal\views\Tests\Plugin\display;
+
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * Tests the abstract base class for path based display plugins.
+ *
+ * @see \Drupal\views\Plugin\views\display\PathPluginBase
+ */
+class PathPluginBaseTest extends UnitTestCase {
+
+  /**
+   * The route provider that should be used.
+   *
+   * @var \Drupal\Core\Routing\RouteProviderInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $routeProvider;
+
+  /**
+   * The tested path plugin base.
+   *
+   * @var \Drupal\views\Plugin\views\display\PathPluginBase
+   */
+  public $pathPlugin;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Display: Path plugin base.',
+      'description' => 'Tests the abstract base class for path based display plugins.',
+      'group' => 'Views Plugins',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
+    $this->pathPlugin = $this->getMockBuilder('Drupal\views\Plugin\views\display\PathPluginBase')
+      ->setConstructorArgs(array(array(), 'path_base', array(), $this->routeProvider))
+      ->setMethods(NULL)
+      ->getMock();
+  }
+
+  /**
+   * Tests the alter route method.
+   */
+  public function testAlterRoute() {
+    $collection = new RouteCollection();
+    $collection->add('test_route', new Route('test_route', array('_controller' => 'Drupal\Tests\Core\Controller\TestController')));
+    $collection->add('test_route_2', new Route('test_route/example', array('_controller' => 'Drupal\Tests\Core\Controller\TestController')));
+
+    $view = $this->getMockBuilder('Drupal\views\ViewExecutable')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $display = array();
+    $display['display_plugin'] = 'page';
+    $display['id'] = 'page_1';
+    $display['display_options'] = array(
+
+    );
+    // @todo write the actual test.
+  }
+
+}
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index e46f7fe..2935ba1 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -700,6 +700,9 @@ function views_invalidate_cache() {
 
   $module_handler = Drupal::moduleHandler();
 
+  // Reset the RouteSubscriber from views.
+  \Drupal::getContainer()->get('views.route_subscriber')->reset();
+
   // Set the router to be rebuild.
   // @todo Figure out why the cache rebuild is trigged but the route table
   //   does not exist yet.
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index c77a27d..ee1b500 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -83,7 +83,7 @@ services:
     arguments: [views_results]
   views.route_subscriber:
     class: Drupal\views\EventSubscriber\RouteSubscriber
-    arguments: ['@config.factory']
+    arguments: ['@entity.manager']
     tags:
       - { name: 'event_subscriber' }
   views.route_access_check:
diff --git a/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewListControllerTest.php b/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewListControllerTest.php
index ba82c0d..958eadf 100644
--- a/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewListControllerTest.php
+++ b/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewListControllerTest.php
@@ -77,9 +77,10 @@ public function testBuildRowEntityList() {
       array('initDisplay'),
       array(array(), 'default', $display_manager->getDefinition('default'))
     );
+    $route_provider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
     $page_display = $this->getMock('Drupal\views\Plugin\views\display\Page',
       array('initDisplay', 'getPath'),
-      array(array(), 'default', $display_manager->getDefinition('page'))
+      array(array(), 'default', $display_manager->getDefinition('page'), $route_provider)
     );
     $page_display->expects($this->any())
       ->method('getPath')
