diff --git a/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php b/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php
index 40493f7402..1629dfe9a6 100644
--- a/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php
+++ b/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php
@@ -174,12 +174,6 @@ protected function getBaseFieldDefinition() {
    *   If the bundle is being changed.
    */
   public function preSave(EntityStorageInterface $storage) {
-    // Filter out unknown settings and make sure all settings are present, so
-    // that a complete field definition is passed to the various hooks and
-    // written to config.
-    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
-    $default_settings = $field_type_manager->getDefaultFieldSettings($this->getType());
-    $this->settings = array_intersect_key($this->settings, $default_settings) + $default_settings;
 
     // Call the parent's presave method to perform validate and calculate
     // dependencies.
diff --git a/core/lib/Drupal/Core/Field/FieldConfigBase.php b/core/lib/Drupal/Core/Field/FieldConfigBase.php
index 3f4fc4ea5d..0d604d82a2 100644
--- a/core/lib/Drupal/Core/Field/FieldConfigBase.php
+++ b/core/lib/Drupal/Core/Field/FieldConfigBase.php
@@ -271,12 +271,16 @@ public function onDependencyRemoval(array $dependencies) {
    */
   public function postCreate(EntityStorageInterface $storage) {
     parent::postCreate($storage);
+
     // If it was not present in the $values passed to create(), (e.g. for
     // programmatic creation), populate the denormalized field_type property
     // from the field storage, so that it gets saved in the config record.
     if (empty($this->field_type)) {
       $this->field_type = $this->getFieldStorageDefinition()->getType();
     }
+
+    // Make sure all expected runtime settings are present.
+    $this->initSettings();
   }
 
   /**
@@ -339,6 +343,26 @@ public function setTranslatable($translatable) {
     return $this;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function postLoad(EntityStorageInterface $storage, array &$entities) {
+    parent::postLoad($storage, $entities);
+
+    // Make sure all expected runtime settings are present.
+    foreach ($entities as $entity) {
+      $entity->initSettings();
+    }
+  }
+
+  /**
+   * Makes sure all expected runtime settings are present.
+   */
+  protected function initSettings() {
+    // Set the default settings.
+    $this->settings += \Drupal::service('plugin.manager.field.field_type')->getDefaultInstanceSettings($this->getType());
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/field/src/Entity/FieldStorageConfig.php b/core/modules/field/src/Entity/FieldStorageConfig.php
index c05caf084c..bb9cbdaa97 100644
--- a/core/modules/field/src/Entity/FieldStorageConfig.php
+++ b/core/modules/field/src/Entity/FieldStorageConfig.php
@@ -274,6 +274,23 @@ public function id() {
     return $this->getTargetEntityTypeId() . '.' . $this->getName();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function postCreate(EntityStorageInterface $storage) {
+    parent::postCreate($storage);
+
+    // Check that the field type is known.
+    $field_type = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->type, FALSE);
+    if (!$field_type) {
+      throw new FieldException(String::format('Attempt to create a field storage of unknown type %type.', ['%type' => $this->type]));
+    }
+    $this->module = $field_type['provider'];
+
+    // Make sure all expected runtime settings are present.
+    $this->initSettings();
+  }
+
   /**
    * Overrides \Drupal\Core\Entity\Entity::preSave().
    *
@@ -283,24 +300,17 @@ public function id() {
    *   In case of failures at the configuration storage level.
    */
   public function preSave(EntityStorageInterface $storage) {
+    parent::preSave($storage);
+
     // Clear the derived data about the field.
     unset($this->schema);
 
-    // Filter out unknown settings and make sure all settings are present, so
-    // that a complete field definition is passed to the various hooks and
-    // written to config.
-    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
-    $default_settings = $field_type_manager->getDefaultStorageSettings($this->type);
-    $this->settings = array_intersect_key($this->settings, $default_settings) + $default_settings;
-
     if ($this->isNew()) {
       $this->preSaveNew($storage);
     }
     else {
       $this->preSaveUpdated($storage);
     }
-
-    parent::preSave($storage);
   }
 
   /**
@@ -332,13 +342,6 @@ protected function preSaveNew(EntityStorageInterface $storage) {
       throw new FieldException("Attempt to create field storage {$this->getName()} which is reserved by entity type {$this->getTargetEntityTypeId()}.");
     }
 
-    // Check that the field type is known.
-    $field_type = $field_type_manager->getDefinition($this->getType(), FALSE);
-    if (!$field_type) {
-      throw new FieldException("Attempt to create a field storage of unknown type {$this->getType()}.");
-    }
-    $this->module = $field_type['provider'];
-
     // Notify the field storage definition listener.
     \Drupal::service('field_storage_definition.listener')->onFieldStorageDefinitionCreate($this);
   }
@@ -402,6 +405,18 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function postLoad(EntityStorageInterface $storage, array &$entities) {
+    parent::postLoad($storage, $entities);
+
+    // Make sure all expected runtime settings are present.
+    foreach ($entities as $entity) {
+      $entity->initSettings();
+    }
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -535,6 +550,13 @@ public function getType() {
     return $this->type;
   }
 
+  /**
+   * Makes sure all expected runtime settings are present.
+   */
+  protected function initSettings() {
+    $this->settings += \Drupal::service('plugin.manager.field.field_type')->getDefaultSettings($this->getType());
+  }
+
   /**
    * {@inheritdoc}
    */
