diff --git a/core/modules/book/src/BookManager.php b/core/modules/book/src/BookManager.php
index 3f5cfdc..1f0f578 100644
--- a/core/modules/book/src/BookManager.php
+++ b/core/modules/book/src/BookManager.php
@@ -695,11 +695,12 @@ public function loadBookLink($nid, $translate = TRUE) {
    * {@inheritdoc}
    */
   public function loadBookLinks($nids, $translate = TRUE) {
-    $result = $this->bookOutlineStorage->loadMultiple($nids);
+    $result = $this->bookOutlineStorage->loadMultiple($nids, $translate);
+    $nodes = $this->entityManager->getStorage('node')->loadMultiple($nids);
     $links = array();
     foreach ($result as $link) {
       if ($translate) {
-        $this->bookLinkTranslate($link);
+        $this->bookLinkTranslate($link, $nodes[$link['nid']]);
       }
       $links[$link['nid']] = $link;
     }
@@ -879,15 +880,27 @@ protected function setParents(array &$link, array $parent) {
    * {@inheritdoc}
    */
   public function bookTreeCheckAccess(&$tree, $node_links = array()) {
+    $nodes = [];
     if ($node_links) {
       // @todo Extract that into its own method.
       $nids = array_keys($node_links);
 
       // @todo This should be actually filtering on the desired node status field
       //   language and just fall back to the default language.
-      $nids = \Drupal::entityQuery('node')
-        ->condition('nid', $nids)
-        ->condition('status', 1)
+      $query = \Drupal::entityQuery('node')->condition('nid', $nids);
+
+      // Allows admins to view all nodes, by both disabling node_access
+      // query rewrite as well as not checking for the node status. The
+      // 'view own unpublished nodes' permission is ignored to not require cache
+      // entries per user.
+      if ($this->account->hasPermission('bypass node access')) {
+        $query->accessCheck(FALSE);
+      }
+      else {
+        $query->condition('status', NODE_PUBLISHED);
+      }
+
+      $nids = $query
         ->execute();
 
       foreach ($nids as $nid) {
@@ -895,21 +908,29 @@ public function bookTreeCheckAccess(&$tree, $node_links = array()) {
           $node_links[$nid][$mlid]['access'] = TRUE;
         }
       }
+
+      $nodes = $this->entityManager->getStorage('node')->loadMultiple($nids);
     }
-    $this->doBookTreeCheckAccess($tree);
+
+    $this->doBookTreeCheckAccess($tree, $nodes);
   }
 
   /**
    * Sorts the menu tree and recursively checks access for each item.
+   *
+   * @param array $tree
+   *   The book tree you wish to operate on.
+   * @param \Drupal\node\NodeInterface[] $nodes
+   *   Loaded nodes of the tree.
    */
-  protected function doBookTreeCheckAccess(&$tree) {
+  protected function doBookTreeCheckAccess(&$tree, array $nodes) {
     $new_tree = array();
     foreach ($tree as $key => $v) {
       $item = &$tree[$key]['link'];
-      $this->bookLinkTranslate($item);
+      $this->bookLinkTranslate($item, isset($nodes[$item['nid']]) ? $nodes[$item['nid']] : NULL);
       if ($item['access']) {
         if ($tree[$key]['below']) {
-          $this->doBookTreeCheckAccess($tree[$key]['below']);
+          $this->doBookTreeCheckAccess($tree[$key]['below'], $nodes);
         }
         // The weights are made a uniform 5 digits by adding 50000 as an offset.
         // After calling $this->bookLinkTranslate(), $item['title'] has the
@@ -926,24 +947,21 @@ protected function doBookTreeCheckAccess(&$tree) {
   /**
    * {@inheritdoc}
    */
-  public function bookLinkTranslate(&$link) {
-    $node = NULL;
+  public function bookLinkTranslate(&$link, NodeInterface $node = NULL) {
+    // Try to load the node, if its not available yet.
+    $node = $node ?: $this->entityManager->getStorage('node')->load($link['nid']);
+    if (!$node) {
+      $link['access'] = FALSE;
+      return $link;
+    }
+
     // Access will already be set in the tree functions.
     if (!isset($link['access'])) {
-      $node = $this->entityManager->getStorage('node')->load($link['nid']);
-      $link['access'] = $node && $node->access('view');
-    }
-    // For performance, don't localize a link the user can't access.
-    if ($link['access']) {
-      // @todo - load the nodes en-mass rather than individually.
-      if (!$node) {
-        $node = $this->entityManager->getStorage('node')
-          ->load($link['nid']);
-      }
-      // The node label will be the value for the current user's language.
-      $link['title'] = $node->label();
-      $link['options'] = array();
+      $link['access'] = $node->access('view');
     }
+    // The node label will be the value for the current user's language.
+    $link['title'] = $node->label();
+    $link['options'] = array();
     return $link;
   }
 
diff --git a/core/modules/book/src/BookOutlineStorage.php b/core/modules/book/src/BookOutlineStorage.php
index 8e8271d..b99b57a 100644
--- a/core/modules/book/src/BookOutlineStorage.php
+++ b/core/modules/book/src/BookOutlineStorage.php
@@ -47,12 +47,16 @@ public function hasBooks() {
   /**
    * {@inheritdoc}
    */
-  public function loadMultiple($nids) {
+  public function loadMultiple($nids, $access = TRUE) {
     $query = $this->connection->select('book', 'b', array('fetch' => \PDO::FETCH_ASSOC));
     $query->fields('b');
     $query->condition('b.nid', $nids);
-    $query->addTag('node_access');
     $query->addMetaData('base_table', 'book');
+
+    if ($access) {
+      $query->addTag('node_access');
+    }
+
     return $query->execute();
   }
 
diff --git a/core/modules/book/src/BookOutlineStorageInterface.php b/core/modules/book/src/BookOutlineStorageInterface.php
index e08fab6..f89a3cb 100644
--- a/core/modules/book/src/BookOutlineStorageInterface.php
+++ b/core/modules/book/src/BookOutlineStorageInterface.php
@@ -33,11 +33,13 @@ public function hasBooks();
    *
    * @param array $nids
    *   An array of node IDs.
+   * @param bool $access
+   *   (optional) TRUE if access should be taken into account
    *
    * @return array
    *   Array of loaded book items.
    */
-  public function loadMultiple($nids);
+  public function loadMultiple($nids, $access = TRUE);
 
   /**
    * Gets child relative depth.
