diff --git a/token/token.tokens.inc b/token/token.tokens.inc
index bb1e70bb5..199fa5be5 100644
--- a/token/token.tokens.inc
+++ b/token/token.tokens.inc
@@ -24,6 +24,7 @@
 use Drupal\node\Entity\NodeType;
 use Drupal\node\NodeInterface;
 use Drupal\system\Entity\Menu;
+use Drupal\text\Plugin\Field\FieldType\TextItemBase;
 use Drupal\user\UserInterface;
 
 /**
@@ -1877,6 +1878,39 @@ function _field_tokens($type, $tokens, array $data, array $options, BubbleableMe
           $replacements[$original] = $entity->label();
         }
       }
+      elseif ($field_item instanceOf TextItemBase && $property_name == 'summary') {
+        // If the summary was requested and is not empty, use it.
+        if (!empty($field_item->summary)) {
+          $output = $field_item->summary_processed;
+        }
+        // Attempt to provide a suitable version of the 'body' field.
+        else {
+          $output = $field_item->processed;
+          // A summary was requested.
+          // Generate an optionally trimmed summary of the field.
+
+          // Get the 'trim_length' size used for the 'teaser' mode, if
+          // present, or use the default trim_length size.
+          $entity = $field_item->getRoot()->getValue();
+          $display_options = \Drupal::entityTypeManager()
+            ->getStorage('entity_view_display')
+            ->load($entity->getEntityTypeId() . '.' . $entity->bundle(). '.' . 'teaser')
+            ->getComponent($type);
+          if (isset($display_options['settings']['trim_length'])) {
+            $length = $display_options['settings']['trim_length'];
+          }
+          else {
+            $settings = \Drupal::service('plugin.manager.field.formatter')
+              ->getDefaultSettings('text_summary_or_trimmed');
+            $length = $settings['trim_length'];
+          }
+
+          $output = text_summary($output, $field_item->format, $length);
+        }
+        // "processed" returns a \Drupal\Component\Render\MarkupInterface
+        // via check_markup().
+        $replacements[$original] = $output;
+      }
       elseif (($field_item->getFieldDefinition()->getType() == 'image') && ($style = ImageStyle::load($property_name))) {
         // Handle [node:field_name:image_style:property] tokens and multivalued
         // [node:field_name:delta:image_style:property] tokens. If the token is
