diff --git a/core/includes/file.inc b/core/includes/file.inc
index 3e5eb8c..aeb673c 100644
--- a/core/includes/file.inc
+++ b/core/includes/file.inc
@@ -158,6 +158,7 @@ function file_default_scheme() {
 function file_stream_wrapper_uri_normalize($uri) {
   $scheme = \Drupal::service('file_system')->uriScheme($uri);
 
+  $target = NULL;
   if (file_stream_wrapper_valid_scheme($scheme)) {
     $target = file_uri_target($uri);
 
@@ -166,6 +167,10 @@ function file_stream_wrapper_uri_normalize($uri) {
     }
   }
 
+  if (\Drupal::hasService('module_handler')) {
+    \Drupal::moduleHandler()->alter('file_stream_wrapper_uri_normalize', $uri, $scheme, $target);
+  }
+
   return $uri;
 }
 
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 8534ebf..120745e 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -13,6 +13,28 @@
  */
 
 /**
+ * Alter a normalized URI for a given stream wrapper.
+ *
+ * @see file_stream_wrapper_uri_normalize()
+ *
+ * @param string &$uri
+ *   The URI to alter.
+ * @param string $scheme
+ *   The scheme of the URI, such as 'public' or 'http'.
+ * @param string $target
+ *   The path component of the URI.
+ */
+function hook_file_stream_wrapper_uri_normalize_alter(&$uri, $scheme, $target) {
+  // Some stream wrappers like S3 require a bucket in the URI, but URIs might
+  // be missing theme such as 's3://image.jpg'. Add the default bucket.
+  if ($scheme == 's3') {
+    if (!amazons3_uri_has_bucket($target)) {
+      $uri = amazons3_add_default_bucket($target);
+    }
+  }
+}
+
+/**
  * Alters theme operation links.
  *
  * @param $theme_groups
