diff --git a/core/modules/node/lib/Drupal/node/Controller/NodeViewController.php b/core/modules/node/lib/Drupal/node/Controller/NodeViewController.php
new file mode 100644
index 0000000..f801153
--- /dev/null
+++ b/core/modules/node/lib/Drupal/node/Controller/NodeViewController.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\node\Controller\NodeController
+ */
+
+namespace Drupal\node\Controller;
+
+use Drupal\Core\Controller\ControllerInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\node\NodeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Controller routines for nodes.
+ */
+class NodeViewController implements ControllerInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static();
+  }
+
+  /**
+   * Constructs a NodeController object.
+   */
+  public function __construct() {}
+
+  /**
+   * Page callback: Displays a single node.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface
+   *   The node entity.
+   *
+   * @return array
+   *   A page array suitable for use by drupal_render().
+   *
+   * @see node_menu()
+   */
+  public function nodeView(EntityInterface $node) {
+
+    // If there is a menu link to this node, the link becomes the last part
+    // of the active trail, and the link name becomes the page title.
+    // Thus, we must explicitly set the page title to be the node title.
+    drupal_set_title($node->label());
+    $uri = $node->uri();
+    // Set the node path as the canonical URL to prevent duplicate content.
+    drupal_add_html_head_link(array(
+      'rel' => 'canonical',
+      'href' => url($uri['path'], $uri['options'])
+    ), TRUE);
+    // Set the non-aliased path as a default shortlink.
+    drupal_add_html_head_link(array(
+      'rel' => 'shortlink',
+      'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))
+    ), TRUE);
+
+    return node_show($node);
+  }
+
+}
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 5c934df..82a6e1d 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1697,14 +1697,7 @@ function node_menu() {
     'file' => 'node.pages.inc',
   );
   $items['node/%node'] = array(
-    'title callback' => 'node_page_title',
-    'title arguments' => array(1),
-    // The page callback also invokes drupal_set_title() in case
-    // the menu router's title is overridden by a menu link.
-    'page callback' => 'node_page_view',
-    'page arguments' => array(1),
-    'access callback' => 'node_access',
-    'access arguments' => array('view', 1),
+    'route_name' => 'node_view',
   );
   $items['node/%node/view'] = array(
     'title' => 'View',
@@ -2150,30 +2143,6 @@ function node_view_multiple($nodes, $view_mode = 'teaser', $langcode = NULL) {
 }
 
 /**
- * Page callback: Displays a single node.
- *
- * @param \Drupal\Core\Entity\EntityInterface $node
- *   The node entity.
- *
- * @return
- *   A page array suitable for use by drupal_render().
- *
- * @see node_menu()
- */
-function node_page_view(EntityInterface $node) {
-  // If there is a menu link to this node, the link becomes the last part
-  // of the active trail, and the link name becomes the page title.
-  // Thus, we must explicitly set the page title to be the node title.
-  drupal_set_title($node->label());
-  $uri = $node->uri();
-  // Set the node path as the canonical URL to prevent duplicate content.
-  drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url($uri['path'], $uri['options'])), TRUE);
-  // Set the non-aliased path as a default shortlink.
-  drupal_add_html_head_link(array('rel' => 'shortlink', 'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))), TRUE);
-  return node_show($node);
-}
-
-/**
  * Implements hook_update_index().
  */
 function node_update_index() {
diff --git a/core/modules/node/node.routing.yml b/core/modules/node/node.routing.yml
new file mode 100644
index 0000000..3583443
--- /dev/null
+++ b/core/modules/node/node.routing.yml
@@ -0,0 +1,8 @@
+node_view:
+  pattern: '/node/{node}'
+  defaults:
+    _content: '\Drupal\node\Controller\NodeViewController::nodeView'
+    node: ''
+  requirements:
+    _permission: 'access content'
+    node: \d+
\ No newline at end of file