diff --git a/core/modules/comment/comment.links.menu.yml b/core/modules/comment/comment.links.menu.yml
index e4d4488..94a2ad6 100644
--- a/core/modules/comment/comment.links.menu.yml
+++ b/core/modules/comment/comment.links.menu.yml
@@ -2,7 +2,7 @@ comment.admin:
   title: Comments
   route_name: comment.admin
   parent: system.admin_content
-  description: 'List and edit site comments and the comment approval queue.'
+  description: 'List and edit site comments and the comment unpublished queue.'
 comment.type_list:
   title: 'Comment types'
   route_name: comment.type_list
diff --git a/core/modules/comment/comment.links.task.yml b/core/modules/comment/comment.links.task.yml
index a976171..9cfed06 100644
--- a/core/modules/comment/comment.links.task.yml
+++ b/core/modules/comment/comment.links.task.yml
@@ -23,10 +23,10 @@ comment.admin_new:
   route_name: comment.admin
   parent_id: comment.admin
 
-comment.admin_approval:
-  title: 'Unapproved comments'
-  route_name: comment.admin_approval
-  class: Drupal\comment\Plugin\Menu\LocalTask\UnapprovedComments
+comment.admin_unpublished:
+  title: 'Unpublished comments'
+  route_name: comment.admin_unpublished
+  class: Drupal\comment\Plugin\Menu\LocalTask\UnpublishedComments
   parent_id: comment.admin
   weight: 1
 
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index bdf53bf..cb84bad 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -73,7 +73,7 @@ function comment_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dt>' . t('Overriding default settings') . '</dt>';
       $output .= '<dd>' . t('When you create an entity item, you can override the default comment settings. Changing the entity sub-type defaults will not affect existing entity items, whether they used the default settings or had overrides.') . '</dd>';
       $output .= '<dt>' . t('Approving and managing comments') . '</dt>';
-      $output .= '<dd>' . t('Comments from users who have the <em>Skip comment approval</em> permission are published immediately. All other comments are placed in the <a href="!comment-approval">Unapproved comments</a> queue, until a user who has permission to <em>Administer comments and comment settings</em> publishes or deletes them. Published comments can be bulk managed on the <a href="!admin-comment">Published comments</a> administration page. When a comment has no replies, it remains editable by its author, as long as the author has <em>Edit own comments</em> permission.', array('!comment-approval' => \Drupal::url('comment.admin_approval'), '!admin-comment' => \Drupal::url('comment.admin'))) . '</dd>';
+      $output .= '<dd>' . t('Comments from users who have the <em>Skip comment approval</em> permission are published immediately. All other comments are placed in the <a href="!comment-approval">Unpublished comments</a> queue, until a user who has permission to <em>Administer comments and comment settings</em> publishes or deletes them. Published comments can be bulk managed on the <a href="!admin-comment">Published comments</a> administration page. When a comment has no replies, it remains editable by its author, as long as the author has <em>Edit own comments</em> permission.', array('!comment-approval' => \Drupal::url('comment.admin_unpublished'), '!admin-comment' => \Drupal::url('comment.admin'))) . '</dd>';
       $output .= '</dl>';
       return $output;
 
diff --git a/core/modules/comment/comment.routing.yml b/core/modules/comment/comment.routing.yml
index ca37c61..57b25fe 100644
--- a/core/modules/comment/comment.routing.yml
+++ b/core/modules/comment/comment.routing.yml
@@ -7,12 +7,12 @@ comment.admin:
   requirements:
     _permission: 'administer comments'
 
-comment.admin_approval:
-  path: '/admin/content/comment/approval'
+comment.admin_unpublished:
+  path: '/admin/content/comment/unpublished'
   defaults:
-    _title: 'Unapproved comments'
+    _title: 'Unpublished comments'
     _content: '\Drupal\comment\Controller\AdminController::adminPage'
-    type: 'approval'
+    type: 'unpublished'
   requirements:
     _permission: 'administer comments'
 
@@ -24,14 +24,24 @@ entity.comment.edit_form:
   requirements:
     _entity_access: 'comment.update'
 
-comment.approve:
-  path: '/comment/{comment}/approve'
+comment.publish:
+  path: '/comment/{comment}/publish'
   defaults:
-    _title: 'Approve'
-    _content: '\Drupal\comment\Controller\CommentController::commentApprove'
+    _title: 'Publish'
+    _content: '\Drupal\comment\Controller\CommentController::commentPublish'
     entity_type: 'comment'
   requirements:
-    _entity_access: 'comment.approve'
+    _entity_access: 'comment.publish'
+    _csrf_token: 'TRUE'
+
+comment.unpublish:
+  path: '/comment/{comment}/unpublish'
+  defaults:
+    _title: 'Unpublish'
+    _content: '\Drupal\comment\Controller\CommentController::commentUnpublish'
+    entity_type: 'comment'
+  requirements:
+    _entity_access: 'comment.unpublish'
     _csrf_token: 'TRUE'
 
 entity.comment.canonical:
diff --git a/core/modules/comment/config/schema/comment.views.schema.yml b/core/modules/comment/config/schema/comment.views.schema.yml
index 0bd1332..f5f4700 100644
--- a/core/modules/comment/config/schema/comment.views.schema.yml
+++ b/core/modules/comment/config/schema/comment.views.schema.yml
@@ -42,9 +42,13 @@ views.field.comment_link:
       type: views_field
       label: 'Link field to the entity if there is no comment'
 
-views.field.comment_link_approve:
+views.field.comment_link_publish:
   type: views.field.comment_link
-  label: 'Comment approve link'
+  label: 'Comment publish link'
+
+views.field.comment_link_unpublish:
+  type: views.field.comment_link
+  label: 'Comment unpublish link'
 
 views.field.comment_link_delete:
   type: views.field.comment_link
diff --git a/core/modules/comment/src/CommentAccessControlHandler.php b/core/modules/comment/src/CommentAccessControlHandler.php
index b78c4b0..e4626d3 100644
--- a/core/modules/comment/src/CommentAccessControlHandler.php
+++ b/core/modules/comment/src/CommentAccessControlHandler.php
@@ -36,10 +36,14 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A
       case 'view':
         return AccessResult::allowedIf($account->hasPermission('access comments') && $entity->isPublished())->cachePerRole()->cacheUntilEntityChanges($entity)
           ->andIf($entity->getCommentedEntity()->access($operation, $account, TRUE));
-
       case 'update':
         return AccessResult::allowedIf($account->id() && $account->id() == $entity->getOwnerId() && $entity->isPublished() && $account->hasPermission('edit own comments'))->cachePerRole()->cachePerUser()->cacheUntilEntityChanges($entity);
-
+      case 'publish':
+        return AccessResult::allowedIfHasPermission($account, 'administer comments');
+        break;
+      case 'unpublish':
+        return AccessResult::allowedIfHasPermission($account, 'administer comments');
+        break;
       default:
         // No opinion.
         return AccessResult::neutral()->cachePerRole();
diff --git a/core/modules/comment/src/CommentInterface.php b/core/modules/comment/src/CommentInterface.php
index e7a4ee9..17f769e 100644
--- a/core/modules/comment/src/CommentInterface.php
+++ b/core/modules/comment/src/CommentInterface.php
@@ -17,7 +17,7 @@
 interface CommentInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface {
 
   /**
-   * Comment is awaiting approval.
+   * Comment is unpublished and awaiting approval.
    */
   const NOT_PUBLISHED = 0;
 
diff --git a/core/modules/comment/src/CommentStorage.php b/core/modules/comment/src/CommentStorage.php
index 2cbaed7..ece537a 100644
--- a/core/modules/comment/src/CommentStorage.php
+++ b/core/modules/comment/src/CommentStorage.php
@@ -321,7 +321,7 @@ public function loadThread(EntityInterface $entity, $field_name, $mode, $comment
   /**
    * {@inheritdoc}
    */
-  public function getUnapprovedCount() {
+  public function getUnpublishedCount() {
     return  $this->database->select('comment_field_data', 'c')
       ->condition('status', CommentInterface::NOT_PUBLISHED, '=')
       ->condition('default_langcode', 1)
diff --git a/core/modules/comment/src/CommentStorageInterface.php b/core/modules/comment/src/CommentStorageInterface.php
index 5be4776..b20456f 100644
--- a/core/modules/comment/src/CommentStorageInterface.php
+++ b/core/modules/comment/src/CommentStorageInterface.php
@@ -108,11 +108,11 @@ public function getChildCids(array $comments);
   public function loadThread(EntityInterface $entity, $field_name, $mode, $comments_per_page = 0, $pager_id = 0);
 
   /**
-   * Returns the number of unapproved comments.
+   * Updates the comment statistics for a given node.
    *
    * @return int
-   *   The number of unapproved comments.
+   *   The number of unpublished comments.
    */
-  public function getUnapprovedCount();
+  public function getUnpublishedCount();
 
 }
diff --git a/core/modules/comment/src/CommentViewBuilder.php b/core/modules/comment/src/CommentViewBuilder.php
index cd9a5b9..9d3c3e2 100644
--- a/core/modules/comment/src/CommentViewBuilder.php
+++ b/core/modules/comment/src/CommentViewBuilder.php
@@ -270,10 +270,17 @@ protected static function buildLinks(CommentInterface $entity, EntityInterface $
           'html' => TRUE,
         );
       }
-      if (!$entity->isPublished() && $entity->access('approve')) {
-        $links['comment-approve'] = array(
-          'title' => t('Approve'),
-          'url' => Url::fromRoute('comment.approve', ['comment' => $entity->id()]),
+      if (!$entity->isPublished() && $entity->access('publish')) {
+        $links['comment-publish'] = array(
+          'title' => t('Publish'),
+          'url' => Url::fromRoute('comment.publish', ['comment' => $entity->id()]),
+          'html' => TRUE,
+        );
+      }
+      if ($entity->isPublished() && $entity->access('unpublish')) {
+        $links['comment-unpublish'] = array(
+          'title' => t('Unpublish'),
+          'url' => Url::fromRoute('comment.unpublish', ['comment' => $entity->id()]),
           'html' => TRUE,
         );
       }
diff --git a/core/modules/comment/src/Controller/AdminController.php b/core/modules/comment/src/Controller/AdminController.php
index 4c1592f..3895456 100644
--- a/core/modules/comment/src/Controller/AdminController.php
+++ b/core/modules/comment/src/Controller/AdminController.php
@@ -49,7 +49,7 @@ public function __construct(FormBuilderInterface $form_builder) {
    * @param \Symfony\Component\HttpFoundation\Request $request
    *   The request of the page.
    * @param string $type
-   *   The type of the overview form ('approval' or 'new') default to 'new'.
+   *   The type of the overview form ('unpublished' or 'new') default to 'new'.
    *
    * @return array
    *   Then comment multiple delete confirmation form or the comments overview
diff --git a/core/modules/comment/src/Controller/CommentController.php b/core/modules/comment/src/Controller/CommentController.php
index af415d0..12dcdd8 100644
--- a/core/modules/comment/src/Controller/CommentController.php
+++ b/core/modules/comment/src/Controller/CommentController.php
@@ -73,11 +73,30 @@ public static function create(ContainerInterface $container) {
    * @return \Symfony\Component\HttpFoundation\RedirectResponse.
    *   Redirects to the permalink URL for this comment.
    */
-  public function commentApprove(CommentInterface $comment) {
+  public function commentPublish(CommentInterface $comment) {
     $comment->setPublished(TRUE);
     $comment->save();
 
-    drupal_set_message($this->t('Comment approved.'));
+    drupal_set_message($this->t('Comment published.'));
+    $permalink_uri = $comment->permalink();
+    $permalink_uri->setAbsolute();
+    return new RedirectResponse($permalink_uri->toString());
+  }
+
+  /**
+   * Unpublishes the specified comment.
+   *
+   * @param \Drupal\comment\CommentInterface $comment
+   *   A comment entity.
+   *
+   * @return \Symfony\Component\HttpFoundation\RedirectResponse.
+   *   Redirects to the permalink URL for this comment.
+   */
+  public function commentUnpublish(CommentInterface $comment) {
+    $comment->setPublished(FALSE);
+    $comment->save();
+
+    drupal_set_message($this->t('Comment unpublished.'));
     $permalink_uri = $comment->permalink();
     $permalink_uri->setAbsolute();
     return new RedirectResponse($permalink_uri->toString());
diff --git a/core/modules/comment/src/Form/CommentAdminOverview.php b/core/modules/comment/src/Form/CommentAdminOverview.php
index 4abff68..6adc416 100644
--- a/core/modules/comment/src/Form/CommentAdminOverview.php
+++ b/core/modules/comment/src/Form/CommentAdminOverview.php
@@ -112,7 +112,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $type = '
       '#attributes' => array('class' => array('container-inline')),
     );
 
-    if ($type == 'approval') {
+    if ($type == 'unpublished') {
       $options['publish'] = $this->t('Publish the selected comments');
     }
     else {
@@ -133,7 +133,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $type = '
     );
 
     // Load the comments that need to be displayed.
-    $status = ($type == 'approval') ? CommentInterface::NOT_PUBLISHED : CommentInterface::PUBLISHED;
+    $status = ($type == 'unpublished') ? CommentInterface::NOT_PUBLISHED : CommentInterface::PUBLISHED;
     $header = array(
       'subject' => array(
         'data' => $this->t('Subject'),
diff --git a/core/modules/comment/src/Plugin/Menu/LocalTask/UnapprovedComments.php b/core/modules/comment/src/Plugin/Menu/LocalTask/UnpublishedComments.php
similarity index 78%
rename from core/modules/comment/src/Plugin/Menu/LocalTask/UnapprovedComments.php
rename to core/modules/comment/src/Plugin/Menu/LocalTask/UnpublishedComments.php
index 0b8f6da..116641f 100644
--- a/core/modules/comment/src/Plugin/Menu/LocalTask/UnapprovedComments.php
+++ b/core/modules/comment/src/Plugin/Menu/LocalTask/UnpublishedComments.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\comment\Plugin\Menu\LocalTask\UnapprovedComments.
+ * Contains \Drupal\comment\Plugin\Menu\LocalTask\UnpublishedComments.
  */
 
 namespace Drupal\comment\Plugin\Menu\LocalTask;
@@ -13,9 +13,9 @@
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * Provides a local task that shows the amount of unapproved comments.
+ * Provides a local task that shows the amount of unpublished comments.
  */
-class UnapprovedComments extends LocalTaskDefault implements ContainerFactoryPluginInterface {
+class UnpublishedComments extends LocalTaskDefault implements ContainerFactoryPluginInterface {
 
   /**
    * The comment storage service.
@@ -25,7 +25,7 @@ class UnapprovedComments extends LocalTaskDefault implements ContainerFactoryPlu
   protected $commentStorage;
 
   /**
-   * Construct the UnapprovedComments object.
+   * Construct the UnpublishedComments object.
    *
    * @param array $configuration
    *   A configuration array containing information about the plugin instance.
@@ -57,7 +57,7 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function getTitle() {
-    return t('Unapproved comments (@count)', array('@count' => $this->commentStorage->getUnapprovedCount()));
+    return t('Unpublished comments (@count)', array('@count' => $this->commentStorage->getUnpublishedCount()));
   }
 
 }
diff --git a/core/modules/comment/src/Plugin/views/field/LinkApprove.php b/core/modules/comment/src/Plugin/views/field/LinkPublish.php
similarity index 79%
rename from core/modules/comment/src/Plugin/views/field/LinkApprove.php
rename to core/modules/comment/src/Plugin/views/field/LinkPublish.php
index 095eacd..87e5896 100644
--- a/core/modules/comment/src/Plugin/views/field/LinkApprove.php
+++ b/core/modules/comment/src/Plugin/views/field/LinkPublish.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\comment\Plugin\views\field\LinkApprove.
+ * Definition of Drupal\comment\Plugin\views\field\LinkPublish.
  */
 
 namespace Drupal\comment\Plugin\views\field;
@@ -12,13 +12,13 @@
 use Drupal\views\ResultRow;
 
 /**
- * Provides a comment approve link.
+ * Provides a comment publish link.
  *
  * @ingroup views_field_handlers
  *
- * @ViewsField("comment_link_approve")
+ * @ViewsField("comment_link_publish")
  */
-class LinkApprove extends Link {
+class LinkPublish extends Link {
 
   /**
    * {@inheritdoc}
@@ -29,7 +29,7 @@ public function access(AccountInterface $account) {
   }
 
   /**
-   * Prepares the link pointing for approving the comment.
+   * Prepares the link for publishing the comment.
    *
    * @param \Drupal\Core\Entity\EntityInterface $data
    *   The comment entity.
@@ -42,16 +42,16 @@ public function access(AccountInterface $account) {
   protected function renderLink($data, ResultRow $values) {
     $status = $this->getValue($values, 'status');
 
-    // Don't show an approve link on published comment.
+    // Don't show a publish link on published comment.
     if ($status == CommentInterface::PUBLISHED) {
       return;
     }
 
-    $text = !empty($this->options['text']) ? $this->options['text'] : $this->t('Approve');
+    $text = !empty($this->options['text']) ? $this->options['text'] : $this->t('Publish');
     $comment = $this->get_entity($values);
 
     $this->options['alter']['make_link'] = TRUE;
-    $this->options['alter']['path'] = "comment/" . $comment->id() . "/approve";
+    $this->options['alter']['path'] = "comment/" . $comment->id() . "/publish";
     $this->options['alter']['query'] = drupal_get_destination() + array('token' => \Drupal::csrfToken()->get($this->options['alter']['path']));
 
     return $text;
diff --git a/core/modules/comment/src/Plugin/views/field/LinkUnpublish.php b/core/modules/comment/src/Plugin/views/field/LinkUnpublish.php
new file mode 100644
index 0000000..a11bc0a
--- /dev/null
+++ b/core/modules/comment/src/Plugin/views/field/LinkUnpublish.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\comment\Plugin\views\field\LinkUnpublish.
+ */
+
+namespace Drupal\comment\Plugin\views\field;
+
+use Drupal\comment\CommentInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\views\ResultRow;
+
+/**
+ * Provides a comment unpublish link.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @ViewsField("comment_link_unpublish")
+ */
+class LinkUnpublish extends Link {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access(AccountInterface $account) {
+    //needs permission to administer comments in general
+    return $account->hasPermission('administer comments');
+  }
+
+  /**
+   * Prepares the link for unpublishing the comment.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $data
+   *   The comment entity.
+   * @param \Drupal\views\ResultRow $values
+   *   The values retrieved from a single row of a view's query result.
+   *
+   * @return string
+   *   Returns a string for the link text.
+   */
+  protected function renderLink($data, ResultRow $values) {
+    $status = $this->getValue($values, 'status');
+
+    // Don't show an unpublish link on unpublished comment.
+    if ($status == CommentInterface::NOT_PUBLISHED) {
+      return;
+    }
+
+    $text = !empty($this->options['text']) ? $this->options['text'] : t('Unpublish');
+    $comment = $this->get_entity($values);
+
+    $this->options['alter']['make_link'] = TRUE;
+    $this->options['alter']['path'] = "comment/" . $comment->id() . "/unpublish";
+    $this->options['alter']['query'] = drupal_get_destination() + array('token' => \Drupal::csrfToken()->get($this->options['alter']['path']));
+
+    return $text;
+  }
+
+}
diff --git a/core/modules/comment/src/Tests/CommentAdminTest.php b/core/modules/comment/src/Tests/CommentAdminTest.php
index 811dfde..db6b769 100644
--- a/core/modules/comment/src/Tests/CommentAdminTest.php
+++ b/core/modules/comment/src/Tests/CommentAdminTest.php
@@ -8,15 +8,15 @@
 namespace Drupal\comment\Tests;
 
 /**
- * Tests comment approval functionality.
+ * Tests comment administration functionality.
  *
  * @group comment
  */
 class CommentAdminTest extends CommentTestBase {
   /**
-   * Test comment approval functionality through admin/content/comment.
+   * Tests comment overview with published and unpublished comments.
    */
-  function testApprovalAdminInterface() {
+  function testContentAdminPages() {
     // Set anonymous comments to require approval.
     user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
       'access comments' => TRUE,
@@ -38,9 +38,9 @@ function testApprovalAdminInterface() {
     $this->postComment($this->node, $body, $subject, TRUE); // Set $contact to true so that it won't check for id and message.
     $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), 'Comment requires approval.');
 
-    // Get unapproved comment id.
+    // Get unpublished comment id.
     $this->drupalLogin($this->admin_user);
-    $anonymous_comment4 = $this->getUnapprovedComment($subject);
+    $anonymous_comment4 = $this->getUnpublishedComment($subject);
     $anonymous_comment4 = entity_create('comment', array(
       'cid' => $anonymous_comment4,
       'subject' => $subject,
@@ -53,7 +53,7 @@ function testApprovalAdminInterface() {
 
     $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.');
 
-    // Approve comment.
+    // Publish comment.
     $this->drupalLogin($this->admin_user);
     $this->performCommentOperation($anonymous_comment4, 'publish', TRUE);
     $this->drupalLogout();
@@ -67,14 +67,14 @@ function testApprovalAdminInterface() {
 
     // Publish multiple comments in one operation.
     $this->drupalLogin($this->admin_user);
-    $this->drupalGet('admin/content/comment/approval');
-    $this->assertText(t('Unapproved comments (@count)', array('@count' => 2)), 'Two unapproved comments waiting for approval.');
+    $this->drupalGet('admin/content/comment/unpublished');
+    $this->assertText(t('Unpublished comments (@count)', array('@count' => 2)), 'Two unpublished comments waiting for approval.');
     $edit = array(
       "comments[{$comments[0]->id()}]" => 1,
       "comments[{$comments[1]->id()}]" => 1,
     );
     $this->drupalPostForm(NULL, $edit, t('Update'));
-    $this->assertText(t('Unapproved comments (@count)', array('@count' => 0)), 'All comments were approved.');
+    $this->assertText(t('Unpublished comments (@count)', array('@count' => 0)), 'All comments were unpublished.');
 
     // Delete multiple comments in one operation.
     $edit = array(
@@ -115,9 +115,9 @@ function testApprovalNodeInterface() {
     $this->postComment($this->node, $body, $subject, TRUE); // Set $contact to true so that it won't check for id and message.
     $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), 'Comment requires approval.');
 
-    // Get unapproved comment id.
+    // Get unpublished comment id.
     $this->drupalLogin($this->admin_user);
-    $anonymous_comment4 = $this->getUnapprovedComment($subject);
+    $anonymous_comment4 = $this->getUnpublishedComment($subject);
     $anonymous_comment4 = entity_create('comment', array(
       'cid' => $anonymous_comment4,
       'subject' => $subject,
@@ -130,20 +130,33 @@ function testApprovalNodeInterface() {
 
     $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.');
 
-    // Approve comment.
+    // Publish comment.
     $this->drupalLogin($this->admin_user);
-    $this->drupalGet('comment/1/approve');
+    $this->drupalGet('comment/1/publish');
     $this->assertResponse(403, 'Forged comment approval was denied.');
-    $this->drupalGet('comment/1/approve', array('query' => array('token' => 'forged')));
+    $this->drupalGet('comment/1/publish', array('query' => array('token' => 'forged')));
     $this->assertResponse(403, 'Forged comment approval was denied.');
     $this->drupalGet('comment/1/edit');
     $this->assertFieldChecked('edit-status-0');
     $this->drupalGet('node/' . $this->node->id());
-    $this->clickLink(t('Approve'));
+    $this->clickLink(t('Publish'));
     $this->drupalLogout();
 
     $this->drupalGet('node/' . $this->node->id());
     $this->assertTrue($this->commentExists($anonymous_comment4), 'Anonymous comment visible.');
+
+    // Unpublish comment.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('comment/1/unpublish');
+    $this->assertResponse(403, 'Forged comment unpublishing was denied.');
+    $this->drupalGet('comment/1/unpublish', array('query' => array('token' => 'forged')));
+    $this->assertResponse(403, 'Forged comment unpublishing was denied.');
+    $this->drupalGet('node/' . $this->node->id());
+    $this->clickLink(t('Unpublish'));
+    $this->drupalLogout();
+
+    $this->drupalGet('node/' . $this->node->id());
+    $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment not visible.');
   }
 
   /**
diff --git a/core/modules/comment/src/Tests/CommentAnonymousTest.php b/core/modules/comment/src/Tests/CommentAnonymousTest.php
index da4b453..2e70072 100644
--- a/core/modules/comment/src/Tests/CommentAnonymousTest.php
+++ b/core/modules/comment/src/Tests/CommentAnonymousTest.php
@@ -98,7 +98,7 @@ function testAnonymous() {
     // Unpublish comment.
     $this->performCommentOperation($anonymous_comment3, 'unpublish');
 
-    $this->drupalGet('admin/content/comment/approval');
+    $this->drupalGet('admin/content/comment/unpublished');
     $this->assertRaw('comments[' . $anonymous_comment3->id() . ']', 'Comment was unpublished.');
 
     // Publish comment.
diff --git a/core/modules/comment/src/Tests/CommentNonNodeTest.php b/core/modules/comment/src/Tests/CommentNonNodeTest.php
index 15eb7b7..302d47b 100644
--- a/core/modules/comment/src/Tests/CommentNonNodeTest.php
+++ b/core/modules/comment/src/Tests/CommentNonNodeTest.php
@@ -194,14 +194,14 @@ function commentContactInfoAvailable() {
    *   Comment to perform operation on.
    * @param string $operation
    *   Operation to perform.
-   * @param boolean $aproval
-   *   Operation is found on approval page.
+   * @param boolean $unpublished
+   *   Operation is found on unpublished comments page.
    */
-  function performCommentOperation($comment, $operation, $approval = FALSE) {
+  function performCommentOperation($comment, $operation, $unpublished = FALSE) {
     $edit = array();
     $edit['operation'] = $operation;
     $edit['comments[' . $comment->id() . ']'] = TRUE;
-    $this->drupalPostForm('admin/content/comment' . ($approval ? '/approval' : ''), $edit, t('Update'));
+    $this->drupalPostForm('admin/content/comment' . ($unpublished ? '/unpublished' : ''), $edit, t('Update'));
 
     if ($operation == 'delete') {
       $this->drupalPostForm(NULL, array(), t('Delete comments'));
@@ -213,7 +213,7 @@ function performCommentOperation($comment, $operation, $approval = FALSE) {
   }
 
   /**
-   * Gets the comment ID for an unapproved comment.
+   * Gets the comment ID for an unpublished comment.
    *
    * @param string $subject
    *   Comment subject to find.
@@ -221,8 +221,8 @@ function performCommentOperation($comment, $operation, $approval = FALSE) {
    * @return integer
    *   Comment ID.
    */
-  function getUnapprovedComment($subject) {
-    $this->drupalGet('admin/content/comment/approval');
+  function getUnpublishedComment($subject) {
+    $this->drupalGet('admin/content/comment/unpublished');
     preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>(' . $subject . ')/', $this->drupalGetContent(), $match);
 
     return $match[2];
@@ -256,7 +256,7 @@ function testCommentFunctionality() {
 
     // Unpublish the comment.
     $this->performCommentOperation($comment1, 'unpublish');
-    $this->drupalGet('admin/content/comment/approval');
+    $this->drupalGet('admin/content/comment/unpublished');
     $this->assertRaw('comments[' . $comment1->id() . ']', 'Comment was unpublished.');
 
     // Publish the comment.
diff --git a/core/modules/comment/src/Tests/CommentTestBase.php b/core/modules/comment/src/Tests/CommentTestBase.php
index d86e3d4..7cb5bff 100644
--- a/core/modules/comment/src/Tests/CommentTestBase.php
+++ b/core/modules/comment/src/Tests/CommentTestBase.php
@@ -334,14 +334,14 @@ function commentContactInfoAvailable() {
    *   Comment to perform operation on.
    * @param string $operation
    *   Operation to perform.
-   * @param boolean $aproval
-   *   Operation is found on approval page.
+   * @param boolean $unpublished
+   *   Operation is found on unpublished comments page.
    */
-  function performCommentOperation(CommentInterface $comment, $operation, $approval = FALSE) {
+  function performCommentOperation(CommentInterface $comment, $operation, $unpublished = FALSE) {
     $edit = array();
     $edit['operation'] = $operation;
     $edit['comments[' . $comment->id() . ']'] = TRUE;
-    $this->drupalPostForm('admin/content/comment' . ($approval ? '/approval' : ''), $edit, t('Update'));
+    $this->drupalPostForm('admin/content/comment' . ($unpublished ? '/unpublished' : ''), $edit, t('Update'));
 
     if ($operation == 'delete') {
       $this->drupalPostForm(NULL, array(), t('Delete comments'));
@@ -353,7 +353,7 @@ function performCommentOperation(CommentInterface $comment, $operation, $approva
   }
 
   /**
-   * Gets the comment ID for an unapproved comment.
+   * Gets the comment ID for an unapproved (unpublished) comment.
    *
    * @param string $subject
    *   Comment subject to find.
@@ -361,8 +361,8 @@ function performCommentOperation(CommentInterface $comment, $operation, $approva
    * @return integer
    *   Comment id.
    */
-  function getUnapprovedComment($subject) {
-    $this->drupalGet('admin/content/comment/approval');
+  function getUnpublishedComment($subject) {
+    $this->drupalGet('admin/content/comment/unpublished');
     preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>(' . $subject . ')/', $this->drupalGetContent(), $match);
 
     return $match[2];
