Import Cobalt 21.master.0.270962

Includes the following patches:
  https://cobalt-review.googlesource.com/c/cobalt/+/5690
    by n1214.hwang@samsung.com
diff --git a/src/README.md b/src/README.md
index ced1010..8ca8618 100644
--- a/src/README.md
+++ b/src/README.md
@@ -40,13 +40,11 @@
     on even a budget desktop computer. Minor performance concerns can be greatly
     exaggerated, which seriously affects priorities.
   * **Fewer cores.** CE System-on-a-Chip (SoC) processors often do not have as
-    many processor cores as we are used to in modern computers. Many deployed
-    devices still only have a single core.
-  * **Sometimes No GPU.** Not all CE devices have a monster GPU to throw shaders
-    at to offload CPU work. A different strategy is required to maximize
-    leverage of an accelerated blitter, which is all some older devices
-    have. Some newer CE devices have a GPU, but it's not nearly as powerful as
-    what one would even see on a laptop.
+    many processor cores as we are used to in modern computers.
+  * **Minimal GPU.** Not all CE devices have a monster GPU to throw shaders at
+    to offload CPU work. As CE devices now have a standard GPU (though not
+    nearly as powerful as even a laptop), OpenGL ES 2.0 is now required
+    by Cobalt.
   * **Sometimes No JIT.** Many CE devices are dealing with "High-Value Content,"
     and, as such, are very sensitive to security concerns. Ensuring that
     writable pages are not executable is a strong security protocol that can
@@ -55,8 +53,8 @@
   * **Heterogenous Development Environments.** This is slowly evening out, but
     all CE devices run on custom hardware, often with proprietary methods of
     building, packaging, deploying, and running programs. Almost all CE devices
-    have ARM or MIPS processors instead of the more familiar x86. Sometimes the
-    toolchain doesn't support contemporary C++11 features. Sometimes the OS
+    have ARM processors instead of the more familiar x86. Sometimes the
+    toolchain doesn't support contemporary C++11/14 features. Sometimes the OS
     isn't POSIX, or it tries to be, but it is only partially implemented.
     Sometimes the program entry point is in another language or architecture
     that requires a "trampoline" over to native binary code.
@@ -97,13 +95,11 @@
     incremental layouts can be sped up.
   * **Renderer/Skia** - The Renderer walks a Render Tree produced by the Layout
     Engine, rasterizes it using the third-party graphics library Skia, and swaps
-    it to the front buffer. There are two major paths here, one using Hardware
-    Skia on OpenGL ES 2.0, and one using Software Skia combined with the
-    hardware-accelerated Starboard Blitter. Note that the renderer runs in a
-    different thread from the Layout Engine, and can interpolate animations that
-    do not require re-layout. This decouples rendering from Layout and
-    JavaScript, allowing for smooth, consistent animations on platforms with a
-    variety of capabilities.
+    it to the front buffer. This is accomplished using Hardware Skia on OpenGL
+    ES 2.0. Note that the renderer runs in a different thread from the Layout
+    Engine, and can interpolate animations that do not require re-layout. This
+    decouples rendering from Layout and JavaScript, allowing for smooth,
+    consistent animations on platforms with a variety of capabilities.
   * **Net / Media** - These are Chromium's Network and Media engines. We are
     using them directly, as they don't cause any particular problems with the
     extra constraints listed above.
@@ -129,22 +125,16 @@
     to GLES2. **ANGLE** Is a third-party library that adapts DirectX to GLES2,
     similar to Glimp, but only for DirectX.
 
-Cobalt is like a flaky layered pastry - perhaps Baklava. It shouldn't be too
-difficult to rip the Web Implementation and Layout off the top, and just use the
-Renderer, or even to just use Base + Starboard + GLES2 as the basis of a new
-project.
-
-
 ## The Cobalt Subset
 
 > Oh, we got both kinds of HTML tags,\
-> we got `<span>` and `<div>`!
+> we got `<span>` and `<div>`! \
+> We even have CSS Flexbox now, hooray!
 
-See the [Cobalt Subset specification](TODO) for more details on which tags,
-properties, and Web APIs are supported in Cobalt.
-
-*More to come.*
-
+See the [Cobalt Subset
+specification](https://cobalt.dev/development/reference/supported-features.html)
+for more details on which tags, properties, and Web APIs are supported in
+Cobalt.
 
 ## Interesting Source Locations
 
@@ -162,6 +152,9 @@
       * `cobalt/build/` - The core build generation system, `gyp_cobalt`, and
         configurations for supported platforms. (NOTE: This should eventually be
         mostly moved into `starboard/`.)
+      * `cobalt/doc/` - Contains a wide range of detailed information and guides
+        on Cobalt features, functionality and best practices for Cobalt
+        development.
       * `cobalt/media/` - Chromium's Media library. Contains all the code that
         parses, processes, and manages buffers of video and audio data. It
         send the buffers to the SbPlayer implementation for playback.
@@ -178,63 +171,11 @@
 
 ## Building and Running the Code
 
-Here's a quick and dirty guide to get to build the code on Linux.
+  See the below reference port setup guides for more details:
 
-  1. Pull `depot_tools` into your favorite directory. It has been slightly
-     modified from Chromium's `depot_tools`.
-
-         git clone https://cobalt.googlesource.com/depot_tools
-
-  2. Add that directory to the end of your `$PATH`.
-  3. Ensure you have these packages installed:
-
-         sudo apt-get install libgles2-mesa-dev libpulse-dev libavformat-dev \
-         libavresample-dev libasound2-dev libxrender-dev libxcomposite-dev
-
-  4. Ensure you have the standard C++ header files installed
-     (e.g. `libstdc++-4.8-dev`).
-  5. For now, we also require ruby:
-
-         sudo apt-get install ruby
-
-  6. Remove bison-3 and install bison-2.7. (NOTE: We plan on moving to bison-3
-     in the future.)
-
-         $ sudo apt-get remove bison
-         $ sudo apt-get install m4
-         $ wget http://ftp.gnu.org/gnu/bison/bison-2.7.1.tar.gz
-         $ tar zxf bison-2.7.1.tar.gz
-         $ cd bison-2.7.1
-         $ sh configure && make && sudo make install
-         $ which bison
-         /usr/local/bin/bison
-         $ bison --version
-         bison (GNU Bison) 2.7.12-4996
-
-  7. (From this directory) run GYP:
-
-         cobalt/build/gyp_cobalt -C debug linux-x64x11
-
-  8. Run Ninja:
-
-         ninja -C out/linux-x64x11_debug cobalt
-
-  9. Run Cobalt:
-
-         out/linux-x64x11_debug/cobalt [--url=<url>]
-
-      * If you want to connect to an `https` host that doesn't have a
-        certificate validatable by our set of root CAs, you must pass the
-        `--ignore_certificate_errors` flag to the Cobalt command-line.
-      * Cobalt requires that the HTML5 content be fetched over HTTPS and
-        enforces CSP when compiled in the "gold" configuration. However, if
-        CSP is served in other builds, Cobalt still respects it. Currently
-        Cobalt is at CSP level 2.
-      * When the HTML5 content is served with a special "h5vcc-location-src"
-        CSP directive, a navigation jail is enabled in Cobalt that cannot be
-        disabled via Cobalt options.
-      * See [`cobalt/browser/switches.cc`](cobalt/browser/switches.cc) for more
-        command-line options.
+  * [Linux](cobalt/site/docs/development/setup-linux.md)
+  * [Raspi](cobalt/site/docs/development/setup-raspi.md)
+  * [Android](cobalt/site/docs/development/setup-android.md)
 
 
 ## Build Types
@@ -253,12 +194,6 @@
 When building for release, you should always use a gold build for the final
 product.
 
-    $ cobalt/build/gyp_cobalt -C gold linux-x64x11
-    $ ninja -C out/linux-x64x11_gold cobalt
-    $ out/linux-x64x11_gold/cobalt
-
-
 ## Origin of this Repository
 
-This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git
-
+This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git
\ No newline at end of file
diff --git a/src/base/files/file_unittest.cc b/src/base/files/file_unittest.cc
index ac0813c..4dbf3ad 100644
--- a/src/base/files/file_unittest.cc
+++ b/src/base/files/file_unittest.cc
@@ -580,7 +580,16 @@
 
   const char kData[] = "this file is sparse.";
   const int kDataLen = sizeof(kData) - 1;
+#if defined(STARBOARD)
+#if SB_IS(32_BIT)
+  // Maximum off_t for lseek() on 32-bit builds is just below 2^31.
+  const int64_t kLargeFileOffset = (1LL << 31) - 2;
+#else  // SB_IS(32_BIT)
   const int64_t kLargeFileOffset = (1LL << 31);
+#endif  // SB_IS(32_BIT)
+#else  // defined(STARBOARD)
+  const int64_t kLargeFileOffset = (1LL << 31);
+#endif  // defined(STARBOARD)
 
   // If the file fails to write, it is probably we are running out of disk space
   // and the file system doesn't support sparse file.
diff --git a/src/build/build_config.h b/src/build/build_config.h
index 7506ad9..23e2665 100644
--- a/src/build/build_config.h
+++ b/src/build/build_config.h
@@ -10,8 +10,6 @@
 //    COMPILER_MSVC / COMPILER_GCC
 //  Processor:
 //    ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
-//    ARCH_CPU_PPC_FAMILY
-//    ARCH_CPU_MIPS / ARCH_CPU_MIPSEL / ARCH_CPU_MIPS_FAMILY
 //    ARCH_CPU_ARM / ARCH_CPU_ARMEL / ARCH_CPU_ARM_FAMILY
 //    ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
 //    ARCH_CPU_BIG_ENDIAN / ARCH_CPU_LITTLE_ENDIAN
@@ -151,11 +149,6 @@
 #define ARCH_CPU_LITTLE_ENDIAN 1
 #elif defined(__pnacl__)
 #define ARCH_CPU_32_BITS 1
-#elif defined(__MIPSEL__)
-#define ARCH_CPU_MIPS_FAMILY 1
-#define ARCH_CPU_MIPSEL 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
 #else
 #error Please add support for your architecture in build/build_config.h
 #endif
@@ -195,8 +188,6 @@
 #  endif
 #elif defined(__ARMEL__) && !defined(OS_IOS)
 #define WCHAR_T_IS_UNSIGNED 1
-#elif defined(__MIPSEL__)
-#define WCHAR_T_IS_UNSIGNED 0
 #endif
 
 // TODO: Worry about these defines if/when we need to support Android.
diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index 6d46b58..aadb628 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -86,6 +86,17 @@
    version from 2.6.2 to 2.10.2. For a full list of FreeType updates included in
    this change, visit www.freetype.org.
 
+ - **Added support for Lottie animations.**
+
+   Cobalt can now embed and play Lottie animations
+   (https://airbnb.design/lottie/), i.e. animations created in Adobe After
+   Effects and exported to JSON via the Bodymovin plugin. These animations
+   improve the user experience and can readily be incorporated into apps as if
+   they were static images. Cobalt implements a "lottie-player" custom element
+   with a playback API modeled after the Lottie Web Player
+   (https://lottiefiles.com/web-player). In order to support Lottie, Cobalt
+   updated its Skia port from m61 to m79.
+
 ## Version 20
 
  - **Support for QUIC and SPDY is now enabled.**
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 8ceff23..408f6ec 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -343,9 +343,9 @@
     // width. This calculates the height at 4:3 aspect ratio for smaller
     // viewport widths, and 16:9 for viewports 1280 pixels wide or larger.
     if (width >= 1280) {
-      return ViewportSize(width, 9 * width / 16, 0);
+      return ViewportSize(width, 9 * width / 16);
     }
-    return ViewportSize(width, 3 * width / 4, 0);
+    return ViewportSize(width, 3 * width / 4);
   }
 
   int height = 0;
@@ -358,13 +358,25 @@
     return ViewportSize(width, height);
   }
 
-  double screen_diagonal_inches = 0.0;
-  if (!base::StringToDouble(lengths[2], &screen_diagonal_inches)) {
-    DLOG(ERROR) << "Viewport " << switch_value
-                << " has invalid screen_diagonal_inches.";
-    return base::nullopt;
+  double screen_diagonal_inches = 0.0f;
+  if (lengths.size() >= 3) {
+    if (!base::StringToDouble(lengths[2], &screen_diagonal_inches)) {
+      DLOG(ERROR) << "Viewport " << switch_value
+                  << " has invalid screen_diagonal_inches.";
+      return base::nullopt;
+    }
   }
-  return ViewportSize(width, height,
+
+  double video_pixel_ratio = 1.0f;
+  if (lengths.size() >= 4) {
+    if (!base::StringToDouble(lengths[3], &video_pixel_ratio)) {
+      DLOG(ERROR) << "Viewport " << switch_value
+                  << " has invalid video_pixel_ratio.";
+      return base::nullopt;
+    }
+  }
+
+  return ViewportSize(width, height, static_cast<float>(video_pixel_ratio),
                       static_cast<float>(screen_diagonal_inches));
 }
 
@@ -1190,8 +1202,14 @@
   float diagonal = 0.0f;  // Special value meaning diagonal size is not known.
 #endif
 
-  cssom::ViewportSize viewport_size(size.width, size.height, diagonal);
-  browser_module_->OnWindowSizeChanged(viewport_size, size.video_pixel_ratio);
+  // A value of 0.0 for the video pixel ratio means that the ratio could not be
+  // determined. In that case it should be assumed to be the same as the
+  // graphics resolution, which corresponds to a device pixel ratio of 1.0.
+  float device_pixel_ratio =
+      (size.video_pixel_ratio == 0) ? 1.0f : size.video_pixel_ratio;
+  cssom::ViewportSize viewport_size(size.width, size.height, diagonal,
+                                    device_pixel_ratio);
+  browser_module_->OnWindowSizeChanged(viewport_size);
 }
 #endif  // SB_API_VERSION >= 8
 
diff --git a/src/cobalt/browser/browser.gyp b/src/cobalt/browser/browser.gyp
index 92009cb..dc3fb4d 100644
--- a/src/cobalt/browser/browser.gyp
+++ b/src/cobalt/browser/browser.gyp
@@ -124,7 +124,6 @@
         '<(DEPTH)/cobalt/media_session/media_session.gyp:media_session',
         '<(DEPTH)/cobalt/network/network.gyp:network',
         '<(DEPTH)/cobalt/overlay_info/overlay_info.gyp:overlay_info',
-        '<(DEPTH)/cobalt/page_visibility/page_visibility.gyp:page_visibility',
         '<(DEPTH)/cobalt/renderer/renderer.gyp:renderer',
         '<(DEPTH)/cobalt/renderer/test/png_utils/png_utils.gyp:png_utils',
         '<(DEPTH)/cobalt/script/engine.gyp:engine',
diff --git a/src/cobalt/browser/browser_bindings_gen.gyp b/src/cobalt/browser/browser_bindings_gen.gyp
index 2d9c0f1..017ecb3 100644
--- a/src/cobalt/browser/browser_bindings_gen.gyp
+++ b/src/cobalt/browser/browser_bindings_gen.gyp
@@ -114,6 +114,7 @@
         '../dom/intersection_observer_entry.idl',
         '../dom/keyboard_event.idl',
         '../dom/location.idl',
+        '../dom/lottie_frame_custom_event.idl',
         '../dom/lottie_player.idl',
         '../dom/media_error.idl',
         '../dom/media_query_list.idl',
@@ -178,6 +179,7 @@
         '../h5vcc/h5vcc_settings.idl',
         '../h5vcc/h5vcc_sso.idl',
         '../h5vcc/h5vcc_storage.idl',
+        '../h5vcc/h5vcc_screen.idl',
         '../h5vcc/h5vcc_system.idl',
         '../h5vcc/h5vcc_trace_event.idl',
         '../h5vcc/h5vcc_updater.idl',
@@ -265,6 +267,7 @@
         '../dom/intersection_observer_entry_init.idl',
         '../dom/intersection_observer_init.idl',
         '../dom/keyboard_event_init.idl',
+        '../dom/lottie_frame_custom_event_detail.idl',
         '../dom/media_source_end_of_stream_error.idl',
         '../dom/media_source_ready_state.idl',
         '../dom/mouse_event_init.idl',
@@ -273,7 +276,9 @@
         '../dom/source_buffer_append_mode.idl',
         '../dom/track_default_type.idl',
         '../dom/ui_event_init.idl',
+        '../dom/visibility_state.idl',
         '../dom/wheel_event_init.idl',
+        '../h5vcc/h5vcc_crash_type.idl',
         '../media_capture/blob_event_init.idl',
         '../media_capture/media_device_kind.idl',
         '../media_capture/media_recorder_options.idl',
@@ -286,7 +291,6 @@
         '../media_session/media_session_playback_state.idl',
         '../media_stream/media_stream_constraints.idl',
         '../media_stream/media_track_settings.idl',
-        '../page_visibility/visibility_state.idl',
         '../speech/speech_recognition_error_code.idl',
         '../speech/speech_synthesis_error_code.idl',
         '../subtlecrypto/aes_ctr_params.idl',
@@ -314,6 +318,7 @@
         '../dom/document_cobalt.idl',
         '../dom/document_cssom.idl',
         '../dom/document_html5.idl',
+        '../dom/document_page_visibility.idl',
         '../dom/element_css_inline_style.idl',
         '../dom/element_cssom_view.idl',
         '../dom/element_dom_parsing_and_serialization.idl',
@@ -347,7 +352,6 @@
         '../dom/window_timers.idl',
         '../media_capture/navigator.idl',
         '../media_session/navigator_media_session.idl',
-        '../page_visibility/document.idl',
     ],
 
     'conditions': [
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 54e0395..0c285df 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -606,11 +606,6 @@
     options.camera_3d = input_device_manager_->camera_3d();
   }
 
-  float video_pixel_ratio = 1.0f;
-  if (system_window_) {
-    video_pixel_ratio = system_window_->GetVideoPixelRatio();
-  }
-
   // Make sure that automem has been run before creating the WebModule, so that
   // we use properly configured options for all parameters.
   DCHECK(auto_mem_);
@@ -642,8 +637,8 @@
       base::Bind(&BrowserModule::OnWindowClose, base::Unretained(this)),
       base::Bind(&BrowserModule::OnWindowMinimize, base::Unretained(this)),
       can_play_type_handler_.get(), media_module_.get(), network_module_,
-      viewport_size, video_pixel_ratio, GetResourceProvider(),
-      kLayoutMaxRefreshFrequencyInHz, options));
+      viewport_size, GetResourceProvider(), kLayoutMaxRefreshFrequencyInHz,
+      options));
   lifecycle_observers_.AddObserver(web_module_.get());
   if (!web_module_recreated_callback_.is_null()) {
     web_module_recreated_callback_.Run();
@@ -943,18 +938,17 @@
 }
 
 #if SB_API_VERSION >= 8
-void BrowserModule::OnWindowSizeChanged(const ViewportSize& viewport_size,
-                                        float video_pixel_ratio) {
+void BrowserModule::OnWindowSizeChanged(const ViewportSize& viewport_size) {
   if (web_module_) {
-    web_module_->SetSize(viewport_size, video_pixel_ratio);
+    web_module_->SetSize(viewport_size);
   }
 #if defined(ENABLE_DEBUGGER)
   if (debug_console_) {
-    debug_console_->web_module().SetSize(viewport_size, video_pixel_ratio);
+    debug_console_->web_module().SetSize(viewport_size);
   }
 #endif  // defined(ENABLE_DEBUGGER)
   if (splash_screen_) {
-    splash_screen_->web_module().SetSize(viewport_size, video_pixel_ratio);
+    splash_screen_->web_module().SetSize(viewport_size);
   }
 
   return;
@@ -1691,19 +1685,18 @@
 
 void BrowserModule::UpdateScreenSize() {
   ViewportSize size = GetViewportSize();
-  float video_pixel_ratio = system_window_->GetVideoPixelRatio();
 #if defined(ENABLE_DEBUGGER)
   if (debug_console_) {
-    debug_console_->SetSize(size, video_pixel_ratio);
+    debug_console_->SetSize(size);
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
   if (splash_screen_) {
-    splash_screen_->SetSize(size, video_pixel_ratio);
+    splash_screen_->SetSize(size);
   }
 
   if (web_module_) {
-    web_module_->SetSize(size, video_pixel_ratio);
+    web_module_->SetSize(size);
   }
 
   if (qr_code_overlay_) {
@@ -1794,8 +1787,11 @@
     math::Size target_size = renderer_module_->render_target_size();
     // ...but get the diagonal from one of the other modules.
     float diagonal_inches = 0;
+    float device_pixel_ratio = 1.0f;
     if (system_window_) {
       diagonal_inches = system_window_->GetDiagonalSizeInches();
+      device_pixel_ratio = system_window_->GetDevicePixelRatio();
+
       // For those platforms that can have a main window size smaller than the
       // render target size, the system_window_ size (if exists) should be
       // trusted over the renderer_module_ render target size.
@@ -1806,9 +1802,12 @@
       }
     } else if (options_.requested_viewport_size) {
       diagonal_inches = options_.requested_viewport_size->diagonal_inches();
+      device_pixel_ratio =
+          options_.requested_viewport_size->device_pixel_ratio();
     }
 
-    ViewportSize v(target_size.width(), target_size.height(), diagonal_inches);
+    ViewportSize v(target_size.width(), target_size.height(), diagonal_inches,
+                   device_pixel_ratio);
     return v;
   }
 
@@ -1816,7 +1815,8 @@
   if (system_window_) {
     math::Size size = system_window_->GetWindowSize();
     ViewportSize v(size.width(), size.height(),
-                   system_window_->GetDiagonalSizeInches());
+                   system_window_->GetDiagonalSizeInches(),
+                   system_window_->GetDevicePixelRatio());
     return v;
   }
 
@@ -1830,7 +1830,7 @@
 
   // No window and no viewport size was requested, so we return a conservative
   // default.
-  ViewportSize view_size(1280, 720, 0);
+  ViewportSize view_size(1280, 720);
   return view_size;
 }
 
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index e439415..ee6dabd 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -192,8 +192,7 @@
 
 #if SB_API_VERSION >= 8
   // Called when a kSbEventTypeWindowSizeChange event is fired.
-  void OnWindowSizeChanged(const cssom::ViewportSize& viewport_size,
-                           float video_pixel_ratio);
+  void OnWindowSizeChanged(const cssom::ViewportSize& viewport_size);
 #endif  // SB_API_VERSION >= 8
 
 #if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/src/cobalt/browser/debug_console.cc b/src/cobalt/browser/debug_console.cc
index 2657b27..0503509 100644
--- a/src/cobalt/browser/debug_console.cc
+++ b/src/cobalt/browser/debug_console.cc
@@ -141,8 +141,8 @@
       WebModule::CloseCallback(), /* window_close_callback */
       base::Closure(),            /* window_minimize_callback */
       NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
-      network_module, window_dimensions, 1.f /*video_pixel_ratio*/,
-      resource_provider, layout_refresh_rate, web_module_options));
+      network_module, window_dimensions, resource_provider, layout_refresh_rate,
+      web_module_options));
 }
 
 DebugConsole::~DebugConsole() {}
diff --git a/src/cobalt/browser/debug_console.h b/src/cobalt/browser/debug_console.h
index 93f53a0..adb5d34 100644
--- a/src/cobalt/browser/debug_console.h
+++ b/src/cobalt/browser/debug_console.h
@@ -89,9 +89,8 @@
     return (GetMode() != debug::console::kDebugConsoleModeOff);
   }
 
-  void SetSize(const cssom::ViewportSize& window_dimensions,
-               float video_pixel_ratio) {
-    web_module_->SetSize(window_dimensions, video_pixel_ratio);
+  void SetSize(const cssom::ViewportSize& viewport_size) {
+    web_module_->SetSize(viewport_size);
   }
 
   // LifecycleObserver implementation.
diff --git a/src/cobalt/browser/splash_screen.cc b/src/cobalt/browser/splash_screen.cc
index a380247..962142f 100644
--- a/src/cobalt/browser/splash_screen.cc
+++ b/src/cobalt/browser/splash_screen.cc
@@ -105,8 +105,8 @@
       base::Bind(&OnError), on_window_close,
       base::Closure(),  // window_minimize_callback
       NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
-      network_module, window_dimensions, 1.f /*video_pixel_ratio*/,
-      resource_provider, layout_refresh_rate, web_module_options));
+      network_module, window_dimensions, resource_provider, layout_refresh_rate,
+      web_module_options));
 }
 
 SplashScreen::~SplashScreen() {
diff --git a/src/cobalt/browser/splash_screen.h b/src/cobalt/browser/splash_screen.h
index 6a98c9d..853c584 100644
--- a/src/cobalt/browser/splash_screen.h
+++ b/src/cobalt/browser/splash_screen.h
@@ -48,9 +48,8 @@
                    on_splash_screen_shutdown_complete);
   ~SplashScreen();
 
-  void SetSize(const cssom::ViewportSize& window_dimensions,
-               float video_pixel_ratio) {
-    web_module_->SetSize(window_dimensions, video_pixel_ratio);
+  void SetSize(const cssom::ViewportSize& viewport_size) {
+    web_module_->SetSize(viewport_size);
   }
 
   // LifecycleObserver implementation.
diff --git a/src/cobalt/browser/user_agent_string.cc b/src/cobalt/browser/user_agent_string.cc
index 45869c4..2240e74 100644
--- a/src/cobalt/browser/user_agent_string.cc
+++ b/src/cobalt/browser/user_agent_string.cc
@@ -118,8 +118,12 @@
   // Fill platform info if it is a hardware TV device.
   SbSystemDeviceType device_type = SbSystemGetDeviceType();
 
+#if SB_API_VERSION >= 12
+  // System Integrator
+  result = SbSystemGetProperty(kSbSystemPropertySystemIntegratorName, value,
+                               kSystemPropertyMaxLength);
+#elif SB_API_VERSION == 11
   // Original Design Manufacturer (ODM)
-#if SB_API_VERSION >= 11
   result = SbSystemGetProperty(kSbSystemPropertyOriginalDesignManufacturerName,
                                value, kSystemPropertyMaxLength);
 #else
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 6446317..0630d7c 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -56,6 +56,7 @@
 #include "cobalt/dom/storage.h"
 #include "cobalt/dom/ui_event.h"
 #include "cobalt/dom/url.h"
+#include "cobalt/dom/visibility_state.h"
 #include "cobalt/dom/wheel_event.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/dom_parser/parser.h"
@@ -63,7 +64,6 @@
 #include "cobalt/loader/image/animated_image_tracker.h"
 #include "cobalt/loader/switches.h"
 #include "cobalt/media_session/media_session_client.h"
-#include "cobalt/page_visibility/visibility_state.h"
 #include "cobalt/script/error_report.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/storage/storage_manager.h"
@@ -213,7 +213,7 @@
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
-  void SetSize(cssom::ViewportSize window_dimensions, float video_pixel_ratio);
+  void SetSize(cssom::ViewportSize viewport_size);
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
   void SetWebMediaPlayerFactory(
       media::WebMediaPlayerFactory* web_media_player_factory);
@@ -633,9 +633,9 @@
 
   window_ = new dom::Window(
       environment_settings_.get(), data.window_dimensions,
-      data.video_pixel_ratio, data.initial_application_state, css_parser_.get(),
-      dom_parser_.get(), fetcher_factory_.get(), loader_factory_.get(),
-      &resource_provider_, animated_image_tracker_.get(), image_cache_.get(),
+      data.initial_application_state, css_parser_.get(), dom_parser_.get(),
+      fetcher_factory_.get(), loader_factory_.get(), &resource_provider_,
+      animated_image_tracker_.get(), image_cache_.get(),
       reduced_image_cache_capacity_manager_.get(), remote_typeface_cache_.get(),
       mesh_cache_.get(), local_storage_database_.get(),
       data.can_play_type_handler, data.web_media_player_factory,
@@ -1058,14 +1058,8 @@
   remote_typeface_cache_->SetCapacity(static_cast<uint32>(bytes));
 }
 
-void WebModule::Impl::SetSize(cssom::ViewportSize window_dimensions,
-                              float video_pixel_ratio) {
-  // A value of 0.0 for the video pixel ratio means that the ratio could not be
-  // determined. In that case it should be assumed to be the same as the
-  // graphics resolution, which corresponds to a device pixel ratio of 1.0.
-  float device_pixel_ratio =
-      video_pixel_ratio == 0.0f ? 1.0f : video_pixel_ratio;
-  window_->SetSize(window_dimensions, device_pixel_ratio);
+void WebModule::Impl::SetSize(cssom::ViewportSize viewport_size) {
+  window_->SetSize(viewport_size);
 }
 
 void WebModule::Impl::SetCamera3D(
@@ -1314,7 +1308,7 @@
     media::CanPlayTypeHandler* can_play_type_handler,
     media::WebMediaPlayerFactory* web_media_player_factory,
     network::NetworkModule* network_module,
-    const ViewportSize& window_dimensions, float video_pixel_ratio,
+    const ViewportSize& window_dimensions,
     render_tree::ResourceProvider* resource_provider, float layout_refresh_rate,
     const Options& options)
     : thread_(options.name.c_str()),
@@ -1326,8 +1320,8 @@
       initial_url, initial_application_state, render_tree_produced_callback,
       error_callback, window_close_callback, window_minimize_callback,
       can_play_type_handler, web_media_player_factory, network_module,
-      window_dimensions, video_pixel_ratio, resource_provider,
-      kDOMMaxElementDepth, layout_refresh_rate, ui_nav_root_, options);
+      window_dimensions, resource_provider, kDOMMaxElementDepth,
+      layout_refresh_rate, ui_nav_root_, options);
 
   // Start the dedicated thread and create the internal implementation
   // object on that thread.
@@ -1575,12 +1569,10 @@
 }
 #endif  // defined(ENABLE_DEBUGGER)
 
-void WebModule::SetSize(const ViewportSize& viewport_size,
-                        float video_pixel_ratio) {
+void WebModule::SetSize(const ViewportSize& viewport_size) {
   message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::SetSize, base::Unretained(impl_.get()),
-                 viewport_size, video_pixel_ratio));
+      FROM_HERE, base::Bind(&WebModule::Impl::SetSize,
+                            base::Unretained(impl_.get()), viewport_size));
 }
 
 void WebModule::SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d) {
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 8ad8dc2..4e659f0 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -290,7 +290,6 @@
             media::WebMediaPlayerFactory* web_media_player_factory,
             network::NetworkModule* network_module,
             const cssom::ViewportSize& window_dimensions,
-            float video_pixel_ratio,
             render_tree::ResourceProvider* resource_provider,
             float layout_refresh_rate, const Options& options);
   ~WebModule();
@@ -361,11 +360,10 @@
   std::unique_ptr<debug::backend::DebuggerState> FreezeDebugger();
 #endif  // ENABLE_DEBUGGER
 
-  // Sets the size and pixel ratio of this web module, possibly causing relayout
-  // and re-render with the new parameters. Does nothing if the parameters are
-  // not different from the current parameters.
-  void SetSize(const cssom::ViewportSize& view_port_size,
-               float video_pixel_ratio);
+  // Sets the size of this web module, possibly causing relayout and re-render
+  // with the new parameters. Does nothing if the parameters are not different
+  // from the current parameters.
+  void SetSize(const cssom::ViewportSize& viewport_size);
 
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
   void SetWebMediaPlayerFactory(
@@ -413,7 +411,7 @@
         media::CanPlayTypeHandler* can_play_type_handler,
         media::WebMediaPlayerFactory* web_media_player_factory,
         network::NetworkModule* network_module,
-        const cssom::ViewportSize& window_dimensions, float video_pixel_ratio,
+        const cssom::ViewportSize& window_dimensions,
         render_tree::ResourceProvider* resource_provider,
         int dom_max_element_depth, float layout_refresh_rate,
         const scoped_refptr<ui_navigation::NavItem>& ui_nav_root,
@@ -428,7 +426,6 @@
           web_media_player_factory(web_media_player_factory),
           network_module(network_module),
           window_dimensions(window_dimensions),
-          video_pixel_ratio(video_pixel_ratio),
           resource_provider(resource_provider),
           dom_max_element_depth(dom_max_element_depth),
           layout_refresh_rate(layout_refresh_rate),
@@ -445,7 +442,6 @@
     media::WebMediaPlayerFactory* web_media_player_factory;
     network::NetworkModule* network_module;
     cssom::ViewportSize window_dimensions;
-    float video_pixel_ratio;
     render_tree::ResourceProvider* resource_provider;
     int dom_max_element_depth;
     float layout_refresh_rate;
diff --git a/src/cobalt/build/all.gyp b/src/cobalt/build/all.gyp
index d73ca7d..9131a86 100644
--- a/src/cobalt/build/all.gyp
+++ b/src/cobalt/build/all.gyp
@@ -65,7 +65,6 @@
         '<(DEPTH)/cobalt/media_stream/media_stream_test.gyp:*',
         '<(DEPTH)/cobalt/network/network.gyp:*',
         '<(DEPTH)/cobalt/overlay_info/overlay_info.gyp:*',
-        '<(DEPTH)/cobalt/page_visibility/page_visibility.gyp:*',
         '<(DEPTH)/cobalt/render_tree/render_tree.gyp:*',
         '<(DEPTH)/cobalt/renderer/renderer.gyp:*',
         '<(DEPTH)/cobalt/renderer/sandbox/sandbox.gyp:*',
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 5741ef3..ed5660c 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-267865
\ No newline at end of file
+270962
\ No newline at end of file
diff --git a/src/cobalt/build/cobalt_configuration.gypi b/src/cobalt/build/cobalt_configuration.gypi
index b58645d..33e8adb 100644
--- a/src/cobalt/build/cobalt_configuration.gypi
+++ b/src/cobalt/build/cobalt_configuration.gypi
@@ -218,7 +218,7 @@
     'enable_account_manager%': 0,
 
     # Set to 1 to enable H5vccCrashLog.
-    'enable_crash_log%': 0,
+    'enable_crash_log%': 1,
 
     # Set to 1 to enable H5vccSSO (Single Sign On).
     'enable_sso%': 0,
diff --git a/src/cobalt/build/cobalt_configuration.py b/src/cobalt/build/cobalt_configuration.py
index 691c283..4e8d6bc 100644
--- a/src/cobalt/build/cobalt_configuration.py
+++ b/src/cobalt/build/cobalt_configuration.py
@@ -144,7 +144,6 @@
         'nb_test',
         'net_unittests',
         'network_test',
-        'page_visibility_test',
         'poem_unittests',
         'render_tree_test',
         'renderer_test',
diff --git a/src/cobalt/content/ssl/certs/157753a5.0 b/src/cobalt/content/ssl/certs/157753a5.0
deleted file mode 100644
index 20585f1..0000000
--- a/src/cobalt/content/ssl/certs/157753a5.0
+++ /dev/null
@@ -1,25 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
diff --git a/src/cobalt/cssom/media_feature.cc b/src/cobalt/cssom/media_feature.cc
index 840ee74..ec31b15 100644
--- a/src/cobalt/cssom/media_feature.cc
+++ b/src/cobalt/cssom/media_feature.cc
@@ -55,12 +55,6 @@
 //   https://www.w3.org/TR/css3-mediaqueries/#grid
 static const int kGridMediaFeatureValue = 0;
 
-// The 'resolution' media feature describes the resolution of the output device,
-// i.e. the density of the pixels.
-//   https://www.w3.org/TR/css3-mediaqueries/#resolution
-// We calculate the pixel density from the length of the screen diagonal.
-static const float kScreenDefaultDiagonalInInches = 55.0f;
-
 // The 'scan' media feature describes the scanning process of "tv" output
 // devices.
 //   https://www.w3.org/TR/css3-mediaqueries/#scan
@@ -170,16 +164,7 @@
 bool MediaFeature::CompareResolution(const cssom::ViewportSize& viewport_size) {
   ResolutionValue* specified_value =
       base::polymorphic_downcast<ResolutionValue*>(value_.get());
-
-  float diagonal_pixels = sqrtf(
-      static_cast<float>(viewport_size.width() * viewport_size.width() +
-                         viewport_size.height() * viewport_size.height()));
-
-  float viewport_diagonal = viewport_size.diagonal_inches() > 0
-                                ? viewport_size.diagonal_inches()
-                                : kScreenDefaultDiagonalInInches;
-
-  float media_dpi = diagonal_pixels / viewport_diagonal;
+  float media_dpi = viewport_size.device_pixel_ratio() * 96;
 
   switch (operator_) {
     case kNonZero:
diff --git a/src/cobalt/cssom/media_feature_test.cc b/src/cobalt/cssom/media_feature_test.cc
index 03b9865..91b0b7c 100644
--- a/src/cobalt/cssom/media_feature_test.cc
+++ b/src/cobalt/cssom/media_feature_test.cc
@@ -601,16 +601,27 @@
       new MediaFeature(kResolutionMediaFeature));
   media_feature->set_operator(kNonZero);
 
-  EXPECT_FALSE(media_feature->EvaluateConditionValue(ViewportSize(0, 0)));
+  EXPECT_FALSE(media_feature->EvaluateConditionValue(
+      ViewportSize(1920, 1080, 55, 0.0f)));
 }
 
-TEST(MediaFeatureTest, ResolutionEqualsShouldEvaluateTrue) {
-  scoped_refptr<ResolutionValue> property(new ResolutionValue(100, kDPIUnit));
+TEST(MediaFeatureTest, ResolutionEqualsDefaultShouldEvaluateTrue) {
+  scoped_refptr<ResolutionValue> property(new ResolutionValue(96, kDPIUnit));
   scoped_refptr<MediaFeature> media_feature(
       new MediaFeature(kResolutionMediaFeature, property));
   media_feature->set_operator(kEquals);
 
-  EXPECT_TRUE(media_feature->EvaluateConditionValue(ViewportSize(5500, 0)));
+  EXPECT_TRUE(media_feature->EvaluateConditionValue(ViewportSize(1920, 1080)));
+}
+
+TEST(MediaFeatureTest, ResolutionEqualsHiDPIShouldEvaluateTrue) {
+  scoped_refptr<ResolutionValue> property(new ResolutionValue(192, kDPIUnit));
+  scoped_refptr<MediaFeature> media_feature(
+      new MediaFeature(kResolutionMediaFeature, property));
+  media_feature->set_operator(kEquals);
+
+  EXPECT_TRUE(media_feature->EvaluateConditionValue(
+      ViewportSize(1920, 1080, 55, 2.0f)));
 }
 
 TEST(MediaFeatureTest, ResolutionEqualsShouldEvaluateFalse) {
diff --git a/src/cobalt/cssom/viewport_size.h b/src/cobalt/cssom/viewport_size.h
index 656f69f..6efe128 100644
--- a/src/cobalt/cssom/viewport_size.h
+++ b/src/cobalt/cssom/viewport_size.h
@@ -28,21 +28,33 @@
   ViewportSize() = default;
   ViewportSize(const ViewportSize& other) = default;
   ViewportSize(int w, int h) : width_height_(w, h) {}
-  ViewportSize(int w, int h, float diag)
-      : width_height_(w, h), diagonal_inches_(diag) {}
+  ViewportSize(int w, int h, float diagonal_inches, float device_pixel_ratio)
+      : width_height_(w, h),
+        diagonal_inches_(diagonal_inches),
+        device_pixel_ratio_(device_pixel_ratio) {}
   int height() const { return width_height_.height(); }
   int width() const { return width_height_.width(); }
+  float device_pixel_ratio() const { return device_pixel_ratio_; }
   float diagonal_inches() const { return diagonal_inches_; }
   cobalt::math::Size width_height() const { return width_height_; }
   bool operator==(const ViewportSize& s) const {
     return width_height_ == s.width_height_ &&
-           diagonal_inches_ == s.diagonal_inches_;
+           diagonal_inches_ == s.diagonal_inches_ &&
+           device_pixel_ratio_ == s.device_pixel_ratio_;
   }
   bool operator!=(const ViewportSize& s) const { return !(*this == s); }
 
  private:
   cobalt::math::Size width_height_;
-  float diagonal_inches_ = 0;  // Note that 0 means "use a default".
+
+  // Size of the diagonal between two opposing screen corners in inches.
+  // A value of 0 means the size of the display is not known.
+  float diagonal_inches_ = 0;
+
+  // Ratio of CSS pixels per device pixel, matching the devicePixelRatio
+  // attribute.
+  //   https://www.w3.org/TR/2013/WD-cssom-view-20131217/#dom-window-devicepixelratio
+  float device_pixel_ratio_ = 1.0f;
 };
 
 }  // namespace cssom
diff --git a/src/cobalt/demos/content/crash-demo/crash-demo.html b/src/cobalt/demos/content/crash-demo/crash-demo.html
new file mode 100644
index 0000000..5ea1ebf
--- /dev/null
+++ b/src/cobalt/demos/content/crash-demo/crash-demo.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <style>
+    body {
+      background-color: rgb(255, 255, 255);
+      font-family: Roboto;
+      font-size: 2em;
+    }
+
+    .highlight {
+      background-color: rgb(0, 255, 0);
+    }
+  </style>
+</head>
+
+<body>
+  <div>Previous exit status: <span id="status"></span></div>
+  <div id="menu"></div>
+  <script type="text/javascript">
+    const crash_types = {
+      out_of_memory: 'Out of memory',
+      null_dereference: 'Null dereference',
+      illegal_instruction: 'Illegal instruction',
+      debugger: 'Invoke debugger',
+      quit: 'Quit the demo'
+    }
+
+    const kIsDirty = "_exit_is_dirty";
+    const kDirtyValue = "1"
+
+    function log(str) {
+      console.log(str);
+    }
+    window.onunload = function () {
+      log("==Onunload called==");
+      localStorage.removeItem(kIsDirty);
+    }
+    window.onload = function () {
+      log("==Onload called==");
+      var menu = document.getElementById('menu');
+      for (key in crash_types) {
+        console.log("key" + key);
+        var el = document.createElement('div');
+        el.id = key;
+        el.textContent = crash_types[key];
+        menu.appendChild(el);
+      }
+      clean_exit = localStorage.getItem(kIsDirty) == kDirtyValue ? "crashed" : "clean";
+      localStorage.setItem(kIsDirty, kDirtyValue)
+
+      var menu = document.getElementById('menu').children;
+      var index = 0;
+
+      document.getElementById("status").textContent += clean_exit;
+
+      function refresh() {
+        log("Refresh");
+        var textBox = document.getElementById('textBox');
+        for (let i = 0; i < menu.length; i++) {
+          if (i == index) {
+            menu[i].classList.add('highlight');
+          } else {
+            menu[i].classList.remove('highlight');
+          }
+        }
+      }
+      document.addEventListener('keydown', function (e) {
+        if ([37, 38, 32782, 32780].includes(e.keyCode)) { // left, up, android left, up
+          index -= 1;
+        } else if ([39, 40, 32781, 32783].includes(e.keyCode)) { //right, down, android right, down
+          index += 1;
+        } else if ([13, 32768].includes(e.keyCode)) { // enter, android enter
+          var crashType = menu[index].id;
+          if (crashType === "quit") {
+            log("Calling window.close()");
+            window.close()
+            return;
+          }
+          if ('h5vcc' in window) {
+            log("Crashing with " + crashType);
+            h5vcc.crashLog.triggerCrash(crashType);
+          } else {
+            log("No h5vcc, will not crash " + crashType);
+          }
+        }
+        index = (index + menu.length) % menu.length;
+        refresh();
+      });
+      refresh();
+    }
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/cobalt/demos/content/media-query/media-query-test.html b/src/cobalt/demos/content/media-query/media-query-test.html
index 7534b08..1f9e385 100644
--- a/src/cobalt/demos/content/media-query/media-query-test.html
+++ b/src/cobalt/demos/content/media-query/media-query-test.html
@@ -1,47 +1,60 @@
 <!DOCTYPE html>
 <html>
 <head>
-  <script type="text/javascript">
+  <script type='text/javascript'>
     // Demonstrates how media query can be used to get the value of the
-    // window resolution.
-    function PrintWindowWidth() {
-      for (var i = 0; i < 16000; ++i) {
-        query_str = "(max-width: " + i + "px)"
-        if (window.matchMedia(query_str).matches) {
-          console.log("Found window width: " + query_str);
-          return;
-        }
-      }
-      console.log("Error: Could not find window width.");
+    // window resolution, width, and height.
+
+    function log_info(message) {
+      console.log(message);
+      document.getElementById('info').innerHTML += message + '.\n';
+    }
+    function log_error(message) {
+      console.log('Error: ' + message);
+      document.getElementById('error').innerHTML += message + '.\n';
     }
 
-    function PrintWindowHeight() {
-      for (var i = 0; i < 16000; ++i) {
-        query_str = "(max-height: " + i + "px)";
+    function search(low, high, query, units) {
+      var precision = 1/32;
+      while (low < high - precision) {
+        var mid = Math.floor((low + high) / 2 / precision) * precision;
+        query_str = '(max-' + query + ':' + mid + units + ')'
         if (window.matchMedia(query_str).matches) {
-          console.log("Found window height: " + query_str);
-          return;
+          // The window value is less than or equal to result.
+          high = mid;
+        } else {
+          // The window value is greater than result.
+          low = mid;
         }
       }
-      console.log("Error: Could not find window height.");
+      return high;
+    }
+
+    function PrintWindowSize() {
+      var width = search(0, 16000, 'width', 'px');
+      var height = search(0, 16000, 'height', 'px');
+      log_info('media size: ' + width + 'x' + height);
+      if (Math.abs(width - window.innerWidth) >= 1) {
+        log_error('width does not match window.innerWidth');
+      }
+      if (Math.abs(height - window.innerHeight) >= 1) {
+        log_error('height does not match window.innerHeight');
+      }
     }
 
     function PrintDpi() {
-      for (var i = 1; i < 16000; ++i) {
-        query_str = "(max-resolution:" + i + "dpi)"
-        if (window.matchMedia(query_str).matches) {
-          console.log("Found dpi: " + query_str);
-          return;
-        }
+      var dpi = search(0, 16000, 'resolution', 'dpi');
+      log_info('resolution dpi: ' + dpi +
+               ', window.devicePixelRatio: ' + window.devicePixelRatio);
+      if (Math.abs(dpi - 96 * window.devicePixelRatio) > 1) {
+        log_error('resolution does not match devicePixelRatio');
       }
-      console.log("Error: Could not find window dpi.");
     }
 
 
     function intervalCallback() {
       PrintDpi();
-      PrintWindowHeight();
-      PrintWindowWidth();
+      PrintWindowSize();
     }
 
     window.setInterval(intervalCallback, 500);
@@ -49,5 +62,7 @@
 </head>
 
 <body>
+  <span id='error' style='white-space: pre; background-color:#FF0000'></span>
+  <span id='info' style='white-space: pre; background-color:#00FF00'></span>
 </body>
 </html>
diff --git a/src/cobalt/demos/content/screen_diagonal/screen_diagonal.html b/src/cobalt/demos/content/screen_diagonal/screen_diagonal.html
new file mode 100644
index 0000000..489be33
--- /dev/null
+++ b/src/cobalt/demos/content/screen_diagonal/screen_diagonal.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <script type="text/javascript">
+    // Demonstrates how to get the size of the screen diagonal.
+
+    function log_info(message) {
+      console.log(message);
+      document.getElementById('info').innerHTML += message + '.\n';
+    }
+    function log_error(message) {
+      console.log('Error: ' + message);
+      document.getElementById('error').innerHTML += message + '.\n';
+    }
+
+    function PrintScreenDiagonal() {
+      if (window.H5vccScreen && window.H5vccScreen.GetDiagonal) {
+        log_info("Screen Diagonal: " + H5vccScreen.GetDiagonal() + " inches.");
+      } else {
+        log_error("Screen Diagonal not available");
+      }
+    }
+
+
+    window.setInterval(PrintScreenDiagonal, 500);
+  </script>
+</head>
+
+<body>
+  <span id='error' style='white-space: pre; background-color:#FF0000'></span>
+  <span id='info' style='white-space: pre; background-color:#00FF00'></span>
+</body>
+</html>
diff --git a/src/cobalt/doc/performance_tuning.md b/src/cobalt/doc/performance_tuning.md
index 62a4af5..6e1f12a 100644
--- a/src/cobalt/doc/performance_tuning.md
+++ b/src/cobalt/doc/performance_tuning.md
@@ -200,14 +200,10 @@
 
 Some platforms require that the display buffer is swapped frequently, and
 so in these cases Cobalt will render the scene every frame, even if it is
-not changing, which consumes CPU resources.  This behavior is defined by the
-value of `SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER` in your platform's
-`configuration_public.h` file.  Unless your platform is restricted in this
-aspect, you should ensure that `SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER`
-is set to `0`.  If the platform needs a new frame submitted periodically,
-an alternative to setting `SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER` to `1`
-is to implement the Cobalt Extension "dev.cobalt.extension.Graphics" and
-report the maximum frame interval via `GetMaximumFrameIntervalInMilliseconds`.
+not changing, which consumes CPU resources.  If the platform needs a new frame
+submitted periodically implement the Cobalt Extension
+"dev.cobalt.extension.Graphics" and report the maximum frame interval via
+`GetMaximumFrameIntervalInMilliseconds`.
 
 See `SbSystemGetExtension` and
 [`CobaltExtensionGraphicsApi`](../extension/graphics.h).
@@ -252,7 +248,7 @@
 processed (e.g. in response to a key press) before images are decoded.  Thus
 having support for priorities can improve the overall performance of the
 application.  To enable thread priority support, you should set the value
-of `SB_HAS_THREAD_PRIORITY_SUPPORT` to `1` in your `configuration_public.h`
+of `kSbHasThreadPrioritySupport` to `true` in your `configuration_constants.h`
 file, and then also ensure that your platform's implementation of
 `SbThreadCreate()` properly forwards the priority parameter down to the
 platform.
@@ -297,15 +293,6 @@
 **Tags:** *framerate, startup, browse-to-watch, input latency*
 
 
-#### The GCC '-mplt' flag for MIPS architectures
-The '-mplt' flag has been found to improve all around performance by
-~20% on MIPS architecture platforms.  If your platform has a MIPS
-architecture, it is suggested that you enable this flag in gold builds.
-
-**Tags:** *gyp_configuration.gypi, framerate, startup, browse-to-watch,
-           input latency.*
-
-
 ### Close "Stats for Nerds" when measuring performance
 
 The YouTube web app offers a feature called "Stats for Nerds" that enables
diff --git a/src/cobalt/dom/custom_event_test.cc b/src/cobalt/dom/custom_event_test.cc
index 5d19f85..e68d44d 100644
--- a/src/cobalt/dom/custom_event_test.cc
+++ b/src/cobalt/dom/custom_event_test.cc
@@ -72,7 +72,7 @@
     engine_ = script::JavaScriptEngine::CreateEngine();
     global_environment_ = engine_->CreateGlobalEnvironment();
     window_ = new Window(
-        environment_settings_.get(), ViewportSize(1920, 1080), 1.f,
+        environment_settings_.get(), ViewportSize(1920, 1080),
         base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(),
         fetcher_factory_.get(), loader_factory_.get(), NULL, NULL, NULL, NULL,
         NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL,
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc
index 9e93334..dceed45 100644
--- a/src/cobalt/dom/document.cc
+++ b/src/cobalt/dom/document.cc
@@ -992,8 +992,7 @@
   // Ignored by this class.
 }
 
-void Document::OnVisibilityStateChanged(
-    page_visibility::VisibilityState visibility_state) {
+void Document::OnVisibilityStateChanged(VisibilityState visibility_state) {
   DispatchEvent(new Event(base::Tokens::visibilitychange(), Event::kBubbles,
                           Event::kNotCancelable));
 }
diff --git a/src/cobalt/dom/document.h b/src/cobalt/dom/document.h
index b0bf4e6..03e11ce 100644
--- a/src/cobalt/dom/document.h
+++ b/src/cobalt/dom/document.h
@@ -45,12 +45,12 @@
 #include "cobalt/dom/intersection_observer_task_manager.h"
 #include "cobalt/dom/location.h"
 #include "cobalt/dom/node.h"
+#include "cobalt/dom/page_visibility_state.h"
 #include "cobalt/dom/pointer_state.h"
+#include "cobalt/dom/visibility_state.h"
 #include "cobalt/math/size.h"
 #include "cobalt/network_bridge/cookie_jar.h"
 #include "cobalt/network_bridge/net_poster.h"
-#include "cobalt/page_visibility/page_visibility_state.h"
-#include "cobalt/page_visibility/visibility_state.h"
 #include "cobalt/script/exception_state.h"
 #include "cobalt/script/wrappable.h"
 #include "url/gurl.h"
@@ -95,7 +95,7 @@
 //   https://www.w3.org/TR/dom/#document
 class Document : public Node,
                  public cssom::MutationObserver,
-                 public page_visibility::PageVisibilityState::Observer {
+                 public PageVisibilityState::Observer {
  public:
   struct Options {
     Options()
@@ -400,10 +400,8 @@
   void DisableJit();
 
   // Page Visibility fields.
-  bool hidden() const {
-    return visibility_state() == page_visibility::kVisibilityStateHidden;
-  }
-  page_visibility::VisibilityState visibility_state() const {
+  bool hidden() const { return visibility_state() == kVisibilityStateHidden; }
+  VisibilityState visibility_state() const {
     return page_visibility_state()->GetVisibilityState();
   }
   const EventListenerScriptValue* onvisibilitychange() const {
@@ -413,10 +411,9 @@
     SetAttributeEventListener(base::Tokens::visibilitychange(), event_listener);
   }
 
-  // page_visibility::PageVisibilityState::Observer implementation.
+  // PageVisibilityState::Observer implementation.
   void OnWindowFocusChanged(bool has_focus) override;
-  void OnVisibilityStateChanged(
-      page_visibility::VisibilityState visibility_state) override;
+  void OnVisibilityStateChanged(VisibilityState visibility_state) override;
 
   PointerState* pointer_state() { return &pointer_state_; }
 
@@ -439,11 +436,11 @@
  protected:
   ~Document() override;
 
-  page_visibility::PageVisibilityState* page_visibility_state() {
+  PageVisibilityState* page_visibility_state() {
     return html_element_context_->page_visibility_state().get();
   }
 
-  const page_visibility::PageVisibilityState* page_visibility_state() const {
+  const PageVisibilityState* page_visibility_state() const {
     return html_element_context_->page_visibility_state().get();
   }
 
@@ -472,7 +469,7 @@
   // It is possible that we destroy the page visibility state object before
   // Document, during shutdown, so this allows us to handle that situation
   // more gracefully than crashing.
-  base::WeakPtr<page_visibility::PageVisibilityState> page_visibility_state_;
+  base::WeakPtr<PageVisibilityState> page_visibility_state_;
 
   // Reference to the associated window object.
   Window* window_;
diff --git a/src/cobalt/page_visibility/document.idl b/src/cobalt/dom/document_page_visibility.idl
similarity index 100%
rename from src/cobalt/page_visibility/document.idl
rename to src/cobalt/dom/document_page_visibility.idl
diff --git a/src/cobalt/dom/dom.gyp b/src/cobalt/dom/dom.gyp
index 7ed14b7..e173cac 100644
--- a/src/cobalt/dom/dom.gyp
+++ b/src/cobalt/dom/dom.gyp
@@ -252,6 +252,8 @@
         'on_screen_keyboard.cc',
         'on_screen_keyboard.h',
         'on_screen_keyboard_bridge.h',
+        'page_visibility_state.cc',
+        'page_visibility_state.h',
         'performance.cc',
         'performance.h',
         'performance_timing.cc',
@@ -337,7 +339,6 @@
         '<(DEPTH)/cobalt/media_session/media_session.gyp:media_session',
         # Interface layer to avoid directly depending on network.
         '<(DEPTH)/cobalt/network_bridge/network_bridge.gyp:network_bridge',
-        '<(DEPTH)/cobalt/page_visibility/page_visibility.gyp:page_visibility',
         '<(DEPTH)/cobalt/script/script.gyp:script',
         '<(DEPTH)/cobalt/speech/speech.gyp:speech',
         '<(DEPTH)/cobalt/storage/storage.gyp:storage',
diff --git a/src/cobalt/dom/dom_test.gyp b/src/cobalt/dom/dom_test.gyp
index f0b181f..39f61d4 100644
--- a/src/cobalt/dom/dom_test.gyp
+++ b/src/cobalt/dom/dom_test.gyp
@@ -57,6 +57,7 @@
         'node_list_test.cc',
         'node_test.cc',
         'on_screen_keyboard_test.cc',
+        'page_visibility_state_test.cc',
         'performance_test.cc',
         'rule_matching_test.cc',
         'screen_test.cc',
diff --git a/src/cobalt/dom/error_event_test.cc b/src/cobalt/dom/error_event_test.cc
index 05d7bce..c4d4c7c 100644
--- a/src/cobalt/dom/error_event_test.cc
+++ b/src/cobalt/dom/error_event_test.cc
@@ -74,10 +74,10 @@
 
     ViewportSize view_size(1920, 1080);
     window_ = new Window(
-        environment_settings_.get(), view_size, 1.f,
-        base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(),
-        fetcher_factory_.get(), loader_factory_.get(), NULL, NULL, NULL, NULL,
-        NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL,
+        environment_settings_.get(), view_size, base::kApplicationStateStarted,
+        css_parser_.get(), dom_parser_.get(), fetcher_factory_.get(),
+        loader_factory_.get(), NULL, NULL, NULL, NULL, NULL, NULL,
+        &local_storage_database_, NULL, NULL, NULL, NULL,
         global_environment_->script_value_factory(), NULL, NULL, url_, "",
         "en-US", "en", base::Callback<void(const GURL&)>(),
         base::Bind(&MockLoadCompleteCallback::Run,
diff --git a/src/cobalt/dom/html_element_context.h b/src/cobalt/dom/html_element_context.h
index 56d4295..ed55e92 100644
--- a/src/cobalt/dom/html_element_context.h
+++ b/src/cobalt/dom/html_element_context.h
@@ -23,6 +23,7 @@
 #include "cobalt/base/application_state.h"
 #include "cobalt/cssom/css_parser.h"
 #include "cobalt/dom/dom_stat_tracker.h"
+#include "cobalt/dom/page_visibility_state.h"
 #include "cobalt/dom/parser.h"
 #include "cobalt/dom/url_registry.h"
 #include "cobalt/loader/fetcher_factory.h"
@@ -32,7 +33,6 @@
 #include "cobalt/loader/mesh/mesh_cache.h"
 #include "cobalt/media/can_play_type_handler.h"
 #include "cobalt/media/web_media_player_factory.h"
-#include "cobalt/page_visibility/page_visibility_state.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/script_runner.h"
 #include "cobalt/script/script_value_factory.h"
@@ -156,7 +156,7 @@
     return reduced_image_cache_capacity_manager_;
   }
 
-  base::WeakPtr<page_visibility::PageVisibilityState> page_visibility_state() {
+  base::WeakPtr<PageVisibilityState> page_visibility_state() {
     return page_visibility_state_weak_ptr_factory_.GetWeakPtr();
   }
 
@@ -185,8 +185,8 @@
   loader::mesh::MeshCache* const mesh_cache_;
   DomStatTracker* const dom_stat_tracker_;
   const std::string font_language_script_;
-  page_visibility::PageVisibilityState page_visibility_state_;
-  base::WeakPtrFactory<page_visibility::PageVisibilityState>
+  PageVisibilityState page_visibility_state_;
+  base::WeakPtrFactory<PageVisibilityState>
       page_visibility_state_weak_ptr_factory_;
   const float video_playback_rate_multiplier_;
   base::WaitableEvent* synchronous_loader_interrupt_ = nullptr;
diff --git a/src/cobalt/dom/lottie_frame_custom_event.h b/src/cobalt/dom/lottie_frame_custom_event.h
new file mode 100644
index 0000000..d2cd62c
--- /dev/null
+++ b/src/cobalt/dom/lottie_frame_custom_event.h
@@ -0,0 +1,53 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DOM_LOTTIE_FRAME_CUSTOM_EVENT_H_
+#define COBALT_DOM_LOTTIE_FRAME_CUSTOM_EVENT_H_
+
+#include <memory>
+#include <string>
+
+#include "cobalt/dom/event.h"
+#include "cobalt/dom/lottie_frame_custom_event_detail.h"
+
+namespace cobalt {
+namespace dom {
+
+// Lottie frame events carry custom data about the frame rendered and how far
+// the animation has played.
+//   https://lottiefiles.github.io/lottie-player/events.html
+class LottieFrameCustomEvent : public Event {
+ public:
+  explicit LottieFrameCustomEvent(const std::string& type) : Event(type) {}
+  LottieFrameCustomEvent(const std::string& type, const EventInit& init_dict)
+      : Event(type, init_dict) {}
+
+  void set_detail(const LottieFrameCustomEventDetail& detail) {
+    detail_ = detail;
+  }
+
+  const LottieFrameCustomEventDetail& detail() const { return detail_; }
+
+  DEFINE_WRAPPABLE_TYPE(LottieFrameCustomEvent);
+
+ protected:
+  ~LottieFrameCustomEvent() override {}
+
+  LottieFrameCustomEventDetail detail_;
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_LOTTIE_FRAME_CUSTOM_EVENT_H_
diff --git a/src/cobalt/dom/lottie_frame_custom_event.idl b/src/cobalt/dom/lottie_frame_custom_event.idl
new file mode 100644
index 0000000..da7b376
--- /dev/null
+++ b/src/cobalt/dom/lottie_frame_custom_event.idl
@@ -0,0 +1,20 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Custom interface for the LottiePlayer frame event.
+// https://lottiefiles.github.io/lottie-player/events.html
+[Constructor(DOMString type, optional EventInit eventInitDict)]
+interface LottieFrameCustomEvent : Event {
+  attribute LottieFrameCustomEventDetail detail;
+};
diff --git a/src/cobalt/dom/lottie_frame_custom_event_detail.idl b/src/cobalt/dom/lottie_frame_custom_event_detail.idl
new file mode 100644
index 0000000..04054be
--- /dev/null
+++ b/src/cobalt/dom/lottie_frame_custom_event_detail.idl
@@ -0,0 +1,20 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Custom dictionary for storing Lottie frame event information.
+// https://lottiefiles.github.io/lottie-player/events.html
+dictionary LottieFrameCustomEventDetail {
+  double frame = 0;
+  double seeker = 0;
+};
diff --git a/src/cobalt/dom/lottie_player.cc b/src/cobalt/dom/lottie_player.cc
index 5b3fc1e..3ee7c9d 100644
--- a/src/cobalt/dom/lottie_player.cc
+++ b/src/cobalt/dom/lottie_player.cc
@@ -17,7 +17,6 @@
 #include <memory>
 #include <string>
 
-#include "base/message_loop/message_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
@@ -25,6 +24,7 @@
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/html_element_context.h"
+#include "cobalt/dom/lottie_frame_custom_event.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/script/global_environment.h"
 #include "url/gurl.h"
@@ -39,7 +39,8 @@
 LottiePlayer::LottiePlayer(Document* document)
     : HTMLElement(document, base::Token(kTagName)),
       autoplaying_(true),
-      ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)) {
+      ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)),
+      callback_task_runner_(base::MessageLoop::current()->task_runner()) {
   SetAnimationEventCallbacks();
 }
 
@@ -61,6 +62,14 @@
   }
 }
 
+std::string LottiePlayer::background() const {
+  return GetAttribute("background").value_or("");
+}
+
+void LottiePlayer::set_background(std::string background) {
+  SetAttribute("background", background);
+}
+
 int LottiePlayer::count() const { return properties_.count; }
 
 void LottiePlayer::set_count(int count) {
@@ -196,6 +205,8 @@
                                   const std::string& value) {
   if (name == "src") {
     UpdateAnimationData();
+  } else if (name == "background") {
+    SetStyleAttribute("background:" + value);
   } else if (name == "count") {
     int count;
     base::StringToInt32(value, &count);
@@ -220,6 +231,8 @@
 void LottiePlayer::OnRemoveAttribute(const std::string& name) {
   if (name == "src") {
     UpdateAnimationData();
+  } else if (name == "background") {
+    SetStyleAttribute("background:transparent");
   } else if (name == "count") {
     SetCount(LottieAnimation::LottieProperties::kDefaultCount);
   } else if (name == "direction") {
@@ -391,26 +404,30 @@
 }
 
 void LottiePlayer::SetAnimationEventCallbacks() {
-  properties_.onplay_callback = base::Bind(
-      base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-      base::Unretained(base::MessageLoop::current()->task_runner().get()),
-      FROM_HERE, base::Bind(&LottiePlayer::OnPlay, base::AsWeakPtr(this)));
-  properties_.onpause_callback = base::Bind(
-      base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-      base::Unretained(base::MessageLoop::current()->task_runner().get()),
-      FROM_HERE, base::Bind(&LottiePlayer::OnPause, base::AsWeakPtr(this)));
-  properties_.onstop_callback = base::Bind(
-      base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-      base::Unretained(base::MessageLoop::current()->task_runner().get()),
-      FROM_HERE, base::Bind(&LottiePlayer::OnStop, base::AsWeakPtr(this)));
-  properties_.oncomplete_callback = base::Bind(
-      base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-      base::Unretained(base::MessageLoop::current()->task_runner().get()),
-      FROM_HERE, base::Bind(&LottiePlayer::OnComplete, base::AsWeakPtr(this)));
-  properties_.onloop_callback = base::Bind(
-      base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-      base::Unretained(base::MessageLoop::current()->task_runner().get()),
-      FROM_HERE, base::Bind(&LottiePlayer::OnLoop, base::AsWeakPtr(this)));
+  DCHECK(callback_task_runner_);
+  properties_.onplay_callback =
+      base::Bind(base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
+                 callback_task_runner_, FROM_HERE,
+                 base::Bind(&LottiePlayer::OnPlay, base::AsWeakPtr(this)));
+  properties_.onpause_callback =
+      base::Bind(base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
+                 callback_task_runner_, FROM_HERE,
+                 base::Bind(&LottiePlayer::OnPause, base::AsWeakPtr(this)));
+  properties_.onstop_callback =
+      base::Bind(base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
+                 callback_task_runner_, FROM_HERE,
+                 base::Bind(&LottiePlayer::OnStop, base::AsWeakPtr(this)));
+  properties_.oncomplete_callback =
+      base::Bind(base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
+                 callback_task_runner_, FROM_HERE,
+                 base::Bind(&LottiePlayer::OnComplete, base::AsWeakPtr(this)));
+  properties_.onloop_callback =
+      base::Bind(base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
+                 callback_task_runner_, FROM_HERE,
+                 base::Bind(&LottiePlayer::OnLoop, base::AsWeakPtr(this)));
+  properties_.onenterframe_callback = base::Bind(
+      &LottiePlayer::CallOnEnterFrame, callback_task_runner_,
+      base::Bind(&LottiePlayer::OnEnterFrame, base::AsWeakPtr(this)));
 }
 
 void LottiePlayer::OnPlay() { ScheduleEvent(base::Tokens::play()); }
@@ -423,5 +440,25 @@
 
 void LottiePlayer::OnLoop() { ScheduleEvent(base::Tokens::loop()); }
 
+void LottiePlayer::OnEnterFrame(double frame, double seeker) {
+  LottieFrameCustomEventDetail detail;
+  detail.set_frame(frame);
+  detail.set_seeker(seeker);
+
+  scoped_refptr<LottieFrameCustomEvent> lottie_frame_custom_event =
+      new LottieFrameCustomEvent("frame");
+  lottie_frame_custom_event->set_detail(detail);
+  lottie_frame_custom_event->set_target(this);
+  event_queue_.Enqueue(lottie_frame_custom_event);
+}
+
+void LottiePlayer::CallOnEnterFrame(
+    scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner,
+    base::Callback<void(double, double)> enter_frame_callback, double frame,
+    double seeker) {
+  callback_task_runner->PostTask(
+      FROM_HERE, base::Bind(enter_frame_callback, frame, seeker));
+}
+
 }  // namespace dom
 }  // namespace cobalt
diff --git a/src/cobalt/dom/lottie_player.h b/src/cobalt/dom/lottie_player.h
index d246964..5151138 100644
--- a/src/cobalt/dom/lottie_player.h
+++ b/src/cobalt/dom/lottie_player.h
@@ -17,6 +17,7 @@
 
 #include <string>
 
+#include "base/message_loop/message_loop.h"
 #include "cobalt/dom/event_queue.h"
 #include "cobalt/dom/html_element.h"
 #include "cobalt/loader/image/image_cache.h"
@@ -52,6 +53,8 @@
   void set_src(const std::string& src);
   bool autoplay() const;
   void set_autoplay(bool loop);
+  std::string background() const;
+  void set_background(std::string background);
   int count() const;
   void set_count(int count);
   int direction() const;
@@ -122,11 +125,17 @@
   void ScheduleEvent(base::Token event_name);
   void SetAnimationEventCallbacks();
 
+  // These are callbacks triggered during animation playback.
   void OnPlay();
   void OnPause();
   void OnStop();
   void OnComplete();
   void OnLoop();
+  void OnEnterFrame(double frame, double seeker);
+  static void CallOnEnterFrame(
+      scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner,
+      base::Callback<void(double, double)> enter_frame_callback, double frame,
+      double seeker);
 
   scoped_refptr<loader::image::CachedImage> cached_image_;
   std::unique_ptr<loader::image::CachedImage::OnLoadedCallbackHandler>
@@ -141,6 +150,7 @@
   LottieAnimation::LottieProperties properties_;
 
   EventQueue event_queue_;
+  scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner_;
 };
 
 }  // namespace dom
diff --git a/src/cobalt/dom/lottie_player.idl b/src/cobalt/dom/lottie_player.idl
index 6da5242..ea4b975 100644
--- a/src/cobalt/dom/lottie_player.idl
+++ b/src/cobalt/dom/lottie_player.idl
@@ -19,6 +19,7 @@
 interface LottiePlayer : HTMLElement {
   attribute DOMString src;
   attribute boolean autoplay;
+  attribute DOMString background;
   attribute long count;
   attribute long direction;
   attribute DOMString mode;
diff --git a/src/cobalt/dom/media_query_list.cc b/src/cobalt/dom/media_query_list.cc
index 4a73af5..eac794a 100644
--- a/src/cobalt/dom/media_query_list.cc
+++ b/src/cobalt/dom/media_query_list.cc
@@ -42,7 +42,8 @@
   }
   ViewportSize viewport(math::ToRoundedInt(screen_->avail_width()),
                         math::ToRoundedInt(screen_->avail_height()),
-                        screen_->diagonal_inches());
+                        screen_->diagonal_inches(),
+                        screen_->device_pixel_ratio());
   return media_list_->EvaluateConditionValue(viewport);
 }
 
diff --git a/src/cobalt/dom/on_screen_keyboard_test.cc b/src/cobalt/dom/on_screen_keyboard_test.cc
index d5366b2..7a98f60 100644
--- a/src/cobalt/dom/on_screen_keyboard_test.cc
+++ b/src/cobalt/dom/on_screen_keyboard_test.cc
@@ -206,7 +206,7 @@
         global_environment_(engine_->CreateGlobalEnvironment()),
         on_screen_keyboard_bridge_(new OnScreenKeyboardMockBridge()),
         window_(new Window(
-            environment_settings_.get(), ViewportSize(1920, 1080), 1.f,
+            environment_settings_.get(), ViewportSize(1920, 1080),
             base::kApplicationStateStarted, css_parser_.get(),
             dom_parser_.get(), fetcher_factory_.get(), loader_factory_.get(),
             NULL, NULL, NULL, NULL, NULL, NULL, &local_storage_database_, NULL,
diff --git a/src/cobalt/dom/page_visibility_state.cc b/src/cobalt/dom/page_visibility_state.cc
new file mode 100644
index 0000000..19e7147
--- /dev/null
+++ b/src/cobalt/dom/page_visibility_state.cc
@@ -0,0 +1,178 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/dom/page_visibility_state.h"
+
+#include "base/strings/stringprintf.h"
+#include "base/trace_event/trace_event.h"
+
+namespace cobalt {
+namespace dom {
+
+#define STATE_STRING(state)                                             \
+  base::StringPrintf("%s (%d)", base::GetApplicationStateString(state), \
+                     static_cast<int>(state))
+
+namespace {
+// Converts an ApplicationState to a VisibilityState.
+VisibilityState ToVisibilityState(base::ApplicationState state) {
+  switch (state) {
+    case base::kApplicationStatePreloading:
+      return kVisibilityStatePrerender;
+    case base::kApplicationStateStarted:
+    case base::kApplicationStatePaused:
+      return kVisibilityStateVisible;
+    case base::kApplicationStateSuspended:
+    case base::kApplicationStateStopped:
+      return kVisibilityStateHidden;
+    default:
+      NOTREACHED() << "Invalid Application State: " << STATE_STRING(state);
+      return kVisibilityStateHidden;
+  }
+}
+
+bool HasFocus(base::ApplicationState state) {
+  switch (state) {
+    case base::kApplicationStateStarted:
+      return true;
+    case base::kApplicationStatePreloading:
+    case base::kApplicationStatePaused:
+    case base::kApplicationStateSuspended:
+    case base::kApplicationStateStopped:
+      return false;
+    default:
+      NOTREACHED() << "Invalid Application State: " << STATE_STRING(state);
+      return false;
+  }
+}
+}  // namespace
+
+PageVisibilityState::PageVisibilityState()
+    : application_state_(base::kApplicationStateStarted) {
+  DLOG(INFO) << __FUNCTION__
+             << ": app_state=" << STATE_STRING(application_state_);
+}
+
+PageVisibilityState::PageVisibilityState(
+    base::ApplicationState initial_application_state)
+    : application_state_(initial_application_state) {
+  DLOG(INFO) << __FUNCTION__
+             << ": app_state=" << STATE_STRING(application_state_);
+  DCHECK((application_state_ == base::kApplicationStateStarted) ||
+         (application_state_ == base::kApplicationStatePreloading) ||
+         (application_state_ == base::kApplicationStatePaused))
+      << "application_state_=" << STATE_STRING(application_state_);
+}
+
+bool PageVisibilityState::HasWindowFocus() const {
+  return HasFocus(application_state());
+}
+
+VisibilityState PageVisibilityState::GetVisibilityState() const {
+  return ToVisibilityState(application_state());
+}
+
+void PageVisibilityState::SetApplicationState(base::ApplicationState state) {
+  TRACE_EVENT1("cobalt::dom", "PageVisibilityState::SetApplicationState",
+               "state", STATE_STRING(state));
+  if (application_state_ == state) {
+    DLOG(WARNING) << __FUNCTION__ << ": Attempt to re-enter "
+                  << STATE_STRING(application_state_);
+    return;
+  }
+
+  // Audit that the transitions are correct.
+  if (DLOG_IS_ON(FATAL)) {
+    switch (application_state_) {
+      case base::kApplicationStatePaused:
+        DCHECK(state == base::kApplicationStateSuspended ||
+               state == base::kApplicationStateStarted)
+            << ": application_state_=" << STATE_STRING(application_state_)
+            << ", state=" << STATE_STRING(state);
+
+        break;
+      case base::kApplicationStatePreloading:
+        DCHECK(state == base::kApplicationStateSuspended ||
+               state == base::kApplicationStateStarted)
+            << ": application_state_=" << STATE_STRING(application_state_)
+            << ", state=" << STATE_STRING(state);
+        break;
+      case base::kApplicationStateStarted:
+        DCHECK(state == base::kApplicationStatePaused)
+            << ": application_state_=" << STATE_STRING(application_state_)
+            << ", state=" << STATE_STRING(state);
+        break;
+      case base::kApplicationStateStopped:
+        DCHECK(state == base::kApplicationStatePreloading ||
+               state == base::kApplicationStateStarted)
+            << ": application_state_=" << STATE_STRING(application_state_)
+            << ", state=" << STATE_STRING(state);
+        break;
+      case base::kApplicationStateSuspended:
+        DCHECK(state == base::kApplicationStatePaused ||
+               state == base::kApplicationStateStopped)
+            << ": application_state_=" << STATE_STRING(application_state_)
+            << ", state=" << STATE_STRING(state);
+        break;
+      default:
+        NOTREACHED() << ": application_state_="
+                     << STATE_STRING(application_state_)
+                     << ", state=" << STATE_STRING(state);
+
+        break;
+    }
+  }
+
+  bool old_has_focus = HasFocus(application_state_);
+  VisibilityState old_visibility_state = ToVisibilityState(application_state_);
+  DLOG(INFO) << __FUNCTION__ << ": " << STATE_STRING(application_state_)
+             << " -> " << STATE_STRING(state);
+  application_state_ = state;
+  bool has_focus = HasFocus(application_state_);
+  VisibilityState visibility_state = ToVisibilityState(application_state_);
+  bool focus_changed = has_focus != old_has_focus;
+  bool visibility_state_changed = visibility_state != old_visibility_state;
+
+  if (focus_changed && has_focus) {
+    // If going to a focused state, dispatch the visibility state first.
+    if (visibility_state_changed) {
+      DispatchVisibilityStateChanged(visibility_state);
+    }
+
+    DispatchWindowFocusChanged(has_focus);
+    return;
+  }
+
+  // Otherwise, we should dispatch the focus state first.
+  if (focus_changed) {
+    DispatchWindowFocusChanged(has_focus);
+  }
+
+  if (visibility_state_changed) {
+    DispatchVisibilityStateChanged(visibility_state);
+  }
+}
+
+void PageVisibilityState::DispatchWindowFocusChanged(bool has_focus) {
+  FOR_EACH_OBSERVER(Observer, observer_list_, OnWindowFocusChanged(has_focus));
+}
+
+void PageVisibilityState::DispatchVisibilityStateChanged(
+    VisibilityState visibility_state) {
+  FOR_EACH_OBSERVER(Observer, observer_list_,
+                    OnVisibilityStateChanged(visibility_state));
+}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/page_visibility_state.h b/src/cobalt/dom/page_visibility_state.h
new file mode 100644
index 0000000..92771bd
--- /dev/null
+++ b/src/cobalt/dom/page_visibility_state.h
@@ -0,0 +1,94 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DOM_PAGE_VISIBILITY_STATE_H_
+#define COBALT_DOM_PAGE_VISIBILITY_STATE_H_
+
+#include "base/observer_list.h"
+#include "cobalt/base/application_state.h"
+#include "cobalt/dom/visibility_state.h"
+
+namespace cobalt {
+namespace dom {
+
+// The visibility state of the Window and Document as controlled by the current
+// application state.
+class PageVisibilityState {
+ public:
+  // Pure virtual interface for classes that want to observe page visibility
+  // state changes.
+  class Observer : public base::CheckedObserver {
+   public:
+    // Called when the window focus state changes.
+    virtual void OnWindowFocusChanged(bool has_focus) = 0;
+    // Called when the VisibilityState changes.
+    virtual void OnVisibilityStateChanged(VisibilityState visibility_state) = 0;
+
+   protected:
+    virtual ~Observer() {}
+  };
+
+  PageVisibilityState();
+  explicit PageVisibilityState(
+      base::ApplicationState initial_application_state);
+
+  base::ApplicationState application_state() const {
+    return application_state_;
+  }
+
+  // Whether the current window has focus based on the current application
+  // state.
+  bool HasWindowFocus() const;
+
+  // Whether the current window has focus based on the current application
+  // state.
+  VisibilityState GetVisibilityState() const;
+
+  // Sets the current application state, and dispatches appropriate observation
+  // events.
+  void SetApplicationState(base::ApplicationState state);
+
+  // Adds a PageVisibiltyState::Observer to this PageVisibilityState.
+  void AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
+
+  // Removes a PageVisibiltyState::Observer from this PageVisibilityState, if it
+  // is registered.
+  void RemoveObserver(Observer* observer) {
+    observer_list_.RemoveObserver(observer);
+  }
+
+  // Returns whether a PageVisibiltyState::Observer is registered on this
+  // PageVisibilityState.
+  bool HasObserver(Observer* observer) const {
+    return observer_list_.HasObserver(observer);
+  }
+
+  // Clears all registered PageVisibiltyState::Observers, if any.
+  void ClearObservers() { observer_list_.Clear(); }
+
+ private:
+  void DispatchWindowFocusChanged(bool has_focus);
+  void DispatchVisibilityStateChanged(VisibilityState visibility_state);
+
+  // The current application state.
+  base::ApplicationState application_state_;
+
+  // The list of registered PageVisibiltyState::Observers;
+  base::ObserverList<Observer> observer_list_;
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_PAGE_VISIBILITY_STATE_H_
diff --git a/src/cobalt/dom/page_visibility_state_test.cc b/src/cobalt/dom/page_visibility_state_test.cc
new file mode 100644
index 0000000..988a8b2
--- /dev/null
+++ b/src/cobalt/dom/page_visibility_state_test.cc
@@ -0,0 +1,134 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <memory>
+
+#include "cobalt/dom/page_visibility_state.h"
+
+#include "base/debug/stack_trace.h"
+#include "base/logging.h"
+#include "cobalt/base/application_state.h"
+#include "cobalt/dom/visibility_state.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cobalt {
+namespace dom {
+namespace {
+
+using ::testing::_;
+
+class MockPageVisibilityStateObserver : public PageVisibilityState::Observer {
+ public:
+  static std::unique_ptr<MockPageVisibilityStateObserver> Create() {
+    return std::unique_ptr<MockPageVisibilityStateObserver>(
+        new ::testing::StrictMock<MockPageVisibilityStateObserver>());
+  }
+
+  MOCK_METHOD1(OnWindowFocusChanged, void(bool has_focus));
+  MOCK_METHOD1(OnVisibilityStateChanged,
+               void(VisibilityState visibility_state));
+
+ protected:
+  MockPageVisibilityStateObserver() {}
+};
+
+TEST(PageVisibilityStateTest, DefaultConstructor) {
+  PageVisibilityState state;
+  EXPECT_TRUE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+}
+
+TEST(PageVisibilityStateTest, InitialStateConstructorStarted) {
+  PageVisibilityState state(base::kApplicationStateStarted);
+  EXPECT_TRUE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+}
+
+TEST(PageVisibilityStateTest, TransitionsAndObservations) {
+  PageVisibilityState state(base::kApplicationStateStarted);
+  std::unique_ptr<MockPageVisibilityStateObserver> observer =
+      MockPageVisibilityStateObserver::Create();
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  EXPECT_TRUE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  state.AddObserver(observer.get());
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(false));
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStatePaused);
+  EXPECT_FALSE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(true));
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStateStarted);
+  EXPECT_TRUE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(false));
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStatePaused);
+  EXPECT_FALSE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(kVisibilityStateHidden));
+  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStateSuspended);
+  EXPECT_FALSE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateHidden, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(kVisibilityStateVisible));
+  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStatePaused);
+  EXPECT_FALSE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(true));
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStateStarted);
+  EXPECT_TRUE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  state.RemoveObserver(observer.get());
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStatePaused);
+  EXPECT_FALSE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+
+  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
+  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
+  state.SetApplicationState(base::kApplicationStateSuspended);
+  EXPECT_FALSE(state.HasWindowFocus());
+  EXPECT_EQ(kVisibilityStateHidden, state.GetVisibilityState());
+  ::testing::Mock::VerifyAndClearExpectations(observer.get());
+}
+
+}  // namespace
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/screen.h b/src/cobalt/dom/screen.h
index e8c2e65..6e4f17c 100644
--- a/src/cobalt/dom/screen.h
+++ b/src/cobalt/dom/screen.h
@@ -28,8 +28,10 @@
  public:
   explicit Screen(const cssom::ViewportSize& view_size) { SetSize(view_size); }
 
-  void SetSize(int width, int height, float diagonal_inches) {
-    view_size_ = cssom::ViewportSize(width, height, diagonal_inches);
+  void SetSize(int width, int height, float video_pixel_ratio,
+               float diagonal_inches) {
+    view_size_ =
+        cssom::ViewportSize(width, height, video_pixel_ratio, diagonal_inches);
   }
 
   void SetSize(const cssom::ViewportSize& view_size) { view_size_ = view_size; }
@@ -59,9 +61,15 @@
   // The pixelDepth attribute must return 24.
   unsigned int pixel_depth() const { return 24; }
 
+  // Custom, not in any spec.
+  //
+
   // The length of the display screen as measured from opposing corners.
   float diagonal_inches() const { return view_size_.diagonal_inches(); }
 
+  // The ratio of video pixels to graphics pixels.
+  float device_pixel_ratio() const { return view_size_.device_pixel_ratio(); }
+
   DEFINE_WRAPPABLE_TYPE(Screen);
 
  private:
diff --git a/src/cobalt/dom/screen_test.cc b/src/cobalt/dom/screen_test.cc
index 8c8d360..a933d73 100644
--- a/src/cobalt/dom/screen_test.cc
+++ b/src/cobalt/dom/screen_test.cc
@@ -23,7 +23,7 @@
 namespace dom {
 
 TEST(ScreenTest, Size) {
-  ViewportSize view_size(ViewportSize(1280, 720, 55.f));
+  ViewportSize view_size(ViewportSize(1280, 720, 55.f, 2.f));
   scoped_refptr<Screen> screen = new Screen(view_size);
 
   EXPECT_FLOAT_EQ(screen->width(), 1280.0f);
@@ -33,6 +33,7 @@
   EXPECT_EQ(screen->color_depth(), 24);
   EXPECT_EQ(screen->pixel_depth(), 24);
   EXPECT_EQ(screen->diagonal_inches(), 55.f);
+  EXPECT_EQ(screen->device_pixel_ratio(), 2.f);
 }
 
 }  // namespace dom
diff --git a/src/cobalt/dom/testing/stub_window.h b/src/cobalt/dom/testing/stub_window.h
index 18a3b04..118a010 100644
--- a/src/cobalt/dom/testing/stub_window.h
+++ b/src/cobalt/dom/testing/stub_window.h
@@ -68,7 +68,7 @@
                   0, NULL, NULL, NULL, NULL, NULL, engine_.get(),
                   global_environment(), null_debugger_hooks_, NULL));
     window_ = new dom::Window(
-        environment_settings_.get(), cssom::ViewportSize(1920, 1080), 1.f,
+        environment_settings_.get(), cssom::ViewportSize(1920, 1080),
         base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(),
         fetcher_factory_.get(), loader_factory_.get(), NULL, NULL, NULL, NULL,
         NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL,
diff --git a/src/cobalt/page_visibility/visibility_state.idl b/src/cobalt/dom/visibility_state.idl
similarity index 100%
rename from src/cobalt/page_visibility/visibility_state.idl
rename to src/cobalt/dom/visibility_state.idl
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index a436a39..a9e14c1 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -92,7 +92,7 @@
 
 Window::Window(
     script::EnvironmentSettings* settings, const ViewportSize& view_size,
-    float device_pixel_ratio, base::ApplicationState initial_application_state,
+    base::ApplicationState initial_application_state,
     cssom::CSSParser* css_parser, Parser* dom_parser,
     loader::FetcherFactory* fetcher_factory,
     loader::LoaderFactory* loader_factory,
@@ -141,7 +141,6 @@
     // see EventTarget constructor for more details.
     : EventTarget(settings, kUnpackOnErrorEvents),
       viewport_size_(view_size),
-      device_pixel_ratio_(device_pixel_ratio),
       is_resize_event_pending_(false),
       is_reporting_script_error_(false),
 #if defined(ENABLE_TEST_RUNNER)
@@ -618,19 +617,18 @@
   document_->set_synchronous_layout_and_produce_render_tree_callback(callback);
 }
 
-void Window::SetSize(ViewportSize size, float device_pixel_ratio) {
-  if (size == viewport_size_ && device_pixel_ratio == device_pixel_ratio_) {
+void Window::SetSize(ViewportSize size) {
+  if (size == viewport_size_) {
     return;
   }
 
   viewport_size_ = size;
-  device_pixel_ratio_ = device_pixel_ratio;
   screen_->SetSize(viewport_size_);
   // This will cause layout invalidation.
   document_->SetViewport(viewport_size_);
 
   if (html_element_context_->page_visibility_state()->GetVisibilityState() ==
-      page_visibility::kVisibilityStateVisible) {
+      kVisibilityStateVisible) {
     DispatchEvent(new Event(base::Tokens::resize()));
   } else {
     is_resize_event_pending_ = true;
@@ -647,10 +645,8 @@
       new Event(has_focus ? base::Tokens::focus() : base::Tokens::blur()));
 }
 
-void Window::OnVisibilityStateChanged(
-    page_visibility::VisibilityState visibility_state) {
-  if (is_resize_event_pending_ &&
-      visibility_state == page_visibility::kVisibilityStateVisible) {
+void Window::OnVisibilityStateChanged(VisibilityState visibility_state) {
+  if (is_resize_event_pending_ && visibility_state == kVisibilityStateVisible) {
     is_resize_event_pending_ = false;
     DispatchEvent(new Event(base::Tokens::resize()));
   }
@@ -663,7 +659,7 @@
   // pending resize event, so that the resize will occur once layouts are again
   // available.
   if (html_element_context_->page_visibility_state()->GetVisibilityState() !=
-      page_visibility::kVisibilityStateVisible) {
+      kVisibilityStateVisible) {
     is_resize_event_pending_ = true;
   }
 }
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h
index 0ae03d0..56d2f61 100644
--- a/src/cobalt/dom/window.h
+++ b/src/cobalt/dom/window.h
@@ -41,6 +41,7 @@
 #include "cobalt/dom/media_query_list.h"
 #include "cobalt/dom/on_screen_keyboard.h"
 #include "cobalt/dom/on_screen_keyboard_bridge.h"
+#include "cobalt/dom/page_visibility_state.h"
 #include "cobalt/dom/parser.h"
 #include "cobalt/dom/screenshot_manager.h"
 #if defined(ENABLE_TEST_RUNNER)
@@ -63,7 +64,6 @@
 #include "cobalt/media/web_media_player_factory.h"
 #include "cobalt/network_bridge/cookie_jar.h"
 #include "cobalt/network_bridge/net_poster.h"
-#include "cobalt/page_visibility/page_visibility_state.h"
 #include "cobalt/script/callback_function.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/error_report.h"
@@ -106,8 +106,7 @@
 //   https://www.w3.org/TR/html50/browsers.html#the-window-object
 //
 // TODO: Properly handle viewport resolution change event.
-class Window : public EventTarget,
-               public page_visibility::PageVisibilityState::Observer {
+class Window : public EventTarget, public PageVisibilityState::Observer {
  public:
   typedef AnimationFrameRequestCallbackList::FrameRequestCallback
       FrameRequestCallback;
@@ -132,7 +131,7 @@
 
   Window(
       script::EnvironmentSettings* settings,
-      const cssom::ViewportSize& view_size, float device_pixel_ratio,
+      const cssom::ViewportSize& view_size,
       base::ApplicationState initial_application_state,
       cssom::CSSParser* css_parser, Parser* dom_parser,
       loader::FetcherFactory* fetcher_factory,
@@ -266,7 +265,9 @@
   // The devicePixelRatio attribute returns the ratio of CSS pixels per device
   // pixel.
   //   https://www.w3.org/TR/2013/WD-cssom-view-20131217/#dom-window-devicepixelratio
-  float device_pixel_ratio() const { return device_pixel_ratio_; }
+  float device_pixel_ratio() const {
+    return viewport_size_.device_pixel_ratio();
+  }
 
   // Web API: GlobalCrypto (implements)
   //   https://www.w3.org/TR/WebCryptoAPI/#crypto-interface
@@ -347,7 +348,7 @@
       const SynchronousLayoutAndProduceRenderTreeCallback&
           synchronous_layout_callback);
 
-  void SetSize(cssom::ViewportSize size, float device_pixel_ratio);
+  void SetSize(cssom::ViewportSize size);
 
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
 
@@ -367,10 +368,9 @@
   // Returns whether or not the script was handled.
   bool ReportScriptError(const script::ErrorReport& error_report);
 
-  // page_visibility::PageVisibilityState::Observer implementation.
+  // PageVisibilityState::Observer implementation.
   void OnWindowFocusChanged(bool has_focus) override;
-  void OnVisibilityStateChanged(
-      page_visibility::VisibilityState visibility_state) override;
+  void OnVisibilityStateChanged(VisibilityState visibility_state) override;
 
   // Called when the document's root element has its offset dimensions requested
   // and is unable to provide them.
@@ -425,8 +425,6 @@
 
   cssom::ViewportSize viewport_size_;
 
-  float device_pixel_ratio_;
-
   // A resize event can be pending if a resize occurs and the current visibility
   // state is not visible. In this case, the resize event will run when the
   // visibility state changes to visible.
diff --git a/src/cobalt/dom/window_test.cc b/src/cobalt/dom/window_test.cc
index 9a44ac4..8e44fb0 100644
--- a/src/cobalt/dom/window_test.cc
+++ b/src/cobalt/dom/window_test.cc
@@ -63,12 +63,11 @@
 
     ViewportSize view_size(1920, 1080);
     window_ = new Window(
-        environment_settings_.get(), view_size, 1.f,
-        base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(),
-        fetcher_factory_.get(), NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-        &local_storage_database_, NULL, NULL, NULL, NULL,
-        global_environment_->script_value_factory(), NULL, NULL, url_, "",
-        "en-US", "en", base::Callback<void(const GURL &)>(),
+        environment_settings_.get(), view_size, base::kApplicationStateStarted,
+        css_parser_.get(), dom_parser_.get(), fetcher_factory_.get(), NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, &local_storage_database_, NULL,
+        NULL, NULL, NULL, global_environment_->script_value_factory(), NULL,
+        NULL, url_, "", "en-US", "en", base::Callback<void(const GURL &)>(),
         base::Bind(&MockErrorCallback::Run,
                    base::Unretained(&mock_error_callback_)),
         NULL, network_bridge::PostSender(), csp::kCSPRequired,
diff --git a/src/cobalt/h5vcc/h5vcc.gyp b/src/cobalt/h5vcc/h5vcc.gyp
index ef98694..6486986 100644
--- a/src/cobalt/h5vcc/h5vcc.gyp
+++ b/src/cobalt/h5vcc/h5vcc.gyp
@@ -46,6 +46,8 @@
         'h5vcc_runtime.h',
         'h5vcc_runtime_event_target.cc',
         'h5vcc_runtime_event_target.h',
+        'h5vcc_screen.cc',
+        'h5vcc_screen.h',
         'h5vcc_settings.cc',
         'h5vcc_settings.h',
         'h5vcc_storage.cc',
diff --git a/src/cobalt/h5vcc/h5vcc_crash_log.cc b/src/cobalt/h5vcc/h5vcc_crash_log.cc
index 79f0e20..6eafc6f 100644
--- a/src/cobalt/h5vcc/h5vcc_crash_log.cc
+++ b/src/cobalt/h5vcc/h5vcc_crash_log.cc
@@ -54,7 +54,9 @@
 
  private:
   CrashLogDictionary() : accessing_log_data_(0) {
+#if SB_HAS(CORE_DUMP_HANDLER_SUPPORT)
     SbCoreDumpRegisterHandler(&CoreDumpHandler, this);
+#endif
   }
 
   static void CoreDumpHandler(void* context) {
@@ -64,6 +66,7 @@
   }
 
   void OnCrash() {
+#if SB_HAS(CORE_DUMP_HANDLER_SUPPORT)
     // Check that we're not already updating log data.  If we are, we just
     // give up and skip recording any crash data, but hopefully this is rare.
     if (base::subtle::Acquire_CompareAndSwap(&accessing_log_data_, 0, 1) == 0) {
@@ -73,6 +76,7 @@
       }
       base::subtle::Release_Store(&accessing_log_data_, 0);
     }
+#endif
   }
 
   friend struct base::DefaultSingletonTraits<CrashLogDictionary>;
@@ -100,5 +104,24 @@
   return true;
 }
 
+void H5vccCrashLog::TriggerCrash(H5vccCrashType intent) {
+  if (intent == kH5vccCrashTypeNullDereference) {
+    *(reinterpret_cast<volatile char*>(0)) = 0;
+  }
+  if (intent == kH5vccCrashTypeIllegalInstruction) {
+#if SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)
+    __asm(".word 0xf7f0a000\n");
+#elif !SB_IS(ARCH_X64)  // inline asm not allowed on 64bit MSVC
+    __asm("ud2");
+#endif
+  }
+  if (intent == kH5vccCrashTypeDebugger) {
+    SbSystemBreakIntoDebugger();
+  }
+  if (intent == kH5vccCrashTypeOutOfMemory) {
+    SbMemoryAllocateAligned(128, SIZE_MAX);
+  }
+}
+
 }  // namespace h5vcc
 }  // namespace cobalt
diff --git a/src/cobalt/h5vcc/h5vcc_crash_log.h b/src/cobalt/h5vcc/h5vcc_crash_log.h
index 6ebf85e..1ea13dc 100644
--- a/src/cobalt/h5vcc/h5vcc_crash_log.h
+++ b/src/cobalt/h5vcc/h5vcc_crash_log.h
@@ -17,6 +17,7 @@
 
 #include <string>
 
+#include "cobalt/h5vcc/h5vcc_crash_type.h"
 #include "cobalt/script/wrappable.h"
 
 namespace cobalt {
@@ -28,6 +29,8 @@
 
   bool SetString(const std::string& key, const std::string& value);
 
+  void TriggerCrash(H5vccCrashType intent);
+
   DEFINE_WRAPPABLE_TYPE(H5vccCrashLog);
 
  private:
diff --git a/src/cobalt/h5vcc/h5vcc_crash_log.idl b/src/cobalt/h5vcc/h5vcc_crash_log.idl
index 885c13a..c5df849 100644
--- a/src/cobalt/h5vcc/h5vcc_crash_log.idl
+++ b/src/cobalt/h5vcc/h5vcc_crash_log.idl
@@ -26,4 +26,9 @@
   // if for some reason the string could not be set in the crash log.
   // Sets a (key, value) string pair that should be logged if a crash occurs.
   boolean setString(DOMString key, DOMString value);
+
+  // Induce a crash. This attempts, but does not guarantee, to cause a specified
+  // type of crash. The result may vary by platform. This API is intended for
+  // reliability testing only.
+  void triggerCrash(H5vccCrashType intent);
 };
diff --git a/src/cobalt/h5vcc/h5vcc_crash_type.idl b/src/cobalt/h5vcc/h5vcc_crash_type.idl
new file mode 100644
index 0000000..e9b88e9
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_crash_type.idl
@@ -0,0 +1,21 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Types of crashes available to trigger
+enum H5vccCrashType {
+  "null_dereference",
+  "illegal_instruction",
+  "debugger",
+  "out_of_memory",
+};
diff --git a/src/cobalt/h5vcc/h5vcc_screen.cc b/src/cobalt/h5vcc/h5vcc_screen.cc
new file mode 100644
index 0000000..7d77fa6
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_screen.cc
@@ -0,0 +1,38 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/h5vcc/h5vcc_screen.h"
+
+#include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/window.h"
+
+namespace cobalt {
+namespace h5vcc {
+
+// static
+float H5vccScreen::GetDiagonal(script::EnvironmentSettings* settings) {
+#if SB_API_VERSION >= 11
+  DCHECK(settings);
+  dom::DOMSettings* dom_settings =
+      base::polymorphic_downcast<dom::DOMSettings*>(settings);
+  DCHECK(dom_settings->window());
+  return dom_settings->window()->viewport_diagonal_inches();
+#else   // SB_API_VERSION < 11
+  return 0;
+#endif  // SB_API_VERSION < 11
+}
+
+}  // namespace h5vcc
+}  // namespace cobalt
diff --git a/src/cobalt/h5vcc/h5vcc_screen.h b/src/cobalt/h5vcc/h5vcc_screen.h
new file mode 100644
index 0000000..34ad91d
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_screen.h
@@ -0,0 +1,37 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_H5VCC_H5VCC_SCREEN_H_
+#define COBALT_H5VCC_H5VCC_SCREEN_H_
+
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace h5vcc {
+
+class H5vccScreen : public script::Wrappable {
+ public:
+  static float GetDiagonal(script::EnvironmentSettings* settings);
+
+  DEFINE_WRAPPABLE_TYPE(H5vccScreen);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(H5vccScreen);
+};
+
+}  // namespace h5vcc
+}  // namespace cobalt
+
+#endif  // COBALT_H5VCC_H5VCC_SCREEN_H_
diff --git a/src/cobalt/h5vcc/h5vcc_screen.idl b/src/cobalt/h5vcc/h5vcc_screen.idl
new file mode 100644
index 0000000..a075606
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_screen.idl
@@ -0,0 +1,22 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+interface H5vccScreen {
+  // Return the physical of the screen diagonal in inches.  This returns the
+  // value reported by the platform from SbWindowGetDiagonalSizeInInches().
+  // A return value of 0 means that the platform does not know what the
+  // screen diagonal is.
+  [CallWith=EnvironmentSettings] static float GetDiagonal();
+};
+
diff --git a/src/cobalt/layout/box_generator.cc b/src/cobalt/layout/box_generator.cc
index b2b1d6b..c72355d 100644
--- a/src/cobalt/layout/box_generator.cc
+++ b/src/cobalt/layout/box_generator.cc
@@ -61,11 +61,7 @@
   TRACE_EVENT0("cobalt::layout", "GetVideoFrame()");
   SbDecodeTarget decode_target = frame_provider->GetCurrentSbDecodeTarget();
   if (SbDecodeTargetIsValid(decode_target)) {
-#if SB_HAS(GRAPHICS)
     return resource_provider->CreateImageFromSbDecodeTarget(decode_target);
-#else   // SB_HAS(GRAPHICS)
-    return NULL;
-#endif  // SB_HAS(GRAPHICS)
   } else {
     DCHECK(frame_provider);
     return NULL;
diff --git a/src/cobalt/layout_tests/layout_snapshot.cc b/src/cobalt/layout_tests/layout_snapshot.cc
index 26f8fe5..196247d 100644
--- a/src/cobalt/layout_tests/layout_snapshot.cc
+++ b/src/cobalt/layout_tests/layout_snapshot.cc
@@ -103,7 +103,7 @@
       browser::WebModule::CloseCallback() /* window_close_callback */,
       base::Closure() /* window_minimize_callback */,
       NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
-      &network_module, viewport_size, 1.f, resource_provider, 60.0f,
+      &network_module, viewport_size, resource_provider, 60.0f,
       web_module_options);
 
   run_loop.Run();
diff --git a/src/cobalt/layout_tests/layout_tests.cc b/src/cobalt/layout_tests/layout_tests.cc
index 0464c1b..a0e9eae 100644
--- a/src/cobalt/layout_tests/layout_tests.cc
+++ b/src/cobalt/layout_tests/layout_tests.cc
@@ -355,7 +355,16 @@
 // cases
 INSTANTIATE_TEST_CASE_P(
     IntersectionObserverLayoutTests, Layout,
-    ::testing::ValuesIn(EnumerateLayoutTests("intersection-observer")));
+    ::testing::ValuesIn(EnumerateLayoutTests("intersection-observer")),
+    GetTestName());
+
+// Blitter does not support Skottie.
+#if !SB_HAS(BLITTER)
+// Lottie (https://github.com/LottieFiles/lottie-player) test cases
+INSTANTIATE_TEST_CASE_P(
+    LottiePlayerLayoutTests, Layout,
+    ::testing::ValuesIn(EnumerateLayoutTests("lottie-player")), GetTestName());
+#endif  // !SB_HAS(BLITTER)
 
 // Disable on Windows until network stack is implemented.
 #if !defined(COBALT_WIN)
diff --git a/src/cobalt/layout_tests/testdata/lottie-player/layout_tests.txt b/src/cobalt/layout_tests/testdata/lottie-player/layout_tests.txt
new file mode 100644
index 0000000..204ea51
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/lottie-player/layout_tests.txt
@@ -0,0 +1,2 @@
+lottie-background-attribute
+lottie-playback-events
diff --git a/src/cobalt/layout_tests/testdata/lottie-player/lottie-background-attribute-expected.png b/src/cobalt/layout_tests/testdata/lottie-player/lottie-background-attribute-expected.png
new file mode 100644
index 0000000..de78ec2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/lottie-player/lottie-background-attribute-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/lottie-player/lottie-background-attribute.html b/src/cobalt/layout_tests/testdata/lottie-player/lottie-background-attribute.html
new file mode 100644
index 0000000..dd29701
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/lottie-player/lottie-background-attribute.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<!--
+ | This test checks that we can use the lottie-player's "background" attribute
+ | to set a background color.
+ | https://lottiefiles.github.io/lottie-player/properties.html
+-->
+<html>
+<head>
+  <meta http-equiv="Content-Security-Policy"
+        content="img-src 'self' data:;">
+  <style>
+    #lottie {
+      width:200px;
+      height:200px;
+    }
+  </style>
+</head>
+<body>
+  <lottie-player id="lottie" background="#ff6363"></lottie-player>
+
+  <script>
+    var lottie = document.querySelector('lottie-player');
+    var json = '{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}';
+    lottie.src = 'data:application/json;raw,' + json;
+  </script>
+</body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/lottie-player/lottie-playback-events-expected.png b/src/cobalt/layout_tests/testdata/lottie-player/lottie-playback-events-expected.png
new file mode 100644
index 0000000..6e58dc6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/lottie-player/lottie-playback-events-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/lottie-player/lottie-playback-events.html b/src/cobalt/layout_tests/testdata/lottie-player/lottie-playback-events.html
new file mode 100644
index 0000000..9068ccc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/lottie-player/lottie-playback-events.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<!--
+ | This test checks that Lottie playback events get fired for all possible
+ | scenarios and in the correct order.
+ | https://lottiefiles.github.io/lottie-player/events.html
+-->
+<html>
+<head>
+  <meta http-equiv="Content-Security-Policy"
+        content="img-src 'self' data:;">
+  <style>
+    #lottie {
+      width:200px;
+      height:200px;
+    }
+    #events {
+      color: red;
+      font-size: 25px;
+    }
+  </style>
+</head>
+<body>
+  <lottie-player id="lottie" autoplay></lottie-player>
+  <div id="events"></div>
+
+  <script>
+    if (window.testRunner) {
+      window.testRunner.waitUntilDone();
+    }
+
+    var lottie = document.querySelector('lottie-player');
+    var json = '{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}';
+    lottie.src = 'data:application/json;raw,' + json;
+
+    var events = [];
+    lottie.addEventListener('play', function() {
+      events.push('play');
+    });
+    lottie.addEventListener('pause', function() {
+      events.push('pause');
+    });
+    lottie.addEventListener('stop', function() {
+      events.push('stop');
+    });
+
+    window.addEventListener("load", function() {
+      // Animation was autoplaying, now it is paused.
+      lottie.pause();
+      // Animation is playing.
+      lottie.togglePlay();
+      // Animation is paused.
+      lottie.togglePlay();
+      // Animation is playing.
+      lottie.play();
+      // Animated is stopped.
+      lottie.stop();
+
+      // Events fire asynchronously, so give the test runner enough time
+      // to register all of the events.
+      setTimeout(function() {
+        // events = ['play','pause','play','pause','play','stop']
+        document.getElementById('events').innerHTML = events;
+        if (window.testRunner) {
+          window.testRunner.notifyDone();
+        }
+      }, 1000);
+    });
+  </script>
+</body>
+</html>
diff --git a/src/cobalt/layout_tests/web_platform_tests.cc b/src/cobalt/layout_tests/web_platform_tests.cc
index d0777de..90b82a6 100644
--- a/src/cobalt/layout_tests/web_platform_tests.cc
+++ b/src/cobalt/layout_tests/web_platform_tests.cc
@@ -219,7 +219,7 @@
       browser::WebModule::CloseCallback() /* window_close_callback */,
       base::Closure() /* window_minimize_callback */,
       can_play_type_handler.get(), media_module.get(), &network_module,
-      kDefaultViewportSize, 1.f, &resource_provider, 60.0f, web_module_options);
+      kDefaultViewportSize, &resource_provider, 60.0f, web_module_options);
   run_loop.Run();
   const std::string extract_results =
       "document.getElementById(\"__testharness__results__\").textContent;";
diff --git a/src/cobalt/loader/fetcher_factory.cc b/src/cobalt/loader/fetcher_factory.cc
index 6c0326c..83531c6 100644
--- a/src/cobalt/loader/fetcher_factory.cc
+++ b/src/cobalt/loader/fetcher_factory.cc
@@ -102,7 +102,7 @@
 std::unique_ptr<Fetcher> FetcherFactory::CreateSecureFetcher(
     const GURL& url, const csp::SecurityCallback& url_security_callback,
     RequestMode request_mode, const Origin& origin, Fetcher::Handler* handler) {
-  DLOG(INFO) << "Fetching: " << ClipUrl(url, 80);
+  LOG(INFO) << "Fetching: " << ClipUrl(url, 200);
 
   if (!url.is_valid()) {
     std::stringstream error_message;
diff --git a/src/cobalt/loader/image/image_decoder.cc b/src/cobalt/loader/image/image_decoder.cc
index de6534a..0debb82 100644
--- a/src/cobalt/loader/image/image_decoder.cc
+++ b/src/cobalt/loader/image/image_decoder.cc
@@ -258,7 +258,7 @@
 }
 
 namespace {
-#if SB_HAS(GRAPHICS) && !SB_IS(EVERGREEN)
+
 const char* GetMimeTypeFromImageType(ImageDecoder::ImageType image_type) {
   switch (image_type) {
     case ImageDecoder::kImageTypeJPEG:
@@ -319,7 +319,6 @@
   }
   return std::unique_ptr<ImageDataDecoder>();
 }
-#endif  // SB_HAS(GRAPHICS) && !SB_IS(EVERGREEN)
 
 std::unique_ptr<ImageDataDecoder> CreateImageDecoderFromImageType(
     ImageDecoder::ImageType image_type,
@@ -368,11 +367,8 @@
     image_type_ = DetermineImageType(signature_cache_.data);
   }
 
-// TODO: Remove the EVERGREEN check once the EGL wiring is ready.
-#if SB_HAS(GRAPHICS) && !SB_IS(EVERGREEN)
   decoder_ =
       MaybeCreateStarboardDecoder(mime_type_, image_type_, resource_provider_);
-#endif  // SB_HAS(GRAPHICS) && !SB_IS(EVERGREEN)
 
   if (!decoder_) {
     decoder_ = CreateImageDecoderFromImageType(image_type_, resource_provider_);
diff --git a/src/cobalt/loader/image/image_decoder_starboard.cc b/src/cobalt/loader/image/image_decoder_starboard.cc
index 1fa4205..754e211 100644
--- a/src/cobalt/loader/image/image_decoder_starboard.cc
+++ b/src/cobalt/loader/image/image_decoder_starboard.cc
@@ -23,8 +23,6 @@
 #include "starboard/decode_target.h"
 #include "starboard/image.h"
 
-#if SB_HAS(GRAPHICS)
-
 namespace cobalt {
 namespace loader {
 namespace image {
@@ -73,6 +71,4 @@
 }  // namespace loader
 }  // namespace cobalt
 
-#endif  // SB_HAS(GRAPHICS)
-
-#endif  // #if defined(STARBOARD)
+#endif  // defined(STARBOARD)
diff --git a/src/cobalt/loader/image/image_decoder_starboard.h b/src/cobalt/loader/image/image_decoder_starboard.h
index da48fcc..d1b43e1 100644
--- a/src/cobalt/loader/image/image_decoder_starboard.h
+++ b/src/cobalt/loader/image/image_decoder_starboard.h
@@ -23,8 +23,6 @@
 #include "cobalt/loader/image/image_data_decoder.h"
 #include "starboard/decode_target.h"
 
-#if SB_HAS(GRAPHICS)
-
 namespace cobalt {
 namespace loader {
 namespace image {
@@ -55,6 +53,4 @@
 }  // namespace loader
 }  // namespace cobalt
 
-#endif  // SB_HAS(GRAPHICS)
-
 #endif  // COBALT_LOADER_IMAGE_IMAGE_DECODER_STARBOARD_H_
diff --git a/src/cobalt/loader/image/webp_image_decoder.cc b/src/cobalt/loader/image/webp_image_decoder.cc
index c0a4000..aafddaf 100644
--- a/src/cobalt/loader/image/webp_image_decoder.cc
+++ b/src/cobalt/loader/image/webp_image_decoder.cc
@@ -183,13 +183,7 @@
   config_.output.u.RGBA.stride = image_data_descriptor.pitch_in_bytes;
   config_.output.u.RGBA.size = image_data_descriptor.pitch_in_bytes *
                                image_data_descriptor.size.height();
-#if SB_HAS_QUIRK(GL_MAP_BUFFER_MEMORY_IS_SLOW_TO_READ)
-  // The webp decoder will allocate a main memory output buffer if it has to
-  // read from the output buffer.
-  config_.output.is_external_memory = 2;
-#else   // SB_HAS_QUIRK(GL_MAP_BUFFER_MEMORY_IS_SLOW_TO_READ)
   config_.output.is_external_memory = 1;
-#endif  // SB_HAS_QUIRK(GL_MAP_BUFFER_MEMORY_IS_SLOW_TO_READ)
   // Instantiate a new incremental decoder object with the requested
   // configuration.
   internal_decoder_ = WebPIDecode(NULL, 0, &config_);
diff --git a/src/cobalt/media/base/playback_statistics.cc b/src/cobalt/media/base/playback_statistics.cc
index 24ca1b8..00832ca 100644
--- a/src/cobalt/media/base/playback_statistics.cc
+++ b/src/cobalt/media/base/playback_statistics.cc
@@ -15,7 +15,7 @@
 #include "cobalt/media/base/playback_statistics.h"
 
 #include "starboard/atomic.h"
-#include "starboard/format_string.h"
+#include "starboard/common/format_string.h"
 
 namespace cobalt {
 namespace media {
diff --git a/src/cobalt/media/media_module.h b/src/cobalt/media/media_module.h
index c99ab8a..c4222ba 100644
--- a/src/cobalt/media/media_module.h
+++ b/src/cobalt/media/media_module.h
@@ -88,11 +88,7 @@
 
   SbDecodeTargetGraphicsContextProvider*
   GetSbDecodeTargetGraphicsContextProvider() {
-#if SB_HAS(GRAPHICS)
     return resource_provider_->GetSbDecodeTargetGraphicsContextProvider();
-#else   // SB_HAS(GRAPHICS)
-    return NULL;
-#endif  // SB_HAS(GRAPHICS)
   }
 
   // When the value of a particular player is true, it means the player is
diff --git a/src/cobalt/media/sandbox/web_media_player_sandbox.cc b/src/cobalt/media/sandbox/web_media_player_sandbox.cc
index 417b5ac..c947020 100644
--- a/src/cobalt/media/sandbox/web_media_player_sandbox.cc
+++ b/src/cobalt/media/sandbox/web_media_player_sandbox.cc
@@ -340,7 +340,6 @@
   }
 
   scoped_refptr<Image> FrameCB(const base::TimeDelta& time) {
-#if SB_HAS(GRAPHICS)
     SbDecodeTarget decode_target = player_helper_->GetCurrentDecodeTarget();
 
     if (SbDecodeTargetIsValid(decode_target)) {
@@ -348,9 +347,6 @@
           decode_target);
     }
     return NULL;
-#else   // SB_HAS(GRAPHICS)
-    return NULL;
-#endif  // SB_HAS(GRAPHICS)
   }
 
   const std::string kAudioId = "audio";
diff --git a/src/cobalt/page_visibility/page_visibility.gyp b/src/cobalt/page_visibility/page_visibility.gyp
deleted file mode 100644
index 4d85443..0000000
--- a/src/cobalt/page_visibility/page_visibility.gyp
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'page_visibility',
-      'type': 'static_library',
-      'sources': [
-        'page_visibility_state.cc',
-        'page_visibility_state.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-      # This target doesn't generate any headers, but it exposes generated
-      # header files through this module's public header files. So mark this
-      # target as a hard dependency to ensure that any dependent targets wait
-      # until this target (and its hard dependencies) are built.
-      'hard_dependency': 1,
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ]
-    },
-    {
-      'target_name': 'page_visibility_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'page_visibility_state_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'page_visibility',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'page_visibility_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'page_visibility_test',
-      ],
-      'variables': {
-        'executable_name': 'page_visibility_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/src/cobalt/page_visibility/page_visibility_state.cc b/src/cobalt/page_visibility/page_visibility_state.cc
deleted file mode 100644
index 17c16d0..0000000
--- a/src/cobalt/page_visibility/page_visibility_state.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/page_visibility/page_visibility_state.h"
-
-#include "base/strings/stringprintf.h"
-#include "base/trace_event/trace_event.h"
-
-namespace cobalt {
-namespace page_visibility {
-
-#define STATE_STRING(state)                                             \
-  base::StringPrintf("%s (%d)", base::GetApplicationStateString(state), \
-                     static_cast<int>(state))
-
-namespace {
-// Converts an ApplicationState to a VisibilityState.
-VisibilityState ToVisibilityState(base::ApplicationState state) {
-  switch (state) {
-    case base::kApplicationStatePreloading:
-      return kVisibilityStatePrerender;
-    case base::kApplicationStateStarted:
-    case base::kApplicationStatePaused:
-      return kVisibilityStateVisible;
-    case base::kApplicationStateSuspended:
-    case base::kApplicationStateStopped:
-      return kVisibilityStateHidden;
-    default:
-      NOTREACHED() << "Invalid Application State: " << STATE_STRING(state);
-      return kVisibilityStateHidden;
-  }
-}
-
-bool HasFocus(base::ApplicationState state) {
-  switch (state) {
-    case base::kApplicationStateStarted:
-      return true;
-    case base::kApplicationStatePreloading:
-    case base::kApplicationStatePaused:
-    case base::kApplicationStateSuspended:
-    case base::kApplicationStateStopped:
-      return false;
-    default:
-      NOTREACHED() << "Invalid Application State: " << STATE_STRING(state);
-      return false;
-  }
-}
-}  // namespace
-
-PageVisibilityState::PageVisibilityState()
-    : application_state_(base::kApplicationStateStarted) {
-  DLOG(INFO) << __FUNCTION__
-             << ": app_state=" << STATE_STRING(application_state_);
-}
-
-PageVisibilityState::PageVisibilityState(
-    base::ApplicationState initial_application_state)
-    : application_state_(initial_application_state) {
-  DLOG(INFO) << __FUNCTION__
-             << ": app_state=" << STATE_STRING(application_state_);
-  DCHECK((application_state_ == base::kApplicationStateStarted) ||
-         (application_state_ == base::kApplicationStatePreloading) ||
-         (application_state_ == base::kApplicationStatePaused))
-      << "application_state_=" << STATE_STRING(application_state_);
-}
-
-bool PageVisibilityState::HasWindowFocus() const {
-  return HasFocus(application_state());
-}
-
-VisibilityState PageVisibilityState::GetVisibilityState() const {
-  return ToVisibilityState(application_state());
-}
-
-void PageVisibilityState::SetApplicationState(base::ApplicationState state) {
-  TRACE_EVENT1("cobalt::page_visibility",
-               "PageVisibilityState::SetApplicationState", "state",
-               STATE_STRING(state));
-  if (application_state_ == state) {
-    DLOG(WARNING) << __FUNCTION__ << ": Attempt to re-enter "
-                  << STATE_STRING(application_state_);
-    return;
-  }
-
-  // Audit that the transitions are correct.
-  if (DLOG_IS_ON(FATAL)) {
-    switch (application_state_) {
-      case base::kApplicationStatePaused:
-        DCHECK(state == base::kApplicationStateSuspended ||
-               state == base::kApplicationStateStarted)
-            << ": application_state_=" << STATE_STRING(application_state_)
-            << ", state=" << STATE_STRING(state);
-
-        break;
-      case base::kApplicationStatePreloading:
-        DCHECK(state == base::kApplicationStateSuspended ||
-               state == base::kApplicationStateStarted)
-            << ": application_state_=" << STATE_STRING(application_state_)
-            << ", state=" << STATE_STRING(state);
-        break;
-      case base::kApplicationStateStarted:
-        DCHECK(state == base::kApplicationStatePaused)
-            << ": application_state_=" << STATE_STRING(application_state_)
-            << ", state=" << STATE_STRING(state);
-        break;
-      case base::kApplicationStateStopped:
-        DCHECK(state == base::kApplicationStatePreloading ||
-               state == base::kApplicationStateStarted)
-            << ": application_state_=" << STATE_STRING(application_state_)
-            << ", state=" << STATE_STRING(state);
-        break;
-      case base::kApplicationStateSuspended:
-        DCHECK(state == base::kApplicationStatePaused ||
-               state == base::kApplicationStateStopped)
-            << ": application_state_=" << STATE_STRING(application_state_)
-            << ", state=" << STATE_STRING(state);
-        break;
-      default:
-        NOTREACHED() << ": application_state_="
-                     << STATE_STRING(application_state_)
-                     << ", state=" << STATE_STRING(state);
-
-        break;
-    }
-  }
-
-  bool old_has_focus = HasFocus(application_state_);
-  VisibilityState old_visibility_state = ToVisibilityState(application_state_);
-  DLOG(INFO) << __FUNCTION__ << ": " << STATE_STRING(application_state_)
-             << " -> " << STATE_STRING(state);
-  application_state_ = state;
-  bool has_focus = HasFocus(application_state_);
-  VisibilityState visibility_state = ToVisibilityState(application_state_);
-  bool focus_changed = has_focus != old_has_focus;
-  bool visibility_state_changed = visibility_state != old_visibility_state;
-
-  if (focus_changed && has_focus) {
-    // If going to a focused state, dispatch the visibility state first.
-    if (visibility_state_changed) {
-      DispatchVisibilityStateChanged(visibility_state);
-    }
-
-    DispatchWindowFocusChanged(has_focus);
-    return;
-  }
-
-  // Otherwise, we should dispatch the focus state first.
-  if (focus_changed) {
-    DispatchWindowFocusChanged(has_focus);
-  }
-
-  if (visibility_state_changed) {
-    DispatchVisibilityStateChanged(visibility_state);
-  }
-}
-
-void PageVisibilityState::DispatchWindowFocusChanged(bool has_focus) {
-  FOR_EACH_OBSERVER(Observer, observer_list_, OnWindowFocusChanged(has_focus));
-}
-
-void PageVisibilityState::DispatchVisibilityStateChanged(
-    VisibilityState visibility_state) {
-  FOR_EACH_OBSERVER(Observer, observer_list_,
-                    OnVisibilityStateChanged(visibility_state));
-}
-
-}  // namespace page_visibility
-}  // namespace cobalt
diff --git a/src/cobalt/page_visibility/page_visibility_state.h b/src/cobalt/page_visibility/page_visibility_state.h
deleted file mode 100644
index 393ea8c..0000000
--- a/src/cobalt/page_visibility/page_visibility_state.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_PAGE_VISIBILITY_PAGE_VISIBILITY_STATE_H_
-#define COBALT_PAGE_VISIBILITY_PAGE_VISIBILITY_STATE_H_
-
-#include "base/observer_list.h"
-#include "cobalt/base/application_state.h"
-#include "cobalt/page_visibility/visibility_state.h"
-
-namespace cobalt {
-namespace page_visibility {
-
-// The visibility state of the Window and Document as controlled by the current
-// application state.
-class PageVisibilityState {
- public:
-  // Pure virtual interface for classes that want to observe page visibility
-  // state changes.
-  class Observer : public base::CheckedObserver {
-   public:
-    // Called when the window focus state changes.
-    virtual void OnWindowFocusChanged(bool has_focus) = 0;
-    // Called when the VisibilityState changes.
-    virtual void OnVisibilityStateChanged(VisibilityState visibility_state) = 0;
-
-   protected:
-    virtual ~Observer() {}
-  };
-
-  PageVisibilityState();
-  explicit PageVisibilityState(
-      base::ApplicationState initial_application_state);
-
-  base::ApplicationState application_state() const {
-    return application_state_;
-  }
-
-  // Whether the current window has focus based on the current application
-  // state.
-  bool HasWindowFocus() const;
-
-  // Whether the current window has focus based on the current application
-  // state.
-  VisibilityState GetVisibilityState() const;
-
-  // Sets the current application state, and dispatches appropriate observation
-  // events.
-  void SetApplicationState(base::ApplicationState state);
-
-  // Adds a PageVisibiltyState::Observer to this PageVisibilityState.
-  void AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
-
-  // Removes a PageVisibiltyState::Observer from this PageVisibilityState, if it
-  // is registered.
-  void RemoveObserver(Observer* observer) {
-    observer_list_.RemoveObserver(observer);
-  }
-
-  // Returns whether a PageVisibiltyState::Observer is registered on this
-  // PageVisibilityState.
-  bool HasObserver(Observer* observer) const {
-    return observer_list_.HasObserver(observer);
-  }
-
-  // Clears all registered PageVisibiltyState::Observers, if any.
-  void ClearObservers() { observer_list_.Clear(); }
-
- private:
-  void DispatchWindowFocusChanged(bool has_focus);
-  void DispatchVisibilityStateChanged(VisibilityState visibility_state);
-
-  // The current application state.
-  base::ApplicationState application_state_;
-
-  // The list of registered PageVisibiltyState::Observers;
-  base::ObserverList<Observer> observer_list_;
-};
-
-}  // namespace page_visibility
-}  // namespace cobalt
-
-#endif  // COBALT_PAGE_VISIBILITY_PAGE_VISIBILITY_STATE_H_
diff --git a/src/cobalt/page_visibility/page_visibility_state_test.cc b/src/cobalt/page_visibility/page_visibility_state_test.cc
deleted file mode 100644
index cde7e69..0000000
--- a/src/cobalt/page_visibility/page_visibility_state_test.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <memory>
-
-#include "cobalt/page_visibility/page_visibility_state.h"
-
-#include "base/debug/stack_trace.h"
-#include "base/logging.h"
-#include "cobalt/base/application_state.h"
-#include "cobalt/page_visibility/visibility_state.h"
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace page_visibility {
-namespace {
-
-using ::testing::_;
-
-class MockPageVisibilityStateObserver : public PageVisibilityState::Observer {
- public:
-  static std::unique_ptr<MockPageVisibilityStateObserver> Create() {
-    return std::unique_ptr<MockPageVisibilityStateObserver>(
-        new ::testing::StrictMock<MockPageVisibilityStateObserver>());
-  }
-
-  MOCK_METHOD1(OnWindowFocusChanged, void(bool has_focus));
-  MOCK_METHOD1(OnVisibilityStateChanged,
-               void(VisibilityState visibility_state));
-
- protected:
-  MockPageVisibilityStateObserver() {}
-};
-
-TEST(PageVisibilityStateTest, DefaultConstructor) {
-  PageVisibilityState state;
-  EXPECT_TRUE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-}
-
-TEST(PageVisibilityStateTest, InitialStateConstructorStarted) {
-  PageVisibilityState state(base::kApplicationStateStarted);
-  EXPECT_TRUE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-}
-
-TEST(PageVisibilityStateTest, TransitionsAndObservations) {
-  PageVisibilityState state(base::kApplicationStateStarted);
-  std::unique_ptr<MockPageVisibilityStateObserver> observer =
-      MockPageVisibilityStateObserver::Create();
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  EXPECT_TRUE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  state.AddObserver(observer.get());
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(false));
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStatePaused);
-  EXPECT_FALSE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(true));
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStateStarted);
-  EXPECT_TRUE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(false));
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStatePaused);
-  EXPECT_FALSE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(kVisibilityStateHidden));
-  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStateSuspended);
-  EXPECT_FALSE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateHidden, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(kVisibilityStateVisible));
-  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStatePaused);
-  EXPECT_FALSE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(true));
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStateStarted);
-  EXPECT_TRUE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  state.RemoveObserver(observer.get());
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStatePaused);
-  EXPECT_FALSE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-
-  EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
-  EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
-  state.SetApplicationState(base::kApplicationStateSuspended);
-  EXPECT_FALSE(state.HasWindowFocus());
-  EXPECT_EQ(kVisibilityStateHidden, state.GetVisibilityState());
-  ::testing::Mock::VerifyAndClearExpectations(observer.get());
-}
-
-}  // namespace
-}  // namespace page_visibility
-}  // namespace cobalt
diff --git a/src/cobalt/render_tree/lottie_animation.h b/src/cobalt/render_tree/lottie_animation.h
index 8b1a771..9cab513 100644
--- a/src/cobalt/render_tree/lottie_animation.h
+++ b/src/cobalt/render_tree/lottie_animation.h
@@ -198,6 +198,7 @@
     base::Closure onstop_callback;
     base::Closure oncomplete_callback;
     base::Closure onloop_callback;
+    base::Callback<void(double, double)> onenterframe_callback;
   };
 
   virtual void SetProperties(LottieProperties properties) = 0;
diff --git a/src/cobalt/render_tree/mock_resource_provider.h b/src/cobalt/render_tree/mock_resource_provider.h
index c17df9b..244d695 100644
--- a/src/cobalt/render_tree/mock_resource_provider.h
+++ b/src/cobalt/render_tree/mock_resource_provider.h
@@ -103,8 +103,6 @@
     return scoped_refptr<Image>(CreateImageMock(pixel_data.get()));
   }
 
-#if SB_HAS(GRAPHICS)
-
   scoped_refptr<Image> CreateImageFromSbDecodeTarget(SbDecodeTarget target) {
     return NULL;
   }
@@ -116,8 +114,6 @@
     return NULL;
   }
 
-#endif  // SB_HAS(GRAPHICS)
-
   std::unique_ptr<RawImageMemory> AllocateRawImageMemory(size_t size_in_bytes,
                                                          size_t alignment) {
     return std::unique_ptr<RawImageMemory>(
diff --git a/src/cobalt/render_tree/resource_provider.h b/src/cobalt/render_tree/resource_provider.h
index 8820eed..af51209 100644
--- a/src/cobalt/render_tree/resource_provider.h
+++ b/src/cobalt/render_tree/resource_provider.h
@@ -79,7 +79,6 @@
   virtual scoped_refptr<Image> CreateImage(
       std::unique_ptr<ImageData> pixel_data) = 0;
 
-#if SB_HAS(GRAPHICS)
   // This function will consume an SbDecodeTarget object produced by
   // SbDecodeTargetCreate(), wrap it in a render_tree::Image that can be used
   // in a render tree, and return it to the caller.
@@ -94,7 +93,6 @@
   // supported.
   virtual SbDecodeTargetGraphicsContextProvider*
   GetSbDecodeTargetGraphicsContextProvider() = 0;
-#endif  // SB_HAS(GRAPHICS)
 
   // Returns a raw chunk of memory that can later be passed into a function like
   // CreateMultiPlaneImageFromRawMemory() in order to create a texture.
diff --git a/src/cobalt/render_tree/resource_provider_stub.h b/src/cobalt/render_tree/resource_provider_stub.h
index bd1a72b..961b59b 100644
--- a/src/cobalt/render_tree/resource_provider_stub.h
+++ b/src/cobalt/render_tree/resource_provider_stub.h
@@ -282,7 +282,6 @@
     return base::WrapRefCounted(new ImageStub(std::move(skia_source_data)));
   }
 
-#if SB_HAS(GRAPHICS)
   scoped_refptr<Image> CreateImageFromSbDecodeTarget(
       SbDecodeTarget decode_target) override {
     NOTREACHED();
@@ -291,14 +290,11 @@
   }
 
   bool SupportsSbDecodeTarget() override { return false; }
-#endif  // SB_HAS(GRAPHICS)
 
-#if SB_HAS(GRAPHICS)
   SbDecodeTargetGraphicsContextProvider*
   GetSbDecodeTargetGraphicsContextProvider() override {
     return NULL;
   }
-#endif  // SB_HAS(GRAPHICS)
 
   std::unique_ptr<RawImageMemory> AllocateRawImageMemory(
       size_t size_in_bytes, size_t alignment) override {
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
index c58628d..83d2baf 100644
--- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
@@ -84,8 +84,6 @@
       new SinglePlaneImage(std::move(blitter_source_data)));
 }
 
-#if SB_HAS(GRAPHICS)
-
 scoped_refptr<render_tree::Image>
 ResourceProvider::CreateImageFromSbDecodeTarget(SbDecodeTarget decode_target) {
   SbDecodeTargetInfo info;
@@ -114,8 +112,6 @@
   return NULL;
 }
 
-#endif  // SB_HAS(GRAPHICS)
-
 std::unique_ptr<render_tree::RawImageMemory>
 ResourceProvider::AllocateRawImageMemory(size_t size_in_bytes,
                                          size_t alignment) {
diff --git a/src/cobalt/renderer/rasterizer/pixel_test.cc b/src/cobalt/renderer/rasterizer/pixel_test.cc
index 90ee177..55ab832 100644
--- a/src/cobalt/renderer/rasterizer/pixel_test.cc
+++ b/src/cobalt/renderer/rasterizer/pixel_test.cc
@@ -1496,6 +1496,23 @@
 
   TestTree(new ImageNode(image, math::Rect(output_surface_size())));
 }
+
+TEST_F(PixelTest, YUV422UYVYImageScaledAndTranslated) {
+  if (!GetResourceProvider()->PixelFormatSupported(
+          render_tree::kPixelFormatUYVY)) {
+    return;
+  }
+
+  // Use a particular image format to force textured mesh renderer path
+  // (i.e. Image::CanRenderInSkia() == false).
+  scoped_refptr<Image> image =
+      MakeAlternatingYUYVYImage(GetResourceProvider(), output_surface_size());
+
+  TestTree(new ImageNode(image, RectF(image->GetSize()),
+                         Matrix3F::FromValues(2.0f, 0.0f, -1.0f,
+                                              0.0f, 2.0f, -1.0f,
+                                              0.0f, 0.0f, 1.0f)));
+}
 #endif  // !SB_HAS(BLITTER)
 
 // The software rasterizer does not support NV12 images.
@@ -1546,6 +1563,16 @@
                          TranslateMatrix(0.5f, 0.5f)));
 }
 
+TEST_F(PixelTest, ImageNodeLocalTransformScaleAndTranslation) {
+  scoped_refptr<Image> image =
+      CreateColoredCheckersImage(GetResourceProvider(), output_surface_size());
+
+  TestTree(new ImageNode(image, RectF(image->GetSize()),
+                         Matrix3F::FromValues(2.0f, 0.0f, -1.0f,
+                                              0.0f, 2.0f, -1.0f,
+                                              0.0f, 0.0f, 1.0f)));
+}
+
 TEST_F(PixelTest, ImageNodeLocalTransformOfImageSmallerThanSurface) {
   scoped_refptr<Image> image =
       CreateColoredCheckersImage(GetResourceProvider(),
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc b/src/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
index 49abfc1..8064da1 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
@@ -303,7 +303,7 @@
     // y-axis before passing it on to a GL renderer.
     math::Size image_size(image->GetSize());
     result.content_region = math::Rect::RoundFromRectF(math::RectF(
-        image_size.width() * local_transform.Get(0, 2) /
+        -image_size.width() * local_transform.Get(0, 2) /
             local_transform.Get(0, 0),
         image_size.height() *
             (1 + local_transform.Get(1, 2) / local_transform.Get(1, 1)),
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
index 71ca3b8..fa0748f 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
+
 #if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/skia/hardware_resource_provider.h"
@@ -64,7 +65,6 @@
   // Initialize the font manager now to ensure that it doesn't get initialized
   // on multiple threads simultaneously later.
   SkFontMgr::RefDefault();
-#if SB_HAS(GRAPHICS)
   decode_target_graphics_context_provider_.egl_display =
       cobalt_context_->system_egl()->GetDisplay();
   decode_target_graphics_context_provider_.egl_context =
@@ -72,7 +72,6 @@
   decode_target_graphics_context_provider_.gles_context_runner =
       &HardwareResourceProvider::GraphicsContextRunner;
   decode_target_graphics_context_provider_.gles_context_runner_context = this;
-#endif  // SB_HAS(GRAPHICS)
 }
 
 HardwareResourceProvider::~HardwareResourceProvider() {
@@ -162,7 +161,6 @@
       self_message_loop_));
 }
 
-#if SB_HAS(GRAPHICS)
 namespace {
 
 uint32_t DecodeTargetFormatToGLFormat(
@@ -377,8 +375,6 @@
   }
 }
 
-#endif  // SB_HAS(GRAPHICS)
-
 std::unique_ptr<RawImageMemory>
 HardwareResourceProvider::AllocateRawImageMemory(size_t size_in_bytes,
                                                  size_t alignment) {
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
index b5d71c2..63d4e5e 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
@@ -60,8 +60,6 @@
   scoped_refptr<render_tree::Image> CreateImage(
       std::unique_ptr<render_tree::ImageData> pixel_data) override;
 
-#if SB_HAS(GRAPHICS)
-
   scoped_refptr<render_tree::Image> CreateImageFromSbDecodeTarget(
       SbDecodeTarget decode_target) override;
 
@@ -75,8 +73,6 @@
   // Whether SbDecodeTargetIsSupported or not.
   bool SupportsSbDecodeTarget() override { return true; }
 
-#endif  // SB_HAS(GRAPHICS)
-
   std::unique_ptr<render_tree::RawImageMemory> AllocateRawImageMemory(
       size_t size_in_bytes, size_t alignment) override;
 
@@ -137,7 +133,6 @@
   TextShaper text_shaper_;
   int max_texture_size_;
 
-#if SB_HAS(GRAPHICS)
   static void GraphicsContextRunner(
       SbDecodeTargetGraphicsContextProvider* graphics_context_provider,
       SbDecodeTargetGlesContextRunnerTarget target_function,
@@ -145,7 +140,6 @@
 
   SbDecodeTargetGraphicsContextProvider
       decode_target_graphics_context_provider_;
-#endif  // SB_HAS(GRAPHICS)
 
   // We keep a handle to the message loop that this resource provider was
   // created on.  This message loop is used whenever we need to issue graphics
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h b/src/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h
index 9ba2a14..34dc4fc 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h
@@ -260,12 +260,6 @@
 
 // GrGLConfig.h settings customization for Cobalt.
 
-#if defined(STARBOARD)
-#if SB_HAS_QUIRK(GL_NO_CONSTANT_ATTRIBUTE_SUPPORT)
-#define GR_GL_NO_CONSTANT_ATTRIBUTES 1
-#endif // SB_HAS_QUIRK(GL_NO_CONSTANT_ATTRIBUTE_SUPPORT)
-#endif // defined(STARBOARD)
-
 // Avoid calling glGetError() after glTexImage, glBufferData,
 // glRenderbufferStorage, etc...  It can be potentially expensive to call on
 // some platforms, and Cobalt is designed for devices where we can ensure we
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/skia.gyp b/src/cobalt/renderer/rasterizer/skia/skia/skia.gyp
index 091f7bd..dfefca6 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/skia.gyp
+++ b/src/cobalt/renderer/rasterizer/skia/skia/skia.gyp
@@ -27,6 +27,9 @@
       # Skia's core code from the Skia repository.
       'target_name': 'skia_library',
       'type': 'static_library',
+      'dependencies': [
+        'skia_library_no_asan',
+      ],
       'includes': [
         'skia_common.gypi',
         'skia_library.gypi',
@@ -35,6 +38,28 @@
     },
 
     {
+      # Skia's core code from the Skia repository that should be compiled
+      # without ASAN. This is done to avoid drastic slowdown in debug unit
+      # tests.
+      'target_name': 'skia_library_no_asan',
+      'type': 'static_library',
+      'includes': [
+        'skia_common.gypi',
+        '<(DEPTH)/third_party/skia/gyp/effects_imagefilters.gypi',
+      ],
+      'sources': [
+        '<@(skia_effects_imagefilter_sources_no_asan)',
+      ],
+      'target_conditions': [
+        ['use_asan==1 and cobalt_config=="debug"', {
+          'cflags!': [
+            '-fsanitize=address',
+          ],
+        }],
+      ],
+    },
+
+    {
       # A small program imported from Chromium that tests Skia with fuzzed
       # filters.
       'target_name': 'filter_fuzz_stub',
diff --git a/src/cobalt/renderer/rasterizer/skia/skottie_animation.cc b/src/cobalt/renderer/rasterizer/skia/skottie_animation.cc
index 866c39f..71af29e 100644
--- a/src/cobalt/renderer/rasterizer/skia/skottie_animation.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skottie_animation.cc
@@ -14,12 +14,15 @@
 
 #include "cobalt/renderer/rasterizer/skia/skottie_animation.h"
 
+#include "base/bind.h"
+
 namespace cobalt {
 namespace renderer {
 namespace rasterizer {
 namespace skia {
 
-SkottieAnimation::SkottieAnimation(const char* data, size_t length) {
+SkottieAnimation::SkottieAnimation(const char* data, size_t length)
+    : last_updated_animation_time_(base::TimeDelta()) {
   skottie::Animation::Builder builder;
   skottie_animation_ = builder.make(data, length);
   animation_size_ = math::Size(skottie_animation_->size().width(),
@@ -35,53 +38,62 @@
   // Seeking to a particular frame takes precedence over normal playback.
   // Check whether "seek()" has been called but has yet to occur.
   if (seek_counter_ != properties_.seek_counter) {
+    base::TimeDelta current_animation_time;
     if (properties_.seek_value_is_frame) {
       skottie_animation_->seekFrame(properties_.seek_value);
-      current_animation_time_ = base::TimeDelta::FromSecondsD(
-          properties_.seek_value * skottie_animation_->fps() *
-          skottie_animation_->duration());
+      current_animation_time = base::TimeDelta::FromSecondsD(
+          properties_.seek_value / skottie_animation_->fps());
     } else {
       skottie_animation_->seekFrameTime(properties_.seek_value *
                                         skottie_animation_->duration());
-      current_animation_time_ = base::TimeDelta::FromSecondsD(
+      current_animation_time = base::TimeDelta::FromSecondsD(
           properties_.seek_value * skottie_animation_->duration());
     }
-    last_updated_animate_function_time_ = animate_function_time;
     seek_counter_ = properties_.seek_counter;
     is_complete_ = false;
+    UpdateAnimationFrameAndAnimateFunctionTimes(current_animation_time,
+                                                animate_function_time);
     return;
   }
 
-  // Reset |current_animation_time| to the start of the animation if the
-  // animation is stopped.
+  // Reset the animation time to the start of the animation if the animation is
+  // stopped.
   if (properties_.state == LottieState::kStopped) {
     skottie_animation_->seekFrameTime(0);
-    current_animation_time_ = base::TimeDelta();
-    last_updated_animate_function_time_ = animate_function_time;
     is_complete_ = false;
+    UpdateAnimationFrameAndAnimateFunctionTimes(base::TimeDelta(),
+                                                animate_function_time);
     return;
   }
 
-  // Update |current_animation_time_| if the animation is playing.
-  if (properties_.state == LottieState::kPlaying) {
-    base::TimeDelta time_elapsed =
-        animate_function_time - last_updated_animate_function_time_;
-    current_animation_time_ += time_elapsed * properties_.speed;
+  // Do not update the animation time is the animation is paused.
+  if (properties_.state == LottieState::kPaused) {
+    skottie_animation_->seekFrameTime(
+        last_updated_animation_time_.InSecondsF());
+    UpdateAnimationFrameAndAnimateFunctionTimes(last_updated_animation_time_,
+                                                animate_function_time);
+    return;
   }
 
-  double current_frame_time = current_animation_time_.InSecondsF();
+  DCHECK(properties_.state == LottieState::kPlaying);
+  base::TimeDelta current_animation_time = last_updated_animation_time_;
+  base::TimeDelta time_elapsed =
+      animate_function_time - last_updated_animate_function_time_;
+  current_animation_time += time_elapsed * properties_.speed;
+  base::TimeDelta animation_duration =
+      base::TimeDelta::FromSecondsD(skottie_animation_->duration());
+
   if (properties_.loop) {
     // If the animation mode is "bounce", then the animation should change
     // the direction in which it plays after each loop.
-    int new_loop_count =
-        floor(current_frame_time / skottie_animation_->duration());
+    int new_loop_count = floor(current_animation_time / animation_duration);
 
     // Check whether the number of loops exceeds the limits set by
     // LottieProperties::count.
     // (Note: LottieProperties::count refers to the number of loops after the
     // animation plays once through.)
     if (properties_.count > 0 && new_loop_count > properties_.count) {
-      current_frame_time = skottie_animation_->duration();
+      current_animation_time = animation_duration;
     } else {
       // If the animation should continue playing, check whether the animation
       // has completed and needs to trigger a "loop" and potentially reverse
@@ -94,21 +106,47 @@
           direction_ *= -1;
         }
       }
-      current_frame_time =
-          std::fmod(current_frame_time, skottie_animation_->duration());
+      current_animation_time = base::TimeDelta::FromSecondsD(
+          std::fmod(current_animation_time.InSecondsF(),
+                    animation_duration.InSecondsF()));
     }
     total_loops_ = new_loop_count;
   }
+
   if (direction_ * properties_.direction == -1) {
-    current_frame_time = skottie_animation_->duration() - current_frame_time;
+    current_animation_time = animation_duration - current_animation_time;
   }
-  if (!is_complete_ && current_frame_time > skottie_animation_->duration() &&
+
+  if (!is_complete_ && current_animation_time > animation_duration &&
       !properties_.oncomplete_callback.is_null()) {
     is_complete_ = true;
     properties_.oncomplete_callback.Run();
   }
-  skottie_animation_->seekFrameTime(current_frame_time);
-  last_updated_animate_function_time_ = animate_function_time;
+
+  skottie_animation_->seekFrameTime(current_animation_time.InSecondsF());
+  UpdateAnimationFrameAndAnimateFunctionTimes(current_animation_time,
+                                              animate_function_time);
+}
+
+void SkottieAnimation::UpdateAnimationFrameAndAnimateFunctionTimes(
+    base::TimeDelta current_animation_time,
+    base::TimeDelta current_animate_function_time) {
+  if (current_animation_time == last_updated_animation_time_) {
+    return;
+  }
+
+  // Dispatch a frame event every time a new frame is entered, and if the
+  // animation is not complete.
+  double frame =
+      current_animation_time.InSecondsF() * skottie_animation_->fps();
+  double seeker = current_animation_time.InSecondsF() /
+                  skottie_animation_->duration() * 100;
+  if (!properties_.onenterframe_callback.is_null() && !is_complete_) {
+    properties_.onenterframe_callback.Run(frame, seeker);
+  }
+
+  last_updated_animation_time_ = current_animation_time;
+  last_updated_animate_function_time_ = current_animate_function_time;
 }
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/skottie_animation.h b/src/cobalt/renderer/rasterizer/skia/skottie_animation.h
index 3606a90..f6cd6eb 100644
--- a/src/cobalt/renderer/rasterizer/skia/skottie_animation.h
+++ b/src/cobalt/renderer/rasterizer/skia/skottie_animation.h
@@ -44,6 +44,10 @@
   sk_sp<skottie::Animation> GetSkottieAnimation() { return skottie_animation_; }
 
  private:
+  void UpdateAnimationFrameAndAnimateFunctionTimes(
+      base::TimeDelta current_animation_time,
+      base::TimeDelta current_animate_function_time);
+
   sk_sp<skottie::Animation> skottie_animation_;
   math::Size animation_size_;
   uint32 json_size_in_bytes_;
@@ -77,7 +81,7 @@
   base::TimeDelta last_updated_animate_function_time_;
 
   // The most recently updated frame time for |skottie_animation_|.
-  base::TimeDelta current_animation_time_;
+  base::TimeDelta last_updated_animation_time_;
 };
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
index c906967..68d06ff 100644
--- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
@@ -51,7 +51,6 @@
   scoped_refptr<render_tree::Image> CreateImage(
       std::unique_ptr<render_tree::ImageData> pixel_data) override;
 
-#if SB_HAS(GRAPHICS)
   scoped_refptr<render_tree::Image> CreateImageFromSbDecodeTarget(
       SbDecodeTarget decode_target) override {
     NOTREACHED();
@@ -65,7 +64,6 @@
   }
 
   bool SupportsSbDecodeTarget() override { return false; }
-#endif  // SB_HAS(GRAPHICS)
 
   std::unique_ptr<render_tree::RawImageMemory> AllocateRawImageMemory(
       size_t size_in_bytes, size_t alignment) override;
diff --git a/src/cobalt/renderer/rasterizer/testdata/ImageNodeLocalTransformScaleAndTranslation-expected.png b/src/cobalt/renderer/rasterizer/testdata/ImageNodeLocalTransformScaleAndTranslation-expected.png
new file mode 100644
index 0000000..af75907
--- /dev/null
+++ b/src/cobalt/renderer/rasterizer/testdata/ImageNodeLocalTransformScaleAndTranslation-expected.png
Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/YUV422UYVYImageScaledAndTranslated-expected.png b/src/cobalt/renderer/rasterizer/testdata/YUV422UYVYImageScaledAndTranslated-expected.png
new file mode 100644
index 0000000..eb228d0
--- /dev/null
+++ b/src/cobalt/renderer/rasterizer/testdata/YUV422UYVYImageScaledAndTranslated-expected.png
Binary files differ
diff --git a/src/cobalt/script/v8c/v8c.gyp b/src/cobalt/script/v8c/v8c.gyp
index 404c352..e9c31d8 100644
--- a/src/cobalt/script/v8c/v8c.gyp
+++ b/src/cobalt/script/v8c/v8c.gyp
@@ -74,6 +74,7 @@
         'v8c_wrapper_handle.h',
         'wrapper_factory.cc',
         'wrapper_factory.h',
+        'wrapper_private.cc',
         'wrapper_private.h',
       ],
       'dependencies': [
diff --git a/src/cobalt/script/v8c/v8c_heap_tracer.cc b/src/cobalt/script/v8c/v8c_heap_tracer.cc
index e9b42c6..a6c1d86 100644
--- a/src/cobalt/script/v8c/v8c_heap_tracer.cc
+++ b/src/cobalt/script/v8c/v8c_heap_tracer.cc
@@ -32,10 +32,7 @@
         static_cast<WrapperPrivate*>(embedder_field.first);
     Wrappable* wrappable = wrapper_private->raw_wrappable();
     MaybeAddToFrontier(wrappable);
-
-    // We expect this field to always be null, since we only have it as a
-    // workaround for V8.  See "wrapper_private.h" for details.
-    DCHECK(embedder_field.second == nullptr);
+    DCHECK(embedder_field.second == WrapperPrivate::kInternalFieldIdValue);
   }
 }
 
diff --git a/src/cobalt/script/v8c/wrapper_private.cc b/src/cobalt/script/v8c/wrapper_private.cc
new file mode 100644
index 0000000..eac70f2
--- /dev/null
+++ b/src/cobalt/script/v8c/wrapper_private.cc
@@ -0,0 +1,29 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/script/v8c/wrapper_private.h"
+
+#include "starboard/types.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+// This magic number helps identify objects as Cobalt platform objects.
+void* const WrapperPrivate::kInternalFieldIdValue =
+    reinterpret_cast<void*>(uintptr_t(0xc0ba1700));
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/v8c/wrapper_private.h b/src/cobalt/script/v8c/wrapper_private.h
index e41db18..4c37afb 100644
--- a/src/cobalt/script/v8c/wrapper_private.h
+++ b/src/cobalt/script/v8c/wrapper_private.h
@@ -17,6 +17,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/script/wrappable.h"
 #include "v8/include/v8.h"
 
 namespace cobalt {
@@ -40,17 +41,21 @@
   // should never be called on objects that don't have private data.
   static WrapperPrivate* GetFromWrapperObject(v8::Local<v8::Object> object) {
     DCHECK(object->InternalFieldCount() == kInternalFieldCount);
+    DCHECK(object->GetAlignedPointerFromInternalField(kInternalFieldIdIndex) ==
+           kInternalFieldIdValue);
     return static_cast<WrapperPrivate*>(
         object->GetAlignedPointerFromInternalField(kInternalFieldDataIndex));
   }
 
   // Check whether |object| has private wrapper data.
   static bool HasWrapperPrivate(v8::Local<v8::Object> object) {
-    return object->InternalFieldCount() == kInternalFieldCount;
+    return object->InternalFieldCount() == kInternalFieldCount &&
+           object->GetAlignedPointerFromInternalField(kInternalFieldIdIndex) ==
+               kInternalFieldIdValue;
   }
 
   // The total amount of internal fields in |wrapper_| we use.  See
-  // |kInternalFieldDataIndex| and |kInternalFieldDummyIndex| below for
+  // |kInternalFieldDataIndex| and |kInternalFieldIdIndex| below for
   // further information.
   static const int kInternalFieldCount = 2;
 
@@ -58,6 +63,10 @@
   // Blink specific class ids in the future.
   static const int kClassId = 1009;
 
+  // This magic number is used to positively identify the object as a Cobalt
+  // platform object.
+  static void* const kInternalFieldIdValue;
+
   WrapperPrivate() = delete;
   WrapperPrivate(v8::Isolate* isolate,
                  const scoped_refptr<Wrappable>& wrappable,
@@ -66,8 +75,8 @@
         wrappable_(wrappable),
         traced_global_(isolate, wrapper) {
     wrapper->SetAlignedPointerInInternalField(kInternalFieldDataIndex, this);
-    wrapper->SetAlignedPointerInInternalField(kInternalFieldDummyIndex,
-                                              nullptr);
+    wrapper->SetAlignedPointerInInternalField(kInternalFieldIdIndex,
+                                              kInternalFieldIdValue);
     traced_global_.SetFinalizationCallback(this, &WrapperPrivate::Callback);
     traced_global_.SetWrapperClassId(kClassId);
   }
@@ -90,18 +99,9 @@
   // For the time being, we only use a single internal field, which stores a
   // pointer back to us (us being the |WrapperPrivate|).
   static const int kInternalFieldDataIndex = 0;
-  // Blink uses two fields, so V8 won't believe we're a potential wrapper
-  // unless we have two fields.
-  //      .-""""""-.
-  //    .'          '.
-  //   /   O      O   \
-  //  :                :
-  //  |                |
-  //  :    .------.    :
-  //   \  '        '  /
-  //    '.          .'
-  //      '-......-'
-  static const int kInternalFieldDummyIndex = 1;
+  // V8 built-in types may also use internal fields, so use a special Id to
+  // confirm that the object is a Cobalt platform object.
+  static const int kInternalFieldIdIndex = 1;
 
   v8::Isolate* isolate_;
   scoped_refptr<Wrappable> wrappable_;
diff --git a/src/cobalt/site/docs/development/reference/supported-features.md b/src/cobalt/site/docs/development/reference/supported-features.md
index 67dbabf..d4e41e4 100644
--- a/src/cobalt/site/docs/development/reference/supported-features.md
+++ b/src/cobalt/site/docs/development/reference/supported-features.md
@@ -5,20 +5,27 @@
 
 ## HTML elements
 
+*   `<a>`
+*   `<audio>`
 *   `<body>`
 *   `<br>`
 *   `<div>`
 *   `<head>`
 *   `<html>`
 *   `<link>` (with `type="text/css"`)
+*   `<lottie-player>`
 *   `<meta>`
 *   `<script>`
 *   `<span>`
 *   `<style>`
+*   `<title>`
 *   `<video>`
 
 ## CSS properties
 
+*   [align-content](https://www.w3.org/TR/css-flexbox-1/#propdef-align-content)
+*   [align-items](https://www.w3.org/TR/css-flexbox-1/#propdef-align-items)
+*   [align-self](https://www.w3.org/TR/css-flexbox-1/#propdef-align-self)
 *   [animation](
     https://www.w3.org/TR/css3-animations/#animation-shorthand-property)
 *   [background](https://www.w3.org/TR/css3-background/#the-background),
@@ -42,12 +49,23 @@
 *   [color](https://www.w3.org/TR/css3-color/#foreground)
 *   [content](https://www.w3.org/TR/CSS21/generate.html#content)
 *   [display](https://www.w3.org/TR/CSS21/visuren.html#propdef-display)
+*   [dpi](https://www.w3.org/TR/css-values-3/#resolution)
+*   [flex](https://www.w3.org/TR/css-flexbox-1/#propdef-flex)
+*   [flex-basis](https://www.w3.org/TR/css-flexbox-1/#propdef-flex-basis)
+*   [flex-direction](
+    https://www.w3.org/TR/css-flexbox-1/#flex-direction-property)
+*   [flex-flow](https://www.w3.org/TR/css-flexbox-1/#flex-flow-property)
+*   [flex-grow](https://www.w3.org/TR/css-flexbox-1/#propdef-flex-grow)
+*   [flex-shrink](https://www.w3.org/TR/css-flexbox-1/#propdef-flex-shrink)
+*   [flex-wrap](https://www.w3.org/TR/css-flexbox-1/#flex-wrap-property)
 *   [font](https://www.w3.org/TR/css-fonts-3/#font-prop)
 *   [@font-face](https://www.w3.org/TR/css-fonts-3/#font-face-rule)
 *   [font-family](https://www.w3.org/TR/css-fonts-3/#propdef-font-family)
 *   [font-size](https://www.w3.org/TR/css-fonts-3/#font-size-prop)
 *   [font-style](https://www.w3.org/TR/css-fonts-3/#font-style-prop)
 *   [font-weight](https://www.w3.org/TR/css-fonts-3/#font-weight-prop)
+*   [justify-content](
+    https://www.w3.org/TR/css-flexbox-1/#propdef-justify-content)
 *   [line-height](https://www.w3.org/TR/CSS2/visudet.html#propdef-line-height)
 *   [margin](https://www.w3.org/TR/CSS21/box.html#margin-properties),
     [margin-top](https://www.w3.org/TR/CSS21/box.html#margin-properties),
@@ -58,6 +76,7 @@
     [max-width](https://www.w3.org/TR/CSS2/visudet.html#min-max-widths)
 *   [@media](https://www.w3.org/TR/css3-mediaqueries/)
 *   [opacity](https://www.w3.org/TR/css3-color/#transparency)
+*   [order](https://www.w3.org/TR/css-flexbox-1/#order-property)
 *   [overflow](https://www.w3.org/TR/CSS2/visufx.html#overflow)
 *   [padding](https://www.w3.org/TR/CSS21/box.html#padding-properties),
     [padding-top](https://www.w3.org/TR/CSS21/box.html#padding-properties),
@@ -123,17 +142,28 @@
 *   [CSSOM View](https://www.w3.org/TR/cssom-view-1/)
     (no scrolling, moving, resizing)
 *   `Console.log`
+*   [CORS](https://www.w3.org/TR/2020/SPSD-cors-20200602/)
 *   [DOM4](http://www.w3.org/TR/dom/) (partial)
 *   [EncryptedMedia Extensions v0.1b](
     https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1b/encrypted-media/encrypted-media.html) (unprefixed)
+*   [Fetch](
+    https://www.w3.org/TR/cors/) (supports text(), JSON(), arrayBuffer(), types)
 *   `Image` (for preloading and caching only)
+*   [Intersection Observer](https://www.w3.org/TR/intersection-observer/)
+*   [Media Session](https://www.w3.org/TR/mediasession/)
 *   [Media Source Extensions, Editor's Draft 09 August 2012](
     https://rawgit.com/w3c/media-source/6747ed7a3206f646963d760100b0f37e2fc7e47e/media-source.html)
+*   [Streams API](https://www.w3.org/TR/streams-api/)
+*   [SubtleCrypto](https://www.w3.org/TR/WebCryptoAPI/#subtlecrypto-interface)
 *   [Typed Arrays](
     https://www.khronos.org/registry/typedarray/specs/latest/) (partial)
 *   [URL](https://url.spec.whatwg.org/#api) (partial)
 *   [Web Audio API](https://www.w3.org/TR/webaudio/) (partial)
 *   [Web Storage API](https://www.w3.org/TR/webstorage/)
+*   [WebIDL Level 2](http://dev.w3.org/2006/webapi/WebIDL/)
+*   [WebSocket API](https://www.w3.org/TR/websockets/)
+*   [`window.atob()` and `window.btoa()`](
+    https://html.spec.whatwg.org/multipage/webappapis.html#dom-windowbase64-btoa)
 *   [XMLHttpRequest Level 1](http://www.w3.org/TR/XMLHttpRequest/)
 
 ## Protocols
@@ -142,6 +172,8 @@
 *   h5vcc-embedded: (for embedded resources)
 *   [Content Security Policy Level 2](https://www.w3.org/TR/CSP2/)
     in HTTP headers is _required_, and report-only is disabled.
+*   QUIC
+*   SPDY
 
 ## Media formats
 
@@ -154,12 +186,16 @@
 
 ### Encodings (depending on platform support)
 
+*   16-bit stereo PCM audio (for sound effects)
 *   AAC
+*   AV1
 *   AVC (H.264) at 1080p/60fps ([Level
     4.2](https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels))
+*   Dolby Digital (AC-3)
+*   Dolby Digital Plus (Enhanced AC-3, or EAC-3)
+*   HEVC (H.265)
 *   VP8/Vorbis
 *   VP9/Opus
-*   16-bit stereo PCM audio (for sound effects)
 
 ### Images
 
diff --git a/src/cobalt/site/docs/reference/starboard/configuration-public.md b/src/cobalt/site/docs/reference/starboard/configuration-public.md
index 69a46d3..91ec75d 100644
--- a/src/cobalt/site/docs/reference/starboard/configuration-public.md
+++ b/src/cobalt/site/docs/reference/starboard/configuration-public.md
@@ -7,10 +7,8 @@
 
 | Properties |
 | :--- |
-| **`SB_HAS_CROSS_CORE_SCHEDULER`**<br><br>Whether the current platform's thread scheduler will automatically balance threads between cores, as opposed to systems where threads will only ever run on the specifically pinned core.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES`**<br><br>Some platforms will not align variables on the stack with an alignment greater than 16 bytes. Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_THREAD_AFFINITY_UNSUPPORTED`**<br><br>Some platforms do not have thread affinity support. Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
-| **`SB_HAS_QUIRK_GL_MAP_BUFFER_MEMORY_IS_SLOW_TO_READ`**<br><br>Some platforms the mapped GL buffer memory is slow to read from.  Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
 
 
 ## Compiler Configuration
@@ -22,17 +20,6 @@
 | **`SB_C_NOINLINE`**<br><br>The platform's annotation for marking a C function as forcibly not inlined.<br><br>The default value in the Stub implementation is `__attribute__((noinline))` |
 | **`SB_EXPORT_PLATFORM`**<br><br>The platform's annotation for marking a symbol as exported outside of the current shared library.<br><br>The default value in the Stub implementation is <br>`__attribute__((visibility("default")))` |
 | **`SB_IMPORT_PLATFORM`**<br><br>The platform's annotation for marking a symbol as imported from outside of the current linking unit. |
-| **`SB_HAS_QUIRK_COMPILER_SAYS_GNUC_BUT_ISNT`**<br><br>On some platforms the &#95;&#95;GNUC&#95;&#95; is defined even though parts of the functionality are missing. Setting this to non-zero allows disabling missing functionality encountered.<br><br>By default, this property is undefined. |
-| **`SB_HAS_QUIRK_HASFEATURE_NOT_DEFINED_BUT_IT_IS`**<br><br>On some compilers, the frontend has a quirk such that #ifdef cannot correctly detect &#95;&#95;has_feature is defined, and an example error you get is:<br><br>By default, this property is undefined. |
-
-
-## Decoder-only Params
-
-| Properties |
-| :--- |
-| **`SB_MEDIA_VIDEO_FRAME_ALIGNMENT`**<br><br>Specifies how video frame buffers must be aligned on this platform.<br><br>The default value in the Stub implementation is `256U` |
-| **`SB_MEDIA_MAXIMUM_VIDEO_PREROLL_FRAMES`**<br><br>The encoded video frames are compressed in different ways, so their decoding time can vary a lot.  Occasionally a single frame can take longer time to decode than the average time per frame.  The player has to cache some frames to account for such inconsistency.  The number of frames being cached are controlled by SB_MEDIA_MAXIMUM_VIDEO_PREROLL_FRAMES and SB_MEDIA_MAXIMUM_VIDEO_FRAMES.  Specify the number of video frames to be cached before the playback starts. Note that setting this value too large may increase the playback start delay.<br><br>The default value in the Stub implementation is `4` |
-| **`SB_MEDIA_MAXIMUM_VIDEO_FRAMES`**<br><br>Specify the number of video frames to be cached during playback.  A large value leads to more stable fps but also causes the app to use more memory.<br><br>The default value in the Stub implementation is `12` |
 
 
 ## Extensions Configuration
@@ -48,22 +35,12 @@
 | **`SB_HASH_MAP_INCLUDE`**<br><br>The location to include hash_map on this platform.<br><br>The default value in the Stub implementation is `<ext/hash_map>` |
 | **`SB_HASH_NAMESPACE`**<br><br>C++'s hash_map and hash_set are often found in different namespaces depending on the compiler.<br><br>The default value in the Stub implementation is `__gnu_cxx` |
 | **`SB_HASH_SET_INCLUDE`**<br><br>The location to include hash_set on this platform.<br><br>The default value in the Stub implementation is `<ext/hash_set>` |
-| **`SB_VA_COPY(dest, source)`**<br><br>Define this to how this platform copies varargs blocks.<br><br>The default value in the Stub implementation is `va_copy(dest, source)` |
 
 
 ## Filesystem Configuration
 
 | Properties |
 | :--- |
-| **`SB_FILE_MAX_NAME`**<br><br>The current platform's maximum length of the name of a single directory entry, not including the absolute path.<br><br>The default value in the Stub implementation is `64` |
-| **`SB_FILE_MAX_PATH`**<br><br>The current platform's maximum length of an absolute path.<br><br>The default value in the Stub implementation is `4096` |
-| **`SB_FILE_MAX_OPEN`**<br><br>The current platform's maximum number of files that can be opened at the same time by one process.<br><br>The default value in the Stub implementation is `64` |
-| **`SB_FILE_SEP_CHAR`**<br><br>The current platform's file path component separator character. This is the character that appears after a directory in a file path. For example, the absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path component separator character.<br><br>The default value in the Stub implementation is `'/'` |
-| **`SB_FILE_ALT_SEP_CHAR`**<br><br>The current platform's alternate file path component separator character. This is like SB_FILE_SEP_CHAR, except if your platform supports an alternate character, then you can place that here. For example, on windows machines, the primary separator character is probably '\', but the alternate is '/'.<br><br>The default value in the Stub implementation is `'/'` |
-| **`SB_PATH_SEP_CHAR`**<br><br>The current platform's search path component separator character. When specifying an ordered list of absolute paths of directories to search for a given reason, this is the character that appears between entries. For example, the search path of "/etc/search/first:/etc/search/second" uses ':' as a search path component separator character.<br><br>The default value in the Stub implementation is `':'` |
-| **`SB_FILE_SEP_STRING`**<br><br>The string form of SB_FILE_SEP_CHAR.<br><br>The default value in the Stub implementation is `"/"` |
-| **`SB_FILE_ALT_SEP_STRING`**<br><br>The string form of SB_FILE_ALT_SEP_CHAR.<br><br>The default value in the Stub implementation is `"/"` |
-| **`SB_PATH_SEP_STRING`**<br><br>The string form of SB_PATH_SEP_CHAR.<br><br>The default value in the Stub implementation is `":"` |
 | **`SB_HAS_QUIRK_FILESYSTEM_ZERO_FILEINFO_TIME`**<br><br>Some operating systems constantly return zero values for creation, access and modification time for files and directories. When this quirk is defined, we need to ignore corresponded time values in applications as well as take this fact into account in unit tests.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_FILESYSTEM_COARSE_ACCESS_TIME`**<br><br>On some platforms the file system stores access times at a coarser granularity than other times. When this quirk is defined, we assume the access time is of 1 day precision.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_HASH_FILE_NAME`**<br><br>On some platforms the file system cannot access extremely long file names. We do not need this feature on stub.<br><br>By default, this property is undefined. |
@@ -73,83 +50,65 @@
 
 | Properties |
 | :--- |
-| **`SB_PREFERRED_RGBA_BYTE_ORDER`**<br><br>Specifies the preferred byte order of color channels in a pixel. Refer to starboard/configuration.h for the possible values. EGL/GLES platforms should generally prefer a byte order of RGBA, regardless of endianness.<br><br>The default value in the Stub implementation is <br>`SB_PREFERRED_RGBA_BYTE_ORDER_RGBA` |
+| **`SB_HAS_BLITTER`**<br><br>Specifies whether this platform supports a performant accelerated blitter API. The basic requirement is a scaled, clipped, alpha-blended blit.<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_BILINEAR_FILTERING_SUPPORT`**<br><br>Indicates whether or not the given platform supports bilinear filtering. This can be checked to enable/disable renderer tests that verify that this is working properly.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_NV12_TEXTURE_SUPPORT`**<br><br>Indicates whether or not the given platform supports rendering of NV12 textures. These textures typically originate from video decoders.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER`**<br><br>Whether the current platform should frequently flip its display buffer.  If this is not required (i.e. SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER is set to 0), then optimizations are enabled so the display buffer is not flipped if the scene hasn't changed.<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_VIRTUAL_REALITY`**<br><br>The default value in the Stub implementation is `1` |
 
 
+## I/O Configuration
+
+| Properties |
+| :--- |
+| **`SB_HAS_ON_SCREEN_KEYBOARD`**<br><br>Whether the current platform implements the on screen keyboard interface.<br><br>The default value in the Stub implementation is `0` |
+| **`SB_HAS_SPEECH_RECOGNIZER`**<br><br>Whether the current platform has speech recognizer.<br><br>The default value in the Stub implementation is `1` |
+| **`SB_HAS_SPEECH_SYNTHESIS`**<br><br>Whether the current platform has speech synthesis.<br><br>The default value in the Stub implementation is `1` |
+
+
 ## Media Configuration
 
 | Properties |
 | :--- |
-| **`SB_HAS_PLAYER_WITH_URL`**<br><br>Whether the current platform uses a media player that relies on a URL.<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_QUIRK_SEEK_TO_KEYFRAME`**<br><br>After a seek is triggerred, the default behavior is to append video frames from the last key frame before the seek time and append audio frames from the seek time because usually all audio frames are key frames.  On platforms that cannot decode video frames without displaying them, this will cause the video being played without audio for several seconds after seeking.  When the following macro is defined, the app will append audio frames start from the timestamp that is before the timestamp of the video key frame being appended.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_SUPPORT_INT16_AUDIO_SAMPLES`**<br><br>The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only when this macro is defined.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_NO_FFS`**<br><br>dlmalloc will use the ffs intrinsic if available.  Platforms on which this is not available should define the following quirk.<br><br>By default, this property is undefined. |
-| **`SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND`**<br><br>The maximum audio bitrate the platform can decode.  The following value equals to 5M bytes per seconds which is more than enough for compressed audio.<br><br>The default value in the Stub implementation is `(40 * 1024 * 1024)` |
-| **`SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND`**<br><br>The maximum video bitrate the platform can decode.  The following value equals to 25M bytes per seconds which is more than enough for compressed video.<br><br>The default value in the Stub implementation is `(200 * 1024 * 1024)` |
-| **`SB_HAS_MEDIA_WEBM_VP9_SUPPORT`**<br><br>Specifies whether this platform has webm/vp9 support.  This should be set to non-zero on platforms with webm/vp9 support.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING`**<br><br>Specifies whether this platform updates audio frames asynchronously.  In such case an extra parameter will be added to |SbAudioSinkConsumeFramesFunc| to indicate the absolute time that the consumed audio frames are reported. Check document for |SbAudioSinkConsumeFramesFunc| in audio_sink.h for more details.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_MEDIA_THREAD_STACK_SIZE`**<br><br>Specifies the stack size for threads created inside media stack.  Set to 0 to use the default thread stack size.  Set to non-zero to explicitly set the stack size for media stack threads.<br><br>The default value in the Stub implementation is `0U` |
 
 
 ## Memory Configuration
 
 | Properties |
 | :--- |
-| **`SB_MEMORY_PAGE_SIZE`**<br><br>The memory page size, which controls the size of chunks on memory that allocators deal with, and the alignment of those chunks. This doesn't have to be the hardware-defined physical page size, but it should be a multiple of it.<br><br>The default value in the Stub implementation is `4096` |
-| **`SB_CAN_MAP_EXECUTABLE_MEMORY`**<br><br>Whether this platform can map executable memory. Implies this system can map memory. This is required for platforms that want to JIT.<br><br>The default value in the Stub implementation is `1` |
-| **`SB_MALLOC_ALIGNMENT`**<br><br>Determines the alignment that allocations should have on this platform.<br><br>The default value in the Stub implementation is `((size_t)16U)` |
-| **`SB_DEFAULT_MMAP_THRESHOLD`**<br><br>Determines the threshhold of allocation size that should be done with mmap (if available), rather than allocated within the core heap.<br><br>The default value in the Stub implementation is `((size_t)(256 * 1024U))` |
-| **`SB_MEMORY_LOG_PATH`**<br><br>Defines the path where memory debugging logs should be written to.<br><br>The default value in the Stub implementation is `"/tmp/starboard"` |
+| **`SB_HAS_MMAP`**<br><br>Whether this platform has and should use an MMAP function to map physical memory to the virtual address space.<br><br>The default value in the Stub implementation is `1` |
+| **`SB_CAN_MAP_EXECUTABLE_MEMORY`**<br><br>Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is required for platforms that want to JIT.<br><br>The default value in the Stub implementation is `1` |
 
 
 ## Network Configuration
 
 | Properties |
 | :--- |
+| **`SB_HAS_IPV6`**<br><br>Specifies whether this platform supports IPV6.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_PIPE`**<br><br>Specifies whether this platform supports pipe.<br><br>The default value in the Stub implementation is `1` |
 
 
 ## System Header Configuration
 
- Standard C headers are expected to be available. System headers listed below that are not provided by the platfom will be emulated in starboard/types.h.
+ Any system headers listed here that are not provided by the platform will be emulated in starboard/types.h.
 
 | Properties |
 | :--- |
-| **`SB_HAS_SYS_TYPES_H`**<br><br>Whether the current platform provides the standard header sys/types.h.<br><br>The default value in the Stub implementation is `0` |
+| **`SB_HAS_SYS_TYPES_H`**<br><br> Whether the current platform provides the standard header sys/types.h.<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_SSIZE_T`**<br><br>Whether the current platform provides ssize_t.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_IS_WCHAR_T_UTF32`**<br><br>Type detection for wchar_t.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_IS_WCHAR_T_UTF16`**<br><br>The default value in the Stub implementation is `1` |
-| **`SB_IS_WCHAR_T_UNSIGNED`**<br><br>Chrome only defines these two if ARMEL or MIPSEL are defined. Chrome has an exclusion for iOS here, we should too when we support iOS.<br><br>The default value in the Stub implementation is `1` |
-| **`SB_IS_WCHAR_T_SIGNED`**<br><br>The default value in the Stub implementation is `1` |
-| **`SB_HAS_QUIRK_MEMSET_IN_SYSTEM_HEADERS`**<br><br>Some platforms have memset predefined in system headers. Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
+| **`SB_IS_WCHAR_T_UNSIGNED`**<br><br>Chrome only defines this for ARMEL. Chrome has an exclusion for iOS here, we should too when we support iOS.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_QUIRK_SOCKET_BSD_HEADERS`**<br><br>This quirk is used to switch the headers included in starboard/shared/linux/socket_get_interface_address.cc for darwin system headers. It may be removed at some point in favor of a different solution.<br><br>By default, this property is undefined. |
+| **`SB_HAS_QUIRK_NO_GMTIME_R`**<br><br>Some platforms don't support gmtime_r. Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
 
 
-## Thread Configuration
+## Timing API
 
 | Properties |
 | :--- |
-| **`SB_HAS_THREAD_PRIORITY_SUPPORT`**<br><br>Whether the current platform supports thread priorities.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_MAX_THREADS`**<br><br>Defines the maximum number of simultaneous threads for this platform. Some platforms require sharing thread handles with other kinds of system handles, like mutexes, so we want to keep this managable.<br><br>The default value in the Stub implementation is `90` |
-| **`SB_MAX_THREAD_LOCAL_KEYS`**<br><br>The maximum number of thread local storage keys supported by this platform.<br><br>The default value in the Stub implementation is `512` |
-| **`SB_MAX_THREAD_NAME_LENGTH`**<br><br>The maximum length of the name for a thread, including the NULL-terminator.<br><br>The default value in the Stub implementation is `16` |
-
-
-## Tuneable Parameters
-
-| Properties |
-| :--- |
-| **`SB_NETWORK_RECEIVE_BUFFER_SIZE`**<br><br>Specifies the network receive buffer size in bytes, set via SbSocketSetReceiveBufferSize().  Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should not be called. Use this for OSs (such as Linux) where receive buffer auto-tuning is better.  On some platforms, this may affect max TCP window size which may dramatically affect throughput in the presence of latency.  If your platform does not have a good TCP auto-tuning mechanism, a setting of (128 * 1024) here is recommended.<br><br>The default value in the Stub implementation is `(0)` |
-
-
-## User Configuration
-
-| Properties |
-| :--- |
-| **`SB_USER_MAX_SIGNED_IN`**<br><br>The maximum number of users that can be signed in at the same time.<br><br>The default value in the Stub implementation is `1` |
+| **`SB_HAS_TIME_THREAD_NOW`**<br><br>Whether this platform has an API to retrieve how long the current thread has spent in the executing state.<br><br>The default value in the Stub implementation is `1` |
 
 
diff --git a/src/cobalt/site/docs/reference/starboard/gyp-configuration.md b/src/cobalt/site/docs/reference/starboard/gyp-configuration.md
index 1ff9b5a..dafe5e9 100644
--- a/src/cobalt/site/docs/reference/starboard/gyp-configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/gyp-configuration.md
@@ -8,7 +8,9 @@
 | **`abort_on_allocation_failure`**<br><br> Halt execution on failure to allocate memory.<br><br>The default value is `1`. |
 | **`cobalt`**<br><br> Whether Cobalt is being built.<br><br>The default value is `1`. |
 | **`cobalt_config`**<br><br> Contains the current build configuration.<br><br>The default value is `'gold'`. |
-| **`cobalt_egl_swap_interval`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEglSwapInterval instead.<br><br> Cobalt will call eglSwapInterval() and specify this value before calling eglSwapBuffers() each frame.<br><br>The default value is `1`. |
+| **`cobalt_egl_swap_interval`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEglSwapInterval instead. Cobalt will call eglSwapInterval() and specify this value before calling eglSwapBuffers() each frame.<br><br>The default value is `-1`. |
+| **`cobalt_enable_jit`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEnableJit instead.<br><br>The default value is `-1`. |
+| **`cobalt_enable_quic`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEnableQuic instead.<br><br>The default value is `-1`. |
 | **`cobalt_fastbuild`**<br><br> Contains the current build configuration.<br><br>The default value is `0`. |
 | **`cobalt_font_package`**<br><br> Contains the current font package selection.  This can be used to trade font quality, coverage, and latency for different font package sizes. The font package can be one of the following options:<ul><li><code>standard</code> - The default package. It includes all sans-serif, serif, and FCC fonts, non-CJK fallback fonts in both 'normal' and 'bold' weights, 'normal' weight CJK ('bold' weight CJK is synthesized from it), historic script fonts, and color emojis. This package is ~38.3MB.<li><code>limited</code> - A significantly smaller package than 'standard'. This package removes all but 'normal' and 'bold' weighted sans-serif and serif, removes the FCC fonts (which must be provided by the system or downloaded from the web), replaces standard CJK with low quality CJK, removes historic script fonts, and replaces colored emojis with uncolored ones. Because low quality CJK cannot synthesize bold, bold glyphs are unavailable in Chinese, Japanese and Korean. This package is ~8.3MB.<li><code>minimal</code> - The smallest possible font package. It only includes Roboto's Basic Latin characters. Everything else must be provided by the system or downloaded from the web. This package is ~40.0KB.</li></ul> NOTE: When bold is needed, but unavailable, it is typically synthesized, resulting in lower quality glyphs than those generated directly from a bold font. However, this does not occur with low quality CJK, which is not high enough quality to synthesize. Its glyphs always have a 'normal' weight.<br><br>The default value is `'standard'`. |
 | **`cobalt_font_package_override_fallback_color_emoji`**<br><br> Font package overrides can be used to modify the files included within the selected package. The following values are available: -1 -- The package value for the specified category is not overridden. 0 -- The package value is overridden and no fonts for the specified category are included. 1 -- The package value is overridden and fonts from the specified category with a weight of 'normal' and a style of 'normal' are included. 2 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or bold' and a style of 'normal' are included. 3 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or 'bold' and a style of either 'normal' or 'italic' are included. 4 -- The package value is overridden and all available fonts from the specified category are included. This may include additional weights beyond 'normal' and 'bold'. See content/fonts/README.md for details on the specific values used by each of the packages use for the various font categories.<br><br>The default value is `-1`. |
@@ -21,76 +23,84 @@
 | **`cobalt_font_package_override_named_fcc_fonts`**<br><br> Font package overrides can be used to modify the files included within the selected package. The following values are available: -1 -- The package value for the specified category is not overridden. 0 -- The package value is overridden and no fonts for the specified category are included. 1 -- The package value is overridden and fonts from the specified category with a weight of 'normal' and a style of 'normal' are included. 2 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or bold' and a style of 'normal' are included. 3 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or 'bold' and a style of either 'normal' or 'italic' are included. 4 -- The package value is overridden and all available fonts from the specified category are included. This may include additional weights beyond 'normal' and 'bold'. See content/fonts/README.md for details on the specific values used by each of the packages use for the various font categories.<br><br>The default value is `-1`. |
 | **`cobalt_font_package_override_named_sans_serif`**<br><br> Font package overrides can be used to modify the files included within the selected package. The following values are available: -1 -- The package value for the specified category is not overridden. 0 -- The package value is overridden and no fonts for the specified category are included. 1 -- The package value is overridden and fonts from the specified category with a weight of 'normal' and a style of 'normal' are included. 2 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or bold' and a style of 'normal' are included. 3 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or 'bold' and a style of either 'normal' or 'italic' are included. 4 -- The package value is overridden and all available fonts from the specified category are included. This may include additional weights beyond 'normal' and 'bold'. See content/fonts/README.md for details on the specific values used by each of the packages use for the various font categories.<br><br>The default value is `-1`. |
 | **`cobalt_font_package_override_named_serif`**<br><br> Font package overrides can be used to modify the files included within the selected package. The following values are available: -1 -- The package value for the specified category is not overridden. 0 -- The package value is overridden and no fonts for the specified category are included. 1 -- The package value is overridden and fonts from the specified category with a weight of 'normal' and a style of 'normal' are included. 2 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or bold' and a style of 'normal' are included. 3 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or 'bold' and a style of either 'normal' or 'italic' are included. 4 -- The package value is overridden and all available fonts from the specified category are included. This may include additional weights beyond 'normal' and 'bold'. See content/fonts/README.md for details on the specific values used by each of the packages use for the various font categories.<br><br>The default value is `-1`. |
-| **`cobalt_gc_zeal`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltGcZeal instead.<br><br> Can be set to enable zealous garbage collection, if |javascript_engine| supports it.  Zealous garbage collection will cause garbage collection to occur much more frequently than normal, for the purpose of finding or reproducing bugs.<br><br>The default value is `0`. |
-| **`cobalt_media_buffer_alignment`**<br><br> The media buffer will be allocated using the following alignment.  Set this to a larger value may increase the memory consumption of media buffers.<br><br>The default value is `1`. |
-| **`cobalt_media_buffer_allocation_unit`**<br><br> When the media stack needs more memory to store media buffers, it will allocate extra memory in units of |cobalt_media_buffer_allocation_unit|. This can be set to 0, in which case the media stack will allocate extra memory on demand.  When |cobalt_media_buffer_initial_capacity| and this value are both set to 0, the media stack will allocate individual buffers directly using SbMemory functions.<br><br>The default value is `1 * 1024 * 1024`. |
-| **`cobalt_media_buffer_initial_capacity`**<br><br> The amount of memory that will be used to store media buffers allocated during system startup.  To allocate a large chunk at startup helps with reducing fragmentation and can avoid failures to allocate incrementally. This can be set to 0.<br><br>The default value is `21 * 1024 * 1024`. |
-| **`cobalt_media_buffer_max_capacity_1080p`**<br><br> The maximum amount of memory that will be used to store media buffers when video resolution is no larger than 1080p. This must be larger than sum of 1080p video budget and non-video budget.<br><br>The default value is `36 * 1024 * 1024`. |
-| **`cobalt_media_buffer_max_capacity_4k`**<br><br> The maximum amount of memory that will be used to store media buffers when video resolution is 4k. If 0, then memory can grow without bound. This must be larger than sum of 4k video budget and non-video budget.<br><br>The default value is `100 * 1024 * 1024`. |
-| **`cobalt_media_buffer_non_video_budget`**<br><br> Specifies the maximum amount of memory used by audio or text buffers of media source before triggering a garbage collection.  A large value will cause more memory being used by audio buffers but will also make JavaScript app less likely to re-download audio data.  Note that the JavaScript app may experience significant difficulty if this value is too low.<br><br>The default value is `5 * 1024 * 1024`. |
-| **`cobalt_media_buffer_padding`**<br><br> Extra bytes allocated at the end of a media buffer to ensure that the buffer can be use optimally by specific instructions like SIMD.  Set to 0 to remove any padding.<br><br>The default value is `0`. |
-| **`cobalt_media_buffer_pool_allocate_on_demand`**<br><br> When either |cobalt_media_buffer_initial_capacity| or |cobalt_media_buffer_allocation_unit| isn't zero, media buffers will be allocated using a memory pool.  Set the following variable to 1 to allocate the media buffer pool memory on demand and return all memory to the system when there is no media buffer allocated.  Setting the following value to 0 results in that Cobalt will allocate |cobalt_media_buffer_initial_capacity| bytes for media buffer on startup and will not release any media buffer memory back to the system even if there is no media buffers allocated.<br><br>The default value is `1`. |
-| **`cobalt_media_buffer_progressive_budget`**<br><br> The memory used when playing mp4 videos that is not in DASH format.  The resolution of such videos shouldn't go beyond 1080p.  Its value should be less than the sum of 'cobalt_media_buffer_non_video_budget' and 'cobalt_media_buffer_video_budget_1080p' but not less than 8 MB.<br><br>The default value is `12 * 1024 * 1024`. |
-| **`cobalt_media_buffer_storage_type`**<br><br> This can be set to "memory" or "file".  When it is set to "memory", the media buffers will be stored in main memory allocated by SbMemory functions.  When it is set to "file", the media buffers will be stored in a temporary file in the system cache folder acquired by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory".  Note that when its value is "file" the media stack will still allocate memory to cache the the buffers in use.<br><br>The default value is `'memory'`. |
-| **`cobalt_media_buffer_video_budget_1080p`**<br><br> Specifies the maximum amount of memory used by video buffers of media source before triggering a garbage collection when the video resolution is lower than 1080p (1920x1080).  A large value will cause more memory being used by video buffers but will also make JavaScript app less likely to re-download video data.  Note that the JavaScript app may experience significant difficulty if this value is too low.<br><br>The default value is `16 * 1024 * 1024`. |
-| **`cobalt_media_buffer_video_budget_4k`**<br><br> Specifies the maximum amount of memory used by video buffers of media source before triggering a garbage collection when the video resolution is lower than 4k (3840x2160).  A large value will cause more memory being used by video buffers but will also make JavaScript app less likely to re-download video data.  Note that the JavaScript app may experience significant difficulty if this value is too low.<br><br>The default value is `60 * 1024 * 1024`. |
-| **`cobalt_media_source_garbage_collection_duration_threshold_in_seconds`**<br><br> Specifies the duration threshold of media source garbage collection.  When the accumulated duration in a source buffer exceeds this value, the media source implementation will try to eject existing buffers from the cache. This is usually triggered when the video being played has a simple content and the encoded data is small.  In such case this can limit how much is allocated for the book keeping data of the media buffers and avoid OOM of system heap. This should be set to 170 for most of the platforms.  But it can be further reduced on systems with extremely low memory.<br><br>The default value is `170`. |
-| **`cobalt_minimum_frame_time_in_milliseconds`**<br><br> Allow throttling of the frame rate. This is expressed in terms of milliseconds and can be a floating point number. Keep in mind that swapping frames may take some additional processing time, so it may be better to specify a lower delay. For example, '33' instead of '33.33' for 30 Hz refresh.<br><br>The default value is `'16.0'`. |
+| **`cobalt_gc_zeal`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltGcZeal instead. Can be set to enable zealous garbage collection, if |javascript_engine| supports it.  Zealous garbage collection will cause garbage collection to occur much more frequently than normal, for the purpose of finding or reproducing bugs.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_alignment`**<br><br> The media buffer will be allocated using the following alignment.  Set this to a larger value may increase the memory consumption of media buffers.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_allocation_unit`**<br><br> When the media stack needs more memory to store media buffers, it will allocate extra memory in units of |cobalt_media_buffer_allocation_unit|. This can be set to 0, in which case the media stack will allocate extra memory on demand.  When |cobalt_media_buffer_initial_capacity| and this value are both set to 0, the media stack will allocate individual buffers directly using SbMemory functions.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_initial_capacity`**<br><br> The amount of memory that will be used to store media buffers allocated during system startup.  To allocate a large chunk at startup helps with reducing fragmentation and can avoid failures to allocate incrementally. This can be set to 0.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_max_capacity_1080p`**<br><br> The maximum amount of memory that will be used to store media buffers when video resolution is no larger than 1080p. This must be larger than sum of 1080p video budget and non-video budget.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_max_capacity_4k`**<br><br> The maximum amount of memory that will be used to store media buffers when video resolution is 4k. If 0, then memory can grow without bound. This must be larger than sum of 4k video budget and non-video budget.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_non_video_budget`**<br><br> Specifies the maximum amount of memory used by audio or text buffers of media source before triggering a garbage collection.  A large value will cause more memory being used by audio buffers but will also make JavaScript app less likely to re-download audio data.  Note that the JavaScript app may experience significant difficulty if this value is too low.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_padding`**<br><br> Extra bytes allocated at the end of a media buffer to ensure that the buffer can be use optimally by specific instructions like SIMD.  Set to 0 to remove any padding.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_pool_allocate_on_demand`**<br><br> When either |cobalt_media_buffer_initial_capacity| or |cobalt_media_buffer_allocation_unit| isn't zero, media buffers will be allocated using a memory pool.  Set the following variable to 1 to allocate the media buffer pool memory on demand and return all memory to the system when there is no media buffer allocated.  Setting the following value to 0 results in that Cobalt will allocate |cobalt_media_buffer_initial_capacity| bytes for media buffer on startup and will not release any media buffer memory back to the system even if there is no media buffers allocated.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_progressive_budget`**<br><br> The memory used when playing mp4 videos that is not in DASH format.  The resolution of such videos shouldn't go beyond 1080p.  Its value should be less than the sum of 'cobalt_media_buffer_non_video_budget' and 'cobalt_media_buffer_video_budget_1080p' but not less than 8 MB.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_storage_type`**<br><br> This can be set to "memory" or "file".  When it is set to "memory", the media buffers will be stored in main memory allocated by SbMemory functions.  When it is set to "file", the media buffers will be stored in a temporary file in the system cache folder acquired by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory".  Note that when its value is "file" the media stack will still allocate memory to cache the the buffers in use.<br><br>The default value is `''`. |
+| **`cobalt_media_buffer_video_budget_1080p`**<br><br> Specifies the maximum amount of memory used by video buffers of media source before triggering a garbage collection when the video resolution is lower than 1080p (1920x1080).  A large value will cause more memory being used by video buffers but will also make JavaScript app less likely to re-download video data.  Note that the JavaScript app may experience significant difficulty if this value is too low.<br><br>The default value is `-1`. |
+| **`cobalt_media_buffer_video_budget_4k`**<br><br> Specifies the maximum amount of memory used by video buffers of media source before triggering a garbage collection when the video resolution is lower than 4k (3840x2160).  A large value will cause more memory being used by video buffers but will also make JavaScript app less likely to re-download video data.  Note that the JavaScript app may experience significant difficulty if this value is too low.<br><br>The default value is `-1`. |
+| **`cobalt_media_source_garbage_collection_duration_threshold_in_seconds`**<br><br> Specifies the duration threshold of media source garbage collection.  When the accumulated duration in a source buffer exceeds this value, the media source implementation will try to eject existing buffers from the cache. This is usually triggered when the video being played has a simple content and the encoded data is small.  In such case this can limit how much is allocated for the book keeping data of the media buffers and avoid OOM of system heap. This should be set to 170 for most of the platforms.  But it can be further reduced on systems with extremely low memory.<br><br>The default value is `-1`. |
+| **`cobalt_minimum_frame_time_in_milliseconds`**<br><br> Allow throttling of the frame rate. This is expressed in terms of milliseconds and can be a floating point number. Keep in mind that swapping frames may take some additional processing time, so it may be better to specify a lower delay. For example, '33' instead of '33.33' for 30 Hz refresh. This value is deprecated in favor of the usage of CobaltExtensionGraphicsApi::GetMinimumFrameIntervalInMilliseconds API. The default value has been moved into cobalt/renderer/pipeline.cc.<br><br>The default value is `'-1'`. |
 | **`cobalt_platform_dependencies`**<br><br> List of platform-specific targets that get compiled into cobalt.<br><br>The default value is `[]`. |
 | **`cobalt_splash_screen_file`**<br><br> The path to a splash screen to copy into content/data/web which can be accessed via a file URL starting with "file:///cobalt/browser/splash_screen/". If '', no file is copied.<br><br>The default value is `''`. |
-| **`cobalt_user_on_exit_strategy`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltUserOnExitStrategy instead.<br><br> This variable defines what Cobalt's preferred strategy should be for handling internally triggered application exit requests (e.g. the user chooses to back out of the application).<ul><li><code>stop</code> - The application should call SbSystemRequestStop() on exit, resulting in a complete shutdown of the application.<li><code>suspend</code> - The application should call SbSystemRequestSuspend() on exit, resulting in the application being "minimized".<li><code>noexit</code> - The application should never allow the user to trigger an exit, this will be managed by the system.<br><br>The default value is `'stop'`. |
+| **`cobalt_user_on_exit_strategy`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltUserOnExitStrategy instead. This variable defines what Cobalt's preferred strategy should be for handling internally triggered application exit requests (e.g. the user chooses to back out of the application).<ul><li><code>stop</code> - The application should call SbSystemRequestStop() on exit, resulting in a complete shutdown of the application.<li><code>suspend</code> - The application should call SbSystemRequestSuspend() on exit, resulting in the application being "minimized".<li><code>noexit</code> - The application should never allow the user to trigger an exit, this will be managed by the system.<br><br>The default value is `''`. |
 | **`cobalt_v8_buildtime_snapshot`**<br><br> Set to "true" to enable v8 snapshot generation at Cobalt build time.<br><br>The default value is `'<(cobalt_v8_buildtime_snapshot)'`. |
-| **`cobalt_version`**<br><br> Build version number.<br><br>The default value is `0`. |
+| **`cobalt_v8_emit_builtins_as_inline_asm`**<br><br> Some compiler can not compile with raw assembly(.S files) and v8 converts asm to inline assembly for these platforms.<br><br>The default value is `1`. |
+| **`cobalt_v8_enable_embedded_builtins`**<br><br> We need to define some variables inside of an inner 'variables' scope so that they can be referenced by other outer variables here.  Also, it allows for the specification of default values that get referenced by a top level scope.<br><br>The default value is `1`. |
+| **`cobalt_version`**<br><br> Build version number.<br><br>The default value is `'<(BUILD_NUMBER)'`. |
 | **`cobalt_webapi_extension_generated_header_idl_files`**<br><br> We need to define some variables inside of an inner 'variables' scope so that they can be referenced by other outer variables here.  Also, it allows for the specification of default values that get referenced by a top level scope.<br><br>The default value is `[]`. |
 | **`cobalt_webapi_extension_source_idl_files`**<br><br> We need to define some variables inside of an inner 'variables' scope so that they can be referenced by other outer variables here.  Also, it allows for the specification of default values that get referenced by a top level scope.<br><br>The default value is `[]`. |
-| **`compiler_flags_<config>`**<br><br>The following configurations are supported: <ul><li><code>[default]</code></li><li><code>c_debug</code></li><li><code>c_devel</code></li><li><code>c_gold</code></li><li><code>c_host</code></li><li><code>c_qa</code></li><li><code>cc_debug</code></li><li><code>cc_devel</code></li><li><code>cc_gold</code></li><li><code>cc_host</code></li><li><code>cc_qa</code></li><li><code>debug</code></li><li><code>devel</code></li><li><code>gold</code></li><li><code>host</code></li><li><code>qa</ul> |
+| **`compiler_flags_<config>`**<br><br>The following configurations are supported: <ul><li><code>[default]</code></li><li><code>c_debug</code></li><li><code>c_devel</code></li><li><code>c_gold</code></li><li><code>c_gold_size</code></li><li><code>c_gold_speed</code></li><li><code>c_host</code></li><li><code>c_qa</code></li><li><code>c_qa_size</code></li><li><code>c_qa_speed</code></li><li><code>cc_debug</code></li><li><code>cc_devel</code></li><li><code>cc_gold</code></li><li><code>cc_gold_size</code></li><li><code>cc_gold_speed</code></li><li><code>cc_host</code></li><li><code>cc_qa</code></li><li><code>cc_qa_size</code></li><li><code>cc_qa_speed</code></li><li><code>debug</code></li><li><code>devel</code></li><li><code>gold</code></li><li><code>gold_size</code></li><li><code>gold_speed</code></li><li><code>host</code></li><li><code>qa</code></li><li><code>qa_size</code></li><li><code>qa_speed</ul> |
 | **`custom_media_session_client`**<br><br> Set to 1 to enable a custom MediaSessionClient.<br><br>The default value is `0`. |
 | **`default_renderer_options_dependency`**<br><br> Override this value to adjust the default rasterizer setting for your platform.<br><br>The default value is `'<(DEPTH)/cobalt/renderer/default_options_starboard.gyp:default_options'`. |
 | **`defines_debug`**<br><br> and linker_executable_flags_(config) to distinguish the flags for SharedLibraryLinker and ExecutableLinker.<br><br>The default value is `[]`. |
 | **`defines_devel`**<br><br>The default value is `[]`. |
 | **`defines_gold`**<br><br>The default value is `[]`. |
 | **`defines_host`**<br><br>The default value is `[]`. |
-| **`defines_qa`**<br><br>The default value is `[]`. |
+| **`defines_qa`**<br><br> For qa and gold configs, different compiler flags may be specified for gyp targets that should be built for size than for speed. Targets which specify 'optimize_target_for_speed == 1', will compile with flags: ['compiler_flags_*<config>', 'compiler_flags_*<config>_speed']. Otherwise, targets will use compiler flags: ['compiler_flags_*<config>', 'compiler_flags_*<config>_size']. Platforms may decide to use the same optimization flags for both target types by leaving the '*_size' and '*_speed' variables empty.<br><br>The default value is `[]`. |
 | **`enable_account_manager`**<br><br> Set to 1 to enable H5vccAccountManager.<br><br>The default value is `0`. |
 | **`enable_configure_request_job_factory`**<br><br> Set to 1 to enable setting Interceptors on the URLRequestJobFactory<br><br>The default value is `0`. |
 | **`enable_crash_log`**<br><br> Set to 1 to enable H5vccCrashLog.<br><br>The default value is `0`. |
-| **`enable_map_to_mesh`**<br><br> Enable support for the map to mesh filter, which is primarily used to implement spherical video playback.<br><br>The default value is `0`. |
+| **`enable_map_to_mesh`**<br><br> Enable support for the map to mesh filter, which is primarily used to implement spherical video playback. This setting is deprecated in favor of the cobalt graphics extension (CobaltGraphicsExtensionApi) function `IsMapToMeshEnabled()`. If the CobaltGraphicsExtensionApi is not implemented, then Cobalt will fall back onto a default. For starboard API versions 12 and later, the default is true (i.e. Cobalt will assume map to mesh is supported). For earlier starboard API versions, if this gyp variable is redefined to a value other than -1, it will use the new value as the default. If it is not redefined, the default is false.<br><br>The default value is `-1`. |
 | **`enable_sso`**<br><br> Set to 1 to enable H5vccSSO (Single Sign On).<br><br>The default value is `0`. |
 | **`enable_xhr_header_filtering`**<br><br> Set to 1 to enable filtering of HTTP headers before sending.<br><br>The default value is `0`. |
-| **`fallback_splash_screen_url`**<br><br> The URL of default build time splash screen - see cobalt/doc/splash_screen.md for information about this.<br><br>The default value is `'none'`. |
+| **`encoded_image_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEncodedImageCacheSizeInBytes instead. Determines the capacity of the encoded image cache, which manages encoded images downloaded from a web page. These images are cached within CPU memory.  This not only reduces network traffic to download the encoded images, but also allows the downloaded images to be held during suspend. Note that there is also a cache for the decoded images whose capacity is specified in |image_cache_size_in_bytes|.  The decoded images are often cached in the GPU memory and will be released during suspend.<br><br> If a system meet the following requirements: 1. Has a fast image decoder. 2. Has enough CPU memory, or has a unified memory architecture that allows sharing of CPU and GPU memory. Then it may consider to set |encoded_image_cache_size_in_bytes| to a much bigger value, and set the value of |image_cache_size_in_bytes| to a much smaller value. This allows the app to cache significant more images.<br><br> Set this to 0 can disable the cache completely.<br><br>The default value is `-1`. |
+| **`fallback_splash_screen_url`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltFallbackSplashScreenUrl instead. The URL of default build time splash screen - see cobalt/doc/splash_screen.md for information about this.<br><br>The default value is `''`. |
 | **`final_executable_type`**<br><br> The variables allow changing the target type on platforms where the native code may require an additional packaging step (ex. Android).<br><br>The default value is `'executable'`. |
-| **`gl_type`**<br><br> The source of EGL and GLES headers and libraries. Valid values (case and everything sensitive!):<ul><li><code>none</code> - No EGL + GLES implementation is available on this platform.<li><code>system_gles3</code> - Deprecated. Use system_gles2 instead.<br><br>Use the system implementation of EGL + GLES3. The headers and libraries must be on the system include and link paths.<li><code>system_gles2</code> - Use the system implementation of EGL + GLES2. The headers and libraries must be on the system include and link paths.<li><code>glimp</code> - Cobalt's own EGL + GLES2 implementation. This requires a valid Glimp implementation for the platform.<li><code>angle</code> - A DirectX-to-OpenGL adaptation layer. This requires a valid ANGLE implementation for the platform.</li></ul> Choosing an unsupported value will result in a GYP error: "cobalt/renderer/egl_and_gles/egl_and_gles_<gl_type>.gyp not found"<br><br>The default value is `'system_gles2'`. |
+| **`gl_type`**<br><br> The source of EGL and GLES headers and libraries. Valid values (case and everything sensitive!):<ul><li><code>none</code> - No EGL + GLES implementation is available on this platform.<li><code>system_gles3</code> - Deprecated. Use system_gles2 instead. Use the system implementation of EGL + GLES3. The headers and libraries must be on the system include and link paths.<li><code>system_gles2</code> - Use the system implementation of EGL + GLES2. The headers and libraries must be on the system include and link paths.<li><code>glimp</code> - Cobalt's own EGL + GLES2 implementation. This requires a valid Glimp implementation for the platform.<li><code>angle</code> - A DirectX-to-OpenGL adaptation layer. This requires a valid ANGLE implementation for the platform.</li></ul> Choosing an unsupported value will result in a GYP error: "cobalt/renderer/egl_and_gles/egl_and_gles_<gl_type>.gyp not found"<br><br>The default value is `'system_gles2'`. |
 | **`gtest_target_type`**<br><br> The variables allow changing the target type on platforms where the native code may require an additional packaging step (ex. Android).<br><br>The default value is `'executable'`. |
 | **`host_os`**<br><br> Contains the name of the hosting OS. The value is defined by the gyp wrapper script.<br><br>The default value is `'win'`. |
-| **`image_cache_capacity_multiplier_when_playing_video`**<br><br> Modifying this value to be non-1.0f will result in the image cache capacity being cleared and then temporarily reduced for the duration that a video is playing.  This can be useful for some platforms if they are particularly constrained for (GPU) memory during video playback.  When playing a video, the image cache is reduced to: image_cache_size_in_bytes * image_cache_capacity_multiplier_when_playing_video.<br><br>The default value is `'1.0f'`. |
-| **`image_cache_size_in_bytes`**<br><br> Determines the capacity of the image cache, which manages image surfaces downloaded from a web page.  While it depends on the platform, often (and ideally) these images are cached within GPU memory. Set to -1 to automatically calculate the value at runtime, based on features like windows dimensions and the value of SbSystemGetTotalGPUMemory().<br><br>The default value is `-1`. |
+| **`image_cache_capacity_multiplier_when_playing_video`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltImageCacheCapactityMultiplierWhenPlayingVideo. Modifying this value to be non-1.0f will result in the image cache capacity being cleared and then temporarily reduced for the duration that a video is playing.  This can be useful for some platforms if they are particularly constrained for (GPU) memory during video playback.  When playing a video, the image cache is reduced to: image_cache_size_in_bytes * image_cache_capacity_multiplier_when_playing_video.<br><br>The default value is `''`. |
+| **`image_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltImageCacheSizeInBytes instead. Determines the capacity of the image cache, which manages image surfaces downloaded from a web page.  While it depends on the platform, often (and ideally) these images are cached within GPU memory. Set to -1 to automatically calculate the value at runtime, based on features like windows dimensions and the value of SbSystemGetTotalGPUMemory().<br><br>The default value is `-1`. |
 | **`in_app_dial`**<br><br> Set to 1 to build with DIAL support.<br><br>The default value is `0`. |
 | **`linker_flags_<config>`**<br><br>The following configurations are supported: <ul><li><code>[default]</code></li><li><code>debug</code></li><li><code>devel</code></li><li><code>gold</code></li><li><code>host</code></li><li><code>qa</ul> |
-| **`local_font_cache_size_in_bytes`**<br><br> Determines the capacity of the local font cache, which manages all fonts loaded from local files. Newly encountered sections of font files are lazily loaded into the cache, enabling subsequent requests to the same file sections to be handled via direct memory access. Once the limit is reached, further requests are handled via file stream. Setting the value to 0 disables memory caching and causes all font file accesses to be done using file streams.<br><br>The default value is `16 * 1024 * 1024`. |
-| **`max_cobalt_cpu_usage`**<br><br> This setting is deprecated. Implement starboard API function SbSystemGetTotalCPUMemory() instead.<br><br> Max Cobalt CPU usage specifies that the cobalt program should keep it's size below the specified size.<br><br>The default value is `-1`. |
-| **`max_cobalt_gpu_usage`**<br><br> This setting is deprecated. Implement starboard API function SbSystemGetTotalGPUMemory() instead.<br><br> Max Cobalt GPU usage specifies that the cobalt program should keep it's size below the specified size. A value of -1 causes this value to be assumed from the starboard API function: SbSystemGetTotalGPUMemory().<br><br>The default value is `-1`. |
-| **`mesh_cache_size_in_bytes`**<br><br> Determines the capacity of the mesh cache. Each mesh is held compressed in main memory, to be inflated into a GPU buffer when needed for projection. When set to 'auto', will be adjusted according to whether the enable_map_to_mesh is true or not.  If enable_map_to_mesh is false, then the mesh cache size will be set to 0.<br><br>The default value is `'auto'`. |
-| **`mozjs_garbage_collection_threshold_in_bytes`**<br><br> Determines the size of garbage collection threshold. After this many bytes have been allocated, the SpiderMonkey garbage collector will run. Lowering this has been found to reduce performance and decrease JavaScript memory usage. For example, we have measured on at least one platform that performance becomes 7% worse on average in certain cases when adjusting this number from 8MB to 1MB.<br><br>The default value is `8 * 1024 * 1024`. |
-| **`offscreen_target_cache_size_in_bytes`**<br><br> Determines the amount of GPU memory the offscreen target atlases will use. This is specific to the direct-GLES rasterizer and caches any render tree nodes which require skia for rendering. Two atlases will be allocated from this memory or multiple atlases of the frame size if the limit allows. It is recommended that enough memory be reserved for two RGBA atlases about a quarter of the frame size.<br><br>The default value is `-1`. |
+| **`local_font_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltLocalTypeFaceCacheSizeInBytes instead. Determines the capacity of the local font cache, which manages all fonts loaded from local files. Newly encountered sections of font files are lazily loaded into the cache, enabling subsequent requests to the same file sections to be handled via direct memory access. Once the limit is reached, further requests are handled via file stream. Setting the value to 0 disables memory caching and causes all font file accesses to be done using file streams.<br><br>The default value is `-1`. |
+| **`max_cobalt_cpu_usage`**<br><br> Max Cobalt CPU usage specifies that the cobalt program should keep it's size below the specified size. This setting is deprecated. Implement starboard API function SbSystemGetTotalCPUMemory() instead.<br><br>The default value is `-1`. |
+| **`max_cobalt_gpu_usage`**<br><br> Max Cobalt GPU usage specifies that the cobalt program should keep it's size below the specified size. This setting is deprecated. Implement starboard API function SbSystemGetTotalGPUMemory() instead.<br><br>The default value is `-1`. |
+| **`mesh_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltMeshCacheSizeInBytes instead. Determines the capacity of the mesh cache. Each mesh is held compressed in main memory, to be inflated into a GPU buffer when needed for projection. When set to 'auto', will be adjusted according to whether the enable_map_to_mesh is true or not.  If enable_map_to_mesh is false, then the mesh cache size will be set to 0.<br><br>The default value is `-1`. |
+| **`mozjs_garbage_collection_threshold_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltJsGarbageCollectionThresholdInBytes instead. Determines the size of garbage collection threshold. After this many bytes have been allocated, the SpiderMonkey garbage collector will run. Lowering this has been found to reduce performance and decrease JavaScript memory usage. For example, we have measured on at least one platform that performance becomes 7% worse on average in certain cases when adjusting this number from 8MB to 1MB.<br><br>The default value is `-1`. |
+| **`offscreen_target_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltOffscreenTargetCacheSizeInBytes instead. Determines the amount of GPU memory the offscreen target atlases will use. This is specific to the direct-GLES rasterizer and caches any render tree nodes which require skia for rendering. Two atlases will be allocated from this memory or multiple atlases of the frame size if the limit allows. It is recommended that enough memory be reserved for two RGBA atlases about a quarter of the frame size.<br><br>The default value is `-1`. |
+| **`optimize_target_for_speed`**<br><br> This variable dictates whether a given gyp target should be compiled with optimization flags for size vs. speed.<br><br>The default value is `0`. |
 | **`path_to_yasm`**<br><br> Where yasm can be found on the target device.<br><br>The default value is `"yasm"`. |
 | **`platform_libraries`**<br><br>The default value is `[]`. |
-| **`rasterizer_type`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltRasterizerType instead.<br><br> Defines what kind of rasterizer will be used.  This can be adjusted to force a stub graphics implementation or software graphics implementation. It can be one of the following options:<ul><li><code>direct-gles</code> - Uses a light wrapper over OpenGL ES to handle most draw elements. This will fall back to the skia hardware rasterizer for some render tree node types, but is generally faster on the CPU and GPU. This can handle 360 rendering.<li><code>hardware</code> - As much hardware acceleration of graphics commands as possible. This uses skia to wrap OpenGL ES commands. Required for 360 rendering.<li><code>software</code> - Perform most rasterization using the CPU and only interact with the GPU to send the final image to the output window.<li><code>stub</code> - Stub graphics rasterization.  A rasterizer object will still be available and valid, but it will do nothing.<br><br>The default value is `'direct-gles'`. |
-| **`reduce_cpu_memory_by`**<br><br> When specified this value will reduce the cpu memory consumption by the specified amount. -1 disables the value. When this value is specified then max_cobalt_cpu_usage will not be used in memory_constrainer, but will still be used for triggering a warning if the engine consumes more memory than this value specifies.<br><br>The default value is `-1`. |
-| **`reduce_gpu_memory_by`**<br><br> When specified this value will reduce the gpu memory consumption by the specified amount. -1 disables the value. When this value is specified then max_cobalt_gpu_usage will not be used in memory_constrainer, but will still be used for triggering a warning if the engine consumes more memory than this value specifies.<br><br>The default value is `-1`. |
-| **`remote_font_cache_size_in_bytes`**<br><br> Determines the capacity of the remote font cache, which manages all fonts downloaded from a web page.<br><br>The default value is `4 * 1024 * 1024`. |
-| **`render_dirty_region_only`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltRenderDirtyRegionOnly instead.<br><br> If set to 1, will enable support for rendering only the regions of the display that are modified due to animations, instead of re-rendering the entire scene each frame.  This feature can reduce startup time where usually there is a small loading spinner animating on the screen.  On GLES renderers, Cobalt will attempt to implement this support by using eglSurfaceAttrib(..., EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED), otherwise the dirty region will be silently disabled.  On Blitter API platforms, if this is enabled, we explicitly create an extra offscreen full-size intermediate surface to render into.  Note that some GLES driver implementations may internally allocate an extra full screen surface to support this feature, and many have been noticed to not properly support this functionality (but they report that they do), and for these reasons this value is defaulted to 0.<br><br>The default value is `0`. |
+| **`rasterizer_type`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltRasterizerType instead. Defines what kind of rasterizer will be used.  This can be adjusted to force a stub graphics implementation. It can be one of the following options:<ul><li><code>direct-gles</code> - Uses a light wrapper over OpenGL ES to handle most draw elements. This will fall back to the skia hardware rasterizer for some render tree node types, but is generally faster on the CPU and GPU. This can handle 360 rendering.<li><code>hardware</code> - As much hardware acceleration of graphics commands as possible. This uses skia to wrap OpenGL ES commands. Required for 360 rendering.<li><code>stub</code> - Stub graphics rasterization.  A rasterizer object will still be available and valid, but it will do nothing.<br><br>The default value is `''`. |
+| **`reduce_cpu_memory_by`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltReduceCpuMemoryBy instead. When specified this value will reduce the cpu memory consumption by the specified amount. -1 disables the value. When this value is specified then max_cobalt_cpu_usage will not be used in memory_constrainer, but will still be used for triggering a warning if the engine consumes more memory than this value specifies.<br><br>The default value is `-1`. |
+| **`reduce_gpu_memory_by`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltReduceGpuMemoryBy instead. When specified this value will reduce the gpu memory consumption by the specified amount. -1 disables the value. When this value is specified then max_cobalt_gpu_usage will not be used in memory_constrainer, but will still be used for triggering a warning if the engine consumes more memory than this value specifies.<br><br>The default value is `-1`. |
+| **`remote_font_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltRemoteTypefaceCacheSizeInBytes instead. Determines the capacity of the remote font cache, which manages all fonts downloaded from a web page.<br><br>The default value is `-1`. |
+| **`render_dirty_region_only`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltRenderDirtyRegionOnly instead. If set to 1, will enable support for rendering only the regions of the display that are modified due to animations, instead of re-rendering the entire scene each frame.  This feature can reduce startup time where usually there is a small loading spinner animating on the screen.  On GLES renderers, Cobalt will attempt to implement this support by using eglSurfaceAttrib(..., EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED), otherwise the dirty region will be silently disabled.  On Blitter API platforms, if this is enabled, we explicitly create an extra offscreen full-size intermediate surface to render into.  Note that some GLES driver implementations may internally allocate an extra full screen surface to support this feature, and many have been noticed to not properly support this functionality (but they report that they do), and for these reasons this value is defaulted to 0.<br><br>The default value is `-1`. |
+| **`sb_api_version`**<br><br> The Starboard API version of the current build configuration. The default value is meant to be overridden by a Starboard ABI file.<br><br>The default value is `0`. |
+| **`sb_deploy_output_dir`**<br><br> Top-level directory for staging deploy build output. Platform deploy actions should use <(target_deploy_dir) defined in deploy.gypi to place artifacts for each deploy target in its own subdirectoy.<br><br>The default value is `'<(sb_deploy_output_dir)'`. |
 | **`sb_disable_microphone_idl`**<br><br> When this is set to true, the web bindings for the microphone are disabled<br><br>The default value is `0`. |
+| **`sb_enable_benchmark`**<br><br> Used to enable benchmarks.<br><br>The default value is `0`. |
+| **`sb_enable_lib`**<br><br> Enables embedding Cobalt as a shared library within another app. This requires a 'lib' starboard implementation for the corresponding platform.<br><br>The default value is `'<(sb_enable_lib)'`. |
+| **`sb_evergreen`**<br><br> Whether this is an evergreen build.<br><br>The default value is `0`. |
+| **`sb_evergreen_compatible`**<br><br> Whether this is an evergreen compatible platform. A compatible platform can run the elf_loader and launch the evergreen build.<br><br>The default value is `'<(sb_evergreen_compatible)'`. |
 | **`sb_filter_based_player`**<br><br> Used to indicate that the player is filter based.<br><br>The default value is `1`. |
 | **`sb_libevent_method`**<br><br> The event polling mechanism available on this platform to support libevent. Platforms may redefine to 'poll' if necessary. Other mechanisms, e.g. devpoll, kqueue, select, are not yet supported.<br><br>The default value is `'epoll'`. |
 | **`sb_pedantic_warnings`**<br><br> Enabling this variable enables pedantic levels of warnings for the current toolchain.<br><br>The default value is `0`. |
-| **`sb_static_contents_output_base_dir`**<br><br> Directory path to static contents.<br><br>The default value is `'<(sb_static_contents_output_base_dir)'`. |
 | **`sb_static_contents_output_data_dir`**<br><br> Directory path to static contents' data.<br><br>The default value is `'<(sb_static_contents_output_data_dir)'`. |
 | **`sb_target_platform`**<br><br> The target platform id as a string, like 'linux-x64x11', 'win32', etc..<br><br>The default value is `''`. |
-| **`scratch_surface_cache_size_in_bytes`**<br><br> Determines the capacity of the scratch surface cache.  The scratch surface cache facilitates the reuse of temporary offscreen surfaces within a single frame.  This setting is only relevant when using the hardware-accelerated Skia rasterizer.<br><br>The default value is `0`. |
-| **`skia_cache_size_in_bytes`**<br><br> Determines the capacity of the skia cache.  The Skia cache is maintained within Skia and is used to cache the results of complicated effects such as shadows, so that Skia draw calls that are used repeatedly across frames can be cached into surfaces.  This setting is only relevant when using the hardware-accelerated Skia rasterizer (e.g. as opposed to the Blitter API).<br><br>The default value is `4 * 1024 * 1024`. |
-| **`skia_glyph_atlas_height`**<br><br> Determines the size in pixels of the glyph atlas where rendered glyphs are cached. The resulting memory usage is 2 bytes of GPU memory per pixel. When a value is used that is too small, thrashing may occur that will result in visible stutter. Such thrashing is more likely to occur when CJK language glyphs are rendered and when the size of the glyphs in pixels is larger, such as for higher resolution displays. The negative default values indicates to the engine that these settings should be automatically set.<br><br>The default value is `'-1'`. |
-| **`skia_glyph_atlas_width`**<br><br> Determines the size in pixels of the glyph atlas where rendered glyphs are cached. The resulting memory usage is 2 bytes of GPU memory per pixel. When a value is used that is too small, thrashing may occur that will result in visible stutter. Such thrashing is more likely to occur when CJK language glyphs are rendered and when the size of the glyphs in pixels is larger, such as for higher resolution displays. The negative default values indicates to the engine that these settings should be automatically set.<br><br>The default value is `'-1'`. |
-| **`software_surface_cache_size_in_bytes`**<br><br> Only relevant if you are using the Blitter API. Determines the capacity of the software surface cache, which is used to cache all surfaces that are rendered via a software rasterizer to avoid re-rendering them.<br><br>The default value is `8 * 1024 * 1024`. |
+| **`skia_cache_size_in_bytes`**<br><br> Determines the capacity of the skia cache.  The Skia cache is maintained within Skia and is used to cache the results of complicated effects such as shadows, so that Skia draw calls that are used repeatedly across frames can be cached into surfaces.  This setting is only relevant when using the hardware-accelerated Skia rasterizer (e.g. as opposed to the Blitter API).<br><br>The default value is `-1`. |
+| **`skia_glyph_atlas_height`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi functions CobaltSkiaGlyphAtlasWidth and CobaltSkiaGlyphAtlasHeight, respectively. Determines the size in pixels of the glyph atlas where rendered glyphs are cached. The resulting memory usage is 2 bytes of GPU memory per pixel. When a value is used that is too small, thrashing may occur that will result in visible stutter. Such thrashing is more likely to occur when CJK language glyphs are rendered and when the size of the glyphs in pixels is larger, such as for higher resolution displays. The negative default values indicates to the engine that these settings should be automatically set.<br><br>The default value is `'-1'`. |
+| **`skia_glyph_atlas_width`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi functions CobaltSkiaGlyphAtlasWidth and CobaltSkiaGlyphAtlasHeight, respectively. Determines the size in pixels of the glyph atlas where rendered glyphs are cached. The resulting memory usage is 2 bytes of GPU memory per pixel. When a value is used that is too small, thrashing may occur that will result in visible stutter. Such thrashing is more likely to occur when CJK language glyphs are rendered and when the size of the glyphs in pixels is larger, such as for higher resolution displays. The negative default values indicates to the engine that these settings should be automatically set.<br><br>The default value is `'-1'`. |
+| **`software_surface_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltSoftwareSurfaceCacheSizeInBytes instead. Only relevant if you are using the Blitter API. Determines the capacity of the software surface cache, which is used to cache all surfaces that are rendered via a software rasterizer to avoid re-rendering them.<br><br>The default value is `-1`. |
 | **`starboard_path`**<br><br> The relative path from src/ to the directory containing the starboard_platform.gyp file.  It is currently set to 'starboard/<(target_arch)' to make semi-starboard platforms work. moved to starboard.<br><br>The default value is `'starboard/<(target_arch)'`. |
 | **`target_os`**<br><br> The operating system of the target, separate from the target_arch. In many cases, an 'unknown' value is fine, but, if set to 'linux', then we can assume some things, and it'll save us some configuration time.<br><br>The default value is `'unknown'`. |
 | **`tizen_os`**<br><br> Temporary indicator for Tizen - should eventually move to feature defines.<br><br>The default value is `0`. |
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/atomic.md b/src/cobalt/site/docs/reference/starboard/modules/10/atomic.md
index 6331e79..5f79990 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/atomic.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/atomic.md
@@ -29,7 +29,7 @@
 #### Definition ####
 
 ```
-typedef SbAtomic64 SbAtomicPtr
+typedef SbAtomic32 SbAtomicPtr
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md b/src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md
index c3c1cf7..47b12ed 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md
@@ -27,7 +27,7 @@
 ### SbAudioSinkConsumeFramesFunc ###
 
 Callback used to report frames consumed. The consumed frames will be removed
-from the source frame buffer to free space for new audio frames.When
+from the source frame buffer to free space for new audio frames. When
 `frames_consumed` is updated asynchnously and the last time that it has been
 updated is known, it can be passed in `frames_consumed_at` so the audio time
 calculating can be more accurate.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md b/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md
index 00d40a7..b35275f 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md
@@ -12,8 +12,7 @@
 acceleration, if it is available. Draw commands exist for solid-color rectangles
 and rasterization/blitting of rectangular images onto rectangular target
 patches.
-
-## Threading Concerns ##
+Threading Concerns
 
 Note that in general the Blitter API is not thread safe, except for all
 `SbBlitterDevice`-related functions. All functions that are not required to
@@ -24,8 +23,7 @@
 threads, but manual synchronization must be performed in order to ensure their
 parameters are not referenced at the same time on another thread by another
 function.
-
-### Examples ###
+Examples
 
 *   Multiple threads should not issue commands to the same `SbBlitterContext`
     object unless they are manually synchronized.
@@ -136,6 +134,23 @@
 
 ## Functions ##
 
+### SB_DEPRECATED ###
+
+This function achieves the same effect as calling `SbBlitterBlitRectToRect()`
+`num_rects` times with each of the `num_rects` values of `src_rects` and
+`dst_rects`. This function allows for greater efficiency than looped calls to
+`SbBlitterBlitRectToRect()`.
+
+This function is not thread-safe.
+
+The return value indicates whether the draw call succeeded.
+
+#### Declaration ####
+
+```
+SB_DEPRECATED(bool SbBlitterBlitRectsToRects(SbBlitterContext context, SbBlitterSurface source_surface, const SbBlitterRect *src_rects, const SbBlitterRect *dst_rects, int num_rects))
+```
+
 ### SbBlitterAFromColor ###
 
 Extract alpha from a `SbBlitterColor` object.
@@ -156,63 +171,6 @@
 static uint8_t SbBlitterBFromColor(SbBlitterColor color)
 ```
 
-### SbBlitterBlitRectToRect ###
-
-Issues a draw call on `context` that blits the area of `source_surface`
-specified by `src_rect` to `context`'s current render target at `dst_rect`. The
-source rectangle must lie within the dimensions of `source_surface`. Note that
-the `source_surface`'s alpha is modulated by `opacity` before being drawn. For
-`opacity`, a value of 0 implies complete invisibility, and a value of 255
-implies complete opacity.
-
-This function is not thread-safe.
-
-The return value indicates whether the draw call succeeded.
-
-`src_rect`: The area to be block transferred (blitted).
-
-#### Declaration ####
-
-```
-bool SbBlitterBlitRectToRect(SbBlitterContext context, SbBlitterSurface source_surface, SbBlitterRect src_rect, SbBlitterRect dst_rect)
-```
-
-### SbBlitterBlitRectToRectTiled ###
-
-This function functions identically to SbBlitterBlitRectToRect(), except it
-permits values of `src_rect` outside the dimensions of `source_surface`. In
-those regions, the pixel data from `source_surface` will be wrapped. Negative
-values for `src_rect.x` and `src_rect.y` are allowed.
-
-The output is all stretched to fit inside of `dst_rect`.
-
-This function is not thread-safe.
-
-The return value indicates whether the draw call succeeded.
-
-#### Declaration ####
-
-```
-bool SbBlitterBlitRectToRectTiled(SbBlitterContext context, SbBlitterSurface source_surface, SbBlitterRect src_rect, SbBlitterRect dst_rect)
-```
-
-### SbBlitterBlitRectsToRects ###
-
-This function achieves the same effect as calling `SbBlitterBlitRectToRect()`
-`num_rects` times with each of the `num_rects` values of `src_rects` and
-`dst_rects`. This function allows for greater efficiency than looped calls to
-`SbBlitterBlitRectToRect()`.
-
-This function is not thread-safe.
-
-The return value indicates whether the draw call succeeded.
-
-#### Declaration ####
-
-```
-bool SbBlitterBlitRectsToRects(SbBlitterContext context, SbBlitterSurface source_surface, const SbBlitterRect *src_rects, const SbBlitterRect *dst_rects, int num_rects)
-```
-
 ### SbBlitterBytesPerPixelForFormat ###
 
 A convenience function to return the number of bytes per pixel for a given pixel
@@ -235,313 +193,6 @@
 static SbBlitterColor SbBlitterColorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
 ```
 
-### SbBlitterCreateContext ###
-
-Creates an `SbBlitterContext` object on `device`. The returned context can be
-used to set up draw state and issue draw calls.
-
-Note that there is a limit on the number of contexts that can exist
-simultaneously, which can be queried by calling `SbBlitterGetMaxContexts()`.
-(The limit is often `1`.)
-
-`SbBlitterContext` objects keep track of draw state between a series of draw
-calls. Please refer to the `SbBlitterContext()` definition for more information
-about contexts.
-
-This function is thread-safe.
-
-This function returns `kSbBlitterInvalidContext` upon failure. Note that the
-function fails if it has already been used to create the maximum number of
-contexts.
-
-`device`: The `SbBlitterDevice` for which the `SbBlitterContext` object is
-created.
-
-#### Declaration ####
-
-```
-SbBlitterContext SbBlitterCreateContext(SbBlitterDevice device)
-```
-
-### SbBlitterCreateDefaultDevice ###
-
-Creates and returns an `SbBlitterDevice` based on the Blitter API
-implementation's decision of which device should be the default. The returned
-`SbBlitterDevice` represents a connection to a device (like a GPU).
-
-On many platforms there is always one single obvious choice for a device to use,
-and that is the one that this function will return. For example, if this is
-called on a platform that has a single GPU, this call should return an object
-that represents that GPU. On a platform that has no GPU, an object representing
-a software CPU implementation may be returned.
-
-Only one default device can exist within a process at a time. This function is
-thread-safe.
-
-Returns `kSbBlitterInvalidDevice` on failure.
-
-#### Declaration ####
-
-```
-SbBlitterDevice SbBlitterCreateDefaultDevice()
-```
-
-### SbBlitterCreatePixelData ###
-
-Allocates an `SbBlitterPixelData` object through `device` with `width`, `height`
-and `pixel_format`. `pixel_format` must be supported by `device` (see
-`SbBlitterIsPixelFormatSupportedByPixelData()`).
-
-This function is thread-safe.
-
-Calling this function results in the allocation of CPU-accessible (though
-perhaps blitter-device-resident) memory to store pixel data of the requested
-size/format. An `SbBlitterPixelData` object should eventually be passed either
-into a call to `SbBlitterCreateSurfaceFromPixelData()` or into a call to
-`SbBlitterDestroyPixelData()`.
-
-Returns `kSbBlitterInvalidPixelData` upon failure.
-
-#### Declaration ####
-
-```
-SbBlitterPixelData SbBlitterCreatePixelData(SbBlitterDevice device, int width, int height, SbBlitterPixelDataFormat pixel_format)
-```
-
-### SbBlitterCreateRenderTargetSurface ###
-
-Creates a new surface with undefined pixel data on `device` with the specified
-`width`, `height` and `surface_format`. One can set the pixel data on the
-resulting surface by getting its associated SbBlitterRenderTarget object and
-then calling `SbBlitterGetRenderTargetFromSurface()`.
-
-This function is thread-safe.
-
-Returns `kSbBlitterInvalidSurface` upon failure.
-
-#### Declaration ####
-
-```
-SbBlitterSurface SbBlitterCreateRenderTargetSurface(SbBlitterDevice device, int width, int height, SbBlitterSurfaceFormat surface_format)
-```
-
-### SbBlitterCreateSurfaceFromPixelData ###
-
-Creates an `SbBlitterSurface` object on `device`. Note that `device` must match
-the device that was used to create the `SbBlitterPixelData` object provided via
-the `pixel_data` parameter.
-
-This function also destroys the input `pixel_data` object. As a result,
-`pixel_data` should not be accessed again after a call to this function.
-
-The returned object cannot be used as a render target (e.g. calling
-`SbBlitterGetRenderTargetFromSurface()` on it will return
-`kSbBlitterInvalidRenderTarget`).
-
-This function is thread-safe with respect to `device`, but `pixel_data` should
-not be modified on another thread while this function is called.
-
-Returns `kSbBlitterInvalidSurface` in the event of an error.
-
-#### Declaration ####
-
-```
-SbBlitterSurface SbBlitterCreateSurfaceFromPixelData(SbBlitterDevice device, SbBlitterPixelData pixel_data)
-```
-
-### SbBlitterCreateSwapChainFromWindow ###
-
-Creates and returns an `SbBlitterSwapChain` that can then be used to send
-graphics to the display. This function links `device` to `window`'s output, and
-drawing to the returned swap chain will result in `device` being used to render
-to `window`.
-
-This function must be called from the thread that called `SbWindowCreate()` to
-create `window`.
-
-Returns `kSbBlitterInvalidSwapChain` on failure.
-
-#### Declaration ####
-
-```
-SbBlitterSwapChain SbBlitterCreateSwapChainFromWindow(SbBlitterDevice device, SbWindow window)
-```
-
-### SbBlitterDestroyContext ###
-
-Destroys the specified `context`, freeing all its resources.
-
-This function is not thread-safe.
-
-The return value indicates whether the destruction succeeded.
-
-`context`: The object to be destroyed.
-
-#### Declaration ####
-
-```
-bool SbBlitterDestroyContext(SbBlitterContext context)
-```
-
-### SbBlitterDestroyDevice ###
-
-Destroys `device`, cleaning up all resources associated with it. This function
-is thread-safe, but it should not be called if `device` is still being accessed
-elsewhere.
-
-The return value indicates whether the destruction succeeded.
-
-`device`: The SbBlitterDevice object to be destroyed.
-
-#### Declaration ####
-
-```
-bool SbBlitterDestroyDevice(SbBlitterDevice device)
-```
-
-### SbBlitterDestroyPixelData ###
-
-Destroys `pixel_data`. Note that this function does not need to be called and
-should not be called if `SbBlitterCreateSurfaceFromPixelData()` has been called
-on `pixel_data` before.
-
-This function is thread-safe.
-
-The return value indicates whether the destruction succeeded.
-
-`pixel_data`: The object to be destroyed.
-
-#### Declaration ####
-
-```
-bool SbBlitterDestroyPixelData(SbBlitterPixelData pixel_data)
-```
-
-### SbBlitterDestroySurface ###
-
-Destroys the `surface` object, cleaning up all resources associated with it.
-
-This function is not thread safe.
-
-The return value indicates whether the destruction succeeded.
-
-`surface`: The object to be destroyed.
-
-#### Declaration ####
-
-```
-bool SbBlitterDestroySurface(SbBlitterSurface surface)
-```
-
-### SbBlitterDestroySwapChain ###
-
-Destroys `swap_chain`, cleaning up all resources associated with it. This
-function is not thread-safe and must be called on the same thread that called
-`SbBlitterCreateSwapChainFromWindow()`.
-
-The return value indicates whether the destruction succeeded.
-
-`swap_chain`: The SbBlitterSwapChain to be destroyed.
-
-#### Declaration ####
-
-```
-bool SbBlitterDestroySwapChain(SbBlitterSwapChain swap_chain)
-```
-
-### SbBlitterDownloadSurfacePixels ###
-
-Downloads `surface` pixel data into CPU memory pointed to by `out_pixel_data`,
-formatted according to the requested `pixel_format` and the requested
-`pitch_in_bytes`. Before calling this function, you can call
-`SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels()` to confirm that
-`pixel_format` is, in fact, valid for `surface`.
-
-When this function is called, it first waits for all previously flushed graphics
-commands to be executed by the device before downloading the data. Since this
-function waits for the pipeline to empty, it should be used sparingly, such as
-within in debug or test environments.
-
-The return value indicates whether the pixel data was downloaded successfully.
-
-The returned alpha format is premultiplied.
-
-This function is not thread-safe.
-
-`out_pixel_data`: A pointer to a region of memory with a size of surface_height
-* `pitch_in_bytes` bytes.
-
-#### Declaration ####
-
-```
-bool SbBlitterDownloadSurfacePixels(SbBlitterSurface surface, SbBlitterPixelDataFormat pixel_format, int pitch_in_bytes, void *out_pixel_data)
-```
-
-### SbBlitterFillRect ###
-
-Issues a draw call on `context` that fills the specified rectangle `rect`. The
-rectangle's color is determined by the last call to `SbBlitterSetColor()`.
-
-This function is not thread-safe.
-
-The return value indicates whether the draw call succeeded.
-
-`context`: The context on which the draw call will operate. `rect`: The
-rectangle to be filled.
-
-#### Declaration ####
-
-```
-bool SbBlitterFillRect(SbBlitterContext context, SbBlitterRect rect)
-```
-
-### SbBlitterFlipSwapChain ###
-
-Flips the `swap_chain` by making the buffer previously accessible to draw
-commands via `SbBlitterGetRenderTargetFromSwapChain()` visible on the display,
-while another buffer in an initially undefined state is set up as the new draw
-command target. Note that you do not need to call
-`SbBlitterGetRenderTargetFromSwapChain()` again after flipping, the swap chain's
-render target always refers to its current back buffer.
-
-This function stalls the calling thread until the next vertical refresh. In
-addition, to ensure consistency with the Starboard Player API when rendering
-punch-out video, calls to `SbPlayerSetBounds()` do not take effect until this
-method is called.
-
-The return value indicates whether the flip succeeded.
-
-This function is not thread-safe.
-
-`swap_chain`: The SbBlitterSwapChain to be flipped.
-
-#### Declaration ####
-
-```
-bool SbBlitterFlipSwapChain(SbBlitterSwapChain swap_chain)
-```
-
-### SbBlitterFlushContext ###
-
-Flushes all draw calls previously issued to `context`. Calling this function
-guarantees that the device processes all draw calls issued to this point on this
-`context` before processing any subsequent draw calls on any context.
-
-Before calling `SbBlitterFlipSwapChain()`, it is often prudent to call this
-function to ensure that all draw calls are submitted before the flip occurs.
-
-This function is not thread-safe.
-
-The return value indicates whether the flush succeeded.
-
-`context`: The context for which draw calls are being flushed.
-
-#### Declaration ####
-
-```
-bool SbBlitterFlushContext(SbBlitterContext context)
-```
-
 ### SbBlitterGFromColor ###
 
 Extract green from a `SbBlitterColor` object.
@@ -552,110 +203,6 @@
 static uint8_t SbBlitterGFromColor(SbBlitterColor color)
 ```
 
-### SbBlitterGetMaxContexts ###
-
-Returns the maximum number of contexts that `device` can support in parallel.
-Note that devices often support only a single context.
-
-This function is thread-safe.
-
-This function returns `-1` upon failure.
-
-`device`: The SbBlitterDevice for which the maximum number of contexts is
-returned.
-
-#### Declaration ####
-
-```
-int SbBlitterGetMaxContexts(SbBlitterDevice device)
-```
-
-### SbBlitterGetPixelDataPitchInBytes ###
-
-Retrieves the pitch (in bytes) for `pixel_data`. This indicates the number of
-bytes per row of pixel data in the image.
-
-This function is not thread-safe.
-
-Returns `-1` in the event of an error.
-
-`pixel_data`: The object for which you are retrieving the pitch.
-
-#### Declaration ####
-
-```
-int SbBlitterGetPixelDataPitchInBytes(SbBlitterPixelData pixel_data)
-```
-
-### SbBlitterGetPixelDataPointer ###
-
-Retrieves a CPU-accessible pointer to the pixel data represented by
-`pixel_data`. This pixel data can be modified by the CPU to initialize it on the
-CPU before calling `SbBlitterCreateSurfaceFromPixelData()`.
-
-Note that the pointer returned here is valid as long as `pixel_data` is valid,
-which means it is valid until either `SbBlitterCreateSurfaceFromPixelData()` or
-`SbBlitterDestroyPixelData()` is called.
-
-This function is not thread-safe.
-
-Returns `NULL` in the event of an error.
-
-#### Declaration ####
-
-```
-void* SbBlitterGetPixelDataPointer(SbBlitterPixelData pixel_data)
-```
-
-### SbBlitterGetRenderTargetFromSurface ###
-
-Returns the `SbBlitterRenderTarget` object owned by `surface`. The returned
-object can be used as a target for draw calls.
-
-This function returns `kSbBlitterInvalidRenderTarget` if `surface` is not able
-to provide a render target or on any other error.
-
-This function is not thread-safe.
-
-#### Declaration ####
-
-```
-SbBlitterRenderTarget SbBlitterGetRenderTargetFromSurface(SbBlitterSurface surface)
-```
-
-### SbBlitterGetRenderTargetFromSwapChain ###
-
-Returns the `SbBlitterRenderTarget` object that is owned by `swap_chain`. The
-returned object can be used to provide a target to blitter draw calls that draw
-directly to the display buffer. This function is not thread-safe.
-
-Returns `kSbBlitterInvalidRenderTarget` on failure.
-
-`swap_chain`: The SbBlitterSwapChain for which the target object is being
-retrieved.
-
-#### Declaration ####
-
-```
-SbBlitterRenderTarget SbBlitterGetRenderTargetFromSwapChain(SbBlitterSwapChain swap_chain)
-```
-
-### SbBlitterGetSurfaceInfo ###
-
-Retrieves an `SbBlitterSurfaceInfo` structure, which describes immutable
-parameters of the `surface`, such as its width, height and pixel format. The
-results are set on the output parameter `surface_info`, which cannot be `NULL`.
-
-The return value indicates whether the information was retrieved successfully.
-
-This function is not thread-safe.
-
-#### Declaration ####
-
-```
-bool SbBlitterGetSurfaceInfo(SbBlitterSurface surface, SbBlitterSurfaceInfo *surface_info)
-```
-
 ### SbBlitterIsContextValid ###
 
 Checks whether a blitter context is invalid.
@@ -686,36 +233,6 @@
 static bool SbBlitterIsPixelDataValid(SbBlitterPixelData pixel_data)
 ```
 
-### SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels ###
-
-Indicates whether the combination of parameter values is valid for calls to
-`SbBlitterDownloadSurfacePixels()`.
-
-This function is not thread-safe.
-
-`surface`: The surface being checked. `pixel_format`: The pixel format that
-would be used on the surface.
-
-#### Declaration ####
-
-```
-bool SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels(SbBlitterSurface surface, SbBlitterPixelDataFormat pixel_format)
-```
-
-### SbBlitterIsPixelFormatSupportedByPixelData ###
-
-Indicates whether `device` supports calls to `SbBlitterCreatePixelData` with the
-specified `pixel_format`. This function is thread-safe.
-
-`device`: The device for which compatibility is being checked. `pixel_format`:
-The SbBlitterPixelDataFormat for which compatibility is being checked.
-
-#### Declaration ####
-
-```
-bool SbBlitterIsPixelFormatSupportedByPixelData(SbBlitterDevice device, SbBlitterPixelDataFormat pixel_format)
-```
-
 ### SbBlitterIsRenderTargetValid ###
 
 Checks whether a render target is invalid.
@@ -726,22 +243,6 @@
 static bool SbBlitterIsRenderTargetValid(SbBlitterRenderTarget render_target)
 ```
 
-### SbBlitterIsSurfaceFormatSupportedByRenderTargetSurface ###
-
-Indicates whether the `device` supports calls to
-`SbBlitterCreateRenderTargetSurface()` with `surface_format`.
-
-This function is thread-safe.
-
-`device`: The device being checked for compatibility. `surface_format`: The
-surface format being checked for compatibility.
-
-#### Declaration ####
-
-```
-bool SbBlitterIsSurfaceFormatSupportedByRenderTargetSurface(SbBlitterDevice device, SbBlitterSurfaceFormat surface_format)
-```
-
 ### SbBlitterIsSurfaceValid ###
 
 Checks whether a surface is invalid.
@@ -797,125 +298,3 @@
 static uint8_t SbBlitterRFromColor(SbBlitterColor color)
 ```
 
-### SbBlitterSetBlending ###
-
-Sets the blending state for the specified `context`. By default, blending is
-disabled on a `SbBlitterContext`.
-
-This function is not thread-safe.
-
-The return value indicates whether the blending state was set successfully.
-
-`context`: The context for which the blending state is being set.
-
-`blending`: The blending state for the `context`. If `blending` is `true`, the
-source alpha of subsequent draw calls is used to blend with the destination
-color. In particular,
-
-```
-Fc = Sc * Sa + Dc * (1 - Sa)
-
-```
-
-where:
-
-*   `Fc` is the final color.
-
-*   `Sc` is the source color.
-
-*   `Sa` is the source alpha.
-
-*   `Dc` is the destination color.
-
-If `blending` is `false`, the source color and source alpha overwrite the
-destination color and alpha.
-
-#### Declaration ####
-
-```
-bool SbBlitterSetBlending(SbBlitterContext context, bool blending)
-```
-
-### SbBlitterSetColor ###
-
-Sets the context's current color. The current color's default value is
-`SbBlitterColorFromRGBA(255, 255, 255 255)`.
-
-The current color affects the fill rectangle's color in calls to
-`SbBlitterFillRect()`. If `SbBlitterSetModulateBlitsWithColor()` has been called
-to enable blit color modulation, the source blit surface pixel color is also
-modulated by the color before being output.
-
-This function is not thread-safe.
-
-The return value indicates whether the color was set successfully.
-
-`context`: The context for which the color is being set. `color`: The context's
-new color, specified in unpremultiplied alpha format.
-
-#### Declaration ####
-
-```
-bool SbBlitterSetColor(SbBlitterContext context, SbBlitterColor color)
-```
-
-### SbBlitterSetModulateBlitsWithColor ###
-
-Sets whether or not blit calls should have their source pixels modulated by the
-current color, which is set using `SbBlitterSetColor()`, before being output.
-This function can apply opacity to blit calls, color alpha-only surfaces, and
-apply other effects.
-
-This function is not thread-safe.
-
-The return value indicates whether the state was set successfully.
-
-`modulate_blits_with_color`: Indicates whether to modulate source pixels in blit
-calls.
-
-#### Declaration ####
-
-```
-bool SbBlitterSetModulateBlitsWithColor(SbBlitterContext context, bool modulate_blits_with_color)
-```
-
-### SbBlitterSetRenderTarget ###
-
-Sets up `render_target` as the render target that all subsequent draw calls made
-on `context` will use.
-
-This function is not thread-safe.
-
-The return value indicates whether the render target was set successfully.
-
-`context`: The object for which the render target is being set. `render_target`:
-The target that the `context` should use for draw calls.
-
-#### Declaration ####
-
-```
-bool SbBlitterSetRenderTarget(SbBlitterContext context, SbBlitterRenderTarget render_target)
-```
-
-### SbBlitterSetScissor ###
-
-Sets the scissor rectangle, which dictates a visibility area that affects all
-draw calls. Only pixels within the scissor rectangle are rendered, and all
-drawing outside of that area is clipped.
-
-When `SbBlitterSetRenderTarget()` is called, that function automatically sets
-the scissor rectangle to the size of the specified render target. If a scissor
-rectangle is specified outside of the extents of the current render target
-bounds, it will be intersected with the render target bounds.
-
-This function is not thread-safe.
-
-Returns whether the scissor was successfully set. It returns an error if it is
-called before a render target has been specified for the context.
-
-#### Declaration ####
-
-```
-bool SbBlitterSetScissor(SbBlitterContext context, SbBlitterRect rect)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
index be08866..6cb7819 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
@@ -38,11 +38,6 @@
 
 Determines a compile-time capability of the system.
 
-### SB_CAN_MEDIA_USE_STARBOARD_PIPELINE ###
-
-Specifies whether the starboard media pipeline components (SbPlayerPipeline and
-StarboardDecryptor) are used. Set to 0 means they are not used.
-
 ### SB_COMPILE_ASSERT(expr, msg) ###
 
 Will cause a compiler error with `msg` if `expr` is false. `msg` must be a valid
@@ -83,20 +78,13 @@
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_AC3_AUDIO_API_VERSION ###
+### SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER ###
 
-Add support for audio in ac3.
-
-### SB_HAS_AV1_VERSION ###
-
-Replace kSbMediaVideoCodecVp10 by kSbMediaVideoCodecAv1. kSbMediaVideoCodecVp10
-in media.h is replaced by kSbMediaVideoCodecAv1.
-
-### SB_HAS_DRM_KEY_STATUSES ###
-
-Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above as
-SB_PREFERRED_RGBA_BYTE_ORDER_*. If your platform uses GLES, you should set this
-to SB_PREFERRED_RGBA_BYTE_ORDER_RGBA.
+Deprecated feature macros These feature macros are deprecated in Starboard
+version 6 and later, and are no longer referenced by application code. They will
+be removed in a future version. Any Starboard implementation that supports
+Starboard version 6 or later should be modified to no longer depend on these
+macros, with the assumption that their values are always 1.
 
 ### SB_HAS_GLES2 ###
 
@@ -113,30 +101,6 @@
 
 Determines at compile-time whether this platform has a quirk.
 
-### SB_HAS_SCREEN_DIAGONAL_API_VERSION ###
-
-Adds support for allowing the platform to override its screen diagonal length
-via SbWindowGetDiagonalSizeInInches().
-
-### SB_HAS_STARTUP_URL_SIGNING_VERSION ###
-
-Add support for startup url signing by adding
-kSbSystemPropertyCertificationScope and
-kSbSystemPropertyBase64EncodedCertificationSecret system property enums to
-system.h.
-
-### SB_HAS_STD_UNORDERED_HASH_API_VERSION ###
-
-Add support for using C++11 standard unordered maps and sets. By setting
-SB_HAS_STD_UNORDERED_HASH to 1, a platform can be configured to use C++11
-standard hash table implementations, specifically, using: . std::unordered_map<>
-for base::hash_map<>, and . std::unordered_multimap<> for base::hash_multimap<>,
-and . std::unordered_set<> for base::hash_set<>, and . std::unordered_multiset<>
-for base::hash_multiset<>. When SB_HAS_STD_UNORDERED_HASH is used, it is no
-longer necessary to specify SB_HAS_LONG_LONG_HASH, SB_HAS_STRING_HASH,
-SB_HAS_HASH_USING, SB_HAS_HASH_VALUE, SB_HAS_HASH_WARNING, SB_HASH_MAP_INCLUDE,
-SB_HASH_NAMESPACE, or SB_HASH_SET_INCLUDE.
-
 ### SB_INT64_C(x) ###
 
 Declare numeric literals of signed 64-bit type.
@@ -147,7 +111,10 @@
 
 ### SB_IS_LITTLE_ENDIAN ###
 
-Whether the current platform is little endian.
+Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above as
+SB_PREFERRED_RGBA_BYTE_ORDER_*. If your platform uses GLES, you should set this
+to SB_PREFERRED_RGBA_BYTE_ORDER_RGBA. Whether the current platform is little
+endian.
 
 ### SB_LIKELY(x) ###
 
@@ -158,13 +125,6 @@
 The maximum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_MEDIA_EOTF_CHECK_SUPPORT_VERSION ###
-
-Add SbMediaTransferId* argument `eotf` to SbMediaIsVideoSupported, so the
-platform may indicate support of resolution, bitrate, fps, and codec conditioned
-on eotf. Also, remove the function SbMediaIsTransferCharacteristicsSupported
-which is no longer necessary.
-
 ### SB_MINIMUM_API_VERSION ###
 
 The minimum API version allowed by this version of the Starboard headers,
@@ -182,10 +142,10 @@
 
 ### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
 
-An enumeration of values for the SB_PREFERRED_RGBA_BYTE_ORDER configuration
-variable. Setting this up properly means avoiding slow color swizzles when
-passing pixel data from one library to another. Note that these definitions are
-in byte-order and so are endianness-independent.
+An enumeration of values for the kSbPreferredByteOrder configuration variable.
+Setting this up properly means avoiding slow color swizzles when passing pixel
+data from one library to another. Note that these definitions are in byte-order
+and so are endianness-independent.
 
 ### SB_PRINTF_FORMAT(format_param, dots_param) ###
 
@@ -207,9 +167,17 @@
 
 Include the platform-specific configuration. This macro is set by GYP in
 starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations.Makes a pointer-typed parameter restricted so that the
-compiler can make certain optimizations because it knows the pointers are
-unique.
+all configurations. After version 12, we start to use runtime constants instead
+of macros for certain platform dependent configurations. This file substitutes
+configuration macros for the corresponding runtime constants so we don't
+reference these constants when they aren't defined. Makes a pointer-typed
+parameter restricted so that the compiler can make certain optimizations because
+it knows the pointers are unique.
+
+### SB_SIZE_OF(DATATYPE) ###
+
+Determines at compile-time the size of a data type, or 0 if the data type that
+was specified was invalid.
 
 ### SB_STRINGIFY(x) ###
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md b/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md
index 1540465..0b9442b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md
@@ -7,8 +7,7 @@
 when there are **hardware-accelerated** hardware-accelerated cryptography
 facilities. Applications must fall back to platform-independent CPU-based
 algorithms if the cipher algorithm isn't supported in hardware.
-
-## Tips for Porters ##
+Tips for Porters
 
 You should implement cipher algorithms in this descending order of priority to
 maximize usage for SSL.
@@ -136,6 +135,8 @@
 `initialization_vector_size`: The size, in bytes, of the IV. `key`: The key to
 use for this transformation. `key_size`: The size, in bytes, of the key.
 
+presubmit: allow sb_export mismatch
+
 #### Declaration ####
 
 ```
@@ -146,6 +147,8 @@
 
 Destroys the given `transformer` instance.
 
+presubmit: allow sb_export mismatch
+
 #### Declaration ####
 
 ```
@@ -159,6 +162,8 @@
 tag, which mainly has to do with whether it is compatible with the current block
 cipher mode.
 
+presubmit: allow sb_export mismatch
+
 #### Declaration ####
 
 ```
@@ -182,6 +187,8 @@
 fail if the chaining mode doesn't support AAD, if the parameters are invalid, or
 if the internal state is invalid for setting AAD.
 
+presubmit: allow sb_export mismatch
+
 #### Declaration ####
 
 ```
@@ -195,6 +202,8 @@
 every block, so this is not necessary unless the stream is discontiguous in some
 way. This happens with AES-GCM in TLS.
 
+presubmit: allow sb_export mismatch
+
 #### Declaration ####
 
 ```
@@ -215,6 +224,8 @@
 transformed data should be placed. Must have at least capacity for
 `in_data_size` bytes. May point to the same memory as `in_data`.
 
+presubmit: allow sb_export mismatch
+
 #### Declaration ####
 
 ```
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md b/src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md
index 88e2643..e35f05a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md
@@ -12,8 +12,7 @@
 data. This allows the application to allocate fast graphics memory, and have
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
-
-## SbDecodeTargetFormat ##
+SbDecodeTargetFormat
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -21,8 +20,7 @@
 the SbDecodeTargetFormat passed into it, or the decode will produce an error.
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
-
-## SbDecodeTargetGraphicsContextProvider ##
+SbDecodeTargetGraphicsContextProvider
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -36,8 +34,7 @@
 
 The primary usage is likely to be the the SbPlayer implementation on some
 platforms.
-
-## SbDecodeTarget Example ##
+SbDecodeTarget Example
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -78,6 +75,7 @@
 SbDecodeTargetGetInfo(target, &info);
 GLuint texture =
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
+
 ```
 
 ## Macros ##
@@ -212,6 +210,26 @@
 
     The SbBlitterDevice object that will be used to render any produced
     SbDecodeTargets.
+*   `void * egl_display`
+
+    A reference to the EGLDisplay object that hosts the EGLContext that will be
+    used to render any produced SbDecodeTargets. Note that it has the type
+    `void*` in order to avoid #including the EGL header files here.
+*   `void * egl_context`
+
+    The EGLContext object that will be used to render any produced
+    SbDecodeTargets. Note that it has the type `void*` in order to avoid
+    #including the EGL header files here.
+*   `SbDecodeTargetGlesContextRunner gles_context_runner`
+
+    The `gles_context_runner` function pointer is passed in from the application
+    into the Starboard implementation, and can be invoked by the Starboard
+    implementation to allow running arbitrary code on the renderer's thread with
+    the EGLContext above held current.
+*   `void * gles_context_runner_context`
+
+    Context data that is to be passed in to `gles_context_runner` when it is
+    invoked.
 
 ### SbDecodeTargetInfo ###
 
@@ -254,6 +272,9 @@
 #### Members ####
 
 *   `int left`
+
+    These integer values are assumed to be in units of pixels, within the
+    texture's width and height.
 *   `int top`
 *   `int right`
 *   `int bottom`
@@ -267,6 +288,20 @@
 *   `SbBlitterSurface surface`
 
     A handle to the Blitter surface that can be used for rendering.
+*   `uint32_t texture`
+
+    A handle to the GL texture that can be used for rendering.
+*   `uint32_t gl_texture_target`
+
+    The GL texture target that should be used in calls to glBindTexture.
+    Typically this would be GL_TEXTURE_2D, but some platforms may require that
+    it be set to something else like GL_TEXTURE_EXTERNAL_OES.
+*   `uint32_t gl_texture_format`
+
+    For kSbDecodeTargetFormat2PlaneYUVNV12 planes: the format of the texture.
+    Usually, for the luma plane, this is either GL_ALPHA or GL_RED_EXT. For the
+    chroma plane, this is usually GL_LUMINANCE_ALPHA or GL_RG_EXT. Ignored for
+    other plane types.
 *   `int width`
 
     The width of the texture/surface for this particular plane.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/directory.md b/src/cobalt/site/docs/reference/starboard/modules/10/directory.md
index 7288d2d..2ec9cca 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/directory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/directory.md
@@ -81,6 +81,10 @@
 Populates `out_entry` with the next entry in the specified directory stream, and
 moves the stream forward by one entry.
 
+Platforms may, but are not required to, return `.` (referring to the directory
+itself) and/or `..` (referring to the directory's parent directory) as entries
+in the directory stream.
+
 This function returns `true` if there was a next directory, and `false` at the
 end of the directory stream.
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/drm.md b/src/cobalt/site/docs/reference/starboard/modules/10/drm.md
index b76b672..9e40e05 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/drm.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/drm.md
@@ -101,19 +101,23 @@
 A callback that will receive generated session update request when requested
 from a SbDrmSystem. `drm_system` will be the DRM system that
 SbDrmGenerateSessionUpdateRequest() was called on. `context` will be the same
-context that was passed into the call to SbDrmCreateSystem().`status` is the
-status of the session request.
+context that was passed into the call to SbDrmCreateSystem().
+
+`status` is the status of the session request.
 
 `type` is the status of the session request.
 
 `error_message` may contain an optional error message when `status` isn't
 `kSbDrmStatusSuccess` to provide more details about the error. It may be NULL if
-`status` is `kSbDrmStatusSuccess` or if no error message can be
-provided.`ticket` will be the same ticket that was passed to
+`status` is `kSbDrmStatusSuccess` or if no error message can be provided.
+`ticket` will be the same ticket that was passed to
 SbDrmGenerateSessionUpdateRequest() or `kSbDrmTicketInvalid` if the update
 request was generated by the DRM system.
 
-`session_id` can be NULL if there was an error generating the request.
+`session_id` cannot be NULL when `ticket` is `kSbDrmTicketInvalid`, even when
+there was an error generating the request. This allows Cobalt to find and reject
+the correct Promise corresponding to the associated
+SbDrmGenerateSessionUpdateRequest().
 
 #### Definition ####
 
@@ -128,13 +132,14 @@
 system that SbDrmUpdateSession() was called on. `context` will be the same
 context passed into that call to SbDrmCreateSystem().
 
-`ticket` will be the same ticket that was passed to
-SbDrmUpdateSession().`status` is the status of the session request.
+`ticket` will be the same ticket that was passed to SbDrmUpdateSession().
+
+`status` is the status of the session request.
 
 `error_message` may contain an optional error message when `status` isn't
 `kSbDrmStatusSuccess` to provide more details about the error. It may be NULL if
-`status` is `kSbDrmStatusSuccess` or if no error message can be
-provided.`succeeded` is whether the session was successfully updated or not.
+`status` is `kSbDrmStatusSuccess` or if no error message can be provided.
+`succeeded` is whether the session was successfully updated or not.
 
 #### Definition ####
 
@@ -215,40 +220,6 @@
 void SbDrmCloseSession(SbDrmSystem drm_system, const void *session_id, int session_id_size)
 ```
 
-### SbDrmCreateSystem ###
-
-Creates a new DRM system that can be used when constructing an SbPlayer or an
-SbDecoder.
-
-This function returns kSbDrmSystemInvalid if `key_system` is unsupported.
-
-Also see the documentation of SbDrmGenerateSessionUpdateRequest() and
-SbDrmUpdateSession() for more details.
-
-`key_system`: The DRM key system to be created. The value should be in the form
-of "com.example.somesystem" as suggested by [https://w3c.github.io/encrypted-media/#key-system](https://w3c.github.io/encrypted-media/#key-system)) . All
-letters in the value should be lowercase and will be matched exactly with known
-DRM key systems of the platform. `context`: A value passed when any of this
-function's callback parameters are called. `update_request_callback`: A function
-that is called every time after SbDrmGenerateSessionUpdateRequest() is called.
-`session_updated_callback`: A function that is called every time after
-SbDrmUpdateSession() is called. `key_statuses_changed_callback`: A function that
-can be called to indicate that key statuses have changed.
-`server_certificate_updated_callback`: A function that is called to report
-whether the server certificate has been successfully updated. It is called once
-and only once. It is possible that the callback is called before the function
-returns. `session_closed_callback`: A function that can be called to indicate
-that a session has closed.If `NULL` is passed for any of the callbacks
-(`update_request_callback`, `session_updated_callback`,
-`key_statuses_changed_callback`, `server_certificate_updated_callback`, or
-`session_closed_callback`), then `kSbDrmSystemInvalid` must be returned.
-
-#### Declaration ####
-
-```
-SbDrmSystem SbDrmCreateSystem(const char *key_system, void *context, SbDrmSessionUpdateRequestFunc update_request_callback, SbDrmSessionUpdatedFunc session_updated_callback, SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback, SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback, SbDrmSessionClosedFunc session_closed_callback)
-```
-
 ### SbDrmDestroySystem ###
 
 Destroys `drm_system`, which implicitly removes all keys installed in it and
@@ -305,30 +276,6 @@
 void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
 ```
 
-### SbDrmGetKeyCount ###
-
-Returns the number of keys installed in `drm_system`.
-
-`drm_system`: The system for which the number of installed keys is retrieved.
-
-#### Declaration ####
-
-```
-int SbDrmGetKeyCount(SbDrmSystem drm_system)
-```
-
-### SbDrmGetKeyStatus ###
-
-Gets `out_key`, `out_key_size`, and `out_status` for the key with `index` in
-`drm_system`. Returns whether a key is installed at `index`. If not, the output
-parameters, which all must not be NULL, will not be modified.
-
-#### Declaration ####
-
-```
-bool SbDrmGetKeyStatus(SbDrmSystem drm_system, const void *session_id, int session_id_size, int index, void **out_key, int *out_key_size, SbDrmKeyStatus *out_status)
-```
-
 ### SbDrmIsServerCertificateUpdatable ###
 
 Returns true if server certificate of `drm_system` can be updated via
@@ -343,19 +290,6 @@
 bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system)
 ```
 
-### SbDrmRemoveAllKeys ###
-
-Removes all installed keys for `drm_system`. Any outstanding session update
-requests are also invalidated.
-
-`drm_system`: The DRM system for which keys should be removed.
-
-#### Declaration ####
-
-```
-void SbDrmRemoveAllKeys(SbDrmSystem drm_system)
-```
-
 ### SbDrmSystemIsValid ###
 
 Indicates whether `drm_system` is a valid SbDrmSystem.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/event.md b/src/cobalt/site/docs/reference/starboard/modules/10/event.md
index 4ea1f95..d25add0 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/event.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/event.md
@@ -4,8 +4,7 @@
 ---
 
 Defines the event system that wraps the Starboard main loop and entry point.
-
-## The Starboard Application Lifecycle ##
+The Starboard Application Lifecycle
 
 ```
     ---------- *
@@ -184,7 +183,11 @@
     The platform's accessibility settings have changed. The application should
     query the accessibility settings using the appropriate APIs to get the new
     settings. Note this excludes captions settings changes, which causes
-    kSbEventTypeAccessibilityCaptionSettingsChanged to fire.
+    kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
+    version has kSbEventTypeAccessiblityTextToSpeechSettingsChanged, then that
+    event should be used to signal text-to-speech settings changes instead;
+    platforms using older starboard versions should use
+    kSbEventTypeAccessiblitySettingsChanged for text-to-speech settings changes.
 *   `kSbEventTypeLowMemory`
 
     An optional event that platforms may send to indicate that the application
@@ -234,8 +237,8 @@
     kSbEventOnScreenKeyboardInvalidTicket.
 *   `kSbEventTypeAccessibilityCaptionSettingsChanged`
 
-    One or more of the fields returned by SbAccessibilityGetCaptionSettings has
-    changed.
+    SB_HAS(ON_SCREEN_KEYBOARD) One or more of the fields returned by
+    SbAccessibilityGetCaptionSettings has changed.
 
 ## Typedefs ##
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/export.md b/src/cobalt/site/docs/reference/starboard/modules/10/export.md
index a6907e2..ff79777 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/export.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/export.md
@@ -10,8 +10,15 @@
 
 ### SB_EXPORT ###
 
-COMPONENT_BUILD is defined when generating shared libraries for each project,
-rather than static libraries. This means we need to be careful about
-EXPORT/IMPORT. SB_IS_LIBRARY is defined when building Starboard as a shared
-library to be linked into a client app. In this case, we want to explicitly
-define EXPORT/IMPORT so that Starboard's symbols are visible to such clients.
+Specification for a symbol that should be exported when building the DLL and
+imported when building code that uses the DLL.
+
+### SB_EXPORT_PRIVATE ###
+
+Specification for a symbol that should be exported or imported for testing
+purposes only.
+
+### SB_IMPORT ###
+
+Specification for a symbol that is expected to be defined externally to this
+module.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/image.md b/src/cobalt/site/docs/reference/starboard/modules/10/image.md
index 634dab8..c911e41 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/image.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/image.md
@@ -10,8 +10,7 @@
 
 All functions in this module are safe to call from any thread at any point in
 time.
-
-## SbImageIsDecodeSupported and SbImageDecode Example ##
+SbImageIsDecodeSupported and SbImageDecode Example
 
 Let's assume that we're on a Blitter platform.
 
@@ -31,6 +30,7 @@
 SbBlitterSurface surface =
     SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
 // Do stuff with surface...
+
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/input.md b/src/cobalt/site/docs/reference/starboard/modules/10/input.md
index d607e0a..3554af6 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/input.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/input.md
@@ -163,6 +163,9 @@
 *   `const char * input_text`
 
     The text to input for events of type `Input`.
+*   `bool is_composing`
+
+    Set to true if the input event is part of a composition event.
 
 ### SbInputVector ###
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/log.md b/src/cobalt/site/docs/reference/starboard/modules/10/log.md
index fd98e08..1ad6c24 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/log.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/log.md
@@ -3,7 +3,7 @@
 title: "Starboard Module Reference: log.h"
 ---
 
-Defines debug logging functions.
+Defines core debug logging functions.
 
 ## Enums ##
 
@@ -24,7 +24,8 @@
 
 ### SbLog ###
 
-Writes `message` to the platform's debug output log.
+Writes `message` to the platform's debug output log. This method is thread-safe,
+and responsible for ensuring that the output from multiple threads is not mixed.
 
 `priority`: The SbLogPriority at which the message should be logged. Note that
 passing `kSbLogPriorityFatal` does not terminate the program. Such a policy must
@@ -42,7 +43,8 @@
 
 ### SbLogFlush ###
 
-Flushes the log buffer on some platforms.
+Flushes the log buffer on some platforms. This method is safe to call from
+multiple threads.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/media.md b/src/cobalt/site/docs/reference/starboard/modules/10/media.md
index 60ee90d..9b83d06 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/media.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/media.md
@@ -27,6 +27,7 @@
 *   `kSbMediaAudioCodecNone`
 *   `kSbMediaAudioCodecAac`
 *   `kSbMediaAudioCodecAc3`
+*   `kSbMediaAudioCodecEac3`
 *   `kSbMediaAudioCodecOpus`
 *   `kSbMediaAudioCodecVorbis`
 
@@ -156,10 +157,22 @@
 *   `kSbMediaVideoCodecMpeg2`
 *   `kSbMediaVideoCodecTheora`
 *   `kSbMediaVideoCodecVc1`
-*   `kSbMediaVideoCodecAv1`
+*   `kSbMediaVideoCodecVp10`
 *   `kSbMediaVideoCodecVp8`
 *   `kSbMediaVideoCodecVp9`
 
+## Typedefs ##
+
+### SbMediaAudioHeader ###
+
+SbMediaAudioHeader is same as SbMediaAudioSampleInfo in old starboard version.
+
+#### Definition ####
+
+```
+typedef SbMediaAudioSampleInfo SbMediaAudioHeader
+```
+
 ## Structs ##
 
 ### SbMediaAudioConfiguration ###
@@ -189,17 +202,22 @@
     `0` if this device cannot provide this information, in which case the caller
     can probably assume stereo output.
 
-### SbMediaAudioHeader ###
+### SbMediaAudioSampleInfo ###
 
-An audio sequence header, which is a description of a given audio stream. This,
-in hexadecimal string form, acts as a set of instructions to the audio decoder.
+An audio sample info, which is a description of a given audio sample. This, in
+hexadecimal string form, acts as a set of instructions to the audio decoder.
 
-The Sequence Header consists of a little-endian hexadecimal encoded
+The audio sample info consists of a little-endian hexadecimal encoded
 `WAVEFORMATEX` structure followed by an Audio-specific configuration field. The
 `WAVEFORMATEX` structure is specified at: [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)
 
 #### Members ####
 
+*   `const char * mime`
+
+    The mime of the audio stream when `codec` isn't kSbMediaAudioCodecNone. It
+    may point to an empty string if the mime is not available, and it can only
+    be set to NULL when `codec` is kSbMediaAudioCodecNone.
 *   `uint16_t format_tag`
 
     The waveform-audio format type code.
@@ -363,6 +381,23 @@
 
 #### Members ####
 
+*   `const char * mime`
+
+    The mime of the video stream when `codec` isn't kSbMediaVideoCodecNone. It
+    may point to an empty string if the mime is not available, and it can only
+    be set to NULL when `codec` is kSbMediaVideoCodecNone.
+*   `const char * max_video_capabilities`
+
+    Indicates the max video capabilities required. The web app will not provide
+    a video stream exceeding the maximums described by this parameter. Allows
+    the platform to optimize playback pipeline for low quality video streams if
+    it knows that it will never adapt to higher quality streams. The string uses
+    the same format as the string passed in to SbMediaCanPlayMimeAndKeySystem(),
+    for example, when it is set to "width=1920; height=1080; framerate=15;", the
+    video will never adapt to resolution higher than 1920x1080 or frame per
+    second higher than 15 fps. When the maximums are unknown, this will be set
+    to an empty string. It can only be set to NULL when `codec` is
+    kSbMediaVideoCodecNone.
 *   `bool is_key_frame`
 
     Indicates whether the associated sample is a key frame (I-frame). Video key
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/memory.md b/src/cobalt/site/docs/reference/starboard/modules/10/memory.md
index 676bd44..a3fecb6 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/memory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/memory.md
@@ -4,14 +4,12 @@
 ---
 
 Defines functions for memory allocation, alignment, copying, and comparing.
-
-## Porters ##
+Porters
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
-
-## Porters and Application Developers ##
+Porters and Application Developers
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -48,7 +46,7 @@
 
 ### SbMemoryAlignToPageSize ###
 
-Rounds `size` up to SB_MEMORY_PAGE_SIZE.
+Rounds `size` up to kSbMemoryPageSize.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/player.md b/src/cobalt/site/docs/reference/starboard/modules/10/player.md
index a4c97c1..129d94d 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/player.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/player.md
@@ -114,19 +114,6 @@
 typedef void(* SbPlayerDecoderStatusFunc) (SbPlayer player, void *context, SbMediaType type, SbPlayerDecoderState state, int ticket)
 ```
 
-### SbPlayerEncryptedMediaInitDataEncounteredCB ###
-
-Callback to queue an encrypted event for initialization data encountered in
-media data. `init_data_type` should be a string matching one of the EME
-initialization data types : "cenc", "fairplay", "keyids", or "webm", `init_data`
-is the initialization data, and `init_data_length` is the length of the data.
-
-#### Definition ####
-
-```
-typedef void(* SbPlayerEncryptedMediaInitDataEncounteredCB) (SbPlayer player, void *context, const char *init_data_type, const unsigned char *init_data, unsigned int init_data_length)
-```
-
 ### SbPlayerErrorFunc ###
 
 Callback for player errors, that may set a `message`. `error`: indicates the
@@ -154,6 +141,37 @@
 
 ## Structs ##
 
+### SbPlayerCreationParam ###
+
+The playback related parameters to pass into SbPlayerCreate() and
+SbPlayerGetPreferredOutputMode().
+
+#### Members ####
+
+*   `SbDrmSystem drm_system`
+
+    Provides an appropriate DRM system if the media stream has encrypted
+    portions. It will be `kSbDrmSystemInvalid` if the stream does not have
+    encrypted portions.
+*   `SbMediaAudioSampleInfo audio_sample_info`
+
+    Contains a populated SbMediaAudioSampleInfo if `audio_sample_info.codec`
+    isn't `kSbMediaAudioCodecNone`. When `audio_sample_info.codec` is
+    `kSbMediaAudioCodecNone`, the video doesn't have an audio track.
+*   `SbMediaVideoSampleInfo video_sample_info`
+
+    Contains a populated SbMediaVideoSampleInfo if `video_sample_info.codec`
+    isn't `kSbMediaVideoCodecNone`. When `video_sample_info.codec` is
+    `kSbMediaVideoCodecNone`, the video is audio only.
+*   `SbPlayerOutputMode output_mode`
+
+    Selects how the decoded video frames will be output. For example,
+    `kSbPlayerOutputModePunchOut` indicates that the decoded video frames will
+    be output to a background video layer by the platform, and
+    `kSbPlayerOutputDecodeToTexture` indicates that the decoded video frames
+    should be made available for the application to pull via calls to
+    SbPlayerGetCurrentFrame().
+
 ### SbPlayerInfo2 ###
 
 Information about the current media playback state.
@@ -204,12 +222,6 @@
     is at normal speed. When it is greater than one, the video is played in a
     faster than normal speed. When it is less than one, the video is played in a
     slower than normal speed. Negative speeds are not supported.
-*   `SbTime buffer_start_timestamp`
-
-    The position of the buffer head, as precisely as possible, in microseconds.
-*   `SbTime buffer_duration`
-
-    The known duration of the currently playing media buffer, in microseconds.
 
 ### SbPlayerSampleInfo ###
 
@@ -237,39 +249,71 @@
 
 ## Functions ##
 
-### SbPlayerCreateWithUrl ###
+### SbPlayerCreate ###
 
-Creates a URL-based SbPlayer that will be displayed on `window` for the
-specified URL `url`, acquiring all resources needed to operate it, and returning
-an opaque handle to it. The expectation is that a new player will be created and
-destroyed for every playback.
+Creates a player that will be displayed on `window` for the specified
+`video_codec` and `audio_codec`, acquiring all resources needed to operate it,
+and returning an opaque handle to it. The expectation is that a new player will
+be created and destroyed for every playback.
 
-In many ways this function is similar to SbPlayerCreate, but it is missing the
-input arguments related to the configuration and format of the audio and video
-stream, as well as the DRM system. The DRM system for a player created with
-SbPlayerCreateWithUrl can be set after creation using SbPlayerSetDrmSystem.
-Because the DRM system is not available at the time of SbPlayerCreateWithUrl, it
-takes in a callback, `encrypted_media_init_data_encountered_cb`, which is run
-when encrypted media initial data is encountered.If the callback is `NULL`, then
-`kSbPlayerInvalid` must be returned.
+This function returns the created player. Note the following:
+
+*   The associated decoder of the returned player should be assumed to not be in
+    `kSbPlayerDecoderStateNeedsData` until SbPlayerSeek() has been called on it.
+
+*   It is expected either that the thread that calls SbPlayerCreate is the same
+    thread that calls the other `SbPlayer` functions for that player, or that
+    there is a mutex guarding calls into each `SbPlayer` instance.
+
+*   If there is a platform limitation on how many players can coexist
+    simultaneously, then calls made to this function that attempt to exceed that
+    limit must return `kSbPlayerInvalid`. Multiple calls to SbPlayerCreate must
+    not cause a crash.
+
+`window`: The window that will display the player. `window` can be
+`kSbWindowInvalid` for platforms where video is only displayed on a particular
+window that the underlying implementation already has access to.
+
+`video_codec`: The video codec used for the player. If `video_codec` is
+`kSbMediaVideoCodecNone`, the player is an audio-only player. If `video_codec`
+is any other value, the player is an audio/video decoder. This can be set to
+`kSbMediaVideoCodecNone` to play a video with only an audio track.
+
+`audio_codec`: The audio codec used for the player. The caller must provide a
+populated `audio_sample_info` if audio codec is `kSbMediaAudioCodecAac`. Can be
+set to `kSbMediaAudioCodecNone` to play a video without any audio track. In such
+case `audio_sample_info` must be NULL.
+
+`drm_system`: If the media stream has encrypted portions, then this parameter
+provides an appropriate DRM system, created with `SbDrmCreateSystem()`. If the
+stream does not have encrypted portions, then `drm_system` may be
+`kSbDrmSystemInvalid`. `audio_header`: `audio_header` is same as
+`audio_sample_info` in old starboard version. When `audio_codec` is
+`kSbMediaAudioCodecNone`, this must be set to NULL. Note that
+`audio_specific_config` is a pointer and the content it points to is no longer
+valid after this function returns. The implementation has to make a copy of the
+content if it is needed after the function returns.
 
 #### Declaration ####
 
 ```
-SbPlayer SbPlayerCreateWithUrl(const char *url, SbWindow window, SbPlayerStatusFunc player_status_func, SbPlayerEncryptedMediaInitDataEncounteredCB encrypted_media_init_data_encountered_cb, SbPlayerErrorFunc player_error_func, void *context)
+SbPlayer SbPlayerCreate(SbWindow window, const SbPlayerCreationParam *creation_param, SbPlayerDeallocateSampleFunc sample_deallocate_func, SbPlayerDecoderStatusFunc decoder_status_func, SbPlayerStatusFunc player_status_func, SbPlayerErrorFunc player_error_func, void *context, SbDecodeTargetGraphicsContextProvider *context_provider)
 ```
 
 ### SbPlayerDestroy ###
 
-Destroys `player`, freeing all associated resources. Each callback must receive
-one more callback to say that the player was destroyed. Callbacks may be in-
-flight when SbPlayerDestroy is called, and should be ignored once this function
-is called.
+Destroys `player`, freeing all associated resources.
 
-It is not allowed to pass `player` into any other `SbPlayer` function once
-SbPlayerDestroy has been called on that player.
+*   Upon calling this method, there should be one call to the player status
+    callback (i.e. `player_status_func` used in the creation of the player)
+    which indicates the player is destroyed. Note, the callback has to be in-
+    flight when SbPlayerDestroyed is called.
 
-`player`: The player to be destroyed.
+*   No more other callbacks should be issued after this function returns.
+
+*   It is not allowed to pass `player` into any other `SbPlayer` function once
+    SbPlayerDestroy has been called on that player. `player`: The player to be
+    destroyed.
 
 #### Declaration ####
 
@@ -327,6 +371,30 @@
 int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player, SbMediaType sample_type)
 ```
 
+### SbPlayerGetPreferredOutputMode ###
+
+Returns the preferred output mode of the implementation when a video described
+by `creation_param` is played. It is assumed that it is okay to call
+SbPlayerCreate() with the same video described by `creation_param`, with its
+`output_mode` member replaced by the returned output mode. When the caller has
+no preference on the output mode, it will set `creation_param->output_mode` to
+`kSbPlayerOutputModeInvalid`, and the implementation can return its preferred
+output mode based on the information contained in `creation_param`. The caller
+can also set `creation_param->output_mode` to its preferred output mode, and the
+implementation should return the same output mode if it is supported, otherwise
+the implementation should return an output mode that it is supported, as if
+`creation_param->output_mode` is set to `kSbPlayerOutputModeInvalid` prior to
+the call. Note that it is not the responsibility of this function to verify
+whether the video described by `creation_param` can be played on the platform,
+and the implementation should try its best effort to return a valid output mode.
+`creation_param` will never be NULL.
+
+#### Declaration ####
+
+```
+SbPlayerOutputMode SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam *creation_param)
+```
+
 ### SbPlayerIsValid ###
 
 Returns whether the given player handle is valid.
@@ -337,18 +405,6 @@
 static bool SbPlayerIsValid(SbPlayer player)
 ```
 
-### SbPlayerOutputModeSupportedWithUrl ###
-
-Returns true if the given URL player output mode is supported by the platform.
-If this function returns true, it is okay to call SbPlayerCreate() with the
-given `output_mode`.
-
-#### Declaration ####
-
-```
-bool SbPlayerOutputModeSupportedWithUrl(SbPlayerOutputMode output_mode)
-```
-
 ### SbPlayerSetBounds ###
 
 Sets the player bounds to the given graphics plane coordinates. The changes do
@@ -376,17 +432,6 @@
 void SbPlayerSetBounds(SbPlayer player, int z_index, int x, int y, int width, int height)
 ```
 
-### SbPlayerSetDrmSystem ###
-
-Sets the DRM system of a running URL-based SbPlayer created with
-SbPlayerCreateWithUrl. This may only be run once for a given SbPlayer.
-
-#### Declaration ####
-
-```
-void SbPlayerSetDrmSystem(SbPlayer player, SbDrmSystem drm_system)
-```
-
 ### SbPlayerSetPlaybackRate ###
 
 Set the playback rate of the `player`. `rate` is default to 1.0 which indicates
@@ -439,42 +484,15 @@
 
 ### SbPlayerWriteSample2 ###
 
-Writes a single sample of the given media type to `player`'s input stream. Its
-data may be passed in via more than one buffers. The lifetime of
-`sample_buffers`, `sample_buffer_sizes`, `video_sample_info`, and
-`sample_drm_info` (as well as member `subsample_mapping` contained inside it)
-are not guaranteed past the call to SbPlayerWriteSample. That means that before
-returning, the implementation must synchronously copy any information it wants
-to retain from those structures.
-
-`player`: The player to which the sample is written. `sample_type`: The type of
-sample being written. See the `SbMediaType` enum in media.h. `sample_buffers`: A
-pointer to an array of buffers with `number_of_sample_buffers` elements that
-hold the data for this sample. The buffers are expected to be a portion of a
-bytestream of the codec type that the player was created with. The buffers
-should contain a sequence of whole NAL Units for video, or a complete audio
-frame. `sample_buffers` cannot be assumed to live past the call into
-SbPlayerWriteSample(), so it must be copied if its content will be used after
-SbPlayerWriteSample() returns. `sample_buffer_sizes`: A pointer to an array of
-sizes with `number_of_sample_buffers` elements. Each of them specify the number
-of bytes in the corresponding buffer contained in `sample_buffers`. None of them
-can be 0. `sample_buffer_sizes` cannot be assumed to live past the call into
-SbPlayerWriteSample(), so it must be copied if its content will be used after
-SbPlayerWriteSample() returns. `number_of_sample_buffers`: Specify the number of
-elements contained inside `sample_buffers` and `sample_buffer_sizes`. It has to
-be at least one, or the call will be ignored. `sample_pts`: The timestamp of the
-sample in 90KHz ticks (PTS). Note that samples MAY be written "slightly" out of
-order. `video_sample_info`: Information about a video sample. This value is
-required if `sample_type` is `kSbMediaTypeVideo`. Otherwise, it must be `NULL`.
-`sample_drm_info`: The DRM system related info for the media sample. This value
-is required for encrypted samples. Otherwise, it must be `NULL`.Writes samples
-of the given media type to `player`'s input stream. The lifetime of
-`sample_infos`, and the members of its elements like `buffer`,
+Writes samples of the given media type to `player`'s input stream. The lifetime
+of `sample_infos`, and the members of its elements like `buffer`,
 `video_sample_info`, and `drm_info` (as well as member `subsample_mapping`
 contained inside it) are not guaranteed past the call to SbPlayerWriteSample2.
 That means that before returning, the implementation must synchronously copy any
 information it wants to retain from those structures.
 
+SbPlayerWriteSample2 allows writing of multiple samples in one call.
+
 `player`: The player to which the sample is written. `sample_type`: The type of
 sample being written. See the `SbMediaType` enum in media.h. `sample_infos`: A
 pointer to an array of SbPlayerSampleInfo with `number_of_sample_infos`
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/queue.md b/src/cobalt/site/docs/reference/starboard/modules/10/queue.md
deleted file mode 100644
index 6fdf231..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/queue.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: queue.h"
----
-
-Defines a C++-only synchronized queue implementation, built entirely on top of
-Starboard synchronization primitives. It can be safely used by both clients and
-implementations.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/spin_lock.md b/src/cobalt/site/docs/reference/starboard/modules/10/spin_lock.md
deleted file mode 100644
index dc1989d..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/spin_lock.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: spin_lock.h"
----
-
-Defines a C++-only spin-lock implementation, built entirely on top of Starboard
-atomics and threads. It can be safely used by both clients and implementations.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/storage.md b/src/cobalt/site/docs/reference/starboard/modules/10/storage.md
index a2afdf5..c98207b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/storage.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/storage.md
@@ -149,9 +149,7 @@
 `SbStorageCloseRecord()` is called.
 
 `record`: The record to be written to. `data`: The data to write to the record.
-`data_size`: The amount of `data`, in bytes, to write to the record. Thus, if
-`data_size` is smaller than the total size of `data`, only part of `data` is
-written to the record.
+`data_size`: The amount of `data`, in bytes, to write to the record.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/system.md b/src/cobalt/site/docs/reference/starboard/modules/10/system.md
index 5958fb9..3c2acee 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/system.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/system.md
@@ -156,13 +156,6 @@
 
 #### Values ####
 
-*   `kSbSystemPropertyCertificationScope`
-
-    The certification scope that identifies a group of devices.
-*   `kSbSystemPropertyBase64EncodedCertificationSecret`
-
-    The HMAC-SHA256 base64 encoded symmetric key used to sign a subset of the
-    query parameters from the application startup URL.
 *   `kSbSystemPropertyChipsetModelNumber`
 
     The full model number of the main platform chipset, including any vendor-
@@ -306,11 +299,7 @@
 
 ### SbSystemClearPlatformError ###
 
-Clears a platform error that was previously raised by a call to
-`SbSystemRaisePlatformError`. The platform may use this, for example, to close a
-dialog that was opened in response to the error.
-
-`handle`: The platform error to be cleared.
+presubmit: allow sb_export mismatch
 
 #### Declaration ####
 
@@ -400,32 +389,6 @@
 int SbSystemGetNumberOfProcessors()
 ```
 
-### SbSystemGetPath ###
-
-Retrieves the platform-defined system path specified by `path_id` and places it
-as a zero-terminated string into the user-allocated `out_path` unless it is
-longer than `path_length` - 1. This implementation must be thread-safe.
-
-This function returns `true` if the path is retrieved successfully. It returns
-`false` under any of the following conditions and, in any such case, `out_path`
-is not changed:
-
-*   `path_id` is invalid for this platform
-
-*   `path_length` is too short for the given result
-
-*   `out_path` is NULL
-
-`path_id`: The system path to be retrieved. `out_path`: The platform-defined
-system path specified by `path_id`. `path_length`: The length of the system
-path.
-
-#### Declaration ####
-
-```
-bool SbSystemGetPath(SbSystemPathId path_id, char *out_path, int path_length)
-```
-
 ### SbSystemGetProperty ###
 
 Retrieves the platform-defined system property specified by `property_id` and
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/thread_types.md b/src/cobalt/site/docs/reference/starboard/modules/10/thread_types.md
deleted file mode 100644
index 5f4da0e..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/thread_types.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: thread_types.h"
----
-
-Defines platform-specific threading and synchronization primitive types and
-initializers. We hide, but pass through, the platform's primitives to avoid
-doing a lot of work to replicate initialization-less synchronization primitives.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/window.md b/src/cobalt/site/docs/reference/starboard/modules/10/window.md
index 9c84139..8355b67 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/window.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/window.md
@@ -163,19 +163,6 @@
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowGetDiagonalSizeInInches ###
-
-Gets the size of the diagonal between two opposing screen corners.
-
-A return value of 0 means that starboard does not know what the screen diagonal
-is.
-
-#### Declaration ####
-
-```
-float SbWindowGetDiagonalSizeInInches(SbWindow window)
-```
-
 ### SbWindowGetOnScreenKeyboardBoundingRect ###
 
 Get the rectangle of the on screen keyboard in screen pixel coordinates. Return
@@ -251,7 +238,10 @@
 
 ### SbWindowSetDefaultOptions ###
 
-Sets the default options for system windows.
+Gets the size of the diagonal between two opposing screen corners.
+
+A return value of 0 means that starboard does not know what the screen diagonal
+is. Sets the default options for system windows.
 
 `options`: The option values to use as default values. This object must not be
 `NULL`.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/accessibility.md b/src/cobalt/site/docs/reference/starboard/modules/11/accessibility.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/accessibility.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/accessibility.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/atomic.md b/src/cobalt/site/docs/reference/starboard/modules/11/atomic.md
new file mode 100644
index 0000000..5f79990
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/atomic.md
@@ -0,0 +1,111 @@
+---
+layout: doc
+title: "Starboard Module Reference: atomic.h"
+---
+
+Defines a set of atomic integer operations that can be used as lightweight
+synchronization or as building blocks for heavier synchronization primitives.
+Their use is very subtle and requires detailed understanding of the behavior of
+supported architectures, so their direct use is not recommended except when
+rigorously deemed absolutely necessary for performance reasons.
+
+## Typedefs ##
+
+### SbAtomic64 ###
+
+64-bit atomic operations (only available on 64-bit processors).
+
+#### Definition ####
+
+```
+typedef int64_t SbAtomic64
+```
+
+### SbAtomicPtr ###
+
+Pointer-sized atomic operations. Forwards to either 32-bit or 64-bit functions
+as appropriate.
+
+#### Definition ####
+
+```
+typedef SbAtomic32 SbAtomicPtr
+```
+
+## Functions ##
+
+### SbAtomicAcquire_CompareAndSwap ###
+
+These following lower-level operations are typically useful only to people
+implementing higher-level synchronization operations like spinlocks, mutexes,
+and condition-variables. They combine CompareAndSwap(), a load, or a store with
+appropriate memory-ordering instructions. "Acquire" operations ensure that no
+later memory access can be reordered ahead of the operation. "Release"
+operations ensure that no previous memory access can be reordered after the
+operation. "Barrier" operations have both "Acquire" and "Release" semantics. A
+SbAtomicMemoryBarrier() has "Barrier" semantics, but does no memory access.
+
+#### Declaration ####
+
+```
+static SbAtomic32 SbAtomicAcquire_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
+```
+
+### SbAtomicBarrier_Increment ###
+
+Same as SbAtomicNoBarrier_Increment, but with a memory barrier.
+
+#### Declaration ####
+
+```
+static SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
+```
+
+### SbAtomicNoBarrier_CompareAndSwap ###
+
+Atomically execute: result = *ptr; if (*ptr == old_value) *ptr = new_value;
+return result;
+
+I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". Always
+return the old value of "*ptr"
+
+This routine implies no memory barriers.
+
+#### Declaration ####
+
+```
+static SbAtomic32 SbAtomicNoBarrier_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
+```
+
+### SbAtomicNoBarrier_Exchange ###
+
+Atomically store new_value into *ptr, returning the previous value held in *ptr.
+This routine implies no memory barriers.
+
+#### Declaration ####
+
+```
+static SbAtomic32 SbAtomicNoBarrier_Exchange(volatile SbAtomic32 *ptr, SbAtomic32 new_value)
+```
+
+### SbAtomicNoBarrier_Increment ###
+
+Atomically increment *ptr by "increment". Returns the new value of *ptr with the
+increment applied. This routine implies no memory barriers.
+
+#### Declaration ####
+
+```
+static SbAtomic32 SbAtomicNoBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
+```
+
+### SbAtomicRelease_CompareAndSwap8 ###
+
+Overloaded functions for Atomic8.
+
+#### Declaration ####
+
+```
+static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md b/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md
new file mode 100644
index 0000000..45d0469
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md
@@ -0,0 +1,171 @@
+---
+layout: doc
+title: "Starboard Module Reference: audio_sink.h"
+---
+
+Provides an interface to output raw audio data.
+
+## Macros ##
+
+### kSbAudioSinkInvalid ###
+
+Well-defined value for an invalid audio sink.
+
+## Typedefs ##
+
+### SbAudioSink ###
+
+An opaque handle to an implementation-private structure representing an audio
+sink.
+
+#### Definition ####
+
+```
+typedef struct SbAudioSinkPrivate* SbAudioSink
+```
+
+### SbAudioSinkConsumeFramesFunc ###
+
+Callback used to report frames consumed. The consumed frames will be removed
+from the source frame buffer to free space for new audio frames. When
+`frames_consumed` is updated asynchnously and the last time that it has been
+updated is known, it can be passed in `frames_consumed_at` so the audio time
+calculating can be more accurate.
+
+#### Definition ####
+
+```
+typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, SbTime frames_consumed_at, void *context)
+```
+
+### SbAudioSinkFrameBuffers ###
+
+An array of frame buffers. For interleaved audio streams, there will be only one
+element in the array. For planar audio streams, the number of elements in the
+array equal to the number of channels.
+
+#### Definition ####
+
+```
+typedef void** SbAudioSinkFrameBuffers
+```
+
+### SbAudioSinkUpdateSourceStatusFunc ###
+
+Callback being called periodically to retrieve the status of the audio source.
+The first two output parameters indicating the filling level of the audio frame
+buffer passed to SbAudioSinkCreate as `frame_buffers`. As `frame_buffers` is a
+circular buffer, `offset_in_frames` can be used to calculate the number of
+continuous frames towards the end of the buffer. The audio sink can play the
+frames only when `is_playing` is true. It should pause the playback when
+`is_playing` is false. The audio sink may cache certain amount of audio frames
+before start playback. It will start playback immediately when `is_eos_reached`
+is true even if the amount of cached audio frames are not enough as no more
+frames will be appended into the buffer when `is_eos_reached` is true. It is
+possible for a host to set `is_eos_reached` to false after setting it to true,
+usually this is caused by a seek. All parameters except `context` cannot be
+NULL. Note that this function only reports the status of the source, it doesn't
+remove audio data from the source frame buffer.
+
+#### Definition ####
+
+```
+typedef void(* SbAudioSinkUpdateSourceStatusFunc) (int *frames_in_buffer, int *offset_in_frames, bool *is_playing, bool *is_eos_reached, void *context)
+```
+
+## Functions ##
+
+### SbAudioSinkDestroy ###
+
+Destroys `audio_sink`, freeing all associated resources. Before returning, the
+function waits until all callbacks that are in progress have finished. After the
+function returns, no further calls are made callbacks passed into
+SbAudioSinkCreate. In addition, you can not pass `audio_sink` to any other
+SbAudioSink functions after SbAudioSinkDestroy has been called on it.
+
+This function can be called on any thread. However, it cannot be called within
+any of the callbacks passed into SbAudioSinkCreate.
+
+`audio_sink`: The audio sink to destroy.
+
+#### Declaration ####
+
+```
+void SbAudioSinkDestroy(SbAudioSink audio_sink)
+```
+
+### SbAudioSinkGetMaxChannels ###
+
+Returns the maximum number of channels supported on the platform. For example,
+the number would be `2` if the platform only supports stereo.
+
+#### Declaration ####
+
+```
+int SbAudioSinkGetMaxChannels()
+```
+
+### SbAudioSinkGetMinBufferSizeInFrames ###
+
+Returns the minimum frames required by audio sink to play without underflows.
+Returns -1, if `channels`, `sample_type` or `sampling_frequency_hz` is not
+supported. It's user's responsibility to ensure that there're enough frames
+written into audio sink during playing, or it may have underflows.
+
+`channels`: The number of audio channels, such as left and right channels in
+stereo audio. `audio_sample_type`: The type of each sample of the audio data –
+`int16`, `float32`, etc. `sampling_frequency_hz`: The sample frequency of the
+audio data being streamed. For example, 22,000 Hz means 22,000 sample elements
+represents one second of audio data.
+
+#### Declaration ####
+
+```
+int SbAudioSinkGetMinBufferSizeInFrames(int channels, SbMediaAudioSampleType sample_type, int sampling_frequency_hz)
+```
+
+### SbAudioSinkGetNearestSupportedSampleFrequency ###
+
+Returns the supported sample rate closest to `sampling_frequency_hz`. On
+platforms that don't support all sample rates, it is the caller's responsibility
+to resample the audio frames into the supported sample rate returned by this
+function.
+
+#### Declaration ####
+
+```
+int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz)
+```
+
+### SbAudioSinkIsAudioFrameStorageTypeSupported ###
+
+Indicates whether `audio_frame_storage_type` is supported on this platform.
+
+#### Declaration ####
+
+```
+bool SbAudioSinkIsAudioFrameStorageTypeSupported(SbMediaAudioFrameStorageType audio_frame_storage_type)
+```
+
+### SbAudioSinkIsAudioSampleTypeSupported ###
+
+Indicates whether `audio_sample_type` is supported on this platform.
+
+#### Declaration ####
+
+```
+bool SbAudioSinkIsAudioSampleTypeSupported(SbMediaAudioSampleType audio_sample_type)
+```
+
+### SbAudioSinkIsValid ###
+
+Indicates whether the given audio sink handle is valid.
+
+`audio_sink`: The audio sink handle to check.
+
+#### Declaration ####
+
+```
+bool SbAudioSinkIsValid(SbAudioSink audio_sink)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md b/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md
new file mode 100644
index 0000000..b35275f
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md
@@ -0,0 +1,300 @@
+---
+layout: doc
+title: "Starboard Module Reference: blitter.h"
+---
+
+The Blitter API provides support for issuing simple blit-style draw commands to
+either an offscreen surface or to a Starboard `SbWindow` object. Blitter is
+jargon that means "BLock Transfer," which might be abbreviated as BLT and,
+hence, the word "blit."
+
+This API is designed to allow implementations make use of GPU hardware
+acceleration, if it is available. Draw commands exist for solid-color rectangles
+and rasterization/blitting of rectangular images onto rectangular target
+patches.
+Threading Concerns
+
+Note that in general the Blitter API is not thread safe, except for all
+`SbBlitterDevice`-related functions. All functions that are not required to
+internally ensure any thread safety guarantees are prefaced with a comment
+indicating that they are not thread safe.
+
+Functions which claim to not be thread safe can still be used from multiple
+threads, but manual synchronization must be performed in order to ensure their
+parameters are not referenced at the same time on another thread by another
+function.
+Examples
+
+*   Multiple threads should not issue commands to the same `SbBlitterContext`
+    object unless they are manually synchronized.
+
+*   Multiple threads should not issue draw calls to the same render target, even
+    if the draw calls are made within separate contexts. In this case, be sure
+    to manually synchronize through the use of syncrhonization primitives and
+    use of the `SbBlitterFlushContext()` command.
+
+*   Multiple threads can operate on the swap chain, but they must perform manual
+    synchronization.
+
+## Enums ##
+
+### SbBlitterPixelDataFormat ###
+
+Defines the set of pixel formats that can be used with the Blitter API
+`SbBlitterPixelData` objects. Note that not all of these formats are guaranteed
+to be supported by a particular device, so before using these formats in pixel
+data creation commands, it should be checked that they are supported first (e.g.
+via `SbBlitterIsPixelFormatSupportedByPixelData()`). `SbBlitterPixelDataFormat`
+specifies specific orderings of the color channels, and when doing so, byte-
+order is used, e.g. "RGBA" implies that a value for red is stored in the byte
+with the lowest memory address. All pixel values are assumed to be in
+premultiplied alpha format.
+
+#### Values ####
+
+*   `kSbBlitterPixelDataFormatARGB8`
+
+    32-bit pixels with 8-bits per channel, the alpha component in the byte with
+    the lowest address and blue in the byte with the highest address.
+*   `kSbBlitterPixelDataFormatBGRA8`
+
+    32-bit pixels with 8-bits per channel, the blue component in the byte with
+    the lowest address and alpha in the byte with the highest address.
+*   `kSbBlitterPixelDataFormatRGBA8`
+
+    32-bit pixels with 8-bits per channel, the red component in the byte with
+    the lowest address and alpha in the byte with the highest address.
+*   `kSbBlitterPixelDataFormatA8`
+
+    8-bit pixels that contain only a single alpha channel. When rendered,
+    surfaces in this format will have `(R, G, B)` values of `(255, 255, 255)`.
+*   `kSbBlitterNumPixelDataFormats`
+
+    Constant that indicates how many unique pixel formats Starboard supports.
+*   `kSbBlitterInvalidPixelDataFormat`
+
+### SbBlitterSurfaceFormat ###
+
+Enumeration that describes the color format of surfaces. Note that
+`SbBlitterSurfaceFormat` does not differentiate between permutations of the
+color channel ordering (e.g. RGBA vs ARGB) since client code will never be able
+to access surface pixels directly. This is the main difference between
+`SbBlitterPixelDataFormat`, which does explicitly dictate an ordering.
+
+#### Values ####
+
+*   `kSbBlitterSurfaceFormatRGBA8`
+
+    32-bit RGBA color, with 8 bits per channel.
+*   `kSbBlitterSurfaceFormatA8`
+
+    8-bit alpha-only color.
+*   `kSbBlitterNumSurfaceFormats`
+
+    Constant that indicates how many unique surface formats Starboard supports.
+*   `kSbBlitterInvalidSurfaceFormat`
+
+## Typedefs ##
+
+### SbBlitterColor ###
+
+A simple 32-bit color representation that is a parameter to many Blitter
+functions.
+
+#### Definition ####
+
+```
+typedef uint32_t SbBlitterColor
+```
+
+## Structs ##
+
+### SbBlitterRect ###
+
+Defines a rectangle via a point `(x, y)` and a size `(width, height)`. This
+structure is used as a parameter type in various blit calls.
+
+#### Members ####
+
+*   `int x`
+*   `int y`
+*   `int width`
+*   `int height`
+
+### SbBlitterSurfaceInfo ###
+
+`SbBlitterSurfaceInfo` collects information about surfaces that can be queried
+from them at any time.
+
+#### Members ####
+
+*   `int width`
+*   `int height`
+*   `SbBlitterSurfaceFormat format`
+
+## Functions ##
+
+### SB_DEPRECATED ###
+
+This function achieves the same effect as calling `SbBlitterBlitRectToRect()`
+`num_rects` times with each of the `num_rects` values of `src_rects` and
+`dst_rects`. This function allows for greater efficiency than looped calls to
+`SbBlitterBlitRectToRect()`.
+
+This function is not thread-safe.
+
+The return value indicates whether the draw call succeeded.
+
+#### Declaration ####
+
+```
+SB_DEPRECATED(bool SbBlitterBlitRectsToRects(SbBlitterContext context, SbBlitterSurface source_surface, const SbBlitterRect *src_rects, const SbBlitterRect *dst_rects, int num_rects))
+```
+
+### SbBlitterAFromColor ###
+
+Extract alpha from a `SbBlitterColor` object.
+
+#### Declaration ####
+
+```
+static uint8_t SbBlitterAFromColor(SbBlitterColor color)
+```
+
+### SbBlitterBFromColor ###
+
+Extract blue from a `SbBlitterColor` object.
+
+#### Declaration ####
+
+```
+static uint8_t SbBlitterBFromColor(SbBlitterColor color)
+```
+
+### SbBlitterBytesPerPixelForFormat ###
+
+A convenience function to return the number of bytes per pixel for a given pixel
+format.
+
+#### Declaration ####
+
+```
+static int SbBlitterBytesPerPixelForFormat(SbBlitterPixelDataFormat format)
+```
+
+### SbBlitterColorFromRGBA ###
+
+A convenience function to create a `SbBlitterColor` object from separate 8-bit
+RGBA components.
+
+#### Declaration ####
+
+```
+static SbBlitterColor SbBlitterColorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
+```
+
+### SbBlitterGFromColor ###
+
+Extract green from a `SbBlitterColor` object.
+
+#### Declaration ####
+
+```
+static uint8_t SbBlitterGFromColor(SbBlitterColor color)
+```
+
+### SbBlitterIsContextValid ###
+
+Checks whether a blitter context is invalid.
+
+#### Declaration ####
+
+```
+static bool SbBlitterIsContextValid(SbBlitterContext context)
+```
+
+### SbBlitterIsDeviceValid ###
+
+Checks whether a blitter device is invalid.
+
+#### Declaration ####
+
+```
+static bool SbBlitterIsDeviceValid(SbBlitterDevice device)
+```
+
+### SbBlitterIsPixelDataValid ###
+
+Checks whether a pixel data object is invalid.
+
+#### Declaration ####
+
+```
+static bool SbBlitterIsPixelDataValid(SbBlitterPixelData pixel_data)
+```
+
+### SbBlitterIsRenderTargetValid ###
+
+Checks whether a render target is invalid.
+
+#### Declaration ####
+
+```
+static bool SbBlitterIsRenderTargetValid(SbBlitterRenderTarget render_target)
+```
+
+### SbBlitterIsSurfaceValid ###
+
+Checks whether a surface is invalid.
+
+#### Declaration ####
+
+```
+static bool SbBlitterIsSurfaceValid(SbBlitterSurface surface)
+```
+
+### SbBlitterIsSwapChainValid ###
+
+Checks whether a swap chain is invalid.
+
+#### Declaration ####
+
+```
+static bool SbBlitterIsSwapChainValid(SbBlitterSwapChain swap_chain)
+```
+
+### SbBlitterMakeRect ###
+
+Convenience function to setup a rectangle with the specified parameters.
+
+#### Declaration ####
+
+```
+static SbBlitterRect SbBlitterMakeRect(int x, int y, int width, int height)
+```
+
+### SbBlitterPixelDataFormatToSurfaceFormat ###
+
+This function maps SbBlitterPixelDataFormat values to their corresponding
+`SbBlitterSurfaceFormat` value. Note that many `SbBlitterPixelDataFormat`s
+correspond to the same `SbBlitterSurfaceFormat`, so this function is not
+invertible. When creating a `SbBlitterSurface` object from a
+`SbBlitterPixelData` object, the `SbBlitterSurface`'s format will be computed
+from the `SbBlitterPixelData` object by using this function.
+
+#### Declaration ####
+
+```
+static SbBlitterSurfaceFormat SbBlitterPixelDataFormatToSurfaceFormat(SbBlitterPixelDataFormat pixel_format)
+```
+
+### SbBlitterRFromColor ###
+
+Extract red from a `SbBlitterColor` object.
+
+#### Declaration ####
+
+```
+static uint8_t SbBlitterRFromColor(SbBlitterColor color)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/byte_swap.md b/src/cobalt/site/docs/reference/starboard/modules/11/byte_swap.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/byte_swap.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/byte_swap.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/character.md b/src/cobalt/site/docs/reference/starboard/modules/11/character.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/character.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/character.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/condition_variable.md b/src/cobalt/site/docs/reference/starboard/modules/11/condition_variable.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/condition_variable.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/condition_variable.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
new file mode 100644
index 0000000..78739ad
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
@@ -0,0 +1,205 @@
+---
+layout: doc
+title: "Starboard Module Reference: configuration.h"
+---
+
+Provides a description of the current platform in lurid detail so that common
+code never needs to actually know what the current operating system and
+architecture are.
+
+It is both very pragmatic and canonical in that if any application code finds
+itself needing to make a platform decision, it should always define a Starboard
+Configuration feature instead. This implies the continued existence of very
+narrowly-defined configuration features, but it retains porting control in
+Starboard.
+
+## Macros ##
+
+### SB_ALIGNAS(byte_alignment) ###
+
+Specifies the alignment for a class, struct, union, enum, class/struct field, or
+stack variable.
+
+### SB_ALIGNOF(type) ###
+
+Returns the alignment reqiured for any instance of the type indicated by `type`.
+
+### SB_ARRAY_SIZE(array) ###
+
+A constant expression that evaluates to the size_t size of a statically-sized
+array.
+
+### SB_ARRAY_SIZE_INT(array) ###
+
+A constant expression that evaluates to the int size of a statically-sized
+array.
+
+### SB_CAN(SB_FEATURE) ###
+
+Determines a compile-time capability of the system.
+
+### SB_COMPILE_ASSERT(expr, msg) ###
+
+Will cause a compiler error with `msg` if `expr` is false. `msg` must be a valid
+identifier, and must be a unique type in the scope of the declaration.
+
+### SB_DEPRECATED(FUNC) ###
+
+SB_DEPRECATED(int Foo(int bar)); Annotates the function as deprecated, which
+will trigger a compiler warning when referenced.
+
+### SB_DEPRECATED_EXTERNAL(FUNC) ###
+
+SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for external
+clients, but not deprecated for starboard.
+
+### SB_DISALLOW_COPY_AND_ASSIGN(TypeName) ###
+
+A macro to disallow the copy constructor and operator= functions This should be
+used in the private: declarations for a class
+
+### SB_EXPERIMENTAL_API_VERSION ###
+
+The API version that is currently open for changes, and therefore is not stable
+or frozen. Production-oriented ports should avoid declaring that they implement
+the experimental Starboard API version.
+
+### SB_FUNCTION ###
+
+Whether we use **PRETTY_FUNCTION** PRETTY_FUNCTION or **FUNCTION** FUNCTION for
+logging.
+
+### SB_HAS(SB_FEATURE) ###
+
+Determines at compile-time whether this platform has a standard feature or
+header available.
+
+### SB_HAS_64_BIT_ATOMICS ###
+
+Whether the current platform has 64-bit atomic operations.
+
+### SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER ###
+
+Deprecated feature macros These feature macros are deprecated in Starboard
+version 6 and later, and are no longer referenced by application code. They will
+be removed in a future version. Any Starboard implementation that supports
+Starboard version 6 or later should be modified to no longer depend on these
+macros, with the assumption that their values are always 1.
+
+### SB_HAS_GLES2 ###
+
+Specifies whether this platform has a performant OpenGL ES 2 implementation,
+which allows client applications to use GL rendering paths. Derived from the gyp
+variable `gl_type` gl_type which indicates what kind of GL implementation is
+available.
+
+### SB_HAS_GRAPHICS ###
+
+Specifies whether this platform has any kind of supported graphics system.
+
+### SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT ###
+
+Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above as
+SB_PREFERRED_RGBA_BYTE_ORDER_*. If your platform uses GLES, you should set this
+to SB_PREFERRED_RGBA_BYTE_ORDER_RGBA.
+
+### SB_HAS_QUIRK(SB_FEATURE) ###
+
+Determines at compile-time whether this platform has a quirk.
+
+### SB_INT64_C(x) ###
+
+Declare numeric literals of signed 64-bit type.
+
+### SB_IS(SB_FEATURE) ###
+
+Determines at compile-time an inherent aspect of this platform.
+
+### SB_IS_LITTLE_ENDIAN ###
+
+Whether the current platform is little endian.
+
+### SB_LIKELY(x) ###
+
+Macro for hinting that an expression is likely to be true.
+
+### SB_MAXIMUM_API_VERSION ###
+
+The maximum API version allowed by this version of the Starboard headers,
+inclusive.
+
+### SB_MINIMUM_API_VERSION ###
+
+The minimum API version allowed by this version of the Starboard headers,
+inclusive.
+
+### SB_NORETURN ###
+
+Macro to annotate a function as noreturn, which signals to the compiler that the
+function cannot return.
+
+### SB_OVERRIDE ###
+
+Declares a function as overriding a virtual function on compilers that support
+it.
+
+### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
+
+An enumeration of values for the kSbPreferredByteOrder configuration variable.
+Setting this up properly means avoiding slow color swizzles when passing pixel
+data from one library to another. Note that these definitions are in byte-order
+and so are endianness-independent.
+
+### SB_PRINTF_FORMAT(format_param, dots_param) ###
+
+Tells the compiler a function is using a printf-style format string.
+`format_param` is the one-based index of the format string parameter;
+`dots_param` is the one-based index of the "..." parameter. For v*printf
+functions (which take a va_list), pass 0 for dots_param. (This is undocumented
+but matches what the system C headers do.) (Partially taken from
+base/compiler_specific.h)
+
+### SB_RELEASE_CANDIDATE_API_VERSION ###
+
+The next API version to be frozen, but is still subject to emergency changes. It
+is reasonable to base a port on the Release Candidate API version, but be aware
+that small incompatible changes may still be made to it. The following will be
+uncommented when an API version is a release candidate.
+
+### SB_RESTRICT ###
+
+Include the platform-specific configuration. This macro is set by GYP in
+starboard_base_target.gypi and passed in on the command line for all targets and
+all configurations. After version 12, we start to use runtime constants instead
+of macros for certain platform dependent configurations. This file substitutes
+configuration macros for the corresponding runtime constants so we don't
+reference these constants when they aren't defined. Makes a pointer-typed
+parameter restricted so that the compiler can make certain optimizations because
+it knows the pointers are unique.
+
+### SB_SIZE_OF(DATATYPE) ###
+
+Determines at compile-time the size of a data type, or 0 if the data type that
+was specified was invalid.
+
+### SB_STRINGIFY(x) ###
+
+Standard CPP trick to stringify an evaluated macro definition.
+
+### SB_UINT64_C(x) ###
+
+Declare numeric literals of unsigned 64-bit type.
+
+### SB_UNLIKELY(x) ###
+
+Macro for hinting that an expression is likely to be false.
+
+### SB_UNREFERENCED_PARAMETER(x) ###
+
+Trivially references a parameter that is otherwise unreferenced, preventing a
+compiler warning on some platforms.
+
+### SB_WARN_UNUSED_RESULT ###
+
+Causes the annotated (at the end) function to generate a warning if the result
+is not accessed.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md b/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md
new file mode 100644
index 0000000..7847ee2
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md
@@ -0,0 +1,256 @@
+---
+layout: doc
+title: "Starboard Module Reference: cpu_features.h"
+---
+
+## Structs ##
+
+### SbCPUFeatures ###
+
+#### Members ####
+
+*   `SbCPUFeaturesArchitecture architecture`
+
+    Architecture of the processor.
+*   `const char * brand`
+
+    Processor brand string retrievable by CPUID or from /proc/cpuinfo under the
+    key "model name" or "Processor".
+*   `int32_t icache_line_size`
+
+    Processor cache line size in bytes of Level 1 instruction cache and data
+    cache. Queried by sysconf(_SC_LEVEL1_ICACHE_LINESIZE) and
+    sysconf(_SC_LEVEL1_DCACHE_LINESIZE), or from files /proc/cpuinfo,
+    /proc/self/auxv, or CPUID with CLFLUSH instruction.
+*   `int32_t dcache_line_size`
+*   `bool has_fpu`
+
+    Processor has floating-point unit on-chip.
+*   `uint32_t hwcap`
+
+    Bit-mask containing processor features flags. Queried by getauxval(AT_HWCAP)
+    if it is supported.
+*   `uint32_t hwcap2`
+
+    Similar to hwcap. Queried by getauxval(AT_HWCAP2) if it is supported.
+*   `SbCPUFeaturesARM arm`
+
+    Processor features specific to each architecture. Set the appropriate
+    `SbCPUFeatures<ARCH_NAME>` for the underlying architecture. Set the other
+    `SbCPUFeatures<OTHER_ARCH>` to be invalid, meaning:
+
+    *   '-1' for signed integer fields
+
+    *   'false' for feature flag fields
+
+    *   '0' for feature flag bitmasks
+
+    *   empty string for string fields
+
+*   `SbCPUFeaturesMIPS mips_arch`
+
+    The reason that the "_arch" suffix exists for mips is because on some
+    platforms that use MIPS as the underlying architecture, "mips" is already
+    defined as a macro.
+*   `SbCPUFeaturesX86 x86`
+
+### SbCPUFeaturesARM ###
+
+#### Members ####
+
+*   `int16_t implementer`
+
+    Processor implementer/implementor code. ARM is 0x41, NVIDIA is 0x4e, etc.
+*   `int16_t variant`
+
+    Processor variant number, indicating the major revision number.
+*   `int16_t revision`
+
+    Processor revision number, indicating the minor revision number.
+*   `int16_t architecture_generation`
+
+    Processor architecture generation number, indicating the generations
+    (ARMv6-M, ARMv7, etc) within an architecture family. This field is called
+    "Architecture" or "Constant" in the processor ID register.
+*   `int16_t part`
+
+    Processor part number, indicating Cortex-M0, Cortex-A8, etc.
+*   `bool has_neon`
+
+    ARM Advanced SIMD (NEON) vector instruction set extension.
+*   `bool has_thumb2`
+
+    Thumb-2 mode.
+*   `bool has_vfp`
+
+    VFP (SIMD vector floating point instructions).
+*   `bool has_vfp3`
+
+    VFP version 3
+*   `bool has_vfp3_d32`
+
+    VFP version 3 with 32 D-registers.
+*   `bool has_idiva`
+
+    SDIV and UDIV hardware division in ARM mode.
+*   `bool has_aes`
+
+    Arm 64 feature flags
+
+    AES instructions.
+*   `bool has_crc32`
+
+    CRC32 instructions.
+*   `bool has_sha1`
+
+    SHA-1 instructions.
+*   `bool has_sha2`
+
+    SHA-256 instructions.
+*   `bool has_pmull`
+
+    64-bit PMULL and PMULL2 instructions.
+
+### SbCPUFeaturesMIPS ###
+
+#### Members ####
+
+*   `bool has_msa`
+
+    MIPS SIMD Architecture (MSA).
+
+### SbCPUFeaturesX86 ###
+
+#### Members ####
+
+*   `const char * vendor`
+
+    Processor vendor ID string, e.g. "GenuineIntel", "AuthenticAMD", etc
+*   `int16_t family`
+
+    Processor family ID
+*   `int16_t ext_family`
+
+    Processor extended family ID, needs to be examined only when the family ID
+    is 0FH.
+*   `int16_t model`
+
+    Processor model ID
+*   `int16_t ext_model`
+
+    Processor extended model ID, needs to be examined only when the family ID is
+    06H or 0FH.
+*   `int16_t stepping`
+
+    Processor stepping ID, a product revision number
+*   `int16_t type`
+
+    Processor type ID
+*   `int32_t signature`
+
+    A raw form of collection of processor stepping, model, and family
+    information
+*   `bool has_cmov`
+
+    Conditional Move Instructions (plus FCMOVcc, FCOMI with FPU).
+*   `bool has_mmx`
+
+    Multimedia extensions.
+*   `bool has_sse`
+
+    SSE (Streaming SIMD Extensions).
+*   `bool has_sse2`
+
+    SSE2 extensions.
+*   `bool has_tsc`
+
+    Time Stamp Counter.
+*   `bool has_sse3`
+
+    SSE3 extensions.
+*   `bool has_ssse3`
+
+    Supplemental SSE3 extensions.
+*   `bool has_sse41`
+
+    SSE-4.1 extensions.
+*   `bool has_sse42`
+
+    SSE-4.2 extensions.
+*   `bool has_movbe`
+
+    MOVBE instruction.
+*   `bool has_popcnt`
+
+    POPCNT instruction.
+*   `bool has_osxsave`
+
+    XSAVE/XRSTOR/XGETBV/XSETBV instruction enabled in this OS.
+*   `bool has_avx`
+
+    AVX (Advanced Vector Extensions).
+*   `bool has_f16c`
+
+    16-bit FP conversions.
+*   `bool has_fma3`
+
+    Fused multiply-add.
+*   `bool has_aesni`
+
+    AES new instructions (AES-NI).
+*   `bool has_avx2`
+
+    AVX2 Extensions.
+*   `bool has_avx512f`
+
+    AVX-512 Foundation.
+*   `bool has_avx512dq`
+
+    AVX-512 DQ (Double/Quad granular) Instructions.
+*   `bool has_avx512ifma`
+
+    AVX-512 Integer Fused Multiply-Add instructions.
+*   `bool has_avx512pf`
+
+    AVX-512 Prefetch.
+*   `bool has_avx512er`
+
+    AVX-512 Exponential and Reciprocal.
+*   `bool has_avx512cd`
+
+    AVX-512 Conflict Detection.
+*   `bool has_avx512bw`
+
+    AVX-512 BW (Byte/Word granular) Instructions.
+*   `bool has_avx512vl`
+
+    AVX-512 VL (128/256 Vector Length) Extensions.
+*   `bool has_bmi1`
+
+    First group of bit manipulation extensions.
+*   `bool has_bmi2`
+
+    Second group of bit manipulation extensions.
+*   `bool has_lzcnt`
+
+    Bit manipulation instruction LZCNT.
+*   `bool has_sahf`
+
+    SAHF in long mode.
+
+## Functions ##
+
+### SbCPUFeaturesGet ###
+
+Retrieve the underlying CPU features and place it in `features`, which must not
+be NULL.
+
+If this function returns false, it means the CPU architecture is unknown and all
+fields in `features` are invalid.
+
+#### Declaration ####
+
+```
+bool SbCPUFeaturesGet(SbCPUFeatures *features)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md b/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md
new file mode 100644
index 0000000..0b9442b
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md
@@ -0,0 +1,234 @@
+---
+layout: doc
+title: "Starboard Module Reference: cryptography.h"
+---
+
+Hardware-accelerated cryptography. Platforms should **only** only implement this
+when there are **hardware-accelerated** hardware-accelerated cryptography
+facilities. Applications must fall back to platform-independent CPU-based
+algorithms if the cipher algorithm isn't supported in hardware.
+Tips for Porters
+
+You should implement cipher algorithms in this descending order of priority to
+maximize usage for SSL.
+
+1.  GCM - The preferred block cipher mode for OpenSSL, mainly due to speed.
+
+1.  CTR - This can be used internally with GCM, as long as the CTR
+    implementation only uses the last 4 bytes of the IV for the counter. (i.e.
+    96-bit IV, 32-bit counter)
+
+1.  ECB - This can be used (with a null IV) with any of the other cipher block
+    modes to accelerate the core AES algorithm if none of the streaming modes
+    can be accelerated.
+
+1.  CBC - GCM is always preferred if the server and client both support it. If
+    not, they will generally negotiate down to AES-CBC. If this happens, and CBC
+    is supported by SbCryptography, then it will be accelerated appropriately.
+    But, most servers should support GCM, so it is not likely to come up much,
+    which is why it is the lowest priority.
+
+Further reading on block cipher modes:
+
+[https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
+
+[https://crbug.com/442572](https://crbug.com/442572)
+
+[https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption](https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption)
+
+## Macros ##
+
+### kSbCryptographyAlgorithmAes ###
+
+String literal for the AES symmetric block cipher. [https://en.wikipedia.org/wiki/Advanced_Encryption_Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
+
+### kSbCryptographyInvalidTransformer ###
+
+Well-defined value for an invalid transformer.
+
+## Enums ##
+
+### SbCryptographyBlockCipherMode ###
+
+The method of chaining encrypted blocks in a sequence. [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
+
+#### Values ####
+
+*   `kSbCryptographyBlockCipherModeCbc`
+
+    Cipher Block Chaining mode.
+*   `kSbCryptographyBlockCipherModeCfb`
+
+    Cipher Feedback mode.
+*   `kSbCryptographyBlockCipherModeCtr`
+
+    Counter mode: A nonce is combined with an increasing counter.
+*   `kSbCryptographyBlockCipherModeEcb`
+
+    Electronic Code Book mode: No chaining.
+*   `kSbCryptographyBlockCipherModeOfb`
+
+    Output Feedback mode.
+*   `kSbCryptographyBlockCipherModeGcm`
+
+    Galois/Counter Mode.
+
+### SbCryptographyDirection ###
+
+The direction of a cryptographic transformation.
+
+#### Values ####
+
+*   `kSbCryptographyDirectionEncode`
+
+    Cryptographic transformations that encode/encrypt data into a target format.
+*   `kSbCryptographyDirectionDecode`
+
+    Cryptographic transformations that decode/decrypt data into its original
+    form.
+
+## Typedefs ##
+
+### SbCryptographyTransformer ###
+
+A handle to a cryptographic transformer.
+
+#### Definition ####
+
+```
+typedef SbCryptographyTransformerPrivate* SbCryptographyTransformer
+```
+
+## Functions ##
+
+### SbCryptographyCreateTransformer ###
+
+Creates an SbCryptographyTransformer with the given initialization data. It can
+then be used to transform a series of data blocks. Returns
+kSbCryptographyInvalidTransformer if the algorithm isn't supported, or if the
+parameters are not compatible with the algorithm.
+
+An SbCryptographyTransformer contains all state to start decrypting a sequence
+of cipher blocks according to the cipher block mode. It is not thread-safe, but
+implementations must allow different SbCryptographyTransformer instances to
+operate on different threads.
+
+All parameters must not be assumed to live longer than the call to this
+function. They must be copied by the implementation to be retained.
+
+This function determines success mainly based on whether the combination of
+`algorithm`, `direction`, `block_size_bits`, and `mode` is supported and whether
+all the sizes passed in are sufficient for the selected parameters. In
+particular, this function cannot verify that the key and IV used were correct
+for the ciphertext, were it to be used in the decode direction. The caller must
+make that verification.
+
+For example, to decrypt AES-128-CTR:
+SbCryptographyCreateTransformer(kSbCryptographyAlgorithmAes, 128,
+kSbCryptographyDirectionDecode, kSbCryptographyBlockCipherModeCtr, ...);
+
+`algorithm`: A string that represents the cipher algorithm. `block_size_bits`:
+The block size variant of the algorithm to use, in bits. `direction`: The
+direction in which to transform the data. `mode`: The block cipher mode to use.
+`initialization_vector`: The Initialization Vector (IV) to use. May be NULL for
+block cipher modes that don't use it, or don't set it at init time.
+`initialization_vector_size`: The size, in bytes, of the IV. `key`: The key to
+use for this transformation. `key_size`: The size, in bytes, of the key.
+
+presubmit: allow sb_export mismatch
+
+#### Declaration ####
+
+```
+SbCryptographyTransformer SbCryptographyCreateTransformer(const char *algorithm, int block_size_bits, SbCryptographyDirection direction, SbCryptographyBlockCipherMode mode, const void *initialization_vector, int initialization_vector_size, const void *key, int key_size)
+```
+
+### SbCryptographyDestroyTransformer ###
+
+Destroys the given `transformer` instance.
+
+presubmit: allow sb_export mismatch
+
+#### Declaration ####
+
+```
+void SbCryptographyDestroyTransformer(SbCryptographyTransformer transformer)
+```
+
+### SbCryptographyGetTag ###
+
+Calculates the authenticator tag for a transformer and places up to
+`out_tag_size` bytes of it in `out_tag`. Returns whether it was able to get the
+tag, which mainly has to do with whether it is compatible with the current block
+cipher mode.
+
+presubmit: allow sb_export mismatch
+
+#### Declaration ####
+
+```
+bool SbCryptographyGetTag(SbCryptographyTransformer transformer, void *out_tag, int out_tag_size)
+```
+
+### SbCryptographyIsTransformerValid ###
+
+Returns whether the given transformer handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbCryptographyIsTransformerValid(SbCryptographyTransformer transformer)
+```
+
+### SbCryptographySetAuthenticatedData ###
+
+Sets additional authenticated data (AAD) for a transformer, for chaining modes
+that support it (GCM). Returns whether the data was successfully set. This can
+fail if the chaining mode doesn't support AAD, if the parameters are invalid, or
+if the internal state is invalid for setting AAD.
+
+presubmit: allow sb_export mismatch
+
+#### Declaration ####
+
+```
+bool SbCryptographySetAuthenticatedData(SbCryptographyTransformer transformer, const void *data, int data_size)
+```
+
+### SbCryptographySetInitializationVector ###
+
+Sets the initialization vector (IV) for a transformer, replacing the internally-
+set IV. The block cipher mode algorithm will update the IV appropriately after
+every block, so this is not necessary unless the stream is discontiguous in some
+way. This happens with AES-GCM in TLS.
+
+presubmit: allow sb_export mismatch
+
+#### Declaration ####
+
+```
+void SbCryptographySetInitializationVector(SbCryptographyTransformer transformer, const void *initialization_vector, int initialization_vector_size)
+```
+
+### SbCryptographyTransform ###
+
+Transforms one or more `block_size_bits`-sized blocks of `in_data`, with the
+given `transformer`, placing the result in `out_data`. Returns the number of
+bytes that were written to `out_data`, unless there was an error, in which case
+it will return a negative number.
+
+`transformer`: A transformer initialized with an algorithm, IV, cipherkey, and
+so on. `in_data`: The data to be transformed. `in_data_size`: The size of the
+data to be transformed, in bytes. Must be a multiple of the transformer's
+`block-size_bits`, or an error will be returned. `out_data`: A buffer where the
+transformed data should be placed. Must have at least capacity for
+`in_data_size` bytes. May point to the same memory as `in_data`.
+
+presubmit: allow sb_export mismatch
+
+#### Declaration ####
+
+```
+int SbCryptographyTransform(SbCryptographyTransformer transformer, const void *in_data, int in_data_size, void *out_data)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md b/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md
new file mode 100644
index 0000000..90d87fb
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md
@@ -0,0 +1,402 @@
+---
+layout: doc
+title: "Starboard Module Reference: decode_target.h"
+---
+
+A target for decoding image and video data into. This corresponds roughly to an
+EGLImage, but that extension may not be fully supported on all GL platforms.
+SbDecodeTarget supports multi-plane targets. The SbBlitter API is supported as
+well, and this is able to more-or-less unify the two.
+
+An SbDecodeTarget can be passed into any function which decodes video or image
+data. This allows the application to allocate fast graphics memory, and have
+decoding done directly into this memory, avoiding unnecessary memory copies, and
+also avoiding pushing data between CPU and GPU memory unnecessarily.
+SbDecodeTargetFormat
+
+SbDecodeTargets support several different formats that can be used to decode
+into and render from. Some formats may be easier to decode into, and others may
+be easier to render. Some may take less memory. Each decoder needs to support
+the SbDecodeTargetFormat passed into it, or the decode will produce an error.
+Each decoder provides a way to check if a given SbDecodeTargetFormat is
+supported by that decoder.
+SbDecodeTargetGraphicsContextProvider
+
+Some components may need to acquire SbDecodeTargets compatible with a certain
+rendering context, which may need to be created on a particular thread. The
+SbDecodeTargetGraphicsContextProvider are passed in to the Starboard
+implementation from the application and provide information about the rendering
+context that will be used to render the SbDecodeTarget objects. For GLES
+renderers, it also provides functionality to enable the Starboard implementation
+to run arbitrary code on the application's renderer thread with the renderer's
+EGLContext held current. This may be useful if your SbDecodeTarget creation code
+needs to execute GLES commands like, for example, glGenTextures().
+
+The primary usage is likely to be the the SbPlayer implementation on some
+platforms.
+SbDecodeTarget Example
+
+Let's say that we are an application and we would like to use the interface
+defined in starboard/image.h to decode an imaginary "image/foo" image type.
+
+First, the application should enumerate which SbDecodeTargetFormats are
+supported by that decoder.
+
+```
+SbDecodeTargetFormat kPreferredFormats[] = {
+    kSbDecodeTargetFormat3PlaneYUVI420,
+    kSbDecodeTargetFormat1PlaneRGBA,
+    kSbDecodeTargetFormat1PlaneBGRA,
+};
+
+SbDecodeTargetFormat format = kSbDecodeTargetFormatInvalid;
+for (int i = 0; i < SB_ARRAY_SIZE_INT(kPreferredFormats); ++i) {
+  if (SbImageIsDecodeSupported("image/foo", kPreferredFormats[i])) {
+    format = kPreferredFormats[i];
+    break;
+  }
+}
+
+```
+
+Now that the application has a format, it can create a decode target that it
+will use to decode the .foo file into. Let's assume format is
+kSbDecodeTargetFormat1PlaneRGBA, that we are on an EGL/GLES2 platform. Also, we
+won't do any error checking, to keep things even simpler.
+
+```
+SbDecodeTarget target = SbImageDecode(
+    context_provider, encoded_foo_data, encoded_foo_data_size,
+    "image/foo", format);
+
+// If the decode works, you can get the texture out and render it.
+SbDecodeTargetInfo info;
+SbMemorySet(&info, 0, sizeof(info));
+SbDecodeTargetGetInfo(target, &info);
+GLuint texture =
+    info.planes[kSbDecodeTargetPlaneRGBA].texture;
+
+```
+
+## Macros ##
+
+### kSbDecodeTargetInvalid ###
+
+Well-defined value for an invalid decode target handle.
+
+## Enums ##
+
+### SbDecodeTargetFormat ###
+
+The list of all possible decoder target formats. An SbDecodeTarget consists of
+one or more planes of data, each plane corresponding with a surface. For some
+formats, different planes will be different sizes for the same dimensions.
+
+NOTE: For enumeration entries with an alpha component, the alpha will always be
+premultiplied unless otherwise explicitly specified.
+
+#### Values ####
+
+*   `kSbDecodeTargetFormat1PlaneRGBA`
+
+    A decoder target format consisting of a single RGBA plane, in that channel
+    order.
+*   `kSbDecodeTargetFormat1PlaneBGRA`
+
+    A decoder target format consisting of a single BGRA plane, in that channel
+    order.
+*   `kSbDecodeTargetFormat2PlaneYUVNV12`
+
+    A decoder target format consisting of Y and interleaved UV planes, in that
+    plane and channel order.
+*   `kSbDecodeTargetFormat3PlaneYUVI420`
+
+    A decoder target format consisting of Y, U, and V planes, in that order.
+*   `kSbDecodeTargetFormat3Plane10BitYUVI420`
+
+    A decoder target format consisting of 10bit Y, U, and V planes, in that
+    order.
+*   `kSbDecodeTargetFormat1PlaneUYVY`
+
+    A decoder target format consisting of a single plane with pixels layed out
+    in the format UYVY. Since there are two Y values per sample, but only one U
+    value and only one V value, horizontally the Y resolution is twice the size
+    of both the U and V resolutions. Vertically, they Y, U and V all have the
+    same resolution. This is a YUV 422 format. When using this format with GL
+    platforms, it is expected that the underlying texture will be set to the
+    GL_RGBA format, and the width of the texture will be equal to the number of
+    UYVY tuples per row (e.g. the u/v width resolution). Content region
+    left/right should be specified in u/v width resolution.
+*   `kSbDecodeTargetFormatInvalid`
+
+    An invalid decode target format.
+
+### SbDecodeTargetPlane ###
+
+All the planes supported by SbDecodeTarget.
+
+#### Values ####
+
+*   `kSbDecodeTargetPlaneRGBA`
+
+    The RGBA plane for the RGBA format.
+*   `kSbDecodeTargetPlaneBGRA`
+
+    The BGRA plane for the BGRA format.
+*   `kSbDecodeTargetPlaneY`
+
+    The Y plane for multi-plane YUV formats.
+*   `kSbDecodeTargetPlaneUV`
+
+    The UV plane for 2-plane YUV formats.
+*   `kSbDecodeTargetPlaneU`
+
+    The U plane for 3-plane YUV formats.
+*   `kSbDecodeTargetPlaneV`
+
+    The V plane for 3-plane YUV formats.
+
+## Typedefs ##
+
+### SbDecodeTarget ###
+
+A handle to a target for image data decoding.
+
+#### Definition ####
+
+```
+typedef SbDecodeTargetPrivate* SbDecodeTarget
+```
+
+### SbDecodeTargetGlesContextRunner ###
+
+Signature for a function provided by the application to the Starboard
+implementation that will let the Starboard implementation run arbitrary code on
+the application's renderer thread with the application's EGLContext held
+current.
+
+#### Definition ####
+
+```
+typedef void(* SbDecodeTargetGlesContextRunner) (struct SbDecodeTargetGraphicsContextProvider *graphics_context_provider, SbDecodeTargetGlesContextRunnerTarget target_function, void *target_function_context)
+```
+
+### SbDecodeTargetGlesContextRunnerTarget ###
+
+Signature for a Starboard implementaion function that is to be run by a
+SbDecodeTargetGlesContextRunner callback.
+
+#### Definition ####
+
+```
+typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)
+```
+
+## Structs ##
+
+### SbDecodeTargetGraphicsContextProvider ###
+
+In general, the SbDecodeTargetGraphicsContextProvider structure provides
+information about the graphics context that will be used to render
+SbDecodeTargets. Some Starboard implementations may need to have references to
+some graphics objects when creating/destroying resources used by SbDecodeTarget.
+References to SbDecodeTargetGraphicsContextProvider objects should be provided
+to all Starboard functions that might create SbDecodeTargets (e.g.
+SbImageDecode()).
+
+#### Members ####
+
+*   `SbBlitterDevice device`
+
+    The SbBlitterDevice object that will be used to render any produced
+    SbDecodeTargets.
+*   `void * egl_display`
+
+    A reference to the EGLDisplay object that hosts the EGLContext that will be
+    used to render any produced SbDecodeTargets. Note that it has the type
+    `void*` in order to avoid #including the EGL header files here.
+*   `void * egl_context`
+
+    The EGLContext object that will be used to render any produced
+    SbDecodeTargets. Note that it has the type `void*` in order to avoid
+    #including the EGL header files here.
+*   `SbDecodeTargetGlesContextRunner gles_context_runner`
+
+    The `gles_context_runner` function pointer is passed in from the application
+    into the Starboard implementation, and can be invoked by the Starboard
+    implementation to allow running arbitrary code on the renderer's thread with
+    the EGLContext above held current.
+*   `void * gles_context_runner_context`
+
+    Context data that is to be passed in to `gles_context_runner` when it is
+    invoked.
+
+### SbDecodeTargetInfo ###
+
+Contains all information about a decode target, including all of its planes.
+This can be queried via calls to SbDecodeTargetGetInfo().
+
+#### Members ####
+
+*   `SbDecodeTargetFormat format`
+
+    The decode target format, which would dictate how many planes can be
+    expected in `planes`.
+*   `bool is_opaque`
+
+    Specifies whether the decode target is opaque. The underlying source of this
+    value is expected to be properly maintained by the Starboard implementation.
+    So, for example, if an opaque only image type were decoded into an
+    SbDecodeTarget, then the implementation would configure things in such a way
+    that this value is set to true. By opaque, it is meant that all alpha values
+    are guaranteed to be 255, if the decode target is of a format that has alpha
+    values. If the decode target is of a format that does not have alpha values,
+    then this value should be set to true. Applications may rely on this value
+    in order to implement certain optimizations such as occlusion culling.
+*   `int width`
+
+    The width of the image represented by this decode target.
+*   `int height`
+
+    The height of the image represented by this decode target.
+*   `SbDecodeTargetInfoPlane planes`
+
+    The image planes (e.g. kSbDecodeTargetPlaneRGBA, or {kSbDecodeTargetPlaneY,
+    kSbDecodeTargetPlaneU, kSbDecodeTargetPlaneV} associated with this decode
+    target.
+
+### SbDecodeTargetInfoContentRegion ###
+
+Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.
+
+#### Members ####
+
+*   `float left`
+
+    If the texture (width, height) is set to (1, 1), then these values will be
+    interpreted as normalized coordinates, and depending on the platform (for
+    example GLES 2.0 provides no method of obtaining the texture width/height)
+    this may be more natural than specifying absolute pixel offsets.
+*   `float top`
+*   `float right`
+*   `float bottom`
+
+### SbDecodeTargetInfoPlane ###
+
+Defines an image plane within a SbDecodeTargetInfo object.
+
+#### Members ####
+
+*   `SbBlitterSurface surface`
+
+    A handle to the Blitter surface that can be used for rendering.
+*   `uint32_t texture`
+
+    A handle to the GL texture that can be used for rendering.
+*   `uint32_t gl_texture_target`
+
+    The GL texture target that should be used in calls to glBindTexture.
+    Typically this would be GL_TEXTURE_2D, but some platforms may require that
+    it be set to something else like GL_TEXTURE_EXTERNAL_OES.
+*   `uint32_t gl_texture_format`
+
+    For kSbDecodeTargetFormat2PlaneYUVNV12 planes: the format of the texture.
+    Usually, for the luma plane, this is either GL_ALPHA or GL_RED_EXT. For the
+    chroma plane, this is usually GL_LUMINANCE_ALPHA or GL_RG_EXT. Ignored for
+    other plane types.
+*   `int width`
+
+    The width of the texture/surface for this particular plane.
+*   `int height`
+
+    The height of the texture/surface for this particular plane.
+*   `SbDecodeTargetInfoContentRegion content_region`
+
+    The following properties specify a rectangle indicating a region within the
+    texture/surface that contains valid image data. The top-left corner is (0,
+    0) and increases to the right and to the bottom. The units specified by
+    these parameters are number of pixels. The range for left/right is [0,
+    width], and for top/bottom it is [0, height].
+
+## Functions ##
+
+### PrivateDecodeTargetReleaser ###
+
+This function is just an implementation detail of
+SbDecodeTargetReleaseInGlesContext() and should not be called directly.
+
+#### Declaration ####
+
+```
+static void PrivateDecodeTargetReleaser(void *context)
+```
+
+### SbDecodeTargetGetInfo ###
+
+Writes all information about `decode_target` into `out_info`. Returns false if
+the provided `out_info` structure is not zero initialized.
+
+#### Declaration ####
+
+```
+bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)
+```
+
+### SbDecodeTargetIsFormatValid ###
+
+Returns whether a given format is valid.
+
+#### Declaration ####
+
+```
+static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)
+```
+
+### SbDecodeTargetIsValid ###
+
+Returns whether the given file handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbDecodeTargetIsValid(SbDecodeTarget handle)
+```
+
+### SbDecodeTargetRelease ###
+
+Returns ownership of `decode_target` to the Starboard implementation. This
+function will likely result in the destruction of the SbDecodeTarget and all its
+associated surfaces, though in some cases, platforms may simply adjust a
+reference count. In the case where SB_HAS(GLES2), this function must be called
+on a thread with the context
+
+#### Declaration ####
+
+```
+void SbDecodeTargetRelease(SbDecodeTarget decode_target)
+```
+
+### SbDecodeTargetReleaseInGlesContext ###
+
+Helper function that is possibly useful to Starboard implementations that will
+release a decode target on the thread with the GLES context current.
+
+#### Declaration ####
+
+```
+static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)
+```
+
+### SbDecodeTargetRunInGlesContext ###
+
+Inline convenience function to run an arbitrary
+SbDecodeTargetGlesContextRunnerTarget function through a
+SbDecodeTargetGraphicsContextProvider . This is intended to be called by
+Starboard implementations, if it is necessary.
+
+#### Declaration ####
+
+```
+static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/directory.md b/src/cobalt/site/docs/reference/starboard/modules/11/directory.md
new file mode 100644
index 0000000..2ec9cca
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/directory.md
@@ -0,0 +1,126 @@
+---
+layout: doc
+title: "Starboard Module Reference: directory.h"
+---
+
+Provides directory listing functions.
+
+## Macros ##
+
+### kSbDirectoryInvalid ###
+
+Well-defined value for an invalid directory stream handle.
+
+## Typedefs ##
+
+### SbDirectory ###
+
+A handle to an open directory stream.
+
+#### Definition ####
+
+```
+typedef struct SbDirectoryPrivate* SbDirectory
+```
+
+## Structs ##
+
+### SbDirectoryEntry ###
+
+Represents a directory entry.
+
+#### Members ####
+
+*   `char name`
+
+    The name of this directory entry.
+
+## Functions ##
+
+### SbDirectoryCanOpen ###
+
+Indicates whether SbDirectoryOpen is allowed for the given `path`.
+
+`path`: The path to be checked.
+
+#### Declaration ####
+
+```
+bool SbDirectoryCanOpen(const char *path)
+```
+
+### SbDirectoryClose ###
+
+Closes an open directory stream handle. The return value indicates whether the
+directory was closed successfully.
+
+`directory`: The directory stream handle to close.
+
+#### Declaration ####
+
+```
+bool SbDirectoryClose(SbDirectory directory)
+```
+
+### SbDirectoryCreate ###
+
+Creates the directory `path`, assuming the parent directory already exists. This
+function returns `true` if the directory now exists (even if it existed before)
+and returns `false` if the directory does not exist.
+
+`path`: The path to be created.
+
+#### Declaration ####
+
+```
+bool SbDirectoryCreate(const char *path)
+```
+
+### SbDirectoryGetNext ###
+
+Populates `out_entry` with the next entry in the specified directory stream, and
+moves the stream forward by one entry.
+
+Platforms may, but are not required to, return `.` (referring to the directory
+itself) and/or `..` (referring to the directory's parent directory) as entries
+in the directory stream.
+
+This function returns `true` if there was a next directory, and `false` at the
+end of the directory stream.
+
+`directory`: The directory stream from which to retrieve the next directory.
+`out_entry`: The variable to be populated with the next directory entry.
+
+#### Declaration ####
+
+```
+bool SbDirectoryGetNext(SbDirectory directory, SbDirectoryEntry *out_entry)
+```
+
+### SbDirectoryIsValid ###
+
+Returns whether the given directory stream handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbDirectoryIsValid(SbDirectory directory)
+```
+
+### SbDirectoryOpen ###
+
+Opens the given existing directory for listing. This function returns
+kSbDirectoryInvalidHandle if it is not successful.
+
+If `out_error` is provided by the caller, it will be set to the appropriate
+SbFileError code on failure.
+
+`out_error`: An output parameter that, in case of an error, is set to the reason
+that the directory could not be opened.
+
+#### Declaration ####
+
+```
+SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/double.md b/src/cobalt/site/docs/reference/starboard/modules/11/double.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/double.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/double.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/drm.md b/src/cobalt/site/docs/reference/starboard/modules/11/drm.md
new file mode 100644
index 0000000..9e40e05
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/drm.md
@@ -0,0 +1,358 @@
+---
+layout: doc
+title: "Starboard Module Reference: drm.h"
+---
+
+Provides definitions that allow for DRM support, which are common between Player
+and Decoder interfaces.
+
+## Macros ##
+
+### kSbDrmSystemInvalid ###
+
+An invalid SbDrmSystem.
+
+### kSbDrmTicketInvalid ###
+
+A ticket for callback invocations initiated by the DRM system.
+
+## Enums ##
+
+### SbDrmKeyStatus ###
+
+Status of a particular media key. [https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus](https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus)
+
+#### Values ####
+
+*   `kSbDrmKeyStatusUsable`
+*   `kSbDrmKeyStatusExpired`
+*   `kSbDrmKeyStatusReleased`
+*   `kSbDrmKeyStatusRestricted`
+*   `kSbDrmKeyStatusDownscaled`
+*   `kSbDrmKeyStatusPending`
+*   `kSbDrmKeyStatusError`
+
+### SbDrmSessionRequestType ###
+
+The type of the session request. [https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype](https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype)
+
+#### Values ####
+
+*   `kSbDrmSessionRequestTypeLicenseRequest`
+*   `kSbDrmSessionRequestTypeLicenseRenewal`
+*   `kSbDrmSessionRequestTypeLicenseRelease`
+*   `kSbDrmSessionRequestTypeIndividualizationRequest`
+
+### SbDrmStatus ###
+
+The status of session related operations. Used by
+`SbDrmSessionUpdateRequestFunc`, `SbDrmSessionUpdatedFunc`, and
+`SbDrmServerCertificateUpdatedFunc` to indicate the status of the operation. [https://w3c.github.io/encrypted-media/#error-names](https://w3c.github.io/encrypted-media/#error-names)
+
+#### Values ####
+
+*   `kSbDrmStatusSuccess`
+*   `kSbDrmStatusTypeError`
+*   `kSbDrmStatusNotSupportedError`
+*   `kSbDrmStatusInvalidStateError`
+*   `kSbDrmStatusQuotaExceededError`
+*   `kSbDrmStatusUnknownError`
+
+    The following error can be used when the error status cannot be mapped to
+    one of the above errors.
+
+## Typedefs ##
+
+### SbDrmServerCertificateUpdatedFunc ###
+
+A callback to notify the caller of SbDrmUpdateServerCertificate() whether the
+update has been successfully updated or not.
+
+#### Definition ####
+
+```
+typedef void(* SbDrmServerCertificateUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message)
+```
+
+### SbDrmSessionClosedFunc ###
+
+A callback for signalling that a session has been closed by the SbDrmSystem
+
+#### Definition ####
+
+```
+typedef void(* SbDrmSessionClosedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size)
+```
+
+### SbDrmSessionKeyStatusesChangedFunc ###
+
+A callback for notifications that the status of one or more keys in a session
+has been changed. All keys of the session and their new status will be passed
+along. Any keys not in the list is considered as deleted.
+
+#### Definition ####
+
+```
+typedef void(* SbDrmSessionKeyStatusesChangedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size, int number_of_keys, const SbDrmKeyId *key_ids, const SbDrmKeyStatus *key_statuses)
+```
+
+### SbDrmSessionUpdateRequestFunc ###
+
+A callback that will receive generated session update request when requested
+from a SbDrmSystem. `drm_system` will be the DRM system that
+SbDrmGenerateSessionUpdateRequest() was called on. `context` will be the same
+context that was passed into the call to SbDrmCreateSystem().
+
+`status` is the status of the session request.
+
+`type` is the status of the session request.
+
+`error_message` may contain an optional error message when `status` isn't
+`kSbDrmStatusSuccess` to provide more details about the error. It may be NULL if
+`status` is `kSbDrmStatusSuccess` or if no error message can be provided.
+`ticket` will be the same ticket that was passed to
+SbDrmGenerateSessionUpdateRequest() or `kSbDrmTicketInvalid` if the update
+request was generated by the DRM system.
+
+`session_id` cannot be NULL when `ticket` is `kSbDrmTicketInvalid`, even when
+there was an error generating the request. This allows Cobalt to find and reject
+the correct Promise corresponding to the associated
+SbDrmGenerateSessionUpdateRequest().
+
+#### Definition ####
+
+```
+typedef void(* SbDrmSessionUpdateRequestFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, SbDrmSessionRequestType type, const char *error_message, const void *session_id, int session_id_size, const void *content, int content_size, const char *url)
+```
+
+### SbDrmSessionUpdatedFunc ###
+
+A callback for notifications that a session has been added, and subsequent
+encrypted samples are actively ready to be decoded. `drm_system` will be the DRM
+system that SbDrmUpdateSession() was called on. `context` will be the same
+context passed into that call to SbDrmCreateSystem().
+
+`ticket` will be the same ticket that was passed to SbDrmUpdateSession().
+
+`status` is the status of the session request.
+
+`error_message` may contain an optional error message when `status` isn't
+`kSbDrmStatusSuccess` to provide more details about the error. It may be NULL if
+`status` is `kSbDrmStatusSuccess` or if no error message can be provided.
+`succeeded` is whether the session was successfully updated or not.
+
+#### Definition ####
+
+```
+typedef void(* SbDrmSessionUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message, const void *session_id, int session_id_size)
+```
+
+### SbDrmSystem ###
+
+A handle to a DRM system which can be used with either an SbDecoder or a
+SbPlayer.
+
+#### Definition ####
+
+```
+typedef struct SbDrmSystemPrivate* SbDrmSystem
+```
+
+## Structs ##
+
+### SbDrmKeyId ###
+
+#### Members ####
+
+*   `uint8_t identifier`
+
+    The ID of the license (or key) required to decrypt this sample. For
+    PlayReady, this is the license GUID in packed little-endian binary form.
+*   `int identifier_size`
+
+### SbDrmSampleInfo ###
+
+All the optional information needed per sample for encrypted samples.
+
+#### Members ####
+
+*   `uint8_t initialization_vector`
+
+    The Initialization Vector needed to decrypt this sample.
+*   `int initialization_vector_size`
+*   `uint8_t identifier`
+
+    The ID of the license (or key) required to decrypt this sample. For
+    PlayReady, this is the license GUID in packed little-endian binary form.
+*   `int identifier_size`
+*   `int32_t subsample_count`
+
+    The number of subsamples in this sample, must be at least 1.
+*   `constSbDrmSubSampleMapping* subsample_mapping`
+
+    The clear/encrypted mapping of each subsample in this sample. This must be
+    an array of `subsample_count` mappings.
+
+### SbDrmSubSampleMapping ###
+
+A mapping of clear and encrypted bytes for a single subsample. All subsamples
+within a sample must be encrypted with the same encryption parameters. The clear
+bytes always appear first in the sample.
+
+#### Members ####
+
+*   `int32_t clear_byte_count`
+
+    How many bytes of the corresponding subsample are not encrypted
+*   `int32_t encrypted_byte_count`
+
+    How many bytes of the corresponding subsample are encrypted.
+
+## Functions ##
+
+### SbDrmCloseSession ###
+
+Clear any internal states/resources related to the specified `session_id`.
+
+#### Declaration ####
+
+```
+void SbDrmCloseSession(SbDrmSystem drm_system, const void *session_id, int session_id_size)
+```
+
+### SbDrmDestroySystem ###
+
+Destroys `drm_system`, which implicitly removes all keys installed in it and
+invalidates all outstanding session update requests. A DRM system cannot be
+destroyed unless any associated SbPlayer or SbDecoder has first been destroyed.
+
+All callbacks are guaranteed to be finished when this function returns. As a
+result, if this function is called from a callback that is passed to
+SbDrmCreateSystem(), a deadlock will occur.
+
+`drm_system`: The DRM system to be destroyed.
+
+#### Declaration ####
+
+```
+void SbDrmDestroySystem(SbDrmSystem drm_system)
+```
+
+### SbDrmGenerateSessionUpdateRequest ###
+
+Asynchronously generates a session update request payload for
+`initialization_data`, of `initialization_data_size`, in case sensitive `type`,
+extracted from the media stream, in `drm_system`'s key system.
+
+This function calls `drm_system`'s `update_request_callback` function, which is
+defined when the DRM system is created by SbDrmCreateSystem. When calling that
+function, this function either sends `context` (also from `SbDrmCreateSystem`)
+and a populated request, or it sends NULL `session_id` if an error occurred.
+
+`drm_system`'s `context` may be used to route callbacks back to an object
+instance.
+
+Callbacks may be called either from the current thread before this function
+returns or from another thread.
+
+`drm_system`: The DRM system that defines the key system used for the session
+update request payload as well as the callback function that is called as a
+result of the function being called.
+
+`ticket`: The opaque ID that allows to distinguish callbacks from multiple
+concurrent calls to SbDrmGenerateSessionUpdateRequest(), which will be passed to
+`update_request_callback` as-is. It is the responsibility of the caller to
+establish ticket uniqueness, issuing multiple requests with the same ticket may
+result in undefined behavior. The value `kSbDrmTicketInvalid` must not be used.
+
+`type`: The case-sensitive type of the session update request payload.
+`initialization_data`: The data for which the session update request payload is
+created. `initialization_data_size`: The size of the session update request
+payload.
+
+#### Declaration ####
+
+```
+void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
+```
+
+### SbDrmIsServerCertificateUpdatable ###
+
+Returns true if server certificate of `drm_system` can be updated via
+SbDrmUpdateServerCertificate(). The return value should remain the same during
+the life time of `drm_system`.
+
+`drm_system`: The DRM system to check if its server certificate is updatable.
+
+#### Declaration ####
+
+```
+bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system)
+```
+
+### SbDrmSystemIsValid ###
+
+Indicates whether `drm_system` is a valid SbDrmSystem.
+
+#### Declaration ####
+
+```
+static bool SbDrmSystemIsValid(SbDrmSystem drm)
+```
+
+### SbDrmTicketIsValid ###
+
+Indicates whether `ticket` is a valid ticket.
+
+#### Declaration ####
+
+```
+static bool SbDrmTicketIsValid(int ticket)
+```
+
+### SbDrmUpdateServerCertificate ###
+
+Update the server certificate of `drm_system`. The function can be called
+multiple times. It is possible that a call to it happens before the callback of
+a previous call is called. Note that this function should only be called after
+`SbDrmIsServerCertificateUpdatable` is called first and returned true.
+
+`drm_system`: The DRM system whose server certificate is being updated.
+`ticket`: The opaque ID that allows to distinguish callbacks from multiple
+concurrent calls to SbDrmUpdateServerCertificate(), which will be passed to
+`server_certificate_updated_callback` as-is. It is the responsibility of the
+caller to establish ticket uniqueness, issuing multiple requests with the same
+ticket may result in undefined behavior. The value `kSbDrmTicketInvalid` must
+not be used. `certificate`: Pointer to the server certificate data.
+`certificate_size`: Size of the server certificate data.
+
+#### Declaration ####
+
+```
+void SbDrmUpdateServerCertificate(SbDrmSystem drm_system, int ticket, const void *certificate, int certificate_size)
+```
+
+### SbDrmUpdateSession ###
+
+Update session with `key`, in `drm_system`'s key system, from the license server
+response. Calls `session_updated_callback` with `context` and whether the update
+succeeded. `context` may be used to route callbacks back to an object instance.
+
+`ticket` is the opaque ID that allows to distinguish callbacks from multiple
+concurrent calls to SbDrmUpdateSession(), which will be passed to
+`session_updated_callback` as-is. It is the responsibility of the caller to
+establish ticket uniqueness, issuing multiple calls with the same ticket may
+result in undefined behavior.
+
+Once the session is successfully updated, an SbPlayer or SbDecoder associated
+with that DRM key system will be able to decrypt encrypted samples.
+
+`drm_system`'s `session_updated_callback` may called either from the current
+thread before this function returns or from another thread.
+
+#### Declaration ####
+
+```
+void SbDrmUpdateSession(SbDrmSystem drm_system, int ticket, const void *key, int key_size, const void *session_id, int session_id_size)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/egl.md b/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
new file mode 100644
index 0000000..1938b5b
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
@@ -0,0 +1,119 @@
+---
+layout: doc
+title: "Starboard Module Reference: egl.h"
+---
+
+The EGL API provides an interface with accompanying type declarations and
+defines that together provide a single consistent method of EGL usage across
+platforms.
+
+This API is designed to abstract the differences between EGL implementations and
+versions on different systems, and to remove the requirement for any other code
+to directly pull in and use these system libraries.
+EGL Version
+
+This API has the ability to support EGL 1.5, however it is not required to
+support anything beyond EGL 1.4. The user is responsible for ensuring that the
+functions from EGL 1.5 they are calling from the interface are valid.
+
+## Macros ##
+
+### SB_EGL_ALPHA_FORMAT ###
+
+EGL_VERSION_1_2
+
+### SB_EGL_ALPHA_SIZE ###
+
+EGL_VERSION_1_0
+
+### SB_EGL_BACK_BUFFER ###
+
+EGL_VERSION_1_1
+
+### SB_EGL_CONFORMANT ###
+
+EGL_VERSION_1_3
+
+### SB_EGL_CONTEXT_MAJOR_VERSION ###
+
+EGL_VERSION_1_5
+
+### SB_EGL_DEFAULT_DISPLAY ###
+
+EGL_VERSION_1_4
+
+## Typedefs ##
+
+### SbEglCastsToProperFunctionPointerType ###
+
+The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/egl.h](https://www.khronos.org/registry/EGL/api/EGL/egl.h)
+.
+
+#### Definition ####
+
+```
+typedef void(* SbEglCastsToProperFunctionPointerType) (void)
+```
+
+### SbEglInt32 ###
+
+The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h](https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h)
+.
+
+#### Definition ####
+
+```
+typedef int32_t SbEglInt32
+```
+
+## Structs ##
+
+### SbEglInterface ###
+
+#### Members ####
+
+*   `SbEglBoolean(* eglChooseConfig`
+*   `SbEglBoolean(* eglCopyBuffers`
+*   `SbEglContext(* eglCreateContext`
+*   `SbEglSurface(* eglCreatePbufferSurface`
+*   `SbEglSurface(* eglCreatePixmapSurface`
+*   `SbEglSurface(* eglCreateWindowSurface`
+*   `SbEglBoolean(* eglDestroyContext`
+*   `SbEglBoolean(* eglDestroySurface`
+*   `SbEglBoolean(* eglGetConfigAttrib`
+*   `SbEglBoolean(* eglGetConfigs`
+*   `SbEglDisplay(* eglGetCurrentDisplay`
+*   `SbEglSurface(* eglGetCurrentSurface`
+*   `SbEglDisplay(* eglGetDisplay`
+*   `SbEglInt32(* eglGetError`
+*   `SbEglCastsToProperFunctionPointerType(* eglGetProcAddress`
+*   `SbEglBoolean(* eglInitialize`
+*   `SbEglBoolean(* eglMakeCurrent`
+*   `SbEglBoolean(* eglQueryContext`
+*   `const char *(* eglQueryString`
+*   `SbEglBoolean(* eglQuerySurface`
+*   `SbEglBoolean(* eglSwapBuffers`
+*   `SbEglBoolean(* eglTerminate`
+*   `SbEglBoolean(* eglWaitGL`
+*   `SbEglBoolean(* eglWaitNative`
+*   `SbEglBoolean(* eglBindTexImage`
+*   `SbEglBoolean(* eglReleaseTexImage`
+*   `SbEglBoolean(* eglSurfaceAttrib`
+*   `SbEglBoolean(* eglSwapInterval`
+*   `SbEglBoolean(* eglBindAPI`
+*   `SbEglEnum(* eglQueryAPI`
+*   `SbEglSurface(* eglCreatePbufferFromClientBuffer`
+*   `SbEglBoolean(* eglReleaseThread`
+*   `SbEglBoolean(* eglWaitClient`
+*   `SbEglContext(* eglGetCurrentContext`
+*   `SbEglSync(* eglCreateSync`
+*   `SbEglBoolean(* eglDestroySync`
+*   `SbEglInt32(* eglClientWaitSync`
+*   `SbEglBoolean(* eglGetSyncAttrib`
+*   `SbEglImage(* eglCreateImage`
+*   `SbEglBoolean(* eglDestroyImage`
+*   `SbEglDisplay(* eglGetPlatformDisplay`
+*   `SbEglSurface(* eglCreatePlatformWindowSurface`
+*   `SbEglSurface(* eglCreatePlatformPixmapSurface`
+*   `SbEglBoolean(* eglWaitSync`
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/event.md b/src/cobalt/site/docs/reference/starboard/modules/11/event.md
new file mode 100644
index 0000000..2d0f9cc
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/event.md
@@ -0,0 +1,368 @@
+---
+layout: doc
+title: "Starboard Module Reference: event.h"
+---
+
+Defines the event system that wraps the Starboard main loop and entry point.
+The Starboard Application Lifecycle
+
+```
+    ---------- *
+   |           |
+   |        Preload
+   |           |
+   |           V
+ Start   [ PRELOADING ] ------------
+   |           |                    |
+   |         Start                  |
+   |           |                    |
+   |           V                    |
+    ----> [ STARTED ] <----         |
+               |           |        |
+             Pause       Unpause    |
+               |           |     Suspend
+               V           |        |
+    -----> [ PAUSED ] -----         |
+   |           |                    |
+Resume      Suspend                 |
+   |           |                    |
+   |           V                    |
+    ---- [ SUSPENDED ] <------------
+               |
+              Stop
+               |
+               V
+          [ STOPPED ]
+
+```
+
+The first event that a Starboard application receives is either `Start`
+(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
+application in the `STARTED` state, whereas `Preload` puts the application in
+the `PRELOADING` state.
+
+`PRELOADING` can only happen as the first application state. In this state, the
+application should start and run as normal, but will not receive any input, and
+should not try to initialize graphics resources (via GL or `SbBlitter`). In
+`PRELOADING`, the application can receive `Start` or `Suspend` events. `Start`
+will receive the same data that was passed into `Preload`.
+
+In the `STARTED` state, the application is in the foreground and can expect to
+do all of the normal things it might want to do. Once in the `STARTED` state, it
+may receive a `Pause` event, putting the application into the `PAUSED` state.
+
+In the `PAUSED` state, the application is still visible, but has lost focus, or
+it is partially obscured by a modal dialog, or it is on its way to being shut
+down. The application should pause activity in this state. In this state, it can
+receive `Unpause` to be brought back to the foreground state (`STARTED`), or
+`Suspend` to be pushed further in the background to the `SUSPENDED` state.
+
+In the `SUSPENDED` state, the application is generally not visible. It should
+immediately release all graphics and video resources, and shut down all
+background activity (timers, rendering, etc). Additionally, the application
+should flush storage to ensure that if the application is killed, the storage
+will be up-to-date. The application may be killed at this point, but will
+ideally receive a `Stop` event for a more graceful shutdown.
+
+Note that the application is always expected to transition through `PAUSED` to
+`SUSPENDED` before receiving `Stop` or being killed.
+
+## Enums ##
+
+### SbEventType ###
+
+An enumeration of all possible event types dispatched directly by the system.
+Each event is accompanied by a void* data argument, and each event must define
+the type of the value pointed to by that data argument, if any.
+
+#### Values ####
+
+*   `kSbEventTypePreload`
+
+    Applications should perform initialization and prepare to react to
+    subsequent events, but must not initialize any graphics resources (through
+    GL or SbBlitter). The intent of this event is to allow the application to do
+    as much work as possible ahead of time, so that when the application is
+    first brought to the foreground, it's as fast as a resume.
+
+    The `kSbEventTypeStart` event may be sent at any time, regardless of
+    initialization state. Input events will not be sent in the `PRELOADING`
+    state. This event will only be sent once for a given process launch.
+    SbEventStartData is passed as the data argument.
+
+    The system may send `kSbEventTypeSuspend` in `PRELOADING` if it wants to
+    push the app into a lower resource consumption state. Applications can alo
+    call SbSystemRequestSuspend() when they are done preloading to request this.
+*   `kSbEventTypeStart`
+
+    The first event that an application receives on startup when starting
+    normally (i.e. not being preloaded). Applications should perform
+    initialization, start running, and prepare to react to subsequent events.
+    Applications that wish to run and then exit must call
+    `SbSystemRequestStop()` to terminate. This event will only be sent once for
+    a given process launch. `SbEventStartData` is passed as the data argument.
+    In case of preload, the `SbEventStartData` will be the same as what was
+    passed to `kSbEventTypePreload`.
+*   `kSbEventTypePause`
+
+    A dialog will be raised or the application will otherwise be put into a
+    background-but-visible or partially-obscured state (PAUSED). Graphics and
+    video resources will still be available, but the application should pause
+    foreground activity like animations and video playback. Can only be received
+    after a Start event. The only events that should be dispatched after a Pause
+    event are Unpause or Suspend. No data argument.
+*   `kSbEventTypeUnpause`
+
+    The application is returning to the foreground (STARTED) after having been
+    put in the PAUSED (e.g. partially-obscured) state. The application should
+    unpause foreground activity like animations and video playback. Can only be
+    received after a Pause or Resume event. No data argument.
+*   `kSbEventTypeSuspend`
+
+    The operating system will put the application into a Suspended state after
+    this event is handled. The application is expected to stop periodic
+    background work, release ALL graphics and video resources, and flush any
+    pending SbStorage writes. Some platforms will terminate the application if
+    work is done or resources are retained after suspension. Can only be
+    received after a Pause event. The only events that should be dispatched
+    after a Suspend event are Resume or Stop. On some platforms, the process may
+    also be killed after Suspend without a Stop event. No data argument.
+*   `kSbEventTypeResume`
+
+    The operating system has restored the application to the PAUSED state from
+    the SUSPENDED state. This is the first event the application will receive
+    coming out of SUSPENDED, and it will only be received after a Suspend event.
+    The application will now be in the PAUSED state. No data argument.
+*   `kSbEventTypeStop`
+
+    The operating system will shut the application down entirely after this
+    event is handled. Can only be recieved after a Suspend event, in the
+    SUSPENDED state. No data argument.
+*   `kSbEventTypeInput`
+
+    A user input event, including keyboard, mouse, gesture, or something else.
+    SbInputData (from input.h) is passed as the data argument.
+*   `kSbEventTypeUser`
+
+    A user change event, which means a new user signed-in or signed-out, or the
+    current user changed. No data argument, call SbUserGetSignedIn() and
+    SbUserGetCurrent() to get the latest changes.
+*   `kSbEventTypeLink`
+
+    A navigational link has come from the system, and the application should
+    consider handling it by navigating to the corresponding application
+    location. The data argument is an application-specific, null-terminated
+    string.
+*   `kSbEventTypeVerticalSync`
+
+    The beginning of a vertical sync has been detected. This event is very
+    timing-sensitive, so as little work as possible should be done on the main
+    thread if the application wants to receive this event in a timely manner. No
+    data argument.
+*   `kSbEventTypeScheduled`
+
+    An event type reserved for scheduled callbacks. It will only be sent in
+    response to an application call to SbEventSchedule(), and it will call the
+    callback directly, so SbEventHandle should never receive this event
+    directly. The data type is an internally-defined structure.
+*   `kSbEventTypeAccessiblitySettingsChanged`
+
+    The platform's accessibility settings have changed. The application should
+    query the accessibility settings using the appropriate APIs to get the new
+    settings. Note this excludes captions settings changes, which causes
+    kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
+    version has kSbEventTypeAccessiblityTextToSpeechSettingsChanged, then that
+    event should be used to signal text-to-speech settings changes instead;
+    platforms using older starboard versions should use
+    kSbEventTypeAccessiblitySettingsChanged for text-to-speech settings changes.
+*   `kSbEventTypeLowMemory`
+
+    An optional event that platforms may send to indicate that the application
+    may soon be terminated (or crash) due to low memory availability. The
+    application may respond by reducing memory consumption by running a Garbage
+    Collection, flushing caches, or something similar. There is no requirement
+    to respond to or handle this event, it is only advisory.
+*   `kSbEventTypeWindowSizeChanged`
+
+    The size or position of a SbWindow has changed. The data is
+    SbEventWindowSizeChangedData .
+*   `kSbEventTypeOnScreenKeyboardShown`
+
+    The platform has shown the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard show method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the show method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowShowOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardHidden`
+
+    The platform has hidden the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard hide method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the hide method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowHideOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardFocused`
+
+    The platform has focused the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard focus method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the focus method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowFocusOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardBlurred`
+
+    The platform has blurred the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard blur method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the blur method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowBlurOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardSuggestionsUpdated`
+
+    The platform has updated the on screen keyboard suggestions. This event is
+    triggered by the system or by the application's OnScreenKeyboard update
+    suggestions method. The event has int data representing a ticket. The ticket
+    is used by the application to mark individual calls to the update
+    suggestions method as successfully completed. Events triggered by the
+    application have tickets passed in via
+    SbWindowUpdateOnScreenKeyboardSuggestions. System-triggered events have
+    ticket value kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeAccessibilityCaptionSettingsChanged`
+
+    SB_HAS(ON_SCREEN_KEYBOARD) One or more of the fields returned by
+    SbAccessibilityGetCaptionSettings has changed.
+
+## Typedefs ##
+
+### SbEventCallback ###
+
+A function that can be called back from the main Starboard event pump.
+
+#### Definition ####
+
+```
+typedef void(* SbEventCallback) (void *context)
+```
+
+### SbEventDataDestructor ###
+
+A function that will cleanly destroy an event data instance of a specific type.
+
+#### Definition ####
+
+```
+typedef void(* SbEventDataDestructor) (void *data)
+```
+
+### SbEventId ###
+
+An ID that can be used to refer to a scheduled event.
+
+#### Definition ####
+
+```
+typedef uint32_t SbEventId
+```
+
+## Structs ##
+
+### SbEvent ###
+
+Structure representing a Starboard event and its data.
+
+#### Members ####
+
+*   `SbEventType type`
+*   `void * data`
+
+### SbEventStartData ###
+
+Event data for kSbEventTypeStart events.
+
+#### Members ####
+
+*   `char ** argument_values`
+
+    The command-line argument values (argv).
+*   `int argument_count`
+
+    The command-line argument count (argc).
+*   `const char * link`
+
+    The startup link, if any.
+
+### SbEventWindowSizeChangedData ###
+
+Event data for kSbEventTypeWindowSizeChanged events.
+
+#### Members ####
+
+*   `SbWindow window`
+*   `SbWindowSize size`
+
+## Functions ##
+
+### SbEventCancel ###
+
+Cancels the specified `event_id`. Note that this function is a no-op if the
+event already fired. This function can be safely called from any thread, but the
+only way to guarantee that the event does not run anyway is to call it from the
+main Starboard event loop thread.
+
+#### Declaration ####
+
+```
+void SbEventCancel(SbEventId event_id)
+```
+
+### SbEventHandle ###
+
+The entry point that Starboard applications MUST implement. Any memory pointed
+at by `event` or the `data` field inside `event` is owned by the system, and
+that memory is reclaimed after this function returns, so the implementation must
+copy this data to extend its life. This behavior should also be assumed of all
+fields within the `data` object, unless otherwise explicitly specified.
+
+This function is only called from the main Starboard thread. There is no
+specification about what other work might happen on this thread, so the
+application should generally do as little work as possible on this thread, and
+just dispatch it over to another thread.
+
+#### Declaration ####
+
+```
+SB_IMPORT void SbEventHandle(const SbEvent *event)
+```
+
+### SbEventIsIdValid ###
+
+Returns whether the given event handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbEventIsIdValid(SbEventId handle)
+```
+
+### SbEventSchedule ###
+
+Schedules an event `callback` into the main Starboard event loop. This function
+may be called from any thread, but `callback` is always called from the main
+Starboard thread, queued with other pending events.
+
+`callback`: The callback function to be called. `context`: The context that is
+passed to the `callback` function. `delay`: The minimum number of microseconds
+to wait before calling the `callback` function. Set `delay` to `0` to call the
+callback as soon as possible.
+
+#### Declaration ####
+
+```
+SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/export.md b/src/cobalt/site/docs/reference/starboard/modules/11/export.md
new file mode 100644
index 0000000..ff79777
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/export.md
@@ -0,0 +1,24 @@
+---
+layout: doc
+title: "Starboard Module Reference: export.h"
+---
+
+Provides macros for properly exporting or importing symbols from shared
+libraries.
+
+## Macros ##
+
+### SB_EXPORT ###
+
+Specification for a symbol that should be exported when building the DLL and
+imported when building code that uses the DLL.
+
+### SB_EXPORT_PRIVATE ###
+
+Specification for a symbol that should be exported or imported for testing
+purposes only.
+
+### SB_IMPORT ###
+
+Specification for a symbol that is expected to be defined externally to this
+module.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/file.md b/src/cobalt/site/docs/reference/starboard/modules/11/file.md
new file mode 100644
index 0000000..ad890dc
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/file.md
@@ -0,0 +1,389 @@
+---
+layout: doc
+title: "Starboard Module Reference: file.h"
+---
+
+Defines file system input/output functions.
+
+## Macros ##
+
+### kSbFileInvalid ###
+
+Well-defined value for an invalid file handle.
+
+## Enums ##
+
+### SbFileError ###
+
+kSbFileErrorAccessDenied is returned when a call fails because of a filesystem
+restriction. kSbFileErrorSecurity is returned when a security policy doesn't
+allow the operation to be executed.
+
+#### Values ####
+
+*   `kSbFileOk`
+*   `kSbFileErrorFailed`
+*   `kSbFileErrorInUse`
+*   `kSbFileErrorExists`
+*   `kSbFileErrorNotFound`
+*   `kSbFileErrorAccessDenied`
+*   `kSbFileErrorTooManyOpened`
+*   `kSbFileErrorNoMemory`
+*   `kSbFileErrorNoSpace`
+*   `kSbFileErrorNotADirectory`
+*   `kSbFileErrorInvalidOperation`
+*   `kSbFileErrorSecurity`
+*   `kSbFileErrorAbort`
+*   `kSbFileErrorNotAFile`
+*   `kSbFileErrorNotEmpty`
+*   `kSbFileErrorInvalidUrl`
+*   `kSbFileErrorIO`
+*   `kSbFileErrorMax`
+
+### SbFileFlags ###
+
+Flags that define how a file is used in the application. These flags should be
+or'd together when passed to SbFileOpen to open or create a file.
+
+The following five flags are mutually exclusive. You must specify exactly one of
+them:
+
+*   `kSbFileOpenAlways`
+
+*   `kSbFileOpenOnly`
+
+*   `kSbFileOpenTruncated`
+
+*   `kSbFileCreateAlways`
+
+*   `kSbFileCreateOnly`
+
+In addition, one or more of the following flags must be specified:
+
+*   `kSbFileRead`
+
+*   `kSbFileWrite`
+
+The `kSbFileAsync` flag is optional.
+
+#### Values ####
+
+*   `kSbFileOpenOnly`
+*   `kSbFileCreateOnly`
+*   `kSbFileOpenAlways`
+
+    does not already exist.
+*   `kSbFileCreateAlways`
+
+    path or creates a new file at that path.
+*   `kSbFileOpenTruncated`
+
+    or overwrites an existing file at that path.
+*   `kSbFileRead`
+
+    only if it exists.
+*   `kSbFileWrite`
+*   `kSbFileAsync`
+
+### SbFileWhence ###
+
+This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux.
+
+#### Values ####
+
+*   `kSbFileFromBegin`
+*   `kSbFileFromCurrent`
+*   `kSbFileFromEnd`
+
+## Typedefs ##
+
+### SbFile ###
+
+A handle to an open file.
+
+#### Definition ####
+
+```
+typedef SbFilePrivate* SbFile
+```
+
+## Structs ##
+
+### SbFileInfo ###
+
+Used to hold information about a file.
+
+#### Members ####
+
+*   `int64_t size`
+
+    The size of the file in bytes. Undefined when is_directory is true.
+*   `bool is_directory`
+
+    Whether the file corresponds to a directory.
+*   `bool is_symbolic_link`
+
+    Whether the file corresponds to a symbolic link.
+*   `SbTime last_modified`
+
+    The last modified time of a file.
+*   `SbTime last_accessed`
+
+    The last accessed time of a file.
+*   `SbTime creation_time`
+
+    The creation time of a file.
+
+## Functions ##
+
+### SbFileCanOpen ###
+
+Indicates whether SbFileOpen() with the given `flags` is allowed for `path`.
+
+`path`: The absolute path to be checked. `flags`: The flags that are being
+evaluated for the given `path`.
+
+#### Declaration ####
+
+```
+bool SbFileCanOpen(const char *path, int flags)
+```
+
+### SbFileClose ###
+
+Closes `file`. The return value indicates whether the file was closed
+successfully.
+
+`file`: The absolute path of the file to be closed.
+
+#### Declaration ####
+
+```
+bool SbFileClose(SbFile file)
+```
+
+### SbFileDelete ###
+
+Deletes the regular file, symlink, or empty directory at `path`. This function
+is used primarily to clean up after unit tests. On some platforms, this function
+fails if the file in question is being held open.
+
+`path`: The absolute path fo the file, symlink, or directory to be deleted.
+
+#### Declaration ####
+
+```
+bool SbFileDelete(const char *path)
+```
+
+### SbFileExists ###
+
+Indicates whether a file or directory exists at `path`.
+
+`path`: The absolute path of the file or directory being checked.
+
+#### Declaration ####
+
+```
+bool SbFileExists(const char *path)
+```
+
+### SbFileFlush ###
+
+Flushes the write buffer to `file`. Data written via SbFileWrite is not
+necessarily committed until the SbFile is flushed or closed.
+
+`file`: The SbFile to which the write buffer is flushed.
+
+#### Declaration ####
+
+```
+bool SbFileFlush(SbFile file)
+```
+
+### SbFileGetInfo ###
+
+Retrieves information about `file`. The return value indicates whether the file
+information was retrieved successfully.
+
+`file`: The SbFile for which information is retrieved. `out_info`: The variable
+into which the retrieved data is placed. This variable is not touched if the
+operation is not successful.
+
+#### Declaration ####
+
+```
+bool SbFileGetInfo(SbFile file, SbFileInfo *out_info)
+```
+
+### SbFileGetPathInfo ###
+
+Retrieves information about the file at `path`. The return value indicates
+whether the file information was retrieved successfully.
+
+`file`: The absolute path of the file for which information is retrieved.
+`out_info`: The variable into which the retrieved data is placed. This variable
+is not touched if the operation is not successful.
+
+#### Declaration ####
+
+```
+bool SbFileGetPathInfo(const char *path, SbFileInfo *out_info)
+```
+
+### SbFileIsValid ###
+
+Returns whether the given file handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbFileIsValid(SbFile file)
+```
+
+### SbFileModeStringToFlags ###
+
+Converts an ISO `fopen()` mode string into flags that can be equivalently passed
+into SbFileOpen().
+
+`mode`: The mode string to be converted into flags.
+
+#### Declaration ####
+
+```
+int SbFileModeStringToFlags(const char *mode)
+```
+
+### SbFileOpen ###
+
+Opens the file at `path`, which must be absolute, creating it if specified by
+`flags`. The read/write position is at the beginning of the file.
+
+Note that this function only guarantees the correct behavior when `path` points
+to a file. The behavior is undefined if `path` points to a directory.
+
+`path`: The absolute path of the file to be opened. `flags`: `SbFileFlags` that
+determine how the file is used in the application. Among other things, `flags`
+can indicate whether the application should create `path` if `path` does not
+already exist. `out_created`: Starboard sets this value to `true` if a new file
+is created or if an old file is truncated to zero length to simulate a new file,
+which can happen if the `kSbFileCreateAlways` flag is set. Otherwise, Starboard
+sets this value to `false`. `out_error`: If `path` cannot be created, this is
+set to `kSbFileInvalid`. Otherwise, it is `NULL`.
+
+#### Declaration ####
+
+```
+SbFile SbFileOpen(const char *path, int flags, bool *out_created, SbFileError *out_error)
+```
+
+### SbFileRead ###
+
+Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
+at the file's current position.
+
+The return value specifies the number of bytes read or `-1` if there was an
+error. Note that this function does NOT make a best effort to read all data on
+all platforms; rather, it just reads however many bytes are quickly available.
+However, this function can be run in a loop to make it a best-effort read.
+
+`file`: The SbFile from which to read data. `data`: The variable to which data
+is read. `size`: The amount of data (in bytes) to read.
+
+#### Declaration ####
+
+```
+int SbFileRead(SbFile file, char *data, int size)
+```
+
+### SbFileReadAll ###
+
+Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
+at the file's current position.
+
+The return value specifies the number of bytes read or `-1` if there was an
+error. Note that, unlike `SbFileRead`, this function does make a best effort to
+read all data on all platforms. As such, it is not intended for stream-oriented
+files but instead for cases when the normal expectation is that `size` bytes can
+be read unless there is an error.
+
+`file`: The SbFile from which to read data. `data`: The variable to which data
+is read. `size`: The amount of data (in bytes) to read.
+
+#### Declaration ####
+
+```
+static int SbFileReadAll(SbFile file, char *data, int size)
+```
+
+### SbFileSeek ###
+
+Changes the current read/write position in `file`. The return value identifies
+the resultant current read/write position in the file (relative to the start) or
+`-1` in case of an error. This function might not support seeking past the end
+of the file on some platforms.
+
+`file`: The SbFile in which the read/write position will be changed. `whence`:
+The starting read/write position. The position is modified relative to this
+value. `offset`: The amount that the read/write position is changed, relative to
+`whence`.
+
+#### Declaration ####
+
+```
+int64_t SbFileSeek(SbFile file, SbFileWhence whence, int64_t offset)
+```
+
+### SbFileTruncate ###
+
+Truncates the given `file` to the given `length`. The return value indicates
+whether the file was truncated successfully.
+
+`file`: The file to be truncated. `length`: The expected length of the file
+after it is truncated. If `length` is greater than the current size of the file,
+then the file is extended with zeros. If `length` is negative, then the function
+is a no-op and returns `false`.
+
+#### Declaration ####
+
+```
+bool SbFileTruncate(SbFile file, int64_t length)
+```
+
+### SbFileWrite ###
+
+Writes the given buffer into `file` at the file's current position, overwriting
+any data that was previously there.
+
+The return value identifies the number of bytes written, or `-1` on error. Note
+that this function does NOT make a best effort to write all data; rather, it
+writes however many bytes can be written quickly. Generally, this means that it
+writes however many bytes as possible without blocking on IO. Run this function
+in a loop to ensure that all data is written.
+
+`file`: The SbFile to which data will be written. `data`: The data to be
+written. `size`: The amount of data (in bytes) to write.
+
+#### Declaration ####
+
+```
+int SbFileWrite(SbFile file, const char *data, int size)
+```
+
+### SbFileWriteAll ###
+
+Writes the given buffer into `file`, starting at the beginning of the file, and
+overwriting any data that was previously there. Unlike SbFileWrite, this
+function does make a best effort to write all data on all platforms.
+
+The return value identifies the number of bytes written, or `-1` on error.
+
+`file`: The file to which data will be written. `data`: The data to be written.
+`size`: The amount of data (in bytes) to write.
+
+#### Declaration ####
+
+```
+static int SbFileWriteAll(SbFile file, const char *data, int size)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/gles.md b/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
new file mode 100644
index 0000000..e3a5508
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
@@ -0,0 +1,315 @@
+---
+layout: doc
+title: "Starboard Module Reference: gles.h"
+---
+
+The GLES API provides an interface with accompanying type declarations and
+defines that together provide a single consistent method of GLES usage across
+platforms.
+
+This API is designed to abstract the differences between GLES implementations
+and versions on different systems, and to remove the requirement for any other
+code to directly pull in and use these system libraries.
+GLES Version
+
+This API has the ability to support GLES 3.0, however platforms are not required
+to support anything beyond GLES 2.0. The caller is responsible for ensuring that
+the functions from GLES 3.0 they are calling from the interface are valid.
+
+## Macros ##
+
+### SB_GL_DEPTH_BUFFER_BIT ###
+
+Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+
+### SB_GL_READ_BUFFER ###
+
+Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+.
+
+## Typedefs ##
+
+### SbGlBoolean ###
+
+The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+.
+
+#### Definition ####
+
+```
+typedef uint8_t SbGlBoolean
+```
+
+### SbGlIntPtr ###
+
+Some compilers will transform the intptr_t to an int transparently behind the
+scenes, which is not equivalent to a long int, or long long int, as far as the
+compiler is concerned. We check the Starboard configuration and set the types to
+those exact types used by OpenGL ES 2.0 ( [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h)
+).
+
+#### Definition ####
+
+```
+typedef long int SbGlIntPtr
+```
+
+## Structs ##
+
+### SbGlesInterface ###
+
+#### Members ####
+
+*   `void(* glActiveTexture`
+
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+    .
+*   `void(* glAttachShader`
+*   `void(* glBindAttribLocation`
+*   `void(* glBindBuffer`
+*   `void(* glBindFramebuffer`
+*   `void(* glBindRenderbuffer`
+*   `void(* glBindTexture`
+*   `void(* glBlendColor`
+*   `void(* glBlendEquation`
+*   `void(* glBlendEquationSeparate`
+*   `void(* glBlendFunc`
+*   `void(* glBlendFuncSeparate`
+*   `void(* glBufferData`
+*   `void(* glBufferSubData`
+*   `SbGlEnum(* glCheckFramebufferStatus`
+*   `void(* glClear`
+*   `void(* glClearColor`
+*   `void(* glClearDepthf`
+*   `void(* glClearStencil`
+*   `void(* glColorMask`
+*   `void(* glCompileShader`
+*   `void(* glCompressedTexImage2D`
+*   `void(* glCompressedTexSubImage2D`
+*   `void(* glCopyTexImage2D`
+*   `void(* glCopyTexSubImage2D`
+*   `SbGlUInt32(* glCreateProgram`
+*   `SbGlUInt32(* glCreateShader`
+*   `void(* glCullFace`
+*   `void(* glDeleteBuffers`
+*   `void(* glDeleteFramebuffers`
+*   `void(* glDeleteProgram`
+*   `void(* glDeleteRenderbuffers`
+*   `void(* glDeleteShader`
+*   `void(* glDeleteTextures`
+*   `void(* glDepthFunc`
+*   `void(* glDepthMask`
+*   `void(* glDepthRangef`
+*   `void(* glDetachShader`
+*   `void(* glDisable`
+*   `void(* glDisableVertexAttribArray`
+*   `void(* glDrawArrays`
+*   `void(* glDrawElements`
+*   `void(* glEnable`
+*   `void(* glEnableVertexAttribArray`
+*   `void(* glFinish`
+*   `void(* glFlush`
+*   `void(* glFramebufferRenderbuffer`
+*   `void(* glFramebufferTexture2D`
+*   `void(* glFrontFace`
+*   `void(* glGenBuffers`
+*   `void(* glGenerateMipmap`
+*   `void(* glGenFramebuffers`
+*   `void(* glGenRenderbuffers`
+*   `void(* glGenTextures`
+*   `void(* glGetActiveAttrib`
+*   `void(* glGetActiveUniform`
+*   `void(* glGetAttachedShaders`
+*   `SbGlInt32(* glGetAttribLocation`
+*   `void(* glGetBooleanv`
+*   `void(* glGetBufferParameteriv`
+*   `SbGlEnum(* glGetError`
+*   `void(* glGetFloatv`
+*   `void(* glGetFramebufferAttachmentParameteriv`
+*   `void(* glGetIntegerv`
+*   `void(* glGetProgramiv`
+*   `void(* glGetProgramInfoLog`
+*   `void(* glGetRenderbufferParameteriv`
+*   `void(* glGetShaderiv`
+*   `void(* glGetShaderInfoLog`
+*   `void(* glGetShaderPrecisionFormat`
+*   `void(* glGetShaderSource`
+*   `const SbGlUInt8 *(* glGetString`
+*   `void(* glGetTexParameterfv`
+*   `void(* glGetTexParameteriv`
+*   `void(* glGetUniformfv`
+*   `void(* glGetUniformiv`
+*   `SbGlInt32(* glGetUniformLocation`
+*   `void(* glGetVertexAttribfv`
+*   `void(* glGetVertexAttribiv`
+*   `void(* glGetVertexAttribPointerv`
+*   `void(* glHint`
+*   `SbGlBoolean(* glIsBuffer`
+*   `SbGlBoolean(* glIsEnabled`
+*   `SbGlBoolean(* glIsFramebuffer`
+*   `SbGlBoolean(* glIsProgram`
+*   `SbGlBoolean(* glIsRenderbuffer`
+*   `SbGlBoolean(* glIsShader`
+*   `SbGlBoolean(* glIsTexture`
+*   `void(* glLineWidth`
+*   `void(* glLinkProgram`
+*   `void(* glPixelStorei`
+*   `void(* glPolygonOffset`
+*   `void(* glReadPixels`
+*   `void(* glReleaseShaderCompiler`
+*   `void(* glRenderbufferStorage`
+*   `void(* glSampleCoverage`
+*   `void(* glScissor`
+*   `void(* glShaderBinary`
+*   `void(* glShaderSource`
+*   `void(* glStencilFunc`
+*   `void(* glStencilFuncSeparate`
+*   `void(* glStencilMask`
+*   `void(* glStencilMaskSeparate`
+*   `void(* glStencilOp`
+*   `void(* glStencilOpSeparate`
+*   `void(* glTexImage2D`
+*   `void(* glTexParameterf`
+*   `void(* glTexParameterfv`
+*   `void(* glTexParameteri`
+*   `void(* glTexParameteriv`
+*   `void(* glTexSubImage2D`
+*   `void(* glUniform1f`
+*   `void(* glUniform1fv`
+*   `void(* glUniform1i`
+*   `void(* glUniform1iv`
+*   `void(* glUniform2f`
+*   `void(* glUniform2fv`
+*   `void(* glUniform2i`
+*   `void(* glUniform2iv`
+*   `void(* glUniform3f`
+*   `void(* glUniform3fv`
+*   `void(* glUniform3i`
+*   `void(* glUniform3iv`
+*   `void(* glUniform4f`
+*   `void(* glUniform4fv`
+*   `void(* glUniform4i`
+*   `void(* glUniform4iv`
+*   `void(* glUniformMatrix2fv`
+*   `void(* glUniformMatrix3fv`
+*   `void(* glUniformMatrix4fv`
+*   `void(* glUseProgram`
+*   `void(* glValidateProgram`
+*   `void(* glVertexAttrib1f`
+*   `void(* glVertexAttrib1fv`
+*   `void(* glVertexAttrib2f`
+*   `void(* glVertexAttrib2fv`
+*   `void(* glVertexAttrib3f`
+*   `void(* glVertexAttrib3fv`
+*   `void(* glVertexAttrib4f`
+*   `void(* glVertexAttrib4fv`
+*   `void(* glVertexAttribPointer`
+*   `void(* glViewport`
+*   `void(* glReadBuffer`
+
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+    .
+*   `void(* glDrawRangeElements`
+*   `void(* glTexImage3D`
+*   `void(* glTexSubImage3D`
+*   `void(* glCopyTexSubImage3D`
+*   `void(* glCompressedTexImage3D`
+*   `void(* glCompressedTexSubImage3D`
+*   `void(* glGenQueries`
+*   `void(* glDeleteQueries`
+*   `SbGlBoolean(* glIsQuery`
+*   `void(* glBeginQuery`
+*   `void(* glEndQuery`
+*   `void(* glGetQueryiv`
+*   `void(* glGetQueryObjectuiv`
+*   `SbGlBoolean(* glUnmapBuffer`
+*   `void(* glGetBufferPointerv`
+*   `void(* glDrawBuffers`
+*   `void(* glUniformMatrix2x3fv`
+*   `void(* glUniformMatrix3x2fv`
+*   `void(* glUniformMatrix2x4fv`
+*   `void(* glUniformMatrix4x2fv`
+*   `void(* glUniformMatrix3x4fv`
+*   `void(* glUniformMatrix4x3fv`
+*   `void(* glBlitFramebuffer`
+*   `void(* glRenderbufferStorageMultisample`
+*   `void(* glFramebufferTextureLayer`
+*   `void *(* glMapBufferRange`
+*   `void(* glFlushMappedBufferRange`
+*   `void(* glBindVertexArray`
+*   `void(* glDeleteVertexArrays`
+*   `void(* glGenVertexArrays`
+*   `SbGlBoolean(* glIsVertexArray`
+*   `void(* glGetIntegeri_v`
+*   `void(* glBeginTransformFeedback`
+*   `void(* glEndTransformFeedback`
+*   `void(* glBindBufferRange`
+*   `void(* glBindBufferBase`
+*   `void(* glTransformFeedbackVaryings`
+*   `void(* glGetTransformFeedbackVarying`
+*   `void(* glVertexAttribIPointer`
+*   `void(* glGetVertexAttribIiv`
+*   `void(* glGetVertexAttribIuiv`
+*   `void(* glVertexAttribI4i`
+*   `void(* glVertexAttribI4ui`
+*   `void(* glVertexAttribI4iv`
+*   `void(* glVertexAttribI4uiv`
+*   `void(* glGetUniformuiv`
+*   `SbGlInt32(* glGetFragDataLocation`
+*   `void(* glUniform1ui`
+*   `void(* glUniform2ui`
+*   `void(* glUniform3ui`
+*   `void(* glUniform4ui`
+*   `void(* glUniform1uiv`
+*   `void(* glUniform2uiv`
+*   `void(* glUniform3uiv`
+*   `void(* glUniform4uiv`
+*   `void(* glClearBufferiv`
+*   `void(* glClearBufferuiv`
+*   `void(* glClearBufferfv`
+*   `void(* glClearBufferfi`
+*   `const SbGlUInt8 *(* glGetStringi`
+*   `void(* glCopyBufferSubData`
+*   `void(* glGetUniformIndices`
+*   `void(* glGetActiveUniformsiv`
+*   `SbGlUInt32(* glGetUniformBlockIndex`
+*   `void(* glGetActiveUniformBlockiv`
+*   `void(* glGetActiveUniformBlockName`
+*   `void(* glUniformBlockBinding`
+*   `void(* glDrawArraysInstanced`
+*   `void(* glDrawElementsInstanced`
+*   `SbGlSync(* glFenceSync`
+*   `SbGlBoolean(* glIsSync`
+*   `void(* glDeleteSync`
+*   `SbGlEnum(* glClientWaitSync`
+*   `void(* glWaitSync`
+*   `void(* glGetInteger64v`
+*   `void(* glGetSynciv`
+*   `void(* glGetInteger64i_v`
+*   `void(* glGetBufferParameteri64v`
+*   `void(* glGenSamplers`
+*   `void(* glDeleteSamplers`
+*   `SbGlBoolean(* glIsSampler`
+*   `void(* glBindSampler`
+*   `void(* glSamplerParameteri`
+*   `void(* glSamplerParameteriv`
+*   `void(* glSamplerParameterf`
+*   `void(* glSamplerParameterfv`
+*   `void(* glGetSamplerParameteriv`
+*   `void(* glGetSamplerParameterfv`
+*   `void(* glVertexAttribDivisor`
+*   `void(* glBindTransformFeedback`
+*   `void(* glDeleteTransformFeedbacks`
+*   `void(* glGenTransformFeedbacks`
+*   `SbGlBoolean(* glIsTransformFeedback`
+*   `void(* glPauseTransformFeedback`
+*   `void(* glResumeTransformFeedback`
+*   `void(* glGetProgramBinary`
+*   `void(* glProgramBinary`
+*   `void(* glProgramParameteri`
+*   `void(* glInvalidateFramebuffer`
+*   `void(* glInvalidateSubFramebuffer`
+*   `void(* glTexStorage2D`
+*   `void(* glTexStorage3D`
+*   `void(* glGetInternalformativ`
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/image.md b/src/cobalt/site/docs/reference/starboard/modules/11/image.md
new file mode 100644
index 0000000..c911e41
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/image.md
@@ -0,0 +1,82 @@
+---
+layout: doc
+title: "Starboard Module Reference: image.h"
+---
+
+API for hardware accelerated image decoding. This module allows for the client
+to feed in raw, encoded data to be decoded directly into an SbDecodeTarget. It
+also provides an interface for the client to query what combinations of encoded
+image formats and SbDecodeTargetFormats are supported or not.
+
+All functions in this module are safe to call from any thread at any point in
+time.
+SbImageIsDecodeSupported and SbImageDecode Example
+
+Let's assume that we're on a Blitter platform.
+
+```
+SbDecodeTargetProvider* provider = GetProviderFromSomewhere();
+void* data = GetCompressedJPEGFromSomewhere();
+int data_size = GetCompressedJPEGSizeFromSomewhere();
+const char* mime_type = "image/jpeg";
+SbDecodeTargetFormat format = kSbDecodeTargetFormat1PlaneRGBA;
+
+if (!SbImageIsDecodeSupported(mime_type, format)) {
+  return;
+}
+
+SbDecodeTarget result_target = SbDecodeImage(provider, data, data_size,
+                                             mime_type, format);
+SbBlitterSurface surface =
+    SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
+// Do stuff with surface...
+
+```
+
+## Functions ##
+
+### SbImageDecode ###
+
+Attempt to decode encoded `mime_type` image data `data` of size `data_size` into
+an SbDecodeTarget of SbDecodeFormatType `format`, possibly using
+SbDecodeTargetProvider `provider`, if it is non-null. Thus, four following
+scenarios regarding the provider may happen:
+
+1.  The provider is required by the `SbImageDecode` implementation and no
+    provider is given. The implementation should gracefully fail by immediately
+    returning kSbDecodeTargetInvalid.
+
+1.  The provider is required and is passed in. The implementation will proceed
+    forward, using the SbDecodeTarget from the provider.
+
+1.  The provider is not required and is passed in. The provider will NOT be
+    called, and the implementation will proceed to decoding however it desires.
+
+1.  The provider is not required and is not passed in. The implementation will
+    proceed forward.
+
+Thus, it is NOT safe for clients of this API to assume that the `provider` it
+passes in will be called. Finally, if the decode succeeds, a new SbDecodeTarget
+will be allocated. If `mime_type` image decoding for the requested format is not
+supported or the decode fails, kSbDecodeTargetInvalid will be returned, with any
+intermediate allocations being cleaned up in the implementation.
+
+#### Declaration ####
+
+```
+SbDecodeTarget SbImageDecode(SbDecodeTargetGraphicsContextProvider *context_provider, void *data, int data_size, const char *mime_type, SbDecodeTargetFormat format)
+```
+
+### SbImageIsDecodeSupported ###
+
+Whether the current platform supports hardware accelerated decoding an image of
+mime type `mime_type` into SbDecodeTargetFormat `format`. The result of this
+function must not change over the course of the program, which means that the
+results of this function may be cached indefinitely.
+
+#### Declaration ####
+
+```
+bool SbImageIsDecodeSupported(const char *mime_type, SbDecodeTargetFormat format)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/input.md b/src/cobalt/site/docs/reference/starboard/modules/11/input.md
new file mode 100644
index 0000000..3554af6
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/input.md
@@ -0,0 +1,178 @@
+---
+layout: doc
+title: "Starboard Module Reference: input.h"
+---
+
+Defines input events and associated data types.
+
+## Enums ##
+
+### SbInputDeviceType ###
+
+Identifies possible input subsystem types. The types of events that each device
+type produces correspond to `SbInputEventType` values.
+
+#### Values ####
+
+*   `kSbInputDeviceTypeGesture`
+
+    Input from a gesture-detection mechanism. Examples include Kinect, Wiimotes,
+    etc...
+
+    Produces `Move`, `Press` and `Unpress` events.
+*   `kSbInputDeviceTypeGamepad`
+
+    Input from a gamepad, following the layout provided in the W3C Web Gamepad
+    API. [ [https://www.w3.org/TR/gamepad/](https://www.w3.org/TR/gamepad/) ]
+
+    Produces `Move`, `Press` and `Unpress` events.
+*   `kSbInputDeviceTypeKeyboard`
+
+    Keyboard input from a traditional keyboard or game controller chatpad.
+
+    Produces `Press` and `Unpress` events.
+*   `kSbInputDeviceTypeMouse`
+
+    Input from a traditional mouse.
+
+    Produces `Move`, `Press`, and `Unpress` events.
+*   `kSbInputDeviceTypeRemote`
+
+    Input from a TV remote-control-style device.
+
+    Produces `Press` and `Unpress` events.
+*   `kSbInputDeviceTypeTouchScreen`
+
+    Input from a single- or multi-touchscreen.
+
+    Produces `Move`, `Press`, and `Unpress` events.
+*   `kSbInputDeviceTypeTouchPad`
+
+    Input from a touchpad that is not masquerading as a mouse.
+
+    Produces `Move`, `Press`, and `Unpress` events.
+*   `kSbInputDeviceTypeOnScreenKeyboard`
+
+    Keyboard input from an on screen keyboard.
+
+    Produces `Input` events.
+
+### SbInputEventType ###
+
+The action that an input event represents.
+
+#### Values ####
+
+*   `kSbInputEventTypeMove`
+
+    Device Movement. In the case of `Mouse`, and perhaps `Gesture`, the movement
+    tracks an absolute cursor position. In the case of `TouchPad`, only relative
+    movements are provided.
+*   `kSbInputEventTypePress`
+
+    Key or button press activation. This could be a key on a keyboard, a button
+    on a mouse or game controller, a push from a touch screen, or a gesture. An
+    `Unpress` event is subsequently delivered when the `Press` event terminates,
+    such as when the key/button/finger is raised. Injecting repeat presses is up
+    to the client.
+*   `kSbInputEventTypeUnpress`
+
+    Key or button deactivation. The counterpart to the `Press` event, this event
+    is sent when the key or button being pressed is released.
+*   `kSbInputEventTypeWheel`
+
+    Wheel movement. Provides relative movements of the `Mouse` wheel.
+*   `kSbInputEventTypeInput`
+
+    [https://w3c.github.io/uievents/#event-type-input](https://w3c.github.io/uievents/#event-type-input)
+
+## Structs ##
+
+### SbInputData ###
+
+Event data for `kSbEventTypeInput` events.
+
+#### Members ####
+
+*   `SbTimeMonotonic timestamp`
+
+    The time that should be reported for this event. This is intended to
+    facilitate calculation of time-sensitive information (e.g. velocity for
+    kSbInputEventTypeMove). This may be set to 0 to have the relevant systems
+    automatically set the timestamp. However, this may happen at a later time,
+    so the relative time between events may not be preserved.
+*   `SbWindow window`
+
+    The window in which the input was generated.
+*   `SbInputEventType type`
+
+    The type of input event that this represents.
+*   `SbInputDeviceType device_type`
+
+    The type of device that generated this input event.
+*   `int device_id`
+
+    An identifier that is unique among all connected devices.
+*   `SbKey key`
+
+    An identifier that indicates which keyboard key or mouse button was involved
+    in this event, if any. All known keys for all devices are mapped to a single
+    ID space, defined by the `SbKey` enum in `key.h`.
+*   `wchar_t character`
+
+    The character that corresponds to the key. For an external keyboard, this
+    character also depends on the keyboard language. The value is `0` if there
+    is no corresponding character.
+*   `SbKeyLocation key_location`
+
+    The location of the specified key, in cases where there are multiple
+    instances of the button on the keyboard. For example, some keyboards have
+    more than one "shift" key.
+*   `unsigned int key_modifiers`
+
+    Key modifiers (e.g. `Ctrl`, `Shift`) held down during this input event.
+*   `SbInputVector position`
+
+    The (x, y) coordinates of the persistent cursor controlled by this device.
+    The value is `0` if this data is not applicable. For events with type
+    kSbInputEventTypeMove and device_type kSbInputDeviceTypeGamepad, this field
+    is interpreted as a stick position with the range [-1, 1], with positive
+    values for the down and right direction.
+*   `SbInputVector delta`
+
+    The relative motion vector of this input. The value is `0` if this data is
+    not applicable.
+*   `float pressure`
+
+    The normalized pressure of the pointer input in the range of [0,1], where 0
+    and 1 represent the minimum and maximum pressure the hardware is capable of
+    detecting, respectively. Use NaN for devices that do not report pressure.
+    This value is used for input events with device type mouse or touch screen.
+*   `SbInputVector size`
+
+    The (width, height) of the contact geometry of the pointer. This defines the
+    size of the area under the pointer position. If (NaN, NaN) is specified, the
+    value (0,0) will be used. This value is used for input events with device
+    type mouse or touch screen.
+*   `SbInputVector tilt`
+
+    The (x, y) angle in degrees, in the range of [-90, 90] of the pointer,
+    relative to the z axis. Positive values are for tilt to the right (x), and
+    towards the user (y). Use (NaN, NaN) for devices that do not report tilt.
+    This value is used for input events with device type mouse or touch screen.
+*   `const char * input_text`
+
+    The text to input for events of type `Input`.
+*   `bool is_composing`
+
+    Set to true if the input event is part of a composition event.
+
+### SbInputVector ###
+
+A 2-dimensional vector used to represent points and motion vectors.
+
+#### Members ####
+
+*   `float x`
+*   `float y`
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/key.md b/src/cobalt/site/docs/reference/starboard/modules/11/key.md
new file mode 100644
index 0000000..16be3c1
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/key.md
@@ -0,0 +1,293 @@
+---
+layout: doc
+title: "Starboard Module Reference: key.h"
+---
+
+Defines the canonical set of Starboard key codes.
+
+## Enums ##
+
+### SbKey ###
+
+A standard set of key codes, ordered by value, that represent each possible
+input key across all kinds of devices. Starboard uses the semi-standard Windows
+virtual key codes documented at: [https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx](https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx)
+
+#### Values ####
+
+*   `kSbKeyUnknown`
+*   `kSbKeyCancel`
+*   `kSbKeyBackspace`
+*   `kSbKeyBack`
+*   `kSbKeyTab`
+
+    semantic "back".
+*   `kSbKeyBacktab`
+*   `kSbKeyClear`
+*   `kSbKeyReturn`
+*   `kSbKeyShift`
+*   `kSbKeyControl`
+*   `kSbKeyMenu`
+*   `kSbKeyPause`
+*   `kSbKeyCapital`
+*   `kSbKeyKana`
+*   `kSbKeyHangul`
+*   `kSbKeyJunja`
+*   `kSbKeyFinal`
+*   `kSbKeyHanja`
+*   `kSbKeyKanji`
+*   `kSbKeyEscape`
+*   `kSbKeyConvert`
+*   `kSbKeyNonconvert`
+*   `kSbKeyAccept`
+*   `kSbKeyModechange`
+*   `kSbKeySpace`
+*   `kSbKeyPrior`
+*   `kSbKeyNext`
+*   `kSbKeyEnd`
+*   `kSbKeyHome`
+*   `kSbKeyLeft`
+*   `kSbKeyUp`
+*   `kSbKeyRight`
+*   `kSbKeyDown`
+*   `kSbKeySelect`
+*   `kSbKeyPrint`
+*   `kSbKeyExecute`
+*   `kSbKeySnapshot`
+*   `kSbKeyInsert`
+*   `kSbKeyDelete`
+*   `kSbKeyHelp`
+*   `kSbKey0`
+*   `kSbKey1`
+*   `kSbKey2`
+*   `kSbKey3`
+*   `kSbKey4`
+*   `kSbKey5`
+*   `kSbKey6`
+*   `kSbKey7`
+*   `kSbKey8`
+*   `kSbKey9`
+*   `kSbKeyA`
+*   `kSbKeyB`
+*   `kSbKeyC`
+*   `kSbKeyD`
+*   `kSbKeyE`
+*   `kSbKeyF`
+*   `kSbKeyG`
+*   `kSbKeyH`
+*   `kSbKeyI`
+*   `kSbKeyJ`
+*   `kSbKeyK`
+*   `kSbKeyL`
+*   `kSbKeyM`
+*   `kSbKeyN`
+*   `kSbKeyO`
+*   `kSbKeyP`
+*   `kSbKeyQ`
+*   `kSbKeyR`
+*   `kSbKeyS`
+*   `kSbKeyT`
+*   `kSbKeyU`
+*   `kSbKeyV`
+*   `kSbKeyW`
+*   `kSbKeyX`
+*   `kSbKeyY`
+*   `kSbKeyZ`
+*   `kSbKeyLwin`
+*   `kSbKeyCommand`
+*   `kSbKeyRwin`
+*   `kSbKeyApps`
+*   `kSbKeySleep`
+*   `kSbKeyNumpad0`
+*   `kSbKeyNumpad1`
+*   `kSbKeyNumpad2`
+*   `kSbKeyNumpad3`
+*   `kSbKeyNumpad4`
+*   `kSbKeyNumpad5`
+*   `kSbKeyNumpad6`
+*   `kSbKeyNumpad7`
+*   `kSbKeyNumpad8`
+*   `kSbKeyNumpad9`
+*   `kSbKeyMultiply`
+*   `kSbKeyAdd`
+*   `kSbKeySeparator`
+*   `kSbKeySubtract`
+*   `kSbKeyDecimal`
+*   `kSbKeyDivide`
+*   `kSbKeyF1`
+*   `kSbKeyF2`
+*   `kSbKeyF3`
+*   `kSbKeyF4`
+*   `kSbKeyF5`
+*   `kSbKeyF6`
+*   `kSbKeyF7`
+*   `kSbKeyF8`
+*   `kSbKeyF9`
+*   `kSbKeyF10`
+*   `kSbKeyF11`
+*   `kSbKeyF12`
+*   `kSbKeyF13`
+*   `kSbKeyF14`
+*   `kSbKeyF15`
+*   `kSbKeyF16`
+*   `kSbKeyF17`
+*   `kSbKeyF18`
+*   `kSbKeyF19`
+*   `kSbKeyF20`
+*   `kSbKeyF21`
+*   `kSbKeyF22`
+*   `kSbKeyF23`
+*   `kSbKeyF24`
+*   `kSbKeyNumlock`
+*   `kSbKeyScroll`
+*   `kSbKeyWlan`
+*   `kSbKeyPower`
+*   `kSbKeyLshift`
+*   `kSbKeyRshift`
+*   `kSbKeyLcontrol`
+*   `kSbKeyRcontrol`
+*   `kSbKeyLmenu`
+*   `kSbKeyRmenu`
+*   `kSbKeyBrowserBack`
+*   `kSbKeyBrowserForward`
+*   `kSbKeyBrowserRefresh`
+*   `kSbKeyBrowserStop`
+*   `kSbKeyBrowserSearch`
+*   `kSbKeyBrowserFavorites`
+*   `kSbKeyBrowserHome`
+*   `kSbKeyVolumeMute`
+*   `kSbKeyVolumeDown`
+*   `kSbKeyVolumeUp`
+*   `kSbKeyMediaNextTrack`
+*   `kSbKeyMediaPrevTrack`
+*   `kSbKeyMediaStop`
+*   `kSbKeyMediaPlayPause`
+*   `kSbKeyMediaLaunchMail`
+*   `kSbKeyMediaLaunchMediaSelect`
+*   `kSbKeyMediaLaunchApp1`
+*   `kSbKeyMediaLaunchApp2`
+*   `kSbKeyOem1`
+*   `kSbKeyOemPlus`
+*   `kSbKeyOemComma`
+*   `kSbKeyOemMinus`
+*   `kSbKeyOemPeriod`
+*   `kSbKeyOem2`
+*   `kSbKeyOem3`
+*   `kSbKeyBrightnessDown`
+*   `kSbKeyBrightnessUp`
+*   `kSbKeyKbdBrightnessDown`
+*   `kSbKeyOem4`
+*   `kSbKeyOem5`
+*   `kSbKeyOem6`
+*   `kSbKeyOem7`
+*   `kSbKeyOem8`
+*   `kSbKeyOem102`
+*   `kSbKeyKbdBrightnessUp`
+*   `kSbKeyDbeSbcschar`
+*   `kSbKeyDbeDbcschar`
+*   `kSbKeyPlay`
+*   `kSbKeyMediaRewind`
+
+    Other supported CEA 2014 keys.
+*   `kSbKeyMediaFastForward`
+*   `kSbKeyRed`
+
+    Key codes from the DTV Application Software Environment, [http://www.atsc.org/wp-content/uploads/2015/03/a_100_4.pdf](http://www.atsc.org/wp-content/uploads/2015/03/a_100_4.pdf)
+*   `kSbKeyGreen`
+*   `kSbKeyYellow`
+*   `kSbKeyBlue`
+*   `kSbKeyChannelUp`
+*   `kSbKeyChannelDown`
+*   `kSbKeySubtitle`
+*   `kSbKeyClosedCaption`
+*   `kSbKeyInfo`
+*   `kSbKeyGuide`
+*   `kSbKeyLast`
+
+    Key codes from OCAP, [https://apps.cablelabs.com/specification/opencable-application-platform-ocap/](https://apps.cablelabs.com/specification/opencable-application-platform-ocap/)
+*   `kSbKeyPreviousChannel`
+*   `kSbKeyInstantReplay`
+
+    Also from OCAP
+*   `kSbKeyLaunchThisApplication`
+
+    A button that will directly launch the current application.
+*   `kSbKeyMediaAudioTrack`
+
+    A button that will switch between different available audio tracks.
+*   `kSbKeyMicrophone`
+
+    A button that will trigger voice input.
+*   `kSbKeyMouse1`
+
+    Mouse buttons, starting with the left mouse button.
+*   `kSbKeyMouse2`
+*   `kSbKeyMouse3`
+*   `kSbKeyMouse4`
+*   `kSbKeyMouse5`
+*   `kSbKeyGamepad1`
+
+    Xbox A, PS O or X (depending on region), Switch A
+*   `kSbKeyGamepad2`
+
+    Xbox B, PS X or O (depending on region), Switch B
+*   `kSbKeyGamepad3`
+
+    Xbox X, PS square, Switch X
+*   `kSbKeyGamepad4`
+
+    Xbox Y, PS triangle, Switch Y
+*   `kSbKeyGamepadLeftBumper`
+
+    Pretty much every gamepad has bumpers at the top front of the controller,
+    and triggers at the bottom front of the controller.
+*   `kSbKeyGamepadRightBumper`
+*   `kSbKeyGamepadLeftTrigger`
+*   `kSbKeyGamepadRightTrigger`
+*   `kSbKeyGamepad5`
+
+    Xbox 360 Back, XB1 minimize, PS and WiiU Select
+*   `kSbKeyGamepad6`
+
+    Xbox 360 Play, XB1 Menu, PS and WiiU Start
+*   `kSbKeyGamepadLeftStick`
+
+    This refers to pressing the left stick like a button.
+*   `kSbKeyGamepadRightStick`
+
+    This refers to pressing the right stick like a button.
+*   `kSbKeyGamepadDPadUp`
+*   `kSbKeyGamepadDPadDown`
+*   `kSbKeyGamepadDPadLeft`
+*   `kSbKeyGamepadDPadRight`
+*   `kSbKeyGamepadSystem`
+
+    The system key in the middle of the gamepad, if it exists.
+*   `kSbKeyGamepadLeftStickUp`
+
+    Codes for thumbstick to virtual dpad conversions.
+*   `kSbKeyGamepadLeftStickDown`
+*   `kSbKeyGamepadLeftStickLeft`
+*   `kSbKeyGamepadLeftStickRight`
+*   `kSbKeyGamepadRightStickUp`
+*   `kSbKeyGamepadRightStickDown`
+*   `kSbKeyGamepadRightStickLeft`
+*   `kSbKeyGamepadRightStickRight`
+
+### SbKeyModifiers ###
+
+Bit-mask of key modifiers.
+
+#### Values ####
+
+*   `kSbKeyModifiersNone`
+*   `kSbKeyModifiersAlt`
+*   `kSbKeyModifiersCtrl`
+*   `kSbKeyModifiersMeta`
+*   `kSbKeyModifiersShift`
+*   `kSbKeyModifiersPointerButtonLeft`
+*   `kSbKeyModifiersPointerButtonRight`
+*   `kSbKeyModifiersPointerButtonMiddle`
+*   `kSbKeyModifiersPointerButtonBack`
+*   `kSbKeyModifiersPointerButtonForward`
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/log.md b/src/cobalt/site/docs/reference/starboard/modules/11/log.md
new file mode 100644
index 0000000..1ad6c24
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/log.md
@@ -0,0 +1,137 @@
+---
+layout: doc
+title: "Starboard Module Reference: log.h"
+---
+
+Defines core debug logging functions.
+
+## Enums ##
+
+### SbLogPriority ###
+
+The priority at which a message should be logged. The platform may be configured
+to filter logs by priority, or render them differently.
+
+#### Values ####
+
+*   `kSbLogPriorityUnknown`
+*   `kSbLogPriorityInfo`
+*   `kSbLogPriorityWarning`
+*   `kSbLogPriorityError`
+*   `kSbLogPriorityFatal`
+
+## Functions ##
+
+### SbLog ###
+
+Writes `message` to the platform's debug output log. This method is thread-safe,
+and responsible for ensuring that the output from multiple threads is not mixed.
+
+`priority`: The SbLogPriority at which the message should be logged. Note that
+passing `kSbLogPriorityFatal` does not terminate the program. Such a policy must
+be enforced at the application level. In fact, `priority` may be completely
+ignored on many platforms. `message`: The message to be logged. No formatting is
+required to be done on the value, including newline termination. That said,
+platforms can adjust the message to be more suitable for their output method by
+wrapping the text, stripping unprintable characters, etc.
+
+#### Declaration ####
+
+```
+void SbLog(SbLogPriority priority, const char *message)
+```
+
+### SbLogFlush ###
+
+Flushes the log buffer on some platforms. This method is safe to call from
+multiple threads.
+
+#### Declaration ####
+
+```
+void SbLogFlush()
+```
+
+### SbLogFormat ###
+
+A log output method that additionally performs a string format on the data being
+logged.
+
+#### Declaration ####
+
+```
+void SbLogFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
+```
+
+### SbLogFormatF ###
+
+Inline wrapper of SbLogFormat that converts from ellipsis to va_args.
+
+#### Declaration ####
+
+```
+void static void void SbLogFormatF(const char *format,...) SB_PRINTF_FORMAT(1
+```
+
+### SbLogIsTty ###
+
+Indicates whether the log output goes to a TTY or is being redirected.
+
+#### Declaration ####
+
+```
+bool SbLogIsTty()
+```
+
+### SbLogRaw ###
+
+A bare-bones log output method that is async-signal-safe, i.e. safe to call from
+an asynchronous signal handler (e.g. a `SIGSEGV` handler). It should not do any
+additional formatting.
+
+`message`: The message to be logged.
+
+#### Declaration ####
+
+```
+void SbLogRaw(const char *message)
+```
+
+### SbLogRawDumpStack ###
+
+Dumps the stack of the current thread to the log in an async-signal-safe manner,
+i.e. safe to call from an asynchronous signal handler (e.g. a `SIGSEGV`
+handler). Does not include SbLogRawDumpStack itself.
+
+`frames_to_skip`: The number of frames to skip from the top of the stack when
+dumping the current thread to the log. This parameter lets you remove noise from
+helper functions that might end up on top of every stack dump so that the stack
+dump is just the relevant function stack where the problem occurred.
+
+#### Declaration ####
+
+```
+void SbLogRawDumpStack(int frames_to_skip)
+```
+
+### SbLogRawFormat ###
+
+A formatted log output method that is async-signal-safe, i.e. safe to call from
+an asynchronous signal handler (e.g. a `SIGSEGV` handler).
+
+#### Declaration ####
+
+```
+void SbLogRawFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
+```
+
+### SbLogRawFormatF ###
+
+Inline wrapper of SbLogFormat to convert from ellipsis to va_args.
+
+#### Declaration ####
+
+```
+void static void void SbLogRawFormatF(const char *format,...) SB_PRINTF_FORMAT(1
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/media.md b/src/cobalt/site/docs/reference/starboard/modules/11/media.md
new file mode 100644
index 0000000..8d94612
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/media.md
@@ -0,0 +1,720 @@
+---
+layout: doc
+title: "Starboard Module Reference: media.h"
+---
+
+Provides media definitions that are common between the Decoder and Player
+interfaces.
+
+## Macros ##
+
+### kSbMediaBitsPerPixelInvalid ###
+
+Value used when a video's bits per pixel is not known.
+
+### kSbMediaVideoResolutionDimensionInvalid ###
+
+Value used when a video's resolution is not known.
+
+## Enums ##
+
+### SbMediaAudioCodec ###
+
+Types of audio elementary streams that can be supported.
+
+#### Values ####
+
+*   `kSbMediaAudioCodecNone`
+*   `kSbMediaAudioCodecAac`
+*   `kSbMediaAudioCodecAc3`
+*   `kSbMediaAudioCodecEac3`
+*   `kSbMediaAudioCodecOpus`
+*   `kSbMediaAudioCodecVorbis`
+
+### SbMediaAudioCodingType ###
+
+Possible audio coding types.
+
+#### Values ####
+
+*   `kSbMediaAudioCodingTypeNone`
+*   `kSbMediaAudioCodingTypeAac`
+*   `kSbMediaAudioCodingTypeAc3`
+*   `kSbMediaAudioCodingTypeAtrac`
+*   `kSbMediaAudioCodingTypeBitstream`
+*   `kSbMediaAudioCodingTypeDolbyDigitalPlus`
+*   `kSbMediaAudioCodingTypeDts`
+*   `kSbMediaAudioCodingTypeMpeg1`
+*   `kSbMediaAudioCodingTypeMpeg2`
+*   `kSbMediaAudioCodingTypeMpeg3`
+*   `kSbMediaAudioCodingTypePcm`
+
+### SbMediaAudioConnector ###
+
+Possible audio connector types.
+
+#### Values ####
+
+*   `kSbMediaAudioConnectorNone`
+*   `kSbMediaAudioConnectorAnalog`
+*   `kSbMediaAudioConnectorBluetooth`
+*   `kSbMediaAudioConnectorHdmi`
+*   `kSbMediaAudioConnectorNetwork`
+*   `kSbMediaAudioConnectorSpdif`
+*   `kSbMediaAudioConnectorUsb`
+
+### SbMediaAudioFrameStorageType ###
+
+Possible audio frame storage types.
+
+#### Values ####
+
+*   `kSbMediaAudioFrameStorageTypeInterleaved`
+
+    The samples of a multi-channel audio stream are stored in one continuous
+    buffer. Samples at the same timestamp are stored one after another. For
+    example, for a stereo stream with channels L and R that contains samples
+    with timestamps 0, 1, 2, etc., the samples are stored in one buffer as "L0
+    R0 L1 R1 L2 R2 ...".
+*   `kSbMediaAudioFrameStorageTypePlanar`
+
+    The samples of each channel are stored in their own continuous buffer. For
+    example, for a stereo stream with channels L and R that contains samples
+    with timestamps 0, 1, 2, etc., the samples are stored in two buffers "L0 L1
+    L2 ..." and "R0 R1 R2 ...".
+
+### SbMediaAudioSampleType ###
+
+Possible audio sample types.
+
+#### Values ####
+
+*   `kSbMediaAudioSampleTypeInt16Deprecated`
+*   `kSbMediaAudioSampleTypeFloat32`
+
+### SbMediaRangeId ###
+
+This corresponds to the WebM Range enum which is part of WebM color data (see [http://www.webmproject.org/docs/container/#Range](http://www.webmproject.org/docs/container/#Range)
+). H.264 only uses a bool, which corresponds to the LIMITED/FULL values. Chrome-
+specific values start at 1000.
+
+#### Values ####
+
+*   `kSbMediaRangeIdUnspecified`
+
+    Range is not explicitly specified / unknown.
+*   `kSbMediaRangeIdLimited`
+
+    Limited Rec. 709 color range with RGB values ranging from 16 to 235.
+*   `kSbMediaRangeIdFull`
+
+    Full RGB color range with RGB valees from 0 to 255.
+*   `kSbMediaRangeIdDerived`
+
+    Range is defined by TransferId/MatrixId.
+*   `kSbMediaRangeIdLast`
+
+### SbMediaSupportType ###
+
+Indicates how confident the device is that it can play media resources of the
+given type. The values are a direct map of the canPlayType() method specified at
+the following link: [https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype](https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype)
+
+#### Values ####
+
+*   `kSbMediaSupportTypeNotSupported`
+
+    The media type cannot be played.
+*   `kSbMediaSupportTypeMaybe`
+
+    Cannot determinate if the media type is playable without playing it.
+*   `kSbMediaSupportTypeProbably`
+
+    The media type seems to be playable.
+
+### SbMediaType ###
+
+Types of media component streams.
+
+#### Values ####
+
+*   `kSbMediaTypeAudio`
+
+    Value used for audio streams.
+*   `kSbMediaTypeVideo`
+
+    Value used for video streams.
+
+### SbMediaVideoCodec ###
+
+Types of video elementary streams that could be supported.
+
+#### Values ####
+
+*   `kSbMediaVideoCodecNone`
+*   `kSbMediaVideoCodecH264`
+*   `kSbMediaVideoCodecH265`
+*   `kSbMediaVideoCodecMpeg2`
+*   `kSbMediaVideoCodecTheora`
+*   `kSbMediaVideoCodecVc1`
+*   `kSbMediaVideoCodecAv1`
+*   `kSbMediaVideoCodecVp8`
+*   `kSbMediaVideoCodecVp9`
+
+## Structs ##
+
+### SbMediaAudioConfiguration ###
+
+A structure describing the audio configuration parameters of a single audio
+output.
+
+#### Members ####
+
+*   `int index`
+
+    The platform-defined index of the associated audio output.
+*   `SbMediaAudioConnector connector`
+
+    The type of audio connector. Will be the empty `kSbMediaAudioConnectorNone`
+    if this device cannot provide this information.
+*   `SbTime latency`
+
+    The expected latency of audio over this output, in microseconds, or `0` if
+    this device cannot provide this information.
+*   `SbMediaAudioCodingType coding_type`
+
+    The type of audio coding used over this connection.
+*   `int number_of_channels`
+
+    The number of audio channels currently supported by this device output, or
+    `0` if this device cannot provide this information, in which case the caller
+    can probably assume stereo output.
+
+### SbMediaAudioSampleInfo ###
+
+An audio sample info, which is a description of a given audio sample. This, in
+hexadecimal string form, acts as a set of instructions to the audio decoder.
+
+The audio sample info consists of a little-endian hexadecimal encoded
+`WAVEFORMATEX` structure followed by an Audio-specific configuration field. The
+`WAVEFORMATEX` structure is specified at: [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)
+
+#### Members ####
+
+*   `SbMediaAudioCodec codec`
+
+    The audio codec of this sample.
+*   `const char * mime`
+
+    The mime of the audio stream when `codec` isn't kSbMediaAudioCodecNone. It
+    may point to an empty string if the mime is not available, and it can only
+    be set to NULL when `codec` is kSbMediaAudioCodecNone.
+*   `uint16_t format_tag`
+
+    The waveform-audio format type code.
+*   `uint16_t number_of_channels`
+
+    The number of audio channels in this format. `1` for mono, `2` for stereo.
+*   `uint32_t samples_per_second`
+
+    The sampling rate.
+*   `uint32_t average_bytes_per_second`
+
+    The number of bytes per second expected with this format.
+*   `uint16_t block_alignment`
+
+    Byte block alignment, e.g, 4.
+*   `uint16_t bits_per_sample`
+
+    The bit depth for the stream this represents, e.g. `8` or `16`.
+*   `uint16_t audio_specific_config_size`
+
+    The size, in bytes, of the audio_specific_config.
+*   `const void * audio_specific_config`
+
+    The AudioSpecificConfig, as specified in ISO/IEC-14496-3, section 1.6.2.1: [http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF](http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF)
+
+### SbMediaColorMetadata ###
+
+HDR (High Dynamic Range) Metadata common for HDR10 and WebM/VP9-based HDR
+formats, together with the ColorSpace. HDR reproduces a greater dynamic range of
+luminosity than is possible with standard digital imaging. See the Consumer
+Electronics Association press release: [https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx](https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx)
+
+#### Members ####
+
+*   `unsigned int bits_per_channel`
+
+    Number of decoded bits per channel. A value of 0 indicates that the
+    BitsPerChannel is unspecified.
+*   `unsigned int chroma_subsampling_horizontal`
+
+    The amount of pixels to remove in the Cr and Cb channels for every pixel not
+    removed horizontally. Example: For video with 4:2:0 chroma subsampling, the
+    `chroma_subsampling_horizontal` should be set to 1.
+*   `unsigned int chroma_subsampling_vertical`
+
+    The amount of pixels to remove in the Cr and Cb channels for every pixel not
+    removed vertically. Example: For video with 4:2:0 chroma subsampling, the
+    `chroma_subsampling_vertical` should be set to 1.
+*   `unsigned int cb_subsampling_horizontal`
+
+    The amount of pixels to remove in the Cb channel for every pixel not removed
+    horizontally. This is additive with ChromaSubsamplingHorz. Example: For
+    video with 4:2:1 chroma subsampling, the `chroma_subsampling_horizontal`
+    should be set to 1 and `cb_subsampling_horizontal` should be set to 1.
+*   `unsigned int cb_subsampling_vertical`
+
+    The amount of pixels to remove in the Cb channel for every pixel not removed
+    vertically. This is additive with `chroma_subsampling_vertical`.
+*   `unsigned int chroma_siting_horizontal`
+
+    How chroma is subsampled horizontally. (0: Unspecified, 1: Left Collocated,
+    2: Half)
+*   `unsigned int chroma_siting_vertical`
+
+    How chroma is subsampled vertically. (0: Unspecified, 1: Top Collocated, 2:
+    Half)
+*   `SbMediaMasteringMetadata mastering_metadata`
+
+    [HDR Metadata field] SMPTE 2086 mastering data.
+*   `unsigned int max_cll`
+
+    [HDR Metadata field] Maximum brightness of a single pixel (Maximum Content
+    Light Level) in candelas per square meter (cd/m^2).
+*   `unsigned int max_fall`
+
+    [HDR Metadata field] Maximum brightness of a single full frame (Maximum
+    Frame-Average Light Level) in candelas per square meter (cd/m^2).
+*   `SbMediaPrimaryId primaries`
+
+    [Color Space field] The colour primaries of the video. For clarity, the
+    value and meanings for Primaries are adopted from Table 2 of ISO/IEC
+    23001-8:2013/DCOR1. (0: Reserved, 1: ITU-R BT.709, 2: Unspecified, 3:
+    Reserved, 4: ITU-R BT.470M, 5: ITU-R BT.470BG, 6: SMPTE 170M, 7: SMPTE 240M,
+    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors)
+*   `SbMediaTransferId transfer`
+
+    [Color Space field] The transfer characteristics of the video. For clarity,
+    the value and meanings for TransferCharacteristics 1-15 are adopted from
+    Table 3 of ISO/IEC 23001-8:2013/DCOR1. TransferCharacteristics 16-18 are
+    proposed values. (0: Reserved, 1: ITU-R BT.709, 2: Unspecified, 3: Reserved,
+    4: Gamma 2.2 curve, 5: Gamma 2.8 curve, 6: SMPTE 170M, 7: SMPTE 240M, 8:
+    Linear, 9: Log, 10: Log Sqrt, 11: IEC 61966-2-4, 12: ITU-R BT.1361 Extended
+    Colour Gamut, 13: IEC 61966-2-1, 14: ITU-R BT.2020 10 bit, 15: ITU-R BT.2020
+    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG))
+*   `SbMediaMatrixId matrix`
+
+    [Color Space field] The Matrix Coefficients of the video used to derive luma
+    and chroma values from red, green, and blue color primaries. For clarity,
+    the value and meanings for MatrixCoefficients are adopted from Table 4 of
+    ISO/IEC 23001-8:2013/DCOR1. (0:GBR, 1: BT709, 2: Unspecified, 3: Reserved,
+    4: FCC, 5: BT470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: YCOCG, 9: BT2020 Non-
+    constant Luminance, 10: BT2020 Constant Luminance)
+*   `SbMediaRangeId range`
+
+    [Color Space field] Clipping of the color ranges. (0: Unspecified, 1:
+    Broadcast Range, 2: Full range (no clipping), 3: Defined by
+    MatrixCoefficients/TransferCharacteristics)
+*   `float custom_primary_matrix`
+
+    [Color Space field] Only used if primaries == kSbMediaPrimaryIdCustom. This
+    a row-major ordered 3 x 4 submatrix of the 4 x 4 transform matrix. The 4th
+    row is completed as (0, 0, 0, 1).
+
+### SbMediaMasteringMetadata ###
+
+SMPTE 2086 mastering data [http://ieeexplore.ieee.org/document/7291707/](http://ieeexplore.ieee.org/document/7291707/)
+This standard specifies the metadata items to specify the color volume (the
+color primaries, white point, and luminance range) of the display that was used
+in mastering video content. The metadata is specified as a set of values
+independent of any specific digital representation. Also see the WebM container
+guidelines: [https://www.webmproject.org/docs/container/](https://www.webmproject.org/docs/container/)
+
+#### Members ####
+
+*   `float primary_r_chromaticity_x`
+
+    Red X chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float primary_r_chromaticity_y`
+
+    Red Y chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float primary_g_chromaticity_x`
+
+    Green X chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float primary_g_chromaticity_y`
+
+    Green Y chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float primary_b_chromaticity_x`
+
+    Blue X chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float primary_b_chromaticity_y`
+
+    Blue Y chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float white_point_chromaticity_x`
+
+    White X chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float white_point_chromaticity_y`
+
+    White Y chromaticity coordinate as defined by CIE 1931. In range [0, 1].
+*   `float luminance_max`
+
+    Maximum luminance. Shall be represented in candelas per square meter
+    (cd/m^2). In range [0, 9999.99].
+*   `float luminance_min`
+
+    Minimum luminance. Shall be represented in candelas per square meter
+    (cd/m^2). In range [0, 9999.99].
+
+### SbMediaVideoSampleInfo ###
+
+The set of information required by the decoder or player for each video sample.
+
+#### Members ####
+
+*   `SbMediaVideoCodec codec`
+
+    The video codec of this sample.
+*   `const char * mime`
+
+    The mime of the video stream when `codec` isn't kSbMediaVideoCodecNone. It
+    may point to an empty string if the mime is not available, and it can only
+    be set to NULL when `codec` is kSbMediaVideoCodecNone.
+*   `const char * max_video_capabilities`
+
+    Indicates the max video capabilities required. The web app will not provide
+    a video stream exceeding the maximums described by this parameter. Allows
+    the platform to optimize playback pipeline for low quality video streams if
+    it knows that it will never adapt to higher quality streams. The string uses
+    the same format as the string passed in to SbMediaCanPlayMimeAndKeySystem(),
+    for example, when it is set to "width=1920; height=1080; framerate=15;", the
+    video will never adapt to resolution higher than 1920x1080 or frame per
+    second higher than 15 fps. When the maximums are unknown, this will be set
+    to an empty string. It can only be set to NULL when `codec` is
+    kSbMediaVideoCodecNone.
+*   `bool is_key_frame`
+
+    Indicates whether the associated sample is a key frame (I-frame). Video key
+    frames must always start with SPS and PPS NAL units.
+*   `int frame_width`
+
+    The frame width of this sample, in pixels. Also could be parsed from the
+    Sequence Parameter Set (SPS) NAL Unit. Frame dimensions must only change on
+    key frames, but may change on any key frame.
+*   `int frame_height`
+
+    The frame height of this sample, in pixels. Also could be parsed from the
+    Sequence Parameter Set (SPS) NAL Unit. Frame dimensions must only change on
+    key frames, but may change on any key frame.
+*   `SbMediaColorMetadata color_metadata`
+
+    HDR metadata common for HDR10 and WebM/VP9-based HDR formats as well as the
+    Color Space, and Color elements: MatrixCoefficients, BitsPerChannel,
+    ChromaSubsamplingHorz, ChromaSubsamplingVert, CbSubsamplingHorz,
+    CbSubsamplingVert, ChromaSitingHorz, ChromaSitingVert, Range,
+    TransferCharacteristics, and Primaries described here: [https://matroska.org/technical/specs/index.html](https://matroska.org/technical/specs/index.html)
+    . This will only be specified on frames where the HDR metadata and color /
+    color space might have changed (e.g. keyframes).
+
+## Functions ##
+
+### SbMediaCanPlayMimeAndKeySystem ###
+
+Returns information about whether the playback of the specific media described
+by `mime` and encrypted using `key_system` can be played.
+
+Note that neither `mime` nor `key_system` can be NULL. This function returns
+`kSbMediaSupportNotSupported` if either is NULL.
+
+`mime`: The mime information of the media in the form of `video/webm` or
+`video/mp4; codecs="avc1.42001E"`. It may include arbitrary parameters like
+"codecs", "channels", etc. Note that the "codecs" parameter may contain more
+than one codec, delimited by comma. `key_system`: A lowercase value in fhe form
+of "com.example.somesystem" as suggested by [https://w3c.github.io/encrypted-media/#key-system](https://w3c.github.io/encrypted-media/#key-system)) that can
+be matched exactly with known DRM key systems of the platform. When `key_system`
+is an empty string, the return value is an indication for non-encrypted media.
+
+#### Declaration ####
+
+```
+SbMediaSupportType SbMediaCanPlayMimeAndKeySystem(const char *mime, const char *key_system)
+```
+
+### SbMediaGetAudioBufferBudget ###
+
+Specifies the maximum amount of memory used by audio buffers of media source
+before triggering a garbage collection. A large value will cause more memory
+being used by audio buffers but will also make the app less likely to re-
+download audio data. Note that the app may experience significant difficulty if
+this value is too low.
+
+#### Declaration ####
+
+```
+int SbMediaGetAudioBufferBudget()
+```
+
+### SbMediaGetAudioConfiguration ###
+
+Retrieves the current physical audio configuration of audio output
+`output_index` on this device and places it in `out_configuration`, which must
+not be NULL.
+
+This function returns `false` if nothing could be determined on this platform or
+if `output_index` does not exist on this device.
+
+`out_configuration`: The variable that holds the audio configuration
+information.
+
+#### Declaration ####
+
+```
+bool SbMediaGetAudioConfiguration(int output_index, SbMediaAudioConfiguration *out_configuration)
+```
+
+### SbMediaGetAudioOutputCount ###
+
+Returns the number of audio outputs currently available on this device. Even if
+the number of outputs or their audio configurations can't be determined, it is
+expected that the platform will at least return a single output that supports at
+least stereo.
+
+#### Declaration ####
+
+```
+int SbMediaGetAudioOutputCount()
+```
+
+### SbMediaGetBufferAlignment ###
+
+The media buffer will be allocated using the returned alignment. Set this to a
+larger value may increase the memory consumption of media buffers.
+
+`type`: the media type of the stream (audio or video).
+
+#### Declaration ####
+
+```
+int SbMediaGetBufferAlignment(SbMediaType type)
+```
+
+### SbMediaGetBufferAllocationUnit ###
+
+When the media stack needs more memory to store media buffers, it will allocate
+extra memory in units returned by SbMediaGetBufferAllocationUnit. This can
+return 0, in which case the media stack will allocate extra memory on demand.
+When SbMediaGetInitialBufferCapacity and this function both return 0, the media
+stack will allocate individual buffers directly using SbMemory functions.
+
+#### Declaration ####
+
+```
+int SbMediaGetBufferAllocationUnit()
+```
+
+### SbMediaGetBufferGarbageCollectionDurationThreshold ###
+
+Specifies the duration threshold of media source garbage collection. When the
+accumulated duration in a source buffer exceeds this value, the media source
+implementation will try to eject existing buffers from the cache. This is
+usually triggered when the video being played has a simple content and the
+encoded data is small. In such case this can limit how much is allocated for the
+book keeping data of the media buffers and avoid OOM of system heap. This should
+return 170 seconds for most of the platforms. But it can be further reduced on
+systems with extremely low memory.
+
+#### Declaration ####
+
+```
+SbTime SbMediaGetBufferGarbageCollectionDurationThreshold()
+```
+
+### SbMediaGetBufferPadding ###
+
+Extra bytes allocated at the end of a media buffer to ensure that the buffer can
+be use optimally by specific instructions like SIMD. Set to 0 to remove any
+padding.
+
+`type`: the media type of the stream (audio or video).
+
+#### Declaration ####
+
+```
+int SbMediaGetBufferPadding(SbMediaType type)
+```
+
+### SbMediaGetBufferStorageType ###
+
+Returns SbMediaBufferStorageType of type `SbMediaStorageTypeMemory` or
+`SbMediaStorageTypeFile`. For memory storage, the media buffers will be stored
+in main memory allocated by SbMemory functions. For file storage, the media
+buffers will be stored in a temporary file in the system cache folder acquired
+by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory". Note that when
+its value is "file" the media stack will still allocate memory to cache the the
+buffers in use.
+
+#### Declaration ####
+
+```
+SbMediaBufferStorageType SbMediaGetBufferStorageType()
+```
+
+### SbMediaGetInitialBufferCapacity ###
+
+The amount of memory that will be used to store media buffers allocated during
+system startup. To allocate a large chunk at startup helps with reducing
+fragmentation and can avoid failures to allocate incrementally. This can return
+0.
+
+#### Declaration ####
+
+```
+int SbMediaGetInitialBufferCapacity()
+```
+
+### SbMediaGetMaxBufferCapacity ###
+
+The maximum amount of memory that will be used to store media buffers. This must
+be larger than sum of the video budget and audio budget.
+
+`codec`: the video codec associated with the buffer. `resolution_width`: the
+width of the video resolution. `resolution_height`: the height of the video
+resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
+than non- HDR video.
+
+#### Declaration ####
+
+```
+int SbMediaGetMaxBufferCapacity(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
+```
+
+### SbMediaGetProgressiveBufferBudget ###
+
+The memory used when playing mp4 videos that is not in DASH format. The
+resolution of such videos shouldn't go beyond 1080p. Its value should be less
+than the sum of SbMediaGetAudioBufferBudget and
+'SbMediaGetVideoBufferBudget(..., 1920, 1080, ...) but not less than 8 MB.
+
+`codec`: the video codec associated with the buffer. `resolution_width`: the
+width of the video resolution. `resolution_height`: the height of the video
+resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
+than non- HDR video.
+
+#### Declaration ####
+
+```
+int SbMediaGetProgressiveBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
+```
+
+### SbMediaGetVideoBufferBudget ###
+
+Specifies the maximum amount of memory used by video buffers of media source
+before triggering a garbage collection. A large value will cause more memory
+being used by video buffers but will also make app less likely to re-download
+video data. Note that the app may experience significant difficulty if this
+value is too low.
+
+`codec`: the video codec associated with the buffer. `resolution_width`: the
+width of the video resolution. `resolution_height`: the height of the video
+resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
+than non- HDR video.
+
+#### Declaration ####
+
+```
+int SbMediaGetVideoBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
+```
+
+### SbMediaIsBufferPoolAllocateOnDemand ###
+
+When either SbMediaGetInitialBufferCapacity or SbMediaGetBufferAllocationUnit
+isn't zero, media buffers will be allocated using a memory pool. Set the
+following variable to true to allocate the media buffer pool memory on demand
+and return all memory to the system when there is no media buffer allocated.
+Setting the following value to false results in that Cobalt will allocate
+SbMediaGetInitialBufferCapacity bytes for media buffer on startup and will not
+release any media buffer memory back to the system even if there is no media
+buffers allocated.
+
+#### Declaration ####
+
+```
+bool SbMediaIsBufferPoolAllocateOnDemand()
+```
+
+### SbMediaIsBufferUsingMemoryPool ###
+
+If SbMediaGetBufferUsingMemoryPool returns true, it indicates that media buffer
+pools should be allocated on demand, as opposed to using SbMemory* functions.
+
+#### Declaration ####
+
+```
+bool SbMediaIsBufferUsingMemoryPool()
+```
+
+### SbMediaIsOutputProtected ###
+
+Indicates whether output copy protection is currently enabled on all capable
+outputs. If `true`, then non-protection-capable outputs are expected to be
+blanked.
+
+#### Declaration ####
+
+```
+bool SbMediaIsOutputProtected()
+```
+
+### SbMediaIsSupported ###
+
+Indicates whether this platform supports decoding `video_codec` and
+`audio_codec` along with decrypting using `key_system`. If `video_codec` is
+`kSbMediaVideoCodecNone` or if `audio_codec` is `kSbMediaAudioCodecNone`, this
+function should return `true` as long as `key_system` is supported on the
+platform to decode any supported input formats.
+
+`video_codec`: The `SbMediaVideoCodec` being checked for platform compatibility.
+`audio_codec`: The `SbMediaAudioCodec` being checked for platform compatibility.
+`key_system`: The key system being checked for platform compatibility.
+
+#### Declaration ####
+
+```
+bool SbMediaIsSupported(SbMediaVideoCodec video_codec, SbMediaAudioCodec audio_codec, const char *key_system)
+```
+
+### SbMediaSetAudioWriteDuration ###
+
+Communicate to the platform how far past `current_playback_position` the app
+will write audio samples. The app will write all samples between
+`current_playback_position` and `current_playback_position` + `duration`, as
+soon as they are available. The app may sometimes write more samples than that,
+but the app only guarantees to write `duration` past `current_playback_position`
+in general. The platform is responsible for guaranteeing that when only
+`duration` audio samples are written at a time, no playback issues occur (such
+as transient or indefinite hanging). The platform may assume `duration` >= 0.5
+seconds.
+
+#### Declaration ####
+
+```
+void SbMediaSetAudioWriteDuration(SbTime duration)
+```
+
+### SbMediaSetOutputProtection ###
+
+Enables or disables output copy protection on all capable outputs. If enabled,
+then non-protection-capable outputs are expected to be blanked.
+
+The return value indicates whether the operation was successful, and the
+function returns a success even if the call is redundant in that it doesn't
+change the current value.
+
+`enabled`: Indicates whether output protection is enabled (`true`) or disabled.
+
+#### Declaration ####
+
+```
+bool SbMediaSetOutputProtection(bool enabled)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/memory.md b/src/cobalt/site/docs/reference/starboard/modules/11/memory.md
new file mode 100644
index 0000000..a3fecb6
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/memory.md
@@ -0,0 +1,464 @@
+---
+layout: doc
+title: "Starboard Module Reference: memory.h"
+---
+
+Defines functions for memory allocation, alignment, copying, and comparing.
+Porters
+
+All of the "Unchecked" and "Free" functions must be implemented, but they should
+not be called directly. The Starboard platform wraps them with extra accounting
+under certain circumstances.
+Porters and Application Developers
+
+Nobody should call the "Checked", "Unchecked" or "Free" functions directly
+because that evades Starboard's memory tracking. In both port implementations
+and Starboard client application code, you should always call SbMemoryAllocate
+and SbMemoryDeallocate rather than SbMemoryAllocateUnchecked and SbMemoryFree.
+
+*   The "checked" functions are SbMemoryAllocateChecked(),
+    SbMemoryReallocateChecked(), and SbMemoryAllocateAlignedChecked().
+
+*   The "unchecked" functions are SbMemoryAllocateUnchecked(),
+    SbMemoryReallocateUnchecked(), and SbMemoryAllocateAlignedUnchecked().
+
+*   The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().
+
+## Enums ##
+
+### SbMemoryMapFlags ###
+
+The bitwise OR of these flags should be passed to SbMemoryMap to indicate how
+the mapped memory can be used.
+
+#### Values ####
+
+*   `kSbMemoryMapProtectReserved`
+
+    No flags set: Reserves virtual address space. SbMemoryProtect() can later
+    make it accessible.
+*   `kSbMemoryMapProtectRead`
+*   `kSbMemoryMapProtectWrite`
+*   `kSbMemoryMapProtectExec`
+*   `kSbMemoryMapProtectReadWrite`
+
+## Functions ##
+
+### SbMemoryAlignToPageSize ###
+
+Rounds `size` up to kSbMemoryPageSize.
+
+#### Declaration ####
+
+```
+static size_t SbMemoryAlignToPageSize(size_t size)
+```
+
+### SbMemoryAllocate ###
+
+Allocates and returns a chunk of memory of at least `size` bytes. This function
+should be called from the client codebase. It is intended to be a drop-in
+replacement for `malloc`.
+
+Note that this function returns `NULL` if it is unable to allocate the memory.
+
+`size`: The amount of memory to be allocated. If `size` is 0, the function may
+return `NULL` or it may return a unique pointer value that can be passed to
+SbMemoryDeallocate.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocate(size_t size)
+```
+
+### SbMemoryAllocateAligned ###
+
+Allocates and returns a chunk of memory of at least `size` bytes, aligned to
+`alignment`. This function should be called from the client codebase. It is
+meant to be a drop-in replacement for `memalign`.
+
+The function returns `NULL` if it cannot allocate the memory. In addition, the
+function's behavior is undefined if `alignment` is not a power of two.
+
+`alignment`: The way that data is arranged and accessed in memory. The value
+must be a power of two. `size`: The size of the memory to be allocated. If
+`size` is `0`, the function may return `NULL` or it may return a unique aligned
+pointer value that can be passed to SbMemoryDeallocateAligned.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocateAligned(size_t alignment, size_t size)
+```
+
+### SbMemoryAllocateAlignedChecked ###
+
+Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
+allocation failure.
+
+DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)
+```
+
+### SbMemoryAllocateAlignedUnchecked ###
+
+This is the implementation of SbMemoryAllocateAligned that must be provided by
+Starboard ports.
+
+DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)
+```
+
+### SbMemoryAllocateChecked ###
+
+Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation
+failure.
+
+DO NOT CALL. Call SbMemoryAllocate(...) instead.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocateChecked(size_t size)
+```
+
+### SbMemoryAllocateNoReport ###
+
+Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid
+using this unless absolutely necessary.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocateNoReport(size_t size)
+```
+
+### SbMemoryAllocateUnchecked ###
+
+This is the implementation of SbMemoryAllocate that must be provided by
+Starboard ports.
+
+DO NOT CALL. Call SbMemoryAllocate(...) instead.
+
+#### Declaration ####
+
+```
+void* SbMemoryAllocateUnchecked(size_t size)
+```
+
+### SbMemoryCalloc ###
+
+A wrapper that implements a drop-in replacement for `calloc`, which is used in
+some packages.
+
+#### Declaration ####
+
+```
+static void* SbMemoryCalloc(size_t count, size_t size)
+```
+
+### SbMemoryCompare ###
+
+Compares the contents of the first `count` bytes of `buffer1` and `buffer2`.
+This function returns:
+
+*   `-1` if `buffer1` is "less-than" `buffer2`
+
+*   `0` if `buffer1` and `buffer2` are equal
+
+*   `1` if `buffer1` is "greater-than" `buffer2`.
+
+This function is meant to be a drop-in replacement for `memcmp`.
+
+`buffer1`: The first buffer to be compared. `buffer2`: The second buffer to be
+compared. `count`: The number of bytes to be compared.
+
+#### Declaration ####
+
+```
+int SbMemoryCompare(const void *buffer1, const void *buffer2, size_t count)
+```
+
+### SbMemoryCopy ###
+
+Copies `count` sequential bytes from `source` to `destination`, without support
+for the `source` and `destination` regions overlapping. This function is meant
+to be a drop-in replacement for `memcpy`.
+
+The function's behavior is undefined if `destination` or `source` are NULL, and
+the function is a no-op if `count` is 0. The return value is `destination`.
+
+`destination`: The destination of the copied memory. `source`: The source of the
+copied memory. `count`: The number of sequential bytes to be copied.
+
+#### Declaration ####
+
+```
+void* SbMemoryCopy(void *destination, const void *source, size_t count)
+```
+
+### SbMemoryDeallocate ###
+
+Frees a previously allocated chunk of memory. If `memory` is NULL, then the
+operation is a no-op. This function should be called from the client codebase.
+It is meant to be a drop-in replacement for `free`.
+
+`memory`: The chunk of memory to be freed.
+
+#### Declaration ####
+
+```
+void SbMemoryDeallocate(void *memory)
+```
+
+### SbMemoryDeallocateAligned ###
+
+`memory`: The chunk of memory to be freed. If `memory` is NULL, then the
+function is a no-op.
+
+#### Declaration ####
+
+```
+void SbMemoryDeallocateAligned(void *memory)
+```
+
+### SbMemoryDeallocateNoReport ###
+
+Same as SbMemoryDeallocate() but will not report memory deallocation to the
+tracker. This function must be matched with SbMemoryAllocateNoReport().
+
+#### Declaration ####
+
+```
+void SbMemoryDeallocateNoReport(void *memory)
+```
+
+### SbMemoryFindByte ###
+
+Finds the lower 8-bits of `value` in the first `count` bytes of `buffer` and
+returns either a pointer to the first found occurrence or `NULL` if the value is
+not found. This function is meant to be a drop-in replacement for `memchr`.
+
+#### Declaration ####
+
+```
+const void* SbMemoryFindByte(const void *buffer, int value, size_t count)
+```
+
+### SbMemoryFlush ###
+
+Flushes any data in the given virtual address range that is cached locally in
+the current processor core to physical memory, ensuring that data and
+instruction caches are cleared. This is required to be called on executable
+memory that has been written to and might be executed in the future.
+
+#### Declaration ####
+
+```
+void SbMemoryFlush(void *virtual_address, int64_t size_bytes)
+```
+
+### SbMemoryFree ###
+
+This is the implementation of SbMemoryDeallocate that must be provided by
+Starboard ports.
+
+DO NOT CALL. Call SbMemoryDeallocate(...) instead.
+
+#### Declaration ####
+
+```
+void SbMemoryFree(void *memory)
+```
+
+### SbMemoryFreeAligned ###
+
+This is the implementation of SbMemoryFreeAligned that must be provided by
+Starboard ports.
+
+DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.
+
+#### Declaration ####
+
+```
+void SbMemoryFreeAligned(void *memory)
+```
+
+### SbMemoryGetStackBounds ###
+
+Gets the stack bounds for the current thread.
+
+`out_high`: The highest addressable byte + 1 for the current thread. `out_low`:
+The lowest addressable byte for the current thread.
+
+#### Declaration ####
+
+```
+void SbMemoryGetStackBounds(void **out_high, void **out_low)
+```
+
+### SbMemoryIsAligned ###
+
+Checks whether `memory` is aligned to `alignment` bytes.
+
+#### Declaration ####
+
+```
+static bool SbMemoryIsAligned(const void *memory, size_t alignment)
+```
+
+### SbMemoryIsZero ###
+
+Returns true if the first `count` bytes of `buffer` are set to zero.
+
+#### Declaration ####
+
+```
+static bool SbMemoryIsZero(const void *buffer, size_t count)
+```
+
+### SbMemoryMap ###
+
+Allocates `size_bytes` worth of physical memory pages and maps them into an
+available virtual region. This function returns `SB_MEMORY_MAP_FAILED` on
+failure. `NULL` is a valid return value.
+
+`size_bytes`: The amount of physical memory pages to be allocated. `flags`: The
+bitwise OR of the protection flags for the mapped memory as specified in
+`SbMemoryMapFlags`. Allocating executable memory is not allowed and will fail.
+If executable memory is needed, map non-executable memory first and then switch
+access to executable using SbMemoryProtect. When kSbMemoryMapProtectReserved is
+used, the address space will not be accessible and, if possible, the platform
+should not count it against any memory budget. `name`: A value that appears in
+the debugger on some platforms. The value can be up to 32 bytes.
+
+#### Declaration ####
+
+```
+void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
+```
+
+### SbMemoryMove ###
+
+Copies `count` sequential bytes from `source` to `destination`, with support for
+the `source` and `destination` regions overlapping. This function is meant to be
+a drop-in replacement for `memmove`.
+
+The function's behavior is undefined if `destination` or `source` are NULL, and
+the function is a no-op if `count` is 0. The return value is `destination`.
+
+`destination`: The destination of the copied memory. `source`: The source of the
+copied memory. `count`: The number of sequential bytes to be copied.
+
+#### Declaration ####
+
+```
+void* SbMemoryMove(void *destination, const void *source, size_t count)
+```
+
+### SbMemoryProtect ###
+
+Change the protection of `size_bytes` of memory regions, starting from
+`virtual_address`, to `flags`, returning `true` on success.
+
+#### Declaration ####
+
+```
+bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)
+```
+
+### SbMemoryReallocate ###
+
+Attempts to resize `memory` to be at least `size` bytes, without touching the
+contents of memory.
+
+*   If the function cannot perform the fast resize, it allocates a new chunk of
+    memory, copies the contents over, and frees the previous chunk, returning a
+    pointer to the new chunk.
+
+*   If the function cannot perform the slow resize, it returns `NULL`, leaving
+    the given memory chunk unchanged.
+
+This function should be called from the client codebase. It is meant to be a
+drop-in replacement for `realloc`.
+
+`memory`: The chunk of memory to be resized. `memory` may be NULL, in which case
+it behaves exactly like SbMemoryAllocateUnchecked. `size`: The size to which
+`memory` will be resized. If `size` is `0`, the function may return `NULL` or it
+may return a unique pointer value that can be passed to SbMemoryDeallocate.
+
+#### Declaration ####
+
+```
+void* SbMemoryReallocate(void *memory, size_t size)
+```
+
+### SbMemoryReallocateChecked ###
+
+Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
+allocation failure.
+
+DO NOT CALL. Call SbMemoryReallocate(...) instead.
+
+#### Declaration ####
+
+```
+void* SbMemoryReallocateChecked(void *memory, size_t size)
+```
+
+### SbMemoryReallocateUnchecked ###
+
+This is the implementation of SbMemoryReallocate that must be provided by
+Starboard ports.
+
+DO NOT CALL. Call SbMemoryReallocate(...) instead.
+
+#### Declaration ####
+
+```
+void* SbMemoryReallocateUnchecked(void *memory, size_t size)
+```
+
+### SbMemorySet ###
+
+Fills `count` sequential bytes starting at `destination`, with the unsigned char
+coercion of `byte_value`. This function is meant to be a drop-in replacement for
+`memset`.
+
+The function's behavior is undefined if `destination` is NULL, and the function
+is a no-op if `count` is 0. The return value is `destination`.
+
+`destination`: The destination of the copied memory. `count`: The number of
+sequential bytes to be set.
+
+#### Declaration ####
+
+```
+void* SbMemorySet(void *destination, int byte_value, size_t count)
+```
+
+### SbMemoryUnmap ###
+
+Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
+`true` on success. After this function completes, [virtual_address,
+virtual_address + size_bytes) will not be read/writable. This function can unmap
+multiple contiguous regions that were mapped with separate calls to
+SbMemoryMap(). For example, if one call to `SbMemoryMap(0x1000)` returns
+`(void*)0xA000`, and another call to `SbMemoryMap(0x1000)` returns
+`(void*)0xB000`, `SbMemoryUnmap(0xA000, 0x2000)` should free both regions.
+
+#### Declaration ####
+
+```
+bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/memory_reporter.md b/src/cobalt/site/docs/reference/starboard/modules/11/memory_reporter.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/memory_reporter.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/memory_reporter.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/microphone.md b/src/cobalt/site/docs/reference/starboard/modules/11/microphone.md
new file mode 100644
index 0000000..1379f86
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/microphone.md
@@ -0,0 +1,263 @@
+---
+layout: doc
+title: "Starboard Module Reference: microphone.h"
+---
+
+Defines functions for microphone creation, control, audio data fetching, and
+destruction. This module supports multiple calls to `SbMicrophoneOpen` and
+`SbMicrophoneClose`, and the implementation should handle multiple calls to one
+of those functions on the same microphone. For example, your implementation
+should handle cases where `SbMicrophoneOpen` is called twice on the same
+microphone without a call to `SbMicrophoneClose` in between.
+
+This API is not thread-safe and must be called from a single thread.
+
+How to use this API:
+
+1.  Call `SbMicrophoneGetAvailableInfos` to get a list of available microphone
+    information.
+
+1.  Create a supported microphone, using `SbMicrophoneCreate`, with enough
+    buffer size and sample rate. Use `SbMicrophoneIsSampleRateSupported` to
+    verify the sample rate.
+
+1.  Use `SbMicrophoneOpen` to open the microphone port and start recording audio
+    data.
+
+1.  Periodically read out the data from microphone with `SbMicrophoneRead`.
+
+1.  Call `SbMicrophoneClose` to close the microphone port and stop recording
+    audio data.
+
+1.  Destroy the microphone with `SbMicrophoneDestroy`.
+
+## Macros ##
+
+### kSbMicrophoneIdInvalid ###
+
+Well-defined value for an invalid microphone ID handle.
+
+### kSbMicrophoneInvalid ###
+
+Well-defined value for an invalid microphone handle.
+
+## Enums ##
+
+### SbMicrophoneType ###
+
+All possible microphone types.
+
+#### Values ####
+
+*   `kSbMicrophoneCamera`
+
+    Built-in microphone in camera.
+*   `kSbMicrophoneUSBHeadset`
+
+    Microphone in the headset that can be a wired or wireless USB headset.
+*   `kSbMicrophoneVRHeadset`
+
+    Microphone in the VR headset.
+*   `kSBMicrophoneAnalogHeadset`
+
+    Microphone in the analog headset.
+*   `kSbMicrophoneUnknown`
+
+    Unknown microphone type. The microphone could be different than the other
+    enum descriptions or could fall under one of those descriptions.
+
+## Typedefs ##
+
+### SbMicrophone ###
+
+An opaque handle to an implementation-private structure that represents a
+microphone.
+
+#### Definition ####
+
+```
+typedef struct SbMicrophonePrivate* SbMicrophone
+```
+
+### SbMicrophoneId ###
+
+An opaque handle to an implementation-private structure that represents a
+microphone ID.
+
+#### Definition ####
+
+```
+typedef struct SbMicrophoneIdPrivate* SbMicrophoneId
+```
+
+## Structs ##
+
+### SbMicrophoneInfo ###
+
+Microphone information.
+
+#### Members ####
+
+*   `SbMicrophoneId id`
+
+    Microphone id.
+*   `SbMicrophoneType type`
+
+    Microphone type.
+*   `int max_sample_rate_hz`
+
+    The microphone's maximum supported sampling rate.
+*   `int min_read_size`
+
+    The minimum read size required for each read from microphone.
+*   `char label`
+
+    Name of the microphone. Can be empty. This should indicate the friendly name
+    of the microphone type. For example, "Headset Microphone". The string must
+    be null terminated.
+
+## Functions ##
+
+### SbMicrophoneClose ###
+
+Closes the microphone port, stops recording audio on `microphone`, and clears
+the unread buffer if it is not empty. If the microphone has already been
+stopped, this call is ignored. The return value indicates whether the microphone
+is closed.
+
+`microphone`: The microphone to close.
+
+#### Declaration ####
+
+```
+bool SbMicrophoneClose(SbMicrophone microphone)
+```
+
+### SbMicrophoneCreate ###
+
+Creates a microphone with the specified ID, audio sample rate, and cached audio
+buffer size. Starboard only requires support for creating one microphone at a
+time, and implementations may return an error if a second microphone is created
+before the first is destroyed.
+
+The function returns the newly created SbMicrophone object. However, if you try
+to create a microphone that has already been initialized, if the sample rate is
+unavailable, or if the buffer size is invalid, the function should return
+`kSbMicrophoneInvalid`.
+
+`id`: The ID that will be assigned to the newly created SbMicrophone.
+`sample_rate_in_hz`: The new microphone's audio sample rate in Hz.
+`buffer_size_bytes`: The size of the buffer where signed 16-bit integer audio
+data is temporarily cached to during the capturing. The audio data is removed
+from the audio buffer if it has been read, and new audio data can be read from
+this buffer in smaller chunks than this size. This parameter must be set to a
+value greater than zero and the ideal size is `2^n`.
+
+#### Declaration ####
+
+```
+SbMicrophone SbMicrophoneCreate(SbMicrophoneId id, int sample_rate_in_hz, int buffer_size_bytes)
+```
+
+### SbMicrophoneDestroy ###
+
+Destroys a microphone. If the microphone is in started state, it is first
+stopped and then destroyed. Any data that has been recorded and not read is
+thrown away.
+
+#### Declaration ####
+
+```
+void SbMicrophoneDestroy(SbMicrophone microphone)
+```
+
+### SbMicrophoneGetAvailable ###
+
+Retrieves all currently available microphone information and stores it in
+`out_info_array`. The return value is the number of the available microphones.
+If the number of available microphones is larger than `info_array_size`, then
+`out_info_array` is filled up with as many available microphones as possible and
+the actual number of available microphones is returned. A negative return value
+indicates that an internal error occurred.
+
+`out_info_array`: All currently available information about the microphone is
+placed into this output parameter. `info_array_size`: The size of
+`out_info_array`.
+
+#### Declaration ####
+
+```
+int SbMicrophoneGetAvailable(SbMicrophoneInfo *out_info_array, int info_array_size)
+```
+
+### SbMicrophoneIdIsValid ###
+
+Indicates whether the given microphone ID is valid.
+
+#### Declaration ####
+
+```
+static bool SbMicrophoneIdIsValid(SbMicrophoneId id)
+```
+
+### SbMicrophoneIsSampleRateSupported ###
+
+Indicates whether the microphone supports the sample rate.
+
+#### Declaration ####
+
+```
+bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id, int sample_rate_in_hz)
+```
+
+### SbMicrophoneIsValid ###
+
+Indicates whether the given microphone is valid.
+
+#### Declaration ####
+
+```
+static bool SbMicrophoneIsValid(SbMicrophone microphone)
+```
+
+### SbMicrophoneOpen ###
+
+Opens the microphone port and starts recording audio on `microphone`.
+
+Once started, the client needs to periodically call `SbMicrophoneRead` to
+receive the audio data. If the microphone has already been started, this call
+clears the unread buffer. The return value indicates whether the microphone is
+open. `microphone`: The microphone that will be opened and will start recording
+audio.
+
+#### Declaration ####
+
+```
+bool SbMicrophoneOpen(SbMicrophone microphone)
+```
+
+### SbMicrophoneRead ###
+
+Retrieves the recorded audio data from the microphone and writes that data to
+`out_audio_data`.
+
+The return value is zero or the positive number of bytes that were read. Neither
+the return value nor `audio_data_size` exceeds the buffer size. A negative
+return value indicates that an error occurred.
+
+This function should be called frequently. Otherwise, the microphone only
+buffers `buffer_size` bytes as configured in `SbMicrophoneCreate` and the new
+audio data is thrown out. No audio data is read from a stopped microphone.
+
+`microphone`: The microphone from which to retrieve recorded audio data.
+`out_audio_data`: The buffer to which the retrieved data will be written.
+`audio_data_size`: The number of requested bytes. If `audio_data_size` is
+smaller than `min_read_size` of `SbMicrophoneInfo`, the extra audio data that
+has already been read from the device is discarded.
+
+#### Declaration ####
+
+```
+int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/mutex.md b/src/cobalt/site/docs/reference/starboard/modules/11/mutex.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/mutex.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/mutex.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/once.md b/src/cobalt/site/docs/reference/starboard/modules/11/once.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/once.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/once.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/player.md b/src/cobalt/site/docs/reference/starboard/modules/11/player.md
new file mode 100644
index 0000000..0a9ebd2
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/player.md
@@ -0,0 +1,564 @@
+---
+layout: doc
+title: "Starboard Module Reference: player.h"
+---
+
+Defines an interface for controlling playback of media elementary streams.
+
+## Macros ##
+
+### SB_PLAYER_INITIAL_TICKET ###
+
+The value of the initial ticket held by the player before the first seek. The
+player will use this ticket value to make the first call to SbPlayerStatusFunc
+with kSbPlayerStateInitialized.
+
+### SB_PLAYER_NO_DURATION ###
+
+The value to pass into SbPlayerCreate's `duration_pts` argument for cases where
+the duration is unknown, such as for live streams.
+
+### kSbPlayerInvalid ###
+
+Well-defined value for an invalid player.
+
+## Enums ##
+
+### SbPlayerDecoderState ###
+
+An indicator of whether the decoder can accept more samples.
+
+#### Values ####
+
+*   `kSbPlayerDecoderStateNeedsData`
+
+    The decoder is asking for one more sample.
+*   `kSbPlayerDecoderStateBufferFull`
+
+    The decoder is not ready for any more samples, so do not send them. Note
+    that this enum value has been deprecated and the SbPlayer implementation
+    should no longer use this value.
+*   `kSbPlayerDecoderStateDestroyed`
+
+    The player has been destroyed, and will send no more callbacks.
+
+### SbPlayerSampleSideDataType ###
+
+Identify the type of side data accompanied with `SbPlayerSampleInfo`, as side
+data may come from multiple sources.
+
+#### Values ####
+
+*   `kMatroskaBlockAdditional`
+
+    The side data comes from the BlockAdditional data in the Matroska/Webm
+    container, as specified in [https://tools.ietf.org/id/draft-lhomme-cellar-matroska-03.html#rfc.section.7.3.39](https://tools.ietf.org/id/draft-lhomme-cellar-matroska-03.html#rfc.section.7.3.39)9) andnd [https://www.webmproject.org/docs/container/#BlockAdditional](https://www.webmproject.org/docs/container/#BlockAdditional)l)
+    . The first 8 bytes of the data contains the value of BlockAddID in big
+    endian format, followed by the content of BlockAdditional.
+
+### SbPlayerState ###
+
+An indicator of the general playback state.
+
+#### Values ####
+
+*   `kSbPlayerStateInitialized`
+
+    The player has just been initialized. It is expecting an SbPlayerSeek() call
+    to enter the prerolling state.
+*   `kSbPlayerStatePrerolling`
+
+    The player is prerolling, collecting enough data to fill the pipeline before
+    presentation starts. After the first preroll is completed, there should
+    always be a video frame to render, even if the player goes back to
+    Prerolling after a Seek.
+*   `kSbPlayerStatePresenting`
+
+    The player is presenting media, and it is either paused or actively playing
+    in real-time. Note that the implementation should use this state to signal
+    that the preroll has been finished.
+*   `kSbPlayerStateEndOfStream`
+
+    The player is presenting media, but it is paused at the end of the stream.
+*   `kSbPlayerStateDestroyed`
+
+    The player has been destroyed, and will send no more callbacks.
+
+## Typedefs ##
+
+### SbPlayer ###
+
+An opaque handle to an implementation-private structure representing a player.
+
+#### Definition ####
+
+```
+typedef struct SbPlayerPrivate* SbPlayer
+```
+
+### SbPlayerDeallocateSampleFunc ###
+
+Callback to free the given sample buffer data. When more than one buffer are
+sent in SbPlayerWriteSample(), the implementation only has to call this callback
+with `sample_buffer` points to the the first buffer.
+
+#### Definition ####
+
+```
+typedef void(* SbPlayerDeallocateSampleFunc) (SbPlayer player, void *context, const void *sample_buffer)
+```
+
+### SbPlayerDecoderStatusFunc ###
+
+Callback for decoder status updates, called in response to a call to
+SbPlayerSeek() or SbPlayerWriteSample(). This callback will never be called
+until at least one call to SbPlayerSeek has occurred. `ticket` will be set to
+the ticket passed into the last received call to SbPlayerSeek() at the time this
+callback was dispatched. This is to distinguish status callbacks for
+interrupting seeks. These callbacks will happen on a different thread than the
+calling thread, and it is not valid to call SbPlayer functions from within this
+callback. After an update with kSbPlayerDecoderStateNeedsData, the user of the
+player will make at most one call to SbPlayerWriteSample() or
+SbPlayerWriteEndOfStream(). The player implementation should update the decoder
+status again after such call to notify its user to continue writing more frames.
+
+#### Definition ####
+
+```
+typedef void(* SbPlayerDecoderStatusFunc) (SbPlayer player, void *context, SbMediaType type, SbPlayerDecoderState state, int ticket)
+```
+
+### SbPlayerErrorFunc ###
+
+Callback for player errors, that may set a `message`. `error`: indicates the
+error code. `message`: provides specific informative diagnostic message about
+the error condition encountered. It is ok for the message to be an empty string
+or NULL if no information is available.
+
+#### Definition ####
+
+```
+typedef void(* SbPlayerErrorFunc) (SbPlayer player, void *context, SbPlayerError error, const char *message)
+```
+
+### SbPlayerStatusFunc ###
+
+Callback for player status updates. These callbacks will happen on a different
+thread than the calling thread, and it is not valid to call SbPlayer functions
+from within this callback.
+
+#### Definition ####
+
+```
+typedef void(* SbPlayerStatusFunc) (SbPlayer player, void *context, SbPlayerState state, int ticket)
+```
+
+## Structs ##
+
+### SbPlayerCreationParam ###
+
+The playback related parameters to pass into SbPlayerCreate() and
+SbPlayerGetPreferredOutputMode().
+
+#### Members ####
+
+*   `SbDrmSystem drm_system`
+
+    Provides an appropriate DRM system if the media stream has encrypted
+    portions. It will be `kSbDrmSystemInvalid` if the stream does not have
+    encrypted portions.
+*   `SbMediaAudioSampleInfo audio_sample_info`
+
+    Contains a populated SbMediaAudioSampleInfo if `audio_sample_info.codec`
+    isn't `kSbMediaAudioCodecNone`. When `audio_sample_info.codec` is
+    `kSbMediaAudioCodecNone`, the video doesn't have an audio track.
+*   `SbMediaVideoSampleInfo video_sample_info`
+
+    Contains a populated SbMediaVideoSampleInfo if `video_sample_info.codec`
+    isn't `kSbMediaVideoCodecNone`. When `video_sample_info.codec` is
+    `kSbMediaVideoCodecNone`, the video is audio only.
+*   `SbPlayerOutputMode output_mode`
+
+    Selects how the decoded video frames will be output. For example,
+    `kSbPlayerOutputModePunchOut` indicates that the decoded video frames will
+    be output to a background video layer by the platform, and
+    `kSbPlayerOutputDecodeToTexture` indicates that the decoded video frames
+    should be made available for the application to pull via calls to
+    SbPlayerGetCurrentFrame().
+
+### SbPlayerInfo2 ###
+
+Information about the current media playback state.
+
+#### Members ####
+
+*   `SbTime current_media_timestamp`
+
+    The position of the playback head, as precisely as possible, in
+    microseconds.
+*   `SbTime duration`
+
+    The known duration of the currently playing media stream, in microseconds.
+*   `SbTime start_date`
+
+    The result of getStartDate for the currently playing media stream, in
+    microseconds since the epoch of January 1, 1601 UTC.
+*   `int frame_width`
+
+    The width of the currently displayed frame, in pixels, or 0 if not provided
+    by this player.
+*   `int frame_height`
+
+    The height of the currently displayed frame, in pixels, or 0 if not provided
+    by this player.
+*   `bool is_paused`
+
+    Whether playback is currently paused.
+*   `double volume`
+
+    The current player volume in [0, 1].
+*   `int total_video_frames`
+
+    The number of video frames sent to the player since the creation of the
+    player.
+*   `int dropped_video_frames`
+
+    The number of video frames decoded but not displayed since the creation of
+    the player.
+*   `int corrupted_video_frames`
+
+    The number of video frames that failed to be decoded since the creation of
+    the player.
+*   `double playback_rate`
+
+    The rate of playback. The video is played back in a speed that is
+    proportional to this. By default it is 1.0 which indicates that the playback
+    is at normal speed. When it is greater than one, the video is played in a
+    faster than normal speed. When it is less than one, the video is played in a
+    slower than normal speed. Negative speeds are not supported.
+
+### SbPlayerSampleInfo ###
+
+Information about the samples to be written into SbPlayerWriteSample2.
+
+#### Members ####
+
+*   `SbMediaType type`
+*   `const void * buffer`
+
+    Points to the buffer containing the sample data.
+*   `int buffer_size`
+
+    Size of the data pointed to by `buffer`.
+*   `SbTime timestamp`
+
+    The timestamp of the sample in SbTime.
+*   `SbPlayerSampleSideData* side_data`
+
+    Points to an array of side data for the input, when available.
+*   `int side_data_count`
+
+    The number of side data pointed by `side_data`. It should be set to 0 if
+    there is no side data for the input.
+*   `SbMediaAudioSampleInfo audio_sample_info`
+
+    Information about an audio sample. This value can only be used when `type`
+    is kSbMediaTypeAudio.
+*   `SbMediaVideoSampleInfo video_sample_info`
+
+    Information about a video sample. This value can only be used when `type` is
+    kSbMediaTypeVideo.
+*   `union SbPlayerSampleInfo::@0 @1`
+*   `constSbDrmSampleInfo* drm_info`
+
+    The DRM system related info for the media sample. This value is required for
+    encrypted samples. Otherwise, it must be `NULL`.
+
+### SbPlayerSampleSideData ###
+
+Side data accompanied with `SbPlayerSampleInfo`, it can be arbitrary binary data
+coming from multiple sources.
+
+#### Members ####
+
+*   `SbPlayerSampleSideDataType type`
+*   `const uint8_t * data`
+
+    `data` will remain valid until SbPlayerDeallocateSampleFunc() is called on
+    the `SbPlayerSampleInfo::buffer` the data is associated with.
+*   `size_t size`
+
+    The size of the data pointed by `data`, in bytes.
+
+## Functions ##
+
+### SbPlayerCreate ###
+
+Creates a player that will be displayed on `window` for the specified
+`video_codec` and `audio_codec`, acquiring all resources needed to operate it,
+and returning an opaque handle to it. The expectation is that a new player will
+be created and destroyed for every playback.
+
+This function returns the created player. Note the following:
+
+*   The associated decoder of the returned player should be assumed to not be in
+    `kSbPlayerDecoderStateNeedsData` until SbPlayerSeek() has been called on it.
+
+*   It is expected either that the thread that calls SbPlayerCreate is the same
+    thread that calls the other `SbPlayer` functions for that player, or that
+    there is a mutex guarding calls into each `SbPlayer` instance.
+
+*   If there is a platform limitation on how many players can coexist
+    simultaneously, then calls made to this function that attempt to exceed that
+    limit must return `kSbPlayerInvalid`. Multiple calls to SbPlayerCreate must
+    not cause a crash.
+
+`window`: The window that will display the player. `window` can be
+`kSbWindowInvalid` for platforms where video is only displayed on a particular
+window that the underlying implementation already has access to.
+
+`video_codec`: The video codec used for the player. If `video_codec` is
+`kSbMediaVideoCodecNone`, the player is an audio-only player. If `video_codec`
+is any other value, the player is an audio/video decoder. This can be set to
+`kSbMediaVideoCodecNone` to play a video with only an audio track.
+
+`audio_codec`: The audio codec used for the player. The caller must provide a
+populated `audio_sample_info` if audio codec is `kSbMediaAudioCodecAac`. Can be
+set to `kSbMediaAudioCodecNone` to play a video without any audio track. In such
+case `audio_sample_info` must be NULL.
+
+`drm_system`: If the media stream has encrypted portions, then this parameter
+provides an appropriate DRM system, created with `SbDrmCreateSystem()`. If the
+stream does not have encrypted portions, then `drm_system` may be
+`kSbDrmSystemInvalid`. `audio_sample_info`: Note that the caller must provide a
+populated `audio_sample_info` if the audio codec is `kSbMediaAudioCodecAac`.
+Otherwise, `audio_sample_info` can be NULL. See media.h for the format of the
+`SbMediaAudioSampleInfo` struct. Note that `audio_specific_config` is a pointer
+and the content it points to is no longer valid after this function returns. The
+implementation has to make a copy of the content if it is needed after the
+function returns. `max_video_capabilities`: This string communicates the max
+video capabilities required to the platform. The web app will not provide a
+video stream exceeding the maximums described by this parameter. Allows the
+platform to optimize playback pipeline for low quality video streams if it knows
+that it will never adapt to higher quality streams. The string uses the same
+format as the string passed in to SbMediaCanPlayMimeAndKeySystem(), for example,
+when it is set to "width=1920; height=1080; framerate=15;", the video will never
+adapt to resolution higher than 1920x1080 or frame per second higher than 15
+fps. When the maximums are unknown, this will be set to NULL.
+
+#### Declaration ####
+
+```
+SbPlayer SbPlayerCreate(SbWindow window, const SbPlayerCreationParam *creation_param, SbPlayerDeallocateSampleFunc sample_deallocate_func, SbPlayerDecoderStatusFunc decoder_status_func, SbPlayerStatusFunc player_status_func, SbPlayerErrorFunc player_error_func, void *context, SbDecodeTargetGraphicsContextProvider *context_provider)
+```
+
+### SbPlayerDestroy ###
+
+Destroys `player`, freeing all associated resources.
+
+*   Upon calling this method, there should be one call to the player status
+    callback (i.e. `player_status_func` used in the creation of the player)
+    which indicates the player is destroyed. Note, the callback has to be in-
+    flight when SbPlayerDestroyed is called.
+
+*   No more other callbacks should be issued after this function returns.
+
+*   It is not allowed to pass `player` into any other `SbPlayer` function once
+    SbPlayerDestroy has been called on that player. `player`: The player to be
+    destroyed.
+
+#### Declaration ####
+
+```
+void SbPlayerDestroy(SbPlayer player)
+```
+
+### SbPlayerGetCurrentFrame ###
+
+Given a player created with the kSbPlayerOutputModeDecodeToTexture output mode,
+it will return a SbDecodeTarget representing the current frame to be rasterized.
+On GLES systems, this function must be called on a thread with an EGLContext
+current, and specifically the EGLContext that will be used to eventually render
+the frame. If this function is called with a `player` object that was created
+with an output mode other than kSbPlayerOutputModeDecodeToTexture,
+kSbDecodeTargetInvalid is returned.
+
+#### Declaration ####
+
+```
+SbDecodeTarget SbPlayerGetCurrentFrame(SbPlayer player)
+```
+
+### SbPlayerGetInfo2 ###
+
+Gets a snapshot of the current player state and writes it to `out_player_info`.
+This function may be called very frequently and is expected to be inexpensive.
+
+`player`: The player about which information is being retrieved.
+`out_player_info`: The information retrieved for the player.
+
+#### Declaration ####
+
+```
+void SbPlayerGetInfo2(SbPlayer player, SbPlayerInfo2 *out_player_info2)
+```
+
+### SbPlayerGetMaximumNumberOfSamplesPerWrite ###
+
+Writes a single sample of the given media type to `player`'s input stream. Its
+data may be passed in via more than one buffers. The lifetime of
+`sample_buffers`, `sample_buffer_sizes`, `video_sample_info`, and
+`sample_drm_info` (as well as member `subsample_mapping` contained inside it)
+are not guaranteed past the call to SbPlayerWriteSample. That means that before
+returning, the implementation must synchronously copy any information it wants
+to retain from those structures.
+
+`player`: The player for which the number is retrieved. `sample_type`: The type
+of sample for which the number is retrieved. See the `SbMediaType` enum in
+media.h.
+
+#### Declaration ####
+
+```
+int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player, SbMediaType sample_type)
+```
+
+### SbPlayerGetPreferredOutputMode ###
+
+Returns the preferred output mode of the implementation when a video described
+by `creation_param` is played. It is assumed that it is okay to call
+SbPlayerCreate() with the same video described by `creation_param`, with its
+`output_mode` member replaced by the returned output mode. When the caller has
+no preference on the output mode, it will set `creation_param->output_mode` to
+`kSbPlayerOutputModeInvalid`, and the implementation can return its preferred
+output mode based on the information contained in `creation_param`. The caller
+can also set `creation_param->output_mode` to its preferred output mode, and the
+implementation should return the same output mode if it is supported, otherwise
+the implementation should return an output mode that it is supported, as if
+`creation_param->output_mode` is set to `kSbPlayerOutputModeInvalid` prior to
+the call. Note that it is not the responsibility of this function to verify
+whether the video described by `creation_param` can be played on the platform,
+and the implementation should try its best effort to return a valid output mode.
+`creation_param` will never be NULL.
+
+#### Declaration ####
+
+```
+SbPlayerOutputMode SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam *creation_param)
+```
+
+### SbPlayerIsValid ###
+
+Returns whether the given player handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbPlayerIsValid(SbPlayer player)
+```
+
+### SbPlayerSetBounds ###
+
+Sets the player bounds to the given graphics plane coordinates. The changes do
+not take effect until the next graphics frame buffer swap. The default bounds
+for a player is the full screen. This function is only relevant when the
+`player` is created with the kSbPlayerOutputModePunchOut output mode, and if
+this is not the case then this function call can be ignored.
+
+This function is called on every graphics frame that changes the video bounds.
+For example, if the video bounds are being animated, then this will be called at
+up to 60 Hz. Since the function could be called up to once per frame,
+implementors should take care to avoid related performance concerns with such
+frequent calls.
+
+`player`: The player that is being resized. `z_index`: The z-index of the
+player. When the bounds of multiple players are overlapped, the one with larger
+z-index will be rendered on top of the ones with smaller z-index. `x`: The
+x-coordinate of the upper-left corner of the player. `y`: The y-coordinate of
+the upper-left corner of the player. `width`: The width of the player, in
+pixels. `height`: The height of the player, in pixels.
+
+#### Declaration ####
+
+```
+void SbPlayerSetBounds(SbPlayer player, int z_index, int x, int y, int width, int height)
+```
+
+### SbPlayerSetPlaybackRate ###
+
+Set the playback rate of the `player`. `rate` is default to 1.0 which indicates
+the playback is at its original speed. A `rate` greater than one will make the
+playback faster than its original speed. For example, when `rate` is 2, the
+video will be played at twice the speed as its original speed. A `rate` less
+than 1.0 will make the playback slower than its original speed. When `rate` is
+0, the playback will be paused. The function returns true when the playback rate
+is set to `playback_rate` or to a rate that is close to `playback_rate` which
+the implementation supports. It returns false when the playback rate is
+unchanged, this can happen when `playback_rate` is negative or if it is too high
+to support.
+
+#### Declaration ####
+
+```
+bool SbPlayerSetPlaybackRate(SbPlayer player, double playback_rate)
+```
+
+### SbPlayerSetVolume ###
+
+Sets the player's volume.
+
+`player`: The player in which the volume is being adjusted. `volume`: The new
+player volume. The value must be between `0.0` and `1.0`, inclusive. A value of
+`0.0` means that the audio should be muted, and a value of `1.0` means that it
+should be played at full volume.
+
+#### Declaration ####
+
+```
+void SbPlayerSetVolume(SbPlayer player, double volume)
+```
+
+### SbPlayerWriteEndOfStream ###
+
+Writes a marker to `player`'s input stream of `stream_type` indicating that
+there are no more samples for that media type for the remainder of this media
+stream. This marker is invalidated, along with the rest of the stream's
+contents, after a call to SbPlayerSeek.
+
+`player`: The player to which the marker is written. `stream_type`: The type of
+stream for which the marker is written.
+
+#### Declaration ####
+
+```
+void SbPlayerWriteEndOfStream(SbPlayer player, SbMediaType stream_type)
+```
+
+### SbPlayerWriteSample2 ###
+
+Writes samples of the given media type to `player`'s input stream. The lifetime
+of `sample_infos`, and the members of its elements like `buffer`,
+`video_sample_info`, and `drm_info` (as well as member `subsample_mapping`
+contained inside it) are not guaranteed past the call to SbPlayerWriteSample2.
+That means that before returning, the implementation must synchronously copy any
+information it wants to retain from those structures.
+
+SbPlayerWriteSample2 allows writing of multiple samples in one call.
+
+`player`: The player to which the sample is written. `sample_type`: The type of
+sample being written. See the `SbMediaType` enum in media.h. `sample_infos`: A
+pointer to an array of SbPlayerSampleInfo with `number_of_sample_infos`
+elements, each holds the data for an sample, i.e. a sequence of whole NAL Units
+for video, or a complete audio frame. `sample_infos` cannot be assumed to live
+past the call into SbPlayerWriteSample2(), so it must be copied if its content
+will be used after SbPlayerWriteSample2() returns. `number_of_sample_infos`:
+Specify the number of samples contained inside `sample_infos`. It has to be at
+least one, and less than the return value of
+SbPlayerGetMaximumNumberOfSamplesPerWrite().
+
+#### Declaration ####
+
+```
+void SbPlayerWriteSample2(SbPlayer player, SbMediaType sample_type, const SbPlayerSampleInfo *sample_infos, int number_of_sample_infos)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/socket.md b/src/cobalt/site/docs/reference/starboard/modules/11/socket.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/socket.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/socket.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/socket_waiter.md b/src/cobalt/site/docs/reference/starboard/modules/11/socket_waiter.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/socket_waiter.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/socket_waiter.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/6/speech_recognizer.md b/src/cobalt/site/docs/reference/starboard/modules/11/speech_recognizer.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/6/speech_recognizer.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/speech_recognizer.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/speech_synthesis.md b/src/cobalt/site/docs/reference/starboard/modules/11/speech_synthesis.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/speech_synthesis.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/speech_synthesis.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/storage.md b/src/cobalt/site/docs/reference/starboard/modules/11/storage.md
new file mode 100644
index 0000000..c98207b
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/storage.md
@@ -0,0 +1,159 @@
+---
+layout: doc
+title: "Starboard Module Reference: storage.h"
+---
+
+Defines a user-based Storage API. This is a simple, all-at-once BLOB storage and
+retrieval API that is intended for robust long-term, per-user storage. Some
+platforms have different mechanisms for this kind of storage, so this API exists
+to allow a client application to access this kind of storage.
+
+Note that there can be only one storage record per user and, thus, a maximum of
+one open storage record can exist for each user. Attempting to open a second
+record for a user will result in undefined behavior.
+
+These APIs are NOT expected to be thread-safe, so either call them from a single
+thread, or perform proper synchronization around all calls.
+
+## Macros ##
+
+### kSbStorageInvalidRecord ###
+
+Well-defined value for an invalid storage record handle.
+
+## Typedefs ##
+
+### SbStorageRecord ###
+
+A handle to an open storage record.
+
+#### Definition ####
+
+```
+typedef SbStorageRecordPrivate* SbStorageRecord
+```
+
+## Functions ##
+
+### SbStorageCloseRecord ###
+
+Closes `record`, synchronously ensuring that all written data is flushed. This
+function performs blocking I/O on the calling thread.
+
+The return value indicates whether the operation succeeded. Storage writes
+should be as atomic as possible, so the record should either be fully written or
+deleted (or, even better, untouched).
+
+`record`: The storage record to close. `record` is invalid after this point, and
+subsequent calls referring to `record` will fail.
+
+#### Declaration ####
+
+```
+bool SbStorageCloseRecord(SbStorageRecord record)
+```
+
+### SbStorageDeleteRecord ###
+
+Deletes the `SbStorageRecord` for `user` named `name`. The return value
+indicates whether the record existed and was successfully deleted. If the record
+did not exist or could not be deleted, the function returns `false`.
+
+If `name` is NULL, deletes the default storage record for the user, like what
+would have been deleted with the previous version of SbStorageDeleteRecord.
+
+This function must not be called while the user's storage record is open. This
+function performs blocking I/O on the calling thread.
+
+`user`: The user for whom the record will be deleted. `name`: The filesystem-
+safe name of the record to open.
+
+#### Declaration ####
+
+```
+bool SbStorageDeleteRecord(SbUser user, const char *name)
+```
+
+### SbStorageGetRecordSize ###
+
+Returns the size of `record`, or `-1` if there is an error. This function
+performs blocking I/O on the calling thread.
+
+`record`: The record to retrieve the size of.
+
+#### Declaration ####
+
+```
+int64_t SbStorageGetRecordSize(SbStorageRecord record)
+```
+
+### SbStorageIsValidRecord ###
+
+Returns whether the given storage record handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbStorageIsValidRecord(SbStorageRecord record)
+```
+
+### SbStorageOpenRecord ###
+
+Opens and returns the SbStorageRecord for `user` named `name`, blocking I/O on
+the calling thread until the open is completed. If `user` is not a valid
+`SbUser`, the function returns `kSbStorageInvalidRecord`. Will return an
+`SbStorageRecord` of size zero if the record does not yet exist. Opening an
+already-open `SbStorageRecord` has undefined behavior.
+
+If `name` is NULL, opens the default storage record for the user, like what
+would have been saved with the previous version of SbStorageOpenRecord.
+
+`user`: The user for which the storage record will be opened. `name`: The
+filesystem-safe name of the record to open.
+
+#### Declaration ####
+
+```
+SbStorageRecord SbStorageOpenRecord(SbUser user, const char *name)
+```
+
+### SbStorageReadRecord ###
+
+Reads up to `data_size` bytes from `record`, starting at the beginning of the
+record. The function returns the actual number of bytes read, which must be <=
+`data_size`. The function returns `-1` in the event of an error. This function
+makes a best-effort to read the entire record, and it performs blocking I/O on
+the calling thread until the entire record is read or an error is encountered.
+
+`record`: The record to be read. `out_data`: The data read from the record.
+`data_size`: The amount of data, in bytes, to read.
+
+#### Declaration ####
+
+```
+int64_t SbStorageReadRecord(SbStorageRecord record, char *out_data, int64_t data_size)
+```
+
+### SbStorageWriteRecord ###
+
+Replaces the data in `record` with `data_size` bytes from `data`. This function
+always deletes any previous data in that record. The return value indicates
+whether the write succeeded. This function makes a best-effort to write the
+entire record, and it may perform blocking I/O on the calling thread until the
+entire record is written or an error is encountered.
+
+While `SbStorageWriteRecord()` may defer the persistence,
+`SbStorageReadRecord()` is expected to work as expected immediately afterwards,
+even without a call to `SbStorageCloseRecord()`. The data should be persisted
+after a short time, even if there is an unexpected process termination before
+`SbStorageCloseRecord()` is called.
+
+`record`: The record to be written to. `data`: The data to write to the record.
+`data_size`: The amount of `data`, in bytes, to write to the record.
+
+#### Declaration ####
+
+```
+bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/4/string.md b/src/cobalt/site/docs/reference/starboard/modules/11/string.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/4/string.md
rename to src/cobalt/site/docs/reference/starboard/modules/11/string.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/system.md b/src/cobalt/site/docs/reference/starboard/modules/11/system.md
new file mode 100644
index 0000000..371d49d
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/system.md
@@ -0,0 +1,702 @@
+---
+layout: doc
+title: "Starboard Module Reference: system.h"
+---
+
+Defines a broad set of APIs that allow the client application to query build and
+runtime properties of the enclosing system.
+
+## Enums ##
+
+### SbSystemCapabilityId ###
+
+Runtime capabilities are boolean properties of a platform that can't be
+determined at compile-time. They may vary from device to device, but they will
+not change over the course of a single execution. They often specify particular
+behavior of other APIs within the bounds of their operating range.
+
+#### Values ####
+
+*   `kSbSystemCapabilityReversedEnterAndBack`
+
+    Whether this system has reversed Enter and Back keys.
+*   `kSbSystemCapabilityCanQueryGPUMemoryStats`
+
+    Whether this system has the ability to report on GPU memory usage. If (and
+    only if) a system has this capability will SbSystemGetTotalGPUMemory() and
+    SbSystemGetUsedGPUMemory() be valid to call.
+*   `kSbSystemCapabilitySetsInputTimestamp`
+
+    Whether this system sets the `timestamp` field of SbInputData . If the
+    system does not set this field, then it will automatically be set; however,
+    the relative time between input events likely will not be preserved, so
+    time-related calculations (e.g. velocity for move events) will be incorrect.
+
+### SbSystemConnectionType ###
+
+Enumeration of network connection types.
+
+#### Values ####
+
+*   `kSbSystemConnectionTypeWired`
+
+    The system is on a wired connection.
+*   `kSbSystemConnectionTypeWireless`
+
+    The system is on a wireless connection.
+*   `kSbSystemConnectionTypeUnknown`
+
+    The system connection type is unknown.
+
+### SbSystemDeviceType ###
+
+Enumeration of device types.
+
+#### Values ####
+
+*   `kSbSystemDeviceTypeBlueRayDiskPlayer`
+
+    Blue-ray Disc Player (BDP).
+*   `kSbSystemDeviceTypeGameConsole`
+
+    A relatively high-powered TV device used primarily for playing games.
+*   `kSbSystemDeviceTypeOverTheTopBox`
+
+    Over the top (OTT) devices stream content via the Internet over another type
+    of network, e.g. cable or satellite.
+*   `kSbSystemDeviceTypeSetTopBox`
+
+    Set top boxes (STBs) stream content primarily over cable or satellite. Some
+    STBs can also stream OTT content via the Internet.
+*   `kSbSystemDeviceTypeTV`
+
+    A Smart TV is a TV that can directly run applications that stream OTT
+    content via the Internet.
+*   `kSbSystemDeviceTypeDesktopPC`
+
+    Desktop PC.
+*   `kSbSystemDeviceTypeAndroidTV`
+
+    An Android TV Device.
+*   `kSbSystemDeviceTypeUnknown`
+
+    Unknown device.
+
+### SbSystemPathId ###
+
+Enumeration of special paths that the platform can define.
+
+#### Values ####
+
+*   `kSbSystemPathContentDirectory`
+
+    Path to where the local content files that ship with the binary are
+    available.
+*   `kSbSystemPathCacheDirectory`
+
+    Path to the directory that can be used as a local file cache, if available.
+*   `kSbSystemPathDebugOutputDirectory`
+
+    Path to the directory where debug output (e.g. logs, trace output,
+    screenshots) can be written into.
+*   `kSbSystemPathFontDirectory`
+
+    Path to a directory where system font files can be found. Should only be
+    specified on platforms that provide fonts usable by Starboard applications.
+*   `kSbSystemPathFontConfigurationDirectory`
+
+    Path to a directory where system font configuration metadata can be found.
+    May be the same directory as `kSbSystemPathFontDirectory`, but not
+    necessarily. Should only be specified on platforms that provide fonts usable
+    by Starboard applications.
+*   `kSbSystemPathTempDirectory`
+
+    Path to a directory where temporary files can be written.
+*   `kSbSystemPathTestOutputDirectory`
+
+    Path to a directory where test results can be written.
+*   `kSbSystemPathExecutableFile`
+
+    Full path to the executable file.
+
+### SbSystemPlatformErrorResponse ###
+
+Possible responses for `SbSystemPlatformErrorCallback`.
+
+#### Values ####
+
+*   `kSbSystemPlatformErrorResponsePositive`
+*   `kSbSystemPlatformErrorResponseNegative`
+*   `kSbSystemPlatformErrorResponseCancel`
+
+### SbSystemPlatformErrorType ###
+
+Enumeration of possible values for the `type` parameter passed to the
+`SbSystemRaisePlatformError` function.
+
+#### Values ####
+
+*   `kSbSystemPlatformErrorTypeConnectionError`
+
+    Cobalt received a network connection error, or a network disconnection
+    event. If the `response` passed to `SbSystemPlatformErrorCallback` is
+    `kSbSystemPlatformErrorResponsePositive` then the request should be retried,
+    otherwise the app should be stopped.
+
+### SbSystemPropertyId ###
+
+System properties that can be queried for. Many of these are used in User-Agent
+string generation.
+
+#### Values ####
+
+*   `kSbSystemPropertyCertificationScope`
+
+    The certification scope that identifies a group of devices.
+*   `kSbSystemPropertyBase64EncodedCertificationSecret`
+
+    The HMAC-SHA256 base64 encoded symmetric key used to sign a subset of the
+    query parameters from the application startup URL.
+*   `kSbSystemPropertyChipsetModelNumber`
+
+    The full model number of the main platform chipset, including any vendor-
+    specific prefixes.
+*   `kSbSystemPropertyFirmwareVersion`
+
+    The production firmware version number which the device is currently
+    running.
+*   `kSbSystemPropertyFriendlyName`
+
+    A friendly name for this actual device. It may include user-personalization
+    like "Upstairs Bedroom." It may be displayed to users as part of some kind
+    of device selection (e.g. in-app DIAL).
+*   `kSbSystemPropertyManufacturerName`
+
+    A deprecated alias for `kSbSystemPropertyBrandName`.
+*   `kSbSystemPropertyBrandName`
+
+    The name of the brand under which the device is being sold.
+*   `kSbSystemPropertyModelName`
+
+    The final production model number of the device.
+*   `kSbSystemPropertyModelYear`
+
+    The year the device was launched, e.g. "2016".
+*   `kSbSystemPropertyOriginalDesignManufacturerName`
+
+    The corporate entity responsible for the manufacturing/assembly of the
+    device on behalf of the business entity owning the brand. This is often
+    abbreviated as ODM.
+*   `kSbSystemPropertyPlatformName`
+
+    The name of the operating system and platform, suitable for inclusion in a
+    User-Agent, say.
+*   `kSbSystemPropertySpeechApiKey`
+
+    The Google Speech API key. The platform manufacturer is responsible for
+    registering a Google Speech API key for their products. In the API Console (
+    [http://developers.google.com/console](http://developers.google.com/console)
+    ), you can enable the Speech APIs and generate a Speech API key.
+*   `kSbSystemPropertyUserAgentAuxField`
+
+    A field that, if available, is appended to the user agent
+
+## Typedefs ##
+
+### SbSystemComparator ###
+
+Pointer to a function to compare two items. The return value uses standard
+`*cmp` semantics:
+
+*   `< 0` if `a` is less than `b`
+
+*   `0` if the two items are equal
+
+*   `> 1` if `a` is greater than `b`
+
+`a`: The first value to compare. `b`: The second value to compare.
+
+#### Definition ####
+
+```
+typedef int(* SbSystemComparator) (const void *a, const void *b)
+```
+
+### SbSystemError ###
+
+A type that can represent a system error code across all Starboard platforms.
+
+#### Definition ####
+
+```
+typedef int SbSystemError
+```
+
+### SbSystemPlatformErrorCallback ###
+
+Type of callback function that may be called in response to an error
+notification from `SbSystemRaisePlatformError`. `response` is a code to indicate
+the user's response, e.g. if the platform raised a dialog to notify the user of
+the error. `user_data` is the opaque pointer that was passed to the call to
+`SbSystemRaisePlatformError`.
+
+#### Definition ####
+
+```
+typedef void(* SbSystemPlatformErrorCallback) (SbSystemPlatformErrorResponse response, void *user_data)
+```
+
+## Functions ##
+
+### SbSystemBinarySearch ###
+
+Binary searches a sorted table `base` of `element_count` objects, each element
+`element_width` bytes in size for an element that `comparator` compares equal to
+`key`.
+
+This function is meant to be a drop-in replacement for `bsearch`.
+
+`key`: The key to search for in the table. `base`: The sorted table of elements
+to be searched. `element_count`: The number of elements in the table.
+`element_width`: The size, in bytes, of each element in the table. `comparator`:
+A value that indicates how the element in the table should compare to the
+specified `key`.
+
+#### Declaration ####
+
+```
+void* SbSystemBinarySearch(const void *key, const void *base, size_t element_count, size_t element_width, SbSystemComparator comparator)
+```
+
+### SbSystemBreakIntoDebugger ###
+
+Breaks the current program into the debugger, if a debugger is attached. If a
+debugger is not attached, this function aborts the program.
+
+#### Declaration ####
+
+```
+SB_NORETURN void SbSystemBreakIntoDebugger()
+```
+
+### SbSystemClearLastError ###
+
+Clears the last error set by a Starboard call in the current thread.
+
+#### Declaration ####
+
+```
+void SbSystemClearLastError()
+```
+
+### SbSystemGetConnectionType ###
+
+Returns the device's current network connection type.
+
+#### Declara