Index: book.admin.inc
===================================================================
--- book.admin.inc	(revision 176)
+++ book.admin.inc	(working copy)
@@ -170,6 +170,16 @@ function _book_admin_table($node, &$form
  * @see book_admin_edit()
  */
 function _book_admin_table_tree($tree, &$form) {
+  // Adjust delta to be big enough to allow items to be moved from one chapter to another.
+  $tree_item = array_pop($tree);
+  $bid = $tree_item['link']['bid'];
+  $toc_count_all = count(book_toc($bid, array(), 8));
+  $toc_count_first_child_level = count(book_toc($bid, array(), 2)) - 1; //Exclude the book itself
+  $delta_estimate = ceil($toc_count_all / $toc_count_first_child_level); // Estimated delta value to be big enough
+  if ($delta_estimate < 15) {
+    $delta_estimate = 15;
+  }
+
   foreach ($tree as $data) {
     $form['book-admin-'. $data['link']['nid']] = array(
       '#item' => $data['link'],
@@ -185,7 +195,7 @@ function _book_admin_table_tree($tree, &
       'weight' => array(
         '#type' => 'weight',
         '#default_value' => $data['link']['weight'],
-        '#delta' => 15,
+        '#delta' => max($delta_estimate, abs($data['link']['weight'])),
       ),
       'plid' => array(
         '#type' => 'textfield',
Index: book.module
===================================================================
--- book.module	(revision 176)
+++ book.module	(working copy)
@@ -382,11 +382,17 @@ function _book_add_form_elements(&$form,
 
   $form['book']['plid'] = _book_parent_select($node->book);
 
+  // @see _book_admin_table_tree(). The weight may need to be larger than 15.
+  // Estimate the size of the book to adjust delta value accordingly.
+  $book_link = menu_link_load($node->book['mlid']);
+  //Parent pages and pages at the same level
+  $book_menu_count = count(book_get_flat_menu($book_link));
+
   $form['book']['weight'] = array(
     '#type' => 'weight',
     '#title' => t('Weight'),
     '#default_value' => $node->book['weight'],
-    '#delta' => 15,
+    '#delta' => max(15, ceil($book_menu_count/2)),
     '#weight' => 5,
     '#description' => t('Pages at a given level are ordered first by weight and then by title.'),
   );
