diff --git a/core/modules/node/lib/Drupal/node/NodeAccessController.php b/core/modules/node/lib/Drupal/node/NodeAccessController.php
index 815c2ab..5d95a93 100644
--- a/core/modules/node/lib/Drupal/node/NodeAccessController.php
+++ b/core/modules/node/lib/Drupal/node/NodeAccessController.php
@@ -43,6 +43,10 @@ protected function access(EntityInterface $node, $operation, $langcode = LANGUAG
       return TRUE;
     }
 
+    if ($operation == 'view' && user_access('view any unpublished content', $account)) {
+      return TRUE;
+    }
+
     if (!user_access('access content', $account)) {
       return FALSE;
     }
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessTest.php
index 4f87348..bbff1e0 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessTest.php
@@ -72,6 +72,10 @@ function testNodeAccess() {
     $this->assertNodeAccess(array('view' => TRUE, 'update' => FALSE), $node4, $web_user4);
     $this->assertNodeAccess(array('view' => FALSE), $node4, $web_user5);
 
+    // Ensures user with 'view any unpublished content' can do so.
+    $web_user6 = $this->drupalCreateUser(array('view any unpublished content'));
+    $this->assertNodeAccess(array('view' => TRUE, 'update' => FALSE), $node4, $web_user6);
+
     // Tests the default access provided for a published node.
     $node5 = $this->drupalCreateNode();
     $this->assertNodeAccess(array('view' => TRUE, 'update' => FALSE, 'delete' => FALSE), $node5, $web_user3);
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 139b2d2..1e51eac 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -492,7 +492,9 @@ function node_admin_nodes() {
     ->extend('Drupal\Core\Database\Query\TableSortExtender');
   node_build_filter_query($query);
 
-  if (!user_access('bypass node access')) {
+  // If the user is allowed to bypass node access or if the user is allowed to
+  // view all unpublished content, then we don't need to add any extra checks.
+  if (!user_access('bypass node access') && !user_access('view any unpublished content')) {
     // If the user is able to view their own unpublished nodes, allow them
     // to see these in addition to published nodes. Check that they actually
     // have some unpublished nodes to view before adding the condition.
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 4c7392b..ecfd598 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1253,6 +1253,9 @@ function node_permission() {
     'view own unpublished content' => array(
       'title' => t('View own unpublished content'),
     ),
+    'view any unpublished content' => array(
+      'title' => t('View any unpublished content'),
+    ),
     'view all revisions' => array(
       'title' => t('View all revisions'),
     ),
@@ -1893,7 +1896,9 @@ function node_revision_list(EntityInterface $node) {
 function node_get_recent($number = 10) {
   $query = db_select('node', 'n');
 
-  if (!user_access('bypass node access')) {
+  // If the user is allowed to bypass node access or if the user is allowed to
+  // view all unpublished content, then we don't need to add any extra checks.
+  if (!user_access('bypass node access') && !user_access('view any unpublished content')) {
     // If the user is able to view their own unpublished nodes, allow them
     // to see these in addition to published nodes. Check that they actually
     // have some unpublished nodes to view before adding the condition.
