diff --git a/core/modules/comment/src/Plugin/views/field/NodeNewComments.php b/core/modules/comment/src/Plugin/views/field/NodeNewComments.php
index b1a3de1..9638e77 100644
--- a/core/modules/comment/src/Plugin/views/field/NodeNewComments.php
+++ b/core/modules/comment/src/Plugin/views/field/NodeNewComments.php
@@ -163,9 +163,17 @@ public function preRender(&$values) {
     }
 
     if ($nids) {
-      $result = $this->database->query("SELECT n.nid, COUNT(c.cid) as num_comments FROM {node} n INNER JOIN {comment_field_data} c ON n.nid = c.entity_id AND c.entity_type = 'node' AND c.default_langcode = 1
-        LEFT JOIN {history} h ON h.nid = n.nid AND h.uid = :h_uid WHERE n.nid IN ( :nids[] )
-        AND c.changed > GREATEST(COALESCE(h.timestamp, :timestamp1), :timestamp2) AND c.status = :status GROUP BY n.nid", [
+      $sql = <<<SQL
+      SELECT n.nid, COUNT(c.cid) as num_comments
+      FROM {node} n
+        INNER JOIN {comment_field_data} c ON n.nid = c.entity_id AND c.entity_type = 'node' AND c.default_langcode = 1
+        LEFT JOIN {history} h ON h.nid = n.nid AND h.uid = :h_uid
+      WHERE n.nid IN ( :nids[] )
+        AND c.changed > GREATEST(COALESCE(h.timestamp, :timestamp1), :timestamp2) AND c.status = :status
+      GROUP BY n.nid
+      SQL;
+
+      $result = $this->database->query($sql, [
         ':status' => CommentInterface::PUBLISHED,
         ':h_uid' => $user->id(),
         ':nids[]' => $nids,
diff --git a/core/modules/tracker/src/Controller/TrackerPage.php b/core/modules/tracker/src/Controller/TrackerPage.php
deleted file mode 100644
index 6618e72..0000000
--- a/core/modules/tracker/src/Controller/TrackerPage.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Drupal\tracker\Controller;
-
-@trigger_error(__NAMESPACE__ . '\TrackerPage is deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use \Drupal\tracker\Controller\TrackerController instead. See https://www.drupal.org/node/3030645', E_USER_DEPRECATED);
-
-/**
- * Controller for tracker.page route.
- */
-class TrackerPage extends TrackerController {
-
-  /**
-   * Content callback for the tracker.page route.
-   */
-  public function getContent() {
-    return $this->buildContent();
-  }
-
-}
diff --git a/core/modules/tracker/src/Controller/TrackerUserRecent.php b/core/modules/tracker/src/Controller/TrackerUserRecent.php
deleted file mode 100644
index 256f48a..0000000
--- a/core/modules/tracker/src/Controller/TrackerUserRecent.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Drupal\tracker\Controller;
-
-@trigger_error(__NAMESPACE__ . '\TrackerUserRecent is deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use \Drupal\tracker\Controller\TrackerController instead. See https://www.drupal.org/node/3030645', E_USER_DEPRECATED);
-
-use Drupal\user\UserInterface;
-
-/**
- * Controller for tracker.users_recent_content route.
- */
-class TrackerUserRecent extends TrackerController {
-
-  /**
-   * Content callback for the tracker.users_recent_content route.
-   */
-  public function getContent(UserInterface $user) {
-    return $this->buildContent($user);
-  }
-
-}
diff --git a/core/modules/tracker/src/Controller/TrackerUserTab.php b/core/modules/tracker/src/Controller/TrackerUserTab.php
deleted file mode 100644
index 7ccfa5b..0000000
--- a/core/modules/tracker/src/Controller/TrackerUserTab.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Drupal\tracker\Controller;
-
-@trigger_error(__NAMESPACE__ . '\TrackerUserTab is deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use \Drupal\tracker\Controller\TrackerController instead. See https://www.drupal.org/node/3030645', E_USER_DEPRECATED);
-
-use Drupal\user\UserInterface;
-
-/**
- * Controller for tracker.user_tab route.
- */
-class TrackerUserTab extends TrackerController {
-
-  /**
-   * Content callback for the tracker.user_tab route.
-   */
-  public function getContent(UserInterface $user) {
-    return $this->buildContent($user);
-  }
-
-}
diff --git a/core/modules/tracker/tracker.info.yml b/core/modules/tracker/tracker.info.yml
index d855210..c31c4b9 100644
--- a/core/modules/tracker/tracker.info.yml
+++ b/core/modules/tracker/tracker.info.yml
@@ -4,6 +4,7 @@ description: 'Enables tracking of recent content for users.'
 dependencies:
   - drupal:node
   - drupal:comment
+  - drupal:views
 package: Core
 version: VERSION
 core: 8.x
diff --git a/core/modules/tracker/tracker.links.menu.yml b/core/modules/tracker/tracker.links.menu.yml
deleted file mode 100644
index fe12bc4..0000000
--- a/core/modules/tracker/tracker.links.menu.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-tracker.page:
-  title: 'Recent content'
-  route_name: tracker.page
diff --git a/core/modules/tracker/tracker.links.task.yml b/core/modules/tracker/tracker.links.task.yml
deleted file mode 100644
index 4896057..0000000
--- a/core/modules/tracker/tracker.links.task.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-tracker.page_tab:
-  route_name: tracker.page
-  title: 'Recent content'
-  base_route: tracker.page
-
-tracker.users_recent_tab:
-  route_name: tracker.users_recent_content
-  title: 'My recent content'
-  base_route: tracker.page
-  class: '\Drupal\tracker\Plugin\Menu\UserTrackerTab'
-
-tracker.user_tab:
-  route_name: tracker.user_tab
-  base_route: entity.user.canonical
-  title: 'Activity'
diff --git a/core/modules/tracker/tracker.module b/core/modules/tracker/tracker.module
index 548ce57..079667c 100644
--- a/core/modules/tracker/tracker.module
+++ b/core/modules/tracker/tracker.module
@@ -11,7 +11,6 @@
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\node\Entity\Node;
 use Drupal\node\NodeInterface;
-use Drupal\Core\Session\AccountInterface;
 
 /**
  * Implements hook_help().
@@ -24,7 +23,7 @@ function tracker_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Tracking new and updated site content') . '</dt>';
-      $output .= '<dd>' . t('The <a href=":recent">Recent content</a> page shows new and updated content in reverse chronological order, listing the content type, title, author\'s name, number of comments, and time of last update. Content is considered updated when changes occur in the text, or when new comments are added. The <em>My recent content</em> tab limits the list to the currently logged-in user.', [':recent' => Url::fromRoute('tracker.page')->toString()]) . '</dd>';
+      $output .= '<dd>' . t('The <a href="!recent">Recent content</a> page shows new and updated content in reverse chronological order, listing the content type, title, author\'s name, number of comments, and time of last update. Content is considered updated when changes occur in the text, or when new comments are added. The <em>My recent content</em> tab limits the list to the currently logged-in user.', ['!recent' => Url::fromRoute('tracker.page')->toString()]) . '</dd>';
       $output .= '<dt>' . t('Tracking user-specific content') . '</dt>';
       $output .= '<dd>' . t("To follow a specific user's new and updated content, select the <em>Activity</em> tab from the user's profile page.") . '</dd>';
       $output .= '</dl>';
@@ -135,46 +134,18 @@ function tracker_cron() {
 }
 
 /**
- * Access callback: Determines access permission for a user's own account.
- *
- * @deprecated in drupal:8.4.0 and is removed from drupal:9.0.0. As
- *   internal API, _tracker_user_access() may also be removed in a minor
- *   release.
- *
- * @internal
- *
- * @param \Drupal\Core\Session\AccountInterface $account
- *   The user account to track.
- *
- * @return bool
- *   TRUE if a user is accessing tracking info for their own account and
- *   has permission to access the content.
- */
-function _tracker_myrecent_access(AccountInterface $account) {
-  @trigger_error('_tracker_myrecent_access() is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.', E_USER_DEPRECATED);
-  // This path is only allowed for authenticated users looking at their own content.
-  return $account->id() && (\Drupal::currentUser()->id() == $account->id()) && $account->hasPermission('access content');
-}
-
-/**
- * Access callback: Determines access permission for an account.
- *
- * @deprecated in drupal:8.4.0 and is removed from drupal:9.0.0. As
- *   internal API, _tracker_user_access() may also be removed in a minor
- *   release.
- *
- * @internal
- *
- * @param int $account
- *   The user account ID to track.
- *
- * @return bool
- *   TRUE if a user has permission to access the account for $account and
- *   has permission to access the content.
+ * Implements hook_local_tasks_alter().
  */
-function _tracker_user_access($account) {
-  @trigger_error('_tracker_user_access() is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.', E_USER_DEPRECATED);
-  return $account->access('view') && $account->hasPermission('access content');
+function tracker_local_tasks_alter(&$local_tasks) {
+  $tracker_tasks = [
+    'views_view:view.tracker.page_1',
+    'views_view:view.tracker.page_3'
+  ];
+  foreach ($tracker_tasks as $task_name) {
+    if (isset($local_tasks[$task_name])) {
+      $local_tasks[$task_name]['class'] = '\Drupal\tracker\Plugin\Menu\UserTrackerTab';
+    }
+  }
 }
 
 /**
diff --git a/core/modules/tracker/tracker.pages.inc b/core/modules/tracker/tracker.pages.inc
deleted file mode 100644
index 61a97a4..0000000
--- a/core/modules/tracker/tracker.pages.inc
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * @file
- * User page callbacks for tracker.module.
- */
-
-use Drupal\tracker\Controller\TrackerController;
-
-/**
- * Page callback: Generates a page of tracked nodes for the site.
- *
- * Queries the database for info, adds RDFa info if applicable, and generates
- * the render array that will be used to render the page.
- *
- * @param \Drupal\user\UserInterface $account
- *   (optional) The user account to track.
- *
- * @return array
- *   A renderable array.
- *
- * @deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use
- *   \Drupal\tracker\Controller\TrackerController::buildContent() instead.
- *
- * @see https://www.drupal.org/node/3030645
- */
-function tracker_page($account = NULL) {
-  @trigger_error(__FUNCTION__ . ' is deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use \Drupal\tracker\Controller\TrackerController::buildContent() instead. See https://www.drupal.org/node/3030645', E_USER_DEPRECATED);
-  return \Drupal::classResolver(TrackerController::class)->buildContent($account);
-}
diff --git a/core/modules/tracker/tracker.routing.yml b/core/modules/tracker/tracker.routing.yml
deleted file mode 100644
index 113078e..0000000
--- a/core/modules/tracker/tracker.routing.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-tracker.page:
-  path: '/activity'
-  defaults:
-    _controller: '\Drupal\tracker\Controller\TrackerController::buildContent'
-    _title: 'Recent content'
-  requirements:
-    _permission: 'access content'
-
-tracker.users_recent_content:
-  path: '/activity/{user}'
-  defaults:
-    _controller: '\Drupal\tracker\Controller\TrackerController::buildContent'
-    _title: 'My recent content'
-  requirements:
-    _permission: 'access content'
-    _custom_access: '\Drupal\tracker\Controller\TrackerController::checkAccess'
-    user: \d+
-
-tracker.user_tab:
-  path: '/user/{user}/activity'
-  defaults:
-    _controller: '\Drupal\tracker\Controller\TrackerController::buildContent'
-    _title_callback: '\Drupal\tracker\Controller\TrackerController::getTitle'
-  requirements:
-    _permission: 'access content'
-    _entity_access: 'user.view'
-    user: \d+
diff --git a/core/modules/views_ui/tests/src/Functional/SettingsTest.php b/core/modules/views_ui/tests/src/Functional/SettingsTest.php
index d5ce503..2a065ce 100644
--- a/core/modules/views_ui/tests/src/Functional/SettingsTest.php
+++ b/core/modules/views_ui/tests/src/Functional/SettingsTest.php
@@ -144,4 +144,11 @@ public function testEditUI() {
     $this->assertText(t('The cache has been cleared.'));
   }
 
+  /**
+   * Tests the "performance" setting bug in the Edit UI reported as #2404039.
+   */
+  function testEditUI2404039() {
+    $this->drupalLogin($this->adminUser);
+  }
+
 }
