diff --git a/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php b/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php
index da03fa0..fcbe5ee 100644
--- a/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php
+++ b/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php
@@ -32,7 +32,9 @@ protected function setUp() {
     $this->databaseDumpFiles = [
       __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
       __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.block-context-manager-2354889.php',
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.language-enabled.php',
     ];
+
     parent::setUp();
   }
 
diff --git a/core/modules/image/config/schema/image.schema.yml b/core/modules/image/config/schema/image.schema.yml
index 323220b..ad95a70 100644
--- a/core/modules/image/config/schema/image.schema.yml
+++ b/core/modules/image/config/schema/image.schema.yml
@@ -139,6 +139,14 @@ field.formatter.settings.image:
       type: string
       label: 'Image style'
 
+field.formatter.settings.image_url:
+  type: mapping
+  label: 'Image URL format settings'
+  mapping:
+    image_style:
+      type: string
+      label: 'Image style'
+
 field.widget.settings.image_image:
   type: mapping
   label: 'Image field display format settings'
diff --git a/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php b/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php
index 5f15073..d3d01c7 100644
--- a/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php
+++ b/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php
@@ -235,4 +235,17 @@ public function viewElements(FieldItemListInterface $items) {
     return $elements;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    $dependencies = [];
+
+    if (!empty($image_style_setting) && $image_style = $this->imageStyleStorage->load($image_style_setting)) {
+      $dependencies['config'][] = $image_style->getConfigDependencyName();
+    }
+
+    return $dependencies;
+  }
+
 }
diff --git a/core/modules/image/src/Plugin/Field/FieldFormatter/ImageUrlFormatter.php b/core/modules/image/src/Plugin/Field/FieldFormatter/ImageUrlFormatter.php
new file mode 100644
index 0000000..1a633f8
--- /dev/null
+++ b/core/modules/image/src/Plugin/Field/FieldFormatter/ImageUrlFormatter.php
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image\Plugin\Field\FieldFormatter\ImageUrlFormatter.
+ */
+
+namespace Drupal\image\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+
+/**
+ * Plugin implementation of the 'image_url' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "image_url",
+ *   label = @Translation("URL to image"),
+ *   field_types = {
+ *     "image"
+ *   }
+ * )
+ */
+class ImageUrlFormatter extends ImageFormatter {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return [
+      'image_style' => '',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $image_styles = image_style_options(FALSE);
+    $element['image_style'] = [
+      '#title' => $this->t('Image style'),
+      '#type' => 'select',
+      '#default_value' => $this->getSetting('image_style'),
+      '#empty_option' => $this->t('None (original image)'),
+      '#options' => $image_styles,
+      '#description' => [
+        '#type' => 'link',
+        '#title' => $this->t('Configure Image Styles'),
+        '#url' => new Url('entity.image_style.collection'),
+        '#access' => $this->currentUser->hasPermission('administer image styles'),
+      ],
+    ];
+
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = [];
+
+    $image_styles = image_style_options(FALSE);
+    // Unset possible 'No defined styles' option.
+    unset($image_styles['']);
+    // Styles could be lost because of enabled/disabled modules that defines
+    // their styles in code.
+    $image_style_setting = $this->getSetting('image_style');
+    if (isset($image_styles[$image_style_setting])) {
+      $summary[] = $this->t('Image style: @style', ['@style' => $image_styles[$image_style_setting]]);
+    }
+    else {
+      $summary[] = $this->t('Original image');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items) {
+    $elements = [];
+    $images = $this->getEntitiesToView($items);
+
+    // Early opt-out if the field is empty.
+    if (empty($images)) {
+      return $elements;
+    }
+
+    $url = NULL;
+
+    $image_style_setting = $this->getSetting('image_style');
+
+    /** @var \Drupal\image\Entity\ImageStyle|false $image_style */
+    $image_style = FALSE;
+    if (!empty($image_style_setting)) {
+      $image_style = $this->imageStyleStorage->load($image_style_setting);
+    }
+
+    foreach ($images as $delta => $image) {
+      /** @var \Drupal\file\Entity\File $image */
+      $image_uri = $image->getFileUri();
+      $url = $image_style
+        ? $image_style->buildUrl($image_uri)
+        : file_create_url($image_uri);
+
+      // Collect cache tags to be added for each item in the field.
+      $cache_tags = $image_style
+        ? Cache::mergeTags($image_style->getCacheTags(), $image->getCacheTags())
+        : $image->getCacheTags();
+
+      $elements[$delta] = [
+        '#markup' => $url,
+        '#cache' => [
+          'tags' => $cache_tags,
+        ],
+      ];
+    }
+
+    return $elements;
+  }
+}
diff --git a/core/modules/image/src/Tests/ImageFieldDisplayTest.php b/core/modules/image/src/Tests/ImageFieldDisplayTest.php
index c4cf485..72d990e 100644
--- a/core/modules/image/src/Tests/ImageFieldDisplayTest.php
+++ b/core/modules/image/src/Tests/ImageFieldDisplayTest.php
@@ -202,6 +202,26 @@ function _testImageFieldFormatters($scheme) {
       $this->drupalGet(ImageStyle::load('thumbnail')->buildUrl($image_uri));
       $this->assertResponse('403', 'Access denied to image style thumbnail as anonymous user.');
     }
+
+    // Test the image URL formatter without an image style.
+    $display_options = [
+      'type' => 'image_url',
+      'settings' => [],
+    ];
+
+    $expected_url = file_create_url($image_uri);
+    $this->assertEqual($expected_url, $node->{$field_name}->view($display_options)[0]['#markup']);
+
+    // Test the image URL formatter with an image style.
+    $display_options = [
+      'type' => 'image_url',
+      'settings' => [
+        'image_style' => 'thumbnail',
+      ],
+    ];
+
+    $expected_url = ImageStyle::load('thumbnail')->buildUrl($image_uri);
+    $this->assertEqual($expected_url, $node->{$field_name}->view($display_options)[0]['#markup']);
   }
 
   /**
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index ce06b7a..653cb5a 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -1265,6 +1265,9 @@ function system_update_8004() {
   // ensure they match the currently expected status.
   $manager = \Drupal::entityDefinitionUpdateManager();
   foreach (array_keys(\Drupal::entityManager()->getDefinitions()) as $entity_type_id) {
+    if (is_null($manager->getEntityType($entity_type_id))) {
+      $manager->getEntityType($entity_type_id);
+    }
     $manager->updateEntityType($manager->getEntityType($entity_type_id));
   }
 }
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.language-enabled.php b/core/modules/system/tests/fixtures/update/drupal-8.language-enabled.php
new file mode 100644
index 0000000..dcd5cba
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal-8.language-enabled.php
@@ -0,0 +1,40 @@
+<?php
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+// Set the schema version.
+$connection->insert('key_value')
+  ->fields([
+    'collection' => 'system.schema',
+    'name' => 'language',
+    'value' => 'i:8000;',
+  ])
+  ->execute();
+
+// Update core.extension.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$extensions['module']['language'] = 8000;
+$connection->update('config')
+  ->fields([
+    'data' => serialize($extensions),
+  ])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute();
+
+$connection->insert('key_value')
+  ->fields([
+    'collection' => 'entity.definitions.installed',
+    'name' => 'configurable_language.entity_type',
+    'value' => '"O:42:"Drupal\Core\Config\Entity\ConfigEntityType":35:{s:16:"\x00*\x00config_prefix";s:6:"entity";s:15:"\x00*\x00static_cache";b:0;s:14:"\x00*\x00lookup_keys";a:1:{i:0;s:4:"uuid";}s:16:"\x00*\x00config_export";a:0:{}s:21:"\x00*\x00mergedConfigExport";a:0:{}s:15:"\x00*\x00render_cache";b:1;s:19:"\x00*\x00persistent_cache";b:1;s:14:"\x00*\x00entity_keys";a:8:{s:2:"id";s:2:"id";s:5:"label";s:5:"label";s:6:"weight";s:6:"weight";s:8:"revision";s:0:"";s:6:"bundle";s:0:"";s:8:"langcode";s:8:"langcode";s:16:"default_langcode";s:16:"default_langcode";s:4:"uuid";s:4:"uuid";}s:5:"\x00*\x00id";s:21:"configurable_language";s:11:"\x00*\x00provider";s:8:"language";s:8:"\x00*\x00class";s:43:"Drupal\language\Entity\ConfigurableLanguage";s:16:"\x00*\x00originalClass";N;s:11:"\x00*\x00handlers";a:4:{s:12:"list_builder";s:35:"Drupal\language\LanguageListBuilder";s:6:"access";s:44:"Drupal\language\LanguageAccessControlHandler";s:4:"form";a:3:{s:3:"add";s:36:"Drupal\language\Form\LanguageAddForm";s:4:"edit";s:37:"Drupal\language\Form\LanguageEditForm";s:6:"delete";s:39:"Drupal\language\Form\LanguageDeleteForm";}s:7:"storage";s:45:"Drupal\Core\Config\Entity\ConfigEntityStorage";}s:19:"\x00*\x00admin_permission";s:20:"administer languages";s:25:"\x00*\x00permission_granularity";s:11:"entity_type";s:8:"\x00*\x00links";a:3:{s:11:"delete-form";s:62:"/admin/config/regional/language/delete/{configurable_language}";s:9:"edit-form";s:60:"/admin/config/regional/language/edit/{configurable_language}";s:10:"collection";s:31:"/admin/config/regional/language";}s:17:"\x00*\x00label_callback";N;s:21:"\x00*\x00bundle_entity_type";N;s:12:"\x00*\x00bundle_of";N;s:15:"\x00*\x00bundle_label";N;s:13:"\x00*\x00base_table";N;s:22:"\x00*\x00revision_data_table";N;s:17:"\x00*\x00revision_table";N;s:13:"\x00*\x00data_table";N;s:15:"\x00*\x00translatable";b:0;s:8:"\x00*\x00label";O:48:"Drupal\Core\StringTranslation\TranslationWrapper":3:{s:9:"\x00*\x00string";s:8:"Language";s:12:"\x00*\x00arguments";a:0:{}s:10:"\x00*\x00options";a:0:{}}s:15:"\x00*\x00uri_callback";N;s:8:"\x00*\x00group";s:13:"configuration";s:14:"\x00*\x00group_label";O:48:"Drupal\Core\StringTranslation\TranslationWrapper":3:{s:9:"\x00*\x00string";s:13:"Configuration";s:12:"\x00*\x00arguments";a:0:{}s:10:"\x00*\x00options";a:1:{s:7:"context";s:17:"Entity type group";}}s:22:"\x00*\x00field_ui_base_route";N;s:26:"\x00*\x00common_reference_target";b:0;s:22:"\x00*\x00list_cache_contexts";a:0:{}s:18:"\x00*\x00list_cache_tags";a:1:{i:0;s:33:"config:configurable_language_list";}s:14:"\x00*\x00constraints";a:0:{}s:20:"\x00*\x00stringTranslation";N;}"'
+  ])
+  ->execute();
+
