diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml
index ef68a3e..08f0162 100644
--- a/core/config/schema/core.data_types.schema.yml
+++ b/core/config/schema/core.data_types.schema.yml
@@ -414,9 +414,15 @@ core.date_format.*:
       type: string
       label: 'Default language'
 
+# Generic field settings schemas.
+
+field.storage_settings.*:
+  type: sequence
+  label: 'Settings'
+
 # Schema for the configuration of the String field type.
 
-field.string.storage_settings:
+field.storage_settings.string:
   type: mapping
   label: 'String settings'
   mapping:
@@ -441,8 +447,8 @@ field.string.value:
 
 # Schema for the configuration of the  String (long) field type.
 
-field.string_long.storage_settings:
-  type: field.string.storage_settings
+field.storage_settings.string_long:
+  type: field.storage_settings.string
   label: 'String (long) settings'
 
 field.string_long.field_settings:
@@ -462,7 +468,7 @@ field.string_long.value:
 
 # Schema for the configuration of the URI field type.
 
-field.uri.storage_settings:
+field.storage_settings.uri:
   type: mapping
   label: 'URI settings'
   mapping:
@@ -487,7 +493,7 @@ field.uri.value:
 
 # Schema for the configuration of the Created field type.
 
-field.created.storage_settings:
+field.storage_settings.created:
   type: sequence
   label: 'Created timestamp settings'
 
@@ -508,7 +514,7 @@ field.created.value:
 
 # Schema for the configuration of the Changed field type.
 
-field.changed.storage_settings:
+field.storage_settings.changed:
   type: sequence
   label: 'Changed timestamp settings'
 
@@ -529,7 +535,7 @@ field.changed.value:
 
 # Schema for the configuration of the Entity reference field type.
 
-field.entity_reference.storage_settings:
+field.storage_settings.entity_reference:
   type: mapping
   label: 'Entity reference settings'
   mapping:
@@ -561,7 +567,7 @@ field.entity_reference.value:
 
 # Schema for the configuration of the Boolean field type.
 
-field.boolean.storage_settings:
+field.storage_settings.boolean:
   type: mapping
   label: 'Boolean settings'
   mapping:
@@ -589,7 +595,7 @@ field.boolean.value:
 
 # Schema for the configuration of the Email field type.
 
-field.email.storage_settings:
+field.storage_settings.email:
   type: sequence
   label: 'Email settings'
   sequence:
@@ -615,7 +621,7 @@ field.email.value:
 
 # Schema for the configuration of the Integer field type.
 
-field.integer.storage_settings:
+field.storage_settings.integer:
   type: sequence
   label: 'Integer settings'
   sequence:
@@ -638,6 +644,9 @@ field.integer.field_settings:
     suffix:
       type: string
       label: 'Suffix'
+    size:
+      type: string
+      label: 'Size'
 
 field.integer.value:
   type: sequence
@@ -652,7 +661,7 @@ field.integer.value:
 
 # Schema for the configuration of the Decimal field type.
 
-field.decimal.storage_settings:
+field.storage_settings.decimal:
   type: mapping
   label: 'Decimal settings'
   mapping:
@@ -693,7 +702,7 @@ field.decimal.value:
 
 # Schema for the configuration of the Float field type.
 
-field.float.storage_settings:
+field.storage_settings.float:
   type: sequence
   label: 'Float settings'
   sequence:
diff --git a/core/modules/comment/config/schema/comment.schema.yml b/core/modules/comment/config/schema/comment.schema.yml
index b5bcd86..9ffe3de 100644
--- a/core/modules/comment/config/schema/comment.schema.yml
+++ b/core/modules/comment/config/schema/comment.schema.yml
@@ -60,7 +60,7 @@ comment.type.*:
       type: text
       label: 'Description'
 
-field.comment.storage_settings:
+field.storage_settings.comment:
   type: sequence
   label: 'Settings'
   sequence:
diff --git a/core/modules/datetime/config/schema/datetime.schema.yml b/core/modules/datetime/config/schema/datetime.schema.yml
index 58e4cc6..68acbda 100644
--- a/core/modules/datetime/config/schema/datetime.schema.yml
+++ b/core/modules/datetime/config/schema/datetime.schema.yml
@@ -1,6 +1,6 @@
 # Schema for the configuration files of the Datetime module.
 
-field.datetime.storage_settings:
+field.storage_settings.datetime:
   type: mapping
   label: 'Datetime settings'
   mapping:
diff --git a/core/modules/datetime/src/Tests/DateTimeFieldTest.php b/core/modules/datetime/src/Tests/DateTimeFieldTest.php
index 281e78c..e0fa4c2 100644
--- a/core/modules/datetime/src/Tests/DateTimeFieldTest.php
+++ b/core/modules/datetime/src/Tests/DateTimeFieldTest.php
@@ -9,7 +9,7 @@
 
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Entity\Entity\EntityViewDisplay;
-use Drupal\simpletest\WebTestBase;
+use Drupal\field\Tests\FieldTypeTestBase;
 use Drupal\Core\Datetime\DrupalDateTime;
 
 /**
@@ -17,7 +17,7 @@
  *
  * @group datetime
  */
-class DateTimeFieldTest extends WebTestBase {
+class DateTimeFieldTest extends FieldTypeTestBase {
 
   /**
    * Modules to enable.
@@ -141,6 +141,7 @@ function testDateField() {
 
     // Verify that the plain formatter works.
     $this->display_options['type'] = 'datetime_plain';
+    $this->display_options['settings'] = array();
     entity_get_display($this->field->entity_type, $this->field->bundle, 'full')
       ->setComponent($field_name, $this->display_options)
       ->save();
@@ -206,6 +207,7 @@ function testDatetimeField() {
 
     // Verify that the plain formatter works.
     $this->display_options['type'] = 'datetime_plain';
+    $this->display_options['settings'] = array();
     entity_get_display($this->field->entity_type, $this->field->bundle, 'full')
       ->setComponent($field_name, $this->display_options)
       ->save();
diff --git a/core/modules/field/config/schema/field.schema.yml b/core/modules/field/config/schema/field.schema.yml
index 862f40a..b47cf07 100644
--- a/core/modules/field/config/schema/field.schema.yml
+++ b/core/modules/field/config/schema/field.schema.yml
@@ -25,7 +25,7 @@ field.storage.*.*:
       type: string
       label: 'Type'
     settings:
-      type: field.[%parent.type].storage_settings
+      type: field.storage_settings.[%parent.type]
     module:
       type: string
       label: 'Module'
diff --git a/core/modules/field/src/Tests/Email/EmailFieldTest.php b/core/modules/field/src/Tests/Email/EmailFieldTest.php
index 2ce3c46..3672cfb 100644
--- a/core/modules/field/src/Tests/Email/EmailFieldTest.php
+++ b/core/modules/field/src/Tests/Email/EmailFieldTest.php
@@ -8,14 +8,14 @@
 namespace Drupal\field\Tests\Email;
 
 use Drupal\Component\Utility\Unicode;
-use Drupal\simpletest\WebTestBase;
+use Drupal\field\Tests\FieldTypeTestBase;
 
 /**
  * Tests email field functionality.
  *
  * @group field
  */
-class EmailFieldTest extends WebTestBase {
+class EmailFieldTest extends FieldTypeTestBase {
 
   /**
    * Modules to enable.
diff --git a/core/modules/field/src/Tests/FieldTypeTestBase.php b/core/modules/field/src/Tests/FieldTypeTestBase.php
new file mode 100644
index 0000000..ed92eb9
--- /dev/null
+++ b/core/modules/field/src/Tests/FieldTypeTestBase.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\field\Tests\FieldTypeTestBase.
+ */
+
+namespace Drupal\field\Tests;
+
+use Drupal\simpletest\WebTestBase;
+use Drupal\config\Tests\SchemaCheckTestTrait;
+
+/**
+ * Base class to automatically assert entity display schemas.
+ */
+abstract class FieldTypeTestBase extends WebTestBase {
+
+  use SchemaCheckTestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function tearDown() {
+    // Assert schemas for all entity view and form displays.
+    $names = array_merge(
+      $this->container->get('config.storage')->listAll('field.storage.'),
+      $this->container->get('config.storage')->listAll('field.field.')
+    );
+
+    $factory = $this->container->get('config.factory');
+    /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config */
+    $typed_config = $this->container->get('config.typed');
+    foreach ($names as $name) {
+      $config = $factory->get($name);
+      $this->assertConfigSchema($typed_config, $name, $config->get());
+    }
+
+    parent::tearDown();
+  }
+
+}
diff --git a/core/modules/field/src/Tests/Number/NumberFieldTest.php b/core/modules/field/src/Tests/Number/NumberFieldTest.php
index ca1fbb0..56e0b34 100644
--- a/core/modules/field/src/Tests/Number/NumberFieldTest.php
+++ b/core/modules/field/src/Tests/Number/NumberFieldTest.php
@@ -8,14 +8,14 @@
 namespace Drupal\field\Tests\Number;
 
 use Drupal\Component\Utility\Unicode;
-use Drupal\simpletest\WebTestBase;
+use Drupal\field\Tests\FieldTypeTestBase;
 
 /**
  * Tests the creation of numeric fields.
  *
  * @group field
  */
-class NumberFieldTest extends WebTestBase {
+class NumberFieldTest extends FieldTypeTestBase {
 
   /**
    * Modules to enable.
@@ -49,7 +49,7 @@ function testNumberDecimalField() {
       'entity_type' => 'entity_test',
       'type' => 'decimal',
       'settings' => array(
-        'precision' => 8, 'scale' => 4, 'decimal_separator' => '.',
+        'precision' => 8, 'scale' => 4,
       )
     ))->save();
     entity_create('field_config', array(
diff --git a/core/modules/field/src/Tests/String/StringFieldTest.php b/core/modules/field/src/Tests/String/StringFieldTest.php
new file mode 100644
index 0000000..faebcee
--- /dev/null
+++ b/core/modules/field/src/Tests/String/StringFieldTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Definition of \Drupal\field\Tests\String\StringFieldTest.
+ */
+
+namespace Drupal\field\Tests\String;
+
+use Drupal\Component\Utility\Unicode;
+use Drupal\field\Tests\FieldTypeTestBase;
+
+/**
+ * Tests the creation of string fields.
+ *
+ * @group text
+ */
+class StringFieldTest extends FieldTypeTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  protected $web_user;
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->web_user = $this->drupalCreateUser(array('view test entity', 'administer entity_test content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  // Test fields.
+
+  /**
+   * Test widgets.
+   */
+  function testTextfieldWidgets() {
+    $this->_testTextfieldWidgets('string', 'string_textfield');
+    $this->_testTextfieldWidgets('string_long', 'string_textarea');
+  }
+
+  /**
+   * Helper function for testTextfieldWidgets().
+   */
+  function _testTextfieldWidgets($field_type, $widget_type) {
+    // Create a field.
+    $field_name = Unicode::strtolower($this->randomMachineName());
+    $field_storage = entity_create('field_storage_config', array(
+      'field_name' => $field_name,
+      'entity_type' => 'entity_test',
+      'type' => $field_type
+    ));
+    $field_storage->save();
+    entity_create('field_config', array(
+      'field_storage' => $field_storage,
+      'bundle' => 'entity_test',
+      'label' => $this->randomMachineName() . '_label',
+    ))->save();
+    entity_get_form_display('entity_test', 'entity_test', 'default')
+      ->setComponent($field_name, array(
+        'type' => $widget_type,
+        'settings' => array(
+          'placeholder' => 'A placeholder on ' . $widget_type,
+        ),
+      ))
+      ->save();
+    entity_get_display('entity_test', 'entity_test', 'full')
+      ->setComponent($field_name)
+      ->save();
+
+    // Display creation form.
+    $this->drupalGet('entity_test/add');
+    $this->assertFieldByName("{$field_name}[0][value]", '', 'Widget is displayed');
+    $this->assertNoFieldByName("{$field_name}[0][format]", '1', 'Format selector is not displayed');
+    $this->assertRaw(format_string('placeholder="A placeholder on !widget_type"', array('!widget_type' => $widget_type)));
+
+    // Submit with some value.
+    $value = $this->randomMachineName();
+    $edit = array(
+      "{$field_name}[0][value]" => $value,
+    );
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+    preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
+    $id = $match[1];
+    $this->assertText(t('entity_test @id has been created.', array('@id' => $id)), 'Entity was created');
+
+    // Display the entity.
+    $entity = entity_load('entity_test', $id);
+    $display = entity_get_display($entity->getEntityTypeId(), $entity->bundle(), 'full');
+    $content = $display->build($entity);
+    $this->drupalSetContent(drupal_render($content));
+    $this->assertText($value, 'Filtered tags are not displayed');
+  }
+}
diff --git a/core/modules/file/config/schema/file.schema.yml b/core/modules/file/config/schema/file.schema.yml
index cd21f38..4f8644a 100644
--- a/core/modules/file/config/schema/file.schema.yml
+++ b/core/modules/file/config/schema/file.schema.yml
@@ -22,7 +22,7 @@ file.settings:
           type: path
           label: 'Directory'
 
-field.file.storage_settings:
+field.storage_settings.file:
   type: base_entity_reference_field_settings
   label: 'File settings'
   mapping:
diff --git a/core/modules/image/config/schema/image.schema.yml b/core/modules/image/config/schema/image.schema.yml
index f0db0d5..b3cae62 100644
--- a/core/modules/image/config/schema/image.schema.yml
+++ b/core/modules/image/config/schema/image.schema.yml
@@ -77,8 +77,8 @@ image.settings:
       type: boolean
       label: 'Suppress the itok query string for image derivatives'
 
-field.image.storage_settings:
-  type: field.file.storage_settings
+field.storage_settings.image:
+  type: field.storage_settings.file
   label: 'Image settings'
   mapping:
     default_image:
diff --git a/core/modules/image/src/Tests/ImageFieldDisplayTest.php b/core/modules/image/src/Tests/ImageFieldDisplayTest.php
index c49af3c..2111d32 100644
--- a/core/modules/image/src/Tests/ImageFieldDisplayTest.php
+++ b/core/modules/image/src/Tests/ImageFieldDisplayTest.php
@@ -175,7 +175,6 @@ function testImageFieldSettings() {
       'max_resolution' => '100x100',
       'min_resolution' => '10x10',
       'title_field' => 1,
-      'description' => '[site:name]_description',
     );
     $widget_settings = array(
       'preview_image_style' => 'medium',
diff --git a/core/modules/image/src/Tests/ImageFieldTestBase.php b/core/modules/image/src/Tests/ImageFieldTestBase.php
index 33e7fc1..9b374f4 100644
--- a/core/modules/image/src/Tests/ImageFieldTestBase.php
+++ b/core/modules/image/src/Tests/ImageFieldTestBase.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\image\Tests;
 
-use Drupal\simpletest\WebTestBase;
+use Drupal\field\Tests\FieldTypeTestBase;
 
 /**
  * TODO: Test the following functions.
@@ -25,7 +25,7 @@
 /**
  * This class provides methods specifically for testing Image's field handling.
  */
-abstract class ImageFieldTestBase extends WebTestBase {
+abstract class ImageFieldTestBase extends FieldTypeTestBase {
 
   /**
    * Modules to enable.
diff --git a/core/modules/options/config/schema/options.schema.yml b/core/modules/options/config/schema/options.schema.yml
index 03cb81f..7dd5f6d 100644
--- a/core/modules/options/config/schema/options.schema.yml
+++ b/core/modules/options/config/schema/options.schema.yml
@@ -1,6 +1,6 @@
 # Schema for the configuration files of the Options module.
 
-field.list_integer.storage_settings:
+field.storage_settings.list_integer:
   type: mapping
   label: 'List (integer) settings'
   mapping:
@@ -23,8 +23,7 @@ field.list_integer.storage_settings:
 
 field.list_integer.field_settings:
   label: 'List (integer)'
-  type: mapping
-  mapping: {  }
+  type: sequence
 
 field.list_integer.value:
   type: sequence
@@ -37,7 +36,7 @@ field.list_integer.value:
           type: integer
           label: 'Value'
 
-field.list_float.storage_settings:
+field.storage_settings.list_float:
   type: mapping
   label: 'List (float) settings'
   mapping:
@@ -60,8 +59,7 @@ field.list_float.storage_settings:
 
 field.list_float.field_settings:
   label: 'List (float)'
-  type: mapping
-  mapping: {  }
+  type: sequence
 
 field.list_float.value:
   type: sequence
@@ -74,7 +72,7 @@ field.list_float.value:
           type: string
           label: 'Value'
 
-field.list_string.storage_settings:
+field.storage_settings.list_string:
   type: mapping
   label: 'List (text) settings'
   mapping:
@@ -97,8 +95,7 @@ field.list_string.storage_settings:
 
 field.list_string.field_settings:
   label: 'List (float)'
-  type: mapping
-  mapping: {  }
+  type: sequence
 
 field.list_string.value:
   type: sequence
diff --git a/core/modules/taxonomy/config/schema/taxonomy.schema.yml b/core/modules/taxonomy/config/schema/taxonomy.schema.yml
index 579f673..dc6c8e6 100644
--- a/core/modules/taxonomy/config/schema/taxonomy.schema.yml
+++ b/core/modules/taxonomy/config/schema/taxonomy.schema.yml
@@ -39,7 +39,7 @@ taxonomy.vocabulary.*:
       sequence:
         - type: taxonomy.vocabulary.third_party.[%key]
 
-field.taxonomy_term_reference.storage_settings:
+field.storage_settings.taxonomy_term_reference:
   type: base_entity_reference_field_settings
   label: 'Taxonomy term reference settings'
   mapping:
diff --git a/core/modules/text/config/schema/text.schema.yml b/core/modules/text/config/schema/text.schema.yml
index f472aec..36fe3cd 100644
--- a/core/modules/text/config/schema/text.schema.yml
+++ b/core/modules/text/config/schema/text.schema.yml
@@ -8,7 +8,7 @@ text.settings:
       type: integer
       label: 'Default summary length'
 
-field.text.storage_settings:
+field.storage_settings.text:
   type: mapping
   label: 'Text (formatted) settings'
   mapping:
@@ -19,8 +19,6 @@ field.text.storage_settings:
 field.text.field_settings:
   type: mapping
   label: 'Text (formatted) settings'
-  sequence:
-    - type: string
 
 field.text.value:
   type: sequence
@@ -36,15 +34,13 @@ field.text.value:
           type: string
           label: 'Text format'
 
-field.text_long.storage_settings:
+field.storage_settings.text_long:
   label: 'Text (formatted, long) settings'
-  type: mapping
-  mapping: {  }
+  type: sequence
 
 field.text_long.field_settings:
   label: 'Text (formatted, long) settings'
-  type: mapping
-  mapping: {  }
+  type: sequence
 
 field.text_long.value:
   type: sequence
@@ -60,10 +56,9 @@ field.text_long.value:
           type: string
           label: 'Text format'
 
-field.text_with_summary.storage_settings:
+field.storage_settings.text_with_summary:
   label: 'Text (formatted, long, with summary) settings'
-  type: mapping
-  mapping: {  }
+  type: sequence
 
 field.text_with_summary.field_settings:
   type: mapping
diff --git a/core/modules/text/src/Tests/TextFieldTest.php b/core/modules/text/src/Tests/TextFieldTest.php
index e771af9..e8ece1f 100644
--- a/core/modules/text/src/Tests/TextFieldTest.php
+++ b/core/modules/text/src/Tests/TextFieldTest.php
@@ -9,31 +9,21 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Component\Utility\Unicode;
-use Drupal\simpletest\WebTestBase;
+use Drupal\field\Tests\String\StringFieldTest;
 
 /**
  * Tests the creation of text fields.
  *
  * @group text
  */
-class TextFieldTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('entity_test');
+class TextFieldTest extends StringFieldTest {
 
   protected $admin_user;
-  protected $web_user;
 
   protected function setUp() {
     parent::setUp();
 
     $this->admin_user = $this->drupalCreateUser(array('administer filters'));
-    $this->web_user = $this->drupalCreateUser(array('view test entity', 'administer entity_test content'));
-    $this->drupalLogin($this->web_user);
   }
 
   // Test fields.
@@ -82,59 +72,6 @@ function testTextfieldWidgets() {
   }
 
   /**
-   * Helper function for testTextfieldWidgets().
-   */
-  function _testTextfieldWidgets($field_type, $widget_type) {
-    // Create a field.
-    $field_name = Unicode::strtolower($this->randomMachineName());
-    $field_storage = entity_create('field_storage_config', array(
-      'field_name' => $field_name,
-      'entity_type' => 'entity_test',
-      'type' => $field_type
-    ));
-    $field_storage->save();
-    entity_create('field_config', array(
-      'field_storage' => $field_storage,
-      'bundle' => 'entity_test',
-      'label' => $this->randomMachineName() . '_label',
-    ))->save();
-    entity_get_form_display('entity_test', 'entity_test', 'default')
-      ->setComponent($field_name, array(
-        'type' => $widget_type,
-        'settings' => array(
-          'placeholder' => 'A placeholder on ' . $widget_type,
-        ),
-      ))
-      ->save();
-    entity_get_display('entity_test', 'entity_test', 'full')
-      ->setComponent($field_name)
-      ->save();
-
-    // Display creation form.
-    $this->drupalGet('entity_test/add');
-    $this->assertFieldByName("{$field_name}[0][value]", '', 'Widget is displayed');
-    $this->assertNoFieldByName("{$field_name}[0][format]", '1', 'Format selector is not displayed');
-    $this->assertRaw(format_string('placeholder="A placeholder on !widget_type"', array('!widget_type' => $widget_type)));
-
-    // Submit with some value.
-    $value = $this->randomMachineName();
-    $edit = array(
-      "{$field_name}[0][value]" => $value,
-    );
-    $this->drupalPostForm(NULL, $edit, t('Save'));
-    preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
-    $id = $match[1];
-    $this->assertText(t('entity_test @id has been created.', array('@id' => $id)), 'Entity was created');
-
-    // Display the entity.
-    $entity = entity_load('entity_test', $id);
-    $display = entity_get_display($entity->getEntityTypeId(), $entity->bundle(), 'full');
-    $content = $display->build($entity);
-    $this->drupalSetContent(drupal_render($content));
-    $this->assertText($value, 'Filtered tags are not displayed');
-  }
-
-  /**
    * Test widgets + 'formatted_text' setting.
    */
   function testTextfieldWidgetsFormatted() {
