diff --git a/core/modules/book/book.views.inc b/core/modules/book/book.views.inc
new file mode 100644
index 0000000..43aa122
--- /dev/null
+++ b/core/modules/book/book.views.inc
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @file
+ * Provide views data for book.module.
+ *
+ * @ingroup views_module_handlers
+ */
+
+/**
+ * Implements hook_views_data().
+ */
+function book_views_data() {
+  $data = array();
+  $data['book'] = array();
+  $data['book']['table'] = array();
+  $data['book']['table']['group']  = t('Book');
+
+  $data['book']['table']['join'] = array(
+    'node' => array(
+      'left_field' => 'nid',
+      'field' => 'nid',
+    ),
+  );
+
+  $data['book']['nid'] = array(
+    'title' => t('Page'),
+    'help' => t('The book page node.'),
+    'relationship' => array(
+      'base' => 'node',
+      'id' => 'standard',
+      'label' => t('Book Page'),
+    ),
+  );
+
+  $data['book']['bid'] = array(
+    'title' => t('Top level book'),
+    'help' => t('The book the node is in.'),
+    'relationship' => array(
+      'base' => 'node',
+      'id' => 'standard',
+      'label' => t('Book'),
+    ),
+  );
+
+  $data['book']['pid'] = array(
+    'title' => t('Parent'),
+    'help' => t('The parent book node.'),
+    'relationship' => array(
+      'base' => 'node',
+      'id' => 'standard',
+      'label' => t('Book Parent'),
+    ),
+  );
+
+  $data['book']['has_children'] = array(
+    'title' => t('Page has Children'),
+    'help' => t('Flag indicating whether this book page has children'),
+    'field' => array(
+      'id' => 'boolean',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'boolean',
+      'label' => t('Has Children'),
+    ),
+    'argument' => array(
+      'id' => 'numeric',
+    ),
+  );
+
+  $data['book']['weight'] = array(
+    'title' => t('Weight'),
+    'help' => t('The weight of the book page.'),
+    'field' => array(
+      'id' => 'numeric',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+
+  $data['book']['depth'] = array(
+    'title' => t('Depth'),
+    'help' => t('The depth of the book page in the hierarchy; top level books have a depth of 1.'),
+    'field' => array(
+      'id' => 'numeric',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'numeric',
+    ),
+    'argument' => array(
+      'id' => 'standard',
+    ),
+  );
+  $prefix = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];
+  for ($i=1; $i < 10; $i++) {
+    $data['book']["p$i"] = array(
+      'title' => t("$i{$prefix[$i]} Parent"),
+      'help' => t("The $i{$prefix[$i]} parent of book node."),
+      'relationship' => array(
+        'base' => 'node',
+        'id' => 'standard',
+        'label' => t('Book Parent'),
+      ),
+    );
+  }
+
+  return $data;
+}
diff --git a/core/modules/book/src/Plugin/views/argument_default/Root.php b/core/modules/book/src/Plugin/views/argument_default/Root.php
new file mode 100644
index 0000000..4310853
--- /dev/null
+++ b/core/modules/book/src/Plugin/views/argument_default/Root.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\book\Plugin\views\argument_default\Root.
+ */
+
+namespace Drupal\book\Plugin\views\argument_default;
+
+use Drupal\views\Annotation\ViewsArgumentDefault;
+use Drupal\Core\Annotation\Translation;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\node\Plugin\views\argument_default\Node;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Default argument plugin to get the current node's book root.
+ *
+ * @ViewsArgumentDefault(
+ *   id = "book_root",
+ *   title = @Translation("Book root from current node")
+ * )
+ */
+class Root extends Node implements ContainerFactoryPluginInterface {
+
+  /**
+   * The node storage controller.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
+  /**
+   * Constructs a Drupal\Component\Plugin\PluginBase object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param array $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
+   *   The node storage controller.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityStorageInterface $node_storage) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->nodeStorage = $node_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.manager')->getStorage('node')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getArgument() {
+    // Use the argument_default_node plugin to get the nid argument.
+    $nid = parent::getArgument();
+    if (!empty($nid)) {
+      $node = $this->nodeStorage->load($nid);
+      if (isset($node->book['bid'])) {
+        return $node->book['bid'];
+      }
+    }
+  }
+
+}
