diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 5b42861..16adb8d 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -281,6 +281,14 @@ function comment_menu() {
     'file' => 'comment.pages.inc',
     'weight' => 1,
   );
+  $items['comment/%/unapprove'] = array(
+    'title' => 'Unapprove',
+    'page callback' => 'comment_unapprove',
+    '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',
@@ -1083,6 +1091,14 @@ function comment_links(Comment $comment, Node $node) {
           'query' => array('token' => drupal_get_token("comment/$comment->cid/approve")),
         );
       }
+      else {
+        $links['comment-unapprove'] = array(
+          'title' => t('unapprove'),
+          'href' => "comment/$comment->cid/unapprove",
+          'html' => TRUE,
+          'query' => array('token' => drupal_get_token("comment/$comment->cid/unapprove")),
+        );
+      }
     }
     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 bac078b..4f0a00b 100644
--- a/core/modules/comment/comment.pages.inc
+++ b/core/modules/comment/comment.pages.inc
@@ -119,3 +119,23 @@ function comment_approve($cid) {
   }
   return MENU_NOT_FOUND;
 }
+
+/**
+ * Menu callback; unpublish specified comment.
+ *
+ * @param $cid
+ *   A comment identifier.
+ */
+function comment_unapprove($cid) {
+  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], "comment/$cid/unapprove")) {
+    return MENU_ACCESS_DENIED;
+  }
+  if ($comment = comment_load($cid)) {
+    $comment->status = COMMENT_NOT_PUBLISHED;
+    comment_save($comment);
+
+    drupal_set_message(t('Comment unapproved.'));
+    drupal_goto('node/' . $comment->nid);
+  }
+  return MENU_NOT_FOUND;
+}
diff --git a/core/modules/comment/comment.test b/core/modules/comment/comment.test
index 2e0a209..7421568 100644
--- a/core/modules/comment/comment.test
+++ b/core/modules/comment/comment.test
@@ -1688,6 +1688,19 @@ class CommentApprovalTest extends CommentHelperCase {
 
     $this->drupalGet('node/' . $this->node->nid);
     $this->assertTrue($this->commentExists($anonymous_comment4), t('Anonymous comment visible.'));
+
+    // Unapprove comment.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('comment/1/unapprove');
+    $this->assertResponse(403, t('Forged comment unapproval was denied.'));
+    $this->drupalGet('comment/1/unapprove', array('query' => array('token' => 'forged')));
+    $this->assertResponse(403, t('Forged comment unapproval was denied.'));
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->clickLink(t('unapprove'));
+    $this->drupalLogout();
+
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertFalse($this->commentExists($anonymous_comment4), t('Comment was unpublished.'));
   }
 }
 
