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..4a0436b 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() {
+    return array(
+      'thousand_separator' => '',
+      'decimal_separator' => '.',
+      'scale' => 2,
+      'prefix_suffix' => TRUE,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..8768474 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() {
+    return array(
+      'thousand_separator' => '',
+      'prefix_suffix' => TRUE,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..cbb79d8 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() {
+    return array(
+      'precision' => 10,
+      'scale' => 2,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..a56b406 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() {
+    return array(
+      'target_type' => \Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user',
+      'target_bundle' => NULL,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    return array(
+      'handler' => 'default',
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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..1dfd9f4 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() {
+    return array(
+      'max_length' => 255,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..d74a85a 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() {
+    return array(
+      'max_length' => 2048,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..15cbe74 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() {
+    return array(
+      'max_length' => 128,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..889fbab 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() {
+    return array(
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..fa31ce7 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() {
+    return array(
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..ed1d928 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() {
+    return array(
+      'size' => 60,
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..fb8e07b 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,7 +49,7 @@ public function getSettings() {
   }
 
   /**
-   * Implements Drupal\field\Plugin\PluginSettingsInterface::getSetting().
+   * {@inheritdoc}
    */
   public function getSetting($key) {
     // Merge defaults if we have no value for the key.
@@ -56,20 +63,12 @@ public function getSetting($key) {
    * Merges default settings values into $settings.
    */
   protected function mergeDefaults() {
-    $this->settings += $this->getDefaultSettings();
+    $this->settings += 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 +77,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..9f9b7c6 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,22 +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
-   *   The plugin itself.
+   * @return $this
    */
   public function setSettings(array $settings);
 
@@ -61,8 +60,7 @@ public function setSettings(array $settings);
    * @param mixed $value
    *   The setting value.
    *
-   * @return \Drupal\field\Plugin\PluginSettingsInterface
-   *   The plugin itself.
+   * @return $this
    */
   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..16521b5 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() {
+    return array(
+      'pager_id' => 0,
+    ) + parent::defaultSettings();
+  }
+
+  /**
    * 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 f5f4a65..78bdf82 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
@@ -19,17 +19,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"
  * )
@@ -39,6 +28,29 @@ class CommentItem extends FieldItemBase implements CommentItemInterface {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    return array(
+      'description' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    return array(
+      'default_mode' => COMMENT_MODE_THREADED,
+      'per_page' => 50,
+      'form_location' => COMMENT_FORM_BELOW,
+      'anonymous' => COMMENT_ANONYMOUS_MAYNOT_CONTACT,
+      'subject' => 1,
+      'preview' => DRUPAL_OPTIONAL,
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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 c8320da..68c0a7e 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -740,21 +740,19 @@ 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.
+  // @todo Replace with own storage in https://drupal.org/node/2224761
+  if ($entity->getEntityTypeId() === 'field_config') {
+    $entity->settings += array('translation_sync' => FALSE);
+  }
+  // Synchronization can be enabled per instance.
+  // @todo Replace with own storage in https://drupal.org/node/2224761
+  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..3680072 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() {
+    return array(
+      'format_type' => 'medium',
+    ) + parent::defaultSettings();
+  }
+
+  /**
    * 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..e600079 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() {
+    return array(
+      'datetime_type' => 'datetime',
+    ) + parent::defaultSettings();
+  }
+
+  /**
    * 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..c9c3195 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() {
+    return array(
+      'increment' => '15',
+      'date_order' => 'YMD',
+      'time_type' => '24',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..550f3d7 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,26 @@ class ConfigurableEntityReferenceItem extends EntityReferenceItem implements All
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    $settings = parent::defaultSettings();
+    // The target bundle is handled by the 'target_bundles' property in the
+    // 'handler_settings' instance setting.
+    unset($settings['target_bundle']);
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    return array(
+      'handler_settings' => array(),
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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 bebc01a..623140f 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() {
+    return array(
+      'view_mode' => 'default',
+      'link' => FALSE,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm(array $form, array &$form_state) {
     $elements['view_mode'] = array(
       '#type' => 'select',
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..a062f0b 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() {
+    return array(
+      'link' => TRUE,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..f930de2 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() {
+    return array(
+      'match_operator' => 'CONTAINS',
+      'size' => '60',
+      'autocomplete_type' => 'tags',
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..234eb7a 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() {
+    return array(
+      'match_operator' => 'CONTAINS',
+      'size' => '60',
+      'autocomplete_type' => 'tags',
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 4ca7d7e..24141bd 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -127,13 +127,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';
@@ -175,15 +168,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';
 }
@@ -275,15 +263,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 2a7d5e5..39c406d 100644
--- a/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
+++ b/core/modules/field/lib/Drupal/field/Entity/FieldConfig.php
@@ -295,6 +295,7 @@ public function preSave(EntityStorageControllerInterface $storage_controller) {
    */
    protected function preSaveNew(EntityStorageControllerInterface $storage_controller) {
     $entity_manager = \Drupal::entityManager();
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
 
     // Assign the ID.
     $this->id = $this->id();
@@ -318,7 +319,7 @@ protected function preSaveNew(EntityStorageControllerInterface $storage_controll
     }
 
     // Check that the field type is known.
-    $field_type = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->type);
+    $field_type = $field_type_manager->getDefinition($this->type);
     if (!$field_type) {
       throw new FieldException(format_string('Attempt to create a field of unknown type %type.', array('%type' => $this->type)));
     }
@@ -326,7 +327,7 @@ 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'];
+     $this->settings += $field_type_manager->getDefaultSettings($this->type);
 
     // Notify the entity storage controller.
     $entity_manager->getStorageController($this->entity_type)->onFieldCreate($this);
@@ -524,10 +525,11 @@ public function getSettings() {
     //   some CPU and memory profiling to see if it's worth statically caching
     //   $field_type_info, or the default field and instance settings, within
     //   $this.
-    $field_type_info = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->type);
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
 
-    $settings = $this->settings + $field_type_info['settings'] + $field_type_info['instance_settings'];
-    return $settings;
+    $settings = $field_type_manager->getDefaultSettings($this->type);
+    $instance_settings = $field_type_manager->getDefaultInstanceSettings($this->type);
+    return $this->settings + $settings + $instance_settings;
   }
 
   /**
@@ -535,18 +537,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.
+    // We assume here that one call to 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..36a2770 100644
--- a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
@@ -63,8 +63,8 @@ function testCreateField() {
     $this->assertEqual($field_config['cardinality'], 1, 'Cardinality defaults to 1.');
 
     // 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.');
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
+    $this->assertEqual($field_config['settings'], $field_type_manager->getDefaultSettings($field_definition['type']), '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..3f2e116 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
@@ -133,8 +133,8 @@ function testFieldPrepare() {
     $field = field_info_field('entity_test', $field_definition['name']);
 
     // 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.');
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
+    $this->assertEqual($field->settings, $field_type_manager->getDefaultSettings($field_definition['type']), 'All expected default field settings are present.');
   }
 
   /**
@@ -167,8 +167,8 @@ function testInstancePrepare() {
     $instance = field_info_instance($instance_definition['entity_type'], $instance_definition['field_name'], $instance_definition['bundle']);
 
     // 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.');
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
+    $this->assertEqual($instance->settings, $field_type_manager->getDefaultInstanceSettings($field_definition['type']) , '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..19851fb 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
@@ -75,8 +75,7 @@ function testCreateFieldInstance() {
     // the loaded ConfigEntity, to be sure we check that the defaults are
     // applied on write.
     $config = \Drupal::config('field.instance.' . $instance->id())->get();
-
-    $field_type = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->field_definition['type']);
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
 
     // Check that default values are set.
     $this->assertEqual($config['required'], FALSE, 'Required defaults to false.');
@@ -84,7 +83,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_manager->getDefaultInstanceSettings($this->field_definition['type']) , '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..3e61ca1 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() {
+    return array(
+      'test_formatter_setting' => 'dummy test string',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..4b9bb4b 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() {
+    return array(
+      'test_empty_string' => '**EMPTY FIELD**',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..7cd25fb 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() {
+    return array(
+      'field_empty_setting' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..1aeb570 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() {
+    return array(
+      'test_formatter_setting_multiple' => 'dummy test string',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..beb17e9 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() {
+    return array(
+      'test_formatter_setting_additional' => 'dummy test string',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..58985b8 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() {
+    return array(
+      'foreign_key_name' => 'shape',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..b3326ef 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() {
+    return array(
+      'test_field_setting' => 'dummy test string',
+      'changeable' => 'a changeable field setting',
+      'unchangeable' => 'an unchangeable field setting',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    return array(
+      'test_instance_setting' => 'dummy test string',
+      'test_cached_data' => FALSE,
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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..1fcc8bc 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() {
+    return array(
+      'test_widget_setting' => 'dummy test string',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..ac4609c 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() {
+    return array(
+      'test_widget_setting_multiple' => 'dummy test string',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..2deca15 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 ($this->pluginManager->getDefaultSettings($display_options['type'])) {
           $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..1b8c16d 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,12 @@ function testViewModeCustom() {
     $node = $this->drupalCreateNode($settings);
 
     // Gather expected output values with the various formatters.
-    $formatters = \Drupal::service('plugin.manager.field.formatter')->getDefinitions();
+    $formatter_plugin_manager = \Drupal::service('plugin.manager.field.formatter');
+    $field_test_default_settings = $formatter_plugin_manager->getDefaultSettings('field_test_default');
+    $field_test_with_prepare_view_settings = $formatter_plugin_manager->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..7e66420 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() {
+    return array(
+      'target_type' => 'file',
+      'display_field' => 0,
+      'display_default' => 0,
+      'uri_scheme' => file_default_scheme(),
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    return array(
+      'file_extensions' => 'txt',
+      'file_directory' => '',
+      'max_filesize' => '',
+      'description_field' => 0,
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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..460b95e 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() {
+    return array(
+      'progress_indicator' => 'throbber',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..69bf5f5 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() {
+    return array(
+      'image_style' => '',
+      'image_link' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..f664bb8 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,59 @@ class ImageItem extends FileItem {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    return array(
+      'default_image' => array(
+        'fid' => NULL,
+        'alt' => '',
+        'title' => '',
+        'width' => NULL,
+        'height' => NULL,
+      ),
+      '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,
+        ),
+      ),
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultInstanceSettings() {
+    $settings = array(
+      'file_extensions' => 'png gif jpg jpeg',
+      'alt_field' => 0,
+      'alt_field_required' => 0,
+      'title_field' => 0,
+      'title_field_required' => 0,
+      'max_resolution' => '',
+      'min_resolution' => '',
+      'default_image' => array(
+        'fid' => NULL,
+        'alt' => '',
+        'width' => NULL,
+        'height' => NULL,
+      ),
+    ) + parent::defaultInstanceSettings();
+
+    unset($settings['description_field']);
+    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..811ed0f 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() {
+    return array(
+      'progress_indicator' => 'throbber',
+      'preview_image_style' => 'thumbnail',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..fd8db1c 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() {
+    return array(
+      'trim_length' => '80',
+      'url_only' => '',
+      'url_plain' => '',
+      'rel' => '',
+      'target' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..a123e80 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() {
+    return array(
+      'trim_length' => '80',
+      'rel' => '',
+      'target' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..58a5826 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() {
+    return array(
+      'title' => 1,
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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..7f69639 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() {
+    return array(
+      'placeholder_url' => '',
+      'placeholder_title' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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 b65a2da..76de3b7 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
@@ -23,10 +23,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 FieldItemBase implements AllowedValuesInterface {
@@ -34,6 +30,16 @@ class ListBooleanItem extends FieldItemBase implements AllowedValuesInterface {
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    return array(
+      'allowed_values' => array(),
+      'allowed_values_function' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getPossibleValues(AccountInterface $account = NULL) {
     return array_keys($this->getSettableOptions($account));
   }
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 5829f61..b3f7271 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
@@ -19,10 +19,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 e4f6a16..cc506d4 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
@@ -19,10 +19,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 1692444..b1816f2 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
@@ -19,6 +19,16 @@
   /**
    * {@inheritdoc}
    */
+  public static function defaultSettings() {
+    return array(
+      'allowed_values' => array(),
+      'allowed_values_function' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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 bf6b8ee..6180368 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
@@ -19,10 +19,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..731f3b2 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() {
+    return array(
+      'display_label' => FALSE,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..dc82c66 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() {
+    return array(
+      'responsive_image_mapping' => '',
+      'fallback_image_style' => '',
+      'image_link' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..eaa2103 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() {
+    return array(
+      'target_type' => 'taxonomy_term',
+      'options_list_callback' => NULL,
+      'allowed_values' => array(
+        array(
+          'vocabulary' => '',
+          'parent' => 0,
+        ),
+      ),
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..4d7fe8f 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() {
+    return array(
+      'size' => '60',
+      'autocomplete_route_name' => 'taxonomy.autocomplete',
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..dfab549 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() {
+    return array(
+      'title' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..0bdd1c8 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() {
+    return array(
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
 
   /**
    * {@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..c0901da 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() {
+    return array(
+      'trim_length' => '600',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..49ca7f1 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() {
+    return array(
+      'max_length' => 255,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..8cb505f 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() {
+    return array(
+      'text_processing' => 1,
+      'display_summary' => 0,
+    ) + parent::defaultInstanceSettings();
+  }
+
+  /**
+   * {@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..3c57008 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() {
+    return array(
+      'rows' => '5',
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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..e23e794 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() {
+    return array(
+      'rows' => '9',
+      'summary_rows' => '3',
+      'placeholder' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@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 {
