diff --git a/src/Plugin/search_api/processor/Highlight.php b/src/Plugin/search_api/processor/Highlight.php
index 56bc97aa..c94425b2 100644
--- a/src/Plugin/search_api/processor/Highlight.php
+++ b/src/Plugin/search_api/processor/Highlight.php
@@ -257,9 +257,6 @@ public function postprocessSearchResults(ResultSetInterface $results) {
       $highlighted_fields = $this->highlightFields($result_items, $keys);
       foreach ($highlighted_fields as $item_id => $item_fields) {
         $item = $result_items[$item_id];
-        // Maybe the backend or some other processor has already set highlighted
-        // field values.
-        $item_fields += $item->getExtraData('highlighted_fields', []);
         $item->setExtraData('highlighted_fields', $item_fields);
       }
     }
@@ -303,19 +300,28 @@ protected function addExcerpts(array $results, array $fulltext_fields, array $ke
    *   highlighted versions of the values for that field.
    */
   protected function highlightFields(array $results, array $keys) {
-    $item_fields = $this->getFulltextFields($results, NULL, $this->configuration['highlight'] == 'always');
     $highlighted_fields = [];
+    foreach ($results as $item_id => $item) {
+      // Maybe the backend or some other processor has already set highlighted
+      // field values.
+      $highlighted_fields[$item_id] = $item->getExtraData('highlighted_fields', []);
+    }
+
+    $load = $this->configuration['highlight'] == 'always';
+    $item_fields = $this->getFulltextFields($results, NULL, $load);
     foreach ($item_fields as $item_id => $fields) {
       foreach ($fields as $field_id => $values) {
-        $change = FALSE;
-        foreach ($values as $i => $value) {
-          $values[$i] = $this->highlightField($value, $keys);
-          if ($values[$i] !== $value) {
-            $change = TRUE;
+        if (empty($highlighted_fields[$item_id][$field_id])) {
+          $change = FALSE;
+          foreach ($values as $i => $value) {
+            $values[$i] = $this->highlightField($value, $keys);
+            if ($values[$i] !== $value) {
+              $change = TRUE;
+            }
+          }
+          if ($change) {
+            $highlighted_fields[$item_id][$field_id] = $values;
           }
-        }
-        if ($change) {
-          $highlighted_fields[$item_id][$field_id] = $values;
         }
       }
     }
diff --git a/tests/src/Unit/Processor/HighlightTest.php b/tests/src/Unit/Processor/HighlightTest.php
index 02d31b15..dfbc9032 100644
--- a/tests/src/Unit/Processor/HighlightTest.php
+++ b/tests/src/Unit/Processor/HighlightTest.php
@@ -960,6 +960,63 @@ public function testFieldExtraction() {
     $this->assertEquals($expected, $fields);
   }
 
+  /**
+   * Tests field highlighting with a result set that has some highlighting data.
+   */
+  public function testPostprocessSearchResultsWithExistingHighlighting() {
+    $query = $this->getMock(QueryInterface::class);
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
+    $query->expects($this->atLeastOnce())
+      ->method('getOriginalKeys')
+      ->will($this->returnValue('foo'));
+    /** @var \Drupal\search_api\Query\QueryInterface $query */
+
+    $body = $this->createTestField('body', 'entity:node/body');
+    $title = $this->createTestField('title', 'entity:node/title');
+
+    $this->index->expects($this->atLeastOnce())
+      ->method('getFields')
+      ->will($this->returnValue(['body' => $body, 'title' => $title]));
+
+    $this->processor->setIndex($this->index);
+
+    $body_values = ['Some foo value'];
+    $title_values = ['The foo title'];
+    $fields = [
+      'entity:node/body' => [
+        'type' => 'text',
+        'values' => $body_values,
+      ],
+      'entity:node/title' => [
+        'type' => 'text',
+        'values' => $title_values,
+      ],
+    ];
+
+    $items = $this->createItems($this->index, 2, $fields);
+    $items[$this->itemIds[0]]->setExtraData('highlighted_fields', [
+      'title' => ['The <em>foo</em> title'],
+    ]);
+    $items[$this->itemIds[1]]->setExtraData('highlighted_fields', [
+      'body' => ['Some <em>foo</em> value'],
+    ]);
+
+    $results = new ResultSet($query);
+    $results->setResultItems($items);
+    $results->setResultCount(1);
+
+    $this->processor->postprocessSearchResults($results);
+
+    $fields = $items[$this->itemIds[0]]->getExtraData('highlighted_fields');
+    $this->assertEquals('The <em>foo</em> title', $fields['title'][0], 'Existing highlighting data for title was correctly kept.');
+    $this->assertEquals('Some <strong>foo</strong> value', $fields['body'][0], 'Highlighting is correctly applied to body field.');
+    $fields = $items[$this->itemIds[1]]->getExtraData('highlighted_fields');
+    $this->assertEquals('The <strong>foo</strong> title', $fields['title'][0], 'Highlighting is correctly applied to title field.');
+    $this->assertEquals('Some <em>foo</em> value', $fields['body'][0], 'Existing highlighting data for body was correctly kept.');
+  }
+
   /**
    * Creates a field object for testing.
    *
