diff --git modules/field/modules/text/text.module modules/field/modules/text/text.module
index 08f0622..734f488 100644
--- modules/field/modules/text/text.module
+++ modules/field/modules/text/text.module
@@ -159,6 +159,7 @@ function text_field_load($entity_type, $entities, $field, $instances, $langcode,
       if (empty($instances[$id]['settings']['text_processing']) || filter_format_allowcache($item['format'])) {
         $items[$id][$delta]['safe_value'] = isset($item['value']) ? _text_sanitize($instances[$id], $langcode, $item, 'value') : '';
         if ($field['type'] == 'text_with_summary') {
+          $items[$id][$delta]['safe_value_for_trimming'] = _text_sanitize($instances[$id], $langcode, $item, 'value_for_trimming');
           $items[$id][$delta]['safe_summary'] = isset($item['summary']) ? _text_sanitize($instances[$id], $langcode, $item, 'summary') : '';
         }
       }
@@ -260,12 +261,16 @@ function text_field_formatter_view($entity_type, $entity, $field, $instance, $la
 
   switch ($display['type']) {
     case 'text_default':
-    case 'text_trimmed':
       foreach ($items as $delta => $item) {
         $output = _text_sanitize($instance, $langcode, $item, 'value');
-        if ($display['type'] == 'text_trimmed') {
-          $output = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
-        }
+        $element[$delta] = array('#markup' => $output);
+      }
+      break;
+
+    case 'text_trimmed':
+      foreach ($items as $delta => $item) {
+        $output = _text_sanitize($instance, $langcode, $item, 'value_for_trimming');
+        $output = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
         $element[$delta] = array('#markup' => $output);
       }
       break;
@@ -276,7 +281,7 @@ function text_field_formatter_view($entity_type, $entity, $field, $instance, $la
           $output = _text_sanitize($instance, $langcode, $item, 'summary');
         }
         else {
-          $output = _text_sanitize($instance, $langcode, $item, 'value');
+          $output = _text_sanitize($instance, $langcode, $item, 'value_for_trimming');
           $output = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
         }
         $element[$delta] = array('#markup' => $output);
@@ -299,6 +304,10 @@ function text_field_formatter_view($entity_type, $entity, $field, $instance, $la
  * Depending on whether the field instance uses text processing, data is run
  * through check_plain() or check_markup().
  *
+ * The column 'value_for_trimming' is a pseudo column which saves the
+ * <!--break--> tag of the column 'value' which might be lost through
+ * filters of check_markup() or encoded by check_plain().
+ *
  * @param $instance
  *   The instance definition.
  * @param $langcode
@@ -306,7 +315,8 @@ function text_field_formatter_view($entity_type, $entity, $field, $instance, $la
  * @param $item
  *   The field value to sanitize.
  * @param $column
- *   The column to sanitize (either 'value' or 'summary').
+ *   The column to sanitize (either 'value', 'value_for_trimming' or 'summary').
+
  *
  * @return
  *  The sanitized string.
@@ -317,7 +327,32 @@ 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]);
+
+  // Save <!--break--> for teaser processing in text_summary().
+  if ($column == 'value_for_trimming') {
+    if (($breaker_pos = strpos($item['value'], '<!--break-->')) !== FALSE) {
+      // Split field in teaser and body. '<!--break-->' length is 12.
+      $teaser = substr($item['value'], 0, $breaker_pos);
+      $body = substr($item['value'], $breaker_pos + 12);
+
+      // Process teaser and body separately; and reconcatenate afterwards.
+      $output = $instance['settings']['text_processing'] ?
+        check_markup($teaser, $item['format'], $langcode) : check_plain($teaser);
+      $output .= '<!--break-->';
+      $output .= $instance['settings']['text_processing'] ?
+        check_markup($body, $item['format'], $langcode) : check_plain($body);
+    }
+    else {
+      $output = $instance['settings']['text_processing'] ?
+        check_markup($item['value'], $item['format'], $langcode) : check_plain($item['value']);
+    }
+  }
+  else {
+    $output = $instance['settings']['text_processing'] ?
+      check_markup($item[$column], $item['format'], $langcode) : check_plain($item[$column]);
+  }
+
+  return $output;
 }
 
 /**
diff --git modules/field/modules/text/text.test modules/field/modules/text/text.test
index ee71414..c60d367 100644
--- modules/field/modules/text/text.test
+++ modules/field/modules/text/text.test
@@ -510,4 +510,185 @@ 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)));
   }
+
+}
+
+/**
+ * Tests 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 for a node and the
+   * front page.
+   */
+  function testTeaserBreakTag() {
+    $langcode = LANGUAGE_NONE;
+    // Text field display formats that could be trimmed with the break tag.
+    $display_formats = array('text_summary_or_trimmed', 'text_trimmed');
+    foreach($display_formats as $display_format) {
+      foreach(filter_formats() as $filter_object) {
+        $filter = $filter_object->format;
+        $teaser = 'teaser_' . $this->randomName(32);
+        $body = 'body_' . $this->randomName(32);
+        $title = 'title_' . $this->randomName(8);
+
+        // Create node.
+        $edit = array();
+        $edit['title'] = $title;
+        $edit["body[$langcode][0][value]"] = "$teaser <!--break--> $body";
+        $edit["body[$langcode][0][format]"] = $filter;
+        $edit['promote'] = 1;
+        $this->drupalPost('node/add/article', $edit, t('Save'));
+        $node = $this->drupalGetNodeByTitle($edit['title']);
+
+        // Set display format for teasers.
+        $edit2 = array('fields[body][type]' => $display_format);
+        $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit2, t('Save'));
+
+        // Test front page.
+        $this->drupalGet('node');
+        $this->assertText($node->title, t("Node title appears on the front page"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+        $this->assertText($teaser, t("The teaser text appears on the front page"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+        $this->assertNoText('<!--break-->', t("The break tag does not appear on the front page"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+        $this->assertNoRaw('<!--break-->', t("The break tag does not appear on the front page"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+        $this->assertNoText($body, t("The body text does not appear on the front page"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+
+        // Test full node view.
+        $this->drupalGet('node/' . $node->nid);
+        $this->assertText($node->title, t("Node title appears in full node view"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+        $this->assertText($teaser, t("The teaser text appears in full node view"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+        if ($filter == 'plain_text') {
+          $this->assertRaw('&lt;!--break--&gt;', t("The break tag appears encoded"
+          . " in full node view for teaser display format '$display_format'"
+          . " and filter  '$filter'."));
+        }
+        else if ($filter == 'filtered_html') {
+          $this->assertNoText('<!--break-->', t("The break tag does not appear"
+          . " in full node view for teaser display format '$display_format'"
+          . " and filter  '$filter'."));
+          $this->assertNoRaw('<!--break-->', t("The break tag does not appear"
+          . " as comment in full node view for teaser display format '$display_format'"
+          . " and filter  '$filter'."));
+        }
+        else {
+          $this->assertNoText('<!--break-->', t("The break tag does not appear"
+          . " in full node view for teaser display format '$display_format'"
+          . " and filter  '$filter'."));
+          $this->assertRaw('<!--break-->', t("The break appears as comment"
+          . " in full node view for teaser display format '$display_format'"
+          . " and filter  '$filter'."));
+        }
+        $this->assertText($body, t("The body appears in full node view"
+          . " for teaser display format '$display_format' and filter  '$filter'."));
+      }
+    }
+  }
+
+  /**
+   * Test the break tag survial in _text_sanitize.
+   */
+  function testSanitizeBreakTag() {
+    $langcode = LANGUAGE_NONE;
+    $item = array(
+      'value' => 'Teaser<!--break-->Body',
+      'format' => 'filtered_html',
+    );
+
+    // Use the pseudo column 'value_for_trimming' for sanitizing.
+    $instance['settings']['text_processing'] = FALSE;
+    $result = _text_sanitize($instance, $langcode, $item, 'value_for_trimming');
+    $expected = 'Teaser<!--break-->Body';
+    $success = $this->assertEqual($result, $expected, 'Break tag survives HTML escaping.');
+    if (!$success) {
+      $this->verbose("\nResult:\n'" . $result . "'\n<hr />\nExpected:\n'"
+        . $expected . "'");
+    }
+
+    $instance['settings']['text_processing'] = TRUE;
+    $expected = "<p>Teaser</p>\n<!--break--><p>Body</p>\n";
+    $result = _text_sanitize($instance, $langcode, $item, 'value_for_trimming');
+    $success = $this->assertEqual($result, $expected, 'Break tag survives filters.');
+    if (!$success) {
+      $this->verbose("\nResult:\n'" . $result . "'\n<hr />\nExpected:\n'"
+        . $expected . "'");
+    }
+
+
+    // Repeat the tests without a break tag, i.e. a simple text.
+    $item['value'] = 'No teaser';
+
+    $instance['settings']['text_processing'] = FALSE;
+    $result = _text_sanitize($instance, $langcode, $item, 'value_for_trimming');
+    $expected = 'No teaser';
+    $success = $this->assertEqual($result, $expected, 'A simple text without filters is unchanged.');
+    if (!$success) {
+      $this->verbose("\nResult:\n'" . $result . "'\n<hr />\nExpected:\n'"
+        . $expected . "'");
+    }
+
+    $instance['settings']['text_processing'] = TRUE;
+    $expected = "<p>No teaser</p>\n";
+    $result = _text_sanitize($instance, $langcode, $item, 'value_for_trimming');
+    $success = $this->assertEqual($result, $expected, 'A normal text is normally filtered.');
+    if (!$success) {
+      $this->verbose("\nResult:\n'" . $result . "'\n<hr />\nExpected:\n'"
+        . $expected . "'");
+    }
+
+
+    // Test with normal 'value' column, i.e. no saving of break tag.
+    $item['value'] = 'Teaser<!--break-->Body';
+
+    $instance['settings']['text_processing'] = FALSE;
+    $result = _text_sanitize($instance, $langcode, $item, 'value');
+    $expected = 'Teaser&lt;!--break--&gt;Body';
+    $success = $this->assertEqual($result, $expected, 'No saving of break tag, thus break tag is encoded as HTML comment.');
+    if (!$success) {
+      $this->verbose("\nResult:\n'" . $result . "'\n<hr />\nExpected:\n'"
+        . $expected . "'");
+    }
+
+    $instance['settings']['text_processing'] = TRUE;
+    $result = _text_sanitize($instance, $langcode, $item, 'value');
+    $expected = "<p>TeaserBody</p>\n";
+    $success = $this->assertEqual($result, $expected, 'No saving of break tag, thus break tag is filtered out.');
+    if (!$success) {
+      $this->verbose("\nResult:\n'" . $result . "'\n<hr />\nExpected:\n'"
+        . $expected . "'");
+    }
+  }
+
 }
