diff --git a/core/modules/node/lib/Drupal/node/Controller/NodeController.php b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
index a60696c..6872646 100644
--- a/core/modules/node/lib/Drupal/node/Controller/NodeController.php
+++ b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
@@ -8,14 +8,54 @@
 namespace Drupal\node\Controller;
 
 use Drupal\Component\Utility\String;
+use Drupal\Component\Utility\Xss;
 use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Datetime\Date;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\node\NodeTypeInterface;
 use Drupal\node\NodeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Returns responses for Node routes.
  */
-class NodeController extends ControllerBase {
+class NodeController extends ControllerBase implements ContainerInjectionInterface {
+
+  /**
+   * The database connection.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $database;
+
+  /**
+   * The date service.
+   *
+   * @var \Drupal\Core\Datetime\Date
+   */
+  protected $date;
+
+  /**
+   * Constructs a NodeController object.
+   *
+   * @param \Drupal\Core\Database\Connection $database
+   *   The database connection.
+   * @param \Drupal\Core\Datetime\Date $date
+   *   The date service.
+   */
+  public function __construct(Connection $database, Date $date) {
+    $this->date = $date;
+    $this->database = $database;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static($container->get('database'), $container->get('date'));
+  }
+
 
   /**
    * Displays add content links for available content types.
@@ -109,11 +149,88 @@ public function revisionPageTitle($node_revision) {
   }
 
   /**
-   * @todo Remove node_revision_overview().
+   * Page callback: Generates an overview table of older revisions of a node.
+   *
+   * @param \Drupal\node\NodeInterface $node
+   *   A node object.
+   *
+   * @return array
+   *   An array as expected by drupal_render().
    */
   public function revisionOverview(NodeInterface $node) {
-    module_load_include('pages.inc', 'node');
-    return node_revision_overview($node);
+    $account = $this->currentUser();
+    $user_storage = $this->entityManager()->getStorageController('user');
+    $type = $node->getType();
+
+    $build = array();
+    $build['#title'] = $this->t('Revisions for %title', array('%title' => $node->label()));
+    $header = array($this->t('Revision'), $this->t('Operations'));
+
+    // @todo What to do with node_revision_list()?
+    $revisions = $this->database->query('SELECT nr.vid, nfr.title, nr.log, nr.revision_uid AS uid, n.vid AS current_vid, nr.revision_timestamp, u.name FROM {node_field_revision} nfr JOIN {node_revision} nr ON nr.vid = nfr.vid LEFT JOIN {node} n ON n.vid = nfr.vid INNER JOIN {users} u ON u.uid = nr.revision_uid WHERE nfr.nid = :nid AND nfr.default_langcode = 1 ORDER BY nfr.vid DESC', array(':nid' => $node->id()))->fetchAllAssoc('vid');
+
+    $revert_permission = (($account->hasPermission("revert $type revisions") || $account->hasPermission('revert all revisions') || $account->hasPermission('administer nodes')) && $node->access('update'));
+    $delete_permission =  (($account->hasPermission("delete $type revisions") || $account->hasPermission('delete all revisions') || $account->hasPermission('administer nodes')) && $node->access('delete'));
+
+    $rows = array();
+
+    foreach ($revisions as $revision) {
+      $row = array();
+      if ($revision->current_vid > 0) {
+        $username = array(
+          '#theme' => 'username',
+          '#account' => $user_storage->load($revision->uid),
+        );
+        $row[] = array('data' => t('!date by !username', array('!date' => $this->l($this->date->format($revision->revision_timestamp, 'short'), 'node.view', array('node' => $node->id())), '!username' => drupal_render($username)))
+          . (($revision->log != '') ? '<p class="revision-log">' . Xss::filter($revision->log) . '</p>' : ''),
+          'class' => array('revision-current'));
+        $row[] = array('data' => String::placeholder($this->t('current revision')), 'class' => array('revision-current'));
+      }
+      else {
+        $username = array(
+          '#theme' => 'username',
+          '#account' => $user_storage->load($revision->uid),
+        );
+        $row[] = $this->t('!date by !username', array('!date' => $this->l($this->date->format($revision->revision_timestamp, 'short'), 'node.revision_show', array('node' => $node->id(), 'node_revision' => $revision->vid)), '!username' => drupal_render($username)))
+          . (($revision->log != '') ? '<p class="revision-log">' . Xss::filter($revision->log) . '</p>' : '');
+
+        if ($revert_permission) {
+          $links['revert'] = array(
+            'title' => $this->t('Revert'),
+            'route_name' => 'node.revision_revert_confirm',
+            'route_parameters' => array('node' => $node->id(), 'node_revision' => $revision->vid),
+          );
+        }
+
+        if ($delete_permission) {
+          $links['delete'] = array(
+            'title' => $this->t('Delete'),
+            'route_name' => 'node.revision_delete_confirm',
+            'route_parameters' => array('node' => $node->id(), 'node_revision' => $revision->vid),
+          );
+        }
+
+        $row[] = array(
+          'data' => array(
+            '#type' => 'operations',
+            '#links' => $links,
+          ),
+        );
+      }
+
+      $rows[] = $row;
+    }
+
+    $build['node_revisions_table'] = array(
+      '#theme' => 'table',
+      '#rows' => $rows,
+      '#header' => $header,
+      '#attached' => array (
+        'css' => array(drupal_get_path('module', 'node') . '/css/node.admin.css'),
+      ),
+    );
+
+    return $build;
   }
 
   /**
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index ad96476..98748ee 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -109,87 +109,3 @@ function theme_node_preview($variables) {
 
   return $output;
 }
-
-/**
- * Page callback: Generates an overview table of older revisions of a node.
- *
- * @param object $node
- *   A node object.
- *
- * @return array
- *   An array as expected by drupal_render().
- *
- * @see node_menu()
- *
- * @deprecated Use \Drupal\node\Controller\NodeController::revisionOverview()
- */
-function node_revision_overview($node) {
-  $build['#title'] = t('Revisions for %title', array('%title' => $node->label()));
-
-  $header = array(t('Revision'), t('Operations'));
-
-  $revisions = node_revision_list($node);
-
-  $rows = array();
-  $type = $node->getType();
-
-  $revert_permission = FALSE;
-  if ((user_access("revert $type revisions") || user_access('revert all revisions') || user_access('administer nodes')) && $node->access('update')) {
-    $revert_permission = TRUE;
-  }
-  $delete_permission = FALSE;
-  if ((user_access("delete $type revisions") || user_access('delete all revisions') || user_access('administer nodes')) && $node->access('delete')) {
-    $delete_permission = TRUE;
-  }
-  foreach ($revisions as $revision) {
-    $row = array();
-    if ($revision->current_vid > 0) {
-      $username = array(
-        '#theme' => 'username',
-        '#account' => user_load($revision->uid),
-      );
-      $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->revision_timestamp, 'short'), 'node/' . $node->id()), '!username' => drupal_render($username)))
-                               . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : ''),
-                     'class' => array('revision-current'));
-      $row[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'));
-    }
-    else {
-      $username = array(
-        '#theme' => 'username',
-        '#account' => user_load($revision->uid),
-      );
-      $row[] = t('!date by !username', array('!date' => l(format_date($revision->revision_timestamp, 'short'), "node/" . $node->id() . "/revisions/" . $revision->vid . "/view"), '!username' => drupal_render($username)))
-               . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : '');
-      if ($revert_permission) {
-        $links['revert'] = array(
-          'title' => t('Revert'),
-          'href' => "node/" . $node->id() . "/revisions/" . $revision->vid . "/revert",
-        );
-      }
-      if ($delete_permission) {
-        $links['delete'] = array(
-          'title' => t('Delete'),
-          'href' => "node/" . $node->id() . "/revisions/" . $revision->vid . "/delete",
-        );
-      }
-      $row[] = array(
-        'data' => array(
-          '#type' => 'operations',
-          '#links' => $links,
-        ),
-      );
-    }
-    $rows[] = $row;
-  }
-
-  $build['node_revisions_table'] = array(
-    '#theme' => 'table',
-    '#rows' => $rows,
-    '#header' => $header,
-    '#attached' => array (
-      'css' => array(drupal_get_path('module', 'node') . '/css/node.admin.css'),
-    ),
-  );
-
-  return $build;
-}
