diff --git a/diff.routing.yml b/diff.routing.yml
index eea3670..538f7ec 100644
--- a/diff.routing.yml
+++ b/diff.routing.yml
@@ -28,7 +28,15 @@ diff.node_settings:
 diff.field_types_list:
   path: '/admin/config/content/diff/fields'
   defaults:
-    _form: '\Drupal\diff\Form\FieldTypesSettingsForm'
+    _form: '\Drupal\diff\Form\FieldsSettingsForm'
     _title: Field Type Settings
   requirements:
     _permission: 'administer site configuration'
+
+diff.fields_list:
+  path: '/admin/config/content/diff/fields'
+  defaults:
+    _form: '\Drupal\diff\Form\FieldsSettingsForm'
+    _title: Fields Settings
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/src/FieldDiffBuilderBase.php b/src/FieldDiffBuilderBase.php
index b57cc74..939e105 100644
--- a/src/FieldDiffBuilderBase.php
+++ b/src/FieldDiffBuilderBase.php
@@ -118,6 +118,7 @@ abstract class FieldDiffBuilderBase extends PluginBase implements FieldDiffBuild
     $this->configuration['show_header'] = $form_state->getValue('show_header');
     $this->configuration['markdown'] = $form_state->getValue('markdown');
     $this->configuration['#field_type'] = $form_state->get('field_type');
+    $this->configuration['#fields'] = $form_state->get('fields');
     $this->setConfiguration($this->configuration);
     $this->getConfiguration()->save();
   }
diff --git a/src/Form/FieldsSettingsForm.php b/src/Form/FieldsSettingsForm.php
new file mode 100644
index 0000000..5d7c796
--- /dev/null
+++ b/src/Form/FieldsSettingsForm.php
@@ -0,0 +1,457 @@
+<?php
+
+namespace Drupal\diff\Form;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Form\FormState;
+
+/**
+ * This form lists all the field types from the system and for every field type
+ * it provides a select-box having as options all the FieldDiffBuilder plugins
+ * that support that field type.
+ */
+class FieldsSettingsForm extends ConfigFormBase {
+
+  /**
+   * Wrapper object for writing/reading configuration from diff.plugins.yml
+   */
+  protected $config;
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The field type plugin manager service.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $fieldTypePluginManager;
+
+  /**
+   * The field diff plugin manager service.
+   *
+   * @var \Drupal\diff\DiffBuilderManager
+   */
+  protected $diffBuilderManager;
+
+  /**
+   * Constructs a FieldTypesListSettingsForm object.
+   *
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $plugin_manager
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $diffBuilderManager
+   */
+  public function __construct(PluginManagerInterface $plugin_manager, PluginManagerInterface $diffBuilderManager, EntityManagerInterface $entityManager) {
+    $this->config = $this->config('diff.settings');
+    $this->fieldTypePluginManager = $plugin_manager;
+    $this->diffBuilderManager = $diffBuilderManager;
+    $this->entityManager = $entityManager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.field.field_type'),
+      $container->get('plugin.manager.diff.builder'),
+      $container->get('entity.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'diff_admin_plugins';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    return [
+      'diff.plugins',
+      'diff.settings',
+      'diff.field_plugins'
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildForm($form, $form_state);
+    // The table containing all the field types discovered in the system.
+    $form['fields'] = array(
+      '#type' => 'table',
+      '#tree' => TRUE,
+      '#header' => $this->getTableHeader(),
+      '#empty' => $this->t('No field types found.'),
+      '#prefix' => '<div id="field-display-overview-wrapper">',
+      '#suffix' => '</div>',
+      '#attributes' => array(
+        'class' => array('field-ui-overview'),
+        'id' => 'field-display-overview',
+      ),
+    );
+
+    // Get the definition of all @FieldDiffBuilder plugins.
+    $diff_plugin_definitions = $this->diffBuilderManager->getDefinitions();
+    $plugins = array();
+    foreach ($diff_plugin_definitions as $plugin_definition) {
+      if (isset($plugin_definition['field_types'])) {
+        // Iterate through all the field types this plugin supports
+        // and for every such field type add the id of the plugin.
+        foreach ($plugin_definition['field_types'] as $id) {
+          $plugins[$id][] = $plugin_definition['id'];
+        }
+      }
+    }
+    // Get all the field type plugins.
+    $field_definitions = $this->entityManager->getFieldStorageDefinitions('node');
+
+    foreach ($field_definitions as $field_name => $field_definition) {
+      // Build a row in the table for every field type.
+      $form['fields'][$field_name] = $this->buildFieldRow($field_definition, $plugins, $diff_plugin_definitions, $form_state);
+    }
+
+    $form['#attached']['library'][] = 'diff/diff.general';
+
+    return $form;
+  }
+
+  protected function buildFieldRow($field_definition, $plugins, $diff_plugin_definitions, FormStateInterface $form_state) {
+    $field_label = $field_definition->getLabel();
+    $field_name = $field_definition->getName();
+    $field_type = $field_definition->getType();
+
+
+    $display_options = $this->config->get('fields.' . $field_type);
+    // Build a list of all the diff plugins supporting this field.
+    $plugin_options = [];
+    if (isset($plugins[$field_type])) {
+      foreach ($plugins[$field_type] as $id) {
+        $plugin_options[$id] = $diff_plugin_definitions[$id]['label'];
+      }
+    }
+
+    // Base button element for the various plugin settings actions.
+    $base_button = [
+      '#submit' => [[$this, 'multistepSubmit']],
+      '#ajax' => [
+        'callback' => [$this, 'multiStepAjax'],
+        'wrapper' => 'field-display-overview-wrapper',
+        'effect' => 'fade',
+      ],
+      '#field_name' => $field_name,
+      '#field_type' => $field_type,
+    ];
+
+    $field_row['field_label'] = [
+      '#markup' => $field_label,
+    ];
+
+    $field_row['field_type'] = [
+      '#markup' => $field_type,
+    ];
+
+    // Check the currently selected plugin, and merge persisted values for its
+    // settings.
+    if ($type = $form_state->getValue(['fields', $field_name, 'plugin', 'type'])) {
+      $display_options['type'] = $type;
+    }
+
+    $plugin_settings = $form_state->get('plugin_settings');
+    if (isset($plugin_settings[$field_name]['settings'])) {
+      $modified = FALSE;
+      if (!empty($display_options['settings'])) {
+        foreach ($display_options['settings'] as $key => $value) {
+          if ($plugin_settings[$field_name]['settings'][$key] != $value) {
+            $modified = TRUE;
+            break;
+          }
+        }
+      }
+      // In case settings are not identical to the ones in the config display
+      // a warning message. Don't display it twice.
+      if ($modified && empty($_SESSION['messages']['warning'])) {
+        drupal_set_message($this->t('You have unsaved changes.'), 'warning', FALSE);
+      }
+      $display_options['settings'] = $plugin_settings[$field_name]['settings'];
+    }
+
+    $field_row['plugin'] = array(
+      'type' => array(
+        '#type' => 'select',
+        '#options' => $plugin_options,
+        '#empty_option' => $this->t("- Don't compare -"),
+        '#empty_value' => 'hidden',
+        '#title_display' => 'invisible',
+        '#attributes' => array(
+          'class' => array('field-plugin-type'),
+        ),
+        '#default_value' => $display_options ? $display_options['type'] : 'hidden',
+        '#ajax' => array(
+          'callback' => array($this, 'multiStepAjax'),
+          'method' => 'replace',
+          'wrapper' => 'field-display-overview-wrapper',
+          'effect' => 'fade',
+        ),
+        '#field_type' => $field_type,
+        '#field_name' => $field_name,
+      ),
+      'settings_edit_form' => array(),
+    );
+
+    // Get a configured instance of the plugin.
+    $plugin = $this->getPlugin($display_options);
+
+    // We are currently editing this field's plugin settings. Display the
+    // settings form and submit buttons.
+    if ($form_state->get('plugin_settings_edit') == $field_name) {
+      $field_row['plugin']['settings_edit_form'] = array(
+        '#type' => 'container',
+        '#attributes' => array('class' => array('field-plugin-settings-edit-form')),
+        '#parents' => array('fields', $field_name, 'settings_edit_form'),
+        'label' => array(
+          '#markup' => $this->t('Plugin settings:' . ' <span class="plugin-name">' . $plugin_options[$display_options['type']] . '</span>'),
+        ),
+        'settings' => $plugin->buildConfigurationForm(array(), $form_state),
+        'actions' => array(
+          '#type' => 'actions',
+          'save_settings' => $base_button + array(
+              '#type' => 'submit',
+              '#button_type' => 'primary',
+              '#name' => $field_name . '_plugin_settings_update',
+              '#value' => $this->t('Update'),
+              '#op' => 'update',
+            ),
+          'cancel_settings' => $base_button + array(
+              '#type' => 'submit',
+              '#name' => $field_name . '_plugin_settings_cancel',
+              '#value' => $this->t('Cancel'),
+              '#op' => 'cancel',
+              // Do not check errors for the 'Cancel' button, but make sure we
+              // get the value of the 'plugin type' select.
+              '#limit_validation_errors' => array(array('fields', $field_name, 'plugin', 'type')),
+            ),
+        ),
+      );
+      $field_row['settings_edit'] = array();
+      $field_row['#attributes']['class'][] = 'field-plugin-settings-editing';
+    }
+    else {
+      $field_row['settings_edit'] = [];
+      // Display the configure settings button only if a plugin is selected.
+      if ($plugin) {
+        $field_row['settings_edit'] = $base_button + array(
+            '#type' => 'image_button',
+            '#name' => $field_name . '_settings_edit',
+            '#src' => 'core/misc/icons/787878/pencil.svg',
+            '#attributes' => array('class' => array('field-plugin-settings-edit'), 'alt' => $this->t('Edit')),
+            '#op' => 'edit',
+            // Do not check errors for the 'Edit' button, but make sure we get
+            // the value of the 'plugin type' select.
+            '#limit_validation_errors' => array(array('fields', $field_name, 'plugin', 'type')),
+            '#prefix' => '<div class="field-plugin-settings-edit-wrapper">',
+            '#suffix' => '</div>',
+          );
+      }
+    }
+
+    return $field_row;
+  }
+
+  public function multistepSubmit($form, FormStateInterface $form_state) {
+    $trigger = $form_state->getTriggeringElement();
+    $op = $trigger['#op'];
+
+    switch ($op) {
+      case 'edit':
+        // Store the field whose settings are currently being edited.
+        $field_name = $trigger['#field_name'];
+        $form_state->set('plugin_settings_edit', $field_name);
+        break;
+
+      case 'update':
+        // Store the saved settings, and set the field back to 'non edit' mode.
+        $field_name = $trigger['#field_name'];
+        if ($plugin_settings = $form_state->getValue(array('fields', $field_name, 'settings_edit_form', 'settings'))) {
+          $form_state->set(['plugin_settings', $field_name, 'settings'], $plugin_settings);
+        }
+        $form_state->set('plugin_settings_edit', NULL);
+        break;
+
+      case 'cancel':
+        // Set the field back to 'non edit' mode.
+        $form_state->set('plugin_settings_edit', NULL);
+        break;
+    }
+
+    $form_state->setRebuild();
+  }
+
+  public function multiStepAjax(array $form, FormStateInterface $form_state) {
+    $trigger = $form_state->getTriggeringElement();
+    if (isset($trigger['#op'])) {
+      $op = $trigger['#op'];
+
+      // Pick the elements that need to receive the ajax-new-content effect.
+      switch ($op) {
+        case 'edit':
+          $updated_rows = array($trigger['#field_name']);
+          $updated_columns = array('plugin');
+          break;
+
+        case 'update':
+        case 'cancel':
+          $updated_rows = array($trigger['#field_name']);
+          $updated_columns = array('plugin', 'settings_edit');
+          break;
+      }
+
+      foreach ($updated_rows as $name) {
+        foreach ($updated_columns as $key) {
+          $element = &$form['fields'][$name][$key];
+          $element['#prefix'] = '<div class="ajax-new-content">' . (isset($element['#prefix']) ? $element['#prefix'] : '');
+          $element['#suffix'] = (isset($element['#suffix']) ? $element['#suffix'] : '') . '</div>';
+        }
+      }
+    }
+    // Return the whole table.
+    return $form['fields'];
+  }
+
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    $form_values = $form_state->getValues();
+    $plugin_settings = $form_state->get('plugin_settings');
+    $fields = $form_values['fields'];
+
+    foreach ($fields as $field_name => $field_values) {
+      // Validate only non-null plugins.
+      if ($field_values['plugin']['type'] != 'hidden') {
+        $settings = array();
+        $key = NULL;
+        // Form submitted without pressing update button on plugin settings form.
+        if (isset($field_values['settings_edit_form']['settings'])) {
+          $settings = $field_values['settings_edit_form']['settings'];
+          $key = 1;
+        }
+        // Form submitted after settings were updated.
+        elseif (isset($plugin_settings[$field_name]['settings'])) {
+          $settings = $plugin_settings[$field_name]['settings'];
+          $key = 2;
+        }
+        if (!empty($settings)) {
+          // Build a new Form State object and populate it with values.
+          $state = new FormState();
+          $state->setValues($settings);
+          $state->set('fields', $field_name);
+          $plugin = $this->diffBuilderManager->createInstance($field_values['plugin']['type'], array());
+          // Send the values to the plugins form validate handler.
+          $plugin->validateConfigurationForm($form, $state);
+          // Assign the validation messages back to the big table.
+          if ($key == 1) {
+            $form_state->setValue(['fields', $field_name, 'settings_edit_form', 'settings'], $state->getValues());
+          }
+          elseif ($key == 2) {
+            $form_state->set(['plugin_settings', $field_name, 'settings'], $state->getValues());
+          }
+        }
+      }
+    }
+  }
+
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $form_values = $form_state->getValues();
+    $plugin_settings = $form_state->get('plugin_settings');
+    $fields = $form_values['fields'];
+
+    // Remove from configuration the keys of the field types which have no
+    // plugin selected. We need to clear this keys from configuration first
+    // and then save the settings for the fields which have a plugin selected.
+    // If we do both writing and clearing in the same for, the values won't get
+    // saved.
+    foreach ($fields as $field_name => $field_values) {
+      // If there is no plugin selected remove the key from config file.
+      if ($field_values['plugin']['type'] == 'hidden') {
+        $this->config->clear('fields.' . $field_name);
+      }
+    }
+    $this->config->save();
+    // For field types that have a plugin selected save the settings.
+    foreach ($fields as $field_name => $field_values) {
+      if ($field_values['plugin']['type'] != 'hidden') {
+        // Get plugin settings. They lie either directly in submitted form
+        // values (if the whole form was submitted while some plugin settings
+        // were being edited), or have been persisted in $form_state.
+        $plugin = $this->diffBuilderManager->createInstance($field_values['plugin']['type']);
+        // Form submitted without pressing update button on plugin settings form.
+        if (isset($field_values['settings_edit_form']['settings'])) {
+          $settings = $field_values['settings_edit_form']['settings'];
+        }
+        // Form submitted after settings were updated.
+        elseif (isset($plugin_settings[$field_name]['settings'])) {
+          $settings = $plugin_settings[$field_name]['settings'];
+        }
+        // If the settings are not set anywhere in the form state just save the
+        // default configuration for the current plugin.
+        else {
+          $settings = $plugin->defaultConfiguration();
+        }
+
+
+        //return drupal_set_message();
+        $this->config->set('entity.node' . '.' . $field_name, $fields[$field_name]);
+        $this->config->save();
+        // Build a FormState object and call the plugin submit handler.
+        $state = new FormState();
+        $state->setValues($settings);
+        $state->set('fields', $field_name);
+
+        $plugin->submitConfigurationForm($form, $state);
+
+      }
+    }
+    //drupal_set_message($this->t('Your settings have been saved.'));
+
+  }
+
+  /**
+   * Returns a plugin object or NULL if no plugin could be found.
+   */
+  protected function getPlugin($configuration) {
+    $plugin = NULL;
+
+    if ($configuration && isset($configuration['type']) && $configuration['type'] != 'hidden') {
+      if (!isset($configuration['settings'])) {
+        $configuration['settings'] = array();
+      }
+      $plugin = $this->diffBuilderManager->createInstance(
+        $configuration['type'], $configuration['settings']
+      );
+    }
+
+    return $plugin;
+  }
+
+  /**
+   * Returns the header for the table.
+   */
+  protected function getTableHeader() {
+    return array(
+      'field_name' => $this->t('Field'),
+      'field_type' => $this->t('Field Type'),
+      'plugin' => $this->t('Plugin'),
+      'settings_edit' => $this->t(''),
+    );
+  }
+}
