Import Cobalt 13.103164

Change-Id: Ie7a04d9db584bed593c82cb8ea5aba86721920b2
diff --git a/src/cobalt/base/wrap_main_starboard.h b/src/cobalt/base/wrap_main_starboard.h
index aa57397..15ababb 100644
--- a/src/cobalt/base/wrap_main_starboard.h
+++ b/src/cobalt/base/wrap_main_starboard.h
@@ -36,7 +36,7 @@
   static MessageLoopForUI* g_loop = NULL;
   static bool g_started = false;
   switch (event->type) {
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbEventTypePreload: {
       SbEventStartData* data = static_cast<SbEventStartData*>(event->data);
 
@@ -55,7 +55,7 @@
       g_started = true;
       break;
     }
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
     case kSbEventTypeStart: {
       SbEventStartData* data = static_cast<SbEventStartData*>(event->data);
 
diff --git a/src/cobalt/bindings/v8c/__init__.py b/src/cobalt/bindings/v8c/__init__.py
new file mode 100644
index 0000000..ef65bee
--- /dev/null
+++ b/src/cobalt/bindings/v8c/__init__.py
@@ -0,0 +1 @@
+# Required for Python to search this directory for module files
diff --git a/src/cobalt/bindings/v8c/bootstrap_path.py b/src/cobalt/bindings/v8c/bootstrap_path.py
new file mode 100644
index 0000000..69a1b65
--- /dev/null
+++ b/src/cobalt/bindings/v8c/bootstrap_path.py
@@ -0,0 +1,49 @@
+#
+# Copyright 2017 Google Inc. 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.
+#
+"""Utility to prepend the top-level source directory to sys.path.
+
+Since this may be used outside of gclient or git environment (such as part of a
+tarball), the path to the root must be hardcoded.
+"""
+
+import os
+import sys
+
+
+def _GetSrcRoot():
+  """Finds the first directory named 'src' that this module is in."""
+  current_path = os.path.normpath(__file__)
+  while os.path.basename(current_path) != 'src':
+    next_path = os.path.dirname(current_path)
+    if next_path == current_path:
+      raise RuntimeError('Could not find src directory.')
+    current_path = next_path
+  return os.path.abspath(current_path)
+
+
+sys.path.insert(0, _GetSrcRoot())
+
+# Add blink's python tools to the path.
+
+sys.path.append(
+    os.path.normpath(
+        os.path.join(_GetSrcRoot(), 'third_party', 'blink', 'Tools',
+                     'Scripts')))
+
+sys.path.append(
+    os.path.normpath(
+        os.path.join(_GetSrcRoot(), 'third_party', 'blink', 'Source',
+                     'bindings', 'scripts')))
diff --git a/src/cobalt/bindings/v8c/code_generator_v8c.py b/src/cobalt/bindings/v8c/code_generator_v8c.py
new file mode 100644
index 0000000..ca927f3
--- /dev/null
+++ b/src/cobalt/bindings/v8c/code_generator_v8c.py
@@ -0,0 +1,61 @@
+# Copyright 2017 Google Inc. 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.
+"""V8c-specific implementation of CodeGeneratorCobalt.
+
+Defines CodeGeneratorV8c and ExpressionGeneratorV8c classes.
+"""
+
+import os
+
+from cobalt.bindings.code_generator_cobalt import CodeGeneratorCobalt
+from cobalt.bindings.expression_generator import ExpressionGenerator
+
+
+class ExpressionGeneratorV8c(ExpressionGenerator):
+  """Implementation of ExpressionGenerator for V8."""
+
+  def is_undefined(self, arg):
+    # TODO: Implement.
+    return ''
+
+  def is_undefined_or_null(self, arg):
+    # TODO: Implement.
+    return ''
+
+  def inherits_interface(self, interface_name, arg):
+    # TODO: Implement.
+    return ''
+
+  def is_number(self, arg):
+    # TODO: Implement.
+    return ''
+
+
+class CodeGeneratorV8c(CodeGeneratorCobalt):
+  """Code generator class for V8 bindings."""
+
+  _expression_generator = ExpressionGeneratorV8c()
+
+  def __init__(self, *args, **kwargs):
+    module_path, _ = os.path.split(os.path.realpath(__file__))
+    templates_dir = os.path.normpath(os.path.join(module_path, 'templates'))
+    super(CodeGeneratorV8c, self).__init__(templates_dir, *args, **kwargs)
+
+  @property
+  def generated_file_prefix(self):
+    return 'v8c'
+
+  @property
+  def expression_generator(self):
+    return CodeGeneratorV8c._expression_generator
diff --git a/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py b/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py
new file mode 100644
index 0000000..8901cc2
--- /dev/null
+++ b/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py
@@ -0,0 +1,24 @@
+# Copyright 2017 Google Inc. 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.
+"""Generate a conversion header for SpiderMonkey."""
+
+import sys
+
+import bootstrap_path  # pylint: disable=g-bad-import-order,unused-import
+
+from cobalt.bindings.generate_conversion_header import generate_header
+from cobalt.bindings.v8c.code_generator_v8c import CodeGeneratorV8c
+
+if __name__ == '__main__':
+  sys.exit(generate_header(CodeGeneratorV8c))
diff --git a/src/cobalt/bindings/v8c/idl_compiler_v8c.py b/src/cobalt/bindings/v8c/idl_compiler_v8c.py
new file mode 100644
index 0000000..6c8c92e
--- /dev/null
+++ b/src/cobalt/bindings/v8c/idl_compiler_v8c.py
@@ -0,0 +1,28 @@
+# Copyright 2017 Google Inc. 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.
+"""Compile an .idl file to Cobalt v8c bindings (.h and .cpp files).
+
+Calls into idl_compiler_cobalt.shared_main specifying the V8
+CodeGenerator class.
+"""
+
+import sys
+
+import bootstrap_path  # pylint: disable=unused-import
+
+from cobalt.bindings.idl_compiler_cobalt import generate_bindings
+from cobalt.bindings.v8c.code_generator_v8c import CodeGeneratorV8c
+
+if __name__ == '__main__':
+  sys.exit(generate_bindings(CodeGeneratorV8c))
diff --git a/src/cobalt/bindings/v8c/templates/callback-interface.cc.template b/src/cobalt/bindings/v8c/templates/callback-interface.cc.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/callback-interface.cc.template
diff --git a/src/cobalt/bindings/v8c/templates/callback-interface.h.template b/src/cobalt/bindings/v8c/templates/callback-interface.h.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/callback-interface.h.template
diff --git a/src/cobalt/bindings/v8c/templates/dictionary-conversion.cc.template b/src/cobalt/bindings/v8c/templates/dictionary-conversion.cc.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/dictionary-conversion.cc.template
diff --git a/src/cobalt/bindings/v8c/templates/enumeration-conversion.cc.template b/src/cobalt/bindings/v8c/templates/enumeration-conversion.cc.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/enumeration-conversion.cc.template
diff --git a/src/cobalt/bindings/v8c/templates/generated-types.h.template b/src/cobalt/bindings/v8c/templates/generated-types.h.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/generated-types.h.template
diff --git a/src/cobalt/bindings/v8c/templates/interface.cc.template b/src/cobalt/bindings/v8c/templates/interface.cc.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/interface.cc.template
diff --git a/src/cobalt/bindings/v8c/templates/interface.h.template b/src/cobalt/bindings/v8c/templates/interface.h.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/interface.h.template
diff --git a/src/cobalt/bindings/v8c/templates/macros.cc.template b/src/cobalt/bindings/v8c/templates/macros.cc.template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cobalt/bindings/v8c/templates/macros.cc.template
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index aa2919a..a946dee 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -587,6 +587,9 @@
   if (command_line->HasSwitch(switches::kDisableImageAnimations)) {
     options.web_module_options.enable_image_animations = false;
   }
+  if (command_line->HasSwitch(switches::kDisableSplashScreenOnReloads)) {
+    options.enable_splash_screen_on_reloads = false;
+  }
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
 // Production-builds override all switches to the most secure configuration.
@@ -736,9 +739,9 @@
     case kSbEventTypeUnpause:
     case kSbEventTypeSuspend:
     case kSbEventTypeResume:
-#if SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbEventTypeLowMemory:
-#endif  // SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#endif  // SB_API_VERSION >= 6
       OnApplicationEvent(starboard_event->type);
       break;
     case kSbEventTypeNetworkConnect:
@@ -828,13 +831,13 @@
       browser_module_->Resume();
       DLOG(INFO) << "Finished resuming.";
       break;
-#if SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbEventTypeLowMemory:
       DLOG(INFO) << "Got low memory event.";
       browser_module_->ReduceMemory();
       DLOG(INFO) << "Finished reducing memory usage.";
       break;
-#endif  // SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#endif  // SB_API_VERSION >= 6
     default:
       NOTREACHED() << "Unexpected event type: " << event_type;
       return;
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 4294695..4322073 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -228,6 +228,7 @@
       web_module_loaded_(true /* manually_reset */,
                          false /* initially_signalled */),
       web_module_recreated_callback_(options_.web_module_recreated_callback),
+      navigate_count_(0),
       navigate_time_("Time.Browser.Navigate", 0,
                      "The last time a navigation occurred."),
       on_load_event_time_("Time.Browser.OnLoadEvent", 0,
@@ -281,6 +282,16 @@
 #endif
   TRACE_EVENT0("cobalt::browser", "BrowserModule::BrowserModule()");
 
+  // Create the main web module layer.
+  main_web_module_layer_ =
+      render_tree_combiner_.CreateLayer(kMainWebModuleZIndex);
+  // Create the splash screen layer.
+  splash_screen_layer_ = render_tree_combiner_.CreateLayer(kSplashScreenZIndex);
+// Create the debug console layer.
+#if defined(ENABLE_DEBUG_CONSOLE)
+  debug_console_layer_ = render_tree_combiner_.CreateLayer(kDebugConsoleZIndex);
+#endif
+
   // Setup our main web module to have the H5VCC API injected into it.
   DCHECK(!ContainsKey(options_.web_module_options.injected_window_attributes,
                       "h5vcc"));
@@ -407,30 +418,27 @@
 
   // Wait until after the old WebModule is destroyed before setting the navigate
   // time so that it won't be included in the time taken to load the URL.
+  ++navigate_count_;
   navigate_time_ = base::TimeTicks::Now().ToInternalValue();
 
   // Show a splash screen while we're waiting for the web page to load.
   const math::Size& viewport_size = GetViewportSize();
 
   DestroySplashScreen(base::TimeDelta());
-  base::optional<std::string> key = SplashScreenCache::GetKeyForStartUrl(url);
-  if (fallback_splash_screen_url_ ||
-      (key && splash_screen_cache_->IsSplashScreenCached(*key))) {
-    // Create the splash screen layer.
-    if (render_tree_combiner_) {
-      splash_screen_layer_ =
-          render_tree_combiner_->CreateLayer(kSplashScreenZIndex);
+  if (options_.enable_splash_screen_on_reloads || navigate_count_ == 1) {
+    base::optional<std::string> key = SplashScreenCache::GetKeyForStartUrl(url);
+    if (fallback_splash_screen_url_ ||
+        (key && splash_screen_cache_->IsSplashScreenCached(*key))) {
+      splash_screen_.reset(new SplashScreen(
+          application_state_,
+          base::Bind(&BrowserModule::QueueOnSplashScreenRenderTreeProduced,
+                     base::Unretained(this)),
+          &network_module_, viewport_size, GetResourceProvider(),
+          kLayoutMaxRefreshFrequencyInHz, fallback_splash_screen_url_, url,
+          splash_screen_cache_.get(),
+          base::Bind(&BrowserModule::DestroySplashScreen, weak_this_)));
+      lifecycle_observers_.AddObserver(splash_screen_.get());
     }
-
-    splash_screen_.reset(new SplashScreen(
-        application_state_,
-        base::Bind(&BrowserModule::QueueOnSplashScreenRenderTreeProduced,
-                   base::Unretained(this)),
-        &network_module_, viewport_size, GetResourceProvider(),
-        kLayoutMaxRefreshFrequencyInHz, fallback_splash_screen_url_, url,
-        splash_screen_cache_.get(),
-        base::Bind(&BrowserModule::DestroySplashScreen, weak_this_)));
-    lifecycle_observers_.AddObserver(splash_screen_.get());
   }
 
   // Create new WebModule.
@@ -594,8 +602,7 @@
   if (splash_screen_ && !splash_screen_->ShutdownSignaled()) {
     splash_screen_->Shutdown();
   }
-  if (application_state_ == base::kApplicationStatePreloading ||
-      !render_tree_combiner_ || !main_web_module_layer_) {
+  if (application_state_ == base::kApplicationStatePreloading) {
     return;
   }
 
@@ -610,7 +617,7 @@
   renderer_submission.on_rasterized_callback = base::Bind(
       &BrowserModule::OnRendererSubmissionRasterized, base::Unretained(this));
   if (!splash_screen_) {
-    render_tree_combiner_->SetTimelineLayer(main_web_module_layer_.get());
+    render_tree_combiner_.SetTimelineLayer(main_web_module_layer_.get());
   }
   main_web_module_layer_->Submit(renderer_submission);
 
@@ -628,7 +635,7 @@
   DCHECK_EQ(MessageLoop::current(), self_message_loop_);
 
   if (application_state_ == base::kApplicationStatePreloading ||
-      !render_tree_combiner_ || !splash_screen_layer_) {
+      !splash_screen_) {
     return;
   }
 
@@ -654,7 +661,7 @@
 
   renderer_submission.on_rasterized_callback = base::Bind(
       &BrowserModule::OnRendererSubmissionRasterized, base::Unretained(this));
-  render_tree_combiner_->SetTimelineLayer(splash_screen_layer_.get());
+  render_tree_combiner_.SetTimelineLayer(splash_screen_layer_.get());
   splash_screen_layer_->Submit(renderer_submission);
 
 #if defined(ENABLE_SCREENSHOT)
@@ -750,8 +757,7 @@
   TRACE_EVENT0("cobalt::browser",
                "BrowserModule::OnDebugConsoleRenderTreeProduced()");
   DCHECK_EQ(MessageLoop::current(), self_message_loop_);
-  if (application_state_ == base::kApplicationStatePreloading ||
-      !render_tree_combiner_ || !debug_console_layer_) {
+  if (application_state_ == base::kApplicationStatePreloading) {
     return;
   }
 
@@ -967,18 +973,16 @@
   }
   if (splash_screen_) {
     lifecycle_observers_.RemoveObserver(splash_screen_.get());
-  }
-  if (splash_screen_layer_) {
-    if (!close_time.is_zero()) {
+    if (!close_time.is_zero() && renderer_module_) {
       // Ensure that the renderer renders each frame up until the window.close()
       // is called on the splash screen's timeline, in order to ensure that the
       // splash screen shutdown transition plays out completely.
       renderer_module_->pipeline()->TimeFence(close_time);
     }
-    splash_screen_layer_.reset(NULL);
+    splash_screen_layer_->Reset();
     SubmitCurrentRenderTreeToRenderer();
+    splash_screen_.reset(NULL);
   }
-  splash_screen_.reset(NULL);
 }
 
 #if defined(ENABLE_WEBDRIVER)
@@ -1208,16 +1212,6 @@
       RendererModuleWithCameraOptions(options_.renderer_module_options,
                                       input_device_manager_->camera_3d())));
 
-  render_tree_combiner_.reset(new RenderTreeCombiner());
-  // Create the main web module layer.
-  main_web_module_layer_ =
-      render_tree_combiner_->CreateLayer(kMainWebModuleZIndex);
-// Create the debug console layer.
-#if defined(ENABLE_DEBUG_CONSOLE)
-  debug_console_layer_ =
-      render_tree_combiner_->CreateLayer(kDebugConsoleZIndex);
-#endif
-
 #if defined(ENABLE_SCREENSHOT)
   screen_shot_writer_.reset(new ScreenShotWriter(renderer_module_->pipeline()));
 #endif  // defined(ENABLE_SCREENSHOT)
@@ -1273,15 +1267,9 @@
 
   // Clear out the render tree combiner so that it doesn't hold on to any
   // render tree resources either.
-  if (main_web_module_layer_) {
-    main_web_module_layer_->Reset();
-  }
-  if (splash_screen_layer_) {
-    splash_screen_layer_->Reset();
-  }
-  if (debug_console_layer_) {
-    debug_console_layer_->Reset();
-  }
+  main_web_module_layer_->Reset();
+  splash_screen_layer_->Reset();
+  debug_console_layer_->Reset();
 
 #if defined(ENABLE_GPU_ARRAY_BUFFER_ALLOCATOR)
   // Note that the following function call will leak the GPU memory allocated.
@@ -1419,8 +1407,12 @@
 }
 
 void BrowserModule::SubmitCurrentRenderTreeToRenderer() {
+  if (!renderer_module_) {
+    return;
+  }
+
   base::optional<renderer::Submission> submission =
-      render_tree_combiner_->GetCurrentSubmission();
+      render_tree_combiner_.GetCurrentSubmission();
   if (submission) {
     renderer_module_->pipeline()->Submit(*submission);
   }
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index 32ec219..6f95f5c 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -75,8 +75,8 @@
         : web_module_options(web_options),
           command_line_auto_mem_settings(
               memory_settings::AutoMemSettings::kTypeCommandLine),
-          build_auto_mem_settings(
-              memory_settings::AutoMemSettings::kTypeBuild) {}
+          build_auto_mem_settings(memory_settings::AutoMemSettings::kTypeBuild),
+          enable_splash_screen_on_reloads(true) {}
     network::NetworkModule::Options network_module_options;
     renderer::RendererModule::Options renderer_module_options;
     storage::StorageManager::Options storage_manager_options;
@@ -89,6 +89,7 @@
     memory_settings::AutoMemSettings build_auto_mem_settings;
     base::optional<GURL> fallback_splash_screen_url;
     base::optional<math::Size> requested_viewport_size;
+    bool enable_splash_screen_on_reloads;
   };
 
   // Type for a collection of URL handler callbacks that can potentially handle
@@ -393,7 +394,7 @@
   network::NetworkModule network_module_;
 
   // Manages the three render trees, combines and renders them.
-  scoped_ptr<RenderTreeCombiner> render_tree_combiner_;
+  RenderTreeCombiner render_tree_combiner_;
   scoped_ptr<RenderTreeCombiner::Layer> main_web_module_layer_;
   scoped_ptr<RenderTreeCombiner::Layer> debug_console_layer_;
   scoped_ptr<RenderTreeCombiner::Layer> splash_screen_layer_;
@@ -423,6 +424,9 @@
   // which could occur on navigation.
   base::Closure web_module_recreated_callback_;
 
+  // The total number of navigations that have occurred.
+  int navigate_count_;
+
   // The time when a URL navigation starts. This is recorded after the previous
   // WebModule is destroyed.
   base::CVal<int64> navigate_time_;
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 4d028b2..12bbc04 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -26,6 +26,13 @@
 // Switches different debug console modes: on | hud | off
 const char kDebugConsoleMode[] = "debug_console";
 
+// Enables/disables animations on animated images (e.g. animated WebP).
+const char kDisableImageAnimations[] = "disable_image_animations";
+
+// Disables the splash screen on reloads; instead it will only appear on the
+// first navigate.
+const char kDisableSplashScreenOnReloads[] = "disable_splash_screen_on_reloads";
+
 // Do not create the WebDriver server.
 const char kDisableWebDriver[] = "disable_webdriver";
 
@@ -119,9 +126,6 @@
 // Enables memory tracking by installing the memory tracker on startup.
 const char kMemoryTracker[] = "memory_tracker";
 
-// Enables/disables animations on animated images (e.g. animated WebP).
-const char kDisableImageAnimations[] = "disable_image_animations";
-
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
 // If toggled, framerate statistics will be printed to stdout after each
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index c9edfc3..dd36528 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -22,6 +22,8 @@
 #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 extern const char kAudioDecoderStub[];
 extern const char kDebugConsoleMode[];
+extern const char kDisableImageAnimations[];
+extern const char kDisableSplashScreenOnReloads[];
 extern const char kDisableWebDriver[];
 extern const char kDisableWebmVp9[];
 extern const char kExtraWebFileDir[];
@@ -44,7 +46,6 @@
 extern const char kVideoDecoderStub[];
 extern const char kWebDriverListenIp[];
 extern const char kWebDriverPort[];
-extern const char kDisableImageAnimations[];
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
 extern const char kDisableNavigationWhitelist[];
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 3e535a7..36f609f 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-102542
\ No newline at end of file
+103164
\ No newline at end of file
diff --git a/src/cobalt/build/build_config.h b/src/cobalt/build/build_config.h
index e743e5f..527f9bc 100644
--- a/src/cobalt/build/build_config.h
+++ b/src/cobalt/build/build_config.h
@@ -51,11 +51,10 @@
         //     COBALT_MEDIA_BUFFER_VIDEO_BUDGET_1080P
 
 #if COBALT_ENCRYPTED_MEDIA_EXTENSION_ENABLE_KEY_STATUSES_UPDATE
-#if SB_API_VERSION < SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION < 6
 #error COBALT_ENCRYPTED_MEDIA_EXTENSION_ENABLE_KEY_STATUSES_UPDATE requires \
-           that SB_API_VERSION is greater than or equal to \
-           SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
-#endif  // SB_API_VERSION < SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+           that SB_API_VERSION is greater than or equal to 6
+#endif  // SB_API_VERSION < 6
 #endif  // COBALT_ENCRYPTED_MEDIA_EXTENSION_ENABLE_KEY_STATUSES_UPDATE
 
 #endif  // COBALT_BUILD_BUILD_CONFIG_H_
diff --git a/src/cobalt/build/config/base.gypi b/src/cobalt/build/config/base.gypi
index 1f837c1..867adb5 100644
--- a/src/cobalt/build/config/base.gypi
+++ b/src/cobalt/build/config/base.gypi
@@ -466,11 +466,14 @@
     # as expected, rather than requiring it to be set for each platform.
     #'javascript_engine%': 'mozjs-45',
 
-    # Disable jit and run in interpreter-only mode by default. It can be set to
-    # 1 to run in jit mode.  We have found that disabling jit often results in
-    # faster JavaScript execution and lower memory usage.
+    # Disable JIT and run in interpreter-only mode by default. It can be set
+    # to 1 to run in JIT mode.  For SpiderMonkey in particular, we have found
+    # that disabling JIT often results in faster JavaScript execution and
+    # lower memory usage.
     # Setting this to 1 on a platform or engine for which there is no JIT
     # implementation is a no-op.
+    # Setting this to 0 on an engine for which there is a JIT implementation
+    # is a platform configuration error.
     'cobalt_enable_jit%': 0,
 
     # Can be set to enable zealous garbage collection, if |javascript_engine|
diff --git a/src/cobalt/dom/eme/media_key_session.cc b/src/cobalt/dom/eme/media_key_session.cc
index b2d8205..11c2f98 100644
--- a/src/cobalt/dom/eme/media_key_session.cc
+++ b/src/cobalt/dom/eme/media_key_session.cc
@@ -37,11 +37,11 @@
     : ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)),
       drm_system_(drm_system),
       drm_system_session_(drm_system->CreateSession(
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
           base::Bind(&MediaKeySession::OnSessionUpdateKeyStatuses,
                      base::AsWeakPtr(this))
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
-              )),
+#endif  // SB_API_VERSION >= 6
+                     )),
       script_value_factory_(script_value_factory),
       uninitialized_(true),
       callable_(false),
diff --git a/src/cobalt/input/input_device_manager_desktop.cc b/src/cobalt/input/input_device_manager_desktop.cc
index d49fb15..983da10 100644
--- a/src/cobalt/input/input_device_manager_desktop.cc
+++ b/src/cobalt/input/input_device_manager_desktop.cc
@@ -77,7 +77,7 @@
                    static_cast<uint32_t>(kSbKeyModifiersShift) ==
                        system_window::InputEvent::kShiftKey,
                Mismatched_modifier_enums);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
 COMPILE_ASSERT(static_cast<uint32_t>(kSbKeyModifiersPointerButtonLeft) ==
                        system_window::InputEvent::kLeftButton &&
                    static_cast<uint32_t>(kSbKeyModifiersPointerButtonRight) ==
@@ -89,7 +89,7 @@
                    static_cast<uint32_t>(kSbKeyModifiersPointerButtonForward) ==
                        system_window::InputEvent::kForwardButton,
                Mismatched_modifier_enums);
-#endif
+#endif  // SB_API_VERSION >= 6
 
 void UpdateEventModifierInit(const system_window::InputEvent* input_event,
                              EventModifierInit* event) {
@@ -221,7 +221,7 @@
       break;
   }
   pointer_event.set_pointer_id(input_event->device_id());
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   pointer_event.set_width(value_or(input_event->size().x(), 0.0f));
   pointer_event.set_height(value_or(input_event->size().y(), 0.0f));
   pointer_event.set_pressure(value_or(input_event->pressure(),
@@ -230,7 +230,7 @@
       value_or(static_cast<float>(input_event->tilt().x()), 0.0f));
   pointer_event.set_tilt_y(
       value_or(static_cast<float>(input_event->tilt().y()), 0.0f));
-#endif
+#endif  // SB_API_VERSION >= 6
   pointer_event.set_is_primary(true);
   pointer_event_callback_.Run(type, pointer_event);
 }
diff --git a/src/cobalt/media/base/drm_system.cc b/src/cobalt/media/base/drm_system.cc
index c3f4d23..8b5516b 100644
--- a/src/cobalt/media/base/drm_system.cc
+++ b/src/cobalt/media/base/drm_system.cc
@@ -20,7 +20,7 @@
 namespace cobalt {
 namespace media {
 
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 DrmSystem::Session::Session(
     DrmSystem* drm_system,
     SessionUpdateKeyStatusesCallback update_key_statuses_callback)
@@ -29,10 +29,10 @@
       closed_(false) {
   DCHECK(!update_key_statuses_callback_.is_null());
 }
-#else   // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#else   // SB_API_VERSION >= 6
 DrmSystem::Session::Session(DrmSystem* drm_system)
     : drm_system_(drm_system), closed_(false) {}
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 DrmSystem::Session::~Session() {
   if (id_ && !closed_) {
@@ -77,10 +77,10 @@
     : wrapped_drm_system_(SbDrmCreateSystem(key_system, this,
                                             OnSessionUpdateRequestGeneratedFunc,
                                             OnSessionUpdatedFunc
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
                                             ,
                                             OnSessionKeyStatusesChangedFunc
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
                                             )),
       message_loop_(MessageLoop::current()),
       ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
@@ -92,17 +92,17 @@
 
 DrmSystem::~DrmSystem() { SbDrmDestroySystem(wrapped_drm_system_); }
 
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 scoped_ptr<DrmSystem::Session> DrmSystem::CreateSession(
     SessionUpdateKeyStatusesCallback session_update_key_statuses_callback) {
   return make_scoped_ptr(
       new Session(this, session_update_key_statuses_callback));
 }
-#else   // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#else   // SB_API_VERSION >= 6
 scoped_ptr<DrmSystem::Session> DrmSystem::CreateSession() {
   return make_scoped_ptr(new Session(this));
 }
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 void DrmSystem::GenerateSessionUpdateRequest(
     Session* session, const std::string& type, const uint8_t* init_data,
@@ -226,7 +226,7 @@
   ticket_to_session_update_map_.erase(session_update_iterator);
 }
 
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 void DrmSystem::OnSessionKeyStatusChanged(
     const std::string& session_id, const std::vector<std::string>& key_ids,
     const std::vector<SbDrmKeyStatus>& key_statuses) {
@@ -241,7 +241,7 @@
 
   session->update_key_statuses_callback().Run(key_ids, key_statuses);
 }
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 // static
 void DrmSystem::OnSessionUpdateRequestGeneratedFunc(
@@ -283,7 +283,7 @@
                             drm_system->weak_this_, ticket, succeeded));
 }
 
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 // static
 void DrmSystem::OnSessionKeyStatusesChangedFunc(
     SbDrmSystem wrapped_drm_system, void* context, const void* session_id,
@@ -315,7 +315,7 @@
       base::Bind(&DrmSystem::OnSessionKeyStatusChanged, drm_system->weak_this_,
                  session_id_copy, key_ids_copy, key_statuses_copy));
 }
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 }  // namespace media
 }  // namespace cobalt
diff --git a/src/cobalt/media/base/drm_system.h b/src/cobalt/media/base/drm_system.h
index b0a26ff..f60ad9d 100644
--- a/src/cobalt/media/base/drm_system.h
+++ b/src/cobalt/media/base/drm_system.h
@@ -40,11 +40,11 @@
   typedef base::Callback<void()> SessionUpdateRequestDidNotGenerateCallback;
   typedef base::Callback<void()> SessionUpdatedCallback;
   typedef base::Callback<void()> SessionDidNotUpdateCallback;
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
   typedef base::Callback<void(const std::vector<std::string>& key_ids,
                               const std::vector<SbDrmKeyStatus>& key_statuses)>
       SessionUpdateKeyStatusesCallback;
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
   // Flyweight that provides RAII semantics for sessions.
   // Most of logic is implemented by |DrmSystem| and thus sessions must be
@@ -89,31 +89,31 @@
    private:
     // Private API for |DrmSystem|.
     Session(DrmSystem* drm_system
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
             ,
             SessionUpdateKeyStatusesCallback update_key_statuses_callback
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
             );  // NOLINT(whitespace/parens)
     void set_id(const std::string& id) { id_ = id; }
     const SessionUpdateRequestGeneratedCallback&
     update_request_generated_callback() const {
       return update_request_generated_callback_;
     }
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
     const SessionUpdateKeyStatusesCallback& update_key_statuses_callback()
         const {
       return update_key_statuses_callback_;
     }
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
     DrmSystem* const drm_system_;
     bool closed_;
     base::optional<std::string> id_;
     // Supports spontaneous invocations of |SbDrmSessionUpdateRequestFunc|.
     SessionUpdateRequestGeneratedCallback update_request_generated_callback_;
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
     SessionUpdateKeyStatusesCallback update_key_statuses_callback_;
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
     friend class DrmSystem;
 
@@ -126,9 +126,9 @@
   SbDrmSystem wrapped_drm_system() { return wrapped_drm_system_; }
 
   scoped_ptr<Session> CreateSession(
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
       SessionUpdateKeyStatusesCallback session_update_key_statuses_callback
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
       );  // NOLINT(whitespace/parens)
 
  private:
@@ -169,11 +169,11 @@
       int ticket, const base::optional<std::string>& session_id,
       scoped_array<uint8> message, int message_size);
   void OnSessionUpdated(int ticket, bool succeeded);
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
   void OnSessionKeyStatusChanged(
       const std::string& session_id, const std::vector<std::string>& key_ids,
       const std::vector<SbDrmKeyStatus>& key_statuses);
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
   // Called on any thread, parameters need to be copied immediately.
   static void OnSessionUpdateRequestGeneratedFunc(
@@ -184,12 +184,12 @@
                                    void* context, int ticket,
                                    const void* session_id,
                                    int session_id_length, bool succeeded);
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
   static void OnSessionKeyStatusesChangedFunc(
       SbDrmSystem wrapped_drm_system, void* context, const void* session_id,
       int session_id_size, int number_of_keys, const SbDrmKeyId* key_ids,
       const SbDrmKeyStatus* key_statuses);
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
   const SbDrmSystem wrapped_drm_system_;
   MessageLoop* const message_loop_;
diff --git a/src/cobalt/media/base/sbplayer_pipeline.cc b/src/cobalt/media/base/sbplayer_pipeline.cc
index bf397d8..4844a7d 100644
--- a/src/cobalt/media/base/sbplayer_pipeline.cc
+++ b/src/cobalt/media/base/sbplayer_pipeline.cc
@@ -705,7 +705,7 @@
 void SbPlayerPipeline::OnDemuxerSeeked(PipelineStatus status) {
   DCHECK(message_loop_->BelongsToCurrentThread());
 
-  if (status == PIPELINE_OK) {
+  if (status == PIPELINE_OK && player_) {
     player_->Seek(seek_time_);
   }
 }
diff --git a/src/cobalt/media/base/starboard_player.cc b/src/cobalt/media/base/starboard_player.cc
index 68bb5ec..4582565 100644
--- a/src/cobalt/media/base/starboard_player.cc
+++ b/src/cobalt/media/base/starboard_player.cc
@@ -185,12 +185,12 @@
   }
 
   SbPlayerWriteSample(player_, DemuxerStreamTypeToSbMediaType(type),
-#if SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#if SB_API_VERSION >= 6
                       allocations.buffers(), allocations.buffer_sizes(),
-#else   // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#else   // SB_API_VERSION >= 6
                       const_cast<const void**>(allocations.buffers()),
                       const_cast<int*>(allocations.buffer_sizes()),
-#endif  // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#endif  // SB_API_VERSION >= 6
                       allocations.number_of_buffers(),
                       TimeDeltaToSbMediaTime(buffer->timestamp()),
                       type == DemuxerStream::VIDEO ? &video_info : NULL,
diff --git a/src/cobalt/media/base/starboard_utils.cc b/src/cobalt/media/base/starboard_utils.cc
index f184538..b5cf1c6 100644
--- a/src/cobalt/media/base/starboard_utils.cc
+++ b/src/cobalt/media/base/starboard_utils.cc
@@ -68,7 +68,7 @@
   audio_header.block_alignment = 4;
   audio_header.bits_per_sample = audio_decoder_config.bits_per_channel();
 
-#if SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#if SB_API_VERSION >= 6
   audio_header.audio_specific_config_size =
       static_cast<uint16_t>(audio_decoder_config.extra_data().size());
   if (audio_header.audio_specific_config_size == 0) {
@@ -76,7 +76,7 @@
   } else {
     audio_header.audio_specific_config = &audio_decoder_config.extra_data()[0];
   }
-#else   // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#else   // SB_API_VERSION >= 6
   audio_header.audio_specific_config_size = static_cast<uint16_t>(
       std::min(audio_decoder_config.extra_data().size(),
                sizeof(audio_header.audio_specific_config)));
@@ -85,7 +85,7 @@
                  &audio_decoder_config.extra_data()[0],
                  audio_header.audio_specific_config_size);
   }
-#endif  // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#endif  // SB_API_VERSION >= 6
 
   return audio_header;
 }
diff --git a/src/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc b/src/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc
index 6043afa..f845dc8 100644
--- a/src/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc
+++ b/src/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc
@@ -139,6 +139,13 @@
   backend::RenderTargetEGL* render_target_egl =
       base::polymorphic_downcast<backend::RenderTargetEGL*>(
           render_target.get());
+
+  // Skip rendering if we lost the surface. This can happen just before suspend
+  // on Android, so now we're just waiting for the suspend to clean up.
+  if (render_target_egl->is_surface_bad()) {
+    return;
+  }
+
   backend::GraphicsContextEGL::ScopedMakeCurrent scoped_make_current(
       graphics_context_, render_target_egl);
 
diff --git a/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc b/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
index 8df6fd1..0812b2e 100644
--- a/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
+++ b/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
@@ -489,7 +489,7 @@
       } break;
       case Image::YUV_2PLANE_BT709: {
         std::vector<TextureInfo> texture_infos;
-#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#if SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
         switch (image.textures[0].texture->GetFormat()) {
           case GL_ALPHA:
             texture_infos.push_back(TextureInfo("y", "a"));
@@ -514,10 +514,10 @@
           default:
             NOTREACHED();
         }
-#else  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#else  // SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
         texture_infos.push_back(TextureInfo("y", "a"));
         texture_infos.push_back(TextureInfo("uv", "ba"));
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
         result = MakeBlitProgram(
             color_matrix, texture_infos,
             CreateFragmentShader(texture_target, texture_infos));
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
index ce39cca..e7e9075 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -149,13 +149,10 @@
 #if SB_HAS(GRAPHICS)
 namespace {
 
-#if SB_API_VERSION < SB_DECODE_TARGET_PLANES_FOR_FORMAT
+#if SB_API_VERSION < 6
 int PlanesPerFormat(SbDecodeTargetFormat format) {
   switch (format) {
     case kSbDecodeTargetFormat1PlaneRGBA:
-#if SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
-    case kSbDecodeTargetFormat1PlaneUYVY:
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
       return 1;
     case kSbDecodeTargetFormat1PlaneBGRA:
       return 1;
@@ -168,26 +165,26 @@
       return 0;
   }
 }
-#endif  // SB_API_VERSION < SB_DECODE_TARGET_PLANES_FOR_FORMAT
+#endif  // SB_API_VERSION < 6
 
 uint32_t DecodeTargetFormatToGLFormat(SbDecodeTargetFormat format, int plane,
     const SbDecodeTargetInfoPlane* plane_info) {
   switch (format) {
     case kSbDecodeTargetFormat1PlaneRGBA:
-#if SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
     // For UYVY, we will use a fragment shader where R = the first U, G = Y,
     // B = the second U, and A = V.
     case kSbDecodeTargetFormat1PlaneUYVY:
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
     {
       DCHECK_EQ(0, plane);
       return GL_RGBA;
     } break;
     case kSbDecodeTargetFormat2PlaneYUVNV12: {
       DCHECK_LT(plane, 2);
-#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#if SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
       // If this DCHECK fires, please set gl_texture_format, introduced
-      // in Starboard SB_DECODE_TARGET_FORMAT_VERSION.
+      // in Starboard SB_DECODE_TARGET_PLANE_FORMAT_VERSION.
       //
       // You probably want to set it to GL_ALPHA on plane 0 (luma) and
       // GL_LUMINANCE_ALPHA on plane 1 (chroma), which was the default before.
@@ -209,7 +206,7 @@
           CHECK(false);
           return 0;
       }
-#else  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#else  // SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
       switch (plane) {
         case 0:
           return GL_ALPHA;
@@ -219,7 +216,7 @@
           NOTREACHED();
           return GL_RGBA;
       }
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
     } break;
     case kSbDecodeTargetFormat3PlaneYUVI420: {
       DCHECK_LT(plane, 3);
@@ -283,11 +280,11 @@
       new DecodeTargetReferenceCounted(decode_target));
 
   // There is limited format support at this time.
-#if SB_API_VERSION >= SB_DECODE_TARGET_PLANES_FOR_FORMAT
+#if SB_API_VERSION >= 6
   int planes_per_format = SbDecodeTargetNumberOfPlanesForFormat(info.format);
 #else
   int planes_per_format = PlanesPerFormat(info.format);
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_PLANES_FOR_FORMAT
+#endif  // SB_API_VERSION >= 6
 
   for (int i = 0; i < planes_per_format; ++i) {
     const SbDecodeTargetInfoPlane& plane = info.planes[i];
@@ -318,11 +315,11 @@
     // this in as supplementary data, as the |texture| object only knows that
     // it is RGBA.
     base::optional<AlternateRgbaFormat> alternate_rgba_format;
-#if SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
     if (info.format == kSbDecodeTargetFormat1PlaneUYVY) {
       alternate_rgba_format = AlternateRgbaFormat_UYVY;
     }
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
     planes.push_back(make_scoped_refptr(new HardwareFrontendImage(
         texture.Pass(), alpha_format, cobalt_context_, gr_context_,
diff --git a/src/cobalt/script/engine.gyp b/src/cobalt/script/engine.gyp
index d5423b8..342bcb5 100644
--- a/src/cobalt/script/engine.gyp
+++ b/src/cobalt/script/engine.gyp
@@ -22,8 +22,9 @@
       'sources': [
         'javascript_engine.h',
       ],
-      'dependencies': [
-        '<(javascript_engine)/<(javascript_engine).gyp:engine',
+      'conditions': [
+        [ 'javascript_engine == "mozjs-45"', { 'dependencies': ['mozjs-45/mozjs-45.gyp:engine', ], }, ],
+        [ 'javascript_engine == "v8"', { 'dependencies': ['v8c/v8c.gyp:engine', ], }, ],
       ],
     },
     {
diff --git a/src/cobalt/script/engine_variables.gypi b/src/cobalt/script/engine_variables.gypi
index d60625c..54fe07e 100644
--- a/src/cobalt/script/engine_variables.gypi
+++ b/src/cobalt/script/engine_variables.gypi
@@ -15,5 +15,6 @@
 {
   'includes': [
     'mozjs-45/mozjs-45_variables.gypi',
+    'v8c/v8c_variables.gypi',
   ],
 }
diff --git a/src/cobalt/script/global_environment.h b/src/cobalt/script/global_environment.h
index 039f05d..9676f73 100644
--- a/src/cobalt/script/global_environment.h
+++ b/src/cobalt/script/global_environment.h
@@ -92,7 +92,8 @@
   virtual void EnableEval() = 0;
 
   // Disable just-in-time compilation of JavaScript source code to native
-  // code.  Calling this is a no-op if JIT was not enabled in the first place.
+  // code.  Calling this is a no-op if JIT was not enabled in the first place,
+  // or if the engine does not support disabling JIT.
   virtual void DisableJit() = 0;
 
   // Set a callback that will be fired whenever eval() or a Function()
diff --git a/src/cobalt/script/v8c/v8c.cc b/src/cobalt/script/v8c/v8c.cc
new file mode 100644
index 0000000..993cc58
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c.cc
@@ -0,0 +1,119 @@
+// Copyright 2017 Google Inc. 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 <iostream>
+
+#include "base/command_line.h"
+#include "base/file_path.h"
+#include "base/string_util.h"
+#include "cobalt/base/wrap_main.h"
+#include "cobalt/script/source_code.h"
+#include "cobalt/script/standalone_javascript_runner.h"
+#include "cobalt/script/v8c/v8c_global_environment.h"
+#include "v8/include/libplatform/libplatform.h"
+#include "v8/include/v8.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+namespace {
+
+void Print(const v8::FunctionCallbackInfo<v8::Value>& args) {
+  v8::Isolate* isolate = args.GetIsolate();
+  v8::HandleScope scope(isolate);
+
+  std::vector<std::string> string_args;
+  for (int i = 0; i < args.Length(); i++) {
+    v8::TryCatch try_catch(args.GetIsolate());
+    v8::Local<v8::Value> arg = args[i];
+    v8::Local<v8::String> string;
+
+    if (arg->IsSymbol()) {
+      arg = v8::Local<v8::Symbol>::Cast(arg)->Name();
+    }
+    if (!arg->ToString(args.GetIsolate()->GetCurrentContext())
+             .ToLocal(&string)) {
+      try_catch.ReThrow();
+      return;
+    }
+
+    v8::String::Utf8Value utf8_value(args.GetIsolate(), string);
+    string_args.push_back(*utf8_value);
+  }
+
+  std::string joined = JoinString(string_args, ' ');
+  std::cout << joined << std::endl;
+}
+
+void SetupBindings(GlobalEnvironment* global_environment) {
+  V8cGlobalEnvironment* v8c_global_environment =
+      static_cast<V8cGlobalEnvironment*>(global_environment);
+  v8::Isolate* isolate = v8c_global_environment->isolate();
+  v8::Isolate::Scope isolate_scope(isolate);
+  v8::HandleScope handle_scope(isolate);
+  auto context = v8c_global_environment->context();
+  v8::Context::Scope context_scope(context);
+  context->Global()->Set(
+      v8::String::NewFromUtf8(isolate, "print", v8::NewStringType::kNormal)
+          .ToLocalChecked(),
+      v8::Function::New(isolate, Print));
+}
+
+int V8cMain(int argc, char** argv) {
+  cobalt::script::StandaloneJavascriptRunner standalone_runner;
+  GlobalEnvironment* global_environment =
+      standalone_runner.global_environment().get();
+  SetupBindings(global_environment);
+  if (argc > 1) {
+    // Command line arguments will be flag-value pairs of the form
+    // -f filename
+    // and
+    // -e "inline script"
+    // and will be evaluated in order.
+    for (int i = 1; (i + 1) < argc; ++i) {
+      if (std::string(argv[i]) == "-f") {
+        std::string filename = std::string(argv[i + 1]);
+        // Execute source file.
+        FilePath source_file(filename);
+        standalone_runner.ExecuteFile(source_file);
+        ++i;
+      } else if (std::string(argv[i]) == "-e") {
+        // Execute inline script.
+        scoped_refptr<SourceCode> source = SourceCode::CreateSourceCode(
+            argv[i + 1], base::SourceLocation("[stdin]", 1, 1));
+
+        // Execute the script and get the results of execution.
+        std::string result;
+        bool success = global_environment->EvaluateScript(source, &result);
+        // Echo the results to stdout.
+        if (!success) {
+          std::cout << "Exception: ";
+        }
+        std::cout << result << std::endl;
+        ++i;
+      }
+    }
+  } else {
+    standalone_runner.RunInteractive();
+  }
+
+  return 0;
+}
+
+}  // namespace
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
+
+COBALT_WRAP_SIMPLE_MAIN(cobalt::script::v8c::V8cMain);
diff --git a/src/cobalt/script/v8c/v8c.gyp b/src/cobalt/script/v8c/v8c.gyp
new file mode 100644
index 0000000..dc9b560
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c.gyp
@@ -0,0 +1,70 @@
+# Copyright 2017 Google Inc. 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.
+
+{
+  'targets': [
+    {
+      'target_name': 'engine',
+      'type': 'static_library',
+      'sources': [
+        'v8c_engine.cc',
+        'v8c_engine.h',
+        'v8c_global_environment.cc',
+        'v8c_global_environment.h',
+        'v8c_source_code.cc',
+        'v8c_source_code.h',
+      ],
+      'dependencies': [
+        '<(DEPTH)/v8/src/v8.gyp:v8',
+        '<(DEPTH)/v8/src/v8.gyp:v8_libplatform',
+      ],
+      'defines': [
+        'ENGINE_SUPPORTS_INT64',
+        'ENGINE_SUPPORTS_JIT',
+      ],
+      'all_dependent_settings': {
+        'defines': [
+          'ENGINE_SUPPORTS_INDEXED_DELETERS',
+          'ENGINE_SUPPORTS_INT64',
+          'ENGINE_SUPPORTS_STACK_TRACE_COLUMNS',
+          # TODO: Remove this when exact rooting and generational GC is enabled.
+          'ENGINE_USES_CONSERVATIVE_ROOTING',
+        ],
+      },
+      # V8 always requires JIT.  |cobalt_enable_jit| must be set to true to
+      # use V8.  Failure to do will result in a build failure.
+      'conditions' :[
+        ['cobalt_enable_jit == 0', {
+          'defines': [ '<(gyp_static_assert_false)', ],
+        }],
+      ],
+    },
+
+    {
+      # Standalone shell executable for V8 within Cobalt.
+      'target_name': 'v8c',
+      'type': '<(final_executable_type)',
+      'sources': [
+        'v8c.cc',
+      ],
+      'dependencies': [
+        ':engine',
+        '<(DEPTH)/cobalt/base/base.gyp:base',
+        '<(DEPTH)/cobalt/script/script.gyp:standalone_javascript_runner',
+        '<(DEPTH)/v8/src/v8.gyp:v8',
+        '<(DEPTH)/v8/src/v8.gyp:v8_libplatform',
+      ],
+    },
+  ],
+}
diff --git a/src/cobalt/script/v8c/v8c_engine.cc b/src/cobalt/script/v8c/v8c_engine.cc
new file mode 100644
index 0000000..2c928bc
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_engine.cc
@@ -0,0 +1,147 @@
+// Copyright 2017 Google Inc. 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/v8c_engine.h"
+
+#include <algorithm>
+#include <string>
+
+#include "base/debug/trace_event.h"
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "cobalt/base/c_val.h"
+#include "cobalt/browser/stack_size_constants.h"
+#include "cobalt/script/v8c/v8c_global_environment.h"
+#include "starboard/once.h"
+#include "v8/include/libplatform/libplatform.h"
+#include "v8/include/v8.h"
+
+namespace cobalt {
+namespace script {
+
+namespace v8c {
+namespace {
+
+// Trigger garbage collection this many seconds after the last one.
+const int kGarbageCollectionIntervalSeconds = 60;
+
+SbOnceControl g_js_init_once_control = SB_ONCE_INITIALIZER;
+v8::Platform* g_platform = nullptr;
+v8::ArrayBuffer::Allocator* g_array_buffer_allocator = nullptr;
+
+void ShutDown(void*) {
+  v8::V8::Dispose();
+  v8::V8::ShutdownPlatform();
+
+  DCHECK(g_platform);
+  delete g_platform;
+  g_platform = nullptr;
+
+  DCHECK(g_array_buffer_allocator);
+  delete g_array_buffer_allocator;
+  g_array_buffer_allocator = nullptr;
+}
+
+void InitializeAndRegisterShutDownOnce() {
+  // TODO: Initialize V8 ICU stuff here as well.
+  g_platform = v8::platform::CreateDefaultPlatform();
+  v8::V8::InitializePlatform(g_platform);
+  v8::V8::Initialize();
+  g_array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
+
+  base::AtExitManager::RegisterCallback(ShutDown, nullptr);
+}
+
+}  // namespace
+
+V8cEngine::V8cEngine(const Options& options)
+    : accumulated_extra_memory_cost_(0), options_(options) {
+  TRACE_EVENT0("cobalt::script", "V8cEngine::V8cEngine()");
+  SbOnce(&g_js_init_once_control, InitializeAndRegisterShutDownOnce);
+  DCHECK(g_platform);
+  DCHECK(g_array_buffer_allocator);
+
+  v8::Isolate::CreateParams params;
+  params.array_buffer_allocator = g_array_buffer_allocator;
+
+  isolate_ = v8::Isolate::New(params);
+  CHECK(isolate_);
+
+  if (MessageLoop::current()) {
+    gc_timer_.Start(
+        FROM_HERE,
+        base::TimeDelta::FromSeconds(kGarbageCollectionIntervalSeconds), this,
+        &V8cEngine::TimerGarbageCollect);
+  }
+}
+
+V8cEngine::~V8cEngine() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  isolate_->Dispose();
+  isolate_ = nullptr;
+}
+
+scoped_refptr<GlobalEnvironment> V8cEngine::CreateGlobalEnvironment() {
+  TRACE_EVENT0("cobalt::script", "V8cEngine::CreateGlobalEnvironment()");
+  DCHECK(thread_checker_.CalledOnValidThread());
+  return new V8cGlobalEnvironment(isolate_);
+}
+
+void V8cEngine::CollectGarbage() {
+  TRACE_EVENT0("cobalt::script", "V8cEngine::CollectGarbage()");
+  DCHECK(thread_checker_.CalledOnValidThread());
+  NOTIMPLEMENTED();
+}
+
+void V8cEngine::ReportExtraMemoryCost(size_t bytes) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  accumulated_extra_memory_cost_ += bytes;
+
+  const bool do_collect_garbage =
+      accumulated_extra_memory_cost_ > options_.gc_threshold_bytes;
+  if (do_collect_garbage) {
+    accumulated_extra_memory_cost_ = 0;
+    CollectGarbage();
+  }
+}
+
+bool V8cEngine::RegisterErrorHandler(JavaScriptEngine::ErrorHandler handler) {
+  error_handler_ = handler;
+  return true;
+}
+
+void V8cEngine::SetGcThreshold(int64_t bytes) { NOTIMPLEMENTED(); }
+
+void V8cEngine::TimerGarbageCollect() {
+  TRACE_EVENT0("cobalt::script", "V8cEngine::TimerGarbageCollect()");
+  CollectGarbage();
+}
+
+}  // namespace v8c
+
+// static
+scoped_ptr<JavaScriptEngine> JavaScriptEngine::CreateEngine(
+    const JavaScriptEngine::Options& options) {
+  TRACE_EVENT0("cobalt::script", "JavaScriptEngine::CreateEngine()");
+  return make_scoped_ptr<JavaScriptEngine>(new v8c::V8cEngine(options));
+}
+
+// static
+size_t JavaScriptEngine::UpdateMemoryStatsAndReturnReserved() {
+  NOTIMPLEMENTED();
+  return 0;
+}
+
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/v8c/v8c_engine.h b/src/cobalt/script/v8c/v8c_engine.h
new file mode 100644
index 0000000..2962efb
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_engine.h
@@ -0,0 +1,67 @@
+// Copyright 2017 Google Inc. 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_SCRIPT_V8C_V8C_ENGINE_H_
+#define COBALT_SCRIPT_V8C_V8C_ENGINE_H_
+
+#include <vector>
+
+#include "base/threading/thread_checker.h"
+#include "base/timer.h"
+#include "cobalt/script/javascript_engine.h"
+#include "v8/include/libplatform/libplatform.h"
+#include "v8/include/v8.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+class V8cEngine : public JavaScriptEngine {
+ public:
+  explicit V8cEngine(const Options& options);
+  ~V8cEngine() override;
+
+  scoped_refptr<GlobalEnvironment> CreateGlobalEnvironment() override;
+  void CollectGarbage() override;
+  void ReportExtraMemoryCost(size_t bytes) override;
+  bool RegisterErrorHandler(JavaScriptEngine::ErrorHandler handler) override;
+  void SetGcThreshold(int64_t bytes) override;
+
+  v8::Isolate* isolate() const { return isolate_; }
+
+ private:
+  void TimerGarbageCollect();
+
+  base::ThreadChecker thread_checker_;
+
+  // An isolated instance of the V8 engine.
+  v8::Isolate* isolate_;
+
+  // The amount of externally allocated memory since last forced GC.
+  size_t accumulated_extra_memory_cost_;
+
+  // Used to trigger a garbage collection periodically.
+  base::RepeatingTimer<V8cEngine> gc_timer_;
+
+  // Used to handle javascript errors.
+  ErrorHandler error_handler_;
+
+  JavaScriptEngine::Options options_;
+};
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
+
+#endif  // COBALT_SCRIPT_V8C_V8C_ENGINE_H_
diff --git a/src/cobalt/script/v8c/v8c_global_environment.cc b/src/cobalt/script/v8c/v8c_global_environment.cc
new file mode 100644
index 0000000..a4d1c6f
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_global_environment.cc
@@ -0,0 +1,175 @@
+// Copyright 2017 Google Inc. 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/v8c_global_environment.h"
+
+#include <algorithm>
+#include <utility>
+
+#include "base/lazy_instance.h"
+#include "base/stringprintf.h"
+#include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/script/v8c/v8c_source_code.h"
+#include "nb/memory_scope.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+V8cGlobalEnvironment::V8cGlobalEnvironment(v8::Isolate* isolate)
+    : garbage_collection_count_(0),
+      environment_settings_(nullptr),
+      last_error_message_(nullptr),
+      eval_enabled_(false),
+      isolate_(isolate) {
+  TRACK_MEMORY_SCOPE("Javascript");
+  v8::Isolate::Scope isolate_scope(isolate_);
+  v8::HandleScope handle_scope(isolate_);
+  v8::Local<v8::ObjectTemplate> global_object_template;
+  v8::Local<v8::Context> context =
+      v8::Context::New(isolate_, nullptr, global_object_template);
+  context_.Reset(isolate_, context);
+}
+
+V8cGlobalEnvironment::~V8cGlobalEnvironment() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+}
+
+void V8cGlobalEnvironment::CreateGlobalObject() {
+  TRACK_MEMORY_SCOPE("Javascript");
+  DCHECK(thread_checker_.CalledOnValidThread());
+  // TODO: Global object creation happens with context creation in V8.
+  // Strongly consider removing this from the interface.
+  EvaluateAutomatics();
+}
+
+bool V8cGlobalEnvironment::EvaluateScript(
+    const scoped_refptr<SourceCode>& source_code,
+    std::string* out_result_utf8) {
+  TRACK_MEMORY_SCOPE("Javascript");
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  v8::Isolate::Scope isolate_scope(isolate_);
+  v8::HandleScope handle_scope(isolate_);
+  v8::Local<v8::Context> context = context_.Get(isolate_);
+  v8::Context::Scope scope(context);
+
+  v8::TryCatch try_catch(isolate_);
+  // TODO: Also pass in a |v8::ScriptOrigin|.
+  V8cSourceCode* v8c_source_code =
+      base::polymorphic_downcast<V8cSourceCode*>(source_code.get());
+  v8::Local<v8::String> source =
+      v8::String::NewFromUtf8(isolate_, v8c_source_code->source_utf8().c_str(),
+                              v8::NewStringType::kNormal)
+          .ToLocalChecked();
+
+  auto maybe_script = v8::Script::Compile(context, source);
+  v8::Local<v8::Script> script;
+  if (!maybe_script.ToLocal(&script)) {
+    return false;
+  }
+
+  auto maybe_result = script->Run(context);
+  v8::Local<v8::Value> result;
+  if (!maybe_result.ToLocal(&result)) {
+    return false;
+  }
+
+  if (out_result_utf8) {
+    *out_result_utf8 = *v8::String::Utf8Value(isolate_, result);
+  }
+
+  return true;
+}
+
+bool V8cGlobalEnvironment::EvaluateScript(
+    const scoped_refptr<SourceCode>& source_code,
+    const scoped_refptr<Wrappable>& owning_object,
+    base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle) {
+  TRACK_MEMORY_SCOPE("Javascript");
+  DCHECK(thread_checker_.CalledOnValidThread());
+  // TODO: Implement this once we have |V8cObjectHandleHolder|.
+  NOTIMPLEMENTED();
+  return false;
+}
+
+std::vector<StackFrame> V8cGlobalEnvironment::GetStackTrace(int max_frames) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  NOTIMPLEMENTED();
+  return {};
+}
+
+void V8cGlobalEnvironment::PreventGarbageCollection(
+    const scoped_refptr<Wrappable>& wrappable) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  NOTIMPLEMENTED();
+}
+
+void V8cGlobalEnvironment::AllowGarbageCollection(
+    const scoped_refptr<Wrappable>& wrappable) {
+  TRACK_MEMORY_SCOPE("Javascript");
+  DCHECK(thread_checker_.CalledOnValidThread());
+  NOTIMPLEMENTED();
+}
+
+void V8cGlobalEnvironment::DisableEval(const std::string& message) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  eval_disabled_message_.emplace(message);
+  eval_enabled_ = false;
+}
+
+void V8cGlobalEnvironment::EnableEval() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  eval_disabled_message_ = base::nullopt;
+  eval_enabled_ = true;
+}
+
+void V8cGlobalEnvironment::DisableJit() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DLOG(INFO)
+      << "V8 can only be run with JIT enabled, ignoring |DisableJit| call.";
+}
+
+void V8cGlobalEnvironment::SetReportEvalCallback(
+    const base::Closure& report_eval) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  report_eval_ = report_eval;
+}
+
+void V8cGlobalEnvironment::SetReportErrorCallback(
+    const ReportErrorCallback& report_error_callback) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  report_error_callback_ = report_error_callback;
+}
+
+void V8cGlobalEnvironment::Bind(const std::string& identifier,
+                                const scoped_refptr<Wrappable>& impl) {
+  TRACK_MEMORY_SCOPE("Javascript");
+  NOTIMPLEMENTED();
+}
+
+ScriptValueFactory* V8cGlobalEnvironment::script_value_factory() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+void V8cGlobalEnvironment::EvaluateAutomatics() {
+  // TODO: Maybe add fetch, stream, and promise polyfills.  Investigate what
+  // V8 has to natively offer first.
+  NOTIMPLEMENTED();
+}
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/v8c/v8c_global_environment.h b/src/cobalt/script/v8c/v8c_global_environment.h
new file mode 100644
index 0000000..d60637f
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_global_environment.h
@@ -0,0 +1,113 @@
+// Copyright 2017 Google Inc. 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_SCRIPT_V8C_V8C_GLOBAL_ENVIRONMENT_H_
+#define COBALT_SCRIPT_V8C_V8C_GLOBAL_ENVIRONMENT_H_
+
+#include <string>
+#include <vector>
+
+#include "base/hash_tables.h"
+#include "base/logging.h"
+#include "base/optional.h"
+#include "base/stl_util.h"
+#include "base/threading/thread_checker.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "v8/include/libplatform/libplatform.h"
+#include "v8/include/v8.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+class V8cScriptValueFactory;
+class ReferencedObjectMap;
+class WeakHandle;
+
+// Manages a handle to a JavaScript engine's global object. The lifetime of
+// the global object is not necessarily tied to the lifetime of the proxy.
+class V8cGlobalEnvironment : public GlobalEnvironment,
+                             public Wrappable::CachedWrapperAccessor {
+ public:
+  explicit V8cGlobalEnvironment(v8::Isolate* isolate);
+  ~V8cGlobalEnvironment() override;
+
+  void CreateGlobalObject() override;
+
+  bool EvaluateScript(const scoped_refptr<SourceCode>& script,
+                      std::string* out_result_utf8) override;
+
+  bool EvaluateScript(const scoped_refptr<SourceCode>& script_utf8,
+                      const scoped_refptr<Wrappable>& owning_object,
+                      base::optional<OpaqueHandleHolder::Reference>*
+                          out_opaque_handle) override;
+
+  std::vector<StackFrame> GetStackTrace(int max_frames = 0) override;
+
+  void PreventGarbageCollection(
+      const scoped_refptr<Wrappable>& wrappable) override;
+
+  void AllowGarbageCollection(
+      const scoped_refptr<Wrappable>& wrappable) override;
+
+  void DisableEval(const std::string& message) override;
+
+  void EnableEval() override;
+
+  void DisableJit() override;
+
+  void SetReportEvalCallback(const base::Closure& report_eval) override;
+
+  void SetReportErrorCallback(
+      const ReportErrorCallback& report_error_callback) override;
+
+  void Bind(const std::string& identifier,
+            const scoped_refptr<Wrappable>& impl) override;
+
+  ScriptValueFactory* script_value_factory() override;
+
+  // Evaluates any automatically included Javascript for the environment.
+  void EvaluateAutomatics();
+
+  v8::Isolate* isolate() const { return isolate_; }
+  v8::Local<v8::Context> context() const {
+    return v8::Local<v8::Context>::New(isolate_, context_);
+  }
+
+ private:
+  base::ThreadChecker thread_checker_;
+  v8::Isolate* isolate_;
+  v8::Global<v8::Context> context_;
+  int garbage_collection_count_;
+
+  v8::Global<v8::Object> global_object_;
+
+  EnvironmentSettings* environment_settings_;
+
+  // If non-NULL, the error message from the ReportErrorHandler will get
+  // assigned to this instead of being printed.
+  std::string* last_error_message_;
+
+  bool eval_enabled_;
+  base::optional<std::string> eval_disabled_message_;
+  base::Closure report_eval_;
+  ReportErrorCallback report_error_callback_;
+};
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
+
+#endif  // COBALT_SCRIPT_V8C_V8C_GLOBAL_ENVIRONMENT_H_
diff --git a/src/cobalt/script/v8c/v8c_source_code.cc b/src/cobalt/script/v8c/v8c_source_code.cc
new file mode 100644
index 0000000..053da7f
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_source_code.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 Google Inc. 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/v8c_source_code.h"
+
+namespace cobalt {
+namespace script {
+
+scoped_refptr<SourceCode> SourceCode::CreateSourceCode(
+    const std::string& script_utf8,
+    const base::SourceLocation& script_location) {
+  return new v8c::V8cSourceCode(script_utf8, script_location);
+}
+
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/v8c/v8c_source_code.h b/src/cobalt/script/v8c/v8c_source_code.h
new file mode 100644
index 0000000..f014afa
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_source_code.h
@@ -0,0 +1,47 @@
+// Copyright 2017 Google Inc. 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_SCRIPT_V8C_V8C_SOURCE_CODE_H_
+#define COBALT_SCRIPT_V8C_V8C_SOURCE_CODE_H_
+
+#include <string>
+
+#include "cobalt/base/source_location.h"
+#include "cobalt/script/source_code.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+// TODO: Consider pre-compiling scripts here.
+// TODO: Also separately consider making this class entirely non-engine
+// specific if no engine is going to do anything special with it.
+class V8cSourceCode : public SourceCode {
+ public:
+  V8cSourceCode(const std::string& source_utf8,
+                const base::SourceLocation& source_location)
+      : source_utf8_(source_utf8), location_(source_location) {}
+  const std::string& source_utf8() const { return source_utf8_; }
+  const base::SourceLocation& location() const { return location_; }
+
+ private:
+  std::string source_utf8_;
+  base::SourceLocation location_;
+};
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
+
+#endif  // COBALT_SCRIPT_V8C_V8C_SOURCE_CODE_H_
diff --git a/src/cobalt/script/v8c/v8c_variables.gypi b/src/cobalt/script/v8c/v8c_variables.gypi
new file mode 100644
index 0000000..4348bd4
--- /dev/null
+++ b/src/cobalt/script/v8c/v8c_variables.gypi
@@ -0,0 +1,51 @@
+# Copyright 2017 Google Inc. 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': {
+    'conditions': [
+      ['javascript_engine == "v8"', {
+        'generated_bindings_prefix': 'v8c',
+        'engine_include_dirs': [],
+        'engine_dependencies': [
+          '<(DEPTH)/v8/src/v8.gyp:v8',
+          '<(DEPTH)/v8/src/v8.gyp:v8_libplatform',
+        ],
+        'engine_defines': [],
+        'engine_templates_dir': [
+          '<(DEPTH)/cobalt/bindings/v8c/templates',
+        ],
+        'engine_template_files': [
+          '<(DEPTH)/cobalt/bindings/v8c/templates/callback-interface.cc.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/callback-interface.h.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/dictionary-conversion.cc.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/enumeration-conversion.cc.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/generated-types.h.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/interface.cc.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/interface.h.template',
+          '<(DEPTH)/cobalt/bindings/v8c/templates/macros.cc.template',
+        ],
+        'engine_bindings_scripts': [
+          '<(DEPTH)/cobalt/bindings/v8c/code_generator_v8c.py',
+          '<(DEPTH)/cobalt/bindings/v8c/idl_compiler_v8c.py',
+          '<(DEPTH)/cobalt/bindings/v8c/generate_conversion_header_v8c.py',
+        ],
+        'engine_idl_compiler':
+            '<(DEPTH)/cobalt/bindings/v8c/idl_compiler_v8c.py',
+        'engine_conversion_header_generator_script':
+            '<(DEPTH)/cobalt/bindings/v8c/generate_conversion_header_v8c.py',
+      }],
+    ],
+  },
+}
diff --git a/src/cobalt/storage/savegame_starboard.cc b/src/cobalt/storage/savegame_starboard.cc
index da62a3b..769d0b4 100644
--- a/src/cobalt/storage/savegame_starboard.cc
+++ b/src/cobalt/storage/savegame_starboard.cc
@@ -71,13 +71,13 @@
 
 scoped_ptr<starboard::StorageRecord> CreateRecord(
     const base::optional<std::string>& id) {
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   if (id) {
     return make_scoped_ptr(new starboard::StorageRecord(id->c_str()));
   }
-#else  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else  // SB_API_VERSION >= 6
   UNREFERENCED_PARAMETER(id);
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
   return make_scoped_ptr(new starboard::StorageRecord());
 }
 
diff --git a/src/cobalt/system_window/input_event.h b/src/cobalt/system_window/input_event.h
index 2235657..12eae54 100644
--- a/src/cobalt/system_window/input_event.h
+++ b/src/cobalt/system_window/input_event.h
@@ -55,7 +55,7 @@
   InputEvent(Type type, int device_id, int key_code, uint32 modifiers,
              bool is_repeat, const math::PointF& position = math::PointF(),
              const math::PointF& delta = math::PointF()
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
                  ,
              float pressure = 0, const math::PointF& size = math::PointF(),
              const math::PointF& tilt = math::PointF()
@@ -68,7 +68,7 @@
         is_repeat_(is_repeat),
         position_(position),
         delta_(delta)
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
         ,
         pressure_(pressure),
         size_(size),
@@ -84,7 +84,7 @@
   bool is_repeat() const { return is_repeat_; }
   const math::PointF& position() const { return position_; }
   const math::PointF& delta() const { return delta_; }
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   float pressure() const { return pressure_; }
   const math::PointF& size() const { return size_; }
   const math::PointF& tilt() const { return tilt_; }
@@ -100,7 +100,7 @@
   bool is_repeat_;
   math::PointF position_;
   math::PointF delta_;
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   float pressure_;
   math::PointF size_;
   math::PointF tilt_;
diff --git a/src/cobalt/system_window/system_window.cc b/src/cobalt/system_window/system_window.cc
index 1e2c38f..7b2529e 100644
--- a/src/cobalt/system_window/system_window.cc
+++ b/src/cobalt/system_window/system_window.cc
@@ -102,7 +102,7 @@
   // Starboard handily uses the Microsoft key mapping, which is also what Cobalt
   // uses.
   int key_code = static_cast<int>(data.key);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   float pressure = data.pressure;
   uint32 modifiers = data.key_modifiers;
   if (((data.device_type == kSbInputDeviceTypeTouchPad) ||
@@ -159,7 +159,7 @@
       DispatchInputEvent(data, input_event_type, false /* is_repeat */);
       break;
     }
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbInputEventTypeWheel: {
       DispatchInputEvent(data, InputEvent::kWheel, false /* is_repeat */);
       break;
diff --git a/src/cobalt/webdriver/element_driver.cc b/src/cobalt/webdriver/element_driver.cc
index b53ae7b..c8dbfd8 100644
--- a/src/cobalt/webdriver/element_driver.cc
+++ b/src/cobalt/webdriver/element_driver.cc
@@ -242,7 +242,7 @@
 
   event.set_pointer_type("mouse");
   event.set_pointer_id(kWebDriverMousePointerId);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   event.set_width(0.0f);
   event.set_height(0.0f);
   event.set_pressure(0.0f);
@@ -256,13 +256,13 @@
   pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
                               base::Tokens::pointermove(), event);
   event.set_buttons(1);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   event.set_pressure(0.5f);
 #endif
   pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
                               base::Tokens::pointerdown(), event);
   event.set_buttons(0);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   event.set_pressure(0.0f);
 #endif
   pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
diff --git a/src/cobalt/webdriver/window_driver.cc b/src/cobalt/webdriver/window_driver.cc
index 8685d52..fac224c 100644
--- a/src/cobalt/webdriver/window_driver.cc
+++ b/src/cobalt/webdriver/window_driver.cc
@@ -530,7 +530,7 @@
 
   event->set_pointer_type("mouse");
   event->set_pointer_id(kWebDriverMousePointerId);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   event->set_width(0.0f);
   event->set_height(0.0f);
   event->set_pressure(pointer_buttons_ ? 0.5f : 0.0f);
diff --git a/src/starboard/CHANGELOG.md b/src/starboard/CHANGELOG.md
index 4b010c4..4bf24e5 100644
--- a/src/starboard/CHANGELOG.md
+++ b/src/starboard/CHANGELOG.md
@@ -71,6 +71,10 @@
   * Closed Caption key
   * Application launch key
   * Channel Up/Down keys
+  * Info key
+  * Guide key
+  * Last/Previous Channel key
+  * Media audio track select key
 
 ### `kSbEventTypeLowMemory`
 
diff --git a/src/starboard/configuration.h b/src/starboard/configuration.h
index b9a1f5c..a8548ea 100644
--- a/src/starboard/configuration.h
+++ b/src/starboard/configuration.h
@@ -68,23 +68,7 @@
 //   #define SB_MY_EXPERIMENTAL_FEATURE_VERSION SB_EXPERIMENTAL_API_VERSION
 
 // --- Release Candidate Feature Defines -------------------------------------
-#define SB_DECODE_TARGET_PLANE_FORMAT_VERSION 7
-
-#define SB_POINTER_INPUT_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_TIME_ZONE_FLEXIBLE_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_DECODE_TARGET_PLANES_FOR_FORMAT SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_PRELOAD_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_PLATFORM_ERROR_CLEANUP_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION \
-  SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_NEW_KEYCODES_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_LOW_MEMORY_EVENT_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION \
-  SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION \
-  SB_RELEASE_CANDIDATE_API_VERSION
-#define SB_STORAGE_NAMES_API_VERSION SB_RELEASE_CANDIDATE_API_VERSION
+#define SB_DECODE_TARGET_PLANE_FORMAT_VERSION SB_RELEASE_CANDIDATE_API_VERSION
 
 // --- Common Detected Features ----------------------------------------------
 
diff --git a/src/starboard/decode_target.h b/src/starboard/decode_target.h
index 40a680f..2bb46e5 100644
--- a/src/starboard/decode_target.h
+++ b/src/starboard/decode_target.h
@@ -135,7 +135,7 @@
   // A decoder target format consisting of Y, U, and V planes, in that order.
   kSbDecodeTargetFormat3PlaneYUVI420,
 
-#if SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
   // 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
@@ -146,7 +146,7 @@
   // 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.
   kSbDecodeTargetFormat1PlaneUYVY,
-#endif  // SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
+#endif
 
   // An invalid decode target format.
   kSbDecodeTargetFormatInvalid,
@@ -251,7 +251,7 @@
   // that it be set to something else like GL_TEXTURE_EXTERNAL_OES.
   uint32_t gl_texture_target;
 
-#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_VERSION
+#if SB_API_VERSION >= SB_DECODE_TARGET_PLANE_FORMAT_VERSION
   // 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
@@ -260,7 +260,7 @@
   uint32_t gl_texture_format;
 #endif  // SB_API_VERSION >= SB_DECODE_TARGET_NV12_R_RG_API_VERSION
 
-#endif               // SB_HAS(BLITTER)
+#endif  // SB_HAS(BLITTER)
 
   // The width of the texture/surface for this particular plane.
   int width;
@@ -323,14 +323,12 @@
   return format != kSbDecodeTargetFormatInvalid;
 }
 
-#if SB_API_VERSION >= SB_DECODE_TARGET_PLANES_FOR_FORMAT
+#if SB_API_VERSION >= 6
 static SB_C_INLINE int SbDecodeTargetNumberOfPlanesForFormat(
     SbDecodeTargetFormat format) {
   switch (format) {
     case kSbDecodeTargetFormat1PlaneRGBA:
-#if SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
     case kSbDecodeTargetFormat1PlaneUYVY:
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_UYVY_SUPPORT_API_VERSION
       return 1;
     case kSbDecodeTargetFormat1PlaneBGRA:
       return 1;
@@ -343,7 +341,7 @@
       return 0;
   }
 }
-#endif  // SB_API_VERSION >= SB_DECODE_TARGET_PLANES_FOR_FORMAT
+#endif  // SB_API_VERSION >= 6
 
 // Returns ownership of |decode_target| to the Starboard implementation.
 // This function will likely result in the destruction of the SbDecodeTarget and
diff --git a/src/starboard/drm.h b/src/starboard/drm.h
index 8149cd8..4ce3df8 100644
--- a/src/starboard/drm.h
+++ b/src/starboard/drm.h
@@ -52,14 +52,14 @@
   int32_t encrypted_byte_count;
 } SbDrmSubSampleMapping;
 
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 typedef struct SbDrmKeyId {
   // 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.
   uint8_t identifier[16];
   int identifier_size;
 } SbDrmKeyId;
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 // All the optional information needed per sample for encrypted samples.
 typedef struct SbDrmSampleInfo {
@@ -121,7 +121,7 @@
 // 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.
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 typedef void (*SbDrmSessionKeyStatusesChangedFunc)(
     SbDrmSystem drm_system,
     void* context,
@@ -130,7 +130,7 @@
     int number_of_keys,
     const SbDrmKeyId* key_ids,
     const SbDrmKeyStatus* key_statuses);
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 // --- Constants -------------------------------------------------------------
 
@@ -171,7 +171,7 @@
 // SbDrmGenerateSessionUpdateRequest() is called.
 // |session_updated_callback|: A function that is called every time after
 // SbDrmUpdateSession() is called.
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 
 SB_EXPORT SbDrmSystem SbDrmCreateSystem(
     const char* key_system,
@@ -180,7 +180,7 @@
     SbDrmSessionUpdatedFunc session_updated_callback,
     SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback);
 
-#else  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#else  // SB_API_VERSION >= 6
 
 SB_EXPORT SbDrmSystem
 SbDrmCreateSystem(const char* key_system,
diff --git a/src/starboard/event.h b/src/starboard/event.h
index 7bfca2c..cd01304 100644
--- a/src/starboard/event.h
+++ b/src/starboard/event.h
@@ -95,7 +95,7 @@
 // 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.
 typedef enum SbEventType {
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
   // 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
@@ -112,7 +112,7 @@
   // call SbSystemRequestSuspend() when they are done preloading to request
   // this.
   kSbEventTypePreload,
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
   // The first event that an application receives on startup when starting
   // normally (i.e. not being preloaded). Applications should perform
@@ -204,14 +204,14 @@
   // new settings.
   kSbEventTypeAccessiblitySettingsChanged,
 
-#if SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#if SB_API_VERSION >= 6
   // 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.
   kSbEventTypeLowMemory,
-#endif  // SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 } SbEventType;
 
 // Structure representing a Starboard event and its data.
diff --git a/src/starboard/examples/window/main.cc b/src/starboard/examples/window/main.cc
index b508e7d..20b0341 100644
--- a/src/starboard/examples/window/main.cc
+++ b/src/starboard/examples/window/main.cc
@@ -32,7 +32,7 @@
 
 void SbEventHandle(const SbEvent* event) {
   switch (event->type) {
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbEventTypePreload: {
       SB_LOG(INFO) << "PRELOAD";
       SbEventStartData* data = static_cast<SbEventStartData*>(event->data);
diff --git a/src/starboard/input.h b/src/starboard/input.h
index c3a7dbf..a32a05a 100644
--- a/src/starboard/input.h
+++ b/src/starboard/input.h
@@ -121,7 +121,7 @@
   // event is sent when the key or button being pressed is released.
   kSbInputEventTypeUnpress,
 
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   // Wheel movement. Provides relative movements of the |Mouse| wheel.
   kSbInputEventTypeWheel,
 #endif
@@ -176,7 +176,7 @@
   // not applicable.
   SbInputVector delta;
 
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   // 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.
diff --git a/src/starboard/key.h b/src/starboard/key.h
index 73a1cb6..34d2f19 100644
--- a/src/starboard/key.h
+++ b/src/starboard/key.h
@@ -208,7 +208,9 @@
   kSbKeyMediaRewind = 0xE3,
   kSbKeyMediaFastForward = 0xE4,
 
-#if SB_API_VERSION >= SB_NEW_KEYCODES_API_VERSION
+#if SB_API_VERSION >= 6
+  // Key codes from the DTV Application Software Environment,
+  //   http://www.atsc.org/wp-content/uploads/2015/03/a_100_4.pdf
   kSbKeyRed = 0x193,
   kSbKeyGreen = 0x194,
   kSbKeyYellow = 0x195,
@@ -219,9 +221,22 @@
   kSbKeySubtitle = 0x1CC,
   kSbKeyClosedCaption = kSbKeySubtitle,
 
+  kSbKeyInfo = 0x1C9,
+  kSbKeyGuide = 0x1CA,
+
+  // Key codes from OCAP,
+  //   https://apps.cablelabs.com/specification/opencable-application-platform-ocap/
+  kSbKeyLast = 0x25f,
+  kSbKeyPreviousChannel = kSbKeyLast,
+
+  // Custom Starboard-defined keycodes.
+
   // A button that will directly launch the current application.
   kSbKeyLaunchThisApplication = 0x3000,
-#endif  // SB_API_VERSION >= SB_NEW_KEYCODES_API_VERSION
+
+  // A button that will switch between different available audio tracks.
+  kSbKeyMediaAudioTrack = 0x3001,
+#endif  // SB_API_VERSION >= 6
 
   // Mouse buttons, starting with the left mouse button.
   kSbKeyMouse1 = 0x7000,
@@ -296,7 +311,7 @@
   kSbKeyModifiersCtrl = 1 << 1,
   kSbKeyModifiersMeta = 1 << 2,
   kSbKeyModifiersShift = 1 << 3,
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   kSbKeyModifiersPointerButtonLeft = 1 << 4,
   kSbKeyModifiersPointerButtonRight = 1 << 5,
   kSbKeyModifiersPointerButtonMiddle = 1 << 6,
diff --git a/src/starboard/media.h b/src/starboard/media.h
index a01b109..2673bcf 100644
--- a/src/starboard/media.h
+++ b/src/starboard/media.h
@@ -462,11 +462,11 @@
 
   // 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
-#if SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#if SB_API_VERSION >= 6
   const void* audio_specific_config;
-#else   // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#else   // SB_API_VERSION >= 6
   int8_t audio_specific_config[8];
-#endif  // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#endif  // SB_API_VERSION >= 6
 } SbMediaAudioHeader;
 
 // --- Constants -------------------------------------------------------------
diff --git a/src/starboard/nplb/key_test.cc b/src/starboard/nplb/key_test.cc
index f3644cd..784f602 100644
--- a/src/starboard/nplb/key_test.cc
+++ b/src/starboard/nplb/key_test.cc
@@ -24,7 +24,7 @@
   EXPECT_NE(kSbKeyUnknown, kSbKeyMediaRewind);
   EXPECT_NE(kSbKeyUnknown, kSbKeyMediaFastForward);
 
-#if SB_API_VERSION >= SB_NEW_KEYCODES_API_VERSION
+#if SB_API_VERSION >= 6
   EXPECT_NE(kSbKeyUnknown, kSbKeyRed);
   EXPECT_NE(kSbKeyUnknown, kSbKeyGreen);
   EXPECT_NE(kSbKeyUnknown, kSbKeyYellow);
@@ -33,8 +33,13 @@
   EXPECT_NE(kSbKeyUnknown, kSbKeyChannelUp);
   EXPECT_NE(kSbKeyUnknown, kSbKeyChannelDown);
   EXPECT_NE(kSbKeyUnknown, kSbKeyClosedCaption);
+  EXPECT_NE(kSbKeyUnknown, kSbKeyInfo);
+  EXPECT_NE(kSbKeyUnknown, kSbKeyGuide);
+  EXPECT_NE(kSbKeyUnknown, kSbKeyLast);
+  EXPECT_NE(kSbKeyUnknown, kSbKeyPreviousChannel);
   EXPECT_NE(kSbKeyUnknown, kSbKeyLaunchThisApplication);
-#endif  //  SB_API_VERSION >= SB_NEW_KEYCODES_API_VERSION
+  EXPECT_NE(kSbKeyUnknown, kSbKeyMediaAudioTrack);
+#endif  //  SB_API_VERSION >= 6
 }
 
 }  // namespace
diff --git a/src/starboard/nplb/player_create_test.cc b/src/starboard/nplb/player_create_test.cc
index 9172d45..f9cbe22 100644
--- a/src/starboard/nplb/player_create_test.cc
+++ b/src/starboard/nplb/player_create_test.cc
@@ -50,9 +50,9 @@
   audio_header.block_alignment = 4;
   audio_header.bits_per_sample = 32;
   audio_header.audio_specific_config_size = 0;
-#if SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#if SB_API_VERSION >= 6
   audio_header.audio_specific_config = NULL;
-#endif  // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#endif  // SB_API_VERSION >= 6
   audio_header.average_bytes_per_second = audio_header.samples_per_second *
                                           audio_header.number_of_channels *
                                           audio_header.bits_per_sample / 8;
diff --git a/src/starboard/nplb/storage_delete_record_test.cc b/src/starboard/nplb/storage_delete_record_test.cc
index ef0fc73..ef3db9a 100644
--- a/src/starboard/nplb/storage_delete_record_test.cc
+++ b/src/starboard/nplb/storage_delete_record_test.cc
@@ -23,7 +23,7 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
 
 TEST(SbStorageDeleteRecordTest, RainyDayInvalidUserValidName) {
   EXPECT_FALSE(SbStorageDeleteRecord(
@@ -34,13 +34,13 @@
   EXPECT_FALSE(SbStorageDeleteRecord(kSbUserInvalid, NULL));
 }
 
-#else  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else  // SB_API_VERSION >= 6
 
 TEST(SbStorageDeleteRecordTest, RainyDayInvalidUser) {
   EXPECT_FALSE(SbStorageDeleteRecord(kSbUserInvalid));
 }
 
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 }  // namespace
 }  // namespace nplb
diff --git a/src/starboard/nplb/storage_helpers.h b/src/starboard/nplb/storage_helpers.h
index c587203..867d3b0 100644
--- a/src/starboard/nplb/storage_helpers.h
+++ b/src/starboard/nplb/storage_helpers.h
@@ -28,32 +28,32 @@
 
 // Deletes the storage for the current user.
 static SB_C_INLINE void ClearStorageRecord() {
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   SbStorageDeleteRecord(SbUserGetCurrent(), NULL);
-#else   // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else   // SB_API_VERSION >= 6
   SbStorageDeleteRecord(SbUserGetCurrent());
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 }
 
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
 // Deletes the named storage record for the current user.
 static SB_C_INLINE void ClearStorageRecord(const char* name) {
   SbStorageDeleteRecord(SbUserGetCurrent(), name);
 }
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 // Opens the storage record for the current user, validating that it is valid.
 static SB_C_INLINE SbStorageRecord OpenStorageRecord() {
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   SbStorageRecord record = SbStorageOpenRecord(SbUserGetCurrent(), NULL);
-#else   // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else   // SB_API_VERSION >= 6
   SbStorageRecord record = SbStorageOpenRecord(SbUserGetCurrent());
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
   EXPECT_TRUE(SbStorageIsValidRecord(record));
   return record;
 }
 
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
 // Opens the named storage record for the current user, validating that it is
 // valid.
 static SB_C_INLINE SbStorageRecord OpenStorageRecord(const char* name) {
@@ -61,7 +61,7 @@
   EXPECT_TRUE(SbStorageIsValidRecord(record));
   return record;
 }
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 // Writes a standard pattern of |size| bytes into the given open storage
 // |record|.
diff --git a/src/starboard/nplb/storage_open_record_test.cc b/src/starboard/nplb/storage_open_record_test.cc
index c935e4a..5526451 100644
--- a/src/starboard/nplb/storage_open_record_test.cc
+++ b/src/starboard/nplb/storage_open_record_test.cc
@@ -23,7 +23,7 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
 
 TEST(SbStorageOpenRecordTest, RainyDayInvalidUserValidName) {
   EXPECT_FALSE(SbStorageIsValidRecord(SbStorageOpenRecord(
@@ -35,13 +35,13 @@
       SbStorageIsValidRecord(SbStorageOpenRecord(kSbUserInvalid, NULL)));
 }
 
-#else  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else  // SB_API_VERSION >= 6
 
 TEST(SbStorageOpenRecordTest, RainyDayInvalidUser) {
   EXPECT_FALSE(SbStorageIsValidRecord(SbStorageOpenRecord(kSbUserInvalid)));
 }
 
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 }  // namespace
 }  // namespace nplb
diff --git a/src/starboard/nplb/storage_read_record_test.cc b/src/starboard/nplb/storage_read_record_test.cc
index 336e716..d6e46c9 100644
--- a/src/starboard/nplb/storage_read_record_test.cc
+++ b/src/starboard/nplb/storage_read_record_test.cc
@@ -54,7 +54,7 @@
   EXPECT_TRUE(SbStorageCloseRecord(record));
 }
 
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
 TEST(SbStorageReadRecordTest, SunnyDayNamed) {
   int64_t pattern = 0;
   std::string name = ScopedRandomFile::MakeRandomFilename();
@@ -157,7 +157,7 @@
   ClearStorageRecord(name2.c_str());
   ClearStorageRecord();
 }
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
 TEST(SbStorageReadRecordTest, SunnyDayNonexistant) {
   ClearStorageRecord();
diff --git a/src/starboard/nplb/time_zone_get_dst_name_test.cc b/src/starboard/nplb/time_zone_get_dst_name_test.cc
index d2926b5..fb7f20b 100644
--- a/src/starboard/nplb/time_zone_get_dst_name_test.cc
+++ b/src/starboard/nplb/time_zone_get_dst_name_test.cc
@@ -20,7 +20,7 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#if SB_API_VERSION < 6
 TEST(SbTimeZoneGetDstNameTest, IsKindOfSane) {
   const char* name = SbTimeZoneGetDstName();
 
@@ -35,7 +35,7 @@
   EXPECT_GE(i, 3);
   EXPECT_LE(i, 5);
 }
-#endif  // SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#endif  // SB_API_VERSION < 6
 
 }  // namespace
 }  // namespace nplb
diff --git a/src/starboard/nplb/time_zone_get_name_test.cc b/src/starboard/nplb/time_zone_get_name_test.cc
index 41b7d5e..32428ce 100644
--- a/src/starboard/nplb/time_zone_get_name_test.cc
+++ b/src/starboard/nplb/time_zone_get_name_test.cc
@@ -34,12 +34,12 @@
   // or "Pacific Standard Time" or like "America/Los_Angeles"
   EXPECT_GE(i, 3);
 
-#if SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#if SB_API_VERSION < 6
   // Some, like WART for Western Argentina, are 4.
   // A very few, like ANAST, or CHAST is 5
   // http://www.timeanddate.com/time/zones/
   EXPECT_LE(i, 5);
-#endif  // SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#endif  // SB_API_VERSION < 6
 
   // On Linux, TZ=":Pacific/Chatham" is a good test of boundary conditions.
   // ":Pacific/Kiritimati" is the western-most timezone at UTC+14.
diff --git a/src/starboard/player.h b/src/starboard/player.h
index 20b95a5..b97e354 100644
--- a/src/starboard/player.h
+++ b/src/starboard/player.h
@@ -242,11 +242,11 @@
 // |audio_header|: Note that the caller must provide a populated |audio_header|
 //   if the audio codec is |kSbMediaAudioCodecAac|. Otherwise, |audio_header|
 //   can be NULL. See media.h for the format of the |SbMediaAudioHeader| struct.
-#if SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#if SB_API_VERSION >= 6
 //   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.
-#endif  // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#endif  // SB_API_VERSION >= 6
 //
 // |sample_deallocator_func|: If not |NULL|, the player calls this function
 //   on an internal thread to free the sample buffers passed into
@@ -377,13 +377,13 @@
 SB_EXPORT void SbPlayerWriteSample(
     SbPlayer player,
     SbMediaType sample_type,
-#if SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#if SB_API_VERSION >= 6
     const void* const* sample_buffers,
     const int* sample_buffer_sizes,
-#else   // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#else   // SB_API_VERSION >= 6
     const void** sample_buffers,
     int* sample_buffer_sizes,
-#endif  // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#endif  // SB_API_VERSION >= 6
     int number_of_sample_buffers,
     SbMediaTime sample_pts,
     const SbMediaVideoSampleInfo* video_sample_info,
diff --git a/src/starboard/raspi/shared/application_dispmanx.h b/src/starboard/raspi/shared/application_dispmanx.h
index 37f0b61..9f089da 100644
--- a/src/starboard/raspi/shared/application_dispmanx.h
+++ b/src/starboard/raspi/shared/application_dispmanx.h
@@ -62,10 +62,10 @@
   Event* WaitForSystemEventWithTimeout(SbTime duration) SB_OVERRIDE;
   void WakeSystemEventWait() SB_OVERRIDE;
 
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
   bool IsStartImmediate() SB_OVERRIDE { return !HasPreloadSwitch(); }
   bool IsPreloadImmediate() SB_OVERRIDE { return HasPreloadSwitch(); }
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
  private:
   // Returns whether DISPMANX has been initialized.
diff --git a/src/starboard/shared/directfb/application_directfb.h b/src/starboard/shared/directfb/application_directfb.h
index 65f96c2..522bbc2 100644
--- a/src/starboard/shared/directfb/application_directfb.h
+++ b/src/starboard/shared/directfb/application_directfb.h
@@ -44,10 +44,10 @@
   IDirectFB* GetDirectFB();
   SbWindow GetWindow();
 
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
   bool IsStartImmediate() SB_OVERRIDE { return !HasPreloadSwitch(); }
   bool IsPreloadImmediate() SB_OVERRIDE { return HasPreloadSwitch(); }
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
  protected:
   // --- Application overrides ---
diff --git a/src/starboard/shared/linux/dev_input/dev_input.cc b/src/starboard/shared/linux/dev_input/dev_input.cc
index 10393dd..f0155e7 100644
--- a/src/starboard/shared/linux/dev_input/dev_input.cc
+++ b/src/starboard/shared/linux/dev_input/dev_input.cc
@@ -921,7 +921,7 @@
   data->key_location = location;
   data->key_modifiers = modifiers;
   data->position = input_vector;
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   data->pressure = NAN;
   data->size = {NAN, NAN};
   data->tilt = {NAN, NAN};
@@ -949,7 +949,7 @@
   data->key_location = location;
   data->key_modifiers = modifiers;
   data->position = input_vector;
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   data->pressure = NAN;
   data->size = {NAN, NAN};
   data->tilt = {NAN, NAN};
diff --git a/src/starboard/shared/posix/time_zone_get_dst_name.cc b/src/starboard/shared/posix/time_zone_get_dst_name.cc
index 97683f9..cc437ae 100644
--- a/src/starboard/shared/posix/time_zone_get_dst_name.cc
+++ b/src/starboard/shared/posix/time_zone_get_dst_name.cc
@@ -16,11 +16,11 @@
 
 #include <time.h>
 
-#if SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#if SB_API_VERSION < 6
 const char* SbTimeZoneGetDstName() {
   // TODO: Using tzname assumes that tzset() has been called at some
   // point. That should happen as part of Starboard's main loop initialization,
   // but that doesn't exist yet.
   return tzname[1];
 }
-#endif  // SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#endif  // SB_API_VERSION < 6
diff --git a/src/starboard/shared/starboard/application.cc b/src/starboard/shared/starboard/application.cc
index 71235ab..926545b 100644
--- a/src/starboard/shared/starboard/application.cc
+++ b/src/starboard/shared/starboard/application.cc
@@ -136,9 +136,9 @@
 }
 
 void Application::InjectLowMemoryEvent() {
-#if SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#if SB_API_VERSION >= 6
   Inject(new Event(kSbEventTypeLowMemory, NULL, NULL));
-#endif  // SB_API_VERSION >= SB_LOW_MEMORY_EVENT_API_VERSION
+#endif  // SB_API_VERSION >= 6
 }
 
 SbEventId Application::Schedule(SbEventCallback callback,
@@ -183,12 +183,12 @@
 
 void Application::DispatchPreload() {
   SB_DCHECK(IsCurrentThread());
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
   SB_DCHECK(state_ == kStateUnstarted);
   DispatchAndDelete(CreateInitialEvent(kSbEventTypePreload));
-#else  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#else  // SB_API_VERSION >= 6
   SB_NOTREACHED();
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
 }
 
 bool Application::HasPreloadSwitch() {
@@ -207,13 +207,13 @@
   // Ensure that we go through the the appropriate lifecycle events based on the
   // current state.
   switch (scoped_event->event->type) {
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbEventTypePreload:
       if (state() != kStateUnstarted) {
         return true;
       }
       break;
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
     case kSbEventTypeStart:
       if (state() != kStatePreloading && state() != kStateUnstarted) {
         return true;
@@ -294,12 +294,12 @@
   SbEventHandle(scoped_event->event);
 
   switch (scoped_event->event->type) {
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
     case kSbEventTypePreload:
       SB_DCHECK(state() == kStateUnstarted);
       state_ = kStatePreloading;
       break;
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
     case kSbEventTypeStart:
       SB_DCHECK(state() == kStatePreloading || state() == kStateUnstarted);
       state_ = kStateStarted;
@@ -342,11 +342,11 @@
 }
 
 Application::Event* Application::CreateInitialEvent(SbEventType type) {
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
   SB_DCHECK(type == kSbEventTypePreload || type == kSbEventTypeStart);
-#else  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#else  // SB_API_VERSION >= 6
   SB_DCHECK(type == kSbEventTypeStart);
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
   SbEventStartData* start_data = new SbEventStartData();
   SbMemorySet(start_data, 0, sizeof(SbEventStartData));
   start_data->argument_values =
diff --git a/src/starboard/shared/starboard/file_storage/storage_delete_record.cc b/src/starboard/shared/starboard/file_storage/storage_delete_record.cc
index c5c7fe3..cdfecce 100644
--- a/src/starboard/shared/starboard/file_storage/storage_delete_record.cc
+++ b/src/starboard/shared/starboard/file_storage/storage_delete_record.cc
@@ -19,18 +19,18 @@
 #include "starboard/user.h"
 
 bool SbStorageDeleteRecord(SbUser user
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
                            ,
                            const char* name
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
                            ) {
   if (!SbUserIsValid(user)) {
     return false;
   }
 
-#if SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION < 6
   const char* name = NULL;
-#endif  // SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION < 6
 
   char path[SB_FILE_MAX_PATH];
   bool success = starboard::shared::starboard::GetUserStorageFilePath(
diff --git a/src/starboard/shared/starboard/file_storage/storage_internal.h b/src/starboard/shared/starboard/file_storage/storage_internal.h
index a56cd34..4bbc117 100644
--- a/src/starboard/shared/starboard/file_storage/storage_internal.h
+++ b/src/starboard/shared/starboard/file_storage/storage_internal.h
@@ -29,9 +29,9 @@
 struct SbStorageRecordPrivate {
   SbUser user;
   SbFile file;
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   std::string name;
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 };
 
 namespace starboard {
diff --git a/src/starboard/shared/starboard/file_storage/storage_open_record.cc b/src/starboard/shared/starboard/file_storage/storage_open_record.cc
index aaea393..8417083 100644
--- a/src/starboard/shared/starboard/file_storage/storage_open_record.cc
+++ b/src/starboard/shared/starboard/file_storage/storage_open_record.cc
@@ -20,18 +20,18 @@
 #include "starboard/user.h"
 
 SbStorageRecord SbStorageOpenRecord(SbUser user
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
                                     ,
                                     const char* name
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
                                     ) {
   if (!SbUserIsValid(user)) {
     return kSbStorageInvalidRecord;
   }
 
-#if SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION < 6
   const char* name = NULL;
-#endif  // SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION < 6
 
   char path[SB_FILE_MAX_PATH];
   bool success = starboard::shared::starboard::GetUserStorageFilePath(
@@ -52,7 +52,7 @@
   SB_DCHECK(SbStorageIsValidRecord(result));
   result->user = user;
   result->file = file;
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   if (name) {
     result->name = name;
   }
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
index 276c6c5..a04991b 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
@@ -60,7 +60,7 @@
       volume_(1.0),
       output_mode_(output_mode),
       decode_target_graphics_context_provider_(provider) {
-#if SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#if SB_API_VERSION >= 6
   if (audio_header_.audio_specific_config_size > 0) {
     audio_specific_config_.reset(
         new int8_t[audio_header_.audio_specific_config_size]);
@@ -69,7 +69,7 @@
                  audio_header.audio_specific_config,
                  audio_header.audio_specific_config_size);
   }
-#endif  // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#endif  // SB_API_VERSION >= 6
 
   update_closure_ = Bind(&FilterBasedPlayerWorkerHandler::Update, this);
   bounds_ = PlayerWorker::Bounds();
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
index efceeaa..3e441fa 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
@@ -76,11 +76,11 @@
   SbMediaVideoCodec video_codec_;
   SbMediaAudioCodec audio_codec_;
   SbDrmSystem drm_system_;
-#if SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#if SB_API_VERSION >= 6
   // Store a copy of |SbMediaAudioHeader::audio_specific_config| passed to the
   // ctor so it is valid for the life time of the player worker.
   scoped_array<int8_t> audio_specific_config_;
-#endif  // SB_API_VERSION >= SB_AUDIO_SPECIFIC_CONFIG_AS_POINTER
+#endif  // SB_API_VERSION >= 6
   SbMediaAudioHeader audio_header_;
 
   scoped_ptr<AudioRenderer> audio_renderer_;
diff --git a/src/starboard/shared/starboard/player/player_write_sample.cc b/src/starboard/shared/starboard/player/player_write_sample.cc
index 770b981..62122dc 100644
--- a/src/starboard/shared/starboard/player/player_write_sample.cc
+++ b/src/starboard/shared/starboard/player/player_write_sample.cc
@@ -19,13 +19,13 @@
 
 void SbPlayerWriteSample(SbPlayer player,
                          SbMediaType sample_type,
-#if SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#if SB_API_VERSION >= 6
                          const void* const* sample_buffers,
                          const int* sample_buffer_sizes,
-#else   // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#else   // SB_API_VERSION >= 6
                          const void** sample_buffers,
                          int* sample_buffer_sizes,
-#endif  // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#endif  // SB_API_VERSION >= 6
                          int number_of_sample_buffers,
                          SbMediaTime sample_pts,
                          const SbMediaVideoSampleInfo* video_sample_info,
diff --git a/src/starboard/shared/stub/drm_create_system.cc b/src/starboard/shared/stub/drm_create_system.cc
index 64139a9..5b43825 100644
--- a/src/starboard/shared/stub/drm_create_system.cc
+++ b/src/starboard/shared/stub/drm_create_system.cc
@@ -14,7 +14,7 @@
 
 #include "starboard/drm.h"
 
-#if SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#if SB_API_VERSION >= 6
 
 SbDrmSystem SbDrmCreateSystem(
     const char* key_system,
@@ -30,7 +30,7 @@
   return kSbDrmSystemInvalid;
 }
 
-#else  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#else  // SB_API_VERSION >= 6
 
 SbDrmSystem SbDrmCreateSystem(
     const char* key_system,
@@ -44,4 +44,4 @@
   return kSbDrmSystemInvalid;
 }
 
-#endif  // SB_API_VERSION >= SB_DRM_KEY_STATUSES_UPDATE_SUPPORT_API_VERSION
+#endif  // SB_API_VERSION >= 6
diff --git a/src/starboard/shared/stub/player_write_sample.cc b/src/starboard/shared/stub/player_write_sample.cc
index e08b4b4..b5a02eb 100644
--- a/src/starboard/shared/stub/player_write_sample.cc
+++ b/src/starboard/shared/stub/player_write_sample.cc
@@ -20,13 +20,13 @@
 
 void SbPlayerWriteSample(SbPlayer /*player*/,
                          SbMediaType /*sample_type*/,
-#if SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#if SB_API_VERSION >= 6
                          const void* const* /*sample_buffers*/,
                          const int* /*sample_buffer_sizes*/,
-#else   // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#else   // SB_API_VERSION >= 6
                          const void** /*sample_buffers*/,
                          int* /*sample_buffer_sizes*/,
-#endif  // SB_API_VERSION >= SB_PLAYER_WRITE_SAMPLE_EXTRA_CONST_API_VERSION
+#endif  // SB_API_VERSION >= 6
                          int /*number_of_sample_buffers*/,
                          SbMediaTime /*sample_pts*/,
                          const SbMediaVideoSampleInfo* /*video_sample_info*/,
diff --git a/src/starboard/shared/stub/storage_delete_record.cc b/src/starboard/shared/stub/storage_delete_record.cc
index a669054..6a1c2e0 100644
--- a/src/starboard/shared/stub/storage_delete_record.cc
+++ b/src/starboard/shared/stub/storage_delete_record.cc
@@ -15,10 +15,10 @@
 #include "starboard/storage.h"
 
 bool SbStorageDeleteRecord(SbUser /*user*/
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
                            ,
                            const char* /*name*/
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
                            ) {
   return false;
 }
diff --git a/src/starboard/shared/stub/storage_open_record.cc b/src/starboard/shared/stub/storage_open_record.cc
index b0f503e..378e9e7 100644
--- a/src/starboard/shared/stub/storage_open_record.cc
+++ b/src/starboard/shared/stub/storage_open_record.cc
@@ -15,10 +15,10 @@
 #include "starboard/storage.h"
 
 SbStorageRecord SbStorageOpenRecord(SbUser /*user*/
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
                                     ,
                                     const char* /*name*/
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
                                     ) {
   return kSbStorageInvalidRecord;
 }
diff --git a/src/starboard/shared/stub/system_raise_platform_error.cc b/src/starboard/shared/stub/system_raise_platform_error.cc
index aad4c25..8380e52 100644
--- a/src/starboard/shared/stub/system_raise_platform_error.cc
+++ b/src/starboard/shared/stub/system_raise_platform_error.cc
@@ -27,7 +27,7 @@
     case kSbSystemPlatformErrorTypeConnectionError:
       message = "Connection error.";
       break;
-#if SB_API_VERSION < SB_PLATFORM_ERROR_CLEANUP_API_VERSION
+#if SB_API_VERSION < 6
     case kSbSystemPlatformErrorTypeUserSignedOut:
       message = "User is not signed in.";
       break;
diff --git a/src/starboard/shared/stub/time_zone_get_dst_name.cc b/src/starboard/shared/stub/time_zone_get_dst_name.cc
index 9d96599..35dad67 100644
--- a/src/starboard/shared/stub/time_zone_get_dst_name.cc
+++ b/src/starboard/shared/stub/time_zone_get_dst_name.cc
@@ -14,8 +14,8 @@
 
 #include "starboard/time_zone.h"
 
-#if SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#if SB_API_VERSION < 6
 const char* SbTimeZoneGetDstName() {
   return "GMT";
 }
-#endif  // SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#endif  // SB_API_VERSION < 6
diff --git a/src/starboard/shared/uwp/application_uwp.cc b/src/starboard/shared/uwp/application_uwp.cc
index ec9f438..2343b2a 100644
--- a/src/starboard/shared/uwp/application_uwp.cc
+++ b/src/starboard/shared/uwp/application_uwp.cc
@@ -84,8 +84,8 @@
 
 namespace {
 
-const HdcpProtection kHDCPProtectionMode =
-    HdcpProtection::OnWithTypeEnforcement;
+// Per Microsoft, HdcpProtection::On means HDCP 1.x required.
+const HdcpProtection kHDCPProtectionMode = HdcpProtection::On;
 
 const int kWinSockVersionMajor = 2;
 const int kWinSockVersionMinor = 2;
diff --git a/src/starboard/shared/x11/application_x11.cc b/src/starboard/shared/x11/application_x11.cc
index 387cb37..d9d156b 100644
--- a/src/starboard/shared/x11/application_x11.cc
+++ b/src/starboard/shared/x11/application_x11.cc
@@ -609,7 +609,7 @@
   if (state & ShiftMask) {
     key_modifiers |= kSbKeyModifiersShift;
   }
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
   if (state & Button1Mask) {
     key_modifiers |= kSbKeyModifiersPointerButtonLeft;
   }
@@ -629,7 +629,7 @@
   return key_modifiers;
 }
 
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
 SbInputVector XButtonEventToSbInputVectorDelta(XButtonEvent* event) {
   SbInputVector delta = {0, 0};
   switch (event->button) {
@@ -1175,7 +1175,7 @@
       XButtonEvent* x_button_event = reinterpret_cast<XButtonEvent*>(x_event);
       bool is_press_event = ButtonPress == x_event->type;
       bool is_wheel_event = XButtonEventIsWheelEvent(x_button_event);
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
       if (is_wheel_event && !is_press_event) {
         // unpress events from the wheel are discarded.
         return NULL;
@@ -1190,7 +1190,7 @@
           is_press_event ? kSbInputEventTypePress : kSbInputEventTypeUnpress;
       data->device_type = kSbInputDeviceTypeMouse;
       if (is_wheel_event) {
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
         data->pressure = NAN;
         data->size = {NAN, NAN};
         data->tilt = {NAN, NAN};
@@ -1215,7 +1215,7 @@
       SbMemorySet(data.get(), 0, sizeof(*data));
       data->window = FindWindow(x_motion_event->window);
       SB_DCHECK(SbWindowIsValid(data->window));
-#if SB_API_VERSION >= SB_POINTER_INPUT_API_VERSION
+#if SB_API_VERSION >= 6
       data->pressure = NAN;
       data->size = {NAN, NAN};
       data->tilt = {NAN, NAN};
diff --git a/src/starboard/shared/x11/application_x11.h b/src/starboard/shared/x11/application_x11.h
index 48d32d7..ee9fe6a 100644
--- a/src/starboard/shared/x11/application_x11.h
+++ b/src/starboard/shared/x11/application_x11.h
@@ -59,10 +59,10 @@
                    int width,
                    int height) SB_OVERRIDE;
 
-#if SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#if SB_API_VERSION >= 6
   bool IsStartImmediate() SB_OVERRIDE { return !HasPreloadSwitch(); }
   bool IsPreloadImmediate() SB_OVERRIDE { return HasPreloadSwitch(); }
-#endif  // SB_API_VERSION >= SB_PRELOAD_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
  protected:
   // --- Application overrides ---
diff --git a/src/starboard/storage.h b/src/starboard/storage.h
index 33ba547..c3d9963 100644
--- a/src/starboard/storage.h
+++ b/src/starboard/storage.h
@@ -51,7 +51,7 @@
   return record != kSbStorageInvalidRecord;
 }
 
-#if SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION < 6
 
 // Opens and returns the default SbStorageRecord for |user|, blocking I/O on the
 // calling thread until the open is completed. If |user| is not a valid
@@ -62,7 +62,7 @@
 // |user|: The user for which the storage record will be opened.
 SB_EXPORT SbStorageRecord SbStorageOpenRecord(SbUser user);
 
-#else  // SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#else  // SB_API_VERSION < 6
 
 // 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
@@ -77,7 +77,7 @@
 // |name|: The filesystem-safe name of the record to open.
 SB_EXPORT SbStorageRecord SbStorageOpenRecord(SbUser user, const char* name);
 
-#endif  // SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION < 6
 
 // Closes |record|, synchronously ensuring that all written data is flushed.
 // This function performs blocking I/O on the calling thread.
@@ -131,7 +131,7 @@
                                     const char* data,
                                     int64_t data_size);
 
-#if SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION < 6
 
 // Deletes the default |SbStorageRecord| for the |user|. The return value
 // indicates whether the record existed and was successfully deleted. If the
@@ -143,7 +143,7 @@
 // |user|: The user for whom the record will be deleted.
 SB_EXPORT bool SbStorageDeleteRecord(SbUser user);
 
-#else  // SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#else  // SB_API_VERSION < 6
 
 // Deletes the |SbStorageRecord| for |user| named |name|. The return value
 // indicates whether the record existed and was successfully deleted. If the
@@ -159,7 +159,7 @@
 // |name|: The filesystem-safe name of the record to open.
 SB_EXPORT bool SbStorageDeleteRecord(SbUser user, const char* name);
 
-#endif  // SB_API_VERSION < SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION < 6
 
 #ifdef __cplusplus
 }  // extern "C"
@@ -183,7 +183,7 @@
     Initialize();
   }
 
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   explicit StorageRecord(const char* name)
       : user_(SbUserGetCurrent()),
         name_(name),
@@ -195,7 +195,7 @@
       : user_(user), name_(name), record_(kSbStorageInvalidRecord) {
     Initialize();
   }
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
 
   ~StorageRecord() { Close(); }
   bool IsValid() { return SbStorageIsValidRecord(record_); }
@@ -219,36 +219,36 @@
 
   bool Delete() {
     Close();
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
     if (!name_.empty()) {
       return SbStorageDeleteRecord(user_, name_.c_str());
     } else {
       return SbStorageDeleteRecord(user_, NULL);
     }
-#else   // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else   // SB_API_VERSION >= 6
     return SbStorageDeleteRecord(user_);
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
   }
 
  private:
   void Initialize() {
     if (SbUserIsValid(user_)) {
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
       if (!name_.empty()) {
         record_ = SbStorageOpenRecord(user_, name_.c_str());
       } else {
         record_ = SbStorageOpenRecord(user_, NULL);
       }
-#else   // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#else   // SB_API_VERSION >= 6
       record_ = SbStorageOpenRecord(user_);
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
     }
   }
 
   SbUser user_;
-#if SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#if SB_API_VERSION >= 6
   std::string name_;
-#endif  // SB_API_VERSION >= SB_STORAGE_NAMES_API_VERSION
+#endif  // SB_API_VERSION >= 6
   SbStorageRecord record_;
 };
 
diff --git a/src/starboard/system.h b/src/starboard/system.h
index cfa9eed..3a4444e 100644
--- a/src/starboard/system.h
+++ b/src/starboard/system.h
@@ -185,7 +185,7 @@
   // retried, otherwise the app should be stopped.
   kSbSystemPlatformErrorTypeConnectionError,
 
-#if SB_API_VERSION < SB_PLATFORM_ERROR_CLEANUP_API_VERSION
+#if SB_API_VERSION < 6
   // The current user is not signed in.
   kSbSystemPlatformErrorTypeUserSignedOut,
 
diff --git a/src/starboard/time_zone.h b/src/starboard/time_zone.h
index e3bf9c6..b4aec2e 100644
--- a/src/starboard/time_zone.h
+++ b/src/starboard/time_zone.h
@@ -35,7 +35,7 @@
 // Gets the system's current SbTimeZone in minutes.
 SB_EXPORT SbTimeZone SbTimeZoneGetCurrent();
 
-#if SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#if SB_API_VERSION < 6
 // Gets the three-letter code of the current timezone in standard time,
 // regardless of current Daylight Savings Time status. (e.g. "PST")
 #else
@@ -48,11 +48,11 @@
 #endif
 SB_EXPORT const char* SbTimeZoneGetName();
 
-#if SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#if SB_API_VERSION < 6
 // Gets the three-letter code of the current timezone in Daylight Savings Time,
 // regardless of current DST status. (e.g. "PDT")
 SB_EXPORT const char* SbTimeZoneGetDstName();
-#endif  // SB_API_VERSION < SB_TIME_ZONE_FLEXIBLE_API_VERSION
+#endif  // SB_API_VERSION < 6
 
 #ifdef __cplusplus
 }  // extern "C"