diff --git a/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php b/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
index c09d652..d1c3cc6 100644
--- a/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
+++ b/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
@@ -220,7 +220,8 @@ public function getFields() {
     $facet_fields = $this->getDefaultFields();
 
     // Get the allowed field types.
-    $allowed_field_types = \Drupal::moduleHandler()->invokeAll('facets_core_allowed_field_types', array($field_types = []));
+    $allowed_field_types = \Drupal::moduleHandler()
+      ->invokeAll('facets_core_allowed_field_types', [$field_types = []]);
 
     // Get the current field instances and detect if the field type is allowed.
     $fields = FieldConfig::loadMultiple();
@@ -355,4 +356,21 @@ public function calculateDependencies() {
     return ['module' => ['node', 'search']];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataDefinitions() {
+    $fields = $this->getFields();
+    $field_configs = FieldConfig::loadMultiple();
+    $definitions = [];
+    foreach ($field_configs as $id => $config) {
+      if (isset($fields[$config->getName()])) {
+        $definitions[] = \Drupal::typedDataManager()
+          ->getDefinition('field_item:' . $config->getFieldStorageDefinition()->getType());
+      }
+    }
+
+    return $definitions;
+  }
+
 }
diff --git a/src/FacetSource/FacetSourcePluginBase.php b/src/FacetSource/FacetSourcePluginBase.php
index 14317fb..2d24cb5 100644
--- a/src/FacetSource/FacetSourcePluginBase.php
+++ b/src/FacetSource/FacetSourcePluginBase.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\facets\Exception\Exception;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Facets\FacetInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -146,4 +147,16 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s
     $this->facet->setFieldIdentifier($field_identifier);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataDefinition($field_name) {
+    $dataDefinitions = $this->getDataDefinitions();
+    if (isset($dataDefinitions[$field_name])) {
+      return $dataDefinitions[$field_name];
+    }
+
+    throw new Exception("Field with name {$field_name} does not have a definition");
+  }
+
 }
diff --git a/src/FacetSource/FacetSourcePluginInterface.php b/src/FacetSource/FacetSourcePluginInterface.php
index 733ad79..9c3cc86 100644
--- a/src/FacetSource/FacetSourcePluginInterface.php
+++ b/src/FacetSource/FacetSourcePluginInterface.php
@@ -98,4 +98,18 @@ public function setSearchKeys($keys);
    */
   public function getSearchKeys();
 
+  /**
+   * Returns the defined fields indexed on the facet source.
+   *
+   * @return \Drupal\Core\TypedData\DataDefinitionInterface[]
+   */
+  public function getDataDefinitions();
+
+  /**
+   * Returns one defined field from the facet source.
+   *
+   * @return \Drupal\Core\TypedData\DataDefinitionInterface
+   */
+  public function getDataDefinition($field_name);
+
 }
diff --git a/src/Plugin/facets/facet_source/SearchApiDisplay.php b/src/Plugin/facets/facet_source/SearchApiDisplay.php
index 3ae02ab..c6f395f 100644
--- a/src/Plugin/facets/facet_source/SearchApiDisplay.php
+++ b/src/Plugin/facets/facet_source/SearchApiDisplay.php
@@ -320,4 +320,14 @@ public function getDisplay() {
       ->createInstance($this->pluginDefinition['display_id']);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataDefinitions() {
+    return array_map(function ($item) {
+      /** @var \Drupal\search_api\Item\FieldInterface $item */
+      return $item->getDataDefinition();
+    }, $this->getIndex()->getFields());
+  }
+
 }
diff --git a/src/Plugin/facets/processor/ListItemProcessor.php b/src/Plugin/facets/processor/ListItemProcessor.php
index caf5a44..14cc0f1 100644
--- a/src/Plugin/facets/processor/ListItemProcessor.php
+++ b/src/Plugin/facets/processor/ListItemProcessor.php
@@ -180,13 +180,13 @@ public function build(FacetInterface $facet, array $results) {
    *   The changed results.
    */
   protected function overWriteDisplayValues(array $results, array $replacements) {
-    /** @var \Drupal\facets\Result\ResultInterface $a */
-    foreach ($results as &$a) {
-      if (isset($replacements[$a->getRawValue()])) {
-        $a->setDisplayValue($replacements[$a->getRawValue()]);
+    return array_map(function ($item) use ($replacements) {
+      /** @var \Drupal\facets\Result\ResultInterface $item */
+      if (isset($replacements[$item->getRawValue()])) {
+        $item->setDisplayValue($replacements[$item->getRawValue()]);
       }
-    }
-    return $results;
+      return $item;
+    }, $results);
   }
 
 }
diff --git a/src/Plugin/facets/processor/TranslateEntityProcessor.php b/src/Plugin/facets/processor/TranslateEntityProcessor.php
index 16cbac5..dd48d6c 100644
--- a/src/Plugin/facets/processor/TranslateEntityProcessor.php
+++ b/src/Plugin/facets/processor/TranslateEntityProcessor.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
+use Drupal\facets\Exception\InvalidProcessorException;
 use Drupal\facets\FacetInterface;
 use Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay;
 use Drupal\facets\Processor\BuildProcessorInterface;
@@ -80,35 +81,24 @@ public static function create(ContainerInterface $container, array $configuratio
   public function build(FacetInterface $facet, array $results) {
     $language_interface = $this->languageManager->getCurrentLanguage();
 
-    $ids = [];
+    /** @var \Drupal\Core\TypedData\DataDefinitionInterface $field_definition */
+    $field_definition = $facet->getFacetSource()
+      ->getDataDefinition($facet->getFieldIdentifier());
+    if ($field_definition->getPropertyDefinition('entity') === NULL) {
+      throw new InvalidProcessorException("Field doesn't have an entity definition, so this processor doesn't work.");
+    }
+
+    $entity_type = $field_definition
+      ->getPropertyDefinition('entity')
+      ->getTargetDefinition()
+      ->getEntityTypeId();
 
     /** @var \Drupal\facets\Result\ResultInterface $result */
+    $ids = [];
     foreach ($results as $delta => $result) {
       $ids[$delta] = $result->getRawValue();
     }
 
-    // Default to nodes.
-    $entity_type = 'node';
-    $source = $facet->getFacetSource();
-
-    // Support multiple entity types when using Search API.
-    if ($source instanceof SearchApiDisplay) {
-
-      $field_id = $facet->getFieldIdentifier();
-
-      // Load the index from the source, load the definition from the
-      // datasource.
-      /** @var \Drupal\facets\FacetSource\SearchApiFacetSourceInterface $source */
-      $index = $source->getIndex();
-      $field = $index->getField($field_id);
-
-      // Determine the target entity type.
-      $entity_type = $field->getDataDefinition()
-        ->getPropertyDefinition('entity')
-        ->getTargetDefinition()
-        ->getEntityTypeId();
-    }
-
     // Load all indexed entities of this type.
     $entities = $this->entityTypeManager
       ->getStorage($entity_type)
diff --git a/tests/src/Kernel/Entity/FacetFacetSourceTest.php b/tests/src/Kernel/Entity/FacetFacetSourceTest.php
index 004a251..7071a2b 100644
--- a/tests/src/Kernel/Entity/FacetFacetSourceTest.php
+++ b/tests/src/Kernel/Entity/FacetFacetSourceTest.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\Tests\facets\Kernel\Entity;
 
+use Drupal\Core\TypedData\DataDefinitionInterface;
 use Drupal\facets\Entity\Facet;
 use Drupal\facets\FacetSourceInterface;
 use Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay;
 use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\facets\Exception\Exception;
 
 /**
  * Class FacetFacetSourceTest.
@@ -129,4 +131,35 @@ public function testQueryType() {
     $this->assertEquals('search_api_string', $aa);
   }
 
+  /**
+   * Test the data definitions.
+   *
+   * @covers \Drupal\facets\FacetSource\FacetSourcePluginInterface::getDataDefinitions
+   * @covers \Drupal\facets\FacetSource\FacetSourcePluginInterface::getDataDefinition
+   */
+  public function testDataDefinitions() {
+    // Create and configure facet.
+    $entity = new Facet([], 'facets_facet');
+    $display_name = 'search_api:views_page__search_api_test_view__page_1';
+    $entity->setFacetSourceId($display_name);
+
+    // Test that ::getDataDefinitions returns an array with the defined fields,
+    // check on a couple of the fields.
+    $dataDefinitions = $entity->getFacetSource()->getDataDefinitions();
+    $this->assertInternalType('array', $dataDefinitions);
+    $this->assertArrayHasKey('name', $dataDefinitions);
+    $this->assertArrayHasKey('type', $dataDefinitions);
+    $this->assertArrayHasKey('category', $dataDefinitions);
+    $this->assertInstanceOf(DataDefinitionInterface::class, $dataDefinitions['name']);
+    $this->assertInstanceOf(DataDefinitionInterface::class, $dataDefinitions['type']);
+    $this->assertInstanceOf(DataDefinitionInterface::class, $dataDefinitions['category']);
+
+    // Check the return value of ::getDataDefinition.
+    $this->assertInstanceOf(DataDefinitionInterface::class, $entity->getFacetSource()->getDataDefinition('id'));
+
+    // When trying to get a field that doesn't exist, an error should be thrown.
+    $this->setExpectedException(Exception::class);
+    $entity->getFacetSource()->getDataDefinition('llama');
+  }
+
 }
diff --git a/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php b/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php
index 373c3f0..4670b03 100644
--- a/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php
+++ b/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php
@@ -75,25 +75,13 @@ protected function setUp() {
       ->method('getPropertyDefinition')
       ->willReturn($property_definition);
 
-    // Add the typed data definition to the search api field.
-    $field = $this->getMock(FieldInterface::class);
-    $field->expects($this->any())
-      ->method('getDataDefinition')
-      ->willReturn($data_definition);
-
-    // Add the search api field to the index.
-    $index = $this->getMock(IndexInterface::class);
-    $index->expects($this->any())
-      ->method('getField')
-      ->willReturn($field);
-
     // Create a search api based facet source and link the index to it.
     $facet_source = $this->getMockBuilder(SearchApiDisplay::class)
       ->disableOriginalConstructor()
       ->getMock();
     $facet_source->expects($this->any())
-      ->method('getIndex')
-      ->willReturn($index);
+      ->method('getDataDefinition')
+      ->willReturn($data_definition);
 
     // Create the actual facet.
     $this->facet = $this->getMockBuilder(Facet::class)
