diff --git modules/node/node.module modules/node/node.module
index 0850d76..509ca48 100644
--- modules/node/node.module
+++ modules/node/node.module
@@ -941,36 +941,42 @@ function node_save($node) {
     module_invoke_all('node_presave', $node);
     global $user;
 
+    // Determine if we are inserting a new node.
     if (!isset($node->is_new)) {
       $node->is_new = empty($node->nid);
     }
 
-    // Apply filters to some default node fields:
-    if ($node->is_new) {
-      // Insert a new node.
-      $node->is_new = TRUE;
-
-      // When inserting a node, $node->log must be set because
-      // {node_revision}.log does not (and cannot) have a default
-      // value. If the user does not have permission to create
-      // revisions, however, the form will not contain an element for
-      // log so $node->log will be unset at this point.
+    if ($node->is_new || !empty($node->revision)) {
+      // When inserting a node revision, $node->log must be set because
+      // {node_revision}.log cannot have a default value because it is a text
+      // column. However, $node->log may not be set at this point, such as if the
+      // user submitting a node form does not have permission to create revisions.
       if (!isset($node->log)) {
         $node->log = '';
       }
     }
-    elseif (!empty($node->revision)) {
+    elseif (empty($node->log)) {
+      // When updating, avoid clobbering an existing log entry with an empty one.
+      unset($node->log);
+    }
+    // $node->teaser and $node->body are also text columns and have no default,
+    // but are not allowed to be NULL.
+    // @todo: make these columns nullable since node types are not required to
+    // use them.
+    if (!isset($node->teaser)) {
+      $node->teaser = '';
+    }
+    if (!isset($node->body)) {
+      $node->body = '';
+    }
+  
+    // Save the old revision ID for use by node hook implementations.
+    if (!$node->is_new && !empty($node->revision) && $node->vid) {
       $node->old_vid = $node->vid;
       unset($node->vid);
     }
-    else {
-      // When updating a node, avoid clobbering an existing log entry with an empty one.
-      if (empty($node->log)) {
-        unset($node->log);
-      }
-    }
 
-    // Set some required fields:
+    // Set the timestamp fields.
     if (empty($node->created)) {
       $node->created = REQUEST_TIME;
     }
