diff --git a/core/modules/node/node.tokens.inc b/core/modules/node/node.tokens.inc
index 491ec81..655487e 100644
--- a/core/modules/node/node.tokens.inc
+++ b/core/modules/node/node.tokens.inc
@@ -136,10 +136,28 @@ function node_tokens($type, $tokens, array $data = array(), array $options = arr
         case 'body':
         case 'summary':
           if ($items = field_get_items('node', $node, 'body', $language_code)) {
-            $column = ($name == 'body') ? 'value' : 'summary';
             $instance = field_info_instance('node', 'body', $node->type);
             $field_langcode = field_language('node', $node, 'body', $language_code);
-            $replacements[$original] = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], $column) : $items[0][$column];
+            if ($name == 'body') {
+              $replacements[$original] = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'value') : $items[0]['value'];
+              break;
+            }
+            if (!empty($items[0]['summary'])) {
+              $output = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'summary') : $items[0]['summary'];
+            }
+            else {
+              // Try getting trim length from teaser display, otherwise set default value.
+              if (array_key_exists('teaser', $instance['display']) && $instance['display']['teaser']['type'] == 'text_summary_or_trimmed') {
+                $trim_length = $instance['display']['teaser']['settings']['trim_length'];
+              }
+              else {
+                $trim_length = NULL;
+              }
+              $output = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'value') : $items[0]['value'];
+              $output = text_summary($output, $instance['settings']['text_processing'] ? $items[0]['format'] : NULL, $trim_length);
+            }
+
+            $replacements[$original] = $output;
           }
           break;
 
