diff --git a/core/modules/tracker/lib/Drupal/tracker/Access/UserTrackerAccessCheck.php b/core/modules/tracker/lib/Drupal/tracker/Access/UserTrackerAccessCheck.php
new file mode 100644
index 0000000..c53d293
--- /dev/null
+++ b/core/modules/tracker/lib/Drupal/tracker/Access/UserTrackerAccessCheck.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tracker\Access\UserTrackerAccessCheck.
+ */
+
+namespace Drupal\tracker\Access;
+
+use Drupal\Core\Access\AccessCheckInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Access check for user tracker routes.
+ */
+class UserTrackerAccessCheck implements AccessCheckInterface {
+
+  /**
+   * Implements AccessCheckInterface::applies().
+   */
+  public function applies(Route $route) {
+    return array_key_exists('_access_tracker_user_tab', $route->getRequirements());
+  }
+
+  /**
+   * Implements AccessCheckInterface::access().
+   */
+  public function access(Route $route, Request $request) {
+    // The user object from the User ID in the path.
+    $account = $request->attributes->get('user');
+    $user = \Drupal::currentUser();
+    return $user->hasPermission('access content') && $account->access('view', $user);
+  }
+}
+
diff --git a/core/modules/tracker/lib/Drupal/tracker/Access/ViewOwnTrackerAccessCheck.php b/core/modules/tracker/lib/Drupal/tracker/Access/ViewOwnTrackerAccessCheck.php
new file mode 100644
index 0000000..1bc288b
--- /dev/null
+++ b/core/modules/tracker/lib/Drupal/tracker/Access/ViewOwnTrackerAccessCheck.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\tracker\Access\ViewOwnTrackerAccessCheck.
+ */
+
+namespace Drupal\tracker\Access;
+
+use Drupal\Core\Access\AccessCheckInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Access check for user tracker routes.
+ */
+class ViewOwnTrackerAccessCheck implements AccessCheckInterface {
+
+  /**
+   * Implements AccessCheckInterface::applies().
+   */
+  public function applies(Route $route) {
+    return array_key_exists('_access_tracker_own_information', $route->getRequirements());
+  }
+
+  /**
+   * Implements AccessCheckInterface::access().
+   */
+  public function access(Route $route, Request $request) {
+    // The user object from the User ID in the path.
+    $account = $request->attributes->get('user');
+    $user = \Drupal::currentUser();
+    return $user->isAuthenticated() && ($user->id() == $account->id()) && $user->hasPermission('access content');
+  }
+}
+
diff --git a/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerPage.php b/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerPage.php
new file mode 100644
index 0000000..eab9494
--- /dev/null
+++ b/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerPage.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tracker\Controller\TrackerPage.
+ */
+
+namespace Drupal\tracker\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+
+class TrackerPage extends ControllerBase {
+  public function getContent() {
+    module_load_include('inc', 'tracker', 'tracker.pages');
+    return tracker_page();
+  }
+}
diff --git a/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerUserRecent.php b/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerUserRecent.php
new file mode 100644
index 0000000..fc7d27a
--- /dev/null
+++ b/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerUserRecent.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tracker\Controller\TrackerUserRecent.
+ */
+
+namespace Drupal\tracker\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\user\UserInterface;
+
+class TrackerUserRecent extends ControllerBase {
+  public function getContent(UserInterface $user) {
+    module_load_include('inc', 'tracker', 'tracker.pages');
+    return tracker_page($user);
+  }
+}
diff --git a/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerUserTab.php b/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerUserTab.php
new file mode 100644
index 0000000..99822f3
--- /dev/null
+++ b/core/modules/tracker/lib/Drupal/tracker/Controller/TrackerUserTab.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tracker\Controller\TrackerUserTab.
+ */
+
+namespace Drupal\tracker\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\user\UserInterface;
+use Drupal\Component\Utility\String;
+
+
+class TrackerUserTab extends ControllerBase {
+  public function getContent(UserInterface $user) {
+    module_load_include('inc', 'tracker', 'tracker.pages');
+    return tracker_page($user);
+  }
+
+  public function getTitle(UserInterface $user) {
+    return String::checkPlain(user_format_name($user));
+  }
+}
diff --git a/core/modules/tracker/lib/Drupal/tracker/Plugin/Menu/UserTrackerTab.php b/core/modules/tracker/lib/Drupal/tracker/Plugin/Menu/UserTrackerTab.php
new file mode 100644
index 0000000..a8e67da
--- /dev/null
+++ b/core/modules/tracker/lib/Drupal/tracker/Plugin/Menu/UserTrackerTab.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tracker\Plugin\Menu\UserTrackerTab.
+ */
+
+namespace Drupal\tracker\Plugin\Menu;
+
+use Drupal\Core\Menu\LocalTaskDefault;
+use Drupal\Core\Routing\RouteProviderInterface;
+use Drupal\Core\StringTranslation\TranslationInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+class UserTrackerTab extends LocalTaskDefault {
+
+  /**
+   * Current user ID.
+   *
+   * @var int
+   */
+  protected $currentUserId;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @param int $current_user_id
+   *   Ths User ID for the current user.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, TranslationInterface $string_translation, RouteProviderInterface $route_provider, $current_user_id) {
+    $this->currentUserId = $current_user_id;
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $string_translation, $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('string_translation'),
+      $container->get('router.route_provider'),
+      $container->get('current_user')->id()
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRouteParameters(Request $request) {
+    return array('user' => $this->currentUserId);
+  }
+
+}
diff --git a/core/modules/tracker/tracker.local_tasks.yml b/core/modules/tracker/tracker.local_tasks.yml
new file mode 100644
index 0000000..b06f342
--- /dev/null
+++ b/core/modules/tracker/tracker.local_tasks.yml
@@ -0,0 +1,10 @@
+tracker_page_tab:
+  route_name: tracker.page
+  title: 'Recent content'
+  tab_root_id: tracker_page_tab
+
+tracker_users_recent_tab:
+  route_name: tracker.users_recent_content
+  title: 'My recent content'
+  tab_root_id: tracker_page_tab
+  class: '\Drupal\tracker\Plugin\Menu\UserTrackerTab'
diff --git a/core/modules/tracker/tracker.module b/core/modules/tracker/tracker.module
index 88f4f02..df97666 100644
--- a/core/modules/tracker/tracker.module
+++ b/core/modules/tracker/tracker.module
@@ -69,7 +69,7 @@ function tracker_menu() {
     'type' => MENU_DEFAULT_LOCAL_TASK,
   );
 
-  return $items;
+  return array();
 }
 
 /**
diff --git a/core/modules/tracker/tracker.routing.yml b/core/modules/tracker/tracker.routing.yml
new file mode 100644
index 0000000..80716a2
--- /dev/null
+++ b/core/modules/tracker/tracker.routing.yml
@@ -0,0 +1,23 @@
+tracker.page:
+  path: '/tracker'
+  defaults:
+    _content: '\Drupal\tracker\Controller\TrackerPage::getContent'
+    _title: 'Recent content'
+  requirements:
+    _permission: 'access content'
+
+tracker.users_recent_content:
+  path: '/tracker/{user}'
+  defaults:
+    _content: '\Drupal\tracker\Controller\TrackerUserRecent::getContent'
+    _title: 'My recent content'
+  requirements:
+    _access_tracker_own_information: 'TRUE'
+
+tracker.user_tab:
+  path: '/user/{user}/track'
+  defaults:
+    _content: '\Drupal\tracker\Controller\TrackerUserTab::getContent'
+    _title_callback: '\Drupal\tracker\Controller\TrackerUserTab::getTitle'
+  requirements:
+    _access_tracker_user_tab: 'TRUE'
diff --git a/core/modules/tracker/tracker.services.yml b/core/modules/tracker/tracker.services.yml
new file mode 100644
index 0000000..834eb62
--- /dev/null
+++ b/core/modules/tracker/tracker.services.yml
@@ -0,0 +1,10 @@
+services:
+  access_check.tracker.view_own:
+    class: Drupal\tracker\Access\ViewOwnTrackerAccessCheck
+    tags:
+      - { name: access_check }
+  access_check.tracker.user_tab:
+    class: Drupal\tracker\Access\UserTrackerAccessCheck
+    tags:
+      - { name: access_check }
+
