diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module
index 45a0c0d..29b1442 100644
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ b/core/modules/field/tests/modules/field_test/field_test.module
@@ -159,10 +159,11 @@ function field_test_query_efq_metadata_test_alter(&$query) {
  * Implements hook_field_widget_settings_form_alter().
  */
 function field_test_field_widget_settings_form_alter(&$element, &$form_state, $context) {
+  $third_party = $context['widget']->getSetting('third_party_settings');
   $element['field_test_widget_settings_form_alter'] = array(
     '#type' => 'textfield',
     '#title' => t('Widget settings form alter'),
-    '#default_value' => $context['widget']->getSetting('field_test_widget_settings_form_alter'),
+    '#default_value' => $third_party['field_test_widget_settings_form_alter'],
   );
 }
 
@@ -175,13 +176,14 @@ function field_test_field_widget_settings_summary_alter(&$summary, $context) {
 }
 
 /**
- * Implements hook_field_formatter_settings_form_alter().
+ * Implements hook_field_formatter_third_party_settings_form().
  */
-function field_test_field_formatter_settings_form_alter(&$element, &$form_state, $context) {
-  $element['field_test_formatter_settings_form_alter'] = array(
+function field_test_field_formatter_third_party_settings_form(&$element, &$form_state, $context) {
+  $third_party = $context['formatter']->getSetting('third_party_settings');
+  $element['field_test_field_formatter_third_party_settings_form'] = array(
     '#type' => 'textfield',
-    '#title' => t('Formatter settings form alter'),
-    '#default_value' => $context['formatter']->getSetting('field_test_formatter_settings_form_alter'),
+    '#title' => t('3rd party formatter settings form'),
+    '#default_value' => $third_party['field_test_field_formatter_third_party_settings_form'],
   );
 }
 
diff --git a/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php
index 255ce85..1be4488 100644
--- a/core/modules/field_ui/field_ui.api.php
+++ b/core/modules/field_ui/field_ui.api.php
@@ -26,7 +26,7 @@
  *
  * @see \Drupal\field_ui\DisplayOverView.
  */
-function hook_field_formatter_settings_form_alter(&$element, &$form_state, $context) {
+function hook_field_formatter_third_party_settings_form(&$element, &$form_state, $context) {
   // Add a 'mysetting' checkbox to the settings form for 'foo_formatter'
   // field formatters.
   if ($context['formatter']->getPluginId() == 'foo_formatter') {
diff --git a/core/modules/field_ui/src/DisplayOverview.php b/core/modules/field_ui/src/DisplayOverview.php
index 956d15f..d5c6c50 100644
--- a/core/modules/field_ui/src/DisplayOverview.php
+++ b/core/modules/field_ui/src/DisplayOverview.php
@@ -237,7 +237,17 @@ protected function alterSettingsForm(array &$settings_form, $plugin, FieldDefini
       'view_mode' => $this->mode,
       'form' => $form,
     );
-    $this->moduleHandler->alter('field_formatter_settings_form', $settings_form, $form_state, $context);
+    // Iterate through the modules calling their
+    // field_formatter_third_party_settings_form handlers (if any):
+    foreach ($this->moduleHandler->getImplementations('field_formatter_third_party_settings_form') as $module) {
+      $this->moduleHandler->invoke($module, 'field_formatter_third_party_settings_form', array(
+        $settings_form,
+        $form_state,
+        $context,
+      ));
+      // Index the settings form by module name.
+      $settings_form = array($module => $settings_form);
+    }
   }
 
   /**
diff --git a/core/modules/field_ui/src/DisplayOverviewBase.php b/core/modules/field_ui/src/DisplayOverviewBase.php
index 2a6f46f..e4ba065 100644
--- a/core/modules/field_ui/src/DisplayOverviewBase.php
+++ b/core/modules/field_ui/src/DisplayOverviewBase.php
@@ -348,7 +348,14 @@ protected function buildFieldRow(FieldDefinitionInterface $field_definition, Ent
       if ($plugin) {
         // Generate the settings form and allow other modules to alter it.
         $settings_form = $plugin->settingsForm($form, $form_state);
-        $this->alterSettingsForm($settings_form, $plugin, $field_definition, $form, $form_state);
+        $third_party_settings_form = array();
+        $this->alterSettingsForm($third_party_settings_form, $plugin, $field_definition, $form, $form_state);
+        if (!empty($third_party_settings_form)) {
+          $settings_form['third_party_settings'] = array(
+            '#type' => 'container',
+          );
+          $settings_form['third_party_settings'] += $third_party_settings_form;
+        }
 
         if ($settings_form) {
           $field_row['plugin']['#cell_attributes'] = array('colspan' => 3);
@@ -524,7 +531,11 @@ public function submitForm(array &$form, array &$form_state) {
 
         // Only save settings actually used by the selected plugin.
         $default_settings = $this->pluginManager->getDefaultSettings($values['type']);
+        $third_party = !empty($settings['third_party_settings']) ? $settings['third_party_settings'] : array();
         $settings = array_intersect_key($settings, $default_settings);
+        if (!empty($third_party)) {
+          $settings['third_party_settings'] = $third_party;
+        }
 
         // Default component values.
         $component_values = array(
diff --git a/core/modules/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
index c98d52d..8501103 100644
--- a/core/modules/field_ui/src/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
@@ -100,13 +100,13 @@ function testFormatterUI() {
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
 
     // Assert that the field added in
-    // field_test_field_formatter_settings_form_alter() is present.
-    $fieldname = 'fields[field_test][settings_edit_form][settings][field_test_formatter_settings_form_alter]';
-    $this->assertField($fieldname, 'The field added in hook_field_formatter_settings_form_alter() is present on the settings form.');
+    // field_test_field_formatter_third_party_settings_form() is present.
+    $fieldname = 'fields[field_test][settings_edit_form][settings][field_test][field_test_field_formatter_third_party_settings_form]';
+    $this->assertField($fieldname, 'The field added in hook_field_formatter_third_party_settings_form() is present on the settings form.');
     $edit = array($fieldname => 'foo');
     $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
 
-    // Confirm that the extra settings are not updated on the settings form.
+    // Confirm that the third_party_settings settings are not updated on the settings form.
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
     $this->assertFieldByName($fieldname, '');
 
@@ -194,12 +194,12 @@ public function testWidgetUI() {
 
     // Assert that the field added in
     // field_test_field_widget_settings_form_alter() is present.
-    $fieldname = 'fields[field_test][settings_edit_form][settings][field_test_widget_settings_form_alter]';
+    $fieldname = 'fields[field_test][settings_edit_form][settings][third_party_settings][field_test][field_test_widget_settings_form_alter]';
     $this->assertField($fieldname, 'The field added in hook_field_widget_settings_form_alter() is present on the settings form.');
     $edit = array($fieldname => 'foo');
     $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
 
-    // Confirm that the extra settings are not updated on the settings form.
+    // Confirm that the third_party_settings settings are not updated on the settings form.
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
     $this->assertFieldByName($fieldname, '');
   }
