diff --git a/core/modules/image/image.install b/core/modules/image/image.install
index 9a14749ce5dd16ecc18aa07de757457a56771f36..d860e97781186ed9dd4edf801efcf72c86cbd264 100644
--- a/core/modules/image/image.install
+++ b/core/modules/image/image.install
@@ -58,6 +58,17 @@ function image_requirements($phase) {
   return $requirements;
 }
 
+/**
+ * Implements hook_update_dependencies().
+ */
+function image_update_dependencies() {
+  // Convert image field and instance setting 'default_image' from integer to
+  // array only after fields and instances were converted to config.
+  $dependencies['image'][8003] = array('field' => 8006);
+
+  return $dependencies;
+}
+
 /**
  * Loads all effects for an image style from backend.
  *
@@ -237,3 +248,42 @@ function image_update_8002() {
     'image_style_preview_image' => 'preview_image',
   ));
 }
+
+/**
+ * Convert image field and instance setting 'default_image' from integer to
+ * array by adding alt, title, width, and height options.
+ */
+function image_update_8003() {
+  $image_factory = \Drupal::service('image.factory');
+  foreach (array('field', 'instance') as $type) {
+    $prefix = "field.$type";
+    foreach (config_get_storage_names_with_prefix($prefix) as $config_id) {
+      $config = \Drupal::config($config_id);
+      $is_image = ($type == 'field' && $config->get('type') == 'image') || ($type == 'instance' && $config->get('field_type') == 'image');
+      // Not dealing with an image field or image field instance?
+      if (!$is_image) {
+        continue;
+      }
+      $width = 0;
+      $height = 0;
+      if ($fid = (int) $config->get('settings.default_image')) {
+        $uri = db_query('SELECT fid FROM {file_managed} WHERE fid = :fid', array(':fid' => $fid))->fetchField();
+        if ($uri) {
+          $image = $image_factory->get($uri);
+          $width = $image->getWidth();
+          $height = $image->getHeight();
+        }
+      }
+      $default_image = array(
+        'fid' => $fid ?: NULL,
+        'alt' => '',
+        'title' => '',
+        'width' => $width ?: NULL,
+        'height' => $height ?: NULL,
+      );
+      $config
+        ->set('settings.default_image', $default_image)
+        ->save();
+    }
+  }
+}
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index 10b65dd0f57e39e0a4a4d186ad6fa8f24eac3a4a..8abca8b514838a516c00cff152670e4f0698cc0a 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -424,14 +424,31 @@ function image_entity_presave(EntityInterface $entity, $type) {
   elseif ($entity instanceof Field) {
     $field = $entity;
   }
-  if ($field && $field->type == 'image' && is_array($entity->settings['default_image'])) {
-    if (!empty($entity->settings['default_image'][0])) {
-      $entity->settings['default_image'] = $entity->settings['default_image'][0];
-    }
-    else {
-      $entity->settings['default_image'] = 0;
+  // Exit, if not saving an image field or image field instance entity.
+  if (!$field || $field->type != 'image') {
+    return;
+  }
+
+  if (!empty($entity->settings['default_image']['fid'][0])) {
+    $entity->settings['default_image']['fid'] = $entity->settings['default_image']['fid'][0];
+  }
+  if ($fid = $entity->settings['default_image']['fid']) {
+    $original_fid = isset($entity->original) ? $entity->original->settings['default_image']['fid'] : NULL;
+    if ($fid != $original_fid) {
+      $image = \Drupal::service('image.factory')->get(file_load($fid)->getFileUri());
+      $entity->settings['default_image']['width'] = $image->getWidth();
+      $entity->settings['default_image']['height'] = $image->getHeight();
     }
   }
+  else {
+    $entity->settings['default_image'] = array(
+      'fid' => NULL,
+      'alt' => '',
+      'title' => '',
+      'width' => NULL,
+      'height' => NULL,
+    );
+  }
 }
 
 /**
@@ -446,10 +463,11 @@ function image_field_entity_update(FieldInterface $field) {
   $prior_field = $field->original;
 
   // The value of a managed_file element can be an array if #extended == TRUE.
-  $fid_new = (isset($field->settings['default_image']['fids']) ? $field->settings['default_image']['fids'] : $field->settings['default_image']);
-  $fid_old = (isset($prior_field->settings['default_image']['fids']) ? $prior_field->settings['default_image']['fids'] : $prior_field->settings['default_image']);
-  // Ensure sure that fid_new and old are arrays, because default_image might
-  // be the fallback value 0, see image_field_info().
+  $fid_new = isset($field->settings['default_image']['fid']['fids']) ? $field->settings['default_image']['fid']['fids'] : $field->settings['default_image']['fid'];
+  $fid_old = isset($prior_field->settings['default_image']['fid']['fids']) ? $prior_field->settings['default_image']['fid']['fids'] : $prior_field->settings['default_image']['fid'];
+  // Ensure that $fid_new and $fid_old are arrays, because the field setting
+  // 'default_image' key 'fid' might be the fallback value 0, see the annotation
+  // block of \Drupal\image\Plugin\Field\FieldType\ImageItem.
   $fid_old = (array) $fid_old;
   $fid_new = (array) $fid_new;
 
@@ -492,11 +510,11 @@ function image_field_instance_update(FieldInstanceInterface $field_instance) {
 
   // The value of a managed_file element can be an array if the #extended
   // property is set to TRUE.
-  $fid_new = $field_instance->settings['default_image'];
+  $fid_new = $field_instance->settings['default_image']['fid'];
   if (isset($fid_new['fids'])) {
     $fid_new = $fid_new['fids'];
   }
-  $fid_old = $prior_instance->settings['default_image'];
+  $fid_old = $prior_instance->settings['default_image']['fid'];
   if (isset($fid_old['fids'])) {
     $fid_old = $fid_old['fids'];
   }
@@ -534,7 +552,7 @@ function image_field_entity_delete(FieldInterface $field) {
   }
 
   // The value of a managed_file element can be an array if #extended == TRUE.
-  $fid = (isset($field->settings['default_image']['fids']) ? $field->settings['default_image']['fids'] : $field->settings['default_image']);
+  $fid = (isset($field->settings['default_image']['fid']['fids']) ? $field->settings['default_image']['fid']['fids'] : $field->settings['default_image']['fid']);
   if ($fid && ($file = file_load($fid[0]))) {
     file_usage()->delete($file, 'image', 'default_image', $field->uuid);
   }
@@ -552,7 +570,7 @@ function image_field_instance_delete(FieldInstanceInterface $field_instance) {
 
   // The value of a managed_file element can be an array if the #extended
   // property is set to TRUE.
-  $fid = $field_instance->settings['default_image'];
+  $fid = $field_instance->settings['default_image']['fid'];
   if (is_array($fid)) {
     $fid = $fid['fid'];
   }
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatterBase.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatterBase.php
index c934270fd5d7759db11c4e60d87a9afb4ceee06d..443c72a0260120e2ecf684d512891214b3b9769c 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatterBase.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldFormatter/ImageFormatterBase.php
@@ -25,18 +25,20 @@ public function prepareView(array $entities_items) {
     foreach ($entities_items as $items) {
       if ($items->isEmpty()) {
         // Add the default image if one is found.
-        $fid = $this->getFieldSetting('default_image');
+        $default_image = $this->getFieldSetting('default_image');
         // If we are dealing with a configurable field, look in both
         // instance-level and field-level settings.
-        if (empty($fid) && $this->fieldDefinition instanceof FieldInstanceInterface) {
-          $fid = $this->fieldDefinition->getField()->getFieldSetting('default_image');
+        if (empty($default_image['fid']) && $this->fieldDefinition instanceof FieldInstanceInterface) {
+          $default_image = $this->fieldDefinition->getField()->getFieldSetting('default_image');
         }
 
-        if ($fid && ($file = file_load($fid))) {
+        if (!empty($default_image['fid']) && ($file = file_load($default_image['fid']))) {
           $items->setValue(array(array(
             'is_default' => TRUE,
-            'alt' => '',
-            'title' => '',
+            'alt' => $default_image['alt'],
+            'title' => $default_image['title'],
+            'width' => $default_image['width'],
+            'height' => $default_image['height'],
             'entity' => $file,
             'target_id' => $file->id(),
           )));
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 e8d59c04cff62d0f350fab0f920848e145acff94..fba789551707dccce88cb5b4748d5d15c316b42c 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
@@ -19,7 +19,13 @@
  *   description = @Translation("This field stores the ID of an image file as an integer value."),
  *   settings = {
  *     "uri_scheme" = "",
- *     "default_image" = "0",
+ *     "default_image" = {
+ *       "fid" = NULL,
+ *       "alt" = "",
+ *       "title" = "",
+ *       "width" = NULL,
+ *       "height" = NULL
+ *     },
  *     "column_groups" = {
  *       "file" = {
  *         "label" = @Translation("File"),
@@ -45,7 +51,13 @@
  *     "title_field_required" = "0",
  *     "max_resolution" = "",
  *     "min_resolution" = "",
- *     "default_image" = "0"
+ *     "default_image" = {
+ *       "fid" = NULL,
+ *       "alt" = "",
+ *       "title" = "",
+ *       "width" = NULL,
+ *       "height" = NULL
+ *     }
  *   },
  *   default_widget = "image_image",
  *   default_formatter = "image",
@@ -153,13 +165,9 @@ public function settingsForm(array $form, array &$form_state, $has_data) {
       '#description' => t('Select where the final files should be stored. Private file storage has significantly more overhead than public files, but allows restricted access to files within this field.'),
     );
 
-    $element['default_image'] = array(
-      '#title' => t('Default image'),
-      '#type' => 'managed_file',
-      '#description' => t('If no image is uploaded, this image will be shown on display.'),
-      '#default_value' => empty($settings['default_image']) ? array() : array($settings['default_image']),
-      '#upload_location' => $settings['uri_scheme'] . '://default_images/',
-    );
+    // Add default_image element.
+    static::defaultImageForm($element, $settings);
+    $element['default_image']['#description'] = t('If no image is uploaded, this image will be shown on display.');
 
     return $element;
   }
@@ -269,14 +277,9 @@ public function instanceSettingsForm(array $form, array &$form_state) {
       ),
     );
 
-    // Add the default image to the instance.
-    $element['default_image'] = array(
-      '#title' => t('Default image'),
-      '#type' => 'managed_file',
-      '#description' => t("If no image is uploaded, this image will be shown on display and will override the field's default image."),
-      '#default_value' => empty($settings['default_image']) ? array() : array($settings['default_image']),
-      '#upload_location' => $settings['uri_scheme'] . '://default_images/',
-    );
+    // Add default_image element.
+    static::defaultImageForm($element, $settings);
+    $element['default_image']['#description'] = t("If no image is uploaded, this image will be shown on display and will override the field's default image.");
 
     return $element;
   }
@@ -316,6 +319,51 @@ public static function validateResolution($element, &$form_state) {
     }
   }
 
+  /**
+   * Builds the default_image details element.
+   *
+   * @param array $element
+   *   The form associative array passed by reference.
+   * @param array $settings
+   *   The field settings array.
+   */
+  protected function defaultImageForm(array &$element, array $settings) {
+    $element['default_image'] = array(
+      '#type' => 'details',
+      '#title' => t('Default image'),
+      '#open' => TRUE,
+    );
+    $element['default_image']['fid'] = array(
+      '#type' => 'managed_file',
+      '#title' => t('Image'),
+      '#description' => t('Image to be shown if no image is uploaded.'),
+      '#default_value' => empty($settings['default_image']['fid']) ? array() : array($settings['default_image']['fid']),
+      '#upload_location' => $settings['uri_scheme'] . '://default_images/',
+    );
+    $element['default_image']['alt'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Alternate text'),
+      '#description' => t('This text will be used by screen readers, search engines, and when the image cannot be loaded.'),
+      '#default_value' => $settings['default_image']['alt'],
+      '#maxlength' => 512,
+    );
+    $element['default_image']['title'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Title'),
+      '#description' => t('The title attribute is used as a tooltip when the mouse hovers over the image.'),
+      '#default_value' => $settings['default_image']['title'],
+      '#maxlength' => 1024,
+    );
+    $element['default_image']['width'] = array(
+      '#type' => 'value',
+      '#value' => $settings['default_image']['width'],
+    );
+    $element['default_image']['height'] = array(
+      '#type' => 'value',
+      '#value' => $settings['default_image']['height'],
+    );
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
index 698b34b72a08f85f1335e85b35b86aa8530d1e8d..a616a4df70c2ab65f446dfefe70954270de0a94b 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
@@ -42,11 +42,19 @@ public function testDefaultImages() {
 
     // Create an image field and add an instance to the article content type.
     $field_name = strtolower($this->randomName());
-    $field_settings = array(
-      'default_image' => $default_images['field']->id(),
+    $field_settings['default_image'] = array(
+      'fid' => $default_images['field']->id(),
+      'alt' => '',
+      'title' => '',
+      'width' => 0,
+      'height' => 0,
     );
-    $instance_settings = array(
-      'default_image' => $default_images['instance']->id(),
+    $instance_settings['default_image'] = array(
+      'fid' => $default_images['instance']->id(),
+      'alt' => '',
+      'title' => '',
+      'width' => 0,
+      'height' => 0,
     );
     $widget_settings = array(
       'preview_image_style' => 'medium',
@@ -54,20 +62,22 @@ public function testDefaultImages() {
     $instance = $this->createImageField($field_name, 'article', $field_settings, $instance_settings, $widget_settings);
 
     // The instance default image id should be 2.
-    $this->assertEqual($instance->getFieldSetting('default_image'), $default_images['instance']->id());
+    $default_image = $instance->getFieldSetting('default_image');
+    $this->assertEqual($default_image['fid'], $default_images['instance']->id());
 
     // Also test \Drupal\field\Entity\FieldInstance::getFieldSetting().
     $instance_field_settings = $instance->getFieldSettings();
-    $this->assertEqual($instance_field_settings['default_image'], $default_images['instance']->id());
+    $this->assertEqual($instance_field_settings['default_image']['fid'], $default_images['instance']->id());
 
     $field = $instance->getField();
 
     // The field default image id should be 1.
-    $this->assertEqual($field->getFieldSetting('default_image'), $default_images['field']->id());
+    $default_image = $field->getFieldSetting('default_image');
+    $this->assertEqual($default_image['fid'], $default_images['field']->id());
 
     // Also test \Drupal\field\Entity\Field::getFieldSettings().
     $field_field_settings = $field->getFieldSettings();
-    $this->assertEqual($field_field_settings['default_image'], $default_images['field']->id());
+    $this->assertEqual($field_field_settings['default_image']['fid'], $default_images['field']->id());
 
     // Add another instance with another default image to the page content type.
     $instance2 = entity_create('field_instance', array(
@@ -77,7 +87,13 @@ public function testDefaultImages() {
       'label' => $instance->label(),
       'required' => $instance->required,
       'settings' => array(
-        'default_image' => $default_images['instance2']->id(),
+        'default_image' => array(
+          'fid' => $default_images['instance2']->id(),
+          'alt' => '',
+          'title' => '',
+          'width' => 0,
+          'height' => 0,
+        ),
       ),
     ));
     $instance2->save();
@@ -93,7 +109,7 @@ public function testDefaultImages() {
     // Confirm the defaults are present on the article field settings form.
     $this->drupalGet("admin/structure/types/manage/article/fields/$instance->id/field");
     $this->assertFieldByXpath(
-      '//input[@name="field[settings][default_image][fids]"]',
+      '//input[@name="field[settings][default_image][fid][fids]"]',
       $default_images['field']->id(),
       format_string(
         'Article image field default equals expected file ID of @fid.',
@@ -103,7 +119,7 @@ public function testDefaultImages() {
     // Confirm the defaults are present on the article field edit form.
     $this->drupalGet("admin/structure/types/manage/article/fields/$instance->id");
     $this->assertFieldByXpath(
-      '//input[@name="instance[settings][default_image][fids]"]',
+      '//input[@name="instance[settings][default_image][fid][fids]"]',
       $default_images['instance']->id(),
       format_string(
         'Article image field instance default equals expected file ID of @fid.',
@@ -114,7 +130,7 @@ public function testDefaultImages() {
     // Confirm the defaults are present on the page field settings form.
     $this->drupalGet("admin/structure/types/manage/page/fields/$instance->id/field");
     $this->assertFieldByXpath(
-      '//input[@name="field[settings][default_image][fids]"]',
+      '//input[@name="field[settings][default_image][fid][fids]"]',
       $default_images['field']->id(),
       format_string(
         'Page image field default equals expected file ID of @fid.',
@@ -124,7 +140,7 @@ public function testDefaultImages() {
     // Confirm the defaults are present on the page field edit form.
     $this->drupalGet("admin/structure/types/manage/page/fields/$instance2->id");
     $this->assertFieldByXpath(
-      '//input[@name="instance[settings][default_image][fids]"]',
+      '//input[@name="instance[settings][default_image][fid][fids]"]',
       $default_images['instance2']->id(),
       format_string(
         'Page image field instance default equals expected file ID of @fid.',
@@ -157,13 +173,13 @@ public function testDefaultImages() {
     );
 
     // Upload a new default for the field.
-    $field->settings['default_image'] = array($default_images['field_new']->id());
+    $field->settings['default_image']['fid'] = array($default_images['field_new']->id());
     $field->save();
 
     // Confirm that the new default is used on the article field settings form.
     $this->drupalGet("admin/structure/types/manage/article/fields/$instance->id/field");
     $this->assertFieldByXpath(
-      '//input[@name="field[settings][default_image][fids]"]',
+      '//input[@name="field[settings][default_image][fid][fids]"]',
       $default_images['field_new']->id(),
       format_string(
         'Updated image field default equals expected file ID of @fid.',
@@ -192,14 +208,14 @@ public function testDefaultImages() {
     );
 
     // Upload a new default for the article's field instance.
-    $instance->settings['default_image'] = $default_images['instance_new']->id();
+    $instance->settings['default_image']['fid'] = $default_images['instance_new']->id();
     $instance->save();
 
     // Confirm the new field instance default is used on the article field
     // admin form.
     $this->drupalGet("admin/structure/types/manage/article/fields/$instance->id");
     $this->assertFieldByXpath(
-      '//input[@name="instance[settings][default_image][fids]"]',
+      '//input[@name="instance[settings][default_image][fid][fids]"]',
       $default_images['instance_new']->id(),
       format_string(
         'Updated article image field instance default equals expected file ID of @fid.',
@@ -231,13 +247,13 @@ public function testDefaultImages() {
     );
 
     // Remove the instance default from articles.
-    $instance->settings['default_image'] = 0;
+    $instance->settings['default_image']['fid'] = 0;
     $instance->save();
 
     // Confirm the article field instance default has been removed.
     $this->drupalGet("admin/structure/types/manage/article/fields/$instance->id");
     $this->assertFieldByXpath(
-      '//input[@name="instance[settings][default_image][fids]"]',
+      '//input[@name="instance[settings][default_image][fid][fids]"]',
       '',
       'Updated article image field instance default has been successfully removed.'
     );
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
index 83825900c903c5bbdd0dfb47711f77c31fb40cea..9ef216775c39e95acd1f82062a2b6ac95225500f 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
@@ -241,18 +241,27 @@ function testImageFieldDefaultImage() {
 
     // Add a default image to the public imagefield instance.
     $images = $this->drupalGetTestFiles('image');
+    $alt = $this->randomString(512);
+    $title = $this->randomString(1024);
     $edit = array(
-      'files[field_settings_default_image]' => drupal_realpath($images[0]->uri),
+      'files[field_settings_default_image_fid]' => drupal_realpath($images[0]->uri),
+      'field[settings][default_image][alt]' => $alt,
+      'field[settings][default_image][title]' => $title,
     );
     $this->drupalPostForm("admin/structure/types/manage/article/fields/node.article.$field_name/field", $edit, t('Save field settings'));
     // Clear field info cache so the new default image is detected.
     field_info_cache_clear();
     $field = field_info_field('node', $field_name);
-    $file = file_load($field->getFieldSetting('default_image'));
+    $default_image = $field->getFieldSetting('default_image');
+    $file = file_load($default_image['fid']);
     $this->assertTrue($file->isPermanent(), 'The default image status is permanent.');
     $image = array(
       '#theme' => 'image',
       '#uri' => $file->getFileUri(),
+      '#alt' => $alt,
+      '#title' => $title,
+      '#width' => 40,
+      '#height' => 20,
     );
     $default_output = drupal_render($image);
     $this->drupalGet('node/' . $node->id());
@@ -275,27 +284,31 @@ function testImageFieldDefaultImage() {
 
     // Remove default image from the field and make sure it is no longer used.
     $edit = array(
-      'field[settings][default_image][fids]' => 0,
+      'field[settings][default_image][fid][fids]' => 0,
     );
     $this->drupalPostForm("admin/structure/types/manage/article/fields/node.article.$field_name/field", $edit, t('Save field settings'));
     // Clear field info cache so the new default image is detected.
     field_info_cache_clear();
     $field = field_info_field('node', $field_name);
-    $this->assertFalse($field->getFieldSetting('default_image'), 'Default image removed from field.');
+    $default_image = $field->getFieldSetting('default_image');
+    $this->assertFalse($default_image['fid'], 'Default image removed from field.');
     // Create an image field that uses the private:// scheme and test that the
     // default image works as expected.
     $private_field_name = strtolower($this->randomName());
     $this->createImageField($private_field_name, 'article', array('uri_scheme' => 'private'));
     // Add a default image to the new field.
     $edit = array(
-      'files[field_settings_default_image]' => drupal_realpath($images[1]->uri),
+      'files[field_settings_default_image_fid]' => drupal_realpath($images[1]->uri),
+      'field[settings][default_image][alt]' => $alt,
+      'field[settings][default_image][title]' => $title,
     );
     $this->drupalPostForm('admin/structure/types/manage/article/fields/node.article.' . $private_field_name . '/field', $edit, t('Save field settings'));
     // Clear field info cache so the new default image is detected.
     field_info_cache_clear();
 
     $private_field = field_info_field('node', $private_field_name);
-    $file = file_load($private_field->getFieldSetting('default_image'));
+    $default_image = $private_field->getFieldSetting('default_image');
+    $file = file_load($default_image['fid']);
     $this->assertEqual('private', file_uri_scheme($file->getFileUri()), 'Default image uses private:// scheme.');
     $this->assertTrue($file->isPermanent(), 'The default image status is permanent.');
     // Create a new node with no image attached and ensure that default private
@@ -304,6 +317,10 @@ function testImageFieldDefaultImage() {
     $image = array(
       '#theme' => 'image',
       '#uri' => $file->getFileUri(),
+      '#alt' => $alt,
+      '#title' => $title,
+      '#width' => 40,
+      '#height' => 20,
     );
     $default_output = drupal_render($image);
     $this->drupalGet('node/' . $node->id());
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/ImageUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/ImageUpgradePathTest.php
index 9bc0235b52976110f3aaeceb657b181639fd0bdd..7d742a7b70a496fb8be4e4f2135ca2375c8f8a39 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/ImageUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/ImageUpgradePathTest.php
@@ -145,4 +145,41 @@ public function sortByKey(array $data) {
     }
     return $data;
   }
+
+  /**
+   * Tests if the field and instance setting 'default_image' has been
+   * successfully converted from an integer to an associative array.
+   */
+  public function testImageFieldDefaultImageUpgrade() {
+    // Perform upgrade.
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // While this test is testing the upgrade path against a Drupal 7 'standard'
+    // profile installation we assume that node bundle 'article', having the
+    // 'field_image' image field, is installed too.
+    $cases = array('field.field.node.field_image', 'field.instance.node.article.field_image');
+    foreach ($cases as $case) {
+      $default_image = \Drupal::config($case)->get('settings.default_image');
+
+      // Check is was converted to an array.
+      $this->assertTrue(is_array($default_image));
+
+      // Check if 'default_image' contains a key named 'fid'. It might be an
+      // integer or NULL.
+      $this->assertTrue(array_key_exists('fid', $default_image));
+
+      // Check if 'alt' key exists and is a string.
+      $this->assertTrue(isset($default_image['alt']) && is_string($default_image['alt']));
+
+      // Check if 'title' key exists and is a string.
+      $this->assertTrue(isset($default_image['title']) && is_string($default_image['title']));
+
+      // Check if 'width' key exists. It might be an integer or NULL.
+      $this->assertTrue(array_key_exists('width', $default_image));
+
+      // Check if 'height' key exists. It might be an integer or NULL.
+      $this->assertTrue(array_key_exists('height', $default_image));
+    }
+  }
+
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
index 15253ad8111f5be1d1671a36121bf4bddd0cd4dc..85822dcc6bed2429d890244f10f0510d7010edaf 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
@@ -44,7 +44,7 @@ public function testUserPictureUpgrade() {
     $instance = field_info_instance('user', 'user_picture', 'user');
     // We explicitly avoid using the getFieldSetting() method here, since it
     // merges field and instance settings.
-    $file = entity_load('file', $instance->settings['default_image'][0]);
+    $file = entity_load('file', $instance->settings['default_image']['fid']);
     $this->assertTrue($file, 'Default user picture has been migrated.');
     $this->assertEqual($file->getFileUri(), 'public://user_pictures_dir/druplicon.png', 'File id matches the uri expected.');
     $this->assertEqual($file->getFilename(), 'druplicon.png');
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 0aa4d17bac4c5a3988e9eb0d94b1c29a632e4c6d..9d25ccc9c6f59e2f5281930d3b8f42ffa5de46d6 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -272,7 +272,13 @@ function user_install_picture_field() {
     'indexes' => array('target_id' => array('target_id')),
     'settings' => array(
       'uri_scheme' => 'public',
-      'default_image' => FALSE,
+      'default_image' => array(
+        'fid' => NULL,
+        'alt' => '',
+        'title' => '',
+        'width' => NULL,
+        'height' => NULL,
+      ),
     ),
   );
   entity_create('field_entity', $field)->save();
@@ -292,7 +298,13 @@ function user_install_picture_field() {
       'title_field' => 0,
       'max_resolution' => '85x85',
       'min_resolution' => '',
-      'default_image' => 0,
+      'default_image' => array(
+        'fid' => NULL,
+        'alt' => '',
+        'title' => '',
+        'width' => NULL,
+        'height' => NULL,
+      ),
     ),
   );
   entity_create('field_instance', $instance)->save();
@@ -611,9 +623,9 @@ function user_update_8011() {
   if (!\Drupal::moduleHandler()->moduleExists('image')) {
     $old_schema = \Drupal::moduleHandler()->install(array('image'));
     if ($old_schema['image'] == SCHEMA_UNINSTALLED) {
-      // Install image.module with schema version 8002 as a previous version
+      // Install image.module with schema version 8003 as a previous version
       // would have to create tables that would be removed again.
-      update_set_schema('image', 8002);
+      update_set_schema('image', 8003);
       // Inlined version of image_install(), make sure that the styles
       // directory exists.
       $directory = update_variable_get('file_default_scheme', 'public') . '://styles';
@@ -720,7 +732,7 @@ function user_update_8011() {
       'title_field' => 0,
       'max_resolution' => update_variable_get('user_picture_dimensions', '85x85'),
       'min_resolution' => '',
-      'default_image' => !empty($default_image_fid) ? array($default_image_fid) : array(),
+      'default_image' => !empty($default_image_fid) ? $default_image_fid : 0,
     ),
   );
   _update_8003_field_create_instance($field, $instance);
diff --git a/core/profiles/standard/config/field.field.node.field_image.yml b/core/profiles/standard/config/field.field.node.field_image.yml
index 002b1e32943c0bb7fb19d050bf0814d0d29a7aed..458baafb2c8ef5dae3b8c6683a6f79636884d3f9 100644
--- a/core/profiles/standard/config/field.field.node.field_image.yml
+++ b/core/profiles/standard/config/field.field.node.field_image.yml
@@ -7,7 +7,12 @@ module: image
 active: '1'
 settings:
   uri_scheme: public
-  default_image: false
+  default_image:
+    fid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
   column_groups:
     file:
       label: File
diff --git a/core/profiles/standard/config/field.instance.node.article.field_image.yml b/core/profiles/standard/config/field.instance.node.article.field_image.yml
index ee5155dcb70bb2d536fb05095a38d361538e90cb..52445a2a917e4c42d8e38bb0d43c6363d7838934 100644
--- a/core/profiles/standard/config/field.instance.node.article.field_image.yml
+++ b/core/profiles/standard/config/field.instance.node.article.field_image.yml
@@ -19,6 +19,11 @@ settings:
   title_field: ''
   alt_field_required: 0
   title_field_required: 0
-  default_image: 0
+  default_image:
+    fid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
 status: 1
 langcode: und