diff --git a/modules/node.module b/modules/node.module
index c3812f963ab85e0a4c469995fa44f77c77e81e49..7a54a8ee71555145c9ee685272b9d57416b1aa21 100644
--- a/modules/node.module
+++ b/modules/node.module
@@ -1330,8 +1330,11 @@ function node_preview($node) {
     }
     $node->changed = time();
 
-    // Extract a teaser:
-    $node->teaser = node_teaser($node->body);
+    // Extract a teaser, if it hasn't been set (e.g. by a module-provided
+    // 'teaser' form item).
+    if (!isset($node->teaser)) {
+      $node->teaser = node_teaser($node->body);
+    }
 
     // Display a preview of the node:
     if ($node->teaser && $node->teaser != $node->body) {
diff --git a/modules/node/node.module b/modules/node/node.module
index c3812f963ab85e0a4c469995fa44f77c77e81e49..7a54a8ee71555145c9ee685272b9d57416b1aa21 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1330,8 +1330,11 @@ function node_preview($node) {
     }
     $node->changed = time();
 
-    // Extract a teaser:
-    $node->teaser = node_teaser($node->body);
+    // Extract a teaser, if it hasn't been set (e.g. by a module-provided
+    // 'teaser' form item).
+    if (!isset($node->teaser)) {
+      $node->teaser = node_teaser($node->body);
+    }
 
     // Display a preview of the node:
     if ($node->teaser && $node->teaser != $node->body) {