diff --git a/src/Plugin/search_api/processor/FilesExtrator.php b/src/Plugin/search_api/processor/FilesExtrator.php
index 42ad1c4..085cdda 100644
--- a/src/Plugin/search_api/processor/FilesExtrator.php
+++ b/src/Plugin/search_api/processor/FilesExtrator.php
@@ -16,6 +16,7 @@ use Drupal\search_api\Item\ItemInterface;
 use Drupal\search_api\Processor\ProcessorPluginBase;
 use Drupal\search_api\Processor\ProcessorProperty;
 use Drupal\search_api\Utility\FieldsHelperInterface;
+use Drupal\search_api_attachments\Plugin\search_api\processor\Property\FilesExtractorProperty;
 use Drupal\search_api_attachments\TextExtractorPluginInterface;
 use Drupal\search_api_attachments\TextExtractorPluginManager;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -42,17 +43,9 @@ class FilesExtrator extends ProcessorPluginBase implements PluginFormInterface {
   const CONFIGNAME = 'search_api_attachments.admin_config';
 
   /**
-   * Name of the "virtual" field that handles file entity type extractions.
-   *
-   * This is used per example in a File datasource index or mixed
-   * datasources index.
-   */
-  const SAA_FILE_ENTITY = 'saa_file_entity';
-
-  /**
-   * Prefix of the properties provided by this module.
+   * Property name of the fields provided by this module.
    */
-  const SAA_PREFIX = 'saa_';
+  const SAA_PROPERTY = 'saa_file_property';
 
   /**
    * The plugin manager for our text extractor.
@@ -133,16 +126,13 @@ class FilesExtrator extends ProcessorPluginBase implements PluginFormInterface {
     $properties = [];
 
     if (!$datasource) {
-      // Add properties for all index available file fields and for file entity.
-      foreach ($this->getFileFieldsAndFileEntityItems() as $field_name => $label) {
-        $definition = [
-          'label' => $this->t('Search api attachments: @label', ['@label' => $label]),
-          'description' => $this->t('Search api attachments: @label', ['@label' => $label]),
-          'type' => 'string',
-          'processor_id' => $this->getPluginId(),
-        ];
-        $properties[static::SAA_PREFIX . $field_name] = new ProcessorProperty($definition);
-      }
+      $definition = [
+        'label' => $this->t('Search API attachments'),
+        'description' => $this->t('Search API attachments'),
+        'type' => 'string',
+        'processor_id' => $this->getPluginId(),
+      ];
+      $properties[static::SAA_PROPERTY] = new FilesExtractorProperty($definition);
     }
 
     return $properties;
@@ -152,51 +142,41 @@ class FilesExtrator extends ProcessorPluginBase implements PluginFormInterface {
    * {@inheritdoc}
    */
   public function addFieldValues(ItemInterface $item) {
-    $files = [];
     $config = $this->configFactory->getEditable(static::CONFIGNAME);
     $extractor_plugin_id = $config->get('extraction_method');
-    if ($extractor_plugin_id != '') {
-      $configuration = $config->get($extractor_plugin_id . '_configuration');
-      $extractor_plugin = $this->textExtractorPluginManager->createInstance($extractor_plugin_id, $configuration);
-      // Get the entity.
-      $entity = $item->getOriginalObject()->getValue();
-      $is_entity_type_file = $entity->getEntityTypeId() == 'file';
-      foreach ($this->getFileFieldsAndFileEntityItems() as $field_name => $label) {
-        // If the parent entity is not a file, no need to parse the
-        // saa static::SAA_FILE_ENTITY item.
-        if (!$is_entity_type_file && $field_name == static::SAA_FILE_ENTITY) {
-          break;
-        }
-        if ($is_entity_type_file && $field_name == static::SAA_FILE_ENTITY) {
-          $files[] = $entity;
-        }
+    if ($extractor_plugin_id == '') {
+      return;
+    }
+
+    $configuration = $config->get($extractor_plugin_id . '_configuration');
+    $extractor_plugin = $this->textExtractorPluginManager->createInstance($extractor_plugin_id, $configuration);
 
-        $property_path = static::SAA_PREFIX . $field_name;
-
-        // A way to load $field.
-        foreach ($this->fieldHelper->filterForPropertyPath($item->getFields(), NULL, $property_path) as $field) {
-          if ($entity->hasField($field_name)) {
-            $filefield_values = $entity->get($field_name)->filterEmptyItems()->getValue();
-
-            $all_fids = [];
-            foreach ($filefield_values as $filefield_value) {
-              $all_fids[] = $filefield_value['target_id'];
-            }
-            $fids = $this->limitToAllowedNumber($all_fids);
-            // Retrieve the files.
-            $files = $this->entityTypeManager
-                ->getStorage('file')
-                ->loadMultiple($fids);
+    $file_extract_fields = $this->getFieldsHelper()
+      ->filterForPropertyPath($item->getFields(), NULL, static::SAA_PROPERTY);
+    foreach ($file_extract_fields as $field) {
+      $all_fids = [];
+
+      // Loop through the extracted fields to get the file ids.
+      foreach ($field->getConfiguration()['fields'] as $field_name) {
+        $extracted_field = $item->getField($field_name);
+        if ($extracted_field && $extracted_field_values = $extracted_field->getValues()) {
+          foreach ($extracted_field_values as $extracted_field_value) {
+            $all_fids[] = $extracted_field_value;
           }
-          if (!empty($files)) {
-            $extraction = '';
-
-            foreach ($files as $file) {
-              if ($this->isFileIndexable($file, $item, $field_name)) {
-                $extraction .= $this->extractOrGetFromCache($file, $extractor_plugin);
-              }
-            }
-            $field->addValue($extraction);
+        }
+      }
+
+      $fids = $this->limitToAllowedNumber($all_fids);
+
+      // Retrieve the files.
+      $files = $this->entityTypeManager
+        ->getStorage('file')
+        ->loadMultiple($fids);
+
+      if (!empty($files)) {
+        foreach ($files as $file) {
+          if ($this->isFileIndexable($file, $item, $field)) {
+            $field->addValue($this->extractOrGetFromCache($file, $extractor_plugin));
           }
         }
       }
@@ -359,32 +339,6 @@ class FilesExtrator extends ProcessorPluginBase implements PluginFormInterface {
   }
 
   /**
-   * Get the file fields of indexed bundles and an entity file general item.
-   *
-   * @return array
-   *   An array of file field with field name as key and label as value and
-   *   an element for generic file entity item.
-   */
-  protected function getFileFieldsAndFileEntityItems() {
-    $file_elements = [];
-
-    // Retrieve file fields of indexed bundles.
-    foreach ($this->getIndex()->getDatasources() as $datasource) {
-      if ($datasource->getPluginId() == 'entity:file') {
-        $file_elements[static::SAA_FILE_ENTITY] = $this->t('File entity');
-      }
-      foreach ($datasource->getPropertyDefinitions() as $property) {
-        if ($property instanceof FieldDefinitionInterface) {
-          if ($property->getType() == 'file') {
-            $file_elements[$property->getName()] = $property->getLabel();
-          }
-        }
-      }
-    }
-    return $file_elements;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
diff --git a/src/Plugin/search_api/processor/Property/FilesExtractorProperty.php b/src/Plugin/search_api/processor/Property/FilesExtractorProperty.php
new file mode 100644
index 0000000..8c47613
--- /dev/null
+++ b/src/Plugin/search_api/processor/Property/FilesExtractorProperty.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Drupal\search_api_attachments\Plugin\search_api\processor\Property;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\search_api\IndexInterface;
+use Drupal\search_api\Item\FieldInterface;
+use Drupal\search_api\Processor\ConfigurablePropertyBase;
+use Drupal\search_api\Processor\ConfigurablePropertyInterface;
+use Drupal\search_api\Utility\Utility;
+use Drupal\search_api_attachments\Plugin\search_api\processor\FilesExtrator;
+
+/**
+ * Defines an "files extractor" property.
+ */
+class FilesExtractorProperty extends ConfigurablePropertyBase {
+
+  use StringTranslationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'fields' => [],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(FieldInterface $field, array $form, FormStateInterface $form_state) {
+    $index = $field->getIndex();
+    $configuration = $field->getConfiguration();
+
+    $form['#attached']['library'][] = 'search_api/drupal.search_api.admin_css';
+    $form['#tree'] = TRUE;
+
+    $form['fields'] = [
+      '#type' => 'checkboxes',
+      '#title' => $this->t('Extracted fields'),
+      '#options' => [],
+      '#attributes' => ['class' => ['search-api-checkboxes-list']],
+      '#default_value' => $configuration['fields'],
+      '#required' => TRUE,
+    ];
+
+    $fields = $index->getFields();
+    /** @var \Drupal\search_api\Item\FieldInterface $field */
+    foreach ($fields as $field) {
+      $data_type = $field->getDataDefinition()->getDataType();
+      if ($data_type != 'field_item:file') {
+        continue;
+      }
+
+      $field_options[$field->getFieldIdentifier()] = $field->getPrefixedLabel();
+
+      $form['fields'][$field->getFieldIdentifier()] = [
+        '#description' => $field->getFieldIdentifier(),
+      ];
+    }
+
+    // Set the field options in a way that sorts them first by whether they are
+    // selected (to quickly see which one are included) and second by their
+    // labels.
+    asort($field_options, SORT_NATURAL);
+    $selected = array_flip($configuration['fields']);
+    $form['fields']['#options'] = array_intersect_key($field_options, $selected);
+    $form['fields']['#options'] += array_diff_key($field_options, $selected);
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(FieldInterface $field, array &$form, FormStateInterface $form_state) {
+    $values = [
+      'fields' => array_keys(array_filter($form_state->getValue('fields'))),
+    ];
+    $field->setConfiguration($values);
+  }
+}
