Import Cobalt 21.lts.4.302899
diff --git a/src/base/third_party/xdg_mime/README.chromium b/src/base/third_party/xdg_mime/README.chromium
index 8212752..8b1b4ed 100644
--- a/src/base/third_party/xdg_mime/README.chromium
+++ b/src/base/third_party/xdg_mime/README.chromium
@@ -12,3 +12,6 @@
       xdg_mime_get_mime_type_for_file() - use of pointer after being freed.
   - function_casts.patch: fix bad function casts.
   - Added a LICENSE file.
+
+Of the dual-licenses, it is licensed under the terms of the Academic Free
+License, version 2.0, in licenses_cobalt.txt.
diff --git a/src/cobalt/base/language.cc b/src/cobalt/base/language.cc
index 819e56a..ed98739 100644
--- a/src/cobalt/base/language.cc
+++ b/src/cobalt/base/language.cc
@@ -62,6 +62,11 @@
   if (U_SUCCESS(icu_result) && buffer[0]) {
     language += "-";
     language += buffer;
+  } else {
+    uloc_addLikelySubtags(NULL, buffer, arraysize(buffer), &icu_result);
+    if (U_SUCCESS(icu_result) && buffer[0]) {
+      return buffer;
+    }
   }
 
   // We should end up with something like "en" or "en-Latn".
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 7d6a781..0a6672e 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -563,7 +563,7 @@
   version.push_back('\0');
 
   CrashpadAnnotations crashpad_annotations;
-  SbMemorySet(&crashpad_annotations, sizeof(CrashpadAnnotations), 0);
+  SbMemorySet(&crashpad_annotations, 0, sizeof(CrashpadAnnotations));
   SbStringCopy(crashpad_annotations.user_agent_string, user_agent.c_str(),
                USER_AGENT_STRING_MAX_SIZE);
   SbStringCopy(crashpad_annotations.product, product.c_str(),
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 189622c..5591b06 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -48,8 +48,10 @@
 #include "cobalt/dom/keycode.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
 #include "cobalt/dom/window.h"
+#include "cobalt/extension/graphics.h"
 #include "cobalt/h5vcc/h5vcc.h"
 #include "cobalt/input/input_device_manager_fuzzer.h"
+#include "cobalt/math/matrix3_f.h"
 #include "cobalt/overlay_info/overlay_info_registry.h"
 #include "nb/memory_scope.h"
 #include "starboard/atomic.h"
@@ -1749,6 +1751,22 @@
 }
 
 ViewportSize BrowserModule::GetViewportSize() {
+  // If a custom render root transform is used, report the size of the
+  // transformed viewport.
+  math::Matrix3F viewport_transform = math::Matrix3F::Identity();
+  static const CobaltExtensionGraphicsApi* s_graphics_extension =
+      static_cast<const CobaltExtensionGraphicsApi*>(
+          SbSystemGetExtension(kCobaltExtensionGraphicsName));
+  float m00, m01, m02, m10, m11, m12, m20, m21, m22;
+  if (s_graphics_extension &&
+      strcmp(s_graphics_extension->name, kCobaltExtensionGraphicsName) == 0 &&
+      s_graphics_extension->version >= 5 &&
+      s_graphics_extension->GetRenderRootTransform(&m00, &m01, &m02, &m10, &m11,
+                                                   &m12, &m20, &m21, &m22)) {
+    viewport_transform =
+        math::Matrix3F::FromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22);
+  }
+
   // We trust the renderer module for width and height the most, if it exists.
   if (renderer_module_) {
     math::Size target_size = renderer_module_->render_target_size();
@@ -1773,6 +1791,9 @@
           options_.requested_viewport_size->device_pixel_ratio();
     }
 
+    target_size =
+        math::RoundOut(viewport_transform.MapRect(math::RectF(target_size)))
+            .size();
     ViewportSize v(target_size.width(), target_size.height(), diagonal_inches,
                    device_pixel_ratio);
     return v;
@@ -1781,6 +1802,7 @@
   // If the system window exists, that's almost just as good.
   if (system_window_) {
     math::Size size = system_window_->GetWindowSize();
+    size = math::RoundOut(viewport_transform.MapRect(math::RectF(size))).size();
     ViewportSize v(size.width(), size.height(),
                    system_window_->GetDiagonalSizeInches(),
                    system_window_->GetDevicePixelRatio());
@@ -1789,7 +1811,14 @@
 
   // Otherwise, we assume we'll get the viewport size that was requested.
   if (options_.requested_viewport_size) {
-    return *options_.requested_viewport_size;
+    math::Size requested_size =
+        math::RoundOut(viewport_transform.MapRect(math::RectF(
+                           options_.requested_viewport_size->width(),
+                           options_.requested_viewport_size->height())))
+            .size();
+    return ViewportSize(requested_size.width(), requested_size.height(),
+                        options_.requested_viewport_size->diagonal_inches(),
+                        options_.requested_viewport_size->device_pixel_ratio());
   }
 
   // TODO: Allow platforms to define the default window size and return that
@@ -1797,7 +1826,11 @@
 
   // No window and no viewport size was requested, so we return a conservative
   // default.
-  ViewportSize view_size(1280, 720);
+  math::Size default_size(1280, 720);
+  default_size =
+      math::RoundOut(viewport_transform.MapRect(math::RectF(default_size)))
+          .size();
+  ViewportSize view_size(default_size.width(), default_size.height());
   return view_size;
 }
 
@@ -1896,7 +1929,11 @@
   std::map<std::string, std::string> url_param_map;
   // If this is the initial startup, use topic within deeplink, if specified.
   if (main_web_module_generation_ == 1) {
-    GetParamMap(GetInitialDeepLink(), url_param_map);
+    std::string deeplink = GetInitialDeepLink();
+    size_t query_pos = deeplink.find('?');
+    if (query_pos != std::string::npos) {
+      GetParamMap(deeplink.substr(query_pos + 1), url_param_map);
+    }
   }
   // If this is not the initial startup, there was no deeplink specified, or
   // the deeplink did not have a topic, check the current url for a topic.
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 5036fd6..7db38cb 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -660,10 +660,7 @@
       web_module_stat_tracker_->dom_stat_tracker(), data.initial_url,
       data.network_module->GetUserAgent(),
       data.network_module->preferred_language(),
-      data.options.font_language_script_override.empty()
-          ? base::GetSystemLanguageScript()
-          : data.options.font_language_script_override,
-      data.options.navigation_callback,
+      base::GetSystemLanguageScript(), data.options.navigation_callback,
       base::Bind(&WebModule::Impl::OnLoadComplete, base::Unretained(this)),
       data.network_module->cookie_jar(), data.network_module->GetPostSender(),
       data.options.require_csp, data.options.csp_enforcement_mode,
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 0f340cd..78e0fe7 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -210,11 +210,6 @@
     // the suspend state.
     bool should_retain_remote_typeface_cache_on_suspend = false;
 
-    // The language and script to use with fonts. If left empty, then the
-    // language-script combination provided by base::GetSystemLanguageScript()
-    // is used.
-    std::string font_language_script_override;
-
     // The splash screen cache object, owned by the BrowserModule.
     SplashScreenCache* splash_screen_cache;
 
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 22d7db0..87efaac 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-302122
\ No newline at end of file
+302899
\ No newline at end of file
diff --git a/src/cobalt/content/fonts/config/common/fonts.xml b/src/cobalt/content/fonts/config/common/fonts.xml
index 8f84727..abba022 100644
--- a/src/cobalt/content/fonts/config/common/fonts.xml
+++ b/src/cobalt/content/fonts/config/common/fonts.xml
@@ -164,337 +164,337 @@
         <!-- "Noto Naskh Arabic UI" is given a fallback priority so that, in spite
              of having a name, it will still be included as a fallback font.
         -->
-        <family fallback_priority="0" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254">
+        <family lang="und-Arab" fallback_priority="0" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254">
             <font weight="400" style="normal">NotoNaskhArabicUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoNaskhArabicUI-Bold.woff2</font>
         </family>
-        <family pages="0,18-19,45,171,254">
+        <family lang="und-Ethi" pages="0,18-19,45,171,254">
             <font weight="400" style="normal">NotoSansEthiopic-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansEthiopic-Bold.woff2</font>
         </family>
-        <family pages="0,5,32,37,251,254">
+        <family lang="und-Hebr" pages="0,5,32,37,251,254">
             <font weight="400" style="normal">NotoSansHebrew-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansHebrew-Bold.woff2</font>
         </family>
-        <family pages="0,2-3,14,32,37,254">
+        <family lang="und-Thai" pages="0,2-3,14,32,37,254">
             <font weight="400" style="normal">NotoSansThaiUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansThaiUI-Bold.woff2</font>
         </family>
-        <family pages="0,5,32,251">
+        <family lang="und-Armn" pages="0,5,32,251">
             <font weight="400" style="normal">NotoSansArmenian-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansArmenian-Bold.woff2</font>
         </family>
-        <family pages="0,5,16,45,254">
+        <family lang="und-Geor,und-Geok" pages="0,5,16,45,254">
             <font weight="400" style="normal">NotoSansGeorgian-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansGeorgian-Bold.woff2</font>
         </family>
-        <family pages="0,2,9,28,32,34,37,168,254">
+        <family lang="und-Deva" pages="0,2,9,28,32,34,37,168,254">
             <font weight="400" style="normal">NotoSansDevanagariUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansDevanagariUI-Bold.woff2</font>
         </family>
         <!-- Gujarati should come after Devanagari -->
-        <family pages="0,9-10,32,34,37,168,254">
+        <family lang="und-Gujr" pages="0,9-10,32,34,37,168,254">
             <font weight="400" style="normal">NotoSansGujaratiUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansGujaratiUI-Bold.woff2</font>
         </family>
         <!-- Gurmukhi should come after Devanagari -->
-        <family pages="0,9-10,32,34,37-38,168,254">
+        <family lang="und-Guru" pages="0,9-10,32,34,37-38,168,254">
             <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,11,32,34,37,254">
+        <family lang="und-Taml" pages="0,9,11,32,34,37,254">
             <font weight="400" style="normal">NotoSansTamilUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansTamilUI-Bold.woff2</font>
         </family>
-        <family pages="0,3,9,13,32,34,37,254">
+        <family lang="und-Mlym" pages="0,3,9,13,32,34,37,254">
             <font weight="400" style="normal">NotoSansMalayalamUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansMalayalamUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,32,34,37,254">
+        <family lang="und-Beng" pages="0,9,32,34,37,254">
             <font weight="400" style="normal">NotoSansBengaliUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansBengaliUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,12,32,34,37,254">
+        <family lang="und-Telu" pages="0,9,12,32,34,37,254">
             <font weight="400" style="normal">NotoSansTeluguUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansTeluguUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,12,32,34,37,254">
+        <family lang="und-Knda" pages="0,9,12,32,34,37,254">
             <font weight="400" style="normal">NotoSansKannadaUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansKannadaUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,11,32,34,37,254">
+        <family lang="und-Orya" pages="0,9,11,32,34,37,254">
             <font weight="400" style="normal">NotoSansOriyaUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansOriyaUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,13,32,34,37,254">
+        <family lang="und-Sinh" pages="0,9,13,32,34,37,254">
             <font weight="400" style="normal">NotoSansSinhala-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansSinhala-Bold.woff2</font>
         </family>
-        <family pages="0,23,25,32,37">
+        <family lang="und-Khmr" pages="0,23,25,32,37">
             <font weight="400" style="normal">NotoSansKhmerUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansKhmerUI-Bold.woff2</font>
         </family>
-        <family pages="0,3,14,32,37">
+        <family lang="und-Laoo" pages="0,3,14,32,37">
             <font weight="400" style="normal">NotoSansLaoUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansLaoUI-Bold.woff2</font>
         </family>
-        <family pages="0,16,32,37,169-170,254">
+        <family lang="und-Mymr" pages="0,16,32,37,169-170,254">
             <font weight="400" style="normal">NotoSansMyanmarUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansMyanmarUI-Bold.woff2</font>
         </family>
-        <family pages="0,6-7,32,37,253-254">
+        <family lang="und-Thaa" pages="0,6-7,32,37,253-254">
             <font weight="400" style="normal">NotoSansThaana-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansThaana-Bold.woff2</font>
         </family>
-        <family pages="0,3,170">
+        <family lang="und-Cham" pages="0,3,170">
             <font weight="400" style="normal">NotoSansCham-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansCham-Bold.woff2</font>
         </family>
-        <family pages="0,6,32,46,489">
+        <family lang="und-Adlm" pages="0,6,32,46,489">
             <font weight="400" style="normal">NotoSansAdlam-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,32,46,254,267">
+        <family lang="und-Avst" pages="0,32,46,254,267">
             <font weight="400" style="normal">NotoSansAvestan-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,27,32,37,254">
+        <family lang="und-Bali" pages="0,27,32,37,254">
             <font weight="400" style="normal">NotoSansBalinese-Regular.woff2</font>
         </family>
-        <family pages="0,166,254,360-362">
+        <family lang="und-Bamu" pages="0,166,254,360-362">
             <font weight="400" style="normal">NotoSansBamum-Regular.woff2</font>
         </family>
-        <family pages="0,27,254">
+        <family lang="und-Batk" pages="0,27,254">
             <font weight="400" style="normal">NotoSansBatak-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,272">
+        <family lang="und-Brah" pages="0,254,272">
             <font weight="400" style="normal">NotoSansBrahmi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,26,32,37,169,254">
+        <family lang="und-Bugi" pages="0,26,32,37,169,254">
             <font weight="400" style="normal">NotoSansBuginese-Regular.woff2</font>
         </family>
-        <family pages="0,23,254">
+        <family lang="und-Buhd" pages="0,23,254">
             <font weight="400" style="normal">NotoSansBuhid-Regular.woff2</font>
         </family>
-        <family pages="0-3,20-22,24,254">
+        <family lang="und-Cans" pages="0-3,20-22,24,254">
             <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,258">
+        <family lang="und-Cari" pages="0,254,258">
             <font weight="400" style="normal">NotoSansCarian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,3,19,171">
+        <family lang="und-Cher" pages="0,3,19,171">
             <font weight="400" style="normal">NotoSansCherokee-Regular.woff2</font>
         </family>
-        <family pages="0,3,29,37,44,254">
+        <family lang="und-Copt" pages="0,3,29,37,44,254">
             <font weight="400" style="normal">NotoSansCoptic-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,288-292">
+        <family lang="und-Xsux" pages="0,254,288-292">
             <font weight="400" style="normal">NotoSansCuneiform-Regular.woff2</font>
         </family>
-        <family pages="0,254,264">
+        <family lang="und-Cprt" pages="0,254,264">
             <font weight="400" style="normal">NotoSansCypriot-Regular.woff2</font>
         </family>
-        <family pages="0,254,260">
+        <family lang="und-Dsrt" pages="0,254,260">
             <font weight="400" style="normal">NotoSansDeseret-Regular.woff2</font>
         </family>
-        <family pages="0,254,304-308">
+        <family lang="und-Egyp" pages="0,254,304-308">
             <font weight="400" style="normal">NotoSansEgyptianHieroglyphs-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,44,254">
+        <family lang="und-Glag" pages="0,44,254">
             <font weight="400" style="normal">NotoSansGlagolitic-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,3,254,259">
+        <family lang="und-Goth" pages="0,3,254,259">
             <font weight="400" style="normal">NotoSansGothic-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,23,254">
+        <family lang="und-Hano" pages="0,23,254">
             <font weight="400" style="normal">NotoSansHanunoo-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,264">
+        <family lang="und-Armi" pages="0,254,264">
             <font weight="400" style="normal">NotoSansImperialAramaic-Regular.woff2</font>
         </family>
-        <family pages="0,254,267">
+        <family lang="und-Phli" pages="0,254,267">
             <font weight="400" style="normal">NotoSansInscriptionalPahlavi-Regular.woff2</font>
         </family>
-        <family pages="0,254,267">
+        <family lang="und-Prti" pages="0,254,267">
             <font weight="400" style="normal">NotoSansInscriptionalParthian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,32,37,169,254">
+        <family lang="und-Java" pages="0,32,37,169,254">
             <font weight="400" style="normal">NotoSansJavanese-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,9,168,254,272">
+        <family lang="und-Kthi" pages="0,9,168,254,272">
             <font weight="400" style="normal">NotoSansKaithi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,169,254">
+        <family lang="und-Kali" pages="0,169,254">
             <font weight="400" style="normal">NotoSansKayahLi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,266">
+        <family lang="und-Khar" pages="0,254,266">
             <font weight="400" style="normal">NotoSansKharoshthi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,28,37,254">
+        <family lang="und-Lepc" pages="0,28,37,254">
             <font weight="400" style="normal">NotoSansLepcha-Regular.woff2</font>
         </family>
-        <family pages="0,9,25,254">
+        <family lang="und-Limb" pages="0,9,25,254">
             <font weight="400" style="normal">NotoSansLimbu-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,256-257">
+        <family lang="und-Linb" pages="0,254,256-257">
             <font weight="400" style="normal">NotoSansLinearB-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,2,164,254">
+        <family lang="und-Lisu" pages="0,2,164,254">
             <font weight="400" style="normal">NotoSansLisu-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,258">
+        <family lang="und-Lyci" pages="0,254,258">
             <font weight="400" style="normal">NotoSansLycian-Regular.woff2</font>
         </family>
-        <family pages="0,254,265">
+        <family lang="und-Lydi" pages="0,254,265">
             <font weight="400" style="normal">NotoSansLydian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,6,8,254">
+        <family lang="und-Mand" pages="0,6,8,254">
             <font weight="400" style="normal">NotoSansMandaic-Regular.woff2</font>
         </family>
-        <family pages="0,170-171,254">
+        <family lang="und-Mtei" pages="0,170-171,254">
             <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.woff2</font>
         </family>
-        <family pages="0,25,254">
+        <family lang="und-Talu" pages="0,25,254">
             <font weight="400" style="normal">NotoSansNewTaiLue-Regular.woff2</font>
         </family>
-        <family pages="0,6-7,32,46,253-254">
+        <family lang="und-Nkoo" pages="0,6-7,32,46,253-254">
             <font weight="400" style="normal">NotoSansNKo-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,22,254">
+        <family lang="und-Ogam" pages="0,22,254">
             <font weight="400" style="normal">NotoSansOgham-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,28,254">
+        <family lang="und-Olck" pages="0,28,254">
             <font weight="400" style="normal">NotoSansOlChiki-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,259">
+        <family lang="und-Ital" pages="0,254,259">
             <font weight="400" style="normal">NotoSansOldItalic-Regular.woff2</font>
         </family>
-        <family pages="0,254,259">
+        <family lang="und-Xpeo" pages="0,254,259">
             <font weight="400" style="normal">NotoSansOldPersian-Regular.woff2</font>
         </family>
-        <family pages="0,254,266">
+        <family lang="und-Sarb" pages="0,254,266">
             <font weight="400" style="normal">NotoSansOldSouthArabian-Regular.woff2</font>
         </family>
-        <family pages="0,254,268">
+        <family lang="und-Orkh" pages="0,254,268">
             <font weight="400" style="normal">NotoSansOldTurkic-Regular.woff2</font>
         </family>
-        <family pages="0,254,260">
+        <family lang="und-Osma" pages="0,254,260">
             <font weight="400" style="normal">NotoSansOsmanya-Regular.woff2</font>
         </family>
-        <family pages="0,254,265">
+        <family lang="und-Phnx" pages="0,254,265">
             <font weight="400" style="normal">NotoSansPhoenician-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,169,254">
+        <family lang="und-Rjng" pages="0,169,254">
             <font weight="400" style="normal">NotoSansRejang-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,22,254">
+        <family lang="und-Runr" pages="0,22,254">
             <font weight="400" style="normal">NotoSansRunic-Regular.woff2</font>
         </family>
-        <family pages="0,8,46,254">
+        <family lang="und-Samr" pages="0,8,46,254">
             <font weight="400" style="normal">NotoSansSamaritan-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,32,37,168,254">
+        <family lang="und-Saur" pages="0,32,37,168,254">
             <font weight="400" style="normal">NotoSansSaurashtra-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,260">
+        <family lang="und-Shaw" pages="0,254,260">
             <font weight="400" style="normal">NotoSansShavian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,27-28,254">
+        <family lang="und-Sund" pages="0,27-28,254">
             <font weight="400" style="normal">NotoSansSundanese-Regular.woff2</font>
         </family>
-        <family pages="0,9,32,37,168,254">
+        <family lang="und-Sylo" pages="0,9,32,37,168,254">
             <font weight="400" style="normal">NotoSansSylotiNagri-Regular.woff2</font>
         </family>
         <!-- Estrangela should precede Eastern and Western Syriac, since it's our default form. -->
-        <family pages="0,3,6-7,32,34,37-38,254">
+        <family lang="und-Syre" pages="0,3,6-7,32,34,37-38,254">
             <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.woff2</font>
         </family>
-        <family pages="0,3,6-7,32,34,37-38,254">
+        <family lang="und-Syrn" pages="0,3,6-7,32,34,37-38,254">
             <font weight="400" style="normal">NotoSansSyriacEastern-Regular.woff2</font>
         </family>
-        <family pages="0,3,6-7,32,34,37-38,254">
+        <family lang="und-Syrj" pages="0,3,6-7,32,34,37-38,254">
             <font weight="400" style="normal">NotoSansSyriacWestern-Regular.woff2</font>
         </family>
-        <family pages="0,23,254">
+        <family lang="und-Tglg" pages="0,23,254">
             <font weight="400" style="normal">NotoSansTagalog-Regular.woff2</font>
         </family>
-        <family pages="0,23,254">
+        <family lang="und-Tagb" pages="0,23,254">
             <font weight="400" style="normal">NotoSansTagbanwa-Regular.woff2</font>
         </family>
-        <family pages="0,26,32,34,37,254">
+        <family lang="und-Lana" pages="0,26,32,34,37,254">
             <font weight="400" style="normal">NotoSansTaiTham-Regular.woff2</font>
         </family>
-        <family pages="0,32,37,167,170,254">
+        <family lang="und-Tavt" pages="0,32,37,167,170,254">
             <font weight="400" style="normal">NotoSansTaiViet-Regular.woff2</font>
         </family>
-        <family pages="0,15,32,37,254">
+        <family lang="und-Tibt" pages="0,15,32,37,254">
             <font weight="400" style="normal">NotoSansTibetan-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansTibetan-Bold.woff2</font>
         </family>
-        <family pages="0,3,32,45,254">
+        <family lang="und-Tfng" pages="0,3,32,45,254">
             <font weight="400" style="normal">NotoSansTifinagh-Regular.woff2</font>
         </family>
     </package>
-    <package name="fallback-historic">
+    <package lang="und-Ugar" name="fallback-historic">
         <family pages="0,254,259">
             <font weight="400" style="normal">NotoSansUgaritic-Regular.woff2</font>
         </family>
     </package>
-    <package name="fallback-lang-non-cjk">
+    <package lang="und-Vaii" name="fallback-lang-non-cjk">
         <family pages="0,165-166,254">
             <font weight="400" style="normal">NotoSansVai-Regular.woff2</font>
         </family>
@@ -519,7 +519,7 @@
         </family>
     </package>
     <package name="fallback-color-emoji">
-        <family pages="0,32-33,35-39,41,43,48,50,496-502,505,3584,4068,4072">
+        <family lang="und-Zsye" pages="0,32-33,35-39,41,43,48,50,496-502,505,3584,4068,4072">
             <font weight="400" style="normal" disable_synthetic_bolding="true">NotoColorEmoji.woff2</font>
         </family>
     </package>
@@ -529,7 +529,7 @@
         </family>
     </package>
     <package name="fallback-symbols">
-        <family pages="35,37-39,43,496-498">
+        <family lang="und-Zsym" pages="35,37-39,43,496-498">
             <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.woff2</font>
         </family>
     </package>
@@ -548,18 +548,18 @@
             Tai Le, Yi, Mongolian, and Phags-pa are intentionally kept last, to make sure they don't
             override the East Asian punctuation for Chinese.
         -->
-        <family pages="0,3,16,25,48,254">
+        <family lang="und-Tale" pages="0,3,16,25,48,254">
             <font weight="400" style="normal">NotoSansTaiLe-Regular.woff2</font>
         </family>
-        <family pages="0,48,160-164,254-255">
+        <family lang="und-Yiii" pages="0,48,160-164,254-255">
             <font weight="400" style="normal">NotoSansYi-Regular.woff2</font>
         </family>
-        <family pages="0,24,32,36-37,48,254">
+        <family lang="und-Mong" pages="0,24,32,36-37,48,254">
             <font weight="400" style="normal">NotoSansMongolian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,24,32,37,48,168,254">
+        <family lang="und-Phag" pages="0,24,32,37,48,168,254">
             <font weight="400" style="normal">NotoSansPhagsPa-Regular.woff2</font>
         </family>
     </package>
diff --git a/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt b/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt
index e431145..ef96d48 100644
--- a/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt
+++ b/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt
@@ -850,205 +850,6 @@
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-  xdg_mime
-
-
-  Licensed under the Academic Free License version 2.0 (below)
-  Or under the following terms:
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the
-  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-  Boston, MA 02111-1307, USA.
-
-
-  --------------------------------------------------------------------------------
-  Academic Free License v. 2.0
-  --------------------------------------------------------------------------------
-
-  This Academic Free License (the "License") applies to any original work of
-  authorship (the "Original Work") whose owner (the "Licensor") has placed the
-  following notice immediately following the copyright notice for the Original
-  Work:
-
-  Licensed under the Academic Free License version 2.0
-  1) Grant of Copyright License. Licensor hereby grants You a world-wide,
-  royalty-free, non-exclusive, perpetual, sublicenseable license to do the
-  following:
-
-  a) to reproduce the Original Work in copies;
-  b) to prepare derivative works ("Derivative Works") based upon the Original
-     Work;
-  c) to distribute copies of the Original Work and Derivative Works to the
-     public;
-  d) to perform the Original Work publicly; and
-  e) to display the Original Work publicly.
-
-  2) Grant of Patent License. Licensor hereby grants You a world-wide,
-  royalty-free, non-exclusive, perpetual, sublicenseable license, under patent
-  claims owned or controlled by the Licensor that are embodied in the Original
-  Work as furnished by the Licensor, to make, use, sell and offer for sale the
-  Original Work and Derivative Works.
-
-  3) Grant of Source Code License. The term "Source Code" means the preferred
-  form of the Original Work for making modifications to it and all available
-  documentation describing how to modify the Original Work. Licensor hereby
-  agrees to provide a machine-readable copy of the Source Code of the Original
-  Work along with each copy of the Original Work that Licensor distributes.
-  Licensor reserves the right to satisfy this obligation by placing a
-  machine-readable copy of the Source Code in an information repository
-  reasonably calculated to permit inexpensive and convenient access by You for as
-  long as Licensor continues to distribute the Original Work, and by publishing
-  the address of that information repository in a notice immediately following
-  the copyright notice that applies to the Original Work.
-
-  4) Exclusions From License Grant. Neither the names of Licensor, nor the names
-  of any contributors to the Original Work, nor any of their trademarks or
-  service marks, may be used to endorse or promote products derived from this
-  Original Work without express prior written permission of the Licensor. Nothing
-  in this License shall be deemed to grant any rights to trademarks, copyrights,
-  patents, trade secrets or any other intellectual property of Licensor except as
-  expressly stated herein. No patent license is granted to make, use, sell or
-  offer to sell embodiments of any patent claims other than the licensed claims
-  defined in Section 2. No right is granted to the trademarks of Licensor even if
-  such marks are included in the Original Work. Nothing in this License shall be
-  interpreted to prohibit Licensor from licensing under different terms from this
-  License any Original Work that Licensor otherwise would have a right to
-  license.
-
-  5) This section intentionally omitted.
-
-  6) Attribution Rights. You must retain, in the Source Code of any Derivative
-  Works that You create, all copyright, patent or trademark notices from the
-  Source Code of the Original Work, as well as any notices of licensing and any
-  descriptive text identified therein as an "Attribution Notice." You must cause
-  the Source Code for any Derivative Works that You create to carry a prominent
-  Attribution Notice reasonably calculated to inform recipients that You have
-  modified the Original Work.
-
-  7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that
-  the copyright in and to the Original Work and the patent rights granted herein
-  by Licensor are owned by the Licensor or are sublicensed to You under the terms
-  of this License with the permission of the contributor(s) of those copyrights
-  and patent rights. Except as expressly stated in the immediately proceeding
-  sentence, the Original Work is provided under this License on an "AS IS" BASIS
-  and WITHOUT WARRANTY, either express or implied, including, without limitation,
-  the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU.
-  This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No
-  license to Original Work is granted hereunder except under this disclaimer.
-
-  8) Limitation of Liability. Under no circumstances and under no legal theory,
-  whether in tort (including negligence), contract, or otherwise, shall the
-  Licensor be liable to any person for any direct, indirect, special, incidental,
-  or consequential damages of any character arising as a result of this License
-  or the use of the Original Work including, without limitation, damages for loss
-  of goodwill, work stoppage, computer failure or malfunction, or any and all
-  other commercial damages or losses. This limitation of liability shall not
-  apply to liability for death or personal injury resulting from Licensor's
-  negligence to the extent applicable law prohibits such limitation. Some
-  jurisdictions do not allow the exclusion or limitation of incidental or
-  consequential damages, so this exclusion and limitation may not apply to You.
-
-  9) Acceptance and Termination. If You distribute copies of the Original Work or
-  a Derivative Work, You must make a reasonable effort under the circumstances to
-  obtain the express assent of recipients to the terms of this License. Nothing
-  else but this License (or another written agreement between Licensor and You)
-  grants You permission to create Derivative Works based upon the Original Work
-  or to exercise any of the rights granted in Section 1 herein, and any attempt
-  to do so except under the terms of this License (or another written agreement
-  between Licensor and You) is expressly prohibited by U.S. copyright law, the
-  equivalent laws of other countries, and by international treaty. Therefore, by
-  exercising any of the rights granted to You in Section 1 herein, You indicate
-  Your acceptance of this License and all of its terms and conditions.
-
-  10) Termination for Patent Action. This License shall terminate automatically
-  and You may no longer exercise any of the rights granted to You by this License
-  as of the date You commence an action, including a cross-claim or counterclaim,
-  for patent infringement (i) against Licensor with respect to a patent
-  applicable to software or (ii) against any entity with respect to a patent
-  applicable to the Original Work (but excluding combinations of the Original
-  Work with other software or hardware).
-
-  11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this
-  License may be brought only in the courts of a jurisdiction wherein the
-  Licensor resides or in which Licensor conducts its primary business, and under
-  the laws of that jurisdiction excluding its conflict-of-law provisions. The
-  application of the United Nations Convention on Contracts for the International
-  Sale of Goods is expressly excluded. Any use of the Original Work outside the
-  scope of this License or after its termination shall be subject to the
-  requirements and penalties of the U.S. Copyright Act, 17 U.S.C. 101 et seq.,
-  the equivalent laws of other countries, and international treaty. This section
-  shall survive the termination of this License.
-
-  12) Attorneys Fees. In any action to enforce the terms of this License or
-  seeking damages relating thereto, the prevailing party shall be entitled to
-  recover its costs and expenses, including, without limitation, reasonable
-  attorneys' fees and costs incurred in connection with such action, including
-  any appeal of such action. This section shall survive the termination of this
-  License.
-
-  13) Miscellaneous. This License represents the complete agreement concerning
-  the subject matter hereof. If any provision of this License is held to be
-  unenforceable, such provision shall be reformed only to the extent necessary to
-  make it enforceable.
-
-  14) Definition of "You" in This License. "You" throughout this License, whether
-  in upper or lower case, means an individual or a legal entity exercising rights
-  under, and complying with all of the terms of, this License. For legal
-  entities, "You" includes any entity that controls, is controlled by, or is
-  under common control with you. For purposes of this definition, "control" means
-  (i) the power, direct or indirect, to cause the direction or management of such
-  entity, whether by contract or otherwise, or (ii) ownership of fifty percent
-  (50%) or more of the outstanding shares, or (iii) beneficial ownership of such
-  entity.
-
-  15) Right to Use. You may use the Original Work in all ways not otherwise
-  restricted or conditioned by this License or by law, and Licensor promises not
-  to interfere with or be responsible for such uses by You.
-
-  This license is Copyright (C) 2003 Lawrence E. Rosen. All rights reserved.
-  Permission is hereby granted to copy and distribute this license without
-  modification. This license may not be modified without the express written
-  permission of its copyright owner.
-
-
-  xdg_user_dirs
-
-
-  Copyright (c) 2007 Red Hat, inc
-
-  Permission is hereby granted, free of charge, to any person
-  obtaining a copy of this software and associated documentation files
-  (the "Software"), to deal in the Software without restriction,
-  including without limitation the rights to use, copy, modify, merge,
-  publish, distribute, sublicense, and/or sell copies of the Software,
-  and to permit persons to whom the Software is furnished to do so,
-  subject to the following conditions: 
-
-  The above copyright notice and this permission notice shall be
-  included in all copies or substantial portions of the Software. 
-
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-  SOFTWARE.
-
-
   uri_template
 
 
diff --git a/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt b/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt
index 757106b..5b4bc55 100644
--- a/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt
+++ b/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt
@@ -853,25 +853,6 @@
   xdg_mime
 
 
-  Licensed under the Academic Free License version 2.0 (below)
-  Or under the following terms:
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the
-  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-  Boston, MA 02111-1307, USA.
-
-
   --------------------------------------------------------------------------------
   Academic Free License v. 2.0
   --------------------------------------------------------------------------------
diff --git a/src/cobalt/extension/updater_notification.h b/src/cobalt/extension/updater_notification.h
index 151437f..ce301dc 100644
--- a/src/cobalt/extension/updater_notification.h
+++ b/src/cobalt/extension/updater_notification.h
@@ -51,7 +51,8 @@
   // and prompt the user to free some storage. The implementation
   // should keep track of the frequency of showing the prompt to the
   // user and try to minimize the number of user notifications.
-  void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state);
+  void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state,
+                       const char* current_evergreen_version);
 } CobaltExtensionUpdaterNotificationApi;
 
 #ifdef __cplusplus
diff --git a/src/cobalt/media/base/starboard_utils.cc b/src/cobalt/media/base/starboard_utils.cc
index c4e9cb0..9043285 100644
--- a/src/cobalt/media/base/starboard_utils.cc
+++ b/src/cobalt/media/base/starboard_utils.cc
@@ -369,7 +369,8 @@
   if (sb_media_color_metadata.primaries == kSbMediaPrimaryIdCustom) {
     const float* custom_primary_matrix = color_space.custom_primary_matrix();
     SbMemoryCopy(sb_media_color_metadata.custom_primary_matrix,
-                 custom_primary_matrix, sizeof(custom_primary_matrix));
+                 custom_primary_matrix,
+                 sizeof(sb_media_color_metadata.custom_primary_matrix));
   }
 
   return sb_media_color_metadata;
diff --git a/src/cobalt/render_tree/mock_resource_provider.h b/src/cobalt/render_tree/mock_resource_provider.h
index 244d695..3825a9a 100644
--- a/src/cobalt/render_tree/mock_resource_provider.h
+++ b/src/cobalt/render_tree/mock_resource_provider.h
@@ -59,6 +59,7 @@
   MOCK_CONST_METHOD1(HasLocalFontFamily, bool(const char* font_family_name));
   MOCK_METHOD2(GetLocalTypefaceMock,
                Typeface*(const char* font_family_name, FontStyle font_style));
+  MOCK_METHOD0(LoadAdditionalFonts, void());
   MOCK_METHOD1(GetLocalTypefaceIfAvailableMock,
                Typeface*(const std::string& font_face_name));
   MOCK_METHOD3(GetCharacterFallbackTypefaceMock,
diff --git a/src/cobalt/render_tree/resource_provider.h b/src/cobalt/render_tree/resource_provider.h
index af51209..ad8fd67 100644
--- a/src/cobalt/render_tree/resource_provider.h
+++ b/src/cobalt/render_tree/resource_provider.h
@@ -129,6 +129,9 @@
   virtual scoped_refptr<Typeface> GetLocalTypeface(const char* font_family_name,
                                                    FontStyle font_style) = 0;
 
+  // Loads additional fonts that should be loaded asynchronously at startup.
+  virtual void LoadAdditionalFonts() = 0;
+
   // Given a set of typeface information, this method returns the locally
   // available typeface that best fits the specified parameters. In the case
   // where no typeface is found that matches the font family name, NULL is
diff --git a/src/cobalt/render_tree/resource_provider_stub.h b/src/cobalt/render_tree/resource_provider_stub.h
index 961b59b..43ad4e8 100644
--- a/src/cobalt/render_tree/resource_provider_stub.h
+++ b/src/cobalt/render_tree/resource_provider_stub.h
@@ -329,6 +329,8 @@
     return base::WrapRefCounted(new TypefaceStub(NULL));
   }
 
+  void LoadAdditionalFonts() override {}
+
   scoped_refptr<Typeface> CreateTypefaceFromRawData(
       std::unique_ptr<RawTypefaceDataVector> raw_data,
       std::string* error_string) override {
diff --git a/src/cobalt/renderer/pipeline.cc b/src/cobalt/renderer/pipeline.cc
index a78f0ed..75a5a1e 100644
--- a/src/cobalt/renderer/pipeline.cc
+++ b/src/cobalt/renderer/pipeline.cc
@@ -603,6 +603,9 @@
   rasterizer_ = create_rasterizer_function.Run();
   rasterizer_created_event_.Signal();
 
+  // Async load additional fonts after rasterizer thread is fully initialized.
+  GetResourceProvider()->LoadAdditionalFonts();
+
   // Note that this is setup as high priority, but lower than the rasterizer
   // thread's priority (ThreadPriority::HIGHEST).  This is to ensure that
   // we never interrupt the rasterizer in order to dispose render trees, but
diff --git a/src/cobalt/renderer/pipeline_test.cc b/src/cobalt/renderer/pipeline_test.cc
index 65e75cb..a5fc24e 100644
--- a/src/cobalt/renderer/pipeline_test.cc
+++ b/src/cobalt/renderer/pipeline_test.cc
@@ -18,6 +18,7 @@
 #include "base/optional.h"
 #include "base/threading/platform_thread.h"
 #include "cobalt/render_tree/composition_node.h"
+#include "cobalt/render_tree/resource_provider_stub.h"
 #include "cobalt/renderer/pipeline.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
 #include "cobalt/renderer/submission.h"
@@ -36,6 +37,14 @@
 const base::TimeDelta kRasterizeDelay =
     base::TimeDelta::FromSecondsD(1.0 / 60.0);
 
+class MockResourceProvider : public cobalt::render_tree::ResourceProviderStub {
+ public:
+  MockResourceProvider() : fonts_loaded_(false){};
+  ~MockResourceProvider() override {}
+  void LoadAdditionalFonts() override { fonts_loaded_ = true; }
+  bool fonts_loaded_;
+};
+
 // Unfortunately, we can't make use of gmock to test the number of submission
 // calls that were made.  This is because we need to test our expectations
 // AFTER all Submit() calls have been made, whereas gmock requires us to
@@ -46,7 +55,9 @@
 class MockRasterizer : public Rasterizer {
  public:
   explicit MockRasterizer(int* submission_count)
-      : submission_count_(submission_count) {}
+      : submission_count_(submission_count),
+        provider_(new MockResourceProvider()) {}
+  ~MockRasterizer() { delete provider_; }
 
   void Submit(const scoped_refptr<cobalt::render_tree::Node>&,
               const scoped_refptr<cobalt::renderer::backend::RenderTarget>&,
@@ -67,7 +78,7 @@
   }
 
   cobalt::render_tree::ResourceProvider* GetResourceProvider() override {
-    return NULL;
+    return provider_;
   }
 
   void MakeCurrent() override {}
@@ -76,6 +87,7 @@
  private:
   int* submission_count_;
   base::Optional<base::TimeTicks> last_submission_time;
+  MockResourceProvider* provider_;
 };
 
 std::unique_ptr<Rasterizer> CreateMockRasterizer(int* submission_count) {
@@ -217,3 +229,16 @@
   EXPECT_LE(expected_submissions.lower_bound, submission_count_);
   EXPECT_GE(expected_submissions.upper_bound, submission_count_);
 }
+
+TEST_F(RendererPipelineTest, LoadDefaultFontsAfterRasterizerCreated) {
+  MockResourceProvider* provider =
+      base::polymorphic_downcast<MockResourceProvider*>(
+          pipeline_->GetResourceProvider());
+
+  // Wait a little bit to give the pipeline some time to initialize rasterizer
+  // thread.
+  const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(400);
+  base::PlatformThread::Sleep(kDelay);
+
+  EXPECT_EQ(true, provider->fonts_loaded_);
+}
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
index 83d2baf..399f535 100644
--- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
@@ -150,6 +150,10 @@
       utf32_character, font_style, language);
 }
 
+void ResourceProvider::LoadAdditionalFonts() {
+  return skia_resource_provider_->LoadAdditionalFonts();
+}
+
 scoped_refptr<Typeface> ResourceProvider::CreateTypefaceFromRawData(
     std::unique_ptr<RawTypefaceDataVector> raw_data,
     std::string* error_string) {
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.h b/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
index bb7fd0b..6e91345 100644
--- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
@@ -86,6 +86,8 @@
       int32 utf32_character, render_tree::FontStyle font_style,
       const std::string& language) override;
 
+  void LoadAdditionalFonts() override;
+
   scoped_refptr<render_tree::Typeface> CreateTypefaceFromRawData(
       std::unique_ptr<RawTypefaceDataVector> raw_data,
       std::string* error_string) override;
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
index 8b43221..7a14ae2 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -478,6 +478,13 @@
   return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface));
 }
 
+void HardwareResourceProvider::LoadAdditionalFonts() {
+  sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault());
+  SkFontMgr_Cobalt* cobalt_font_manager =
+      base::polymorphic_downcast<SkFontMgr_Cobalt*>(font_manager.get());
+  cobalt_font_manager->LoadLocaleDefault();
+}
+
 scoped_refptr<render_tree::Typeface>
 HardwareResourceProvider::CreateTypefaceFromRawData(
     std::unique_ptr<render_tree::ResourceProvider::RawTypefaceDataVector>
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
index e6b7252..2a7dc3d 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
@@ -92,6 +92,8 @@
       int32 character, render_tree::FontStyle font_style,
       const std::string& language) override;
 
+  void LoadAdditionalFonts() override;
+
   // This resource provider uses ots (OpenTypeSanitizer) to sanitize the raw
   // typeface data and skia to generate the typeface. It supports TrueType,
   // OpenType, and WOFF data formats.
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
index 2590ffc..bbe236f 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
@@ -26,11 +26,15 @@
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
+#include "cobalt/base/language.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/extension/font.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
+#include "third_party/icu/source/common/unicode/locid.h"
+
+const char* ROBOTO_SCRIPT = "latn";
 
 SkFontMgr_Cobalt::SkFontMgr_Cobalt(
     const char* cobalt_font_config_directory,
@@ -42,7 +46,8 @@
           "Font.LocalTypefaceCache",
           cobalt::configuration::Configuration::GetInstance()
               ->CobaltLocalTypefaceCacheSizeInBytes()),
-      default_family_(NULL) {
+      default_fonts_loaded_event_(base::WaitableEvent::ResetPolicy::MANUAL,
+                                  base::WaitableEvent::InitialState::SIGNALED) {
   TRACE_EVENT0("cobalt::renderer", "SkFontMgr_Cobalt::SkFontMgr_Cobalt()");
 
   PriorityStyleSetArrayMap priority_fallback_families;
@@ -199,7 +204,7 @@
   }
 
   if (typeface == NULL) {
-    typeface = default_family_->matchStyle(style);
+    typeface = default_families_[0]->matchStyle(style);
   }
 
   return typeface;
@@ -253,9 +258,10 @@
       font_manager->FindFamilyStyleCharacter(style, SkString(), character);
 
   // If no family was found that supports the character, then just fall back
-  // to the default family.
-  return matching_typeface ? matching_typeface
-                           : default_family_->MatchStyleWithoutLocking(style);
+  // to the first default family.
+  return matching_typeface
+             ? matching_typeface
+             : default_families_[0]->MatchStyleWithoutLocking(style);
 }
 
 sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromData(sk_sp<SkData> data,
@@ -270,12 +276,17 @@
   bool is_fixed_pitch;
   SkFontStyle style;
   SkString name;
+
+  // To pre-fetch glyphs for remote fonts, we could pass character_map here.
   if (!sk_freetype_cobalt::ScanFont(stream.get(), face_index, &name, &style,
-                                    &is_fixed_pitch)) {
+                                    &is_fixed_pitch, nullptr)) {
     return NULL;
   }
-  return sk_sp<SkTypeface>(new SkTypeface_CobaltStream(
-      std::move(stream), face_index, style, is_fixed_pitch, name));
+  scoped_refptr<font_character_map::CharacterMap> character_map =
+      base::MakeRefCounted<font_character_map::CharacterMap>();
+  return sk_sp<SkTypeface>(
+      new SkTypeface_CobaltStream(std::move(stream), face_index, style,
+                                  is_fixed_pitch, name, character_map));
 }
 
 sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromFile(const char path[],
@@ -289,6 +300,25 @@
   return sk_sp<SkTypeface>(matchFamilyStyle(family_name, style));
 }
 
+void SkFontMgr_Cobalt::LoadLocaleDefault() {
+  std::string script =
+      icu::Locale::createCanonical(base::GetSystemLanguageScript().c_str())
+          .getScript();
+  if (SbStringCompareNoCase(script.c_str(), ROBOTO_SCRIPT) == 0) {
+    return;
+  }
+
+  default_fonts_loaded_event_.Reset();
+  for (int i = 0; i < families_.count(); i++) {
+    if (CheckIfFamilyMatchesLocaleScript(families_[i], script.c_str())) {
+      default_fonts_loaded_event_.Signal();
+      return;
+    }
+  }
+
+  default_fonts_loaded_event_.Signal();
+}
+
 void SkFontMgr_Cobalt::ParseConfigAndBuildFamilies(
     const char* font_config_directory, const char* font_files_directory,
     PriorityStyleSetArrayMap* priority_fallback_families) {
@@ -458,20 +488,42 @@
     sk_sp<SkTypeface> check_typeface(
         check_family->MatchStyleWithoutLocking(SkFontStyle()));
     if (check_typeface.get() != NULL) {
-      default_family_ = check_family.get();
+      default_families_.push_back(check_family.get());
       break;
     }
   }
 
-  if (default_family_ == NULL) {
+  if (default_families_.empty()) {
     sk_sp<SkTypeface> check_typeface(
         families_[0]->MatchStyleWithoutLocking(SkFontStyle()));
     if (check_typeface.get() != NULL) {
-      default_family_ = families_[0].get();
+      default_families_.push_back(families_[0].get());
     }
   }
 
-  CHECK(default_family_);
+  CHECK(!default_families_.empty());
+}
+
+bool SkFontMgr_Cobalt::CheckIfFamilyMatchesLocaleScript(
+    sk_sp<SkFontStyleSet_Cobalt> new_family, const char* script) {
+  SkString family_tag = new_family->get_language().GetTag();
+  if (family_tag.isEmpty()) {
+    return false;
+  }
+  std::string family_script =
+      icu::Locale::createCanonical(family_tag.c_str()).getScript();
+  if (SbStringCompareNoCase(script, family_script.c_str()) != 0) {
+    return false;
+  }
+
+  sk_sp<SkTypeface> check_typeface(
+      new_family->MatchStyleWithoutLocking(SkFontStyle()));
+  if (check_typeface.get() == NULL) {
+    return false;
+  }
+
+  default_families_.push_back(new_family.get());
+  return true;
 }
 
 SkTypeface* SkFontMgr_Cobalt::FindFamilyStyleCharacter(
@@ -481,6 +533,20 @@
     return NULL;
   }
 
+  // First attempt any extra default fonts set by locale.
+  default_fonts_loaded_event_.Wait();
+  if (default_families_.size() > 1) {
+    for (int i = 1; i < default_families_.size(); ++i) {
+      SkFontStyleSet_Cobalt* family = default_families_[i];
+      if (family->ContainsCharacter(style, character)) {
+        SkTypeface* matching_typeface = family->MatchStyleWithoutLocking(style);
+        if (matching_typeface) {
+          return matching_typeface;
+        }
+      }
+    }
+  }
+
   StyleSetArray* fallback_families = GetMatchingFallbackFamilies(language_tag);
   for (int i = 0; i < fallback_families->size(); ++i) {
     SkFontStyleSet_Cobalt* family = (*fallback_families)[i];
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
index 8159969..10f6b0c 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
@@ -25,6 +25,7 @@
 #include "SkTypeface.h"
 #include "base/containers/hash_tables.h"
 #include "base/containers/small_map.h"
+#include "base/synchronization/waitable_event.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h"
@@ -65,6 +66,9 @@
   // NOTE: This returns NULL if a match is not found.
   SkTypeface* MatchFaceName(const char face_name[]);
 
+  // Loads the font that matches the suggested script for the device's locale.
+  void LoadLocaleDefault();
+
  protected:
   // From SkFontMgr
   int onCountFamilies() const override;
@@ -125,6 +129,8 @@
   void GeneratePriorityOrderedFallbackFamilies(
       const PriorityStyleSetArrayMap& priority_fallback_families);
   void FindDefaultFamily(const SkTArray<SkString, true>& default_families);
+  bool CheckIfFamilyMatchesLocaleScript(sk_sp<SkFontStyleSet_Cobalt> new_family,
+                                        const char* script);
 
   // Returns the first encountered fallback family that matches the language tag
   // and supports the specified character.
@@ -157,9 +163,12 @@
   std::vector<std::unique_ptr<StyleSetArray>> language_fallback_families_array_;
   NameToStyleSetArrayMap language_fallback_families_map_;
 
-  // The default family that is used when no specific match is found during a
-  // request.
-  SkFontStyleSet_Cobalt* default_family_;
+  // List of default families that are used when no specific match is found
+  // during a request.
+  std::vector<SkFontStyleSet_Cobalt*> default_families_;
+
+  // Used to delay font loading until default fonts are fully loaded.
+  base::WaitableEvent default_fonts_loaded_event_;
 
   // Mutex shared by all families for accessing their modifiable data.
   mutable SkMutex family_mutex_;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
index b9af82e..8d92c16 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
@@ -90,6 +90,8 @@
     return;
   }
 
+  character_map_ = base::MakeRefCounted<font_character_map::CharacterMap>();
+
   family_name_ = family_info.names[0];
   SkTHashMap<SkString, int> styles_index_map;
 
@@ -333,11 +335,8 @@
 }
 
 bool SkFontStyleSet_Cobalt::CharacterMapContainsCharacter(SkUnichar character) {
-  font_character_map::CharacterMap::iterator page_iterator =
-      character_map_.find(font_character_map::GetPage(character));
-  return page_iterator != character_map_.end() &&
-         page_iterator->second.test(
-             font_character_map::GetPageCharacterIndex(character));
+  font_character_map::Character c = character_map_->Find(character);
+  return c.is_set && c.id > 0;
 }
 
 bool SkFontStyleSet_Cobalt::GenerateStyleFaceInfo(
@@ -349,7 +348,7 @@
   // Providing a pointer to the character map will cause it to be generated
   // during ScanFont. Only provide it if it hasn't already been generated.
   font_character_map::CharacterMap* character_map =
-      !is_character_map_generated_ ? &character_map_ : NULL;
+      !is_character_map_generated_ ? character_map_.get() : NULL;
 
   if (!sk_freetype_cobalt::ScanFont(
           stream, style->face_index, &style->face_name, &style->font_style,
@@ -396,7 +395,7 @@
     style_entry->typeface.reset(new SkTypeface_CobaltStreamProvider(
         stream_provider, style_entry->face_index, style_entry->font_style,
         style_entry->face_is_fixed_pitch, family_name_,
-        style_entry->disable_synthetic_bolding));
+        style_entry->disable_synthetic_bolding, character_map_));
   } else {
     LOG(ERROR) << "Failed to scan font: "
                << style_entry->font_file_path.c_str();
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
index 715aee8..33ec970 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
@@ -100,6 +100,8 @@
 
   const SkString& get_family_name() const { return family_name_; }
 
+  const SkLanguage& get_language() const { return language_; }
+
  private:
   // NOTE: It is the responsibility of the caller to lock the mutex before
   // calling any of the non-const private functions.
@@ -135,7 +137,7 @@
 
   // NOTE: The following characters require locking when being accessed.
   bool is_character_map_generated_;
-  font_character_map::CharacterMap character_map_;
+  scoped_refptr<font_character_map::CharacterMap> character_map_;
 
   SkTArray<sk_sp<SkFontStyleSetEntry_Cobalt>, true> styles_;
 
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
index 77023ae..4f0f1c3 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
@@ -19,9 +19,11 @@
 #include <map>
 #include <utility>
 
+#include "SkMutex.h"
 #include "SkString.h"
 #include "SkTDArray.h"
 #include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
 
 // The font_character_map namespace contains all of the constants, typedefs, and
 // utility functions used with determining whether or not a font supports a
@@ -54,13 +56,46 @@
 // in non-overlapping ascending order.
 typedef SkTArray<PageRange> PageRanges;
 
-typedef std::bitset<kNumCharactersPerPage> PageCharacters;
-typedef std::map<int16, PageCharacters> CharacterMap;
-
 bool IsCharacterValid(SkUnichar character);
 int16 GetPage(SkUnichar character);
 unsigned char GetPageCharacterIndex(SkUnichar character);
 
+struct Character {
+  SkGlyphID id = 0;
+  bool is_set = false;
+};
+
+using PageCharacters = Character[kNumCharactersPerPage];
+class CharacterMap : public base::RefCountedThreadSafe<CharacterMap> {
+ public:
+  const Character Find(SkUnichar character) {
+    SkAutoMutexExclusive scoped_mutex(mutex_);
+
+    int16 page = GetPage(character);
+    std::map<int16, PageCharacters>::iterator page_iterator = data_.find(page);
+
+    if (page_iterator == data_.end()) return {};
+
+    unsigned char character_index = GetPageCharacterIndex(character);
+    return page_iterator->second[character_index];
+  }
+
+  void Insert(SkUnichar character, SkGlyphID glyph) {
+    SkAutoMutexExclusive scoped_mutex(mutex_);
+
+    int16 page = GetPage(character);
+    unsigned char character_index = GetPageCharacterIndex(character);
+    Character c;
+    c.id = glyph;
+    c.is_set = true;
+    data_[page][character_index] = c;
+  }
+
+ private:
+  std::map<int16, PageCharacters> data_;
+  mutable SkMutex mutex_;
+};
+
 }  // namespace font_character_map
 
 // The SkLanguage class represents a human written language, and is used by
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
index 637db3a..cbcc362 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
@@ -106,19 +106,9 @@
   TRACE_EVENT0("cobalt::renderer", "GenerateCharacterMapFromFace");
 
   FT_UInt glyph_index;
-
-  int last_page = -1;
-  font_character_map::PageCharacters* page_characters = NULL;
-
   SkUnichar code_point = FT_Get_First_Char(face, &glyph_index);
   while (glyph_index) {
-    int page = font_character_map::GetPage(code_point);
-    if (page != last_page) {
-      page_characters = &(*character_map)[page];
-      last_page = page;
-    }
-    page_characters->set(font_character_map::GetPageCharacterIndex(code_point));
-
+    character_map->Insert(code_point, SkToU16(glyph_index));
     code_point = FT_Get_Next_Char(face, code_point, &glyph_index);
   }
 }
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
index 8869e40..8f9cce8 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
@@ -20,27 +20,52 @@
 #include "SkFontStyle.h"
 #include "SkTypefaceCache.h"
 
-SkTypeface_Cobalt::SkTypeface_Cobalt(int face_index, SkFontStyle style,
-                                     bool is_fixed_pitch,
-                                     const SkString& family_name)
+SkTypeface_Cobalt::SkTypeface_Cobalt(
+    int face_index, SkFontStyle style, bool is_fixed_pitch,
+    const SkString& family_name,
+    scoped_refptr<font_character_map::CharacterMap> character_map)
     : INHERITED(style, is_fixed_pitch),
       face_index_(face_index),
       family_name_(family_name),
-      synthesizes_bold_(!isBold()) {}
+      synthesizes_bold_(!isBold()),
+      character_map_(character_map) {}
 
 sk_sp<SkTypeface> SkTypeface_Cobalt::onMakeClone(
     const SkFontArguments& args) const {
   return sk_ref_sp(this);
 }
 
+void SkTypeface_Cobalt::onCharsToGlyphs(const SkUnichar uni[], int count,
+                                        SkGlyphID glyphs[]) const {
+  for (int i = 0; i < count; ++i) {
+    glyphs[i] = characterMapGetGlyphIdForCharacter(uni[i]);
+  }
+}
+
+SkGlyphID SkTypeface_Cobalt::characterMapGetGlyphIdForCharacter(
+    SkUnichar character) const {
+  CHECK(character_map_);
+
+  // Check whether the character is cached in the character map.
+  font_character_map::Character c = character_map_->Find(character);
+  if (c.is_set) return c.id;
+
+  // If the character isn't there, look it up with FreeType, then cache it.
+  SkGlyphID glyphs[1] = {0};
+  SkTypeface_FreeType::onCharsToGlyphs(&character, 1, glyphs);
+  character_map_->Insert(character, glyphs[0]);
+  return glyphs[0];
+}
+
 void SkTypeface_Cobalt::onGetFamilyName(SkString* family_name) const {
   *family_name = family_name_;
 }
 
 SkTypeface_CobaltStream::SkTypeface_CobaltStream(
     std::unique_ptr<SkStreamAsset> stream, int face_index, SkFontStyle style,
-    bool is_fixed_pitch, const SkString& family_name)
-    : INHERITED(face_index, style, is_fixed_pitch, family_name),
+    bool is_fixed_pitch, const SkString& family_name,
+    scoped_refptr<font_character_map::CharacterMap> character_map)
+    : INHERITED(face_index, style, is_fixed_pitch, family_name, character_map),
       stream_(std::move(stream)) {
   LOG(INFO) << "Created SkTypeface_CobaltStream: " << family_name.c_str() << "("
             << style.weight() << ", " << style.width() << ", " << style.slant()
@@ -68,8 +93,9 @@
 SkTypeface_CobaltStreamProvider::SkTypeface_CobaltStreamProvider(
     SkFileMemoryChunkStreamProvider* stream_provider, int face_index,
     SkFontStyle style, bool is_fixed_pitch, const SkString& family_name,
-    bool disable_synthetic_bolding)
-    : INHERITED(face_index, style, is_fixed_pitch, family_name),
+    bool disable_synthetic_bolding,
+    scoped_refptr<font_character_map::CharacterMap> character_map)
+    : INHERITED(face_index, style, is_fixed_pitch, family_name, character_map),
       stream_provider_(stream_provider) {
   if (disable_synthetic_bolding) {
     synthesizes_bold_ = false;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
index e5d94d5..291ff2d 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
@@ -20,6 +20,7 @@
 #include "SkStream.h"
 #include "SkString.h"
 #include "base/memory/ref_counted.h"
+#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h"
 #include "third_party/skia/src/ports/SkFontHost_FreeType_common.h"
 
@@ -27,8 +28,10 @@
 
 class SkTypeface_Cobalt : public SkTypeface_FreeType {
  public:
-  SkTypeface_Cobalt(int face_index, SkFontStyle style, bool is_fixed_pitch,
-                    const SkString& family_name);
+  SkTypeface_Cobalt(
+      int face_index, SkFontStyle style, bool is_fixed_pitch,
+      const SkString& family_name,
+      scoped_refptr<font_character_map::CharacterMap> character_map);
 
   virtual size_t GetStreamLength() const = 0;
 
@@ -37,6 +40,9 @@
  protected:
   sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
 
+  void onCharsToGlyphs(const SkUnichar uni[], int count,
+                       SkGlyphID glyphs[]) const override;
+
   void onGetFamilyName(SkString* family_name) const override;
 
   int face_index_;
@@ -45,13 +51,16 @@
 
  private:
   typedef SkTypeface_FreeType INHERITED;
+  SkGlyphID characterMapGetGlyphIdForCharacter(SkUnichar character) const;
+  scoped_refptr<font_character_map::CharacterMap> character_map_;
 };
 
 class SkTypeface_CobaltStream : public SkTypeface_Cobalt {
  public:
-  SkTypeface_CobaltStream(std::unique_ptr<SkStreamAsset> stream, int face_index,
-                          SkFontStyle style, bool is_fixed_pitch,
-                          const SkString& family_name);
+  SkTypeface_CobaltStream(
+      std::unique_ptr<SkStreamAsset> stream, int face_index, SkFontStyle style,
+      bool is_fixed_pitch, const SkString& family_name,
+      scoped_refptr<font_character_map::CharacterMap> character_map);
 
   void onGetFontDescriptor(SkFontDescriptor* descriptor,
                            bool* serialize) const override;
@@ -71,7 +80,8 @@
   SkTypeface_CobaltStreamProvider(
       SkFileMemoryChunkStreamProvider* stream_provider, int face_index,
       SkFontStyle style, bool is_fixed_pitch, const SkString& family_name,
-      bool disable_synthetic_bolding);
+      bool disable_synthetic_bolding,
+      scoped_refptr<font_character_map::CharacterMap> character_map);
 
   void onGetFontDescriptor(SkFontDescriptor* descriptor,
                            bool* serialize) const override;
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
index d6b2a10..25f9813 100644
--- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
@@ -179,6 +179,13 @@
   return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface));
 }
 
+void SoftwareResourceProvider::LoadAdditionalFonts() {
+  sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault());
+  SkFontMgr_Cobalt* cobalt_font_manager =
+      base::polymorphic_downcast<SkFontMgr_Cobalt*>(font_manager.get());
+  cobalt_font_manager->LoadLocaleDefault();
+}
+
 scoped_refptr<render_tree::Typeface>
 SoftwareResourceProvider::CreateTypefaceFromRawData(
     std::unique_ptr<render_tree::ResourceProvider::RawTypefaceDataVector>
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
index 68d06ff..aad9edd 100644
--- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
@@ -84,6 +84,8 @@
       int32 character, render_tree::FontStyle font_style,
       const std::string& language) override;
 
+  void LoadAdditionalFonts() override;
+
   // This resource provider uses ots (OpenTypeSanitizer) to sanitize the raw
   // typeface data and skia to generate the typeface. It supports TrueType,
   // OpenType, and WOFF data formats.
diff --git a/src/cobalt/renderer/rasterizer/skia/typeface.cc b/src/cobalt/renderer/rasterizer/skia/typeface.cc
index 5c9acc0..0a70a6c 100644
--- a/src/cobalt/renderer/rasterizer/skia/typeface.cc
+++ b/src/cobalt/renderer/rasterizer/skia/typeface.cc
@@ -65,26 +65,15 @@
                render_tree::kUnknownGlyphIndex) {
       return primary_page_character_glyphs_[utf32_character];
     }
-    // Otherwise, check for the character's glyph within the map.
-  } else {
-    CharacterToGlyphMap::iterator glyph_iterator =
-        character_to_glyph_map_.find(utf32_character);
-    if (glyph_iterator != character_to_glyph_map_.end()) {
-      return glyph_iterator->second;
-    }
   }
-
-  // If we reach this point, the character's glyph was not previously cached and
-  // needs to be retrieved now.
   render_tree::GlyphIndex glyph = render_tree::kInvalidGlyphIndex;
   typeface_->unicharsToGlyphs(&utf32_character, 1, &glyph);
 
   // Both cache and return the character's glyph.
   if (utf32_character < kPrimaryPageSize) {
     return primary_page_character_glyphs_[utf32_character] = glyph;
-  } else {
-    return character_to_glyph_map_[utf32_character] = glyph;
   }
+  return glyph;
 }
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/typeface.h b/src/cobalt/renderer/rasterizer/skia/typeface.h
index f0efded..26aad50 100644
--- a/src/cobalt/renderer/rasterizer/skia/typeface.h
+++ b/src/cobalt/renderer/rasterizer/skia/typeface.h
@@ -63,7 +63,6 @@
  private:
   // Usually covers Latin-1 in a single page.
   static const int kPrimaryPageSize = 256;
-  typedef base::hash_map<int32, render_tree::GlyphIndex> CharacterToGlyphMap;
 
   // The underlying SkTypeface that was used to create this typeface.
   sk_sp<SkTypeface_Cobalt> typeface_;
@@ -73,7 +72,6 @@
   // Thread checking is used to used to ensure that they are only accessed and
   // modified on a single thread.
   std::unique_ptr<render_tree::GlyphIndex[]> primary_page_character_glyphs_;
-  CharacterToGlyphMap character_to_glyph_map_;
   THREAD_CHECKER(character_glyph_thread_checker_);
 };
 
diff --git a/src/cobalt/updater/updater_module.cc b/src/cobalt/updater/updater_module.cc
index db02d9a..8f5663f 100644
--- a/src/cobalt/updater/updater_module.cc
+++ b/src/cobalt/updater/updater_module.cc
@@ -105,7 +105,8 @@
     if (updater_notification_ext_ != nullptr) {
       updater_notification_ext_->UpdaterState(
           ComponentStateToCobaltExtensionUpdaterNotificationState(
-              crx_update_item_.state));
+              crx_update_item_.state),
+          GetCurrentEvergreenVersion().c_str());
     }
   } else {
     status = "No status available";
diff --git a/src/starboard/android/apk/app/cobalt-ninja.sh b/src/starboard/android/apk/app/cobalt-ninja.sh
index 6dc1375..f1edba2 100755
--- a/src/starboard/android/apk/app/cobalt-ninja.sh
+++ b/src/starboard/android/apk/app/cobalt-ninja.sh
@@ -19,7 +19,6 @@
 # https://cobalt.googlesource.com/cobalt/+/master/src/#Building-and-Running-the-Code
 
 # Allow for a developer-specific environment setup from .cobaltrc
-# e.g., it may set DEPOT_TOOLS and/or setup some distributed build tools.
 local_rc=$(dirname $0)/.cobaltrc
 global_rc=${HOME}/.cobaltrc
 if [ -r ${local_rc} ]; then
@@ -28,9 +27,6 @@
   source ${global_rc}
 fi
 
-# DEPOT_TOOLS may be set in .cobaltrc, otherwise assume it's in $HOME.
-[ -x ${DEPOT_TOOLS}/ninja ] || DEPOT_TOOLS=${HOME}/depot_tools
-
 # Use Cobalt's clang if it's not anywhere earlier in the PATH.
 SRC_DIR=$(cd $(dirname $0)/../../../..; pwd)
 PATH=$PATH:${SRC_DIR}/third_party/llvm-build/Release+Asserts/bin
@@ -42,6 +38,4 @@
   exit
 fi
 
-# When running in CMake, depot_tools isn't in the path, so we have to be
-# explicit about which ninja to run. Fail if we didn't find depot_tools.
-exec ${DEPOT_TOOLS}/ninja "$@"
+exec ninja "$@"
diff --git a/src/starboard/android/apk/build.id b/src/starboard/android/apk/build.id
index ef01811..772184d 100644
--- a/src/starboard/android/apk/build.id
+++ b/src/starboard/android/apk/build.id
@@ -1 +1 @@
-301999
\ No newline at end of file
+302879
\ No newline at end of file
diff --git a/src/starboard/doc/c99.md b/src/starboard/doc/c99.md
new file mode 100644
index 0000000..e767002
--- /dev/null
+++ b/src/starboard/doc/c99.md
@@ -0,0 +1,4 @@
+<!--
+This file is required to exist by some tools but its contents are not used in
+21.lts.1+.
+-->
diff --git a/src/starboard/doc/evergreen/cobalt_evergreen_overview.md b/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
index 247d19f..fe48bd6 100644
--- a/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
+++ b/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -120,7 +120,7 @@
 Evergreen:
 
 *   `kSbSystemPathStorageDirectory`
-    *   Dedidated location for storing Cobalt Evergreen-related binaries
+    *   Dedicated location for storing Cobalt Evergreen-related binaries
     *   This path must be writable and have at least 96MB of reserved space for
         Evergreen updates. Please see the “Platforms Requirements” section below
         for more details.
@@ -403,7 +403,7 @@
 │   └── app
 │       └── cobalt <--(SLOT_0)
 │           ├── content <--(relative path defined in kSystemImageContentPath)
-│           │   ├── fonts <--(`minimal` configuration)
+│           │   ├── fonts <--(`empty` configuration)
 │           │   ├── (icu) <--(only present when it needs to be updated by Cobalt Update)
 │           │   ├── licenses
 │           │   ├── ssl
@@ -424,7 +424,7 @@
     ├── installation_1 <--(SLOT_1 - currently unused)
     ├── installation_2 <--(SLOT_2 - contains new Cobalt version)
     │   ├── content
-    │   │   ├── fonts <--(`minimal` configuration)
+    │   │   ├── fonts <--(`empty` configuration)
     │   │   ├── (icu) <--(only present when it needs to be updated by Cobalt Update)
     │   │   ├── licenses
     │   │   ├── ssl
@@ -460,13 +460,13 @@
 the system font directory and setting the `cobalt_font_package` to `standard` or
 `limited` in your port.
 
-Cobalt Evergreen (built by Google), will by default use the `minimal` font
-package which is around 16KB to minimize storage requirements. A separate
-`cobalt_font_package` variable is set to `minimal` in the Evergreen platform.
+Cobalt Evergreen (built by Google), will by default use the `empty` font
+package to minimize storage requirements. A separate
+`cobalt_font_package` variable is set to `empty` in the Evergreen platform.
 
 On Raspberry Pi this is:
 
-`minimal` set of fonts under:
+`empty` set of fonts under:
 ```
 <kSbSystemPathContentDirectory>/app/cobalt/content/fonts
 ```
diff --git a/src/starboard/elf_loader/program_table.cc b/src/starboard/elf_loader/program_table.cc
index bab921d..425c16d 100644
--- a/src/starboard/elf_loader/program_table.cc
+++ b/src/starboard/elf_loader/program_table.cc
@@ -65,7 +65,8 @@
   SB_DLOG(INFO) << "elf_header->e_phnum=" << elf_header->e_phnum;
 
   Addr page_min = PAGE_START(elf_header->e_phoff);
-  Addr page_max = PAGE_END(elf_header->e_phoff + (phdr_num_ * elf_header->e_phentsize));
+  Addr page_max =
+      PAGE_END(elf_header->e_phoff + (phdr_num_ * elf_header->e_phentsize));
   Addr page_offset = PAGE_OFFSET(elf_header->e_phoff);
 
   SB_DLOG(INFO) << "page_min=" << page_min;
@@ -379,7 +380,7 @@
 
 void ProgramTable::PublishEvergreenInfo(const char* file_path) {
   EvergreenInfo evergreen_info;
-  SbMemorySet(&evergreen_info, sizeof(EvergreenInfo), 0);
+  SbMemorySet(&evergreen_info, 0, sizeof(EvergreenInfo));
   SbStringCopy(evergreen_info.file_path_buf, file_path,
                EVERGREEN_FILE_PATH_MAX_SIZE);
   evergreen_info.base_address = base_memory_address_;
diff --git a/src/starboard/elf_loader/sandbox.cc b/src/starboard/elf_loader/sandbox.cc
index 05f4098..55cc559 100644
--- a/src/starboard/elf_loader/sandbox.cc
+++ b/src/starboard/elf_loader/sandbox.cc
@@ -80,7 +80,7 @@
     SB_LOG(ERROR) << "Failed to get user agent string";
   } else {
     CrashpadAnnotations cobalt_version_info;
-    SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0);
+    SbMemorySet(&cobalt_version_info, 0, sizeof(CrashpadAnnotations));
     SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(),
                  USER_AGENT_STRING_MAX_SIZE);
     third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
diff --git a/src/starboard/loader_app/loader_app.cc b/src/starboard/loader_app/loader_app.cc
index 489d214..c5c92a5 100644
--- a/src/starboard/loader_app/loader_app.cc
+++ b/src/starboard/loader_app/loader_app.cc
@@ -126,7 +126,7 @@
     SB_LOG(ERROR) << "Failed to get user agent string";
   } else {
     CrashpadAnnotations cobalt_version_info;
-    SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0);
+    SbMemorySet(&cobalt_version_info, 0, sizeof(CrashpadAnnotations));
     SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(),
                  USER_AGENT_STRING_MAX_SIZE);
     third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
diff --git a/src/starboard/loader_app/slot_management.cc b/src/starboard/loader_app/slot_management.cc
index 0639e7d..aef6c5e 100644
--- a/src/starboard/loader_app/slot_management.cc
+++ b/src/starboard/loader_app/slot_management.cc
@@ -267,7 +267,7 @@
       SB_LOG(ERROR) << "Failed to get user agent string";
     } else {
       CrashpadAnnotations cobalt_version_info;
-      SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0);
+      SbMemorySet(&cobalt_version_info, 0, sizeof(CrashpadAnnotations));
       SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(),
                    USER_AGENT_STRING_MAX_SIZE);
       third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc b/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
index df9ba2b..091a496 100644
--- a/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
@@ -36,9 +36,15 @@
   std::vector<char> system_fonts_dir(kSbFileMaxPath);
   ASSERT_TRUE(SbSystemGetPath(kSbSystemPathFontDirectory,
                               system_fonts_dir.data(), kSbFileMaxPath));
-
   ASSERT_TRUE(SbFileExists(system_fonts_dir.data()));
-  std::string fonts_descriptor_file = system_fonts_dir.data();
+}
+
+TEST(FontsTest, VerifySystemFontsConfigDirectory) {
+  std::vector<char> system_fonts_conf_dir(kSbFileMaxPath);
+  ASSERT_TRUE(SbSystemGetPath(kSbSystemPathFontConfigurationDirectory,
+                              system_fonts_conf_dir.data(), kSbFileMaxPath));
+  ASSERT_TRUE(SbFileExists(system_fonts_conf_dir.data()));
+  std::string fonts_descriptor_file = system_fonts_conf_dir.data();
   fonts_descriptor_file += kSbFileSepString;
   fonts_descriptor_file += kFileName;
   ASSERT_TRUE(SbFileExists(fonts_descriptor_file.c_str()));
diff --git a/src/starboard/raspi/shared/dispmanx_util.cc b/src/starboard/raspi/shared/dispmanx_util.cc
index 906cfb0..e26dab4 100644
--- a/src/starboard/raspi/shared/dispmanx_util.cc
+++ b/src/starboard/raspi/shared/dispmanx_util.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/raspi/shared/dispmanx_util.h"
 
+#include <utility>
+
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/memory.h"
 
@@ -91,8 +93,8 @@
 
 void DispmanxYUV420Resource::ClearWithBlack() {
   scoped_array<uint8_t> data(new uint8_t[width() * height() * 3 / 2]);
-  SbMemorySet(data.get(), width() * height(), 0);
-  SbMemorySet(data.get() + width() * height(), width() * height() / 2, 0x80);
+  SbMemorySet(data.get(), 0, width() * height());
+  SbMemorySet(data.get() + width() * height(), 0x80, width() * height() / 2);
   WriteData(data.get());
 }
 
@@ -108,7 +110,7 @@
 
 void DispmanxRGB565Resource::ClearWithBlack() {
   scoped_array<uint8_t> data(new uint8_t[width() * height() * 2]);
-  SbMemorySet(data.get(), width() * height() * 2, 0);
+  SbMemorySet(data.get(), 0, width() * height() * 2);
   WriteData(data.get());
 }