diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index ab25224..148123e 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -1231,6 +1231,14 @@ 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) {
+    // Md5 hash to make an unique substitute.
+    $break_tag_replacement = '[[[break-' . md5($text) . ']]]';
+    $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 +1251,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.'));
   }
 
   /**
diff --git a/core/modules/node/node.test b/core/modules/node/node.test
index 2e9b075..23a94c8 100644
--- a/core/modules/node/node.test
+++ b/core/modules/node/node.test
@@ -624,6 +624,42 @@ class SummaryLengthTestCase extends DrupalWebTestCase {
   }
 }
 
+class SummaryBreak extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Summary break',
+      'description' => 'Test summary break separator.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Creates a node with break delimitator to test the teaser break functionality.
+   */
+  function testSummaryBreak() {
+    // Create a node to view.
+    $settings = array(
+      'body' => array(LANGUAGE_NONE => array(array('value' => 'Lorem ipsum dolor sit amet<!--break-->consectetur adipiscing elit.'))),
+      'promote' => 1,
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Create user with permission to view the node.
+    $web_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($web_user);
+
+    // Attempt to access the front page to see the summary.
+    $this->drupalGet('node');
+    $this->assertRaw('Lorem ipsum dolor sit amet', 'The node sumamry is found.', 'Node');
+    $this->assertNoRaw('consectetur adipiscing elit.', 'The full node part is not found.', 'Node');
+
+    // Attempt to access the full node page.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw('Lorem ipsum dolor sit amet', 'The node sumamry is found.', 'Node');
+    $this->assertRaw('consectetur adipiscing elit.', 'The full node part is found.', 'Node');
+  }
+}
+
 class NodeTitleXSSTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
