diff --git a/modules/filter/filter.module b/modules/filter/filter.module
index 66fadcb..809127a 100644
--- a/modules/filter/filter.module
+++ b/modules/filter/filter.module
@@ -1220,6 +1220,13 @@ function _filter_html_settings($form, &$form_state, $filter, $format, $defaults)
  * HTML filter. Provides filtering of input into accepted HTML.
  */
 function _filter_html($text, $filter) {
+  // Substitute for the <!--break--> tag as filter_xss() removes HTML comments.
+  $teaser_breaker = strpos($text, '<!--break-->');
+  if ($teaser_breaker !== FALSE) {
+    $break_tag_replacement = '[[[break-' . time() . ']]]';
+    $text = str_replace('<!--break-->', $break_tag_replacement, $text);
+  }
+
   $allowed_tags = preg_split('/\s+|<|>/', $filter->settings['allowed_html'], -1, PREG_SPLIT_NO_EMPTY);
   $text = filter_xss($text, $allowed_tags);
 
@@ -1232,6 +1239,10 @@ function _filter_html($text, $filter) {
     $text = filter_dom_serialize($html_dom);
   }
 
+  // Restore substituted <!--break--> tag.
+  if ($teaser_breaker !== FALSE) {
+    $text = str_replace($break_tag_replacement, '<!--break-->', $text);
+  }
   return trim($text);
 }
 
diff --git a/modules/filter/filter.test b/modules/filter/filter.test
index a3d1bde..a9d2993 100644
--- a/modules/filter/filter.test
+++ b/modules/filter/filter.test
@@ -1101,6 +1101,10 @@ class FilterUnitTestCase extends DrupalUnitTestCase {
 
     $f = _filter_html('<code onerror>&nbsp;</code>', $filter);
     $this->assertNoNormalized($f, 'onerror', t('HTML filter should remove empty on* attributes on default.'));
+
+    // HTML filter should allow the <!--break--> tag.
+    $f = _filter_html('teaser <!--break--> body', $filter);
+    $this->assertIdentical($f, 'teaser <!--break--> body', t('HTML filter should not remove the &lt;!--break--&gt; tag.'));
   }
 
   /**
