Index: modules/field/field.default.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.default.inc,v
retrieving revision 1.41
diff -u -r1.41 field.default.inc
--- modules/field/field.default.inc	21 Nov 2010 19:09:18 -0000	1.41
+++ modules/field/field.default.inc	30 Dec 2010 02:33:08 -0000
@@ -230,6 +230,14 @@
       }
     }
   }
+  elseif ($view_mode == 'teaser' && !empty($items)) {
+    // Set the readmode flag if field is not empty and hidden in teaser but shown in full mode.
+    // Field specific readmore flagging must be done in proper hook_field_formatter_view().
+    $display_full = field_get_display($instance, 'full', $entity);
+    if ($display_full['type'] !== 'hidden') {
+      $entity->readmore = true;
+    }
+  }
 
   return $addition;
 }
Index: modules/field/modules/text/text.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v
retrieving revision 1.68
diff -u -r1.68 text.module
--- modules/field/modules/text/text.module	13 Nov 2010 07:39:35 -0000	1.68
+++ modules/field/modules/text/text.module	30 Dec 2010 02:33:09 -0000
@@ -264,7 +264,12 @@
       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']);
+          $output_trimmed = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
+          // Check if trimmed version is different to flag readmore property.
+          if ($output_trimmed!=$output) {
+            $entity->readmore = true;
+          }
+          $output = $output_trimmed;
         }
         $element[$delta] = array('#markup' => $output);
       }
@@ -274,10 +279,17 @@
       foreach ($items as $delta => $item) {
         if (!empty($item['summary'])) {
           $output = _text_sanitize($instance, $langcode, $item, 'summary');
+          // Summary is different than rest of text field by default so flag readmore property.
+          $entity->readmore = true;
         }
         else {
           $output = _text_sanitize($instance, $langcode, $item, 'value');
-          $output = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
+          $output_trimmed = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
+          // Check if trimmed version is different to flag readmore property.
+          if ($output_trimmed!=$output) {
+            $entity->readmore = true;
+          }
+          $output = $output_trimmed;
         }
         $element[$delta] = array('#markup' => $output);
       }
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1333
diff -u -r1.1333 node.module
--- modules/node/node.module	15 Dec 2010 03:47:28 -0000	1.1333
+++ modules/node/node.module	30 Dec 2010 02:33:10 -0000
@@ -1345,6 +1345,7 @@
 
   // Remove previously built content, if exists.
   $node->content = array();
+  $node->readmore = false;
 
   // The 'view' hook can be implemented to overwrite the default function
   // to display nodes.
@@ -1368,7 +1369,7 @@
     '#pre_render' => array('drupal_pre_render_links'),
     '#attributes' => array('class' => array('links', 'inline')),
   );
-  if ($view_mode == 'teaser') {
+  if ($view_mode == 'teaser' && $node->readmore) {
     $node_title_stripped = strip_tags($node->title);
     $links['node-readmore'] = array(
       'title' => t('Read more<span class="element-invisible"> about @title</span>', array('@title' => $node_title_stripped)),
