diff --git a/core/modules/book/book.admin.inc b/core/modules/book/book.admin.inc
index d6d369e..86df616 100644
--- a/core/modules/book/book.admin.inc
+++ b/core/modules/book/book.admin.inc
@@ -156,15 +156,15 @@ function book_admin_edit_submit($form, &$form_state) {
       $values = $form_state['values']['table'][$key];
 
       // Update menu item if moved.
-      if ($row['plid']['#default_value'] != $values['plid'] || $row['weight']['#default_value'] != $values['weight']) {
-        $row['#item']['plid'] = $values['plid'];
+      if ($row['parent']['plid']['#default_value'] != $values['parent']['plid'] || $row['weight']['#default_value'] != $values['weight']) {
+        $row['#item']['plid'] = $values['parent']['plid'];
         $row['#item']['weight'] = $values['weight'];
         menu_link_save($row['#item']);
       }
 
       // Update the title if changed.
       if ($row['title']['#default_value'] != $values['title']) {
-        $node = node_load($values['nid']);
+        $node = node_load($row['#nid']);
         $langcode = LANGUAGE_NOT_SPECIFIED;
         $node->title = $values['title'];
         $node->book['link_title'] = $values['title'];
@@ -192,8 +192,14 @@ function book_admin_edit_submit($form, &$form_state) {
  */
 function _book_admin_table(Node $node, &$form) {
   $form['table'] = array(
-    '#theme' => 'book_admin_table',
+    '#type' => 'table',
     '#tree' => TRUE,
+    '#header' => array(t('Title'), t('Weight'), t('Parent'), t('Operations')),
+    '#empty' => t('No book content available.'),
+    '#tabledrag' => array(
+      array('order', 'sibling', 'book-weight'),
+      array('match', 'parent', 'book-plid', 'book-plid', 'book-mlid', TRUE, MENU_MAX_DEPTH - 2),
+    ),
   );
 
   $tree = book_menu_subtree_data($node->book);
@@ -212,7 +218,6 @@ function _book_admin_table(Node $node, &$form) {
     );
     _book_admin_table_tree($tree['below'], $form['table']);
   }
-
 }
 
 /**
@@ -233,107 +238,76 @@ function _book_admin_table_tree($tree, &$form) {
   $count = count($tree);
   $delta = ($count < 30) ? 15 : intval($count / 2) + 1;
 
+  $access = user_access('administer nodes');
+  $destination = drupal_get_destination();
+
   foreach ($tree as $data) {
-    $form['book-admin-' . $data['link']['nid']] = array(
-      '#item' => $data['link'],
-      'nid' => array('#type' => 'value', '#value' => $data['link']['nid']),
-      'depth' => array('#type' => 'value', '#value' => $data['link']['depth']),
-      'href' => array('#type' => 'value', '#value' => $data['link']['href']),
-      'title' => array(
-        '#type' => 'textfield',
-        '#default_value' => $data['link']['link_title'],
-        '#maxlength' => 255,
-        '#size' => 40,
-      ),
-      'weight' => array(
-        '#type' => 'weight',
-        '#default_value' => $data['link']['weight'],
-        '#delta' => max($delta, abs($data['link']['weight'])),
-        '#title' => t('Weight for @title', array('@title' => $data['link']['title'])),
-        '#title_display' => 'invisible',
+    $id = 'book-admin-' . $data['link']['nid'];
+
+    $form[$id]['#item'] = $data['link'];
+    $form[$id]['#nid'] = $data['link']['nid'];
+    $form[$id]['#attributes']['class'][] = 'draggable';
+    $form[$id]['#weight'] = $data['link']['weight'];
+
+    $form[$id]['title'] = array(
+      '#prefix' => theme('indentation', array('size' => $data['link']['depth'] - 2)),
+      '#type' => 'textfield',
+      '#default_value' => $data['link']['link_title'],
+      '#maxlength' => 255,
+      '#size' => 40,
+    );
+
+    $form[$id]['weight'] = array(
+      '#type' => 'weight',
+      '#default_value' => $data['link']['weight'],
+      '#delta' => max($delta, abs($data['link']['weight'])),
+      '#title' => t('Weight for @title', array('@title' => $data['link']['title'])),
+      '#title_display' => 'invisible',
+      '#attributes' => array(
+        'class' => array('book-weight'),
       ),
-      'plid' => array(
-        '#type' => 'hidden',
-        '#default_value' => $data['link']['plid'],
+    );
+
+    $form[$id]['parent']['plid'] = array(
+      '#type' => 'hidden',
+      '#default_value' => $data['link']['plid'],
+      '#attributes' => array(
+        'class' => array('book-plid'),
       ),
-      'mlid' => array(
-        '#type' => 'hidden',
-        '#default_value' => $data['link']['mlid'],
+    );
+    $form[$id]['parent']['mlid'] = array(
+      '#type' => 'hidden',
+      '#default_value' => $data['link']['mlid'],
+      '#attributes' => array(
+        'class' => array('book-mlid'),
       ),
     );
-    if ($data['below']) {
-      _book_admin_table_tree($data['below'], $form);
-    }
-  }
-
-  return $form;
-}
-
-/**
- * Returns HTML for a book administration form.
- *
- * @param array $variables
- *   An associative array containing:
- *   - form: A render element representing the form.
- *
- * @see book_admin_table()
- * @ingroup themeable
- */
-function theme_book_admin_table($variables) {
-  $form = $variables['form'];
 
-  drupal_add_tabledrag('book-outline', 'match', 'parent', 'book-plid', 'book-plid', 'book-mlid', TRUE, MENU_MAX_DEPTH - 2);
-  drupal_add_tabledrag('book-outline', 'order', 'sibling', 'book-weight');
-
-  $header = array(t('Title'), t('Weight'), t('Parent'), t('Operations'));
-
-  $rows = array();
-  $destination = drupal_get_destination();
-  $access = user_access('administer nodes');
-  foreach (element_children($form) as $key) {
-    $nid = $form[$key]['nid']['#value'];
-    $href = $form[$key]['href']['#value'];
-
-    // Add special classes to be used with tabledrag.js.
-    $form[$key]['plid']['#attributes']['class'] = array('book-plid');
-    $form[$key]['mlid']['#attributes']['class'] = array('book-mlid');
-    $form[$key]['weight']['#attributes']['class'] = array('book-weight');
-
-    $data = array(
-      theme('indentation', array('size' => $form[$key]['depth']['#value'] - 2)) . drupal_render($form[$key]['title']),
-      drupal_render($form[$key]['weight']),
-      drupal_render($form[$key]['plid']) . drupal_render($form[$key]['mlid']),
+    $form[$id]['operations'] = array(
+      '#type' => 'operations',
+      '#links' => array(),
     );
-    $links = array();
-    $links['view'] = array(
+    $form[$id]['operations']['#links']['view'] = array(
       'title' => t('View'),
-      'href' => $href,
+      'href' => $data['link']['href'],
     );
     if ($access) {
-      $links['edit'] = array(
+      $form[$id]['operations']['#links']['edit'] = array(
         'title' => t('Edit'),
-        'href' => "node/$nid/edit",
+        'href' => "node/$id/edit",
         'query' => $destination,
       );
-      $links['delete'] = array(
+      $form[$id]['operations']['#links']['delete'] = array(
         'title' => t('Delete'),
-        'href' => "node/$nid/delete",
+        'href' => "node/$id/delete",
         'query' => $destination,
       );
     }
-    $data[] = array(
-      'data' => array(
-        '#type' => 'operations',
-        '#links' => $links,
-      ),
-    );
-    $row = array('data' => $data);
-    if (isset($form[$key]['#attributes'])) {
-      $row = array_merge($row, $form[$key]['#attributes']);
+
+    if ($data['below']) {
+      _book_admin_table_tree($data['below'], $form);
     }
-    $row['class'][] = 'draggable';
-    $rows[] = $row;
   }
 
-  return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'book-outline'), 'empty' => t('No book content available.')));
+  return $form;
 }
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 81b0c99..5704ee8 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -51,9 +51,6 @@ function book_theme() {
       'variables' => array('title' => NULL, 'contents' => NULL, 'depth' => NULL),
       'template' => 'book-export-html',
     ),
-    'book_admin_table' => array(
-      'render element' => 'form',
-    ),
     'book_all_books_block' => array(
       'render element' => 'book_menus',
       'template' => 'book-all-books-block',
@@ -973,7 +970,9 @@ function book_preprocess_block(&$variables) {
 }
 
 /**
- * Processes variables for book-all-books-block.tpl.php.
+ * Prepares variables for book listing block templates.
+ *
+ * Default template: book-all-books-block.twig.html.
  *
  * All non-renderable elements are removed so that the template has full access
  * to the structured data but can also simply iterate over all elements and
@@ -982,8 +981,6 @@ function book_preprocess_block(&$variables) {
  * @param array $variables
  *   An associative array containing the following key:
  *   - book_menus
- *
- * @see book-all-books-block.tpl.php
  */
 function template_preprocess_book_all_books_block(&$variables) {
   // Remove all non-renderable elements.
@@ -995,13 +992,13 @@ function template_preprocess_book_all_books_block(&$variables) {
 }
 
 /**
- * Processes variables for book-navigation.tpl.php.
+ * Prepares variables for book navigation templates.
+ *
+ * Default template: book-navigation.twig.html.
  *
  * @param array $variables
  *   An associative array containing the following key:
  *   - book_link
- *
- * @see book-navigation.tpl.php
  */
 function template_preprocess_book_navigation(&$variables) {
   drupal_add_css(drupal_get_path('module', 'book') . '/book.theme.css');
@@ -1117,15 +1114,15 @@ function book_toc($bid, $depth_limit, $exclude = array()) {
 }
 
 /**
- * Preprocesses variables for book-export-html.tpl.php.
+ * Prepares variables for book export templates.
+ *
+ * Default template: book-export-html.twig.html
  *
  * @param array $variables
  *   An associative array containing the following keys:
  *   - title
  *   - contents
  *   - depth
- *
- * @see book-export-html.tpl.php
  */
 function template_preprocess_book_export_html(&$variables) {
   global $base_url;
@@ -1207,14 +1204,14 @@ function book_node_export(Node $node, $children = '') {
 }
 
 /**
- * Processes variables for book-node-export-html.tpl.php.
+ * Processes variables for single node export templates.
+ *
+ * Default template: book-node-export-html.html.twig.
  *
  * @param array $variables
  *   An associative array containing the following keys:
  *   - node
  *   - children
- *
- * @see book-node-export-html.tpl.php
  */
 function template_preprocess_book_node_export_html(&$variables) {
   $variables['depth'] = $variables['node']->book['depth'];
diff --git a/core/modules/book/templates/book-all-books-block.html.twig b/core/modules/book/templates/book-all-books-block.html.twig
new file mode 100644
index 0000000..241594d
--- /dev/null
+++ b/core/modules/book/templates/book-all-books-block.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Default theme implementation for rendering book outlines within a block.
+ *
+ * This template is used only when the block is configured to "show block on all
+ * pages", which presents multiple independent books on all pages.
+ *
+ * Available variables:
+ * - book_menus: Book outlines.
+ *   - book_id: the parent book ID.
+ *   - menu: an array of top-level book links.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_book_all_books_block()
+ *
+ * @ingroup themeable
+ */
+#}
+{% for book_id, menu in book_menus %}
+  <nav id="book-block-menu-{{ book_id }}" class="book-block-menu">
+    {{ menu }}
+  </nav>
+{% endfor %}
diff --git a/core/modules/book/templates/book-all-books-block.tpl.php b/core/modules/book/templates/book-all-books-block.tpl.php
deleted file mode 100644
index 8e5343b..0000000
--- a/core/modules/book/templates/book-all-books-block.tpl.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-/**
- * @file
- * Default theme implementation for rendering book outlines within a block.
- *
- * This template is used only when the block is configured to "show block on all
- * pages", which presents multiple independent books on all pages.
- *
- * Available variables:
- * - $book_menus: Array of book outlines keyed to the parent book ID. Call
- *   render() on each to print it as an unordered list.
- *
- * @see template_preprocess_book_all_books_block()
- *
- * @ingroup themeable
- */
-?>
-<?php foreach ($book_menus as $book_id => $menu): ?>
-  <nav id="book-block-menu-<?php print $book_id; ?>" class="book-block-menu">
-    <?php print render($menu); ?>
-  </nav>
-<?php endforeach; ?>
diff --git a/core/modules/book/templates/book-export-html.html.twig b/core/modules/book/templates/book-export-html.html.twig
new file mode 100644
index 0000000..1177f4c
--- /dev/null
+++ b/core/modules/book/templates/book-export-html.html.twig
@@ -0,0 +1,51 @@
+{#
+/**
+ * @file
+ * Default theme implementation for printed version of book outline.
+ *
+ * Available variables:
+ * - title: Top level node title.
+ * - head: Header tags.
+ * - language: Language object.
+ * - language_rtl: TRUE or FALSE depending on right to left language scripts.
+ * - base_url: URL to home page.
+ * - contents: Nodes within the current outline rendered through
+ *   book-node-export-html.html.twig.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_book_export_html()
+ *
+ * @ingroup themeable
+ */
+#}
+<!DOCTYPE html >
+<html{{ html_attributes }}>
+  <head>
+    <title>{{ title }}></title>
+    {{ head }}
+    <base href="{{ base_url }}" />
+    <link type="text/css" rel="stylesheet" href="misc/print.css" />
+    {% if language_rtl %}
+      <link type="text/css" rel="stylesheet" href="misc/print-rtl.css" />
+    {% endif %}
+  </head>
+  <body>
+    {#
+      The given node is /embedded to its absolute depth in a top level
+      section/. For example, a child node with depth 2 in the hierarchy is
+      contained in (otherwise empty) div elements corresponding to
+      depth 0 and depth 1. This is intended to support WYSIWYG output - e.g.,
+      level 3 sections always look like level 3 sections, no matter their
+      depth relative to the node selected to be exported as printer-friendly
+      HTML.
+     #}
+
+  {% for i in range(1, depth-1) %}
+    <div class="section-{{ i }}">
+  {% endfor %}
+  {{ contents }}
+  {% for i in range(1, depth-1) %}
+    </div>
+  {% endfor %}
+  </body>
+</html>
diff --git a/core/modules/book/templates/book-export-html.tpl.php b/core/modules/book/templates/book-export-html.tpl.php
deleted file mode 100644
index df04dab..0000000
--- a/core/modules/book/templates/book-export-html.tpl.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/**
- * @file
- * Default theme implementation for printed version of book outline.
- *
- * Available variables:
- * - $title: Top level node title.
- * - $head: Header tags.
- * - $language: Language object.
- * - $language_rtl: TRUE or FALSE depending on right to left language scripts.
- * - $base_url: URL to home page.
- * - $contents: Nodes within the current outline rendered through
- *   book-node-export-html.tpl.php.
- *
- * @see template_preprocess_book_export_html()
- *
- * @ingroup themeable
- */
-?>
-<!DOCTYPE html >
-<html<?php print $html_attributes; ?>>
-  <head>
-    <title><?php print $title; ?></title>
-    <?php print $head; ?>
-    <base href="<?php print $base_url; ?>" />
-    <link type="text/css" rel="stylesheet" href="misc/print.css" />
-    <?php if ($language_rtl): ?>
-      <link type="text/css" rel="stylesheet" href="misc/print-rtl.css" />
-    <?php endif; ?>
-  </head>
-  <body>
-    <?php
-    /**
-     * The given node is /embedded to its absolute depth in a top level
-     * section/. For example, a child node with depth 2 in the hierarchy is
-     * contained in (otherwise empty) &lt;div&gt; elements corresponding to
-     * depth 0 and depth 1. This is intended to support WYSIWYG output - e.g.,
-     * level 3 sections always look like level 3 sections, no matter their
-     * depth relative to the node selected to be exported as printer-friendly
-     * HTML.
-     */
-    $div_close = '';
-    ?>
-    <?php for ($i = 1; $i < $depth; $i++): ?>
-      <div class="section-<?php print $i; ?>">
-      <?php $div_close .= '</div>'; ?>
-    <?php endfor; ?>
-    <?php print $contents; ?>
-    <?php print $div_close; ?>
-  </body>
-</html>
diff --git a/core/modules/book/templates/book-navigation.html.twig b/core/modules/book/templates/book-navigation.html.twig
new file mode 100644
index 0000000..8c873f0
--- /dev/null
+++ b/core/modules/book/templates/book-navigation.html.twig
@@ -0,0 +1,59 @@
+{#
+/**
+ * @file
+ * Default theme implementation to navigate books.
+ *
+ * Presented under nodes that are a part of book outlines.
+ *
+ * Available variables:
+ * - tree: The immediate children of the current node rendered as an unordered
+ *   list.
+ * - current_depth: Depth of the current node within the book outline. Provided
+ *   for context.
+ * - prev_url: URL to the previous node.
+ * - prev_title: Title of the previous node.
+ * - parent_url: URL to the parent node.
+ * - parent_title: Title of the parent node. Not printed by default. Provided
+ *   as an option.
+ * - next_url: URL to the next node.
+ * - next_title: Title of the next node.
+ * - has_links: Flags TRUE whenever the previous, parent or next data has a
+ *   value.
+ * - book_id: The book ID of the current outline being viewed. Same as the node
+ *   ID containing the entire outline. Provided for context.
+ * - book_url: The book/node URL of the current outline being viewed. Provided
+ *   as an option. Not used by default.
+ * - book_title: The book/node title of the current outline being viewed.
+ *   Provided as an option. Not used by default.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_book_navigation()
+ *
+ * @ingroup themeable
+ */
+#}
+{% if tree or has_links %}
+  <nav id="book-navigation-{{ book_id }}" class="book-navigation">
+    {{ tree }}
+    {% if has_links %}
+      <h2 class="element-invisible">{{ 'Book Navigation' | t }}</h2>
+      <ul class="book-pager">
+      {% if prev_url %}
+        <li class="previous">
+          <a href="{{ prev_url }}" rel="prev" title="{{ 'Go to previous page' | t }}"><b>{{ '‹' | t }}</b> {{ prev_title }}</a>
+        </li>
+      {% endif %}
+      {% if parent_url %}
+        <li class="up">
+          <a href="{{ parent_url }}" title="{{ 'Go to parent page' | t }}">{{ 'Up' | t }}</a>
+        </li>
+      {% endif %}
+      {% if next_url %}
+        <li class="next">
+          <a href="{{ next_url }}" rel="next" title="{{ 'Go to next page' | t }}">{{ next_title }} <b>{{ '›' | t }}</b></a>
+        </li>
+      {% endif %}
+    </ul>
+    {% endif %}
+  </nav>
+{% endif %}
diff --git a/core/modules/book/templates/book-navigation.tpl.php b/core/modules/book/templates/book-navigation.tpl.php
deleted file mode 100644
index cdc1278..0000000
--- a/core/modules/book/templates/book-navigation.tpl.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * @file
- * Default theme implementation to navigate books.
- *
- * Presented under nodes that are a part of book outlines.
- *
- * Available variables:
- * - $tree: The immediate children of the current node rendered as an unordered
- *   list.
- * - $current_depth: Depth of the current node within the book outline. Provided
- *   for context.
- * - $prev_url: URL to the previous node.
- * - $prev_title: Title of the previous node.
- * - $parent_url: URL to the parent node.
- * - $parent_title: Title of the parent node. Not printed by default. Provided
- *   as an option.
- * - $next_url: URL to the next node.
- * - $next_title: Title of the next node.
- * - $has_links: Flags TRUE whenever the previous, parent or next data has a
- *   value.
- * - $book_id: The book ID of the current outline being viewed. Same as the node
- *   ID containing the entire outline. Provided for context.
- * - $book_url: The book/node URL of the current outline being viewed. Provided
- *   as an option. Not used by default.
- * - $book_title: The book/node title of the current outline being viewed.
- *   Provided as an option. Not used by default.
- *
- * @see template_preprocess_book_navigation()
- *
- * @ingroup themeable
- */
-?>
-<?php if ($tree || $has_links): ?>
-  <nav id="book-navigation-<?php print $book_id; ?>" class="book-navigation">
-    <?php print $tree; ?>
-    <?php if ($has_links): ?>
-      <h2 class="element-invisible"><?php print t('Book Navigation'); ?></h2>
-      <ul class="book-pager">
-      <?php if ($prev_url): ?>
-        <li class="previous">
-          <a href="<?php print $prev_url; ?>" rel="prev" title="<?php print t('Go to previous page'); ?>"><b><?php print t('‹'); ?></b> <?php print $prev_title; ?></a>
-        </li>
-      <?php endif; ?>
-      <?php if ($parent_url): ?>
-        <li class="up">
-          <a href="<?php print $parent_url; ?>" title="<?php print t('Go to parent page'); ?>"><?php print t('Up'); ?></a>
-        </li>
-      <?php endif; ?>
-      <?php if ($next_url): ?>
-        <li class="next">
-          <a href="<?php print $next_url; ?>" rel="next" title="<?php print t('Go to next page'); ?>"><?php print $next_title;?> <b><?php print t('›'); ?></b></a>
-        </li>
-      <?php endif; ?>
-    </ul>
-    <?php endif; ?>
-  </nav>
-<?php endif; ?>
diff --git a/core/modules/book/templates/book-node-export-html.html.twig b/core/modules/book/templates/book-node-export-html.html.twig
new file mode 100644
index 0000000..f8da328
--- /dev/null
+++ b/core/modules/book/templates/book-node-export-html.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a single node in a printer-friendly outline.
+ *
+ * Available variables:
+ * - node: Fully loaded node entity.
+ * - depth: Depth of the current node inside the outline.
+ * - title: Node title.
+ * - content: Node content.
+ * - children: All the child nodes recursively rendered through this file.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_book_node_export_html()
+ *
+ * @ingroup themeable
+ */
+#}
+<article id="node-{{ node.nid }}" class="section-{{ depth }}">
+  <h1 class="book-heading">{{ title }}</h1>
+  {{ content }}
+  {{ children }}
+</article>
diff --git a/core/modules/book/templates/book-node-export-html.tpl.php b/core/modules/book/templates/book-node-export-html.tpl.php
deleted file mode 100644
index 50c878f..0000000
--- a/core/modules/book/templates/book-node-export-html.tpl.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Default theme implementation for a single node in a printer-friendly outline.
- *
- * @see book-node-export-html.tpl.php
- * Where it is collected and printed out.
- *
- * Available variables:
- * - $depth: Depth of the current node inside the outline.
- * - $title: Node title.
- * - $content: Node content.
- * - $children: All the child nodes recursively rendered through this file.
- *
- * @see template_preprocess_book_node_export_html()
- *
- * @ingroup themeable
- */
-?>
-<article id="node-<?php print $node->nid; ?>" class="section-<?php print $depth; ?>">
-  <h1 class="book-heading"><?php print $title; ?></h1>
-  <?php print $content; ?>
-  <?php print $children; ?>
-</article>
