diff --git modules/book/book.admin.inc modules/book/book.admin.inc
index 386dfcc..cec673a 100644
--- modules/book/book.admin.inc
+++ modules/book/book.admin.inc
@@ -235,7 +235,9 @@ function theme_book_admin_table($variables) {
 
   $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'];
@@ -245,13 +247,18 @@ function theme_book_admin_table($variables) {
     $form[$key]['mlid']['#attributes']['class'] = array('book-mlid');
     $form[$key]['weight']['#attributes']['class'] = array('book-weight');
 
+    // Check node access for specified node and current user.
+    $node = node_load($nid);
+    $update_access = $access || node_access("update", $node);
+    $delete_access = $access || node_access("delete", $node);
+
     $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']),
       l(t('view'), $href),
-      $access ? l(t('edit'), 'node/' . $nid . '/edit', array('query' => $destination)) : '&nbsp;',
-      $access ? l(t('delete'), 'node/' . $nid . '/delete', array('query' => $destination) )  : '&nbsp;',
+      $update_access ? l(t('edit'), 'node/' . $nid . '/edit', array('query' => $destination)) : '&nbsp;',
+      $delete_access ? l(t('delete'), 'node/' . $nid . '/delete', array('query' => $destination) )  : '&nbsp;',
     );
     $row = array('data' => $data);
     if (isset($form[$key]['#attributes'])) {
@@ -263,3 +270,11 @@ function theme_book_admin_table($variables) {
 
   return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'book-outline')));
 }
+
+/**
+ * Menu callback; show the reorder form for a single node.
+ */
+function book_reorder($node) {
+  return drupal_get_form('book_admin_edit', $node);
+}
+
diff --git modules/book/book.info modules/book/book.info
index 1bb72d3..1e05f52 100644
--- modules/book/book.info
+++ modules/book/book.info
@@ -7,3 +7,9 @@ core = 7.x
 files[] = book.test
 configure = admin/content/book/settings
 stylesheets[all][] = book.css
+
+; Information added by drupal.org packaging script on 2011-01-05
+version = "7.0"
+project = "drupal"
+datestamp = "1294208756"
+
diff --git modules/book/book.module modules/book/book.module
index 4252f3e..ceb78b3 100644
--- modules/book/book.module
+++ modules/book/book.module
@@ -29,7 +29,7 @@ function book_help($path, $arg) {
     case 'admin/content/book':
       return '<p>' . t('The book module offers a means to organize a collection of related content pages, collectively known as a book. When viewed, this content automatically displays links to adjacent book pages, providing a simple navigation system for creating and reviewing structured content.') . '</p>';
     case 'node/%/outline':
-      return '<p>' . t('The outline feature allows you to include pages in the <a href="@book">Book hierarchy</a>, as well as move them within the hierarchy or to <a href="@book-admin">reorder an entire book</a>.', array('@book' => url('book'), '@book-admin' => url('admin/content/book'))) . '</p>';
+      return '<p>' . t('The outline feature allows you to include pages in the <a href="@book">Book hierarchy</a>, as well as move them within the hierarchy or to <a href="@book-admin">reorder an entire book</a>.', array('@book' => url('book'), '@book-admin' => url('node/' . arg(1) . '/reorder'))) . '</p>';
   }
 }
 
@@ -69,13 +69,22 @@ function book_theme() {
 function book_permission() {
   return array(
     'administer book outlines' => array(
-      'title' => t('Administer book outlines'),
+      'title' => t('Administer all book outlines'),
+    ),
+    'administer own book outlines' => array(
+      'title' => t('Administer own book outlines'),
     ),
     'create new books' => array(
       'title' => t('Create new books'),
     ),
+    'add content to own books' => array(
+      'title' => t('Add content and child pages to own books'),
+    ),
     'add content to books' => array(
-      'title' => t('Add content and child pages to books'),
+      'title' => t('Add content and child pages to all books'),
+    ),
+    'choose only own books in outline' => array(
+      'title' => t('Choose only own books in the book outline'),
     ),
     'access printer-friendly version' => array(
       'title' => t('View printer-friendly books'),
@@ -85,15 +94,27 @@ function book_permission() {
 }
 
 /**
+ * Helper for access check for given user.
+ */
+function _book_user_access($node, $user) {
+  $access = user_access('add content to books') || user_access('administer book outlines');
+  if ($user->uid == $node->uid && user_access('add content to own books')) {
+    $access = TRUE;
+  }
+  return $access;
+}
+
+/**
  * Inject links into $node as needed.
  */
 function book_node_view_link($node, $view_mode) {
+  global $user;
   $links = array();
 
   if (isset($node->book['depth'])) {
     if ($view_mode == 'full' && node_is_page($node)) {
       $child_type = variable_get('book_child_type', 'book');
-      if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', $child_type) && $node->status == 1 && $node->book['depth'] < MENU_MAX_DEPTH) {
+      if (_book_user_access($node, $user) && node_access('create', $child_type) && $node->status == 1 && $node->book['depth'] < MENU_MAX_DEPTH) {
         $links['book_add_child'] = array(
           'title' => t('Add child page'),
           'href' => 'node/add/' . str_replace('_', '-', $child_type),
@@ -178,6 +199,17 @@ function book_menu() {
     'weight' => 2,
     'file' => 'book.pages.inc',
   );
+  $items['node/%node/reorder'] = array(
+    'title' => 'Reorder',
+    'description' => "Manage your book's outline.",
+    'page callback' => 'book_reorder',
+    'page arguments' => array(1),
+    'access callback' => '_book_outline_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2,
+    'file' => 'book.admin.inc',
+  );
   $items['node/%node/outline/remove'] = array(
     'title' => 'Remove from outline',
     'page callback' => 'drupal_get_form',
@@ -194,7 +226,8 @@ function book_menu() {
  * Menu item access callback - determine if the outline tab is accessible.
  */
 function _book_outline_access($node) {
-  return user_access('administer book outlines') && node_access('view', $node);
+  global $user;
+  return _book_user_access($node, $user) && node_access('update', $node);
 }
 
 /**
@@ -212,6 +245,7 @@ function book_admin_paths() {
     $paths = array(
       'node/*/outline' => TRUE,
       'node/*/outline/remove' => TRUE,
+      'node/*/reorder' => TRUE,
     );
     return $paths;
   }
@@ -282,7 +316,7 @@ function book_block_view($delta = '') {
     // Only display this block when the user is browsing a book.
     $select = db_select('node');
     $select->addField('node', 'title');
-    $select->condition('nid', $node->book['bid']);
+    $select->condition('node.nid', $node->book['bid']);
     $select->addTag('node_access');
     $title = $select->execute()->fetchField();
     // Only show the block if the user has view access for the top-level node.
@@ -350,6 +384,7 @@ function theme_book_title_link($variables) {
  * the options for a form select.
  */
 function book_get_books() {
+  global $user;
   $all_books = &drupal_static(__FUNCTION__);
 
   if (!isset($all_books)) {
@@ -366,6 +401,9 @@ function book_get_books() {
       $query->fields('ml');
       $query->condition('n.nid', $nids, 'IN');
       $query->condition('n.status', 1);
+      if (user_access('administer own book outlines') && !user_access('administer book outlines')) {
+        $query->condition('n.uid', $user->uid);
+      }
       $query->orderBy('ml.weight');
       $query->orderBy('ml.link_title');
       $query->addTag('node_access');
@@ -392,10 +430,9 @@ function book_form_node_form_alter(&$form, &$form_state, $form_id) {
   $node = $form['#node'];
   $access = user_access('administer book outlines');
   if (!$access) {
-    if (user_access('add content to books') && ((!empty($node->book['mlid']) && !empty($node->nid)) || book_type_is_allowed($node->type))) {
-      // Already in the book hierarchy, or this node type is allowed.
-      $access = TRUE;
-    }
+    $access = user_access('add content to books') || user_access('add content to own books');
+    // Already in the book hierarchy, or this node type is allowed.
+    $access = $access && ((!empty($node->book['mlid']) && !empty($node->nid)) || book_type_is_allowed($node->type));
   }
 
   if ($access) {
@@ -903,8 +940,10 @@ function book_node_delete($node) {
  * Implements hook_node_prepare().
  */
 function book_node_prepare($node) {
+  global $user;
+  _book_user_access($node, $user);
   // Prepare defaults for the add/edit form.
-  if (empty($node->book) && (user_access('add content to books') || user_access('administer book outlines'))) {
+  if (empty($node->book) && $access) {
     $node->book = array();
 
     if (empty($node->nid) && isset($_GET['parent']) && is_numeric($_GET['parent'])) {
