diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 145690b..f99f0e2 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -533,7 +533,7 @@ function comment_entity_view(EntityInterface $entity, EntityViewDisplayInterface
           }
         }
       }
-      elseif ($view_mode != 'search_index' && $view_mode != 'search_result') {
+      elseif ($view_mode != 'search_index' && $view_mode != 'search_result' && $view_mode != 'search_result_extra') {
         // Entity in other view modes: add a "post comment" link if the user is
         // allowed to post comments and if this entity is allowing new comments.
         // But we don't want this link if we're building the entity for search
diff --git a/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php b/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php
index 143881f..e13ac85 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php
@@ -229,7 +229,7 @@ public function execute() {
     $node_render = $this->entityManager->getViewBuilder('node');
 
     foreach ($find as $item) {
-      // Render the node.
+      // Render the node for the excerpt.
       $node = $node_storage->load($item->sid)->getTranslation($item->langcode);
       $build = $node_render->view($node, 'search_result', $item->langcode);
       unset($build['#theme']);
@@ -238,6 +238,22 @@ public function execute() {
       // Fetch comment count for snippet.
       $node->rendered .= ' ' . $this->moduleHandler->invoke('comment', 'node_update_index', array($node, $item->langcode));
 
+      // Render the node for the extra fields, but only if it has been
+      // customized for this content type.
+      $display = entity_load('entity_display', 'node.' . $node->bundle() . '.search_result_extra');
+      if ($display && $display->status) {
+        $build = $node_render->view($node, 'search_result_extra', $item->langcode);
+        // Remove some components "helpfully" added automatically during node
+        // view building.
+        unset($build['title']);
+        unset($build['links']);
+        unset($build['#theme']);
+        $node->extra_rendered = drupal_render($build);
+      }
+      else {
+        $node->extra_rendered = '';
+      }
+
       $extra = $this->moduleHandler->invokeAll('node_search_result', array($node, $item->langcode));
 
       $language = language_load($item->langcode);
@@ -256,6 +272,7 @@ public function execute() {
         'extra' => $extra,
         'score' => $item->calculated_score,
         'snippet' => search_excerpt($keys, $node->rendered, $item->langcode),
+        'rendered' => $node->extra_rendered,
         'langcode' => $node->language()->id,
       );
     }
diff --git a/core/modules/search/config/entity.view_mode.node.search_result.yml b/core/modules/search/config/entity.view_mode.node.search_result.yml
index cfdc1ac..0e1f09d 100644
--- a/core/modules/search/config/entity.view_mode.node.search_result.yml
+++ b/core/modules/search/config/entity.view_mode.node.search_result.yml
@@ -1,6 +1,6 @@
 id: node.search_result
 uuid: 095d7357-de7d-4acc-953a-585cd106e89b
-label: Search result
+label: Search result excerpt
 status: false
 cache: true
 targetEntityType: node
diff --git a/core/modules/search/config/entity.view_mode.node.search_result_extra.yml b/core/modules/search/config/entity.view_mode.node.search_result_extra.yml
new file mode 100644
index 0000000..ca425ae
--- /dev/null
+++ b/core/modules/search/config/entity.view_mode.node.search_result_extra.yml
@@ -0,0 +1,6 @@
+id: node.search_result_extra
+uuid: 9ffc2b11-b47f-466b-bf00-b3bac1d3a55f
+label: 'Search result display'
+targetEntityType: node
+status: false
+cache: true
diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchFieldsTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchFieldsTest.php
new file mode 100644
index 0000000..cf1cd96
--- /dev/null
+++ b/core/modules/search/lib/Drupal/search/Tests/SearchFieldsTest.php
@@ -0,0 +1,160 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\search\Tests\SearchFieldsTest.
+ */
+
+namespace Drupal\search\Tests;
+
+/**
+ * Tests that fields and display modes work properly in Node search.
+ */
+class SearchFieldsTest extends SearchTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('search', 'field_ui');
+
+  /**
+   * Node used for testing.
+   */
+  public $node;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search fields and display modes',
+      'description' => 'Verifies that fields can be managed with display modes for indexing, excerpts, and display',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create a new content type.
+    $type = 'sft_bundle';
+    $this->drupalCreateContentType(array('type' => $type, 'name' => $type));
+
+    // Create a test user who can manage content types and fields.
+    $test_user = $this->drupalCreateUser(array('access content', 'search content', 'administer nodes', 'administer content types', 'administer node fields', 'administer node display', 'create sft_bundle content', 'access site reports', 'administer site configuration'));
+    $this->drupalLogin($test_user);
+
+    // Add some text fields to the content type (default settings).
+    $fields = array('for_index', 'for_excerpt', 'for_display');
+    foreach ($fields as $field) {
+      $this->drupalPostForm('admin/structure/types/manage/' . $type . '/fields',
+        array(
+          'fields[_add_new_field][label]' => $field,
+          'fields[_add_new_field][type]' => 'text',
+          'fields[_add_new_field][field_name]' => $field,
+        ), t('Save'));
+      $this->drupalPostForm(NULL, array(), t('Save field settings'));
+      $this->drupalPostForm(NULL, array(), t('Save settings'));
+    };
+
+    // Configure the Search display modes to each show only one of the three
+    // fields.
+    $this->drupalPostForm('admin/structure/types/manage/' . $type . '/display',
+      array(
+        'display_modes_custom[search_index]' => TRUE,
+        'display_modes_custom[search_result]' => TRUE,
+        'display_modes_custom[search_result_extra]' => TRUE,
+      ), t('Save'));
+
+    $this->drupalPostForm('admin/structure/types/manage/' . $type . '/display/search_index',
+      array(
+        'fields[field_for_excerpt][type]' => 'hidden',
+        'fields[field_for_display][type]' => 'hidden',
+      ), t('Save'));
+    $this->drupalPostForm('admin/structure/types/manage/' . $type . '/display/search_result',
+      array(
+        'fields[field_for_index][type]' => 'hidden',
+        'fields[field_for_display][type]' => 'hidden',
+      ), t('Save'));
+    $this->drupalPostForm('admin/structure/types/manage/' . $type . '/display/search_result_extra',
+      array(
+        'fields[field_for_index][type]' => 'hidden',
+        'fields[field_for_excerpt][type]' => 'hidden',
+      ), t('Save'));
+
+    // Clear some static caches. This is a testing artifact due to mixing
+    // UI calls and API calls in this test.
+    \Drupal::entityManager()->clearCachedFieldDefinitions();
+    field_info_cache_clear();
+
+    // Create a node with different values in the 3 fields.
+    $this->drupalPostForm('node/add/' . $type,
+      array(
+        'title[0][value]' => 'Title header',
+        'field_for_index[0][value]' => 'index contents database',
+        'field_for_excerpt[0][value]' => 'excerpt snippet highlighted',
+        'field_for_display[0][value]' => 'display output formatted',
+      ), t('Save and publish'));
+    $node = node_load(1, TRUE);
+    $node = $node->getUntranslated();
+    $this->node = $node;
+
+    // Update the search index.
+    $this->container->get('plugin.manager.search')->createInstance('node_search')->updateIndex();
+    search_update_totals();
+  }
+
+  /**
+   * Tests that the search field display modes work correctly.
+   */
+  function testSearchFieldDisplays() {
+    // Verify that if we search for excerpt or display words, we find nothing
+    // because they are not in the index.
+    $this->drupalPostForm('search/node', array('keys' => 'excerpt'), t('Search'));
+    $this->assertText('no results', 'Search for words not in index did not find a match');
+    $this->drupalPostForm('search/node', array('keys' => 'display'), t('Search'));
+    $this->assertText('no results', 'Search for words not in index did not find a match');
+
+    // Verify that if we search for index words or node title, we find it,
+    // and that the display words are shown.
+    $this->drupalPostForm('search/node', array('keys' => 'index'), t('Search'));
+    $this->assertNoText('no results', 'Search for words in index did find a match');
+    $this->assertText($this->node->label(), 'Node title is displayed');
+    $this->assertText('display output formatted', 'Display field is displayed');
+
+    $this->drupalPostForm('search/node', array('keys' => $this->node->label()), t('Search'));
+    $this->assertNoText('no results', 'Search for node title did find a match');
+    $this->assertText('display output formatted', 'Display field is displayed');
+
+    // Verify that if we search for index words with an excerpt and display
+    // word also OR'd into the search string, the excerpt word is highlighted
+    // but not the index or display word. Also verify that all the display words
+    // are shown, and the index words not in the query are missing.
+    $this->drupalPostForm('search/node', array('keys' => 'excerpt OR index OR display'), t('Search'));
+    $this->assertText('display output formatted', 'Display field is displayed');
+    $this->assertText($this->node->label(), 'Node title is displayed');
+    $this->assertRaw('<strong>excerpt</strong>', 'Excerpt word is highlighted');
+    $this->assertNoRaw('<strong>display</strong>', 'Display word is not highlighted');
+    $this->assertNoRaw('<strong>index</strong>', 'Index word is not highlighted');
+    $this->assertNoText('contents', 'Other index word is not present');
+    $this->assertNoText('database', 'Other index word is not present');
+
+    // Turn off the customized display of Search Results Extra.
+    $this->drupalPostForm('admin/structure/types/manage/sft_bundle/display',
+      array(
+        'display_modes_custom[search_result_extra]' => FALSE,
+      ), t('Save'));
+
+    // Clear some static caches. This is a testing artifact due to mixing
+    // UI calls and API calls in this test.
+    \Drupal::entityManager()->clearCachedFieldDefinitions();
+    field_info_cache_clear();
+    entity_load('entity_display', 'node.sft_bundle.search_result_extra', TRUE);
+
+    // Verify that the display stuff is now not displayed in search results.
+    $this->drupalPostForm('search/node', array('keys' => 'index'), t('Search'));
+    $this->assertNoText('display output formatted', 'Display field is not displayed');
+    $this->assertText($this->node->label(), 'Node title is displayed');
+    $this->assertNoText('no results', 'Search for words in index did find a match');
+
+  }
+}
diff --git a/core/modules/search/search.pages.inc b/core/modules/search/search.pages.inc
index 023a825..d82eaef 100644
--- a/core/modules/search/search.pages.inc
+++ b/core/modules/search/search.pages.inc
@@ -83,8 +83,9 @@ function template_preprocess_search_result(&$variables) {
   if (isset($result['extra']) && is_array($result['extra'])) {
     $info = array_merge($info, $result['extra']);
   }
-  // Check for existence. User search does not include snippets.
+  // Check for existence. User search does not include snippets or rendered.
   $variables['snippet'] = isset($result['snippet']) ? $result['snippet'] : '';
+  $variables['rendered'] = isset($result['rendered']) ? $result['rendered'] : '';
   // Provide separated and grouped meta information..
   $variables['info_split'] = $info;
   $variables['info'] = implode(' - ', $info);
diff --git a/core/modules/search/templates/search-result.html.twig b/core/modules/search/templates/search-result.html.twig
index 281f8b1..2f2fc4e 100644
--- a/core/modules/search/templates/search-result.html.twig
+++ b/core/modules/search/templates/search-result.html.twig
@@ -11,6 +11,8 @@
  * - url: URL of the result.
  * - title: Title of the result.
  * - snippet: A small preview of the result. Does not apply to user searches.
+ * - rendered: Extra fields to display with the result. Does not apply to user
+ *   searches.
  * - info: String of all the meta information ready for print. Does not apply
  *   to user searches.
  * - plugin_id: The machine-readable name of the plugin being executed,such
@@ -67,6 +69,9 @@
     {% if snippet %}
       <p class="search-snippet"{{ content_attributes }}>{{ snippet }}</p>
     {% endif %}
+    {% if rendered %}
+      <div class="search-rendered"{{ content_attributes }}>{{ rendered }}</div>
+    {% endif %}
     {% if info %}
       <p class="search-info">{{ info }}</p>
     {% endif %}
