diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 5684731..e6f80b1 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -282,6 +282,14 @@ function comment_menu() {
     'file' => 'comment.pages.inc',
     'weight' => 1,
   );
+  $items['comment/%/disapprove'] = array(
+    'title' => 'Disapprove',
+    'page callback' => 'comment_disapprove',
+    'page arguments' => array(1),
+    'access arguments' => array('administer comments'),
+    'file' => 'comment.pages.inc',
+    'weight' => 1,
+  );
   $items['comment/%/delete'] = array(
     'title' => 'Delete',
     'page callback' => 'comment_confirm_delete_page',
@@ -1085,6 +1093,14 @@ function comment_links(Comment $comment, Node $node) {
           'query' => array('token' => drupal_get_token("comment/$comment->cid/approve")),
         );
       }
+      else {
+        $links['comment-disapprove'] = array(
+          'title' => t('disapprove'),
+          'href' => "comment/$comment->cid/disapprove",
+          'html' => TRUE,
+          'query' => array('token' => drupal_get_token("comment/$comment->cid/disapprove")),
+        );
+      }
     }
     elseif (user_access('post comments')) {
       if (comment_access('edit', $comment)) {
diff --git a/core/modules/comment/comment.pages.inc b/core/modules/comment/comment.pages.inc
index 5176846..de904a7 100644
--- a/core/modules/comment/comment.pages.inc
+++ b/core/modules/comment/comment.pages.inc
@@ -130,3 +130,25 @@ function comment_approve($cid) {
   }
   throw new NotFoundHttpException();
 }
+
+/**
+ * Menu callback; unpublish specified comment.
+ *
+ * @param $cid
+ *   A comment identifier.
+ */
+function comment_disapprove($cid) {
+  $token = request()->query->get('token');
+  if (!isset($token) || !drupal_valid_token($token, "comment/$cid/disapprove")) {
+    throw new AccessDeniedHttpException();
+  }
+
+  if ($comment = comment_load($cid)) {
+    $comment->status = COMMENT_NOT_PUBLISHED;
+    comment_save($comment);
+
+    drupal_set_message(t('Comment disapproved.'));
+    drupal_goto('node/' . $comment->nid);
+  }
+  throw new NotFoundHttpException();
+}
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php
index 02b3be1..0c3be1d 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php
@@ -128,5 +128,18 @@ class CommentApprovalTest extends CommentTestBase {
 
     $this->drupalGet('node/' . $this->node->nid);
     $this->assertTrue($this->commentExists($anonymous_comment4), t('Anonymous comment visible.'));
+
+    // Disapprove comment.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('comment/1/disapprove');
+    $this->assertResponse(403, t('Forged comment disapprove was denied.'));
+    $this->drupalGet('comment/1/disapprove', array('query' => array('token' => 'forged')));
+    $this->assertResponse(403, t('Forged comment disapprove was denied.'));
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->clickLink(t('disapprove'));
+    $this->drupalLogout();
+
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertFalse($this->commentExists($anonymous_comment4), t('Comment was unpublished.'));
   }
 }
