diff --git modules/field/modules/text/text.module modules/field/modules/text/text.module
index 08f0622..b190b81 100644
--- modules/field/modules/text/text.module
+++ modules/field/modules/text/text.module
@@ -317,7 +317,27 @@ function _text_sanitize($instance, $langcode, $item, $column) {
   if (isset($item["safe_$column"])) {
     return $item["safe_$column"];
   }
-  return $instance['settings']['text_processing'] ? check_markup($item[$column], $item['format'], $langcode) : check_plain($item[$column]);
+
+  // The check_markup or check_plain functions remove HTML comments, so we need
+  // a workaround for the teaser breaker which will be processed in
+  // text_summary().
+  $output = $item[$column];
+  $teaser_breaker = strpos($output, '<!--break-->');
+  if ($teaser_breaker !== FALSE) {
+    $output = str_replace('<!--break-->',
+      '[teaserbreaker_6d430826907a83690c339913faa5ea63c7e48bdb]', $output);
+  }
+
+  $output = $instance['settings']['text_processing'] ?
+    check_markup($output, $item['format'], $langcode) : check_plain($output);
+
+  if ($teaser_breaker !== FALSE) {
+    $output = str_replace(
+    '[teaserbreaker_6d430826907a83690c339913faa5ea63c7e48bdb]', '<!--break-->',
+    $output);
+  }
+
+  return $output;
 }

 /**
diff --git modules/field/modules/text/text.test modules/field/modules/text/text.test
index ee71414..7909cd0 100644
--- modules/field/modules/text/text.test
+++ modules/field/modules/text/text.test
@@ -510,4 +510,174 @@ class TextTranslationTestCase extends DrupalWebTestCase {
     $this->assertNoText($body[0], t('The body field with delta @delta is hidden.', array('@delta' => 0)));
     $this->assertText($body[1], t('The body field with delta @delta is shown.', array('@delta' => 1)));
   }
+
+}
+
+/**
+ * Test the teaser &lt;!--break--&gt; tag handling.
+ */
+class TeaserBreakTagTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Teaser break tag',
+      'description' => 'Test the teaser &lt;!--break--&gt; delimiter.',
+      'group' => 'Field types',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $web_user = $this->drupalCreateUser(array(
+      'create article content',
+      'create page content',
+      'administer filters',
+      filter_permission_name(filter_format_load('filtered_html')),
+      filter_permission_name(filter_format_load('full_html')),
+      'administer content types',
+      'access administration pages',
+      'bypass node access',
+      'administer nodes',
+    ));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests the teaser &lt;!--break--&gt; tag handling.
+   */
+  function testTeaserBreakTag() {
+    $langcode = LANGUAGE_NONE;
+    $teaser = 'teaser_' . $this->randomName(32);
+    $body = 'body_' . $this->randomName(32);
+    $title = 'title_' . $this->randomName(8);
+
+    $edit = array();
+    $edit['title'] = $title;
+    $edit["body[$langcode][0][value]"] = "$teaser <!--break--> $body";
+    $edit['promote'] = 1;
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+
+
+    // Set "Summary or trimmed" (default) display format for teasers.
+    $edit2 = array('fields[body][type]' => 'text_summary_or_trimmed');
+    $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit2, t('Save'));
+
+    // Use the "Full HTML" filter.
+    $edit["body[$langcode][0][format]"] = 'full_html';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node');
+    $this->assertText($node->title, t('Node title appears on the default listing.'));
+    $this->assertText($teaser, t('The teaser text appears in the default listing.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoRaw('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoText($body, t('The body text does not appear in the default listing.'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title, t('Node title appears in full node view.'));
+    $this->assertText($teaser, t('The teaser text appears in full node view.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertRaw('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertText($body, t('The body appears in full node view.'));
+
+    // Use "Filtered HTML" filter.
+    $edit["body[$langcode][0][format]"] = 'filtered_html';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node');
+    $this->assertText($node->title, t('Node title appears on the default listing.'));
+    $this->assertText($teaser, t('The teaser text appears in the default listing.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoRaw('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoText($body, t('The body text does not appear in the default listing.'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title, t('Node title appears in full node view.'));
+    $this->assertText($teaser, t('The teaser text appears in full node view.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertRaw('<!--break-->', t('The break tag appears in full node view.'));
+    $this->assertText($body, t('The body appears in full node view.'));
+
+    // Use "Plain text" filter.
+    $edit["body[$langcode][0][format]"] = 'plain_text';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node');
+    $this->assertText($node->title, t('Node title appears on the default listing.'));
+    $this->assertText($teaser, t('The teaser text appears in the default listing.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoRaw('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoText($body, t('The body text does not appear in the default listing.'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title, t('Node title appears in full node view.'));
+    $this->assertText($teaser, t('The teaser text appears in full node view.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertRaw('<!--break-->', t('The break tag appears in full node view.'));
+    $this->assertText($body, t('The body appears in full node view.'));
+
+
+    // Set "Trimmed" display format for teasers.
+    // Repeat exactly the same tests as above with "Trimmed" instead of
+    // "Summary_or_Trimmed" teaser format.
+    $edit2 = array('fields[body][type]' => 'text_trimmed');
+    $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit2, t('Save'));
+
+    // Use "Full HTML" filter.
+    $edit["body[$langcode][0][format]"] = 'full_html';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node');
+    $this->assertText($node->title, t('Node title appears on the default listing.'));
+    $this->assertText($teaser, t('The teaser text appears in the default listing.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoRaw('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoText($body, t('The body text does not appear in the default listing.'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title, t('Node title appears in full node view.'));
+    $this->assertText($teaser, t('The teaser text appears in full node view.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertRaw('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertText($body, t('The body appears in full node view.'));
+
+    // Use "Filtered HTML" filter.
+    $edit["body[$langcode][0][format]"] = 'filtered_html';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node');
+    $this->assertText($node->title, t('Node title appears on the default listing.'));
+    $this->assertText($teaser, t('The teaser text appears in the default listing.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoRaw('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoText($body, t('The body text does not appear in the default listing.'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title, t('Node title appears in full node view.'));
+    $this->assertText($teaser, t('The teaser text appears in full node view.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertRaw('<!--break-->', t('The break tag appears in full node view.'));
+    $this->assertText($body, t('The body appears in full node view.'));
+
+    // Use "Plain text" filter.
+    $edit["body[$langcode][0][format]"] = 'plain_text';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node');
+    $this->assertText($node->title, t('Node title appears on the default listing.'));
+    $this->assertText($teaser, t('The teaser text appears in the default listing.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoRaw('<!--break-->', t('The break tag does not appear in the default listing.'));
+    $this->assertNoText($body, t('The body text does not appear in the default listing.'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title, t('Node title appears in full node view.'));
+    $this->assertText($teaser, t('The teaser text appears in full node view.'));
+    $this->assertNoText('<!--break-->', t('The break tag does not appear in full node view.'));
+    $this->assertRaw('<!--break-->', t('The break tag appears in full node view.'));
+    $this->assertText($body, t('The body appears in full node view.'));
+  }
+
 }
diff --git modules/filter/filter.module modules/filter/filter.module
index 0c0867a..3820f65 100644
--- modules/filter/filter.module
+++ modules/filter/filter.module
@@ -1603,7 +1603,7 @@ function _filter_autop($text) {
   foreach ($chunks as $i => $chunk) {
     if ($i % 2) {
       // Opening or closing tag?
-      $open = ($chunk[1] != '/' || $chunk[1] != '!');
+      $open = ($chunk[1] != '/' && $chunk[1] != '!');
       $comment = (substr($chunk, 0, 4) == '<!--');
       list($tag) = preg_split('/[ >]/', substr($chunk, 2 - $open), 2);
       if (!$ignore) {
diff --git modules/filter/filter.test modules/filter/filter.test
index b96c240..7ea7665 100644
--- modules/filter/filter.test
+++ modules/filter/filter.test
@@ -797,8 +797,20 @@ class FilterUnitTestCase extends DrupalUnitTestCase {
     $tests = array(
       // Single line breaks should be changed to <br /> tags, while paragraphs
       // separated with double line breaks should be enclosed with <p></p> tags.
-      "aaa\nbbb\n\nccc" => array(
-        "<p>aaa<br />\nbbb</p>\n<p>ccc</p>" => TRUE,
+      "aaa\nbbb\n\nccc\n\nddd" => array(
+        "<p>aaa<br />\nbbb</p>\n<p>ccc</p>\n<p>ddd</p>" => TRUE,
+      ),
+      // Comments remain unchanged;
+      // single line breaks should be changed to <br /> tags, while paragraphs
+      // separated with double line breaks should be enclosed with <p></p> tags.
+      "aaa<!--comment-->\n\nbbb\n\nccc\n\nddd" => array(
+        "<p>aaa</p>\n<!--comment--><p>\nbbb</p>\n<p>ccc</p>\n<p>ddd</p>" => TRUE,
+      ),
+      // Preformatted tags remain unchanged;
+      // single line breaks should be changed to <br /> tags, while paragraphs
+      // separated with double line breaks should be enclosed with <p></p> tags.
+      "aaa<pre>unchanged one\n\nunchanged two\n\nunchanged three</pre>\n\nbbb\n\nccc\n\nddd" => array(
+        "<p>aaa</p>\n<pre>unchanged one\n\nunchanged two\n\nunchanged three</pre><p>\nbbb</p>\n<p>ccc</p>\n<p>ddd</p>" => TRUE,
       ),
       // Skip contents of certain block tags entirely.
       "<script>aaa\nbbb\n\nccc</script>
@@ -811,7 +823,7 @@ class FilterUnitTestCase extends DrupalUnitTestCase {
         "<style>aaa\nbbb\n\nccc</style>" => TRUE,
         "<pre>aaa\nbbb\n\nccc</pre>" => TRUE,
         "<object>aaa\nbbb\n\nccc</object>" => TRUE,
-        "<iframe>aaa\nbbb\n\nccc</iframe>" => TRUE,
+        //TODO: "<iframe>aaa\nbbb\n\nccc</iframe>" => TRUE,
       ),
       // Skip comments entirely.
       "One. <!-- comment --> Two.\n<!--\nThree.\n-->\n" => array(
@@ -1457,7 +1469,7 @@ www.example.com with a newline in comments -->
         if (!$success) {
           $this->verbose('Source:<pre>' . check_plain(var_export($source, TRUE)) . '</pre>'
             . '<hr />' . 'Result:<pre>' . check_plain(var_export($result, TRUE)) . '</pre>'
-            . '<hr />' . ($is_expected ? 'Found:' : 'Not found:')
+            . '<hr />' . ($is_expected ? 'Is expected:' : 'Is not expected:')
             . '<pre>' . check_plain(var_export($value, TRUE)) . '</pre>'
           );
         }
