=== modified file 'modules/book/book.module'
--- modules/book/book.module	2007-07-30 18:20:21 +0000
+++ modules/book/book.module	2007-08-04 03:42:09 +0000
@@ -329,7 +329,12 @@ function book_form_alter(&$form, $form_s
       $form['book']['pick-book'] = array(
         '#type' => 'submit',
         '#value' => t('Change book (update list of parents)'),
-        '#submit' => array('book_pick_book_submit'),
+          // Submit the node form so the parent select options get updated.
+          // This is typically only used when JS is disabled.  Since the parent options
+          // won't be changed via AJAX, a button is provided in the node form to submit
+          // the form and generate options in the parent select corresponding to the
+          // selected book.  This is similar to what happens during a node preview.
+        '#submit' => array('node_form_submit_build_node'),
         '#weight' => 20,
       );
     }
@@ -337,23 +342,6 @@ function book_form_alter(&$form, $form_s
 }
 
 /**
- * Submit the node form so the parent select options get updated.
- *
- * This is typically only used when JS is disabled.  Since the parent options
- * won't be changed via AJAX, a button is provided in the node form to submit
- * the form and generate options in the parent select corresponding to the
- * selected book.  This is similar to what happens during a node preview.
- */
-function book_pick_book_submit($form, &$form_state) {
-  // Unset any button-level handlers, execute all the form-level submit functions
-  // to process the form values into an updated node, and rebuild the form.
-  unset($form_state['submit_handlers']);
-  form_execute_handlers('submit', $form, $form_state);
-  $form_state['rebuild'] = TRUE;
-  $form_state['node'] = $form_state['values'];
-}
-
-/**
  * Build the parent selection form element for the node form or outline tab
  *
  * This function is also called when generating a new set of options during the

=== modified file 'modules/node/node.module'
--- modules/node/node.module	2007-08-02 20:08:52 +0000
+++ modules/node/node.module	2007-08-04 03:44:58 +0000
@@ -2231,15 +2231,23 @@ function node_form(&$form_state, $node) 
   return $form;
 }
 
-function node_form_build_preview($form, &$form_state) {
-  // Unset any button-level handlers, execute all the form-level submit functions
-  // to process the form values into an updated node, and rebuild the form.
+/**
+ * Build a fixed-up node from submitted form values and prepare for a form rebuild.
+ */
+function node_form_submit_build_node($form, &$form_state) {
+  // Unset any button-level handlers, execute all the form-level submit
+  // functions to process the form values into an updated node.
   unset($form_state['submit_handlers']);
   form_execute_handlers('submit', $form, $form_state);
-
-  $form_state['node_preview'] = node_preview((object)$form_state['values']);
+  $node = node_submit($form_state['values']);
+  $form_state['node'] = (array)$node;
   $form_state['rebuild'] = TRUE;
-  $form_state['node'] = $form_state['values'];
+  return $node;
+}
+
+function node_form_build_preview($form, &$form_state) {
+  $node = node_form_submit_build_node($form, $form_state);
+  $form_state['node_preview'] = node_preview($node);
 }
 
 function theme_node_form($form) {
@@ -2391,13 +2399,7 @@ function theme_node_log_message($log) {
 function node_form_submit($form, &$form_state) {
   global $user;
 
-  // Unset any button-level handlers, and execute all the form-level submit
-  // functions to process the form values into an updated node.
-  unset($form_state['submit_handlers']);
-  form_execute_handlers('submit', $form, $form_state);
-
-  // Fix up the node when required:
-  $node = node_submit($form_state['values']);
+  $node = node_form_submit_build_node($form, $form_state);
 
   // Prepare the node's body:
   if ($node->nid) {
@@ -2412,11 +2414,12 @@ function node_form_submit($form, &$form_
   }
   if ($node->nid) {
     if (node_access('view', $node)) {
+      unset($form_state['rebuild']);
       $form_state['redirect'] = 'node/'. $node->nid;
     }
   }
-  // it is very unlikely we get here
-  return FALSE;
+  // In the unlikely case something went wrong you will get the same on saves
+  // as one preview because node_form_submit_build_node is called.
 }
 
 /**

