diff --git a/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php b/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php
index 11f2246..37b9986 100644
--- a/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php
+++ b/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php
@@ -66,12 +66,4 @@ class FieldFormatter extends Plugin {
    */
   public $field_types = array();
 
-  /**
-   * An array whose keys are the names of the settings available to the
-   * formatter type, and whose values are the default values for those settings.
-   *
-   * @var array
-   */
-  public $settings = array();
-
 }
diff --git a/core/lib/Drupal/Core/Field/FormatterBase.php b/core/lib/Drupal/Core/Field/FormatterBase.php
index 35bbf33..5a9b386 100644
--- a/core/lib/Drupal/Core/Field/FormatterBase.php
+++ b/core/lib/Drupal/Core/Field/FormatterBase.php
@@ -41,6 +41,13 @@
   protected $viewMode;
 
   /**
+   * Denotes whether the plugin has an additional options form.
+   *
+   * @var bool
+   */
+  protected $usesOptions = FALSE;
+
+  /**
    * Constructs a FormatterBase object.
    *
    * @param string $plugin_id
@@ -68,6 +75,20 @@ public function __construct($plugin_id, array $plugin_definition, FieldDefinitio
   /**
    * {@inheritdoc}
    */
+  public static function defineOptions() {
+    return array();
+  }
+
+  /**
+   * Returns the usesOptions property.
+   */
+  public function usesOptions() {
+    return $this->usesOptions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function view(FieldItemListInterface $items) {
     $addition = array();
 
diff --git a/core/lib/Drupal/Core/Field/FormatterInterface.php b/core/lib/Drupal/Core/Field/FormatterInterface.php
index fa63372..afc5515 100644
--- a/core/lib/Drupal/Core/Field/FormatterInterface.php
+++ b/core/lib/Drupal/Core/Field/FormatterInterface.php
@@ -13,6 +13,14 @@
 interface FormatterInterface extends PluginSettingsInterface {
 
   /**
+   * Information about options for all kinds of purposes will be held here.
+   *
+   * @return array
+   *   The options of this formatter plugin.
+   */
+  public static function defineOptions();
+
+  /**
    * Returns a form to configure settings for the formatter.
    *
    * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
diff --git a/core/lib/Drupal/Core/Field/FormatterPluginManager.php b/core/lib/Drupal/Core/Field/FormatterPluginManager.php
index c30ab0e..0437383 100644
--- a/core/lib/Drupal/Core/Field/FormatterPluginManager.php
+++ b/core/lib/Drupal/Core/Field/FormatterPluginManager.php
@@ -196,8 +196,12 @@ public function getOptions($field_type = NULL) {
    *   definition, or an empty array if type or settings are undefined.
    */
   public function getDefaultSettings($type) {
-    $info = $this->getDefinition($type);
-    return isset($info['settings']) ? $info['settings'] : array();
+    $plugin_definition = $this->getDefinition($type);
+    if (!empty($plugin_definition['class'])) {
+      $plugin_class = DefaultFactory::getPluginClass($type, $plugin_definition);
+      return $plugin_class::defineOptions();
+    }
+    return array();
   }
 
 }
diff --git a/core/lib/Drupal/Core/Field/PluginSettingsBase.php b/core/lib/Drupal/Core/Field/PluginSettingsBase.php
index 895563a..1ee3eab 100644
--- a/core/lib/Drupal/Core/Field/PluginSettingsBase.php
+++ b/core/lib/Drupal/Core/Field/PluginSettingsBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Field;
 
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
 
 /**
  * Base class for the Field API plugins.
@@ -65,7 +66,11 @@ protected function mergeDefaults() {
    */
   public function getDefaultSettings() {
     $definition = $this->getPluginDefinition();
-    return $definition['settings'];
+    if (!empty($plugin_definition['class'])) {
+      $plugin_class = DefaultFactory::getPluginClass($this->getPluginId(), $definition);
+      return $plugin_class::defineOptions();
+    }
+    return array();
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php
index e73a34f..f1c4289 100644
--- a/core/lib/Drupal/Core/Field/WidgetBase.php
+++ b/core/lib/Drupal/Core/Field/WidgetBase.php
@@ -31,6 +31,13 @@
   protected $settings;
 
   /**
+   * Denotes whether the plugin has an additional options form.
+   *
+   * @var bool
+   */
+  protected $usesOptions = FALSE;
+
+  /**
    * Constructs a WidgetBase object.
    *
    * @param array $plugin_id
@@ -51,6 +58,20 @@ public function __construct($plugin_id, array $plugin_definition, FieldDefinitio
   /**
    * {@inheritdoc}
    */
+  public static function defineOptions() {
+    return array();
+  }
+
+  /**
+   * Returns the usesOptions property.
+   */
+  public function usesOptions() {
+    return $this->usesOptions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function form(FieldItemListInterface $items, array &$form, array &$form_state, $get_delta = NULL) {
     $field_name = $this->fieldDefinition->getName();
     $parents = $form['#parents'];
diff --git a/core/lib/Drupal/Core/Field/WidgetInterface.php b/core/lib/Drupal/Core/Field/WidgetInterface.php
index a05f1d4..38cb3f0 100644
--- a/core/lib/Drupal/Core/Field/WidgetInterface.php
+++ b/core/lib/Drupal/Core/Field/WidgetInterface.php
@@ -20,6 +20,14 @@
 interface WidgetInterface extends WidgetBaseInterface {
 
   /**
+   * Information about options for all kinds of purposes will be held here.
+   *
+   * @return array
+   *   The options of this widget plugin.
+   */
+  public static function defineOptions();
+
+  /**
    * Returns a form to configure settings for the widget.
    *
    * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
diff --git a/core/lib/Drupal/Core/Field/WidgetPluginManager.php b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
index 5ca455a..d9d9a36 100644
--- a/core/lib/Drupal/Core/Field/WidgetPluginManager.php
+++ b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
@@ -200,8 +200,13 @@ public function getOptions($field_type = NULL) {
    *   definition, or an empty array if type or settings are undefined.
    */
   public function getDefaultSettings($type) {
-    $info = $this->getDefinition($type);
-    return isset($info['settings']) ? $info['settings'] : array();
+    $plugin_definition = $this->getDefinition($type);
+    if (!empty($plugin_definition['class'])) {
+      $plugin_class = DefaultFactory::getPluginClass($type, $plugin_definition);
+      return $plugin_class::defineOptions();
+    }
+
+    return array();
   }
 
 }
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
index 3250990..b69b9da 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
@@ -28,14 +28,22 @@
  *   },
  *   edit = {
  *     "editor" = "disabled"
- *   },
- *   settings = {
- *     "pager_id" = 0
  *   }
  * )
  */
 class CommentDefaultFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['pager_id'] = 0;
+    return $options;
+  }
+
   /**
    * The comment storage controller.
    *
diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
index 1a235dc..2056313 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
@@ -24,14 +24,22 @@
  *   label = @Translation("Default"),
  *   field_types = {
  *     "datetime"
- *   },
- *   settings = {
- *     "format_type" = "medium",
  *   }
  * )
  */
 class DateTimeDefaultFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['format_type'] = 'medium';
+    return $options;
+  }
+
   /**
    * The date service.
    *
diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php
index cbae23c..3c02a50 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php
@@ -18,16 +18,24 @@
  *   label = @Translation("Select list"),
  *   field_types = {
  *     "datetime"
- *   },
- *   settings = {
- *     "increment" = 15,
- *     "date_order" = "YMD",
- *     "time_type" = "24",
  *   }
  * )
  */
 class DateTimeDatelistWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['increment'] = '15';
+    $options['date_order'] = 'YMD';
+    $options['time_type'] = '24';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/email/lib/Drupal/email/Plugin/Field/FieldWidget/EmailDefaultWidget.php b/core/modules/email/lib/Drupal/email/Plugin/Field/FieldWidget/EmailDefaultWidget.php
index 62db527..5571535 100644
--- a/core/modules/email/lib/Drupal/email/Plugin/Field/FieldWidget/EmailDefaultWidget.php
+++ b/core/modules/email/lib/Drupal/email/Plugin/Field/FieldWidget/EmailDefaultWidget.php
@@ -18,14 +18,22 @@
  *   label = @Translation("E-mail"),
  *   field_types = {
  *     "email"
- *   },
- *   settings = {
- *     "placeholder" = ""
  *   }
  * )
  */
 class EmailDefaultWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
index 40e3c39..1ea7112 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
@@ -19,15 +19,23 @@
  *   description = @Translation("Display the referenced entities rendered by entity_view()."),
  *   field_types = {
  *     "entity_reference"
- *   },
- *   settings = {
- *     "view_mode" = "default",
- *     "link" = FALSE
  *   }
  * )
  */
 class EntityReferenceEntityFormatter extends EntityReferenceFormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['view_mode'] = 'default';
+    $options['link'] = FALSE;
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceLabelFormatter.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceLabelFormatter.php
index ea13e17..c088df5 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceLabelFormatter.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceLabelFormatter.php
@@ -18,14 +18,22 @@
  *   description = @Translation("Display the label of the referenced entities."),
  *   field_types = {
  *     "entity_reference"
- *   },
- *   settings = {
- *     "link" = TRUE
  *   }
  * )
  */
 class EntityReferenceLabelFormatter extends EntityReferenceFormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['link'] = TRUE;
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
index 2367fa1..a868131 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
@@ -17,17 +17,25 @@
  *   field_types = {
  *     "entity_reference"
  *   },
- *   settings = {
- *     "match_operator" = "CONTAINS",
- *     "size" = 60,
- *     "autocomplete_type" = "tags",
- *     "placeholder" = ""
- *   },
  *   multiple_values = TRUE
  * )
  */
 class AutocompleteTagsWidget extends AutocompleteWidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['match_operator'] = 'CONTAINS';
+    $options['size'] = '60';
+    $options['autocomplete_type'] = 'tags';
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidget.php
index 0898d68..d2ce307 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidget.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidget.php
@@ -23,17 +23,25 @@
  *   description = @Translation("An autocomplete text field."),
  *   field_types = {
  *     "entity_reference"
- *   },
- *   settings = {
- *     "match_operator" = "CONTAINS",
- *     "size" = 60,
- *     "autocomplete_type" = "single",
- *     "placeholder" = ""
  *   }
  * )
  */
 class AutocompleteWidget extends AutocompleteWidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['match_operator'] = 'CONTAINS';
+    $options['size'] = '60';
+    $options['autocomplete_type'] = 'tags';
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php
index 457c76f..77e6917 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php
@@ -19,14 +19,22 @@
  *   description = @Translation("Default formatter"),
  *   field_types = {
  *     "test_field"
- *   },
- *   settings = {
- *     "test_formatter_setting" = "dummy test string"
  *   }
  * )
  */
 class TestFieldDefaultFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_formatter_setting'] = 'dummy test string';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php
index 592a958..064797a 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php
@@ -18,14 +18,22 @@
  *   label = @Translation("Field empty test"),
  *   field_types = {
  *     "test_field",
- *   },
- *   settings = {
- *     "test_empty_string" = "**EMPTY FIELD**"
  *   }
  * )
  */
 class TestFieldEmptyFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_empty_string'] = '**EMPTY FIELD**';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php
index e825aa8..85218fc 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php
@@ -18,14 +18,22 @@
  *   label = @Translation("Field empty setting"),
  *   field_types = {
  *     "test_field",
- *   },
- *   settings = {
- *     "field_empty_setting" = ""
  *   }
  * )
  */
 class TestFieldEmptySettingFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['field_empty_setting'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php
index 588ad66..da8ba58 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php
@@ -19,14 +19,22 @@
  *   description = @Translation("Multiple formatter"),
  *   field_types = {
  *     "test_field"
- *   },
- *   settings = {
- *     "test_formatter_setting_multiple" = "dummy test string"
  *   }
  * )
  */
 class TestFieldMultipleFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_formatter_setting_multiple'] = 'dummy test string';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php
index a8ff2a9..529876d 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php
@@ -19,14 +19,22 @@
  *   description = @Translation("Tests prepareView() method"),
  *   field_types = {
  *     "test_field"
- *   },
- *   settings = {
- *     "test_formatter_setting_additional" = "dummy test string"
  *   }
  * )
  */
 class TestFieldPrepareViewFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_formatter_setting_additional'] = 'dummy test string';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php
index bf6e093..1b3f428 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php
@@ -20,14 +20,22 @@
  *   field_types = {
  *      "test_field",
  *      "hidden_test_field"
- *   },
- *   settings = {
- *     "test_widget_setting" = "dummy test string"
  *   }
  * )
  */
 class TestFieldWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_widget_setting'] = 'dummy test string';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php
index be8fed9..a44e4d2 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php
@@ -22,14 +22,22 @@
  * @FieldWidget(
  *   id = "test_field_widget_multiple",
  *   label = @Translation("Test widget - multiple"),
- *   settings = {
- *     "test_widget_setting_multiple" = "dummy test string"
- *   },
  *   multiple_values = TRUE
  * )
  */
 class TestFieldWidgetMultiple extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_widget_setting_multiple'] = 'dummy test string';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
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 2ed54e8..b855c0c 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
@@ -396,8 +396,7 @@ protected function buildFieldRow(FieldDefinitionInterface $field_definition, Ent
         }
 
         // Check selected plugin settings to display edit link or not.
-        $plugin_definition = $plugin->getPluginDefinition();
-        if ($plugin_definition['settings']) {
+        if ($plugin->usesOptions()) {
           $field_row['settings_edit'] = $base_button + array(
             '#type' => 'image_button',
             '#name' => $field_name . '_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 4a25ca6..68e5a21 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
@@ -197,10 +197,11 @@ function testViewModeCustom() {
     $node = $this->drupalCreateNode($settings);
 
     // Gather expected output values with the various formatters.
-    $formatters = \Drupal::service('plugin.manager.field.formatter')->getDefinitions();
+    $field_test_default_settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default');
+    $field_test_with_prepare_view_settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_with_prepare_view');
     $output = array(
-      'field_test_default' => $formatters['field_test_default']['settings']['test_formatter_setting'] . '|' . $value,
-      'field_test_with_prepare_view' => $formatters['field_test_with_prepare_view']['settings']['test_formatter_setting_additional'] . '|' . $value. '|' . ($value + 1),
+      'field_test_default' => $field_test_default_settings['test_formatter_setting'] . '|' . $value,
+      'field_test_with_prepare_view' => $field_test_with_prepare_view_settings['test_formatter_setting_additional'] . '|' . $value. '|' . ($value + 1),
     );
 
     // Check that the field is displayed with the default formatter in 'rss'
diff --git a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldWidget/FileWidget.php b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldWidget/FileWidget.php
index 5c976ed..1f23419 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldWidget/FileWidget.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldWidget/FileWidget.php
@@ -21,14 +21,22 @@
  *   label = @Translation("File"),
  *   field_types = {
  *     "file"
- *   },
- *   settings = {
- *     "progress_indicator" = "throbber"
  *   }
  * )
  */
 class FileWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['progress_indicator'] = 'throbber';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatter.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatter.php
index 6a9a44e..58294c2 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatter.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatter.php
@@ -17,15 +17,23 @@
  *   label = @Translation("Image"),
  *   field_types = {
  *     "image"
- *   },
- *   settings = {
- *     "image_style" = "",
- *     "image_link" = ""
  *   }
  * )
  */
 class ImageFormatter extends ImageFormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['image_style'] = '';
+    $options['image_link'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php
index 94528ae..cceb4a6 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php
@@ -19,15 +19,23 @@
  *   label = @Translation("Image"),
  *   field_types = {
  *     "image"
- *   },
- *   settings = {
- *     "progress_indicator" = "throbber",
- *     "preview_image_style" = "thumbnail",
  *   }
  * )
  */
 class ImageWidget extends FileWidget {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['progress_indicator'] = 'throbber';
+    $options['preview_image_style'] = 'thumbnail';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkFormatter.php b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkFormatter.php
index 111ce34..c266e05 100644
--- a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkFormatter.php
+++ b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkFormatter.php
@@ -20,18 +20,26 @@
  *   label = @Translation("Link"),
  *   field_types = {
  *     "link"
- *   },
- *   settings = {
- *     "trim_length" = "80",
- *     "url_only" = "",
- *     "url_plain" = "",
- *     "rel" = "",
- *     "target" = ""
  *   }
  * )
  */
 class LinkFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['trim_length'] = '80';
+    $options['url_only'] = '';
+    $options['url_plain'] = '';
+    $options['rel'] = '';
+    $options['target'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkSeparateFormatter.php b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkSeparateFormatter.php
index 4392123..84024ed 100644
--- a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkSeparateFormatter.php
+++ b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldFormatter/LinkSeparateFormatter.php
@@ -22,16 +22,24 @@
  *   label = @Translation("Separate link text and URL"),
  *   field_types = {
  *     "link"
- *   },
- *   settings = {
- *     "trim_length" = "80",
- *     "rel" = "",
- *     "target" = ""
  *   }
  * )
  */
 class LinkSeparateFormatter extends LinkFormatter {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['trim_length'] = '80';
+    $options['rel'] = '';
+    $options['target'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldWidget/LinkWidget.php b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldWidget/LinkWidget.php
index dc10574..cf0a3cd 100644
--- a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldWidget/LinkWidget.php
+++ b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldWidget/LinkWidget.php
@@ -18,15 +18,23 @@
  *   label = @Translation("Link"),
  *   field_types = {
  *     "link"
- *   },
- *   settings = {
- *     "placeholder_url" = "",
- *     "placeholder_title" = ""
  *   }
  * )
  */
 class LinkWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['placeholder_url'] = '';
+    $options['placeholder_title'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberDecimalFormatter.php b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberDecimalFormatter.php
index 1fe9c72..1c0b701 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberDecimalFormatter.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberDecimalFormatter.php
@@ -20,17 +20,25 @@
  *   field_types = {
  *     "number_decimal",
  *     "number_float"
- *   },
- *   settings = {
- *     "thousand_separator" = "",
- *     "decimal_separator" = ".",
- *     "scale" = "2",
- *     "prefix_suffix" = "TRUE"
  *   }
  * )
  */
 class NumberDecimalFormatter extends DefaultNumberFormatter {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['thousand_separator'] = '';
+    $options['decimal_separator'] = '.';
+    $options['scale'] = 2;
+    $options['prefix_suffix'] = TRUE;
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberIntegerFormatter.php b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberIntegerFormatter.php
index 53ff874..b0902a9 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberIntegerFormatter.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldFormatter/NumberIntegerFormatter.php
@@ -19,15 +19,23 @@
  *   label = @Translation("Default"),
  *   field_types = {
  *     "number_integer"
- *   },
- *   settings = {
- *     "thousand_separator" = "",
- *     "prefix_suffix" = "TRUE"
  *   }
  * )
  */
 class NumberIntegerFormatter extends DefaultNumberFormatter {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['thousand_separator'] = '';
+    $options['prefix_suffix'] = TRUE;
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldWidget/NumberWidget.php b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldWidget/NumberWidget.php
index 436e2cd..7423daa 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldWidget/NumberWidget.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldWidget/NumberWidget.php
@@ -21,14 +21,22 @@
  *     "number_integer",
  *     "number_decimal",
  *     "number_float"
- *   },
- *   settings = {
- *     "placeholder" = ""
  *   }
  * )
  */
 class NumberWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OnOffWidget.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OnOffWidget.php
index 34b741e..517a409 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OnOffWidget.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OnOffWidget.php
@@ -19,14 +19,22 @@
  *   field_types = {
  *     "list_boolean"
  *   },
- *   settings = {
- *     "display_label" = FALSE,
- *   },
  *   multiple_values = TRUE
  * )
  */
 class OnOffWidget extends OptionsWidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['display_label'] = FALSE;
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php b/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
index eb1864d..f593ea8 100644
--- a/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
+++ b/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
@@ -18,16 +18,24 @@
  *   label = @Translation("Picture"),
  *   field_types = {
  *     "image",
- *   },
- *   settings = {
- *     "picture_mapping" = "",
- *     "fallback_image_style" = "",
- *     "image_link" = "",
  *   }
  * )
  */
 class PictureFormatter extends ImageFormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['picture_mapping'] = '';
+    $options['fallback_image_style'] = '';
+    $options['image_link'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.install b/core/modules/system/tests/modules/entity_test/entity_test.install
index a03acf0..f480676 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.install
+++ b/core/modules/system/tests/modules/entity_test/entity_test.install
@@ -32,7 +32,7 @@ function entity_test_install() {
     ))->save();
 
     entity_get_form_display($entity_type, $entity_type, 'default')
-      ->setComponent('field_test_text', array('type' => 'text_text'))
+      ->setComponent('field_test_text', array('type' => 'text_textfield'))
       ->save();
   }
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php
index 7c20732..4a6246f 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php
@@ -19,16 +19,24 @@
  *   field_types = {
  *     "taxonomy_term_reference"
  *   },
- *   settings = {
- *     "size" = "60",
- *     "autocomplete_route_name" = "taxonomy.autocomplete",
- *     "placeholder" = ""
- *   },
  *   multiple_values = TRUE
  * )
  */
 class TaxonomyAutocompleteWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['size'] = '60';
+    $options['autocomplete_route_name'] = 'taxonomy.autocomplete';
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php b/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php
index 436a4fc..3b3a337 100644
--- a/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php
+++ b/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php
@@ -18,14 +18,22 @@
  *   label = @Translation("Telephone link"),
  *   field_types = {
  *     "telephone"
- *   },
- *   settings = {
- *     "title" = ""
  *   }
  * )
  */
 class TelephoneLinkFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['title'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php b/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php
index 78c768e..e8eb0a6 100644
--- a/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php
+++ b/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php
@@ -18,14 +18,21 @@
  *   label = @Translation("Telephone number"),
  *   field_types = {
  *     "telephone"
- *   },
- *   settings = {
- *     "placeholder" = ""
  *   }
  * )
  */
 class TelephoneDefaultWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['placeholder'] = '';
+    return $options;
+  }
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextSummaryOrTrimmedFormatter.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextSummaryOrTrimmedFormatter.php
index baebdc1..71b2088 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextSummaryOrTrimmedFormatter.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextSummaryOrTrimmedFormatter.php
@@ -16,9 +16,6 @@
  *   field_types = {
  *     "text_with_summary"
  *   },
- *   settings = {
- *     "trim_length" = "600"
- *   },
  *   edit = {
  *     "editor" = "form"
  *   }
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextTrimmedFormatter.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextTrimmedFormatter.php
index 8100e7b..88b7b13 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextTrimmedFormatter.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextTrimmedFormatter.php
@@ -25,9 +25,6 @@
  *     "text_long",
  *     "text_with_summary"
  *   },
- *   settings = {
- *     "trim_length" = "600"
- *   },
  *   edit = {
  *     "editor" = "form"
  *   }
@@ -35,6 +32,17 @@
  */
 class TextTrimmedFormatter extends FormatterBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['trim_length'] = '600';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWidget.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWidget.php
index 9752a1f..67883ef 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWidget.php
@@ -19,15 +19,23 @@
  *   label = @Translation("Text area (multiple rows)"),
  *   field_types = {
  *     "text_long"
- *   },
- *   settings = {
- *     "rows" = "5",
- *     "placeholder" = ""
  *   }
  * )
  */
 class TextareaWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['rows'] = '5';
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWithSummaryWidget.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWithSummaryWidget.php
index 2490ed2..9e747e2 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWithSummaryWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextareaWithSummaryWidget.php
@@ -19,16 +19,24 @@
  *   label = @Translation("Text area with a summary"),
  *   field_types = {
  *     "text_with_summary"
- *   },
- *   settings = {
- *     "rows" = "9",
- *     "summary_rows" = "3",
- *     "placeholder" = ""
  *   }
  * )
  */
 class TextareaWithSummaryWidget extends TextareaWidget {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['rows'] = '9';
+    $options['summary_rows'] = '3';
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
index b35e633..c84e3bf 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
@@ -19,15 +19,23 @@
  *   label = @Translation("Text field"),
  *   field_types = {
  *     "text"
- *   },
- *   settings = {
- *     "size" = "60",
- *     "placeholder" = ""
  *   }
  * )
  */
 class TextfieldWidget extends WidgetBase {
 
+  protected $usesOptions = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defineOptions() {
+    $options = parent::defineOptions();
+    $options['size'] = '60';
+    $options['placeholder'] = '';
+    return $options;
+  }
+
   /**
    * {@inheritdoc}
    */
