diff --git a/core/modules/node/tests/modules/node_access_test/lib/Drupal/node_access_test/Controller/NodeAccessTestController.php b/core/modules/node/tests/modules/node_access_test/lib/Drupal/node_access_test/Controller/NodeAccessTestController.php
new file mode 100644
index 0000000..5e05ab8
--- /dev/null
+++ b/core/modules/node/tests/modules/node_access_test/lib/Drupal/node_access_test/Controller/NodeAccessTestController.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node_access_test\Controller\NodeAccessTestController.
+ */
+
+namespace Drupal\node_access_test\Controller;
+
+use Drupal\Core\Controller\ControllerInterface;
+use Drupal\Core\Database\Connection;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Controller routines for node access test routes.
+ */
+class NodeAccessTestController implements ControllerInterface {
+
+  /**
+   * The database service.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $database;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static($container->get('database'));
+  }
+
+  /**
+   * Constructs a NodeAccessTestController object.
+   *
+   * @param \Drupal\Core\Database\Connection $database
+   *   A database connection.
+   */
+  public function __construct(Connection $database) {
+    $this->database = $database;
+  }
+
+  /**
+   * Returns the node access test page.
+   *
+   * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
+   * the number filled in) if there were nodes the user could access. Also, the
+   * database query is shown, and a list of the node IDs, for debugging
+   * purposes. And if there is a query exception, the page says "Exception" and
+   * gives the error.
+   *
+   * @return string
+   *   An HTML-formatted string with the node access test page content.
+   */
+  public function nodeAccessTestPage() {
+    $output = '';
+
+    try {
+      $query = $this->database->select('node', 'mytab')
+        ->fields('mytab');
+      $query->addTag('node_access');
+      $result = $query->execute()->fetchAll();
+
+      if (count($result)) {
+        $output .= '<p>Yes, ' . count($result) . ' nodes</p>';
+        $output .= '<ul>';
+        foreach ($result as $item) {
+          $output .= '<li>' . $item->nid . '</li>';
+        }
+        $output .= '</ul>';
+      }
+      else {
+        $output .= '<p>No nodes</p>';
+      }
+
+      $output .= '<p>' . ((string) $query) . '</p>';
+    }
+    catch (\Exception $e) {
+      $output = '<p>Exception</p>';
+      $output .= '<p>' . $e->getMessage() . '</p>';
+    }
+
+    return $output;
+  }
+
+}
diff --git a/core/modules/node/tests/modules/node_access_test/node_access_test.module b/core/modules/node/tests/modules/node_access_test/node_access_test.module
index eb3a2bb..b2ab7c4 100644
--- a/core/modules/node/tests/modules/node_access_test/node_access_test.module
+++ b/core/modules/node/tests/modules/node_access_test/node_access_test.module
@@ -83,12 +83,6 @@ function node_access_test_permission() {
  */
 function node_access_test_menu() {
   $items = array();
-  $items['node_access_test_page'] = array(
-    'title' => 'Node access test',
-    'page callback' => 'node_access_test_page',
-    'access arguments' => array('access content'),
-    'type' => MENU_SUGGESTED_ITEM,
-  );
   $items['node_access_entity_test_page'] = array(
     'title' => 'Node access test',
     'page callback' => 'node_access_entity_test_page',
@@ -99,48 +93,6 @@ function node_access_test_menu() {
 }
 
 /**
- * Page callback: Creates the node access test page.
- *
- * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
- * the number filled in) if there were nodes the user could access. Also, the
- * database query is shown, and a list of the node IDs, for debugging purposes.
- * And if there is a query exception, the page says "Exception" and gives the
- * error.
- *
- * @see node_access_test_menu()
- */
-function node_access_test_page() {
-  $output = '';
-
-  try {
-    $query = db_select('node', 'mytab')
-      ->fields('mytab');
-    $query->addTag('node_access');
-    $result = $query->execute()->fetchAll();
-
-    if (count($result)) {
-      $output .= '<p>Yes, ' . count($result) . ' nodes</p>';
-      $output .= '<ul>';
-      foreach ($result as $item) {
-        $output .= '<li>' . $item->nid . '</li>';
-      }
-      $output .= '</ul>';
-    }
-    else {
-      $output .= '<p>No nodes</p>';
-    }
-
-    $output .= '<p>' . ((string) $query ) . '</p>';
-  }
-  catch (Exception $e) {
-    $output = '<p>Exception</p>';
-    $output .= '<p>' . $e->getMessage() . '</p>';
-  }
-
-  return $output;
-}
-
-/**
  * Page callback: Creates the node access entity test page.
  *
  * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
diff --git a/core/modules/node/tests/modules/node_access_test/node_access_test.routing.yml b/core/modules/node/tests/modules/node_access_test/node_access_test.routing.yml
new file mode 100644
index 0000000..82542f5
--- /dev/null
+++ b/core/modules/node/tests/modules/node_access_test/node_access_test.routing.yml
@@ -0,0 +1,6 @@
+node_access_test_page:
+  pattern: '/node_access_test_page'
+  defaults:
+    _content: '\Drupal\node_access_test\Controller\NodeAccessTestController::nodeAccessTestPage'
+  requirements:
+    _permission: 'access content'
