diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index b0f71f1..68f6874 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -258,11 +258,7 @@ function comment_menu() {
   );
   $items['comment/reply/%node'] = array(
     'title' => 'Add new comment',
-    'page callback' => 'comment_reply',
-    'page arguments' => array(2),
-    'access callback' => 'node_access',
-    'access arguments' => array('view', 2),
-    'file' => 'comment.pages.inc',
+    'route_name' => 'comment_reply',
   );
 
   return $items;
diff --git a/core/modules/comment/comment.pages.inc b/core/modules/comment/comment.pages.inc
index 9d7414b..15f6967 100644
--- a/core/modules/comment/comment.pages.inc
+++ b/core/modules/comment/comment.pages.inc
@@ -11,96 +11,6 @@
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
- * Form constructor for the comment reply form.
- *
- * There are several cases that have to be handled, including:
- *   - replies to comments
- *   - replies to nodes
- *   - attempts to reply to nodes that can no longer accept comments
- *   - respecting access permissions ('access comments', 'post comments', etc.)
- *
- * The node or comment that is being replied to must appear above the comment
- * form to provide the user context while authoring the comment.
- *
- * @param \Drupal\Core\Entity\EntityInterface $node
- *   Every comment belongs to a node. This is that node.
- * @param $pid
- *   (optional) Some comments are replies to other comments. In those cases,
- *   $pid is the parent comment's comment ID. Defaults to NULL.
- *
- * @return array
- *   An associative array containing:
- *   - An array for rendering the node or parent comment.
- *     - comment_node: If the comment is a reply to the node.
- *     - comment_parent: If the comment is a reply to another comment.
- *   - comment_form: The comment form as a renderable array.
- */
-function comment_reply(EntityInterface $node, $pid = NULL) {
-  // Set the breadcrumb trail.
-  drupal_set_breadcrumb(array(l(t('Home'), NULL), l($node->label(), 'node/' . $node->nid)));
-  $op = Drupal::request()->request->get('op');
-  $build = array();
-
-  // The user is previewing a comment prior to submitting it.
-  if ($op == t('Preview')) {
-    if (user_access('post comments')) {
-      $build['comment_form'] = comment_add($node, $pid);
-    }
-    else {
-      drupal_set_message(t('You are not authorized to post comments.'), 'error');
-      return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE)));
-    }
-  }
-  else {
-    // $pid indicates that this is a reply to a comment.
-    if ($pid) {
-      if (user_access('access comments')) {
-        // Load the parent comment.
-        $comment = comment_load($pid);
-        if ($comment->status->value == COMMENT_PUBLISHED) {
-          // If that comment exists, make sure that the current comment and the
-          // parent comment both belong to the same parent node.
-          if ($comment->nid->target_id != $node->nid) {
-            // Attempting to reply to a comment not belonging to the current nid.
-            drupal_set_message(t('The comment you are replying to does not exist.'), 'error');
-            return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE)));
-          }
-          // Display the parent comment
-          $build['comment_parent'] = comment_view($comment);
-        }
-        else {
-          drupal_set_message(t('The comment you are replying to does not exist.'), 'error');
-          return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE)));
-        }
-      }
-      else {
-        drupal_set_message(t('You are not authorized to view comments.'), 'error');
-        return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE)));
-      }
-    }
-    // This is the case where the comment is in response to a node. Display the node.
-    elseif (user_access('access content')) {
-      $build['comment_node'] = node_view($node);
-    }
-
-    // Should we show the reply box?
-    if ($node->comment != COMMENT_NODE_OPEN) {
-      drupal_set_message(t("This discussion is closed: you can't post new comments."), 'error');
-      return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE)));
-    }
-    elseif (user_access('post comments')) {
-      $build['comment_form'] = comment_add($node, $pid);
-    }
-    else {
-      drupal_set_message(t('You are not authorized to post comments.'), 'error');
-      return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE)));
-    }
-  }
-
-  return $build;
-}
-
-/**
  * Page callback: Publishes the specified comment.
  *
  * @param \Drupal\comment\Plugin\Core\Entity\Comment $comment
diff --git a/core/modules/comment/comment.routing.yml b/core/modules/comment/comment.routing.yml
index 6f786dd..0b52294 100644
--- a/core/modules/comment/comment.routing.yml
+++ b/core/modules/comment/comment.routing.yml
@@ -1,7 +1,14 @@
 comment_edit_page:
     pattern: 'comment/{comment}/edit'
     defaults:
-        _entity_form: comment.default
+      _entity_form: comment.default
     requirements:
-        _entity_access: comment.update
+      _entity_access: comment.update
 
+comment_reply:
+    pattern: 'comment/reply/{node}/{pid}'
+    defaults:
+      _content: '\Drupal\comment\Controller\CommentController::getReply'
+      pid : ~
+    requirements:
+      _entity_access: node.view
diff --git a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
new file mode 100644
index 0000000..0d63488
--- /dev/null
+++ b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\comment\Controller\CommentController.
+ */
+
+namespace Drupal\comment\Controller;
+
+use Drupal\Core\Controller\ControllerInterface;
+use Drupal\Core\Entity\EntityManager;
+use Drupal\Core\Routing\PathBasedGeneratorInterface;
+use Drupal\Node\NodeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Controller for comment forms.
+ */
+class CommentController implements ControllerInterface {
+
+  /**
+   * The entity manager service.
+   *
+   * @var \Drupal\Core\Entity\EntityManager
+   */
+  protected $entityManager;
+
+  /**
+   * The url generator service.
+   *
+   * @var \Drupal\Core\Routing\UrlGenerator
+   */
+  protected $urlGenerator;
+
+  /**
+   * Constructs a CommentPageController object.
+   *
+   * @param \Drupal\Core\Entity\EntityManager $entity_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Routing\UrlGenerator $url_generator
+   *   The url generator.
+   */
+  public function __construct(EntityManager $entity_manager, PathBasedGeneratorInterface $url_generator) {
+    $this->entityManager = $entity_manager;
+    $this->urlGenerator = $url_generator;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static($container->get('plugin.manager.entity'), $container->get('url_generator'));
+  }
+
+  /**
+   * Form constructor for the comment reply form.
+   *
+   * There are several cases that have to be handled, including:
+   *   - replies to comments
+   *   - replies to nodes
+   *   - attempts to reply to nodes that can no longer accept comments
+   *   - respecting access permissions ('access comments', 'post comments', etc.)
+   *
+   * The node or comment that is being replied to must appear above the comment
+   * form to provide the user context while authoring the comment.
+   *
+   * @param \Drupal\node\NodeInterface $node
+   *   Every comment belongs to a node. This is that node.
+   * @param int $pid
+   *   (optional) Some comments are replies to other comments. In those cases,
+   *   $pid is the parent comment's comment ID. Defaults to NULL.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object containing the search string.
+   *
+   * @return array|Symfony\Component\HttpFoundation\RedirectResponse
+   *   One of the following:
+   *   - An associative array containing:
+   *     - An array for rendering the node or parent comment.
+   *        - comment_node: If the comment is a reply to the node.
+   *        - comment_parent: If the comment is a reply to another comment.
+   *     - comment_form: The comment form as a renderable array.
+   *   - A redirect response to current node:
+   *     - If user is not authorized to post comments.
+   *     - If parent comment doesn't belong to current node.
+   *     - If user is not authorized to view comments.
+   *     - If current node comments are disable.
+   */
+  public function getReply(NodeInterface $node, $pid, Request $request) {
+    $uri = $node->uri();
+    // Set the breadcrumb trail.
+    drupal_set_breadcrumb(array(l(t('Home'), NULL), l($node->label(), $uri['path'])));
+    $op = $request->request->get('op');
+    $build = array();
+
+    // The user is previewing a comment prior to submitting it.
+    if ($op == t('Preview')) {
+      if (user_access('post comments')) {
+        $comment = $this->entityManager->getStorageController('comment')->create(array(
+          'nid' => $node->id(),
+          'pid' => $pid,
+          'node_type' => 'comment_node_' . $node->bundle(),
+        ));
+        $build['comment_form'] = $this->entityManager->getForm($comment);
+      }
+      else {
+        drupal_set_message(t('You are not authorized to post comments.'), 'error');
+        return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE)));
+
+      }
+    }
+    else {
+      // $pid indicates that this is a reply to a comment.
+      if ($pid) {
+        if (user_access('access comments')) {
+          // Load the parent comment.
+          $comments = $this->entityManager->getStorageController('comment')->load(array($pid));
+          $comment = reset($comments);
+          if ($comment->status->value == COMMENT_PUBLISHED) {
+            // If that comment exists, make sure that the current comment and the
+            // parent comment both belong to the same parent node.
+            if ($comment->nid->target_id != $node->id()) {
+              // Attempting to reply to a comment not belonging to the current nid.
+              drupal_set_message(t('The comment you are replying to does not exist.'), 'error');
+              return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE)));
+            }
+            // Display the parent comment
+            $build['comment_parent'] = $this->entityManager->getRenderController('comment')->view($comment);
+          }
+          else {
+            drupal_set_message(t('The comment you are replying to does not exist.'), 'error');
+            return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE)));
+          }
+        }
+        else {
+          drupal_set_message(t('You are not authorized to view comments.'), 'error');
+          return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE)));
+        }
+      }
+      // This is the case where the comment is in response to a node. Display the node.
+      elseif (user_access('access content')) {
+        $build['comment_node'] = $this->entityManager->getRenderController('node')->view($node);
+      }
+
+      // Should we show the reply box?
+      if ($node->comment != COMMENT_NODE_OPEN) {
+        drupal_set_message(t("This discussion is closed: you can't post new comments."), 'error');
+        return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE)));
+      }
+      elseif (user_access('post comments')) {
+        $comment = $this->entityManager->getStorageController('comment')->create(array(
+          'nid' => $node->id(),
+          'pid' => $pid,
+          'node_type' => 'comment_node_' . $node->bundle(),
+        ));
+        $build['comment_form'] = $this->entityManager->getForm($comment);
+      }
+      else {
+        drupal_set_message(t('You are not authorized to post comments.'), 'error');
+        return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE)));
+      }
+    }
+    return $build;
+  }
+
+}
