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..6bec1b8 100644
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ b/core/modules/field/tests/modules/field_test/field_test.module
@@ -156,13 +156,14 @@ function field_test_query_efq_metadata_test_alter(&$query) {
 }
 
 /**
- * Implements hook_field_widget_settings_form_alter().
+ * Implements hook_field_widget_third_party_settings_form().
  */
-function field_test_field_widget_settings_form_alter(&$element, &$form_state, $context) {
-  $element['field_test_widget_settings_form_alter'] = array(
+function field_test_field_widget_third_party_settings_form($element, $form_state, $context) {
+  $third_party = $context['widget']->getSetting('third_party_settings');
+  $element['field_test_field_widget_third_party_settings_form'] = array(
     '#type' => 'textfield',
-    '#title' => t('Widget settings form alter'),
-    '#default_value' => $context['widget']->getSetting('field_test_widget_settings_form_alter'),
+    '#title' => t('3rd party widget settings form'),
+    '#default_value' => $third_party['field_test'],
   );
 }
 
@@ -175,14 +176,16 @@ 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'],
   );
+  return $element;
 }
 
 /**
diff --git a/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php
index 255ce85..830acff 100644
--- a/core/modules/field_ui/field_ui.api.php
+++ b/core/modules/field_ui/field_ui.api.php
@@ -24,11 +24,14 @@
  *   - view_mode: The view mode being configured.
  *   - form: The (entire) configuration form array.
  *
+ *  @return array
+ *    Returns the form array to be built.
+ *
  * @see \Drupal\field_ui\DisplayOverView.
  */
-function hook_field_formatter_settings_form_alter(&$element, &$form_state, $context) {
-  // Add a 'mysetting' checkbox to the settings form for 'foo_formatter'
-  // field formatters.
+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') {
     $element['mysetting'] = array(
       '#type' => 'checkbox',
@@ -36,6 +39,7 @@ function hook_field_formatter_settings_form_alter(&$element, &$form_state, $cont
       '#default_value' => $context['formatter']->getSetting('mysetting'),
     );
   }
+  return $element;
 }
 
 /**
@@ -47,29 +51,34 @@ function hook_field_formatter_settings_form_alter(&$element, &$form_state, $cont
  *   The form state of the (entire) configuration form.
  * @param array $context
  *   An associative array with the following elements:
- *   - formatter: The formatter object.
+ *   - widget: The widget object.
  *   - field_definition: The field definition.
  *   - form_mode: The form mode being configured.
  *   - form: The (entire) configuration form array.
  *
+ *  @return array
+ *    Returns the form array to be built.
+ *
  * @see \Drupal\field_ui\FormDisplayOverView.
  */
-function hook_field_widget_settings_form_alter(&$element, &$form_state, $context) {
-  // Add a 'mysetting' checkbox to the settings form for 'foo_field' fields.
-  if ($context['field']['type'] == 'foo_field') {
+function hook_field_widget_third_party_settings_form($element, $form_state, $context) {
+  // Add a 'mysetting' checkbox to the settings form for 'foo_widget' field
+  //  widgets.
+  if ($context['formatter'] == 'foo_widget') {
     $element['mysetting'] = array(
       '#type' => 'checkbox',
       '#title' => t('My setting'),
-      '#default_value' => $context['formatter']->getSetting('mysetting'),
+      '#default_value' => $context['widget']->getSetting('mysetting'),
     );
   }
+  return $element;
 }
 
 /**
  * Alters the field formatter settings summary.
  *
- * @param $summary
- *   The summary.
+ * @param array $summary
+ *   An array of summary messages.
  * @param $context
  *   An associative array with the following elements:
  *   - formatter: The formatter object.
@@ -92,7 +101,7 @@ function hook_field_formatter_settings_summary_alter(&$summary, $context) {
  * Alters the field widget settings summary.
  *
  * @param array $summary
- *   The summary.
+ *   An array of summary messages.
  * @param array $context
  *   An associative array with the following elements:
  *   - widget: The widget object.
@@ -102,9 +111,9 @@ function hook_field_formatter_settings_summary_alter(&$summary, $context) {
  * @see \Drupal\field_ui\FormDisplayOverView.
  */
 function hook_field_widget_settings_summary_alter(&$summary, $context) {
-  // Append a message to the summary when an instance of foo_field has
-  // mysetting set to TRUE for the current view mode.
-  if ($context['field']['type'] == 'foo_field') {
+  // Append a message to the summary when an instance of foo_widget has
+  // mysetting set to TRUE for the current form mode.
+  if ($context['widget'] == 'foo_widget') {
     if ($context['widget']->getSetting('mysetting')) {
       $summary[] = t('My setting enabled.');
     }
diff --git a/core/modules/field_ui/src/DisplayOverview.php b/core/modules/field_ui/src/DisplayOverview.php
index 956d15f..cb9b199 100644
--- a/core/modules/field_ui/src/DisplayOverview.php
+++ b/core/modules/field_ui/src/DisplayOverview.php
@@ -237,7 +237,18 @@ 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):
+    $settings_form['third_party'] = array();
+    foreach ($this->moduleHandler->getImplementations('field_formatter_third_party_settings_form') as $module) {
+      $third_party_settings = $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['third_party'][$module] = $third_party_settings;
+    }
   }
 
   /**
diff --git a/core/modules/field_ui/src/DisplayOverviewBase.php b/core/modules/field_ui/src/DisplayOverviewBase.php
index 2a6f46f..f0d2931 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);
+        $additional_settings_form = array();
+        $this->alterSettingsForm($additional_settings_form, $plugin, $field_definition, $form, $form_state);
+        if (!empty($additional_settings_form)) {
+          $settings_form['wrapper'] = array(
+            '#type' => 'container',
+          );
+          $settings_form['wrapper'] += $additional_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/FormDisplayOverview.php b/core/modules/field_ui/src/FormDisplayOverview.php
index 7c0a5ff..a80b3a0 100644
--- a/core/modules/field_ui/src/FormDisplayOverview.php
+++ b/core/modules/field_ui/src/FormDisplayOverview.php
@@ -189,7 +189,18 @@ protected function alterSettingsForm(array &$settings_form, $plugin, FieldDefini
       'form_mode' => $this->mode,
       'form' => $form,
     );
-    $this->moduleHandler->alter('field_widget_settings_form', $settings_form, $form_state, $context);
+    // Iterate through the modules calling their
+    // field_formatter_third_party_settings_form handlers (if any):
+    $settings_form['third_party'] = array();
+    foreach ($this->moduleHandler->getImplementations('field_widget_third_party_settings_form') as $module) {
+      $third_party_settings = $this->moduleHandler->invoke($module, 'field_widget_third_party_settings_form', array(
+        $settings_form,
+        $form_state,
+        $context,
+      ));
+      // Index the settings form by module name.
+      $settings_form['third_party'][$module] = $third_party_settings;
+    }
   }
 
   /**
diff --git a/core/modules/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
index c98d52d..6d935f3 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][wrapper][third_party][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, '');
 
@@ -193,13 +193,13 @@ public function testWidgetUI() {
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
 
     // 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]';
-    $this->assertField($fieldname, 'The field added in hook_field_widget_settings_form_alter() is present on the settings form.');
+    // field_test_field_widget_third_party_settings_form() is present.
+    $fieldname = 'fields[field_test][settings_edit_form][settings][wrapper][third_party][field_test][field_test_field_widget_third_party_settings_form]';
+    $this->assertField($fieldname, 'The field added in hook_field_widget_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 are not updated on the settings form.
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
     $this->assertFieldByName($fieldname, '');
   }
