diff --git a/modules/blog.module b/modules/blog.module
index 1d1e7acbd6c31969d5e0c35ac867ccda8b663b65..06747b516c2e82241478116eaf0eaabb26eaa2e0 100644
--- a/modules/blog.module
+++ b/modules/blog.module
@@ -79,10 +79,10 @@ function blog_save($op, $node) {
       ** pages, they will not be changed unless explicitly specified.
       */
 
-      return array();
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
     }
     else {
-      return array("promote" => 0, "moderate" => 1, "status" => 1);
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "promote" => 0, "moderate" => 1, "status" => 1);
     }
   }
 
@@ -97,7 +97,7 @@ function blog_save($op, $node) {
       ** pages, they will not be changed unless explicitly specified.
       */
 
-      return array();
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
     }
     else {
       /*
@@ -105,7 +105,7 @@ function blog_save($op, $node) {
       ** and will queue it in the moderation queue for promotion.
       */
 
-      return array("promote" => 0, "moderate" => 1, "score" => 0, "votes" => 0, "users" => 0);
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "promote" => 0, "moderate" => 1, "score" => 0, "votes" => 0, "users" => 0);
     }
   }
 
diff --git a/modules/blog/blog.module b/modules/blog/blog.module
index 1d1e7acbd6c31969d5e0c35ac867ccda8b663b65..06747b516c2e82241478116eaf0eaabb26eaa2e0 100644
--- a/modules/blog/blog.module
+++ b/modules/blog/blog.module
@@ -79,10 +79,10 @@ function blog_save($op, $node) {
       ** pages, they will not be changed unless explicitly specified.
       */
 
-      return array();
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
     }
     else {
-      return array("promote" => 0, "moderate" => 1, "status" => 1);
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "promote" => 0, "moderate" => 1, "status" => 1);
     }
   }
 
@@ -97,7 +97,7 @@ function blog_save($op, $node) {
       ** pages, they will not be changed unless explicitly specified.
       */
 
-      return array();
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
     }
     else {
       /*
@@ -105,7 +105,7 @@ function blog_save($op, $node) {
       ** and will queue it in the moderation queue for promotion.
       */
 
-      return array("promote" => 0, "moderate" => 1, "score" => 0, "votes" => 0, "users" => 0);
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "promote" => 0, "moderate" => 1, "score" => 0, "votes" => 0, "users" => 0);
     }
   }
 
diff --git a/modules/book.module b/modules/book.module
index b295631a2fbe4676a144fb544499dfca5ba73284..9422c49dfe4b213510c0bf86c8de55a50e3d0d92 100644
--- a/modules/book.module
+++ b/modules/book.module
@@ -66,10 +66,10 @@ function book_save($op, $node) {
 
   if ($op == "create") {
     if (user_access("administer nodes")) {
-      return array("teaser" => $node->body, "format", "parent", "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "format", "parent", "weight", "log");
     }
     else {
-      return array("teaser" => $node->body, "format", "moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "format", "moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight", "log");
     }
   }
 
@@ -84,7 +84,7 @@ function book_save($op, $node) {
       ** new revision unless we are explicitly instructed to.
       */
 
-      return array("teaser" => $node->body, "format", "parent", "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "format", "parent", "weight", "log");
     }
     else {
       /*
@@ -93,7 +93,7 @@ function book_save($op, $node) {
       ** and are not promoted by default.  See also: book_load().
       */
 
-      return array("teaser" => $node->body, "created" => time(), "format", "moderate" => 1, "parent", "promote" => 0, "score" => 0, "status" => 1, "users" => "", "revisions", "votes" => 0, "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "created" => time(), "format", "moderate" => 1, "parent", "promote" => 0, "score" => 0, "status" => 1, "users" => "", "revisions", "votes" => 0, "weight", "log");
     }
   }
 
diff --git a/modules/book/book.module b/modules/book/book.module
index b295631a2fbe4676a144fb544499dfca5ba73284..9422c49dfe4b213510c0bf86c8de55a50e3d0d92 100644
--- a/modules/book/book.module
+++ b/modules/book/book.module
@@ -66,10 +66,10 @@ function book_save($op, $node) {
 
   if ($op == "create") {
     if (user_access("administer nodes")) {
-      return array("teaser" => $node->body, "format", "parent", "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "format", "parent", "weight", "log");
     }
     else {
-      return array("teaser" => $node->body, "format", "moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "format", "moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight", "log");
     }
   }
 
@@ -84,7 +84,7 @@ function book_save($op, $node) {
       ** new revision unless we are explicitly instructed to.
       */
 
-      return array("teaser" => $node->body, "format", "parent", "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "format", "parent", "weight", "log");
     }
     else {
       /*
@@ -93,7 +93,7 @@ function book_save($op, $node) {
       ** and are not promoted by default.  See also: book_load().
       */
 
-      return array("teaser" => $node->body, "created" => time(), "format", "moderate" => 1, "parent", "promote" => 0, "score" => 0, "status" => 1, "users" => "", "revisions", "votes" => 0, "weight", "log");
+      return array("body" => filter($node->body), "teaser" => filter($node->body), "created" => time(), "format", "moderate" => 1, "parent", "promote" => 0, "score" => 0, "status" => 1, "users" => "", "revisions", "votes" => 0, "weight", "log");
     }
   }
 
diff --git a/modules/forum.module b/modules/forum.module
index 6df7b4eb9a836d742d5ecf7e8223e13e7144450c..35b521f7a9c2196a66ba79ab02e19b71cfe86000 100644
--- a/modules/forum.module
+++ b/modules/forum.module
@@ -74,7 +74,7 @@ function forum_save($op, $node) {
   }
 
   if ($op == "create") {
-    return array("body" => filter($node->body), "moderate" => 0, "status" => 1, "tid", "icon_num", "shadow" => 0);
+    return array("body" => filter($node->body), "teaser" => filter($node->teaser), "moderate" => 0, "status" => 1, "tid", "icon_num", "shadow" => 0);
   }
 
   if ($op == "decline") {
@@ -82,7 +82,7 @@ function forum_save($op, $node) {
   }
 
   if ($op == "update") {
-    return array("body" => filter($node->body), "tid", "icon_num", "shadow");
+    return array("body" => filter($node->body), "teaser" => filter($node->teaser), "tid", "icon_num", "shadow");
   }
 }
 
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 6df7b4eb9a836d742d5ecf7e8223e13e7144450c..35b521f7a9c2196a66ba79ab02e19b71cfe86000 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -74,7 +74,7 @@ function forum_save($op, $node) {
   }
 
   if ($op == "create") {
-    return array("body" => filter($node->body), "moderate" => 0, "status" => 1, "tid", "icon_num", "shadow" => 0);
+    return array("body" => filter($node->body), "teaser" => filter($node->teaser), "moderate" => 0, "status" => 1, "tid", "icon_num", "shadow" => 0);
   }
 
   if ($op == "decline") {
@@ -82,7 +82,7 @@ function forum_save($op, $node) {
   }
 
   if ($op == "update") {
-    return array("body" => filter($node->body), "tid", "icon_num", "shadow");
+    return array("body" => filter($node->body), "teaser" => filter($node->teaser), "tid", "icon_num", "shadow");
   }
 }
 
diff --git a/modules/node.module b/modules/node.module
index 60d7241263ae66d42cf6e8c9fd84434d3ad1fd0d..843eb1597ca2dd6b8d63682bb9b6b078dce27fae 100644
--- a/modules/node.module
+++ b/modules/node.module
@@ -1032,9 +1032,6 @@ function node_preview($node, $error = NULL) {
     ** Display a prenode of the node:
     */
 
-    $view->body = filter($view->body);
-    $view->teaser = filter($view->teaser);
-
     if ($view->teaser && $view->teaser != $view->body) {
       print "<h3>". t("Preview trimmed version") ."</h3>";
       node_view($view, 1);
@@ -1077,8 +1074,6 @@ function node_submit($node) {
   ** Prepare the node's body:
   */
 
-  $node->body = filter($node->body);
-
   if ($node->nid) {
 
     /*
diff --git a/modules/node/node.module b/modules/node/node.module
index 60d7241263ae66d42cf6e8c9fd84434d3ad1fd0d..843eb1597ca2dd6b8d63682bb9b6b078dce27fae 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1032,9 +1032,6 @@ function node_preview($node, $error = NULL) {
     ** Display a prenode of the node:
     */
 
-    $view->body = filter($view->body);
-    $view->teaser = filter($view->teaser);
-
     if ($view->teaser && $view->teaser != $view->body) {
       print "<h3>". t("Preview trimmed version") ."</h3>";
       node_view($view, 1);
@@ -1077,8 +1074,6 @@ function node_submit($node) {
   ** Prepare the node's body:
   */
 
-  $node->body = filter($node->body);
-
   if ($node->nid) {
 
     /*
diff --git a/modules/page.module b/modules/page.module
index 1737e601056c6ae8d67494315660667e62eee7d5..def7cf3178e77de599cd93c0264aa527ad0358dc 100644
--- a/modules/page.module
+++ b/modules/page.module
@@ -49,7 +49,12 @@ function page_save($op, $node) {
   }
 
   if ($op == "create") {
-    return array("teaser" => $node->body, "format", "link", "description");
+    if ($node->format) {  // do not filter PHP code, do not auto-extract a teaser
+      return array("teaser" => $node->body, "format", "link", "description");
+    }
+    else {
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "format", "link", "description");
+    }
   }
 
   if ($op == "decline") {
@@ -57,7 +62,12 @@ function page_save($op, $node) {
   }
 
   if ($op == "update") {
-    return array("teaser" => $node->body, "format", "link", "description");
+    if ($node->format) {  // do not filter PHP code, do not auto-extract a teaser
+      return array("teaser" => $node->body, "format", "link", "description");
+    }
+    else {
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "format", "link", "description");
+    }
   }
 }
 
diff --git a/modules/page/page.module b/modules/page/page.module
index 1737e601056c6ae8d67494315660667e62eee7d5..def7cf3178e77de599cd93c0264aa527ad0358dc 100644
--- a/modules/page/page.module
+++ b/modules/page/page.module
@@ -49,7 +49,12 @@ function page_save($op, $node) {
   }
 
   if ($op == "create") {
-    return array("teaser" => $node->body, "format", "link", "description");
+    if ($node->format) {  // do not filter PHP code, do not auto-extract a teaser
+      return array("teaser" => $node->body, "format", "link", "description");
+    }
+    else {
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "format", "link", "description");
+    }
   }
 
   if ($op == "decline") {
@@ -57,7 +62,12 @@ function page_save($op, $node) {
   }
 
   if ($op == "update") {
-    return array("teaser" => $node->body, "format", "link", "description");
+    if ($node->format) {  // do not filter PHP code, do not auto-extract a teaser
+      return array("teaser" => $node->body, "format", "link", "description");
+    }
+    else {
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser), "format", "link", "description");
+    }
   }
 }
 
diff --git a/modules/poll.module b/modules/poll.module
index b4298f0993cfddc89a1fac1d84cd928461ac5d92..aa2939acbeb547dfd7f41403e6c492002cb7205e 100644
--- a/modules/poll.module
+++ b/modules/poll.module
@@ -417,4 +417,4 @@ function poll_update($node) {
   }
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/modules/poll/poll.module b/modules/poll/poll.module
index b4298f0993cfddc89a1fac1d84cd928461ac5d92..aa2939acbeb547dfd7f41403e6c492002cb7205e 100644
--- a/modules/poll/poll.module
+++ b/modules/poll/poll.module
@@ -417,4 +417,4 @@ function poll_update($node) {
   }
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/modules/story.module b/modules/story.module
index 48095da5e11161f6e94912459170b3187c51678b..afbeb710919b51bbf6019955d971e52b8638e5e5 100644
--- a/modules/story.module
+++ b/modules/story.module
@@ -48,7 +48,7 @@ function story_save($op, $node) {
 
   if ($op == "create") {
     if (user_access("administer nodes")) {
-      return array();
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
     }
     else {
       return array("moderate" => 1);
@@ -60,7 +60,7 @@ function story_save($op, $node) {
   }
 
   if ($op == "update") {
-    return array();
+    return array("body" => filter($node->body), "teaser" => filter($node->teaser));
   }
 }
 
diff --git a/modules/story/story.module b/modules/story/story.module
index 48095da5e11161f6e94912459170b3187c51678b..afbeb710919b51bbf6019955d971e52b8638e5e5 100644
--- a/modules/story/story.module
+++ b/modules/story/story.module
@@ -48,7 +48,7 @@ function story_save($op, $node) {
 
   if ($op == "create") {
     if (user_access("administer nodes")) {
-      return array();
+      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
     }
     else {
       return array("moderate" => 1);
@@ -60,7 +60,7 @@ function story_save($op, $node) {
   }
 
   if ($op == "update") {
-    return array();
+    return array("body" => filter($node->body), "teaser" => filter($node->teaser));
   }
 }