diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index e857224..af1821b 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -1231,6 +1231,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);
 
@@ -1243,6 +1250,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/core/modules/filter/filter.test b/core/modules/filter/filter.test
index 2bafd47..5f71b88 100644
--- a/core/modules/filter/filter.test
+++ b/core/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.'));
   }
 
   /**
