diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterInterface.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterInterface.php
index 8a38c20..55fd2f0 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterInterface.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterInterface.php
@@ -35,9 +35,8 @@ public function settingsForm(array $form, array &$form_state);
   /**
    * Returns a short summary for the current formatter settings.
    *
-   * If an empty result is returned, the formatter is assumed to have no
-   * configurable settings, and no UI will be provided to display a settings
-   * form.
+   * If an empty result is returned, a UI can still be provided to display
+   * a settings form in case the formatter has configurable settings.
    *
    * @return array()
    *   A short summary of the formatter settings.
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php
index a64915c..6dc7c02 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php
@@ -40,9 +40,8 @@ public function settingsForm(array $form, array &$form_state);
   /**
    * Returns a short summary for the current widget settings.
    *
-   * If an empty result is returned, the widget is assumed to have no
-   * configurable settings, and no UI will be provided to display a settings
-   * form.
+   * If an empty result is returned, a UI can still be provided to display
+   * a settings form in case the widget has configurable settings.
    *
    * @return array
    *   A short summary of the widget settings.
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/field/formatter/TestFieldEmptySettingFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/field/formatter/TestFieldEmptySettingFormatter.php
new file mode 100644
index 0000000..76ad40c
--- /dev/null
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/field/formatter/TestFieldEmptySettingFormatter.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Drupal\field_test\Plugin\field\formatter;
+
+use Drupal\field\Annotation\FieldFormatter;
+use Drupal\Core\Annotation\Translation;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\Field\FieldInterface;
+use Drupal\field\Plugin\Type\Formatter\FormatterBase;
+
+/**
+ * Plugin implementation of the 'field_empty_setting' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "field_empty_setting",
+ *   label = @Translation("Field empty setting"),
+ *   field_types = {
+ *     "test_field",
+ *   },
+ *   settings = {
+ *     "field_empty_setting" = ""
+ *   }
+ * )
+ */
+class TestFieldEmptySettingFormatter extends FormatterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, array &$form_state) {
+    $element['field_empty_setting'] = array(
+      '#title' => t('Setting'),
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#default_value' => $this->getSetting('field_empty_setting'),
+      '#required' => TRUE,
+    );
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = array();
+    $setting = $this->getSetting('field_empty_setting');
+    if (!empty($setting)) {
+      $summary[] = t('Default empty setting now has a value.');
+    }
+    return $summary;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldInterface $items) {
+    $elements = array();
+
+    if (!empty($items)) {
+      foreach ($items as $delta => $item) {
+        $elements[$delta] = array('#markup' => $this->getSetting('field_empty_setting'));
+      }
+    }
+
+    return $elements;
+  }
+}
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
index 3f9adea..a157bc1 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
@@ -355,6 +355,8 @@ protected function buildFieldRow($field_id, FieldInstanceInterface $instance, En
             '#markup' => '<div class="field-plugin-summary">' . implode('<br />', $summary) . '</div>',
             '#cell_attributes' => array('class' => array('field-plugin-summary-cell')),
           );
+        }
+        if ($plugin->getSettings()) {
           $field_row['settings_edit'] = $base_button + array(
             '#type' => 'image_button',
             '#name' => $field_id . '_settings_edit',
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
index daf263e..dc888ff 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
@@ -93,6 +93,17 @@ function testFormatterUI() {
     // Confirm that the settings are updated on the settings form.
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
     $this->assertFieldByName($fieldname, 'foo');
+
+    // Test the empty setting formatter.
+    $edit = array('fields[field_test][type]' => 'field_empty_setting');
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->assertNoText('Default empty setting now has a value.');
+    $this->assertFieldById('edit-fields-field-test-settings-edit');
+    $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
+    $fieldname = 'fields[field_test][settings_edit_form][settings][field_empty_setting]';
+    $edit = array($fieldname => 'non empty setting');
+    $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
+    $this->assertText('Default empty setting now has a value.');
   }
 
   /**
