diff --git a/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php b/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php
index fc4a4c4..067f54d 100644
--- a/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php
+++ b/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php
@@ -67,14 +67,6 @@ 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();
-
-  /**
    * An integer to determine the weight of this formatter relative to other
    * formatter in the Field UI when selecting a formatter for a given field
    * instance.
diff --git a/core/lib/Drupal/Core/Field/Annotation/FieldType.php b/core/lib/Drupal/Core/Field/Annotation/FieldType.php
index 5bf9bb1..276cd0b 100644
--- a/core/lib/Drupal/Core/Field/Annotation/FieldType.php
+++ b/core/lib/Drupal/Core/Field/Annotation/FieldType.php
@@ -52,33 +52,6 @@ class FieldType extends DataType {
   public $description;
 
   /**
-   * An array of field-level settings available for the field type.
-   *
-   * Keys are the names of the settings, and values are the default values for
-   * those settings.
-   *
-   * @var array
-   */
-  public $settings;
-
-  /**
-   * An array of instance-level settings available for the field type.
-   *
-   * Keys are the names of the settings, and values are the default values for
-   * those settings.
-   *
-   * Instance-level settings can have different values on each field instance,
-   * and thus allow greater flexibility than field-level settings. It is
-   * recommended to put settings at the instance level whenever possible.
-   * Notable exceptions: settings acting on the storage schema, or settings that
-   * Views needs to use across field instances (for example, settings defining
-   * the list of allowed values for the field).
-   *
-   * @var array
-   */
-  public $instance_settings;
-
-  /**
    * The plugin_id of the default widget for this field type.
    *
    * This widget must be available whenever the field type is available (i.e.
diff --git a/core/lib/Drupal/Core/Field/Annotation/FieldWidget.php b/core/lib/Drupal/Core/Field/Annotation/FieldWidget.php
index 982c92e..0f3535d 100644
--- a/core/lib/Drupal/Core/Field/Annotation/FieldWidget.php
+++ b/core/lib/Drupal/Core/Field/Annotation/FieldWidget.php
@@ -66,14 +66,6 @@ class FieldWidget extends Plugin {
   public $field_types = array();
 
   /**
-   * An array whose keys are the names of the settings available to the widget
-   * type, and whose values are the default values for those settings.
-   *
-   * @var array
-   */
-  public $settings = array();
-
-  /**
    * Does the field widget handles multiple values at once.
    *
    * @var bool
diff --git a/core/lib/Drupal/Core/Field/FieldItemBase.php b/core/lib/Drupal/Core/Field/FieldItemBase.php
index fce6089..33ec95c 100644
--- a/core/lib/Drupal/Core/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Field/FieldItemBase.php
@@ -26,6 +26,20 @@
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    return array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    return array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function mainPropertyName() {
     return 'value';
   }
diff --git a/core/lib/Drupal/Core/Field/FieldItemInterface.php b/core/lib/Drupal/Core/Field/FieldItemInterface.php
index ae7bf6c..58d816c 100644
--- a/core/lib/Drupal/Core/Field/FieldItemInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldItemInterface.php
@@ -213,6 +213,22 @@ public function delete();
   public function deleteRevision();
 
   /**
+   * Defines the field-level settings for this plugin.
+   *
+   * @return array
+   *   A list of default settings, keyed by the setting name.
+   */
+  public static function defaultSettings();
+
+  /**
+   * Defines the instance-level settings for this plugin.
+   *
+   * @return array
+   *   A list of default settings, keyed by the setting name.
+   */
+  public static function defaultInstanceSettings();
+
+  /**
    * Returns a form for the field-level settings.
    *
    * Invoked from \Drupal\field_ui\Form\FieldEditForm to allow administrators to
diff --git a/core/lib/Drupal/Core/Field/FieldTypePluginManager.php b/core/lib/Drupal/Core/Field/FieldTypePluginManager.php
index 5fceb17..07aaceb 100644
--- a/core/lib/Drupal/Core/Field/FieldTypePluginManager.php
+++ b/core/lib/Drupal/Core/Field/FieldTypePluginManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Field;
 
+use Drupal\Component\Plugin\Factory\DefaultFactory;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageManager;
@@ -18,14 +19,6 @@
 class FieldTypePluginManager extends DefaultPluginManager implements FieldTypePluginManagerInterface {
 
   /**
-   * {@inheritdoc}
-   */
-  protected $defaults = array(
-    'settings' => array(),
-    'instance_settings' => array(),
-  );
-
-  /**
    * Constructs the FieldTypePluginManager object
    *
    * @param \Traversable $namespaces
@@ -58,16 +51,24 @@ public function processDefinition(&$definition, $plugin_id) {
    * {@inheritdoc}
    */
   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::defaultSettings();
+    }
+    return array();
   }
 
   /**
    * {@inheritdoc}
    */
   public function getDefaultInstanceSettings($type) {
-    $info = $this->getDefinition($type);
-    return isset($info['instance_settings']) ? $info['instance_settings'] : array();
+    $plugin_definition = $this->getDefinition($type);
+    if (!empty($plugin_definition['class'])) {
+      $plugin_class = DefaultFactory::getPluginClass($type, $plugin_definition);
+      return $plugin_class::defaultInstanceSettings();
+    }
+    return array();
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Field/FormatterPluginManager.php b/core/lib/Drupal/Core/Field/FormatterPluginManager.php
index b39a822..85e9589 100644
--- a/core/lib/Drupal/Core/Field/FormatterPluginManager.php
+++ b/core/lib/Drupal/Core/Field/FormatterPluginManager.php
@@ -201,8 +201,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::defaultSettings();
+    }
+    return array();
   }
 
 }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/DecimalFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/DecimalFormatter.php
index ae595d0..9f8c971 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/DecimalFormatter.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/DecimalFormatter.php
@@ -20,12 +20,6 @@
  *   field_types = {
  *     "decimal",
  *     "float"
- *   },
- *   settings = {
- *     "thousand_separator" = "",
- *     "decimal_separator" = ".",
- *     "scale" = "2",
- *     "prefix_suffix" = "TRUE"
  *   }
  * )
  */
@@ -34,6 +28,18 @@ class DecimalFormatter extends NumericFormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['thousand_separator'] = '';
+    $settings['decimal_separator'] = '.';
+    $settings['scale'] = 2;
+    $settings['prefix_suffix'] = TRUE;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $elements = parent::settingsForm($form, $form_state);
 
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/IntegerFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/IntegerFormatter.php
index 7849031..415e324 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/IntegerFormatter.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/IntegerFormatter.php
@@ -19,10 +19,6 @@
  *   label = @Translation("Default"),
  *   field_types = {
  *     "integer"
- *   },
- *   settings = {
- *     "thousand_separator" = "",
- *     "prefix_suffix" = "TRUE"
  *   }
  * )
  */
@@ -31,6 +27,16 @@ class IntegerFormatter extends NumericFormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['thousand_separator'] = '';
+    $settings['prefix_suffix'] = TRUE;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function numberFormat($number) {
     return number_format($number, 0, '', $this->getSetting('thousand_separator'));
   }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php
index 0d8dee4..75f3fa7 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php
@@ -17,16 +17,6 @@
  *   id = "decimal",
  *   label = @Translation("Number (decimal)"),
  *   description = @Translation("This field stores a number in the database in a fixed decimal format."),
- *   settings = {
- *     "precision" = "10",
- *     "scale" = "2"
- *   },
- *   instance_settings = {
- *     "min" = "",
- *     "max" = "",
- *     "prefix" = "",
- *     "suffix" = ""
- *   },
  *   default_widget = "number",
  *   default_formatter = "number_decimal"
  * )
@@ -36,6 +26,16 @@ class DecimalItem extends NumericItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['precision'] = 10;
+    $settings['scale'] = 2;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['value'] = DataDefinition::create('string')
       ->setLabel(t('Decimal value'));
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
index 788da68..737f250 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
@@ -35,6 +35,25 @@ class EntityReferenceItem extends FieldItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['target_type'] = \Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user';
+    $settings['target_bundle'] = NULL;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['handler'] = 'default';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $settings = $field_definition->getSettings();
     $target_type_info = \Drupal::entityManager()->getDefinition($settings['target_type']);
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/FloatItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/FloatItem.php
index 2d9511b..eda49cc 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/FloatItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/FloatItem.php
@@ -17,12 +17,6 @@
  *   id = "float",
  *   label = @Translation("Number (float)"),
  *   description = @Translation("This field stores a number in the database in a floating point format."),
- *   instance_settings = {
- *     "min" = "",
- *     "max" = "",
- *     "prefix" = "",
- *     "suffix" = ""
- *   },
  *   default_widget = "number",
  *   default_formatter = "number_decimal"
  * )
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/IntegerItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/IntegerItem.php
index 31f3bc6..f22e060 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/IntegerItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/IntegerItem.php
@@ -17,12 +17,6 @@
  *   id = "integer",
  *   label = @Translation("Number (integer)"),
  *   description = @Translation("This field stores a number in the database as an integer."),
- *   instance_settings = {
- *     "min" = "",
- *     "max" = "",
- *     "prefix" = "",
- *     "suffix" = ""
- *   },
  *   default_widget = "number",
  *   default_formatter = "number_integer"
  * )
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
index c1270c4..32d63ec 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
@@ -17,6 +17,18 @@
   /**
    * {@inheritdoc}
    */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['min'] = '';
+    $settings['max'] = '';
+    $settings['prefix'] = '';
+    $settings['suffix'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function instanceSettingsForm(array $form, array &$form_state) {
     $element = array();
     $settings = $this->getSettings();
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
index c20e2e9..8fbad2b 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
@@ -18,9 +18,6 @@
  *   id = "string",
  *   label = @Translation("String"),
  *   description = @Translation("An entity field containing a string value."),
- *   settings = {
- *     "max_length" = "255"
- *   },
  *   no_ui = TRUE,
  *   default_widget = "string",
  *   default_formatter = "string"
@@ -31,6 +28,15 @@ class StringItem extends FieldItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['max_length'] = 255;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['value'] = DataDefinition::create('string')
       ->setLabel(t('Text value'));
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php
index d1a69af..ce0d84e 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php
@@ -21,9 +21,6 @@
  *   id = "uri",
  *   label = @Translation("URI"),
  *   description = @Translation("An entity field containing a URI."),
- *   settings = {
- *     "max_length" = "2048"
- *   },
  *   no_ui = TRUE
  * )
  */
@@ -32,6 +29,15 @@ class UriItem extends StringItem {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['max_length'] = 2048;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['value'] = DataDefinition::create('uri')
       ->setLabel(t('URI value'));
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
index 90b0bca..f7a7e54 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
@@ -16,9 +16,6 @@
  *   id = "uuid",
  *   label = @Translation("UUID"),
  *   description = @Translation("An entity field containing a UUID."),
- *   settings = {
- *     "max_length" = "128"
- *   },
  *   no_ui = TRUE
  * )
  */
@@ -27,6 +24,15 @@ class UuidItem extends StringItem {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['max_length'] = 128;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function applyDefaultValue($notify = TRUE) {
     // Default to one field item with a generated UUID.
     $uuid = \Drupal::service('uuid');
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php
index c273bd8..9d7618a 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php
@@ -18,9 +18,6 @@
  *   label = @Translation("E-mail"),
  *   field_types = {
  *     "email"
- *   },
- *   settings = {
- *     "placeholder" = ""
  *   }
  * )
  */
@@ -29,6 +26,15 @@ class EmailDefaultWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['placeholder'] = array(
       '#type' => 'textfield',
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php
index 82c8d37..b26bf73 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php
@@ -21,9 +21,6 @@
  *     "integer",
  *     "decimal",
  *     "float"
- *   },
- *   settings = {
- *     "placeholder" = ""
  *   }
  * )
  */
@@ -32,6 +29,15 @@ class NumberWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['placeholder'] = array(
       '#type' => 'textfield',
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php
index 524e89d..dc6eaaa 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php
@@ -18,10 +18,6 @@
  *   label = @Translation("String field"),
  *   field_types = {
  *     "string"
- *   },
- *   settings = {
- *     "size" = "60",
- *     "placeholder" = ""
  *   }
  * )
  */
@@ -30,6 +26,16 @@ class StringWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['size'] = 60;
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['size'] = array(
       '#type' => 'number',
diff --git a/core/lib/Drupal/Core/Field/PluginSettingsBase.php b/core/lib/Drupal/Core/Field/PluginSettingsBase.php
index 895563a..d57434f 100644
--- a/core/lib/Drupal/Core/Field/PluginSettingsBase.php
+++ b/core/lib/Drupal/Core/Field/PluginSettingsBase.php
@@ -31,7 +31,14 @@
   protected $defaultSettingsMerged = FALSE;
 
   /**
-   * Implements Drupal\field\Plugin\PluginSettingsInterface::getSettings().
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return array();
+  }
+
+  /**
+   * {@inheritdoc}
    */
   public function getSettings() {
     // Merge defaults before returning the array.
@@ -42,11 +49,11 @@ public function getSettings() {
   }
 
   /**
-   * Implements Drupal\field\Plugin\PluginSettingsInterface::getSetting().
+   * {@inheritdoc}
    */
   public function getSetting($key) {
-    // Merge defaults if we have no value for the key.
-    if (!$this->defaultSettingsMerged && !array_key_exists($key, $this->settings)) {
+    // Merge defaults if that has not been done before.
+    if (!$this->defaultSettingsMerged) {
       $this->mergeDefaults();
     }
     return isset($this->settings[$key]) ? $this->settings[$key] : NULL;
@@ -56,20 +63,13 @@ public function getSetting($key) {
    * Merges default settings values into $settings.
    */
   protected function mergeDefaults() {
-    $this->settings += $this->getDefaultSettings();
+    // Use only settings defined by plugin.
+    $this->settings = array_intersect_key($this->settings, static::defaultSettings()) + static::defaultSettings();
     $this->defaultSettingsMerged = TRUE;
   }
 
   /**
-   * Implements Drupal\field\Plugin\PluginSettingsInterface::getDefaultSettings().
-   */
-  public function getDefaultSettings() {
-    $definition = $this->getPluginDefinition();
-    return $definition['settings'];
-  }
-
-  /**
-   * Implements Drupal\field\Plugin\PluginSettingsInterface::setSettings().
+   * {@inheritdoc}
    */
   public function setSettings(array $settings) {
     $this->settings = $settings;
@@ -78,7 +78,7 @@ public function setSettings(array $settings) {
   }
 
   /**
-   * Implements Drupal\field\Plugin\PluginSettingsInterface::setSetting().
+   * {@inheritdoc}
    */
   public function setSetting($key, $value) {
     $this->settings[$key] = $value;
diff --git a/core/lib/Drupal/Core/Field/PluginSettingsInterface.php b/core/lib/Drupal/Core/Field/PluginSettingsInterface.php
index d7ffc47..a289ce8 100644
--- a/core/lib/Drupal/Core/Field/PluginSettingsInterface.php
+++ b/core/lib/Drupal/Core/Field/PluginSettingsInterface.php
@@ -15,6 +15,14 @@
 interface PluginSettingsInterface extends PluginInspectionInterface {
 
   /**
+   * Defines the default settings for this plugin.
+   *
+   * @return array
+   *   A list of default settings, keyed by the setting name.
+   */
+  public static function defaultSettings();
+
+  /**
    * Returns the array of settings, including defaults for missing settings.
    *
    * @return array
@@ -34,21 +42,13 @@ public function getSettings();
   public function getSetting($key);
 
   /**
-   * Returns the default settings for the plugin.
-   *
-   * @return array
-   *   The array of default setting values, keyed by setting names.
-   */
-  public function getDefaultSettings();
-
-  /**
    * Sets the settings for the plugin.
    *
    * @param array $settings
    *   The array of settings, keyed by setting names. Missing settings will be
    *   assigned their default values.
    *
-   * @return \Drupal\field\Plugin\PluginSettingsInterface
+   * @return \Drupal\Core\Field\PluginSettingsInterface
    *   The plugin itself.
    */
   public function setSettings(array $settings);
@@ -61,7 +61,7 @@ public function setSettings(array $settings);
    * @param mixed $value
    *   The setting value.
    *
-   * @return \Drupal\field\Plugin\PluginSettingsInterface
+   * @return \Drupal\Core\Field\PluginSettingsInterface
    *   The plugin itself.
    */
   public function setSetting($key, $value);
diff --git a/core/lib/Drupal/Core/Field/WidgetPluginManager.php b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
index 366f010..4b60213 100644
--- a/core/lib/Drupal/Core/Field/WidgetPluginManager.php
+++ b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
@@ -203,8 +203,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::defaultSettings();
+    }
+
+    return array();
   }
 
 }
diff --git a/core/modules/block/lib/Drupal/block/Plugin/views/display/Block.php b/core/modules/block/lib/Drupal/block/Plugin/views/display/Block.php
index 94bea95..9ee2ca9 100644
--- a/core/modules/block/lib/Drupal/block/Plugin/views/display/Block.php
+++ b/core/modules/block/lib/Drupal/block/Plugin/views/display/Block.php
@@ -65,7 +65,7 @@ protected function defineOptions() {
    *
    * @return array
    *   An array of block-specific settings to override the defaults provided in
-   *   \Drupal\views\Plugin\Block\ViewsBlock::settings().
+   *   \Drupal\views\Plugin\Block\ViewsBlock::defaultConfiguration().
    *
    * @see \Drupal\views\Plugin\Block\ViewsBlock::defaultConfiguration()
    */
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 bf4979b..fd0dff0 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
@@ -29,15 +29,21 @@
  *   },
  *   edit = {
  *     "editor" = "disabled"
- *   },
- *   settings = {
- *     "pager_id" = 0
  *   }
  * )
  */
 class CommentDefaultFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
 
   /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['pager_id'] = 0;
+    return $settings;
+  }
+
+  /**
    * The comment storage controller.
    *
    * @var \Drupal\comment\CommentStorageControllerInterface
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php
index 115bce2..eb47c57 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php
@@ -18,17 +18,6 @@
  *   id = "comment",
  *   label = @Translation("Comments"),
  *   description = @Translation("This field manages configuration and presentation of comments on an entity."),
- *   settings = {
- *     "description" = "",
- *   },
- *   instance_settings = {
- *     "default_mode" = COMMENT_MODE_THREADED,
- *     "per_page" = 50,
- *     "form_location" = COMMENT_FORM_BELOW,
- *     "anonymous" = COMMENT_ANONYMOUS_MAYNOT_CONTACT,
- *     "subject" = 1,
- *     "preview" = DRUPAL_OPTIONAL,
- *   },
  *   default_widget = "comment_default",
  *   default_formatter = "comment_default"
  * )
@@ -38,6 +27,29 @@ class CommentItem extends FieldItemBase implements CommentItemInterface {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['description'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['default_mode'] = COMMENT_MODE_THREADED;
+    $settings['per_page'] = 50;
+    $settings['form_location'] = COMMENT_FORM_BELOW;
+    $settings['anonymous'] = COMMENT_ANONYMOUS_MAYNOT_CONTACT;
+    $settings['subject'] = 1;
+    $settings['preview'] = DRUPAL_OPTIONAL;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['status'] = DataDefinition::create('integer')
       ->setLabel(t('Comment status value'));
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 95cd875..2b0b512 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -790,21 +790,17 @@ function content_translation_form_field_ui_field_instance_edit_form_alter(array
 }
 
 /**
- * Implements hook_field_info_alter().
- */
-function content_translation_field_info_alter(&$info) {
-  foreach ($info as &$field_type_info) {
-    // By default no column has to be synchronized.
-    $field_type_info['settings'] += array('translation_sync' => FALSE);
-    // Synchronization can be enabled per instance.
-    $field_type_info['instance_settings'] += array('translation_sync' => FALSE);
-  }
-}
-
-/**
  * Implements hook_entity_presave().
  */
 function content_translation_entity_presave(EntityInterface $entity) {
+  // By default no column has to be synchronized.
+  if ($entity->getEntityTypeId() === 'field_config') {
+    $entity->settings += array('translation_sync' => FALSE);
+  }
+  // Synchronization can be enabled per instance.
+  if ($entity->getEntityTypeId() === 'field_instance_config') {
+    $entity->settings += array('translation_sync' => FALSE);
+  }
   if ($entity instanceof ContentEntityInterface && $entity->isTranslatable()) {
     // @todo Avoid using request attributes once translation metadata become
     //   regular fields.
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 754ffc0..f780968 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,15 +24,21 @@
  *   label = @Translation("Default"),
  *   field_types = {
  *     "datetime"
- *   },
- *   settings = {
- *     "format_type" = "medium",
  *   }
  * )
  */
 class DateTimeDefaultFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
 
   /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['format_type'] = 'medium';
+    return $settings;
+  }
+
+  /**
    * The date service.
    *
    * @var \Drupal\Core\Datetime\Date
diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php
index 6119730..935e19e 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php
@@ -19,9 +19,6 @@
  *   id = "datetime",
  *   label = @Translation("Date"),
  *   description = @Translation("Create and store date values."),
- *   settings = {
- *     "datetime_type" = "datetime"
- *   },
  *   default_widget = "datetime_default",
  *   default_formatter = "datetime_default",
  *   list_class = "\Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList"
@@ -30,6 +27,15 @@
 class DateTimeItem extends FieldItemBase implements PrepareCacheInterface {
 
   /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['datetime_type'] = 'datetime';
+    return $settings;
+  }
+
+  /**
    * Value for the 'datetime_type' setting: store only a date.
    */
   const DATETIME_TYPE_DATE = 'date';
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..0f36a3d 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,11 +18,6 @@
  *   label = @Translation("Select list"),
  *   field_types = {
  *     "datetime"
- *   },
- *   settings = {
- *     "increment" = 15,
- *     "date_order" = "YMD",
- *     "time_type" = "24",
  *   }
  * )
  */
@@ -31,6 +26,17 @@ class DateTimeDatelistWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['increment'] = '15';
+    $settings['date_order'] = 'YMD';
+    $settings['time_type'] = '24';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) {
     $date_order = $this->getSetting('date_order');
     $time_type = $this->getSetting('time_type');
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
index 2ce4219..75d9dfd 100644
--- a/core/modules/entity_reference/entity_reference.module
+++ b/core/modules/entity_reference/entity_reference.module
@@ -43,9 +43,6 @@ function entity_reference_field_info_alter(&$info) {
   $info['entity_reference']['no_ui'] = FALSE;
   $info['entity_reference']['class'] = '\Drupal\entity_reference\ConfigurableEntityReferenceItem';
   $info['entity_reference']['list_class'] = '\Drupal\entity_reference\Plugin\Field\FieldType\ConfigurableEntityReferenceFieldItemList';
-  $info['entity_reference']['settings']['target_type'] = \Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user';
-  $info['entity_reference']['instance_settings']['handler'] = 'default';
-  $info['entity_reference']['instance_settings']['handler_settings'] = array();
   $info['entity_reference']['default_widget'] = 'entity_reference_autocomplete';
   $info['entity_reference']['default_formatter'] = 'entity_reference_label';
   $info['entity_reference']['provider'] = 'entity_reference';
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php
index bcd52ad..8c43040 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php
@@ -21,7 +21,7 @@
  * Replaces the Core 'entity_reference' entity field type implementation, this
  * supports configurable fields, auto-creation of referenced entities and more.
  *
- * Required settings (below the definition's 'settings' key) are:
+ * Required settings are:
  *  - target_type: The entity type to reference.
  *
  * @see entity_reference_field_info_alter().
@@ -31,6 +31,25 @@ class ConfigurableEntityReferenceItem extends EntityReferenceItem implements All
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    // The instance settings 'handler_settings.target_bundles' used for this.
+    unset($settings['target_bundle']);
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['handler_settings'] = array();
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getPossibleValues(AccountInterface $account = NULL) {
     return $this->getSettableValues($account);
   }
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..a21c3f9 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,10 +19,6 @@
  *   description = @Translation("Display the referenced entities rendered by entity_view()."),
  *   field_types = {
  *     "entity_reference"
- *   },
- *   settings = {
- *     "view_mode" = "default",
- *     "link" = FALSE
  *   }
  * )
  */
@@ -31,6 +27,16 @@ class EntityReferenceEntityFormatter extends EntityReferenceFormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['view_mode'] = 'default';
+    $settings['link'] = FALSE;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $view_modes = entity_get_view_modes($this->getFieldSetting('target_type'));
     $options = array('default' => t('Default'));
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..d832fb1 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,9 +18,6 @@
  *   description = @Translation("Display the label of the referenced entities."),
  *   field_types = {
  *     "entity_reference"
- *   },
- *   settings = {
- *     "link" = TRUE
  *   }
  * )
  */
@@ -29,6 +26,15 @@ class EntityReferenceLabelFormatter extends EntityReferenceFormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['link'] = TRUE;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $elements['link'] = array(
       '#title' => t('Link label to the referenced entity'),
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 b09f7e2..3d512b0 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
@@ -19,12 +19,6 @@
  *   field_types = {
  *     "entity_reference"
  *   },
- *   settings = {
- *     "match_operator" = "CONTAINS",
- *     "size" = 60,
- *     "autocomplete_type" = "tags",
- *     "placeholder" = ""
- *   },
  *   multiple_values = TRUE
  * )
  */
@@ -33,6 +27,18 @@ class AutocompleteTagsWidget extends AutocompleteWidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['match_operator'] = 'CONTAINS';
+    $settings['size'] = '60';
+    $settings['autocomplete_type'] = 'tags';
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function elementValidate($element, &$form_state, $form) {
     $value = array();
     // If a value was entered into the autocomplete.
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..b9ed95b 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 defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['match_operator'] = 'CONTAINS';
+    $settings['size'] = '60';
+    $settings['autocomplete_type'] = 'tags';
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 92e9eb6..c433cdd 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -126,13 +126,6 @@ function hook_field_extra_fields_alter(&$info) {
  *   manager.
  */
 function hook_field_info_alter(&$info) {
-  // Add a setting to all field types.
-  foreach ($info as $field_type => $field_type_info) {
-    $info[$field_type]['settings'] += array(
-      'mymodule_additional_setting' => 'default value',
-    );
-  }
-
   // Change the default widget for fields of type 'foo'.
   if (isset($info['foo'])) {
     $info['foo']['default widget'] = 'mymodule_widget';
@@ -174,15 +167,10 @@ function hook_field_info_alter(&$info) {
  * Perform alterations on Field API widget types.
  *
  * @param array $info
- *   An array of informations on existing widget types, as collected by the
+ *   An array of information on existing widget types, as collected by the
  *   annotation discovery mechanism.
  */
 function hook_field_widget_info_alter(array &$info) {
-  // Add a setting to a widget type.
-  $info['text_textfield']['settings'] += array(
-    'mymodule_additional_setting' => 'default value',
-  );
-
   // Let a new field type re-use an existing widget.
   $info['options_select']['field_types'][] = 'my_field_type';
 }
@@ -274,15 +262,10 @@ function hook_field_widget_WIDGET_TYPE_form_alter(&$element, &$form_state, $cont
  * Perform alterations on Field API formatter types.
  *
  * @param array $info
- *   An array of informations on existing formatter types, as collected by the
+ *   An array of information on existing formatter types, as collected by the
  *   annotation discovery mechanism.
  */
 function hook_field_formatter_info_alter(array &$info) {
-  // Add a setting to a formatter type.
-  $info['text_default']['settings'] += array(
-    'mymodule_additional_setting' => 'default value',
-  );
-
   // Let a new field type re-use an existing formatter.
   $info['text_default']['field types'][] = 'my_field_type';
 }
diff --git a/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php b/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
index ae8d4fc..eed3000 100644
--- a/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
+++ b/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
@@ -326,7 +326,9 @@ protected function preSaveNew(EntityStorageControllerInterface $storage_controll
 
     // Make sure all settings are present, so that a complete field
     // definition is passed to the various hooks and written to config.
-    $this->settings += $field_type['settings'];
+     if (isset($field_type['class'])) {
+       $this->settings += $field_type['class']::defaultSettings();
+     }
 
     // Notify the entity storage controller.
     $entity_manager->getStorageController($this->entity_type)->onFieldCreate($this);
@@ -526,8 +528,13 @@ public function getSettings() {
     //   $this.
     $field_type_info = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->type);
 
-    $settings = $this->settings + $field_type_info['settings'] + $field_type_info['instance_settings'];
-    return $settings;
+    $settings = array();
+    $instance_settings = array();
+    if (isset($field_type_info['class'])) {
+      $settings = $field_type_info['class']::defaultSettings();
+      $instance_settings = $field_type_info['class']::defaultInstanceSettings();
+    }
+    return $this->settings + $settings + $instance_settings;
   }
 
   /**
@@ -535,18 +542,14 @@ public function getSettings() {
    */
   public function getSetting($setting_name) {
     // @todo See getSettings() about potentially statically caching this.
-    $field_type_info = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->type);
-
     // We assume here that consecutive array_key_exists() is more efficient than
     // calling getSettings() when all we need is a single setting.
     if (array_key_exists($setting_name, $this->settings)) {
       return $this->settings[$setting_name];
     }
-    elseif (array_key_exists($setting_name, $field_type_info['settings'])) {
-      return $field_type_info['settings'][$setting_name];
-    }
-    elseif (array_key_exists($setting_name, $field_type_info['instance_settings'])) {
-      return $field_type_info['instance_settings'][$setting_name];
+    $settings = $this->getSettings();
+    if (array_key_exists($setting_name, $settings)) {
+      return $settings[$setting_name];
     }
     else {
       return NULL;
diff --git a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
index 93d5241..257d20b 100644
--- a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
@@ -64,7 +64,7 @@ function testCreateField() {
 
     // Ensure that default settings are present.
     $field_type = \Drupal::service('plugin.manager.field.field_type')->getDefinition($field_definition['type']);
-    $this->assertEqual($field_config['settings'], $field_type['settings'], 'Default field settings have been written.');
+    $this->assertEqual($field_config['settings'], $field_type['class']::defaultSettings(), 'Default field settings have been written.');
 
     // Guarantee that the name is unique.
     try {
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
index b60068a..20ec766 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
@@ -134,7 +134,7 @@ function testFieldPrepare() {
 
     // Check that all expected settings are in place.
     $field_type = \Drupal::service('plugin.manager.field.field_type')->getDefinition($field_definition['type']);
-    $this->assertEqual($field->settings, $field_type['settings'], 'All expected default field settings are present.');
+    $this->assertEqual($field->settings, $field_type['class']::defaultSettings(), 'All expected default field settings are present.');
   }
 
   /**
@@ -168,7 +168,7 @@ function testInstancePrepare() {
 
     // Check that all expected instance settings are in place.
     $field_type = \Drupal::service('plugin.manager.field.field_type')->getDefinition($field_definition['type']);
-    $this->assertEqual($instance->settings, $field_type['instance_settings'] , 'All expected instance settings are present.');
+    $this->assertEqual($instance->settings, $field_type['class']::defaultInstanceSettings() , 'All expected instance settings are present.');
   }
 
   /**
@@ -292,8 +292,8 @@ function testSettingsInfo() {
     $info = $this->getExpectedFieldTypeDefinition();
     foreach ($info as $type => $data) {
       $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
-      $this->assertIdentical($field_type_manager->getDefaultSettings($type), $data['settings'], format_string("field settings service returns %type's field settings", array('%type' => $type)));
-      $this->assertIdentical($field_type_manager->getDefaultInstanceSettings($type), $data['instance_settings'], format_string("field instance settings service returns %type's field instance settings", array('%type' => $type)));
+      $this->assertIdentical($field_type_manager->getDefaultSettings($type), $data['class']::defaultSettings(), format_string("field settings service returns %type's field settings", array('%type' => $type)));
+      $this->assertIdentical($field_type_manager->getDefaultInstanceSettings($type), $data['class']::defaultInstanceSettings(), format_string("field instance settings service returns %type's field instance settings", array('%type' => $type)));
     }
   }
 
@@ -341,15 +341,6 @@ protected function getExpectedFieldTypeDefinition() {
       'test_field' => array(
         'label' => t('Test field'),
         'description' => t('Dummy field type used for tests.'),
-        'settings' => array(
-          'test_field_setting' => 'dummy test string',
-          'changeable' => 'a changeable field setting',
-          'unchangeable' => 'an unchangeable field setting',
-        ),
-        'instance_settings' => array(
-          'test_instance_setting' => 'dummy test string',
-          'test_cached_data' => FALSE,
-        ),
         'default_widget' => 'test_field_widget',
         'default_formatter' => 'field_test_default',
         'class' => 'Drupal\field_test\Plugin\Field\FieldType\TestItem',
@@ -357,10 +348,6 @@ protected function getExpectedFieldTypeDefinition() {
       'shape' => array(
         'label' => t('Shape'),
         'description' => t('Another dummy field type.'),
-        'settings' => array(
-          'foreign_key_name' => 'shape',
-        ),
-        'instance_settings' => array(),
         'default_widget' => 'test_field_widget',
         'default_formatter' => 'field_test_default',
         'class' => 'Drupal\field_test\Plugin\Field\FieldType\ShapeItem',
@@ -369,8 +356,6 @@ protected function getExpectedFieldTypeDefinition() {
         'no_ui' => TRUE,
         'label' => t('Hidden from UI test field'),
         'description' => t('Dummy hidden field type used for tests.'),
-        'settings' => array(),
-        'instance_settings' => array(),
         'default_widget' => 'test_field_widget',
         'default_formatter' => 'field_test_default',
         'class' => 'Drupal\field_test\Plugin\Field\FieldType\HiddenTestItem',
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
index 1f73528..9f5ff65 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
@@ -84,7 +84,7 @@ function testCreateFieldInstance() {
     $this->assertIdentical($config['description'], '', 'Description defaults to empty string.');
 
     // Check that default settings are set.
-    $this->assertEqual($config['settings'], $field_type['instance_settings'] , 'Default instance settings have been written.');
+    $this->assertEqual($config['settings'], $field_type['class']::defaultInstanceSettings() , 'Default instance settings have been written.');
 
     // Guarantee that the field/bundle combination is unique.
     try {
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 97beb5c..953210b 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
@@ -20,9 +20,6 @@
  *   field_types = {
  *     "test_field"
  *   },
- *   settings = {
- *     "test_formatter_setting" = "dummy test string"
- *   },
  *   weight = 1
  * )
  */
@@ -31,6 +28,15 @@ class TestFieldDefaultFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_formatter_setting'] = 'dummy test string';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['test_formatter_setting'] = array(
       '#title' => t('Setting'),
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 e624bf9..08fbc3f 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
@@ -19,9 +19,6 @@
  *   field_types = {
  *     "test_field",
  *   },
- *   settings = {
- *     "test_empty_string" = "**EMPTY FIELD**"
- *   },
  *   weight = -5
  * )
  */
@@ -30,6 +27,15 @@ class TestFieldEmptyFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_empty_string'] = '**EMPTY FIELD**';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function viewElements(FieldItemListInterface $items) {
     $elements = array();
 
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 fa4d9a9..ae73e19 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
@@ -19,9 +19,6 @@
  *   field_types = {
  *     "test_field",
  *   },
- *   settings = {
- *     "field_empty_setting" = ""
- *   },
  *   weight = -1
  * )
  */
@@ -30,6 +27,15 @@ class TestFieldEmptySettingFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['field_empty_setting'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['field_empty_setting'] = array(
       '#title' => t('Setting'),
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 87d9553..ef624b3 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
@@ -20,9 +20,6 @@
  *   field_types = {
  *     "test_field"
  *   },
- *   settings = {
- *     "test_formatter_setting_multiple" = "dummy test string"
- *   },
  *   weight = 5
  * )
  */
@@ -31,6 +28,15 @@ class TestFieldMultipleFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_formatter_setting_multiple'] = 'dummy test string';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['test_formatter_setting_multiple'] = array(
       '#title' => t('Setting'),
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 85b97f1..1b92ab7 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
@@ -20,9 +20,6 @@
  *   field_types = {
  *     "test_field"
  *   },
- *   settings = {
- *     "test_formatter_setting_additional" = "dummy test string"
- *   },
  *   weight = 10
  * )
  */
@@ -31,6 +28,15 @@ class TestFieldPrepareViewFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_formatter_setting_additional'] = 'dummy test string';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['test_formatter_setting_additional'] = array(
       '#title' => t('Setting'),
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php
index 348886a..4e80454 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php
@@ -18,9 +18,6 @@
  *   id = "shape",
  *   label = @Translation("Shape"),
  *   description = @Translation("Another dummy field type."),
- *   settings = {
- *     "foreign_key_name" = "shape"
- *   },
  *   default_widget = "test_field_widget",
  *   default_formatter = "field_test_default"
  * )
@@ -30,6 +27,15 @@ class ShapeItem extends FieldItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['foreign_key_name'] = 'shape';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['shape'] = DataDefinition::create('string')
       ->setLabel(t('Shape'));
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php
index 6c85daa..14e3f6e 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php
@@ -19,15 +19,6 @@
  *   id = "test_field",
  *   label = @Translation("Test field"),
  *   description = @Translation("Dummy field type used for tests."),
- *   settings = {
- *     "test_field_setting" = "dummy test string",
- *     "changeable" =  "a changeable field setting",
- *     "unchangeable" = "an unchangeable field setting"
- *   },
- *   instance_settings = {
- *     "test_instance_setting" = "dummy test string",
- *     "test_cached_data" = FALSE
- *   },
  *   default_widget = "test_field_widget",
  *   default_formatter = "field_test_default"
  * )
@@ -37,6 +28,27 @@ class TestItem extends FieldItemBase implements PrepareCacheInterface {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_field_setting'] = 'dummy test string';
+    $settings['changeable'] = 'a changeable field setting';
+    $settings['unchangeable'] = 'an unchangeable field setting';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['test_instance_setting'] = 'dummy test string';
+    $settings['test_cached_data'] = FALSE;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['value'] = DataDefinition::create('integer')
       ->setLabel(t('Test integer value'));
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 ae80042..7e29cb9 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
@@ -21,9 +21,6 @@
  *      "test_field",
  *      "hidden_test_field"
  *   },
- *   settings = {
- *     "test_widget_setting" = "dummy test string"
- *   },
  *   weight = -10
  * )
  */
@@ -32,6 +29,15 @@ class TestFieldWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_widget_setting'] = 'dummy test string';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['test_widget_setting'] = array(
       '#type' => 'textfield',
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 a16eb3f..006faa4 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,9 +22,6 @@
  * @FieldWidget(
  *   id = "test_field_widget_multiple",
  *   label = @Translation("Test widget - multiple"),
- *   settings = {
- *     "test_widget_setting_multiple" = "dummy test string"
- *   },
  *   multiple_values = TRUE,
  *   weight = 10
  * )
@@ -34,6 +31,15 @@ class TestFieldWidgetMultiple extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['test_widget_setting_multiple'] = 'dummy test string';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['test_widget_setting_multiple'] = array(
       '#type' => 'textfield',
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 495a6e2..b0e66e3 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
@@ -399,8 +399,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::defaultSettings()) {
           $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 133b578..5699ed9 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
@@ -106,9 +106,9 @@ function testFormatterUI() {
     $edit = array($fieldname => 'foo');
     $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
 
-    // Confirm that the settings are updated on the settings form.
+    // Confirm that the extra settings are not updated on the settings form.
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
-    $this->assertFieldByName($fieldname, 'foo');
+    $this->assertFieldByName($fieldname, '');
 
     // Test the empty setting formatter.
     $edit = array('fields[field_test][type]' => 'field_empty_setting');
@@ -199,9 +199,9 @@ public function testWidgetUI() {
     $edit = array($fieldname => 'foo');
     $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
 
-    // Confirm that the settings are updated on the settings form.
+    // Confirm that the extra settings are not updated on the settings form.
     $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit");
-    $this->assertFieldByName($fieldname, 'foo');
+    $this->assertFieldByName($fieldname, '');
   }
 
   /**
@@ -225,10 +225,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/file.field.inc b/core/modules/file/file.field.inc
index a3c7140..7d106ae 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -9,16 +9,6 @@
 use Drupal\field\FieldConfigInterface;
 
 /**
- * Implements hook_field_info_alter().
- *
- * Cannot annotate in FieldItem plugin the settings.uri_scheme meta data key
- * with a dynamic value. We need to alter the value here.
- */
-function file_field_info_alter(&$info) {
-  $info['file']['settings']['uri_scheme'] = file_default_scheme();
-}
-
-/**
  * Returns HTML for an individual file upload widget.
  *
  * @param $variables
diff --git a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php
index d72ccad..b5ed522 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php
@@ -18,18 +18,6 @@
  *   id = "file",
  *   label = @Translation("File"),
  *   description = @Translation("This field stores the ID of a file as an integer value."),
- *   settings = {
- *     "target_type" = "file",
- *     "display_field" = "0",
- *     "display_default" = "0",
- *     "uri_scheme" = ""
- *   },
- *   instance_settings = {
- *     "file_extensions" = "txt",
- *     "file_directory" = "",
- *     "max_filesize" = "",
- *     "description_field" = "0"
- *   },
  *   default_widget = "file_generic",
  *   default_formatter = "file_default",
  *   list_class = "\Drupal\file\Plugin\Field\FieldType\FileFieldItemList"
@@ -40,6 +28,30 @@ class FileItem extends EntityReferenceItem {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['target_type'] = 'file';
+    $settings['display_field'] = 0;
+    $settings['display_default'] = 0;
+    $settings['uri_scheme'] = file_default_scheme();
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['file_extensions'] = 'txt';
+    $settings['file_directory'] = '';
+    $settings['max_filesize'] = '';
+    $settings['description_field'] = 0;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function schema(FieldDefinitionInterface $field_definition) {
     return array(
       'columns' => array(
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 9267eae..d547d86 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,9 +21,6 @@
  *   label = @Translation("File"),
  *   field_types = {
  *     "file"
- *   },
- *   settings = {
- *     "progress_indicator" = "throbber"
  *   }
  * )
  */
@@ -32,6 +29,15 @@ class FileWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['progress_indicator'] = 'throbber';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['progress_indicator'] = array(
       '#type' => 'radios',
diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index 4407563..5462520 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -8,13 +8,6 @@
 use Drupal\Component\Utility\NestedArray;
 
 /**
- * Implements hook_field_info_alter().
- */
-function image_field_info_alter(&$info) {
-  $info['image']['settings']['uri_scheme'] = file_default_scheme();
-}
-
-/**
  * Returns HTML for an image field widget.
  *
  * @param array $variables
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..4ae4887 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,10 +17,6 @@
  *   label = @Translation("Image"),
  *   field_types = {
  *     "image"
- *   },
- *   settings = {
- *     "image_style" = "",
- *     "image_link" = ""
  *   }
  * )
  */
@@ -29,6 +25,16 @@ class ImageFormatter extends ImageFormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['image_style'] = '';
+    $settings['image_link'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $image_styles = image_style_options(FALSE);
     $element['image_style'] = array(
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
index 5442d17..ca048f8 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
@@ -18,49 +18,6 @@
  *   id = "image",
  *   label = @Translation("Image"),
  *   description = @Translation("This field stores the ID of an image file as an integer value."),
- *   settings = {
- *     "target_type" = "file",
- *     "uri_scheme" = "",
- *     "default_image" = {
- *       "fid" = NULL,
- *       "alt" = "",
- *       "title" = "",
- *       "width" = NULL,
- *       "height" = NULL
- *     },
- *     "column_groups" = {
- *       "file" = {
- *         "label" = @Translation("File"),
- *         "columns" = { "target_id", "width", "height" }
- *       },
- *       "alt" = {
- *         "label" = @Translation("Alt"),
- *         "translatable" = TRUE
- *       },
- *       "title" = {
- *         "label" = @Translation("Title"),
- *         "translatable" = TRUE
- *       }
- *     }
- *   },
- *   instance_settings = {
- *     "file_extensions" = "png gif jpg jpeg",
- *     "file_directory" = "",
- *     "max_filesize" = "",
- *     "alt_field" = "0",
- *     "alt_field_required" = "0",
- *     "title_field" = "0",
- *     "title_field_required" = "0",
- *     "max_resolution" = "",
- *     "min_resolution" = "",
- *     "default_image" = {
- *       "fid" = NULL,
- *       "alt" = "",
- *       "title" = "",
- *       "width" = NULL,
- *       "height" = NULL
- *     }
- *   },
  *   default_widget = "image_image",
  *   default_formatter = "image",
  *   list_class = "\Drupal\file\Plugin\Field\FieldType\FileFieldItemList"
@@ -71,6 +28,57 @@ class ImageItem extends FileItem {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['default_image'] = array(
+      'fid' => NULL,
+      'alt' => '',
+      'title' => '',
+      'width' => NULL,
+      'height' => NULL,
+    );
+    $settings['column_groups'] = array(
+      'file' => array(
+        'label' => t('File'),
+        'columns' => array('target_id', 'width', 'height'),
+      ),
+      'alt' => array(
+        'label' => t('Alt'),
+        'translatable' => TRUE,
+      ),
+      'title' => array(
+        'label' => t('Title'),
+        'translatable' => TRUE,
+      ),
+    );
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    unset($settings['description_field']);
+    $settings['file_extensions'] = 'png gif jpg jpeg';
+    $settings['alt_field'] = 0;
+    $settings['alt_field_required'] = 0;
+    $settings['title_field'] = 0;
+    $settings['title_field_required'] = 0;
+    $settings['max_resolution'] = '';
+    $settings['min_resolution'] = '';
+    $settings['default_image'] = array(
+      'fid' => NULL,
+      'alt' => '',
+      'width' => NULL,
+      'height' => NULL,
+    );
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function schema(FieldDefinitionInterface $field_definition) {
     return array(
       'columns' => array(
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..9f7c71c 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,10 +19,6 @@
  *   label = @Translation("Image"),
  *   field_types = {
  *     "image"
- *   },
- *   settings = {
- *     "progress_indicator" = "throbber",
- *     "preview_image_style" = "thumbnail",
  *   }
  * )
  */
@@ -31,6 +27,16 @@ class ImageWidget extends FileWidget {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['progress_indicator'] = 'throbber';
+    $settings['preview_image_style'] = 'thumbnail';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element = parent::settingsForm($form, $form_state);
 
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 921970d..e133464 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
@@ -21,13 +21,6 @@
  *   label = @Translation("Link"),
  *   field_types = {
  *     "link"
- *   },
- *   settings = {
- *     "trim_length" = "80",
- *     "url_only" = "",
- *     "url_plain" = "",
- *     "rel" = "",
- *     "target" = ""
  *   }
  * )
  */
@@ -36,6 +29,19 @@ class LinkFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['trim_length'] = '80';
+    $settings['url_only'] = '';
+    $settings['url_plain'] = '';
+    $settings['rel'] = '';
+    $settings['target'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $elements = parent::settingsForm($form, $form_state);
 
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..6f97cd5 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,11 +22,6 @@
  *   label = @Translation("Separate link text and URL"),
  *   field_types = {
  *     "link"
- *   },
- *   settings = {
- *     "trim_length" = "80",
- *     "rel" = "",
- *     "target" = ""
  *   }
  * )
  */
@@ -35,6 +30,17 @@ class LinkSeparateFormatter extends LinkFormatter {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['trim_length'] = '80';
+    $settings['rel'] = '';
+    $settings['target'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function viewElements(FieldItemListInterface $items) {
     $element = array();
     $entity = $items->getEntity();
diff --git a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php
index e9aff29..3bef68e 100644
--- a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php
+++ b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php
@@ -19,9 +19,6 @@
  *   id = "link",
  *   label = @Translation("Link"),
  *   description = @Translation("Stores a URL string, optional varchar link text, and optional blob of attributes to assemble a link."),
- *   instance_settings = {
- *     "title" = "1"
- *   },
  *   default_widget = "link_default",
  *   default_formatter = "link"
  * )
@@ -31,6 +28,15 @@ class LinkItem extends FieldItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['title'] = 1;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['url'] = DataDefinition::create('uri')
       ->setLabel(t('URL'));
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..7b2469c 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,10 +18,6 @@
  *   label = @Translation("Link"),
  *   field_types = {
  *     "link"
- *   },
- *   settings = {
- *     "placeholder_url" = "",
- *     "placeholder_title" = ""
  *   }
  * )
  */
@@ -30,6 +26,16 @@ class LinkWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['placeholder_url'] = '';
+    $settings['placeholder_title'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) {
     $element['url'] = array(
       '#type' => 'url',
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListBooleanItem.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListBooleanItem.php
index b283d7f..38ab4d8 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListBooleanItem.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListBooleanItem.php
@@ -20,10 +20,6 @@
  *   description = @Translation("This field stores simple on/off or yes/no options."),
  *   default_widget = "options_buttons",
  *   default_formatter = "list_default",
- *   settings = {
- *     "allowed_values" = { },
- *     "allowed_values_function" = ""
- *   }
  * )
  */
 class ListBooleanItem extends ListItemBase {
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListFloatItem.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListFloatItem.php
index cfd9251..84d2489 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListFloatItem.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListFloatItem.php
@@ -20,10 +20,6 @@
  *   description = @Translation("This field stores float values from a list of allowed 'value => label' pairs, i.e. 'Fraction': 0 => 0, .25 => 1/4, .75 => 3/4, 1 => 1."),
  *   default_widget = "options_select",
  *   default_formatter = "list_default",
- *   settings = {
- *     "allowed_values" = { },
- *     "allowed_values_function" = ""
- *   }
  * )
  */
 class ListFloatItem extends ListItemBase {
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListIntegerItem.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListIntegerItem.php
index ea28a94..ce1b744 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListIntegerItem.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListIntegerItem.php
@@ -20,10 +20,6 @@
  *   description = @Translation("This field stores integer values from a list of allowed 'value => label' pairs, i.e. 'Lifetime in days': 1 => 1 day, 7 => 1 week, 31 => 1 month."),
  *   default_widget = "options_select",
  *   default_formatter = "list_default",
- *   settings = {
- *     "allowed_values" = { },
- *     "allowed_values_function" = ""
- *   }
  * )
  */
 class ListIntegerItem extends ListItemBase {
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php
index de95075..0d43955 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php
@@ -20,6 +20,16 @@
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['allowed_values'] = array();
+    $settings['allowed_values_function'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getPossibleValues(AccountInterface $account = NULL) {
     // Flatten options firstly, because Possible Options may contain group
     // arrays.
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListTextItem.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListTextItem.php
index 11757d2..6e0140b 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListTextItem.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListTextItem.php
@@ -20,10 +20,6 @@
  *   description = @Translation("This field stores text values from a list of allowed 'value => label' pairs, i.e. 'US States': IL => Illinois, IA => Iowa, IN => Indiana."),
  *   default_widget = "options_select",
  *   default_formatter = "list_default",
- *   settings = {
- *     "allowed_values" = { },
- *     "allowed_values_function" = ""
- *   }
  * )
  */
 class ListTextItem extends ListItemBase {
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..059af18 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,9 +19,6 @@
  *   field_types = {
  *     "list_boolean"
  *   },
- *   settings = {
- *     "display_label" = FALSE,
- *   },
  *   multiple_values = TRUE
  * )
  */
@@ -30,6 +27,15 @@ class OnOffWidget extends OptionsWidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['display_label'] = FALSE;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['display_label'] = array(
       '#type' => 'checkbox',
diff --git a/core/modules/responsive_image/lib/Drupal/responsive_image/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php b/core/modules/responsive_image/lib/Drupal/responsive_image/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php
index 8f935c0..1020a6f 100644
--- a/core/modules/responsive_image/lib/Drupal/responsive_image/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php
+++ b/core/modules/responsive_image/lib/Drupal/responsive_image/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php
@@ -18,11 +18,6 @@
  *   label = @Translation("Responsive image"),
  *   field_types = {
  *     "image",
- *   },
- *   settings = {
- *     "responsive_image_mapping" = "",
- *     "fallback_image_style" = "",
- *     "image_link" = "",
  *   }
  * )
  */
@@ -31,6 +26,17 @@ class ResponsiveImageFormatter extends ImageFormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['responsive_image_mapping'] = '';
+    $settings['fallback_image_style'] = '';
+    $settings['image_link'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $responsive_image_options = array();
     $responsive_image_mappings = entity_load_multiple('responsive_image_mapping');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
index d044f96..cb2ec96 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
@@ -19,17 +19,6 @@
  *   id = "taxonomy_term_reference",
  *   label = @Translation("Term Reference"),
  *   description = @Translation("This field stores a reference to a taxonomy term."),
- *   settings = {
- *     "target_type" = "taxonomy_term",
- *     "options_list_callback" = NULL,
- *     "allowed_values" = {
- *       {
- *         "vocabulary" = "",
- *         "parent" = "0"
- *       }
- *     }
- *   },
- *   instance_settings = { },
  *   default_widget = "options_select",
  *   default_formatter = "taxonomy_term_reference_link",
  *   list_class = "\Drupal\taxonomy\Plugin\Field\FieldType\TaxonomyTermReferenceFieldItemList"
@@ -40,6 +29,22 @@ class TaxonomyTermReferenceItem extends EntityReferenceItem implements AllowedVa
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['target_type'] = 'taxonomy_term';
+    $settings['options_list_callback'] = NULL;
+    $settings['allowed_values'] = array(
+      array(
+        'vocabulary' => '',
+        'parent' => 0,
+      ),
+    );
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getPossibleValues(AccountInterface $account = NULL) {
     // Flatten options firstly, because Possible Options may contain group
     // arrays.
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..846e011 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,11 +19,6 @@
  *   field_types = {
  *     "taxonomy_term_reference"
  *   },
- *   settings = {
- *     "size" = "60",
- *     "autocomplete_route_name" = "taxonomy.autocomplete",
- *     "placeholder" = ""
- *   },
  *   multiple_values = TRUE
  * )
  */
@@ -32,6 +27,17 @@ class TaxonomyAutocompleteWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['size'] = '60';
+    $settings['autocomplete_route_name'] = 'taxonomy.autocomplete';
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['placeholder'] = array(
       '#type' => 'textfield',
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..529a786 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,9 +18,6 @@
  *   label = @Translation("Telephone link"),
  *   field_types = {
  *     "telephone"
- *   },
- *   settings = {
- *     "title" = ""
  *   }
  * )
  */
@@ -29,6 +26,15 @@ class TelephoneLinkFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['title'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $elements['title'] = array(
       '#type' => 'textfield',
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..4c3dd5d 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,19 @@
  *   label = @Translation("Telephone number"),
  *   field_types = {
  *     "telephone"
- *   },
- *   settings = {
- *     "placeholder" = ""
  *   }
  * )
  */
 class TelephoneDefaultWidget extends WidgetBase {
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['placeholder'] = '';
+    return $settings;
+  }
 
   /**
    * {@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..fa8765a 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"
  *   }
@@ -38,6 +35,15 @@ class TextTrimmedFormatter extends FormatterBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['trim_length'] = '600';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['trim_length'] = array(
       '#title' => t('Trim length'),
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php
index 93bd949..5eb7c92 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php
@@ -16,12 +16,6 @@
  *   id = "text",
  *   label = @Translation("Text"),
  *   description = @Translation("This field stores varchar text in the database."),
- *   settings = {
- *     "max_length" = "255"
- *   },
- *   instance_settings = {
- *     "text_processing" = "0"
- *   },
  *   default_widget = "text_textfield",
  *   default_formatter = "text_default"
  * )
@@ -31,6 +25,15 @@ class TextItem extends TextItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['max_length'] = 255;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function schema(FieldDefinitionInterface $field_definition) {
     return array(
       'columns' => array(
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
index 0c85997..fe704c2 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
@@ -20,6 +20,15 @@
   /**
    * {@inheritdoc}
    */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['text_processing'] = 0;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties['value'] = DataDefinition::create('string')
       ->setLabel(t('Text value'));
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextLongItem.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextLongItem.php
index 934d11f..1cf0385 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextLongItem.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextLongItem.php
@@ -16,9 +16,6 @@
  *   id = "text_long",
  *   label = @Translation("Long text"),
  *   description = @Translation("This field stores long text in the database."),
- *   instance_settings = {
- *     "text_processing" = "0"
- *   },
  *   default_widget = "text_textarea",
  *   default_formatter = "text_default"
  * )
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php
index 5fe30fc..f9307ce 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php
@@ -17,10 +17,6 @@
  *   id = "text_with_summary",
  *   label = @Translation("Long text and summary"),
  *   description = @Translation("This field stores long text in the database along with optional summary text."),
- *   instance_settings = {
- *     "text_processing" = "1",
- *     "display_summary" = "0"
- *   },
  *   default_widget = "text_textarea_with_summary",
  *   default_formatter = "text_default"
  * )
@@ -30,6 +26,16 @@ class TextWithSummaryItem extends TextItemBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultInstanceSettings() {
+    $settings = parent::defaultInstanceSettings();
+    $settings['text_processing'] = 1;
+    $settings['display_summary'] = 0;
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function propertyDefinitions(FieldDefinitionInterface $field_definition) {
     $properties = parent::propertyDefinitions($field_definition);
 
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..104ecca 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,10 +19,6 @@
  *   label = @Translation("Text area (multiple rows)"),
  *   field_types = {
  *     "text_long"
- *   },
- *   settings = {
- *     "rows" = "5",
- *     "placeholder" = ""
  *   }
  * )
  */
@@ -31,6 +27,16 @@ class TextareaWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['rows'] = '5';
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element['rows'] = array(
       '#type' => 'number',
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 4775b86..f715f8f 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,11 +19,6 @@
  *   label = @Translation("Text area with a summary"),
  *   field_types = {
  *     "text_with_summary"
- *   },
- *   settings = {
- *     "rows" = "9",
- *     "summary_rows" = "3",
- *     "placeholder" = ""
  *   }
  * )
  */
@@ -32,6 +27,17 @@ class TextareaWithSummaryWidget extends TextareaWidget {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    $settings['rows'] = '9';
+    $settings['summary_rows'] = '3';
+    $settings['placeholder'] = '';
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $element = parent::settingsForm($form, $form_state);
     $element['summary_rows'] = array(
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 35f6957..989bcb8 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
@@ -21,10 +21,6 @@
  *     "text",
  *     "string"
  *   },
- *   settings = {
- *     "size" = "60",
- *     "placeholder" = ""
- *   }
  * )
  */
 class TextfieldWidget extends StringWidget {
