diff --git a/config/install/search_api_solr.standard_highlighter.yml b/config/install/search_api_solr.standard_highlighter.yml
index b68950b..5d6ea84 100644
--- a/config/install/search_api_solr.standard_highlighter.yml
+++ b/config/install/search_api_solr.standard_highlighter.yml
@@ -34,20 +34,6 @@ regex:
   # fragments). Applying a complicated regex to a huge field is computationally
   # expensive.
   maxAnalyzedChars: 10000
-excerpt:
-  # Specifies maximum number of highlighted snippets to generate per field. It is
-  # possible for any number of snippets from zero to this value to be generated.
-  # This parameter accepts per-field overrides.
-  snippets: 3
-  # Specifies the size, in characters, of fragments to consider for highlighting.
-  # 0 indicates that no fragmenting should be considered and the whole field value
-  # should be used. This parameter accepts per-field overrides.
-  fragsize: 70
-  # Instructs Solr to collapse contiguous fragments into a single fragment. A
-  # value of true indicates contiguous fragments will be collapsed into single
-  # fragment. This parameter accepts per-field overrides. The default value,
-  # false, is also the backward-compatible setting.
-  mergeContiguous: false
 highlight:
   # Instructs Solr to collapse contiguous fragments into a single fragment. A
   # value of true indicates contiguous fragments will be collapsed into single
@@ -58,3 +44,11 @@ highlight:
   # If false, terms are highlighted in all requested fields regardless of which
   # field matched the query.
   requireFieldMatch: false
+  # Specifies maximum number of highlighted snippets to generate per field. It is
+  # possible for any number of snippets from zero to this value to be generated.
+  # This parameter accepts per-field overrides.
+  snippets: 3
+  # Specifies the size, in characters, of fragments to consider for highlighting.
+  # 0 indicates that no fragmenting should be considered and the whole field value
+  # should be used. This parameter accepts per-field overrides.
+  fragsize: 0
diff --git a/config/schema/search_api_solr.backend.schema.yml b/config/schema/search_api_solr.backend.schema.yml
index 771a5a9..cc25aa2 100644
--- a/config/schema/search_api_solr.backend.schema.yml
+++ b/config/schema/search_api_solr.backend.schema.yml
@@ -2,9 +2,6 @@ plugin.plugin_configuration.search_api_backend.search_api_solr:
   type: config_object
   label: 'Search API Solr settings'
   mapping:
-    excerpt:
-      type: boolean
-      label: 'Return an excerpt for all results'
     retrieve_data:
       type: boolean
       label: 'Retrieve result data from Solr'
diff --git a/config/schema/search_api_solr.schema.yml b/config/schema/search_api_solr.schema.yml
index 36512ab..0b3ac8f 100644
--- a/config/schema/search_api_solr.schema.yml
+++ b/config/schema/search_api_solr.schema.yml
@@ -48,18 +48,6 @@ search_api_solr.standard_highlighter:
         maxAnalyzedChars:
           type: integer
           label: 'Instructs Solr to analyze only this many characters from a field when using the regex fragmenter (after which, the fragmenter produces fixed-sized fragments).'
-    excerpt:
-      type: mapping
-      mapping:
-        snippets:
-          type: integer
-          label: 'Specifies maximum number of highlighted snippets to generate per field.'
-        fragsize:
-          type: integer
-          label: 'Specifies the size, in characters, of fragments to consider for highlighting.'
-        mergeContiguous:
-          type: boolean
-          label: 'Instructs Solr to collapse contiguous fragments into a single fragment.'
     highlight:
       type: mapping
       mapping:
@@ -69,3 +57,9 @@ search_api_solr.standard_highlighter:
         requireFieldMatch:
           type: boolean
           label: 'If set to true, highlights terms only if they appear in the specified field.'
+        snippets:
+          type: integer
+          label: 'Specifies maximum number of highlighted snippets to generate per field.'
+        fragsize:
+          type: integer
+          label: 'Specifies the size, in characters, of fragments to consider for highlighting.'
diff --git a/search_api_solr.install b/search_api_solr.install
index 2d4eec0..f1f416d 100644
--- a/search_api_solr.install
+++ b/search_api_solr.install
@@ -449,4 +449,25 @@ function search_api_solr_update_8207() {
       search_api_solr_update_helper_save_field_type_config($field_type_name, $field_type_config);
     }
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Enable new highlighter.
+ */
+function search_api_solr_update_8208() {
+  foreach (search_api_solr_update_helper_get_backend_configs() as $server_name => $backend_config) {
+    if (isset($backend_config['excerpt'])) {
+      unset($backend_config['excerpt']);
+    }
+    search_api_solr_update_helper_save_backend_config($server_name, $backend_config);
+  }
+
+  $config_factory = \Drupal::configFactory();
+  $config = $config_factory->getEditable('search_api_solr.standard_highlighter');
+  $data = $config->getRawData();
+  unset($data['excerpt']);
+  $data['highlight']['snippets'] = 3;
+  $data['highlight']['fragsize'] = 0;
+  $config->setData($data);
+  $config->save(TRUE);
+}
diff --git a/search_api_solr_defaults/config/optional/search_api.server.default_solr_server.yml b/search_api_solr_defaults/config/optional/search_api.server.default_solr_server.yml
index 8c51d5c..df84482 100644
--- a/search_api_solr_defaults/config/optional/search_api.server.default_solr_server.yml
+++ b/search_api_solr_defaults/config/optional/search_api.server.default_solr_server.yml
@@ -5,7 +5,6 @@ status: true
 backend: search_api_solr
 backend_config:
   site_hash: true
-  excerpt: false
   retrieve_data: false
   highlight_data: true
   skip_schema_check: false
diff --git a/src/Plugin/search_api/backend/SearchApiSolrBackend.php b/src/Plugin/search_api/backend/SearchApiSolrBackend.php
index 0b9d485..40b1b33 100644
--- a/src/Plugin/search_api/backend/SearchApiSolrBackend.php
+++ b/src/Plugin/search_api/backend/SearchApiSolrBackend.php
@@ -172,7 +172,6 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
    */
   public function defaultConfiguration() {
     return [
-      'excerpt' => FALSE,
       'retrieve_data' => FALSE,
       'highlight_data' => FALSE,
       'skip_schema_check' => FALSE,
@@ -234,12 +233,6 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
       '#description' => $this->t('When retrieving result data from the Solr server, try to highlight the search terms in the returned fulltext fields.'),
       '#default_value' => $this->configuration['highlight_data'],
     ];
-    $form['advanced']['excerpt'] = [
-      '#type' => 'checkbox',
-      '#title' => $this->t('Return an excerpt for all results'),
-      '#description' => $this->t("If search keywords are given, use Solr's capabilities to create a highlighted search excerpt for each result. Whether the excerpts will actually be displayed depends on the settings of the search, though."),
-      '#default_value' => $this->configuration['excerpt'],
-    ];
     $form['advanced']['skip_schema_check'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Skip schema verification'),
@@ -911,7 +904,6 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
       $solarium_query->getEDisMax()
         ->setQueryFields(implode(' ', $query_fields_boosted));
 
-      // Set highlighting and excerpt.
       $this->setHighlighting($solarium_query, $query, $query_fields);
     }
 
@@ -1476,9 +1468,7 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
       }
 
       $solr_id = $this->createId($index->id(), $result_item->getId());
-      if ($excerpt = $this->getExcerpt($result->getData(), $solr_id, $result_item, $field_names)) {
-        $result_item->setExcerpt($excerpt);
-      }
+      $this->getHighlighting($result->getData(), $solr_id, $result_item, $field_names);
 
       $result_set->addResultItem($result_item);
     }
@@ -2388,65 +2378,23 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
    *   The fields of the result item.
    * @param array $field_mapping
    *   Mapping from search_api field names to Solr field names.
-   *
-   * @return bool|string
-   *   FALSE if no excerpt is returned from Solr, the excerpt string otherwise.
    */
-  protected function getExcerpt($data, $solr_id, ItemInterface $item, array $field_mapping) {
-    if (!isset($data['highlighting'][$solr_id])) {
-      return FALSE;
-    }
-    $output = '';
-    // @todo using the spell field is not the optimal solution.
-    // @see https://www.drupal.org/node/2735881
-    if (!empty($this->configuration['excerpt']) && !empty($data['highlighting'][$solr_id]['spell'])) {
-      foreach ($data['highlighting'][$solr_id]['spell'] as $snippet) {
-        $snippet = strip_tags($snippet);
-        $snippet = preg_replace('/^.*>|<.*$/', '', $snippet);
-        $snippet = Utility::formatHighlighting($snippet);
-        // The created fragments sometimes have leading or trailing punctuation.
-        // We remove that here for all common cases, but take care not to remove
-        // < or > (so HTML tags stay valid).
-        $snippet = trim($snippet, "\00..\x2F:;=\x3F..\x40\x5B..\x60");
-        $output .= $snippet . ' … ';
-      }
-    }
-    if (!empty($this->configuration['highlight_data'])) {
-      $item_fields = $item->getFields();
+  protected function getHighlighting($data, $solr_id, ItemInterface $item, array $field_mapping) {
+    if (isset($data['highlighting'][$solr_id]) && !empty($this->configuration['highlight_data'])) {
+      $snippets = [];
       foreach ($field_mapping as $search_api_property => $solr_property) {
         if (!empty($data['highlighting'][$solr_id][$solr_property])) {
-          $snippets = [];
           foreach ($data['highlighting'][$solr_id][$solr_property] as $value) {
             // Contrary to above, we here want to preserve HTML, so we just
             // replace the [HIGHLIGHT] tags with the appropriate format.
-            $snippets[] = [
-              'raw' => preg_replace('#\[(/?)HIGHLIGHT\]#', '', $value),
-              'replace' => Utility::formatHighlighting($value),
-            ];
-          }
-          if ($snippets) {
-            $values = $item_fields[$search_api_property]->getValues();
-            foreach ($values as $value) {
-              foreach ($snippets as $snippet) {
-                if ($value instanceof TextValue) {
-                  if ($value->getText() === $snippet['raw']) {
-                    $value->setText($snippet['replace']);
-                  }
-                }
-                else {
-                  if ($value == $snippet['raw']) {
-                    $value = $snippet['replace'];
-                  }
-                }
-              }
-            }
-            $item_fields[$search_api_property]->setValues($values);
+            $snippets[$search_api_property][] = Utility::formatHighlighting($value);
           }
         }
       }
+      if ($snippets) {
+        $item->setExtraData('highlighted_fields', $snippets);
+      }
     }
-
-    return $output;
   }
 
   /**
@@ -2523,15 +2471,17 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
    *   The solr fields to be highlighted.
    */
   protected function setHighlighting(Query $solarium_query, QueryInterface $query, $highlighted_fields = []) {
-    $excerpt = !empty($this->configuration['excerpt']);
-    $highlight = !empty($this->configuration['highlight_data']);
-
-    if ($highlight || $excerpt) {
+    if (!empty($this->configuration['highlight_data'])) {
       $highlighter = \Drupal::config('search_api_solr.standard_highlighter');
 
       $hl = $solarium_query->getHighlighting();
       $hl->setSimplePrefix('[HIGHLIGHT]');
       $hl->setSimplePostfix('[/HIGHLIGHT]');
+      $hl->setSnippets($highlighter->get('highlight.snippets'));
+      $hl->setFragSize($highlighter->get('highlight.fragsize'));
+      $hl->setMergeContiguous($highlighter->get('highlight.mergeContiguous'));
+      $hl->setRequireFieldMatch($highlighter->get('highlight.requireFieldMatch'));
+
       if ($highlighter->get('maxAnalyzedChars') != $highlighter->getOriginal('maxAnalyzedChars')) {
         $hl->setMaxAnalyzedChars($highlighter->get('maxAnalyzedChars'));
       }
@@ -2556,26 +2506,11 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
       if ($highlighter->get('regex.maxAnalyzedChars') != $highlighter->getOriginal('regex.maxAnalyzedChars')) {
         $hl->setRegexMaxAnalyzedChars($highlighter->get('regex.maxAnalyzedChars'));
       }
-      if ($excerpt) {
-        // If the field doesn't exist yet getField() will add it.
-        $excerpt_field = $hl->getField('spell');
-        $excerpt_field->setSnippets($highlighter->get('excerpt.snippets'));
-        $excerpt_field->setFragSize($highlighter->get('excerpt.fragsize'));
-        $excerpt_field->setMergeContiguous($highlighter->get('excerpt.mergeContiguous'));
-      }
-      if ($highlight && !empty($highlighted_fields)) {
-        foreach ($highlighted_fields as $highlighted_field) {
-          // We must not set the fields at once using setFields() to not break
-          // the excerpt feature above.
-          $hl->addField($highlighted_field);
-        }
-        // @todo the amount of snippets need to be increased to get highlighting
-        //   of multi value fields to work.
-        // @see https://drupal.org/node/2753635
-        $hl->setSnippets(1);
-        $hl->setFragSize(0);
-        $hl->setMergeContiguous($highlighter->get('highlight.mergeContiguous'));
-        $hl->setRequireFieldMatch($highlighter->get('highlight.requireFieldMatch'));
+
+      foreach ($highlighted_fields as $highlighted_field) {
+        // We must not set the fields at once using setFields() to not break
+        // the altered queries.
+        $hl->addField($highlighted_field);
       }
     }
   }
diff --git a/src/Utility/Utility.php b/src/Utility/Utility.php
index 52b6ce9..233eeb3 100644
--- a/src/Utility/Utility.php
+++ b/src/Utility/Utility.php
@@ -201,6 +201,8 @@ class Utility {
    *   The snippet(s), properly formatted as HTML.
    */
   public static function formatHighlighting($snippet) {
+    // @todo the prefix and suffix should be the same as configured on the
+    // highlighting processor.
     return preg_replace('#\[(/?)HIGHLIGHT\]#', '<$1strong>', $snippet);
   }
 
diff --git a/tests/modules/search_api_solr_multilingual_test/config/install/search_api.server.solr_multilingual_search_server.yml b/tests/modules/search_api_solr_multilingual_test/config/install/search_api.server.solr_multilingual_search_server.yml
index 6bd9b74..3314c4a 100644
--- a/tests/modules/search_api_solr_multilingual_test/config/install/search_api.server.solr_multilingual_search_server.yml
+++ b/tests/modules/search_api_solr_multilingual_test/config/install/search_api.server.solr_multilingual_search_server.yml
@@ -4,7 +4,6 @@ description: 'A server used for testing.'
 backend: search_api_solr_multilingual
 backend_config:
   site_hash: true
-  excerpt: false
   retrieve_data: false
   highlight_data: false
   skip_schema_check: false
diff --git a/tests/modules/search_api_solr_techproducts_test/config/install/search_api.server.techproducts.yml b/tests/modules/search_api_solr_techproducts_test/config/install/search_api.server.techproducts.yml
index ef6faa5..359d55a 100644
--- a/tests/modules/search_api_solr_techproducts_test/config/install/search_api.server.techproducts.yml
+++ b/tests/modules/search_api_solr_techproducts_test/config/install/search_api.server.techproducts.yml
@@ -23,7 +23,6 @@ backend_config:
     http_method: AUTO
   retrieve_data: true
   highlight_data: false
-  excerpt: false
   skip_schema_check: true
   site_hash: false
   domain: generic
diff --git a/tests/modules/search_api_solr_test/config/install/search_api.server.solr_search_server.yml b/tests/modules/search_api_solr_test/config/install/search_api.server.solr_search_server.yml
index a3e22ca..16ccdf8 100644
--- a/tests/modules/search_api_solr_test/config/install/search_api.server.solr_search_server.yml
+++ b/tests/modules/search_api_solr_test/config/install/search_api.server.solr_search_server.yml
@@ -4,7 +4,6 @@ description: 'A server used for testing.'
 backend: search_api_solr
 backend_config:
   site_hash: true
-  excerpt: false
   retrieve_data: false
   highlight_data: false
   skip_schema_check: false
diff --git a/tests/src/Kernel/SearchApiSolrTest.php b/tests/src/Kernel/SearchApiSolrTest.php
index 3421f4f..dc3ab85 100644
--- a/tests/src/Kernel/SearchApiSolrTest.php
+++ b/tests/src/Kernel/SearchApiSolrTest.php
@@ -399,9 +399,9 @@ class SearchApiSolrTest extends SolrBackendTestBase {
   }
 
   /**
-   * Tests highlight and excerpt options.
+   * Tests highlight options.
    */
-  public function testHighlightAndExcerpt() {
+  public function testHighlight() {
     $config = $this->getIndex()->getServerInstance()->getBackendConfig();
 
     $this->insertExampleContent();
@@ -409,7 +409,6 @@ class SearchApiSolrTest extends SolrBackendTestBase {
 
     $config['retrieve_data'] = TRUE;
     $config['highlight_data'] = TRUE;
-    $config['excerpt'] = FALSE;
     $query = $this->buildSearch('foobar');
     $query->getIndex()->getServerInstance()->setBackendConfig($config);
     $results = $query->execute();
@@ -417,11 +416,9 @@ class SearchApiSolrTest extends SolrBackendTestBase {
     /** @var \Drupal\search_api\Item\ItemInterface $result */
     foreach ($results as $result) {
       $this->assertContains('<strong>foobar</strong>', (string) $result->getField('body')->getValues()[0]);
-      $this->assertNull($result->getExcerpt());
     }
 
     $config['highlight_data'] = FALSE;
-    $config['excerpt'] = TRUE;
     $query = $this->buildSearch('foobar');
     $query->getIndex()->getServerInstance()->setBackendConfig($config);
     $results = $query->execute();
@@ -429,19 +426,6 @@ class SearchApiSolrTest extends SolrBackendTestBase {
     /** @var \Drupal\search_api\Item\ItemInterface $result */
     foreach ($results as $result) {
       $this->assertNotContains('<strong>foobar</strong>', (string) $result->getField('body')->getValues()[0]);
-      $this->assertContains('<strong>foobar</strong>', $result->getExcerpt());
-    }
-
-    $config['highlight_data'] = TRUE;
-    $config['excerpt'] = TRUE;
-    $query = $this->buildSearch('foobar');
-    $query->getIndex()->getServerInstance()->setBackendConfig($config);
-    $results = $query->execute();
-    $this->assertEquals(1, $results->getResultCount(), 'Search for »foobar« returned correct number of results.');
-    /** @var \Drupal\search_api\Item\ItemInterface $result */
-    foreach ($results as $result) {
-      $this->assertContains('<strong>foobar</strong>', (string) $result->getField('body')->getValues()[0]);
-      $this->assertContains('<strong>foobar</strong>', $result->getExcerpt());
     }
   }
 
