diff --git a/src/DiffBuilderManager.php b/src/DiffBuilderManager.php
index a9b5c1d..e5094be 100644
--- a/src/DiffBuilderManager.php
+++ b/src/DiffBuilderManager.php
@@ -182,7 +182,7 @@ class DiffBuilderManager extends DefaultPluginManager {
     $selected_plugin = $this->pluginsConfig->get('fields.' . $field_key);
     // Check if the plugin stored to the fields is still applicable.
     if (!$selected_plugin || !in_array($selected_plugin['type'], array_keys($plugin_options))) {
-      if (!empty($plugin_options)) {
+      if (!empty($plugin_options) && $selected_plugin['type'] != 'hidden') {
         $selected_plugin['type'] = array_keys($plugin_options)[0];
       }
       else {
diff --git a/src/Form/FieldsSettingsForm.php b/src/Form/FieldsSettingsForm.php
index 4794b9e..320da8a 100644
--- a/src/Form/FieldsSettingsForm.php
+++ b/src/Form/FieldsSettingsForm.php
@@ -445,6 +445,7 @@ class FieldsSettingsForm extends ConfigFormBase {
     $this->config->save();
     // Save the settings, for fields which have a plugin selected.
     foreach ($fields as $field_key => $field_values) {
+      $settings = NULL;
       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
@@ -460,15 +461,17 @@ class FieldsSettingsForm extends ConfigFormBase {
         }
         // If the settings are not set anywhere in the form state just save the
         // default configuration for the current plugin.
-        else {
+        elseif(!isset($plugin_settings)) {
           $settings = $plugin->defaultConfiguration();
         }
         // Build a FormState object and call the plugin submit handler.
-        $state = new FormState();
-        $state->setValues($settings);
-        $state->set('fields', $field_key);
+        if ($settings) {
+          $state = new FormState();
+          $state->setValues($settings);
+          $state->set('fields', $field_key);
 
-        $plugin->submitConfigurationForm($form, $state);
+          $plugin->submitConfigurationForm($form, $state);
+        }
       }
     }
 
diff --git a/src/Tests/DiffAdminFormsTest.php b/src/Tests/DiffAdminFormsTest.php
index dca15df..d3e0cbb 100644
--- a/src/Tests/DiffAdminFormsTest.php
+++ b/src/Tests/DiffAdminFormsTest.php
@@ -102,9 +102,33 @@ class DiffAdminFormsTest extends DiffTestBase {
       'fields[node.body][settings_edit_form][settings][compare_format]' => TRUE,
       'fields[node.body][settings_edit_form][settings][markdown]' => 'filter_xss_all',
     ];
-    $this->drupalPostForm(NULL, $edit, t('Update'));
+    $this->drupalPostAjaxForm(NULL, $edit, 'node.body_plugin_settings_update');
     $this->drupalPostForm(NULL, [], t('Save'));
     $this->assertText('Your settings have been saved.');
+
+    // Check the values were saved.
+    $this->drupalPostAjaxForm(NULL, [], 'node.body_settings_edit');
+    $this->assertFieldByName('fields[node.body][settings_edit_form][settings][markdown]', 'filter_xss_all');
+
+    // Edit another field.
+    $this->drupalPostAjaxForm(NULL, [], 'node.title_settings_edit');
+    $edit = [
+      'fields[node.title][settings_edit_form][settings][markdown]' => 'filter_xss_all',
+    ];
+    $this->drupalPostAjaxForm(NULL, $edit, 'node.title_plugin_settings_update');
+    $this->drupalPostForm(NULL, [], t('Save'));
+
+    // Check both fields and their config values.
+    $this->drupalPostAjaxForm(NULL, [], 'node.body_settings_edit');
+    $this->assertFieldByName('fields[node.body][settings_edit_form][settings][markdown]', 'filter_xss_all');
+    $this->drupalPostAjaxForm(NULL, [], 'node.title_settings_edit');
+    $this->assertFieldByName('fields[node.title][settings_edit_form][settings][markdown]', 'filter_xss_all');
+
+    $edit = [
+      'fields[node.sticky][plugin][type]' => 'hidden',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->assertFieldByName('fields[node.sticky][plugin][type]', 'hidden');
   }
 
   /**
