diff --git a/codereview.settings b/codereview.settings
new file mode 100644
index 0000000..1950c32
--- /dev/null
+++ b/codereview.settings
@@ -0,0 +1,3 @@
+GERRIT_HOST: cobalt-review.googlesource.com
+GERRIT_AUTODETECT_BRANCH: true
+CODE_REVIEW_SERVER: cobalt-review.googlesource.com
diff --git a/src/CONTRIBUTING.md b/src/CONTRIBUTING.md
new file mode 100644
index 0000000..bd99ed6
--- /dev/null
+++ b/src/CONTRIBUTING.md
@@ -0,0 +1,62 @@
+# Contributing to Cobalt
+
+We'd love to hear about how you would like to contribute to Cobalt! It's worth
+reading through this modest document first, to understand the process and to
+make sure you know what to expect.
+
+
+## Before You Contribute
+
+### As an Individual
+
+Before Cobalt can use your code, as an unaffiliated individual, you must sign
+the [Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual) (CLA), which you can do online.
+
+### As a Company
+
+If you are a company that wishes to have one or more employees contribute to
+Cobalt on-the-clock, that is covered by a different agreement, the
+[Software Grant and Corporate Contributor License Agreement](https://cla.developers.google.com/about/google-corporate).
+
+### What is a CLA?
+
+The Contributor License Agreement is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things — for instance that you'll tell us if
+you know that your code infringes on other people's patents. You don't have to
+sign the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+Before you start working on a larger contribution, you should get in touch with
+us first with your idea so that we can help out and possibly guide
+you. Coordinating up front makes it much easier to avoid frustration later on.
+
+
+### Code Reviews
+
+All submissions, including submissions by project members, require review. We
+currently use [Gerrit Code Review](https://www.gerritcodereview.com/) for this
+purpose. Currently, team-member submissions go through private reviews, and
+external submissions go through public reviews.
+
+
+## Submission Process
+
+We admit that this submission process is currently not completely optimized to
+make contributions easy, and we hope to make improvements to it in the
+future. It will always include some form of signing the CLA and submitting the
+code for review before merging changes into the Cobalt master tree.
+
+  1. Ensure you or your company have signed the appropriate CLA (see "Before You
+     Contribute" above).
+  1. Rebase your changes down into a single git commit.
+  1. Run `git cl upload` to upload the review to
+     [Cobalt's Gerrit instance](https://cobalt-review.googlesource.com/).
+  1. Someone from the maintainers team will review the code, putting up comments
+     on any things that need to change for submission.
+  1. If you need to make changes, make them locally, test them, then `git commit
+     --amend` to add them to the *existing* commit. Then return to step 2.
+  1. If you do not need to make any more changes, a maintainer will integrate
+     the change into our private repository, and it will get pushed out to the
+     public repository after some time.
+
diff --git a/src/README.cobalt.txt b/src/README.cobalt.txt
deleted file mode 100644
index bc2d9c7..0000000
--- a/src/README.cobalt.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git
-
diff --git a/src/README.md b/src/README.md
index fb912c9..025610b 100644
--- a/src/README.md
+++ b/src/README.md
@@ -241,12 +241,12 @@
 optimized, with the most debug information at the top (debug) to the fastest,
 most optimized, and with the least debug information at the bottom (gold):
 
- | Type  | Optimizations | Logging | Asserts | Debug Info | Console  |
- | :---- | :------------ | :------ | :------ | :--------- | :------- |
- | debug | None          | Full    | Full    | Full       | Enabled  |
- | devel | Full          | Full    | Full    | Full       | Enabled  |
- | qa    | Full          | Limited | None    | None       | Enabled  |
- | gold  | Full          | None    | None    | None       | Disabled |
+ Type  | Optimizations | Logging | Asserts | Debug Info | Console
+ :---- | :------------ | :------ | :------ | :--------- | :-------
+ debug | None          | Full    | Full    | Full       | Enabled
+ devel | Full          | Full    | Full    | Full       | Enabled
+ qa    | Full          | Limited | None    | None       | Enabled
+ gold  | Full          | None    | None    | None       | Disabled
 
 When building for release, you should always use a gold build for the final
 product.
@@ -254,3 +254,9 @@
     $ cobalt/build/gyp_cobalt -C gold linux-x64x11
     $ ninja -C out/linux-x64x11_gold cobalt
     $ out/linux-x64x11_gold/cobalt
+
+
+## Origin of this Repository
+
+This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git
+
diff --git a/src/base/debug/leak_annotations.h b/src/base/debug/leak_annotations.h
index 97be127..35a7bec 100644
--- a/src/base/debug/leak_annotations.h
+++ b/src/base/debug/leak_annotations.h
@@ -7,6 +7,17 @@
 
 #include "build/build_config.h"
 
+// By default, Leak Sanitizer and Address Sanitizer is expected
+// to exist together. However, this is not true for all
+// platforms (e.g. PS4).
+// HAS_LEAK_SANTIZIER=0 explicitly removes the Leak Sanitizer from code.
+#ifdef ADDRESS_SANITIZER
+#ifndef HAS_LEAK_SANITIZER
+// Default is that Leak Sanitizer exists whenever Address Sanitizer does.
+#define HAS_LEAK_SANITIZER 1
+#endif
+#endif
+
 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_NACL) && \
     defined(USE_HEAPCHECKER)
 
@@ -29,7 +40,7 @@
 #define ANNOTATE_LEAKING_OBJECT_PTR(X) \
     HeapLeakChecker::IgnoreObject(X)
 
-#elif defined(ADDRESS_SANITIZER)
+#elif defined(ADDRESS_SANITIZER) && HAS_LEAK_SANITIZER
 #include <sanitizer/lsan_interface.h>
 
 class ScopedLeakSanitizerDisabler {
diff --git a/src/base/synchronization/condition_variable_unittest.cc b/src/base/synchronization/condition_variable_unittest.cc
index bc8201f..49d138b 100644
--- a/src/base/synchronization/condition_variable_unittest.cc
+++ b/src/base/synchronization/condition_variable_unittest.cc
@@ -350,6 +350,9 @@
   // Game consoles don't support that many threads. We have a max threads
   // macro in pthread.h. Leave a few to system and test with the rest.
   const int kThreadCount = SHELL_MAX_THREADS - 8;
+#elif defined(ADDRESS_SANITIZER)
+  // AddressSanitizer adds additional stack space to the threads.
+  const int kThreadCount = 50;
 #elif defined(OS_STARBOARD)
   const int kThreadCount = SB_MAX_THREADS - 8;
 #else
diff --git a/src/cobalt/account/starboard/account_manager.cc b/src/cobalt/account/starboard/account_manager.cc
index e6b4834..3a546bb 100644
--- a/src/cobalt/account/starboard/account_manager.cc
+++ b/src/cobalt/account/starboard/account_manager.cc
@@ -18,6 +18,7 @@
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
+#include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "cobalt/base/event_dispatcher.h"
 #include "starboard/user.h"
@@ -88,16 +89,13 @@
   return GetCurrentUserProperty(kSbUserPropertyUserId);
 }
 
-void AccountManagerStarboard::StartSignIn() { SbUserStartSignIn(); }
+void AccountManagerStarboard::StartSignIn() {
+  NOTREACHED() << "Should be handled internally by platform.";
+}
 
 bool AccountManagerStarboard::IsAgeRestricted() {
-  SbUser user = SbUserGetCurrent();
-
-  if (!SbUserIsValid(user)) {
-    return false;
-  }
-
-  return SbUserIsAgeRestricted(user);
+  NOTREACHED() << "Should be handled internally by platform.";
+  return false;
 }
 
 }  // namespace account
diff --git a/src/cobalt/audio/audio_device.cc b/src/cobalt/audio/audio_device.cc
index 9a9e092..5f8d205 100644
--- a/src/cobalt/audio/audio_device.cc
+++ b/src/cobalt/audio/audio_device.cc
@@ -45,6 +45,38 @@
 
 #if defined(SB_USE_SB_AUDIO_SINK)
 
+namespace {
+// Helper function to compute the size of the two valid starboard audio sample
+// types.
+size_t GetSampleSize(SbMediaAudioSampleType sample_type) {
+  switch (sample_type) {
+    case kSbMediaAudioSampleTypeFloat32:
+      return sizeof(float);
+    case kSbMediaAudioSampleTypeInt16:
+      return sizeof(int16);
+  }
+  NOTREACHED();
+  return 0u;
+}
+
+const float kMaxInt16AsFloat32 = 32767.0f;
+
+template <typename SourceType, typename DestType>
+DestType ConvertSample(SourceType sample);
+
+template <>
+int16 ConvertSample<float, int16>(float sample) {
+  DCHECK(-1.0 <= sample && sample <= 1.0)
+      << "Sample of type float32 must lie on interval [-1.0, 1.0]";
+  return static_cast<int16>(sample * kMaxInt16AsFloat32);
+}
+
+template <>
+float ConvertSample<float, float>(float sample) {
+  return sample;
+}
+}  // namespace
+
 class AudioDevice::Impl {
  public:
   Impl(int number_of_channels, RenderCallback* callback);
@@ -62,7 +94,11 @@
 
   void FillOutputAudioBus();
 
+  template <typename OutputType>
+  inline void FillOutputAudioBusForType();
+
   int number_of_channels_;
+  SbMediaAudioSampleType output_sample_type_;
   RenderCallback* render_callback_;
 
   // The |render_callback_| returns audio data in planar form.  So we read it
@@ -70,11 +106,14 @@
   // |output_frame_buffer_|.
   ShellAudioBus input_audio_bus_;
 
-  std::vector<float> output_frame_buffer_;
+  scoped_array<uint8> output_frame_buffer_;
+
   void* frame_buffers_[1];
   int64 frames_rendered_;  // Frames retrieved from |render_callback_|.
   int64 frames_consumed_;  // Accumulated frames consumed reported by the sink.
 
+  bool was_silence_last_update_;
+
   SbAudioSink audio_sink_;
 
   DISALLOW_COPY_AND_ASSIGN(Impl);
@@ -83,13 +122,19 @@
 // AudioDevice::Impl.
 AudioDevice::Impl::Impl(int number_of_channels, RenderCallback* callback)
     : number_of_channels_(number_of_channels),
+      output_sample_type_(
+          SbAudioSinkIsAudioSampleTypeSupported(kSbMediaAudioSampleTypeFloat32)
+              ? kSbMediaAudioSampleTypeFloat32
+              : kSbMediaAudioSampleTypeInt16),
       render_callback_(callback),
       input_audio_bus_(static_cast<size_t>(number_of_channels),
                        static_cast<size_t>(kRenderBufferSizeFrames),
                        ShellAudioBus::kFloat32, ShellAudioBus::kPlanar),
-      output_frame_buffer_(kFramesPerChannel * number_of_channels),
+      output_frame_buffer_(new uint8[kFramesPerChannel * number_of_channels_ *
+                                       GetSampleSize(output_sample_type_)]),
       frames_rendered_(0),
       frames_consumed_(0),
+      was_silence_last_update_(false),
       audio_sink_(kSbAudioSinkInvalid) {
   DCHECK(number_of_channels_ == 1 || number_of_channels_ == 2)
       << "Invalid number of channels: " << number_of_channels_;
@@ -97,15 +142,14 @@
   DCHECK(SbAudioSinkIsAudioFrameStorageTypeSupported(
       kSbMediaAudioFrameStorageTypeInterleaved))
       << "Only interleaved frame storage is supported.";
-  DCHECK(SbAudioSinkIsAudioSampleTypeSupported(kSbMediaAudioSampleTypeFloat32))
-      << "Only float sample is supported.";
+  DCHECK(SbAudioSinkIsAudioSampleTypeSupported(output_sample_type_))
+      << "Output sample type " << output_sample_type_ << " is not supported";
 
-  frame_buffers_[0] = &output_frame_buffer_[0];
+  frame_buffers_[0] = output_frame_buffer_.get();
   audio_sink_ = SbAudioSinkCreate(
-      number_of_channels_, kStandardOutputSampleRate,
-      kSbMediaAudioSampleTypeFloat32, kSbMediaAudioFrameStorageTypeInterleaved,
-      frame_buffers_, kFramesPerChannel,
-      &AudioDevice::Impl::UpdateSourceStatusFunc,
+      number_of_channels_, kStandardOutputSampleRate, output_sample_type_,
+      kSbMediaAudioFrameStorageTypeInterleaved, frame_buffers_,
+      kFramesPerChannel, &AudioDevice::Impl::UpdateSourceStatusFunc,
       &AudioDevice::Impl::ConsumeFramesFunc, this);
   DCHECK(SbAudioSinkIsValid(audio_sink_));
 }
@@ -155,7 +199,12 @@
   if ((kFramesPerChannel - *frames_in_buffer) >= kRenderBufferSizeFrames) {
     bool silence = false;
 
-    input_audio_bus_.ZeroAllFrames();
+    // If there was silence last time we were called, then the buffer has
+    // already been zeroed out and we don't need to do it again.
+    if (!was_silence_last_update_) {
+      input_audio_bus_.ZeroAllFrames();
+    }
+
     // Fill our temporary buffer with planar PCM float samples.
     render_callback_->FillAudioBus(&input_audio_bus_, &silence);
 
@@ -165,31 +214,46 @@
       frames_rendered_ += kRenderBufferSizeFrames;
       *frames_in_buffer += kRenderBufferSizeFrames;
     }
+
+    was_silence_last_update_ = silence;
   }
 
   *offset_in_frames = frames_consumed_ % kFramesPerChannel;
+  *is_playing = (frames_rendered_ != frames_consumed_);
 }
 
 void AudioDevice::Impl::ConsumeFrames(int frames_consumed) {
   frames_consumed_ += frames_consumed;
 }
 
-void AudioDevice::Impl::FillOutputAudioBus() {
+template <typename OutputType>
+inline void AudioDevice::Impl::FillOutputAudioBusForType() {
   // Determine the offset into the audio bus that represents the tail of
   // buffered data.
   uint64 channel_offset = frames_rendered_ % kFramesPerChannel;
 
-  float* output_buffer = &output_frame_buffer_[0];
+  OutputType* output_buffer =
+      reinterpret_cast<OutputType*>(output_frame_buffer_.get());
   output_buffer += channel_offset * number_of_channels_;
-
   for (size_t frame = 0; frame < kRenderBufferSizeFrames; ++frame) {
     for (size_t channel = 0; channel < input_audio_bus_.channels(); ++channel) {
-      *output_buffer = input_audio_bus_.GetFloat32Sample(channel, frame);
+      *output_buffer = ConvertSample<float, OutputType>(
+          input_audio_bus_.GetFloat32Sample(channel, frame));
       ++output_buffer;
     }
   }
 }
 
+void AudioDevice::Impl::FillOutputAudioBus() {
+  if (output_sample_type_ == kSbMediaAudioSampleTypeFloat32) {
+    FillOutputAudioBusForType<float>();
+  } else if (output_sample_type_ == kSbMediaAudioSampleTypeInt16) {
+    FillOutputAudioBusForType<int16>();
+  } else {
+    NOTREACHED();
+  }
+}
+
 #else  // defined(SB_USE_SB_AUDIO_SINK)
 
 class AudioDevice::Impl : public ::media::ShellAudioStream {
diff --git a/src/cobalt/base/c_val.cc b/src/cobalt/base/c_val.cc
index e719bb5..812433b 100644
--- a/src/cobalt/base/c_val.cc
+++ b/src/cobalt/base/c_val.cc
@@ -29,15 +29,15 @@
   // and so this allows its size to be more consistent (and avoids compiler
   // warnings on some platforms).
   registered_vars_ = new NameVarMap();
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   on_changed_hook_set_ = new base::hash_set<OnChangedHook*>();
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 }
 
 CValManager::~CValManager() {
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   delete on_changed_hook_set_;
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
   delete registered_vars_;
 }
 
@@ -62,7 +62,7 @@
   }
 }
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
 void CValManager::PushValueChangedEvent(const CValDetail::CValBase* cval,
                                         const CValGenericValue& value) {
   base::AutoLock auto_lock(hooks_lock_);
@@ -92,7 +92,7 @@
   size_t values_erased ALLOW_UNUSED = cvm->on_changed_hook_set_->erase(this);
   DCHECK_EQ(values_erased, 1);
 }
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
 std::set<std::string> CValManager::GetOrderedCValNames() {
   std::set<std::string> ret;
diff --git a/src/cobalt/base/c_val.h b/src/cobalt/base/c_val.h
index 767fdb6..787f51a 100644
--- a/src/cobalt/base/c_val.h
+++ b/src/cobalt/base/c_val.h
@@ -217,7 +217,7 @@
 
 }  // namespace CValDetail
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
 // This class is passed back to the CVal modified event handlers so that they
 // can examine the new CVal value.  This class knows its type, which can be
 // checked through GetType, and then the actual value can be retrieved by
@@ -281,7 +281,7 @@
 };
 
 }  // namespace CValDetail
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
 // Manager class required for the CVal tracking system to function.
 // This class is designed to be a singleton, instanced only through the methods
@@ -292,7 +292,7 @@
   // Method to get the singleton instance of this class.
   static CValManager* GetInstance();
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   // In order for a system to receive notifications when a tracked CVal changes,
   // it should create a subclass of OnChangedHook with OnValueChanged. When
   // instantiated, OnChangedHook will be called whenever a CVal changes.
@@ -304,7 +304,7 @@
     virtual void OnValueChanged(const std::string& name,
                                 const CValGenericValue& value) = 0;
   };
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
   friend struct StaticMemorySingletonTraits<CValManager>;
 
@@ -332,22 +332,22 @@
   void RegisterCVal(const CValDetail::CValBase* cval);
   void UnregisterCVal(const CValDetail::CValBase* cval);
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   // Called whenever a CVal is modified, and does the work of notifying all
   // hooks.
   void PushValueChangedEvent(const CValDetail::CValBase* cval,
                              const CValGenericValue& value);
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
   // Helper function to remove code duplication between GetValueAsString
   // and GetValueAsPrettyString.
   optional<std::string> GetCValStringValue(const std::string& name,
                                            bool pretty);
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   // Lock that protects against changes to hooks.
   base::Lock hooks_lock_;
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
   // Lock that protects against CVals being registered/deregistered.
   base::Lock cvals_lock_;
@@ -359,11 +359,11 @@
   typedef base::hash_map<std::string, const CValDetail::CValBase*> NameVarMap;
   NameVarMap* registered_vars_;
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   // The set of hooks that we should notify whenever a CVal is modified.
   typedef base::hash_set<OnChangedHook*> OnChangeHookSet;
   OnChangeHookSet* on_changed_hook_set_;
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
   template <typename T>
   friend class CValDetail::CValImpl;
@@ -427,11 +427,11 @@
         value_ = rhs;
       }
     }
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
     if (value_changed) {
       OnValueChanged();
     }
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
     return *this;
   }
 
@@ -440,9 +440,9 @@
       base::AutoLock auto_lock(CValManager::GetInstance()->values_lock_);
       value_ += rhs;
     }
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
     OnValueChanged();
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
     return *this;
   }
 
@@ -451,9 +451,9 @@
       base::AutoLock auto_lock(CValManager::GetInstance()->values_lock_);
       value_ -= rhs;
     }
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
     OnValueChanged();
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
     return *this;
   }
 
@@ -462,9 +462,9 @@
       base::AutoLock auto_lock(CValManager::GetInstance()->values_lock_);
       ++value_;
     }
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
     OnValueChanged();
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
     return *this;
   }
 
@@ -473,9 +473,9 @@
       base::AutoLock auto_lock(CValManager::GetInstance()->values_lock_);
       --value_;
     }
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
     OnValueChanged();
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
     return *this;
   }
 
@@ -505,13 +505,13 @@
     }
   }
 
-#if defined(ENABLE_DEBUG_CONSOLE)
+#if defined(ENABLE_DEBUG_C_VAL)
   void OnValueChanged() {
     // Push the value changed event to all listeners.
     CValManager::GetInstance()->PushValueChangedEvent(
         this, CValSpecificValue<T>(value_));
   }
-#endif  // ENABLE_DEBUG_CONSOLE
+#endif  // ENABLE_DEBUG_C_VAL
 
   T value_;
   mutable bool registered_;
diff --git a/src/cobalt/bindings/IDLExtendedAttributes.txt b/src/cobalt/bindings/IDLExtendedAttributes.txt
index 56b0590..7918baa 100644
--- a/src/cobalt/bindings/IDLExtendedAttributes.txt
+++ b/src/cobalt/bindings/IDLExtendedAttributes.txt
@@ -73,7 +73,9 @@
 
 # Call the Cobalt function this property is bound to with the corresponding
 # object added to the head of the function's parameters.
-CallWith=EnvironmentSettings
+# StackTrace is a custom addition to CallWith for the purpose of testing
+# GetStackTrace, and is not specified in the spec.
+CallWith=EnvironmentSettings|StackTrace
 ConstructorCallWith=EnvironmentSettings
 
 # The constructor/attribute/operation may raise an exception. A pointer to an
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc b/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc
index 32f9f26..1fb9cf2 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc
@@ -287,6 +287,11 @@
     JSC::ExecState* exec,
     JSC::JSObject* this_object,
     JSC::JSValue value);
+JSC::JSValue getJSwindow(
+    JSC::ExecState* exec_state,
+    JSC::JSValue slot_base,
+    JSC::PropertyName property_name);
+JSC::EncodedJSValue functionJSgetStackTrace(JSC::ExecState*);
 JSC::EncodedJSValue functionJSwindowOperation(JSC::ExecState*);
 
 // These are declared unconditionally, but only defined if needed by the
@@ -603,6 +608,18 @@
         reinterpret_cast<intptr_t>(setJSwindowProperty),
         JSC::NoIntrinsic
     },
+    { "window",
+        JSC::DontDelete | JSC::ReadOnly,
+        reinterpret_cast<intptr_t>(getJSwindow),
+        0,
+        JSC::NoIntrinsic
+    },
+    { "getStackTrace",
+        JSC::DontDelete | JSC::Function,
+        reinterpret_cast<intptr_t>(functionJSgetStackTrace),
+        static_cast<intptr_t>(0),
+        JSC::NoIntrinsic
+    },
     { "windowOperation",
         JSC::DontDelete | JSC::Function,
         reinterpret_cast<intptr_t>(functionJSwindowOperation),
@@ -614,8 +631,8 @@
 
 // static
 const JSC::HashTable JSCWindow::property_table_prototype = {
-    9,  // compactSize
-    7,  // compactSizeMask
+    19,  // compactSize
+    15,  // compactSizeMask
     property_table_values,
     NULL  // table allocated at runtime
 };  // JSCWindow::property_table_prototype
@@ -1019,6 +1036,44 @@
   }
 }
 
+JSC::JSValue getJSwindow(
+    JSC::ExecState* exec_state,
+    JSC::JSValue slot_base,
+    JSC::PropertyName property_name) {
+  TRACE_EVENT0("JSCWindow", "get window");
+  JSCGlobalObject* global_object =
+      JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
+  Window* impl =
+      GetWrappableOrSetException<Window>(exec_state, slot_base);
+  if (!impl) {
+    return exec_state->exception();
+  }
+
+  JSC::JSValue result = ToJSValue(
+      global_object,
+      impl->window());
+  return result;
+}
+
+JSC::EncodedJSValue functionJSgetStackTrace(
+    JSC::ExecState* exec_state) {
+  TRACE_EVENT0("JSCWindow", "call getStackTrace");
+  JSCGlobalObject* global_object =
+      JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
+  JSCExceptionState exception_state(global_object);
+  JSC::JSObject* this_object =
+      exec_state->hostThisValue().toThisObject(exec_state);
+  Window* impl =
+      GetWrappableOrSetException<Window>(exec_state, this_object);
+  if (!impl) {
+    return JSC::JSValue::encode(exec_state->exception());
+  }
+
+  TypeTraits<std::string >::ReturnType return_value = impl->GetStackTrace(global_object->GetStackTrace());
+  return JSC::JSValue::encode(ToJSValue(global_object, return_value));
+
+}
+
 JSC::EncodedJSValue functionJSwindowOperation(
     JSC::ExecState* exec_state) {
   TRACE_EVENT0("JSCWindow", "call windowOperation");
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc
index d314658..546197c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc
@@ -205,6 +205,26 @@
 static base::LazyInstance<MozjsAnonymousIndexedGetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsAnonymousIndexedGetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -253,6 +273,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -306,14 +327,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -392,8 +411,11 @@
 // static
 JSObject* MozjsAnonymousIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -401,34 +423,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsAnonymousIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsAnonymousIndexedGetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsAnonymousIndexedGetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsAnonymousIndexedGetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsAnonymousIndexedGetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.h
index 56a2226..1f01c81 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc
index 7cc34a6..9cb9a00 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc
@@ -205,6 +205,26 @@
 static base::LazyInstance<MozjsAnonymousNamedGetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsAnonymousNamedGetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -253,6 +273,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -278,14 +299,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -364,8 +383,11 @@
 // static
 JSObject* MozjsAnonymousNamedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -373,34 +395,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsAnonymousNamedGetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsAnonymousNamedGetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsAnonymousNamedGetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsAnonymousNamedGetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsAnonymousNamedGetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.h
index 36537ae..3b02269 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc
index 519c86f..0b1e79d 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc
@@ -296,6 +296,26 @@
 static base::LazyInstance<MozjsAnonymousNamedIndexedGetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsAnonymousNamedIndexedGetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -344,6 +364,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -397,14 +418,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -483,8 +502,11 @@
 // static
 JSObject* MozjsAnonymousNamedIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -492,34 +514,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsAnonymousNamedIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsAnonymousNamedIndexedGetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsAnonymousNamedIndexedGetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsAnonymousNamedIndexedGetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsAnonymousNamedIndexedGetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.h
index 6665fe1..3c53111 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc
index eb16ae9..4073689 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsArbitraryInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -274,14 +295,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -370,8 +389,11 @@
 // static
 JSObject* MozjsArbitraryInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -379,34 +401,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsArbitraryInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsArbitraryInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsArbitraryInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsArbitraryInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsArbitraryInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.h
index 1ca5d0d..d1f6fa5 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc
index 1213bf6..f0e5922 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsBaseInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -252,14 +273,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -348,8 +367,11 @@
 // static
 JSObject* MozjsBaseInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -357,34 +379,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsBaseInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsBaseInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsBaseInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsBaseInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsBaseInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.h
index 6a9f2c0..2312b77 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc
index b334f88..86e82f3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsBooleanTypeTestInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsBooleanTypeTestInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -332,14 +353,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -418,8 +437,11 @@
 // static
 JSObject* MozjsBooleanTypeTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -427,34 +449,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsBooleanTypeTestInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsBooleanTypeTestInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsBooleanTypeTestInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsBooleanTypeTestInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsBooleanTypeTestInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.h
index d240a38..fa3f0e3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc
index a6360ce..379afa8 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsCallbackFunctionInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsCallbackFunctionInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -561,14 +582,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -647,8 +666,11 @@
 // static
 JSObject* MozjsCallbackFunctionInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -656,34 +678,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsCallbackFunctionInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsCallbackFunctionInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsCallbackFunctionInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsCallbackFunctionInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsCallbackFunctionInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.h
index e85e0f2..dea49b2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc
index 3a9b54c..b387cf6 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsCallbackInterfaceInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsCallbackInterfaceInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -330,14 +351,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -416,8 +435,11 @@
 // static
 JSObject* MozjsCallbackInterfaceInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -425,34 +447,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsCallbackInterfaceInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsCallbackInterfaceInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsCallbackInterfaceInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsCallbackInterfaceInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsCallbackInterfaceInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.h
index ea10dca..788a86f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc
index eae8530..dcf4ed6 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc
@@ -116,6 +116,26 @@
 static base::LazyInstance<MozjsConditionalInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsConditionalInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -164,6 +184,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -375,14 +396,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -461,8 +480,11 @@
 // static
 JSObject* MozjsConditionalInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -470,34 +492,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsConditionalInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsConditionalInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsConditionalInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsConditionalInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsConditionalInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.h
index 76eae81..ea935c1 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.h
@@ -43,8 +43,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc
index 06ca83e..467b6de 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc
@@ -143,6 +143,26 @@
   return !exception_state.is_exception_set();
 }
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsConstantsInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -191,6 +211,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -240,14 +261,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -326,8 +345,11 @@
 // static
 JSObject* MozjsConstantsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -335,34 +357,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsConstantsInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsConstantsInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsConstantsInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsConstantsInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsConstantsInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.h
index fe793ef..3501f0f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc
index 7ca19b8..8367aeb 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsConstructorInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -189,14 +210,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -285,8 +304,11 @@
 // static
 JSObject* MozjsConstructorInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -294,34 +316,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsConstructorInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsConstructorInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsConstructorInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsConstructorInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsConstructorInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.h
index d04a69f..ccf6f57 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc
index cdc6b94..bcf7385 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsConstructorWithArgumentsInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -273,14 +294,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -369,8 +388,11 @@
 // static
 JSObject* MozjsConstructorWithArgumentsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -378,34 +400,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsConstructorWithArgumentsInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsConstructorWithArgumentsInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsConstructorWithArgumentsInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsConstructorWithArgumentsInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsConstructorWithArgumentsInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.h
index 44d36d4..76c43fc 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc
index bc6eb8b..18dd40a 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsDOMStringTestInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsDOMStringTestInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -443,14 +464,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -529,8 +548,11 @@
 // static
 JSObject* MozjsDOMStringTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -538,34 +560,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsDOMStringTestInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsDOMStringTestInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsDOMStringTestInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsDOMStringTestInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsDOMStringTestInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.h
index 0cde0d8..875490c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc
index 7770e5c..e84fa83 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc
@@ -296,6 +296,26 @@
 static base::LazyInstance<MozjsDerivedGetterSetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsDerivedGetterSetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -344,6 +364,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -608,16 +629,14 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
-      context, bindings::testing::MozjsNamedIndexedGetterInterface::GetPrototype(context));
+      context, bindings::testing::MozjsNamedIndexedGetterInterface::GetPrototype(context, global_object));
   DCHECK(parent_prototype);
 
   // Create the Prototype object.
@@ -694,8 +713,11 @@
 // static
 JSObject* MozjsDerivedGetterSetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -703,34 +725,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsDerivedGetterSetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsDerivedGetterSetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsDerivedGetterSetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsDerivedGetterSetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsDerivedGetterSetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.h
index 6913c19..b0164cab 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.h
@@ -42,8 +42,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc
index 96a27ce..3edab69 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsDerivedInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -252,16 +273,14 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
-      context, bindings::testing::MozjsBaseInterface::GetPrototype(context));
+      context, bindings::testing::MozjsBaseInterface::GetPrototype(context, global_object));
   DCHECK(parent_prototype);
 
   // Create the Prototype object.
@@ -348,8 +367,11 @@
 // static
 JSObject* MozjsDerivedInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -357,34 +379,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsDerivedInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsDerivedInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsDerivedInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsDerivedInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsDerivedInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.h
index 59beb06..ac9780c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.h
@@ -42,8 +42,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc
index baf4573..54c8308 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc
@@ -116,6 +116,26 @@
 static base::LazyInstance<MozjsDisabledInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsDisabledInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -164,6 +184,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -274,14 +295,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -360,8 +379,11 @@
 // static
 JSObject* MozjsDisabledInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -369,34 +391,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsDisabledInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsDisabledInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsDisabledInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsDisabledInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsDisabledInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.h
index 360c946..bbef7b3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.h
@@ -43,8 +43,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc
index 2ed75aa..1ec0bac 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc
@@ -124,6 +124,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsEnumerationInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -172,6 +192,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -248,14 +269,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -344,8 +363,11 @@
 // static
 JSObject* MozjsEnumerationInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -353,34 +375,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsEnumerationInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsEnumerationInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsEnumerationInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsEnumerationInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsEnumerationInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.h
index b4b3e19..34f404e 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc
index 498e223..8a5b4b0 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc
@@ -43,6 +43,7 @@
 #include "cobalt/script/mozjs/wrapper_private.h"
 #include "cobalt/script/property_enumerator.h"
 #include "third_party/mozjs/js/src/jsapi.h"
+#include "third_party/mozjs/js/src/jsexn.h"
 #include "third_party/mozjs/js/src/jsfriendapi.h"
 
 namespace {
@@ -114,6 +115,26 @@
 static base::LazyInstance<MozjsExceptionObjectInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsExceptionObjectInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -243,22 +265,22 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
 
-  // Create the Prototype object.
-  interface_data->prototype = JS_NewObjectWithGivenProto(
-      context, &interface_data->prototype_class_definition, parent_prototype,
-      NULL);
+  JS::RootedObject prototype(context);
+  // Get Error prototype.
+  bool success_check = js_GetClassPrototype(
+      context, GetExceptionProtoKey(JSEXN_ERR), &prototype);
+  DCHECK(success_check);
+  interface_data->prototype = prototype;
   bool success = JS_DefineProperties(
       context, interface_data->prototype, prototype_properties);
   DCHECK(success);
@@ -329,8 +351,11 @@
 // static
 JSObject* MozjsExceptionObjectInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -338,34 +363,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsExceptionObjectInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsExceptionObjectInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsExceptionObjectInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsExceptionObjectInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsExceptionObjectInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.h
index 0ba0055..4c8282d 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc
index 21cbe31..c58594c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsExceptionsInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -274,14 +295,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -370,8 +389,11 @@
 // static
 JSObject* MozjsExceptionsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -379,34 +401,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsExceptionsInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsExceptionsInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsExceptionsInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsExceptionsInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsExceptionsInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
@@ -420,6 +453,10 @@
 
   scoped_refptr<ExceptionsInterface> new_object =
       new ExceptionsInterface(&exception_state);
+  // In case that an exception is thrown from constructor.
+  if (exception_state.is_exception_set()) {
+    return false;
+  }
   JS::RootedValue result_value(context);
   ToJSValue(context, new_object, &result_value);
   DCHECK(result_value.isObject());
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.h
index b5fe100..fa0457d 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc
index 06bcf72..3753f38 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsExtendedIDLAttributesInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsExtendedIDLAttributesInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -224,14 +245,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -310,8 +329,11 @@
 // static
 JSObject* MozjsExtendedIDLAttributesInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -319,34 +341,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsExtendedIDLAttributesInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsExtendedIDLAttributesInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsExtendedIDLAttributesInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsExtendedIDLAttributesInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsExtendedIDLAttributesInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.h
index 68909d5..b99f5b7 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc
index fbfc60a..1a71dae 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsGetOpaqueRootInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -189,14 +210,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -285,8 +304,11 @@
 // static
 JSObject* MozjsGetOpaqueRootInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -294,34 +316,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsGetOpaqueRootInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsGetOpaqueRootInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsGetOpaqueRootInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsGetOpaqueRootInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsGetOpaqueRootInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.h
index 343e465..cfc9474 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc
index 27e94db..e02ee9c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsGlobalInterfaceParentHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsGlobalInterfaceParent::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -222,14 +243,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -308,8 +327,11 @@
 // static
 JSObject* MozjsGlobalInterfaceParent::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -317,34 +339,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsGlobalInterfaceParent::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsGlobalInterfaceParent::GetPrototype(JSContext* context) {
+JSObject* MozjsGlobalInterfaceParent::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsGlobalInterfaceParent::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsGlobalInterfaceParent::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.h
index 0ed43cb..2747058 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc
index e67543f..a392376 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc
@@ -220,6 +220,26 @@
 static base::LazyInstance<MozjsIndexedGetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsIndexedGetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -268,6 +288,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -501,14 +522,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -587,8 +606,11 @@
 // static
 JSObject* MozjsIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -596,34 +618,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsIndexedGetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsIndexedGetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsIndexedGetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsIndexedGetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.h
index a61619c..28984fe 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc
index 5831dae..d629315 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsInterfaceWithUnsupportedPropertiesHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsInterfaceWithUnsupportedProperties::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -215,14 +236,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -301,8 +320,11 @@
 // static
 JSObject* MozjsInterfaceWithUnsupportedProperties::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -310,34 +332,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsInterfaceWithUnsupportedProperties::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsInterfaceWithUnsupportedProperties::GetPrototype(JSContext* context) {
+JSObject* MozjsInterfaceWithUnsupportedProperties::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsInterfaceWithUnsupportedProperties::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsInterfaceWithUnsupportedProperties::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.h
index 417e204..24c2964 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc
index f0a1359..bdb7519 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc
@@ -115,6 +115,26 @@
     proxy_handler;
 
 JSBool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNamedConstructorInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -163,6 +183,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   interface_object_class->construct = Constructor;
   return interface_data;
 }
@@ -189,14 +210,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -285,8 +304,11 @@
 // static
 JSObject* MozjsNamedConstructorInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -294,34 +316,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNamedConstructorInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNamedConstructorInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNamedConstructorInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNamedConstructorInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNamedConstructorInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.h
index 670e6fc..bee4c6b 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc
index d9debc4..f77d8de 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc
@@ -220,6 +220,26 @@
 static base::LazyInstance<MozjsNamedGetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNamedGetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -268,6 +288,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -473,14 +494,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -559,8 +578,11 @@
 // static
 JSObject* MozjsNamedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -568,34 +590,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNamedGetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNamedGetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNamedGetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNamedGetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNamedGetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.h
index 613c1b9..0d06347 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc
index e63ec48..bc60f6a 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc
@@ -296,6 +296,26 @@
 static base::LazyInstance<MozjsNamedIndexedGetterInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNamedIndexedGetterInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -344,6 +364,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -734,14 +755,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -820,8 +839,11 @@
 // static
 JSObject* MozjsNamedIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -829,34 +851,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNamedIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNamedIndexedGetterInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNamedIndexedGetterInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNamedIndexedGetterInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNamedIndexedGetterInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.h
index d0cc78a..ef5bbfa 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc
index e665fea..d30656e 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsNestedPutForwardsInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNestedPutForwardsInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -263,14 +284,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -349,8 +368,11 @@
 // static
 JSObject* MozjsNestedPutForwardsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -358,34 +380,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNestedPutForwardsInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNestedPutForwardsInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNestedPutForwardsInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNestedPutForwardsInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNestedPutForwardsInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.h
index 47b1965..50e0e3c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc
index ecf9e98..1848abb 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsNoConstructorInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNoConstructorInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -187,14 +208,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -273,8 +292,11 @@
 // static
 JSObject* MozjsNoConstructorInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -282,34 +304,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNoConstructorInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNoConstructorInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNoConstructorInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNoConstructorInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNoConstructorInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.h
index 1c2a1c8..8fe1474 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc
index 27d50a2..1ad2cbb 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsNoInterfaceObjectInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNoInterfaceObjectInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -187,14 +208,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -233,8 +252,11 @@
 // static
 JSObject* MozjsNoInterfaceObjectInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -242,24 +264,31 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNoInterfaceObjectInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNoInterfaceObjectInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNoInterfaceObjectInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.h
index 8d5c0f1..1d0061f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.h
@@ -41,7 +41,8 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc
index 3176045..04c7ec4 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsNullableTypesTestInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNullableTypesTestInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -771,14 +792,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -857,8 +876,11 @@
 // static
 JSObject* MozjsNullableTypesTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -866,34 +888,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNullableTypesTestInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNullableTypesTestInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNullableTypesTestInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNullableTypesTestInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNullableTypesTestInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.h
index 69bfddd..7b7bcb2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc
index bfa31b4..546ed1a 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsNumericTypesTestInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsNumericTypesTestInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -1637,14 +1658,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -1723,8 +1742,11 @@
 // static
 JSObject* MozjsNumericTypesTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -1732,34 +1754,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsNumericTypesTestInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsNumericTypesTestInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsNumericTypesTestInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsNumericTypesTestInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsNumericTypesTestInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.h
index f33342b..e02d41a 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc
index 5e32d87..4dbc0b3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc
@@ -126,6 +126,26 @@
 static base::LazyInstance<MozjsObjectTypeBindingsInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsObjectTypeBindingsInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -174,6 +194,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -377,14 +398,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -463,8 +482,11 @@
 // static
 JSObject* MozjsObjectTypeBindingsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -472,34 +494,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsObjectTypeBindingsInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsObjectTypeBindingsInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsObjectTypeBindingsInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsObjectTypeBindingsInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsObjectTypeBindingsInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.h
index 27aa23c..8ae6e03 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc
index 473b292..7d9c1b0 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsOperationsTestInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsOperationsTestInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -1460,14 +1481,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -1546,8 +1565,11 @@
 // static
 JSObject* MozjsOperationsTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -1555,34 +1577,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsOperationsTestInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsOperationsTestInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsOperationsTestInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsOperationsTestInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsOperationsTestInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.h
index d0e54e1..3968437 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc
index b977879..c632988 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsPutForwardsInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsPutForwardsInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -304,14 +325,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -390,8 +409,11 @@
 // static
 JSObject* MozjsPutForwardsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -399,34 +421,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsPutForwardsInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsPutForwardsInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsPutForwardsInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsPutForwardsInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsPutForwardsInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.h
index 06a6435..f0f5881 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc
index 210586c..7cd708f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc
@@ -118,6 +118,26 @@
 static base::LazyInstance<MozjsStaticPropertiesInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsStaticPropertiesInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -166,6 +186,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -486,14 +507,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -572,8 +591,11 @@
 // static
 JSObject* MozjsStaticPropertiesInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -581,34 +603,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsStaticPropertiesInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsStaticPropertiesInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsStaticPropertiesInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsStaticPropertiesInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsStaticPropertiesInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.h
index db46890..27cb5e2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc
index d77b60e..2471dfc 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsStringifierAnonymousOperationInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsStringifierAnonymousOperationInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -226,14 +247,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -312,8 +331,11 @@
 // static
 JSObject* MozjsStringifierAnonymousOperationInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -321,34 +343,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsStringifierAnonymousOperationInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsStringifierAnonymousOperationInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsStringifierAnonymousOperationInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsStringifierAnonymousOperationInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsStringifierAnonymousOperationInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.h
index 0115c6a..b18e5a5 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc
index d652475..f97b025 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsStringifierAttributeInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsStringifierAttributeInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -276,14 +297,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -362,8 +381,11 @@
 // static
 JSObject* MozjsStringifierAttributeInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -371,34 +393,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsStringifierAttributeInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsStringifierAttributeInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsStringifierAttributeInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsStringifierAttributeInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsStringifierAttributeInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.h
index 813ec74..fcf8292 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc
index 30a5d06..3a96a4b 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsStringifierOperationInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsStringifierOperationInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -267,14 +288,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -353,8 +372,11 @@
 // static
 JSObject* MozjsStringifierOperationInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -362,34 +384,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsStringifierOperationInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsStringifierOperationInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsStringifierOperationInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsStringifierOperationInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsStringifierOperationInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.h
index 135e07a..a5f76d1 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc
index b7d73d0..49786d1 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc
@@ -114,6 +114,26 @@
 static base::LazyInstance<MozjsTargetInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsTargetInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -162,6 +182,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -257,14 +278,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -343,8 +362,11 @@
 // static
 JSObject* MozjsTargetInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -352,34 +374,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsTargetInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsTargetInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsTargetInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsTargetInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsTargetInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.h
index 71f1e20..34254e0 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc
index 8d181ac..bc19f25 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc
@@ -122,6 +122,26 @@
 static base::LazyInstance<MozjsUnionTypesInterfaceHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsUnionTypesInterface::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -170,6 +190,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -395,14 +416,12 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   DCHECK(parent_prototype);
@@ -481,8 +500,11 @@
 // static
 JSObject* MozjsUnionTypesInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -490,34 +512,45 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsUnionTypesInterface::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsUnionTypesInterface::GetPrototype(JSContext* context) {
+JSObject* MozjsUnionTypesInterface::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsUnionTypesInterface::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsUnionTypesInterface::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.h
index eba6b2f..7de2382 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.h
@@ -41,8 +41,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc
index b626b88..f52bcf2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc
@@ -298,6 +298,26 @@
 static base::LazyInstance<MozjsWindowHandler>
     proxy_handler;
 
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, MozjsWindow::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -346,6 +366,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
   return interface_data;
 }
 
@@ -393,6 +414,64 @@
   return !exception_state.is_exception_set();
 }
 
+JSBool get_window(
+    JSContext* context, JS::HandleObject object, JS::HandleId id,
+    JS::MutableHandleValue vp) {
+  MozjsExceptionState exception_state(context);
+  JS::RootedValue result_value(context);
+
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromObject(context, object);
+  Window* impl =
+      wrapper_private->wrappable<Window>().get();
+
+  if (!exception_state.is_exception_set()) {
+    ToJSValue(context,
+              impl->window(),
+              &result_value);
+  }
+  if (!exception_state.is_exception_set()) {
+    vp.set(result_value);
+  }
+  return !exception_state.is_exception_set();
+}
+
+JSBool fcn_getStackTrace(
+    JSContext* context, uint32_t argc, JS::Value *vp) {
+  JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
+  // Compute the 'this' value.
+  JS::RootedValue this_value(context, JS_ComputeThis(context, vp));
+  // 'this' should be an object.
+  JS::RootedObject object(context);
+  if (JS_TypeOfValue(context, this_value) != JSTYPE_OBJECT) {
+    NOTREACHED();
+    return false;
+  }
+  if (!JS_ValueToObject(context, this_value, object.address())) {
+    NOTREACHED();
+    return false;
+  }
+  MozjsExceptionState exception_state(context);
+  JS::RootedValue result_value(context);
+
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromObject(context, object);
+  Window* impl =
+      wrapper_private->wrappable<Window>().get();
+  MozjsGlobalObjectProxy* global_object_proxy =
+      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+
+  if (!exception_state.is_exception_set()) {
+    ToJSValue(context,
+              impl->GetStackTrace(global_object_proxy->GetStackTrace()),
+              &result_value);
+  }
+  if (!exception_state.is_exception_set()) {
+    args.rval().set(result_value);
+  }
+  return !exception_state.is_exception_set();
+}
+
 JSBool fcn_windowOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -429,11 +508,24 @@
       JSOP_WRAPPER(&get_windowProperty),
       JSOP_WRAPPER(&set_windowProperty),
   },
+  {  // Readonly attribute
+      "window", 0,
+      JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_READONLY,
+      JSOP_WRAPPER(&get_window),
+      JSOP_NULLWRAPPER,
+  },
   JS_PS_END
 };
 
 const JSFunctionSpec prototype_functions[] = {
   {
+      "getStackTrace",
+      JSOP_WRAPPER(&fcn_getStackTrace),
+      0,
+      JSPROP_ENUMERATE,
+      NULL,
+  },
+  {
       "windowOperation",
       JSOP_WRAPPER(&fcn_windowOperation),
       0,
@@ -456,16 +548,14 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   JS::RootedObject parent_prototype(
-      context, bindings::testing::MozjsGlobalInterfaceParent::GetPrototype(context));
+      context, bindings::testing::MozjsGlobalInterfaceParent::GetPrototype(context, global_object));
   DCHECK(parent_prototype);
 
   // Create the Prototype object.
@@ -556,13 +646,8 @@
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
 
-  // Set the global object pointer, so we can access the standard classes such
-  // as the base Object prototype when looking up our prototype.
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  global_object_proxy->SetGlobalObject(global_object);
-
-  JS::RootedObject prototype(context, MozjsWindow::GetPrototype(context));
+  JS::RootedObject prototype(
+      context, MozjsWindow::GetPrototype(context, global_object));
   DCHECK(prototype);
   JS_SetPrototype(context, global_object, prototype);
 
@@ -573,34 +658,51 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, global_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
+
+  // Set the global object proxy pointer, so we can access the standard classes
+  // such as the base Object prototype when looking up our prototype.
+  MozjsGlobalObjectProxy* global_object_proxy =
+      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  global_object_proxy->SetGlobalObjectProxyAndWrapper(proxy, wrappable);
   return proxy;
 }
 
 //static
 const JSClass* MozjsWindow::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* MozjsWindow::GetPrototype(JSContext* context) {
+JSObject* MozjsWindow::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
 }
 
 // static
-JSObject* MozjsWindow::GetInterfaceObject(JSContext* context) {
+JSObject* MozjsWindow::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
@@ -629,7 +731,8 @@
       context, global_interface);
   mozjs_global_object_proxy->SetEnvironmentSettings(environment_settings);
 
-  WrapperFactory* wrapper_factory = mozjs_global_object_proxy->wrapper_factory();
+  WrapperFactory* wrapper_factory =
+      mozjs_global_object_proxy->wrapper_factory();
   wrapper_factory->RegisterWrappableType(
       AnonymousIndexedGetterInterface::AnonymousIndexedGetterInterfaceWrappableType(),
       base::Bind(MozjsAnonymousIndexedGetterInterface::CreateProxy),
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.h b/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.h
index c7e508c..50db9dd 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.h
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.h
@@ -42,8 +42,10 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 };
 
 }  // namespace bindings
diff --git a/src/cobalt/bindings/mozjs/templates/interface.cc.template b/src/cobalt/bindings/mozjs/templates/interface.cc.template
index ad65ba4..16134d5 100644
--- a/src/cobalt/bindings/mozjs/templates/interface.cc.template
+++ b/src/cobalt/bindings/mozjs/templates/interface.cc.template
@@ -41,6 +41,9 @@
 #include "cobalt/script/mozjs/wrapper_private.h"
 #include "cobalt/script/property_enumerator.h"
 #include "third_party/mozjs/js/src/jsapi.h"
+{% if is_exception_interface %}
+#include "third_party/mozjs/js/src/jsexn.h"
+{% endif %}
 #include "third_party/mozjs/js/src/jsfriendapi.h"
 {% endblock includes %}
 {% block using_directives %}
@@ -317,6 +320,26 @@
 }
 
 {% endfor %}
+JSBool HasInstance(JSContext *context, JS::HandleObject type,
+                   JS::MutableHandleValue vp, JSBool *success) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, type));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(
+      context, {{binding_class}}::GetPrototype(context, global_object));
+
+  // |IsDelegate| walks the prototype chain of an object returning true if
+  // .prototype is found.
+  bool is_delegate;
+  if (!IsDelegate(context, prototype, vp, &is_delegate)) {
+    *success = false;
+    return false;
+  }
+
+  *success = is_delegate;
+  return true;
+}
 
 InterfaceData* CreateCachedInterfaceData() {
   InterfaceData* interface_data = new InterfaceData();
@@ -366,6 +389,7 @@
   interface_object_class->enumerate = JS_EnumerateStub;
   interface_object_class->resolve = JS_ResolveStub;
   interface_object_class->convert = JS_ConvertStub;
+  interface_object_class->hasInstance = &HasInstance;
 {% if constructor %}
   interface_object_class->construct = Constructor;
 {% endif %}
@@ -380,8 +404,13 @@
 JSBool get_{{attribute.idl_name}}(
     JSContext* context, JS::HandleObject object, JS::HandleId id,
     JS::MutableHandleValue vp) {
+  JS::RootedObject global_object(
+      context, JS_GetGlobalForObject(context, object));
+  DCHECK(global_object);
+
   JS::RootedObject interface_object(context,
-      Mozjs{{attribute.interface_name}}::GetInterfaceObject(context));
+      Mozjs{{attribute.interface_name}}::GetInterfaceObject(
+          context, global_object));
   vp.set(JS::ObjectValue(*interface_object));
   return true;
 }
@@ -626,27 +655,34 @@
 };
 
 void InitializePrototypeAndInterfaceObject(
-    InterfaceData* interface_data, JSContext* context) {
+    InterfaceData* interface_data, JSContext* context,
+    JS::HandleObject global_object) {
   DCHECK(!interface_data->prototype);
   DCHECK(!interface_data->interface_object);
+  DCHECK(JS_IsGlobalObject(global_object));
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  JS::RootedObject global_object(context, global_object_proxy->global_object());
-  DCHECK(global_object);
   {% if parent_interface %}
   JS::RootedObject parent_prototype(
-      context, {{parent_interface}}::GetPrototype(context));
+      context, {{parent_interface}}::GetPrototype(context, global_object));
   {% else %}
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
   {% endif %}
   DCHECK(parent_prototype);
 
+{% if is_exception_interface %}
+  JS::RootedObject prototype(context);
+  // Get Error prototype.
+  bool success_check = js_GetClassPrototype(
+      context, GetExceptionProtoKey(JSEXN_ERR), &prototype);
+  DCHECK(success_check);
+  interface_data->prototype = prototype;
+{% else %}
   // Create the Prototype object.
   interface_data->prototype = JS_NewObjectWithGivenProto(
       context, &interface_data->prototype_class_definition, parent_prototype,
       NULL);
+{% endif %}
   bool success = JS_DefineProperties(
       context, interface_data->prototype, prototype_properties);
   DCHECK(success);
@@ -746,13 +782,8 @@
   JS::RootedObject parent_prototype(
       context, JS_GetObjectPrototype(context, global_object));
 
-  // Set the global object pointer, so we can access the standard classes such
-  // as the base Object prototype when looking up our prototype.
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  global_object_proxy->SetGlobalObject(global_object);
-
-  JS::RootedObject prototype(context, {{binding_class}}::GetPrototype(context));
+  JS::RootedObject prototype(
+      context, {{binding_class}}::GetPrototype(context, global_object));
   DCHECK(prototype);
   JS_SetPrototype(context, global_object, prototype);
 
@@ -763,7 +794,13 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, global_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
+
+  // Set the global object proxy pointer, so we can access the standard classes
+  // such as the base Object prototype when looking up our prototype.
+  MozjsGlobalObjectProxy* global_object_proxy =
+      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  global_object_proxy->SetGlobalObjectProxyAndWrapper(proxy, wrappable);
   return proxy;
 }
 
@@ -771,8 +808,11 @@
 // static
 JSObject* {{binding_class}}::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
   InterfaceData* interface_data = GetInterfaceData(context);
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   DCHECK(prototype);
   JS::RootedObject new_object(context, JS_NewObjectWithGivenProto(
       context, &interface_data->instance_class_definition, prototype, NULL));
@@ -780,7 +820,7 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(proxy, wrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
   return proxy;
 }
 
@@ -788,17 +828,24 @@
 //static
 const JSClass* {{binding_class}}::PrototypeClass(
       JSContext* context) {
-  JS::RootedObject prototype(context, GetPrototype(context));
+  JS::RootedObject global_object(context, JS_GetGlobalForScopeChain(context));
+  DCHECK(global_object);
+
+  JS::RootedObject prototype(context, GetPrototype(context, global_object));
   JSClass* proto_class = JS_GetClass(*prototype.address());
   return proto_class;
 }
 
 // static
-JSObject* {{binding_class}}::GetPrototype(JSContext* context) {
+JSObject* {{binding_class}}::GetPrototype(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->prototype) {
     // Create new prototype that has all the props and methods
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->prototype);
   return interface_data->prototype;
@@ -806,10 +853,14 @@
 
 {% if has_interface_object %}
 // static
-JSObject* {{binding_class}}::GetInterfaceObject(JSContext* context) {
+JSObject* {{binding_class}}::GetInterfaceObject(
+    JSContext* context, JS::HandleObject global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   InterfaceData* interface_data = GetInterfaceData(context);
   if (!interface_data->interface_object) {
-    InitializePrototypeAndInterfaceObject(interface_data, context);
+    InitializePrototypeAndInterfaceObject(
+        interface_data, context, global_object);
   }
   DCHECK(interface_data->interface_object);
   return interface_data->interface_object;
@@ -847,7 +898,8 @@
       context, global_interface);
   mozjs_global_object_proxy->SetEnvironmentSettings(environment_settings);
 
-  WrapperFactory* wrapper_factory = mozjs_global_object_proxy->wrapper_factory();
+  WrapperFactory* wrapper_factory =
+      mozjs_global_object_proxy->wrapper_factory();
 {% for interface in all_interfaces %}
 {% if interface.conditional %}
 #if defined({{interface.conditional}})
diff --git a/src/cobalt/bindings/mozjs/templates/interface.h.template b/src/cobalt/bindings/mozjs/templates/interface.h.template
index f7ca8b6..fbef85c 100644
--- a/src/cobalt/bindings/mozjs/templates/interface.h.template
+++ b/src/cobalt/bindings/mozjs/templates/interface.h.template
@@ -24,9 +24,11 @@
   static JSObject* CreateProxy(JSContext* context,
       const scoped_refptr<script::Wrappable>& wrappable);
   static const JSClass* PrototypeClass(JSContext* context);
-  static JSObject* GetPrototype(JSContext* context);
+  static JSObject* GetPrototype(JSContext* context,
+                                JS::HandleObject global_object);
 {% if has_interface_object %}
-  static JSObject* GetInterfaceObject(JSContext* context);
+  static JSObject* GetInterfaceObject(JSContext* context,
+                                      JS::HandleObject global_object);
 {% endif %}
 };
 {% endblock implementation %}
diff --git a/src/cobalt/bindings/mozjs/templates/macros.cc.template b/src/cobalt/bindings/mozjs/templates/macros.cc.template
index 36770e2..dd3bdca 100644
--- a/src/cobalt/bindings/mozjs/templates/macros.cc.template
+++ b/src/cobalt/bindings/mozjs/templates/macros.cc.template
@@ -336,6 +336,12 @@
                        constructor.call_with) }}
   scoped_refptr<{{impl_class}}> new_object =
       new {{impl_class}}({{arguments_list|join(', ')}});
+{% if constructor.raises_exception %}
+  // In case that an exception is thrown from constructor.
+  if (exception_state.is_exception_set()) {
+    return false;
+  }
+{% endif %}
   JS::RootedValue result_value(context);
   ToJSValue(context, new_object, &result_value);
   DCHECK(result_value.isObject());
diff --git a/src/cobalt/bindings/testing/Window.idl b/src/cobalt/bindings/testing/Window.idl
index 9967ccf..161266f 100644
--- a/src/cobalt/bindings/testing/Window.idl
+++ b/src/cobalt/bindings/testing/Window.idl
@@ -17,4 +17,6 @@
 interface Window : GlobalInterfaceParent {
   void windowOperation();
   attribute DOMString windowProperty;
+  readonly attribute Window window;
+  [CallWith=StackTrace] DOMString getStackTrace();
 };
diff --git a/src/cobalt/bindings/testing/exceptions_bindings_test.cc b/src/cobalt/bindings/testing/exceptions_bindings_test.cc
index 0010125..13d6d0e 100644
--- a/src/cobalt/bindings/testing/exceptions_bindings_test.cc
+++ b/src/cobalt/bindings/testing/exceptions_bindings_test.cc
@@ -24,7 +24,7 @@
 using ::testing::InSequence;
 using ::testing::Invoke;
 using ::testing::Return;
-using ::testing::StrictMock;
+using ::testing::NiceMock;
 using ::testing::WithArg;
 
 #define EXPECT_SUBSTRING(needle, haystack) \
@@ -54,8 +54,7 @@
  public:
   explicit ExceptionObjectSetter(
       const scoped_refptr<ExceptionObjectInterface>& exception)
-      : exception_object_(
-            make_scoped_refptr<script::ScriptException>(exception.get())) {}
+      : exception_object_(exception) {}
   void FireException(script::ExceptionState* exception) {
     exception->SetException(exception_object_);
   }
@@ -117,13 +116,12 @@
 
 TEST_F(ExceptionsBindingsTest, ThrowExceptionObject) {
   scoped_refptr<ExceptionObjectInterface> exception_object =
-      make_scoped_refptr(new StrictMock<ExceptionObjectInterface>());
+      make_scoped_refptr(new NiceMock<ExceptionObjectInterface>());
   ExceptionObjectSetter exception_setter(exception_object);
 
   InSequence in_sequence_dummy;
   EXPECT_CALL(test_mock(), FunctionThrowsException(_)).WillOnce(
       Invoke(&exception_setter, &ExceptionObjectSetter::FireException));
-  EXPECT_CALL(*exception_object, message()).WillOnce(Return("the message"));
   EXPECT_TRUE(EvaluateScript(
       "var error = null;"
       "try { test.functionThrowsException(); }"
diff --git a/src/cobalt/bindings/testing/global_interface_bindings_test.cc b/src/cobalt/bindings/testing/global_interface_bindings_test.cc
index 175426e..5f8b90c 100644
--- a/src/cobalt/bindings/testing/global_interface_bindings_test.cc
+++ b/src/cobalt/bindings/testing/global_interface_bindings_test.cc
@@ -37,6 +37,10 @@
 };
 }  // namespace
 
+TEST_F(GlobalInterfaceBindingsTest, GlobalWindowIsThis) {
+  EXPECT_TRUE(EvaluateScript("window === this;", NULL));
+}
+
 TEST_F(GlobalInterfaceBindingsTest, GlobalOperation) {
   EXPECT_CALL(test_mock(), WindowOperation());
   EXPECT_TRUE(EvaluateScript("windowOperation();", NULL));
diff --git a/src/cobalt/bindings/testing/stack_trace_test.cc b/src/cobalt/bindings/testing/stack_trace_test.cc
new file mode 100644
index 0000000..c9e39a8
--- /dev/null
+++ b/src/cobalt/bindings/testing/stack_trace_test.cc
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2016 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/bindings/testing/bindings_test_base.h"
+
+namespace cobalt {
+namespace bindings {
+namespace testing {
+
+namespace {
+class StackTraceTest : public BindingsTestBase {};
+}  // namespace
+
+TEST_F(StackTraceTest, GetStackTrace) {
+  std::string result;
+
+  // We expect the to be in bar (line 2), called from foo (line 6),
+  // called from foo (line 8) 4 times, called outside of a function (line
+  // 11).
+  std::string script =
+      "function bar() {\n"
+      "return getStackTrace();\n"
+      "}\n"
+      "function foo(depth) {\n"
+      "  if  (depth <= 0) {\n"
+      "    return bar();\n"
+      "  } else {\n"
+      "    return foo(depth - 1);\n"
+      "  }\n"
+      "}\n"
+      "foo(4)";
+  EXPECT_TRUE(EvaluateScript(script, &result));
+
+  // Expect that bar is on top.
+  std::string match_line = "bar @ [object BindingsTestBase]:2\n";
+  size_t position = result.find(match_line);
+  EXPECT_TRUE(position != std::string::npos);
+  // Expect a foo at line 6.
+  match_line = "foo @ [object BindingsTestBase]:6\n";
+  position = result.find(match_line, ++position);
+  EXPECT_TRUE(position != std::string::npos);
+  // Expect 4 subsequent foos at line 8.
+  match_line = "foo @ [object BindingsTestBase]:8\n";
+  for (int i = 0; i < 4; ++i) {
+    position = result.find(match_line, ++position);
+    EXPECT_TRUE(position != std::string::npos);
+  }
+  // Expect global code at line 11.
+  match_line = "global code @ [object BindingsTestBase]:11";
+  position = result.find(match_line, ++position);
+  EXPECT_TRUE(position != std::string::npos);
+}
+
+}  // namespace testing
+}  // namespace bindings
+}  // namespace cobalt
diff --git a/src/cobalt/bindings/testing/testing.gyp b/src/cobalt/bindings/testing/testing.gyp
index 49c20e4..b820608 100644
--- a/src/cobalt/bindings/testing/testing.gyp
+++ b/src/cobalt/bindings/testing/testing.gyp
@@ -139,6 +139,7 @@
         'operations_bindings_test.cc',
         'optional_arguments_bindings_test.cc',
         'put_forwards_test.cc',
+        'stack_trace_test.cc',
         'static_properties_bindings_test.cc',
         'stringifier_bindings_test.cc',
         'union_type_bindings_test.cc',
diff --git a/src/cobalt/bindings/testing/window.h b/src/cobalt/bindings/testing/window.h
index 8c6dded..0bc8115 100644
--- a/src/cobalt/bindings/testing/window.h
+++ b/src/cobalt/bindings/testing/window.h
@@ -17,7 +17,12 @@
 #ifndef COBALT_BINDINGS_TESTING_WINDOW_H_
 #define COBALT_BINDINGS_TESTING_WINDOW_H_
 
+#include <string>
+#include <vector>
+
 #include "cobalt/bindings/testing/global_interface_parent.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/global_object_proxy.h"
 
 namespace cobalt {
 namespace bindings {
@@ -29,6 +34,12 @@
   virtual std::string window_property() { return ""; }
   virtual void set_window_property(const std::string&) {}
 
+  std::string GetStackTrace(
+      const std::vector<script::StackFrame>& stack_frame) {
+    return StackTraceToString(stack_frame);
+  }
+  scoped_refptr<Window> window() { return this; }
+
   DEFINE_WRAPPABLE_TYPE(Window);
 };
 
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 5ec73ec..4327e96 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -36,7 +36,7 @@
 #include "cobalt/loader/image/image_decoder.h"
 #include "cobalt/math/size.h"
 #include "cobalt/network/network_event.h"
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 #include "cobalt/storage/savegame_fake.h"
 #endif
 #include "cobalt/system_window/application_event.h"
@@ -45,7 +45,7 @@
 #if defined(__LB_SHELL__)
 #if !defined(__LB_SHELL__FOR_RELEASE__)
 #include "lbshell/src/lb_memory_manager.h"
-#endif  // defined(ENABLE_DEBUG_CONSOLE)
+#endif  // defined(__LB_SHELL__FOR_RELEASE__)
 #include "lbshell/src/lb_memory_pages.h"
 #endif  // defined(__LB_SHELL__)
 
@@ -64,7 +64,7 @@
 int GetRemoteDebuggingPort() {
   const int kDefaultRemoteDebuggingPort = 9222;
   int remote_debugging_port = kDefaultRemoteDebuggingPort;
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kRemoteDebuggingPort)) {
     const std::string switchValue =
@@ -76,13 +76,13 @@
       remote_debugging_port = kDefaultRemoteDebuggingPort;
     }
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
   return remote_debugging_port;
 }
 #endif  // ENABLE_REMOTE_DEBUGGING
 
 #if defined(ENABLE_WEBDRIVER)
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 int GetWebDriverPort() {
   // The default port on which the webdriver server should listen for incoming
   // connections.
@@ -101,11 +101,11 @@
   }
   return webdriver_port;
 }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 #endif  // ENABLE_WEBDRIVER
 
 GURL GetInitialURL() {
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   // Allow the user to override the default URL via a command line parameter.
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kInitialURL)) {
@@ -116,13 +116,13 @@
       DLOG(INFO) << "URL from parameter is not valid, using default URL.";
     }
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
   return GURL(kDefaultURL);
 }
 
 base::TimeDelta GetTimedTraceDuration() {
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   int duration_in_seconds = 0;
   if (command_line->HasSwitch(switches::kTimedTrace) &&
@@ -131,7 +131,7 @@
           &duration_in_seconds)) {
     return base::TimeDelta::FromSeconds(duration_in_seconds);
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
   return base::TimeDelta();
 }
@@ -140,7 +140,7 @@
   // Default is empty, command line can override.
   FilePath result;
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kExtraWebFileDir)) {
     result =
@@ -153,18 +153,19 @@
     }
     DLOG(INFO) << "Extra web file dir: " << result.value();
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
   return result;
 }
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 void EnableUsingStubImageDecoderIfRequired() {
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kStubImageDecoder)) {
     loader::image::ImageDecoder::UseStubImageDecoder();
   }
 }
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
 void SetIntegerIfSwitchIsSet(const char* switch_name, int* output) {
   if (CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
@@ -190,7 +191,13 @@
   SetIntegerIfSwitchIsSet(browser::switches::kSkiaCacheSizeInBytes,
                           &options->skia_cache_size_in_bytes);
 }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+
+void ApplyCommandLineSettingsToWebModuleOptions(WebModule::Options* options) {
+  SetIntegerIfSwitchIsSet(browser::switches::kImageCacheSizeInBytes,
+                          &options->image_cache_capacity);
+  SetIntegerIfSwitchIsSet(browser::switches::kRemoteTypefaceCacheSizeInBytes,
+                          &options->remote_typeface_cache_capacity);
+}
 
 // Restrict navigation to a couple of whitelisted URLs by default.
 const char kYouTubeTvLocationPolicy[] =
@@ -288,11 +295,13 @@
   options.language = language;
   options.network_module_options.preferred_language = language;
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
   ApplyCommandLineSettingsToRendererOptions(&options.renderer_module_options);
+  ApplyCommandLineSettingsToWebModuleOptions(&options.web_module_options);
 
-  if (CommandLine::ForCurrentProcess()->HasSwitch(
-          browser::switches::kNullSavegame)) {
+  CommandLine* command_line = CommandLine::ForCurrentProcess();
+
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
+  if (command_line->HasSwitch(browser::switches::kNullSavegame)) {
     options.storage_manager_options.savegame_options.factory =
         &storage::SavegameFake::Create;
   }
@@ -311,8 +320,7 @@
 
   math::Size viewport_size(kDefaultViewportWidth, kDefaultViewportHeight);
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
-  CommandLine* command_line = CommandLine::ForCurrentProcess();
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   if (command_line->HasSwitch(browser::switches::kProxy)) {
     options.network_module_options.custom_proxy =
         command_line->GetSwitchValueASCII(browser::switches::kProxy);
@@ -344,6 +352,20 @@
 
   EnableUsingStubImageDecoderIfRequired();
 
+  if (command_line->HasSwitch(switches::kAudioDecoderStub)) {
+    DLOG(INFO) << "Use ShellRawAudioDecoderStub";
+    options.media_module_options.use_audio_decoder_stub = true;
+  }
+  if (command_line->HasSwitch(switches::kNullAudioStreamer)) {
+    DLOG(INFO) << "Use null audio";
+    options.media_module_options.use_null_audio_streamer = true;
+  }
+  if (command_line->HasSwitch(switches::kVideoDecoderStub)) {
+    DLOG(INFO) << "Use ShellRawVideoDecoderStub";
+    options.media_module_options.use_video_decoder_stub = true;
+  }
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+
   if (command_line->HasSwitch(browser::switches::kViewport)) {
     const std::string switchValue =
         command_line->GetSwitchValueASCII(browser::switches::kViewport);
@@ -381,19 +403,6 @@
       }
     }
   }
-  if (command_line->HasSwitch(switches::kAudioDecoderStub)) {
-    DLOG(INFO) << "Use ShellRawAudioDecoderStub";
-    options.media_module_options.use_audio_decoder_stub = true;
-  }
-  if (command_line->HasSwitch(switches::kNullAudioStreamer)) {
-    DLOG(INFO) << "Use null audio";
-    options.media_module_options.use_null_audio_streamer = true;
-  }
-  if (command_line->HasSwitch(switches::kVideoDecoderStub)) {
-    DLOG(INFO) << "Use ShellRawVideoDecoderStub";
-    options.media_module_options.use_video_decoder_stub = true;
-  }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
 
   system_window_ =
       system_window::CreateSystemWindow(&event_dispatcher_, viewport_size);
@@ -419,7 +428,7 @@
                                      application_event_callback_);
 
 #if defined(ENABLE_WEBDRIVER)
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   if (command_line->HasSwitch(switches::kEnableWebDriver)) {
     int webdriver_port = GetWebDriverPort();
     web_driver_module_.reset(new webdriver::WebDriverModule(
@@ -431,7 +440,7 @@
                    base::Unretained(browser_module_.get())),
         base::Bind(&Application::Quit, base::Unretained(this))));
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 #endif  // ENABLE_WEBDRIVER
 
 #if defined(ENABLE_REMOTE_DEBUGGING)
@@ -442,7 +451,7 @@
                  base::Unretained(browser_module_.get()))));
 #endif  // ENABLE_REMOTE_DEBUGGING
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   int duration_in_seconds = 0;
   if (command_line->HasSwitch(switches::kShutdownAfter) &&
       base::StringToInt(
@@ -455,7 +464,7 @@
         FROM_HERE, quit_closure_,
         base::TimeDelta::FromSeconds(duration_in_seconds));
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 }
 
 Application::~Application() {
@@ -526,25 +535,15 @@
   if (app_event->type() == system_window::ApplicationEvent::kQuit) {
     DLOG(INFO) << "Got quit event.";
     app_status_ = kWillQuitAppStatus;
-#if !defined(OS_STARBOARD)
-    browser_module_->SetWillQuit();
-    browser_module_->SetPaused(false);
-#endif  // !defined(OS_STARBOARD)
     Quit();
   } else if (app_event->type() == system_window::ApplicationEvent::kSuspend) {
     DLOG(INFO) << "Got suspend event.";
     app_status_ = kPausedAppStatus;
     ++app_suspend_count_;
-#if !defined(OS_STARBOARD)
-    browser_module_->SetPaused(true);
-#endif  // !defined(OS_STARBOARD)
   } else if (app_event->type() == system_window::ApplicationEvent::kResume) {
     DLOG(INFO) << "Got resume event.";
     app_status_ = kRunningAppStatus;
     ++app_resume_count_;
-#if !defined(OS_STARBOARD)
-    browser_module_->SetPaused(false);
-#endif  // !defined(OS_STARBOARD)
   }
 }
 
@@ -629,7 +628,7 @@
         static_cast<size_t>(memory_info.application_memory);
     c_val_stats_.exe_memory = static_cast<size_t>(memory_info.executable_size);
   }
-#endif  // defined(ENABLE_DEBUG_CONSOLE)
+#endif  // defined(__LB_SHELL__FOR_RELEASE__)
   // If the memory stats have not been updated yet, then simply use the
   // unallocated memory as the available memory.
   if (!memory_stats_updated) {
diff --git a/src/cobalt/browser/browser.gyp b/src/cobalt/browser/browser.gyp
index 58aa11b..36effe7 100644
--- a/src/cobalt/browser/browser.gyp
+++ b/src/cobalt/browser/browser.gyp
@@ -46,6 +46,10 @@
         'web_module_stat_tracker.cc',
         'web_module_stat_tracker.h',
       ],
+      'defines': [
+        'COBALT_IMAGE_CACHE_SIZE_IN_BYTES=<(image_cache_size_in_bytes)',
+        'COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES=<(remote_typeface_cache_size_in_bytes)',
+      ],
       'dependencies': [
         '<(DEPTH)/cobalt/account/account.gyp:account',
         '<(DEPTH)/cobalt/audio/audio.gyp:audio',
diff --git a/src/cobalt/browser/browser_bindings.gyp b/src/cobalt/browser/browser_bindings.gyp
index 45d7061..80049c1 100644
--- a/src/cobalt/browser/browser_bindings.gyp
+++ b/src/cobalt/browser/browser_bindings.gyp
@@ -23,6 +23,7 @@
 
     'bindings_dependencies': [
       '../h5vcc/h5vcc.gyp:h5vcc',
+      '../webdriver/webdriver.gyp:webdriver',
     ],
 
     # Bindings for the interfaces in this list will be generated, and there must
@@ -139,6 +140,7 @@
         '../dom/Uint32Array.idl',
         '../dom/Uint8Array.idl',
         '../dom/URL.idl',
+        '../dom/VideoPlaybackQuality.idl',
         '../dom/Window.idl',
         '../dom/XMLDocument.idl',
         '../dom/XMLSerializer.idl',
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index f5abd88..668f3c7 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -109,6 +109,9 @@
           weak_this_(weak_ptr_factory_.GetWeakPtr())),
       self_message_loop_(MessageLoop::current()),
       storage_manager_(options.storage_manager_options),
+#if defined(OS_STARBOARD)
+      is_rendered_(false),
+#endif  // OS_STARBOARD
       renderer_module_(system_window, options.renderer_module_options),
 #if defined(ENABLE_GPU_ARRAY_BUFFER_ALLOCATOR)
       array_buffer_allocator_(new ResourceProviderArrayBufferAllocator(
@@ -156,12 +159,12 @@
   web_module_options_.injected_window_attributes["h5vcc"] =
       base::Bind(&CreateH5VCC, h5vcc_settings);
 
-#if defined(ENABLE_DEBUG_CONSOLE) && defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_CONSOLE) && defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kInputFuzzer)) {
     OnFuzzerToggle(std::string());
   }
-#endif  // ENABLE_DEBUG_CONSOLE && ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_CONSOLE && ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
   input_device_manager_ = input::InputDeviceManager::CreateFromWindow(
       base::Bind(&BrowserModule::OnKeyEventProduced, base::Unretained(this)),
@@ -266,49 +269,6 @@
   return web_module_loaded_.TimedWait(timeout);
 }
 
-void BrowserModule::SetPaused(bool paused) {
-  // This method should not be called on the browser's own thread, as
-  // we will be unable to signal the |has_resumed_| event when the
-  // |Pause| method blocks the thread.
-  DCHECK_NE(MessageLoop::current(), self_message_loop_);
-
-  if (paused) {
-    has_resumed_.Reset();
-    self_message_loop_->PostTask(
-        FROM_HERE, base::Bind(&BrowserModule::Pause, base::Unretained(this)));
-  } else {
-    has_resumed_.Signal();
-  }
-}
-
-void BrowserModule::SetWillQuit() {
-  base::AutoLock lock(quit_lock_);
-  will_quit_ = true;
-}
-
-bool BrowserModule::WillQuit() {
-  base::AutoLock lock(quit_lock_);
-  return will_quit_;
-}
-
-void BrowserModule::Pause() {
-  // This method must be called on the browser's own thread.
-  DCHECK_EQ(MessageLoop::current(), self_message_loop_);
-
-  media_module_->PauseAllPlayers();
-
-  // Block the thread until the browser has been resumed.
-  DLOG(INFO) << "Pausing browser loop with " << self_message_loop_->Size()
-             << " items in queue.";
-  has_resumed_.Wait();
-  DLOG(INFO) << "Resuming browser loop with " << self_message_loop_->Size()
-             << " items in queue.";
-
-  if (!WillQuit()) {
-    media_module_->ResumeAllPlayers();
-  }
-}
-
 #if defined(ENABLE_SCREENSHOT)
 void BrowserModule::RequestScreenshotToFile(const FilePath& path,
                                             const base::Closure& done_cb) {
@@ -325,14 +285,17 @@
 void BrowserModule::OnRenderTreeProduced(
     const browser::WebModule::LayoutResults& layout_results) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::OnRenderTreeProduced()");
-  render_tree_combiner_.UpdateMainRenderTree(renderer::Submission(
-      layout_results.render_tree, layout_results.animations,
-      layout_results.layout_time));
+  renderer::Submission renderer_submission(layout_results.render_tree,
+                                           layout_results.layout_time);
+#if defined(OS_STARBOARD)
+  renderer_submission.on_rasterized_callback = base::Bind(
+      &BrowserModule::OnRendererSubmissionRasterized, base::Unretained(this));
+#endif  // OS_STARBOARD
+  render_tree_combiner_.UpdateMainRenderTree(renderer_submission);
 
 #if defined(ENABLE_SCREENSHOT)
   screen_shot_writer_->SetLastPipelineSubmission(renderer::Submission(
-      layout_results.render_tree, layout_results.animations,
-      layout_results.layout_time));
+      layout_results.render_tree, layout_results.layout_time));
 #endif
 }
 
@@ -361,8 +324,7 @@
   TRACE_EVENT0("cobalt::browser",
                "BrowserModule::OnDebugConsoleRenderTreeProduced()");
   render_tree_combiner_.UpdateDebugConsoleRenderTree(renderer::Submission(
-      layout_results.render_tree, layout_results.animations,
-      layout_results.layout_time));
+      layout_results.render_tree, layout_results.layout_time));
 }
 
 #endif  // defined(ENABLE_DEBUG_CONSOLE)
@@ -550,5 +512,15 @@
   network_module_.SetProxy(proxy_rules);
 }
 
+#if defined(OS_STARBOARD)
+void BrowserModule::OnRendererSubmissionRasterized() {
+  if (!is_rendered_) {
+    // Hide the system splash screen when the first render has completed.
+    is_rendered_ = true;
+    SbSystemHideSplashScreen();
+  }
+}
+#endif  // OS_STARBOARD
+
 }  // namespace browser
 }  // namespace cobalt
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index aadc0af..4ae4fb4 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -86,17 +86,6 @@
   void AddURLHandler(const URLHandler::URLHandlerCallback& callback);
   void RemoveURLHandler(const URLHandler::URLHandlerCallback& callback);
 
-  // Pauses/resumes all media players and blocks the browser thread. Should
-  // be called on a thread other than |self_message_loop_|.
-  void SetPaused(bool paused);
-
-  // Lets the web browser know that the application is about to quit. We use
-  // this not to start the web players when the thread is unpaused.
-  void SetWillQuit();
-
-  // Whether |SetWillQuit| has been called.
-  bool WillQuit();
-
 #if defined(ENABLE_SCREENSHOT)
   // Request a screenshot to be written to the specified path. Callback will
   // be fired after the screenshot has been written to disk.
@@ -172,10 +161,6 @@
   // Destroys the splash screen, if currently displayed.
   void DestroySplashScreen();
 
-  // Pauses all active web players and blocks the main thread until the
-  // |has_resumed_| event is signalled. Must be called on |self_message_loop_|.
-  void Pause();
-
 #if defined(ENABLE_DEBUG_CONSOLE)
   // Toggles the input fuzzer on/off.  Ignores the parameter.
   void OnFuzzerToggle(const std::string&);
@@ -195,6 +180,12 @@
       scoped_ptr<webdriver::WindowDriver>* out_window_driver);
 #endif
 
+#if defined(OS_STARBOARD)
+  // Called when a renderer submission has been rasterized. Used to hide the
+  // system splash screen after the first render has completed.
+  void OnRendererSubmissionRasterized();
+#endif  // OS_STARBOARD
+
   // TODO:
   //     WeakPtr usage here can be avoided if BrowserModule has a thread to
   //     own where it can ensure that its tasks are all resolved when it is
@@ -222,6 +213,12 @@
 
   storage::StorageManager storage_manager_;
 
+#if defined(OS_STARBOARD)
+  // Whether the browser module has yet rendered anything. On the very first
+  // render, we hide the system splash screen.
+  bool is_rendered_;
+#endif  // OS_STARBOARD
+
   // Sets up everything to do with graphics, from backend objects like the
   // display and graphics context to the rasterizer and rendering pipeline.
   renderer::RendererModule renderer_module_;
diff --git a/src/cobalt/browser/debug_console.cc b/src/cobalt/browser/debug_console.cc
index 0fce499..a293be3 100644
--- a/src/cobalt/browser/debug_console.cc
+++ b/src/cobalt/browser/debug_console.cc
@@ -77,14 +77,14 @@
 // Returns the debug console mode as specified by the command line.
 // If unspecified by the command line, base::nullopt is returned.
 base::optional<int> GetDebugConsoleModeFromCommandLine() {
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kDebugConsoleMode)) {
     const std::string debug_console_mode_string =
         command_line->GetSwitchValueASCII(switches::kDebugConsoleMode);
     return DebugConsoleModeStringToInt(debug_console_mode_string);
   }
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
   return base::nullopt;
 }
diff --git a/src/cobalt/browser/starboard/event_handler.cc b/src/cobalt/browser/starboard/event_handler.cc
index 4ef7069..00808d7 100644
--- a/src/cobalt/browser/starboard/event_handler.cc
+++ b/src/cobalt/browser/starboard/event_handler.cc
@@ -18,6 +18,7 @@
 
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
+#include "cobalt/network/network_event.h"
 #include "cobalt/system_window/application_event.h"
 #include "cobalt/system_window/starboard/system_window.h"
 
@@ -58,6 +59,12 @@
   } else if (starboard_event->type == kSbEventTypeSuspend) {
     cobalt_event.reset(new system_window::ApplicationEvent(
         system_window::ApplicationEvent::kSuspend));
+  } else if (starboard_event->type == kSbEventTypeNetworkConnect) {
+    cobalt_event.reset(
+        new network::NetworkEvent(network::NetworkEvent::kConnection));
+  } else if (starboard_event->type == kSbEventTypeNetworkDisconnect) {
+    cobalt_event.reset(
+        new network::NetworkEvent(network::NetworkEvent::kDisconnection));
   }
 
   // Dispatch the Cobalt event, if created.
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 9258a4f..d9d0abf 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -20,7 +20,7 @@
 namespace browser {
 namespace switches {
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 // Allow insecure HTTP network connections.
 const char kAllowHttp[] = "allow_http";
 
@@ -71,32 +71,13 @@
 // Creates a remote debugging server and listens on the specified port.
 const char kRemoteDebuggingPort[] = "remote_debugging_port";
 
-// Determines the capacity of the scratch surface cache.  The scratch surface
-// cache facilitates the reuse of temporary offscreen surfaces within a single
-// frame.  This setting is only relevant when using the hardware-accelerated
-// Skia rasterizer.
-const char kScratchSurfaceCacheSizeInBytes[] =
-    "scratch_surface_cache_size_in_bytes";
-
 // If this flag is set, Cobalt will automatically shutdown after the specified
 // number of seconds have passed.
 const char kShutdownAfter[] = "shutdown_after";
 
-// Determines the capacity of the skia cache.  The Skia cache is maintained
-// within Skia and is used to cache the results of complicated effects such as
-// shadows, so that Skia draw calls that are used repeatedly across frames can
-// be cached into surfaces.  This setting is only relevant when using the
-// hardware-accelerated Skia rasterizer.
-const char kSkiaCacheSizeInBytes[] = "skia_cache_size_in_bytes";
-
 // Decode all images using StubImageDecoder.
 const char kStubImageDecoder[] = "stub_image_decoder";
 
-// Determines the capacity of the surface cache.  The surface cache tracks which
-// render tree nodes are being re-used across frames and stores the nodes that
-// are most CPU-expensive to render into surfaces.
-const char kSurfaceCacheSizeInBytes[] = "surface_cache_size_in_bytes";
-
 // If this is set, then a trace (see base/debug/trace_eventh.h) is started on
 // Cobalt startup.  A value must also be specified for this switch, which is
 // the duration in seconds of how long the trace will be done for before ending
@@ -104,16 +85,48 @@
 // "timed_trace.json" in the log output directory.
 const char kTimedTrace[] = "timed_trace";
 
-// Specifies the viewport size: width ['x' height]
-const char kViewport[] = "viewport";
-
 // Decode video data using ShellRawVideoDecoderStub.
 extern const char kVideoDecoderStub[] = "video_decoder_stub";
 
 // Port that the WebDriver server should be listening on.
 const char kWebDriverPort[] = "webdriver_port";
 
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+
+// Determines the capacity of the image cache which manages image surfaces
+// downloaded from a web page.  While it depends on the platform, often (and
+// ideally) these images are cached within GPU memory.
+const char kImageCacheSizeInBytes[] = "image_cache_size_in_bytes";
+
+// Determines the capacity of the remote typefaces cache which manages all
+// typefaces downloaded from a web page.
+const char kRemoteTypefaceCacheSizeInBytes[] =
+    "remote_typeface_cache_size_in_bytes";
+
+// Determines the capacity of the scratch surface cache.  The scratch surface
+// cache facilitates the reuse of temporary offscreen surfaces within a single
+// frame.  This setting is only relevant when using the hardware-accelerated
+// Skia rasterizer.  While it depends on the platform, this setting may affect
+// GPU memory usage.
+const char kScratchSurfaceCacheSizeInBytes[] =
+    "scratch_surface_cache_size_in_bytes";
+
+// Determines the capacity of the skia cache.  The Skia cache is maintained
+// within Skia and is used to cache the results of complicated effects such as
+// shadows, so that Skia draw calls that are used repeatedly across frames can
+// be cached into surfaces.  This setting is only relevant when using the
+// hardware-accelerated Skia rasterizer.  While it depends on the platform, this
+// setting may affect GPU memory usage.
+const char kSkiaCacheSizeInBytes[] = "skia_cache_size_in_bytes";
+
+// Determines the capacity of the surface cache.  The surface cache tracks which
+// render tree nodes are being re-used across frames and stores the nodes that
+// are most CPU-expensive to render into surfaces.  While it depends on the
+// platform, this setting may affect GPU memory usage.
+const char kSurfaceCacheSizeInBytes[] = "surface_cache_size_in_bytes";
+
+// Specifies the viewport size: width ['x' height]
+const char kViewport[] = "viewport";
 
 }  // namespace switches
 }  // namespace browser
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 4c66e0c..75dc57d 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -21,7 +21,7 @@
 namespace browser {
 namespace switches {
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 extern const char kAllowHttp[];
 extern const char kAudioDecoderStub[];
 extern const char kCspMode[];
@@ -39,13 +39,16 @@
 extern const char kShutdownAfter[];
 extern const char kStubImageDecoder[];
 extern const char kTimedTrace[];
-extern const char kViewport[];
 extern const char kVideoDecoderStub[];
 extern const char kWebDriverPort[];
-extern const char kSurfaceCacheSizeInBytes[];
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+
+extern const char kImageCacheSizeInBytes[];
+extern const char kRemoteTypefaceCacheSizeInBytes[];
 extern const char kScratchSurfaceCacheSizeInBytes[];
 extern const char kSkiaCacheSizeInBytes[];
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+extern const char kSurfaceCacheSizeInBytes[];
+extern const char kViewport[];
 
 }  // namespace switches
 }  // namespace browser
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 88b5286..828380d 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -246,16 +246,18 @@
       data.network_module, data.options.extra_web_file_dir));
   DCHECK(fetcher_factory_);
 
+  DCHECK_LE(0, data.options.image_cache_capacity);
   image_cache_ = loader::image::CreateImageCache(
       base::StringPrintf("Memory.%s.ImageCache", name_.c_str()),
-      data.options.image_cache_capacity, data.resource_provider,
-      fetcher_factory_.get());
+      static_cast<uint32>(data.options.image_cache_capacity),
+      data.resource_provider, fetcher_factory_.get());
   DCHECK(image_cache_);
 
+  DCHECK_LE(0, data.options.remote_typeface_cache_capacity);
   remote_typeface_cache_ = loader::font::CreateRemoteTypefaceCache(
       base::StringPrintf("Memory.%s.RemoteTypefaceCache", name_.c_str()),
-      kRemoteTypefaceCacheCapacity, data.resource_provider,
-      fetcher_factory_.get());
+      static_cast<uint32>(data.options.remote_typeface_cache_capacity),
+      data.resource_provider, fetcher_factory_.get());
   DCHECK(remote_typeface_cache_);
 
   local_storage_database_.reset(
@@ -512,6 +514,16 @@
   web_module_->impl_.reset();
 }
 
+WebModule::Options::Options()
+    : name("WebModule"),
+      layout_trigger(layout::LayoutManager::kOnDocumentMutation),
+      image_cache_capacity(COBALT_IMAGE_CACHE_SIZE_IN_BYTES),
+      remote_typeface_cache_capacity(
+          COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES),
+      csp_enforcement_mode(dom::kCspEnforcementEnable),
+      csp_insecure_allowed_token(0),
+      track_event_stats(false) {}
+
 WebModule::WebModule(
     const GURL& initial_url,
     const OnRenderTreeProducedCallback& render_tree_produced_callback,
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 83cfa49..826df99 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -74,11 +74,6 @@
 // accessed from only one thread.
 class WebModule {
  public:
-  // TODO: These numbers should be adjusted according to the size of
-  // client memory.
-  static const uint32 kImageCacheCapacity = 64U * 1024 * 1024;
-  static const uint32 kRemoteTypefaceCacheCapacity = 5U * 1024 * 1024;
-
   struct Options {
     typedef base::Callback<scoped_refptr<script::Wrappable>()>
         CreateObjectFunction;
@@ -86,15 +81,8 @@
         InjectedWindowAttributes;
 
     // All optional parameters defined in this structure should have their
-    // values
-    // initialized in the default constructor to useful defaults.
-    Options()
-        : name("WebModule"),
-          layout_trigger(layout::LayoutManager::kOnDocumentMutation),
-          image_cache_capacity(kImageCacheCapacity),
-          csp_enforcement_mode(dom::kCspEnforcementEnable),
-          csp_insecure_allowed_token(0),
-          track_event_stats(false) {}
+    // values initialized in the default constructor to useful defaults.
+    Options();
 
     // The name of the WebModule.  This is useful for debugging purposes as in
     // the case where multiple WebModule objects exist, it can be used to
@@ -133,7 +121,10 @@
     std::string location_policy;
 
     // Image cache capaticy in bytes.
-    uint32 image_cache_capacity;
+    int image_cache_capacity;
+
+    // Typeface cache capacity in bytes.
+    int remote_typeface_cache_capacity;
 
     // Content Security Policy enforcement mode for this web module.
     dom::CspEnforcementType csp_enforcement_mode;
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 4db8c83..29fb020 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-9617
\ No newline at end of file
+10060
\ No newline at end of file
diff --git a/src/cobalt/build/config/base.gypi b/src/cobalt/build/config/base.gypi
index ae3ac78..04a0d5e 100644
--- a/src/cobalt/build/config/base.gypi
+++ b/src/cobalt/build/config/base.gypi
@@ -106,11 +106,27 @@
     #   "cobalt/renderer/egl_and_gles/egl_and_gles_<gl_type>.gyp not found"
     'gl_type%': 'system_gles2',
 
+    # Cache parameters
+
+    # The following set of parameters define how much memory is reserved for
+    # different Cobalt caches.  These caches affect CPU *and* GPU memory usage.
+    #
+    # The sum of the following caches effectively describes the maximum GPU
+    # texture memory usage (though it doesn't consider video textures and
+    # display color buffers):
+    #   - skia_cache_size_in_bytes (GLES2 rasterizer only)
+    #   - scratch_surface_cache_size_in_bytes
+    #   - surface_cache_size_in_bytes
+    #   - image_cache_size_in_bytes
+    #
+    # The other caches affect CPU memory usage.
+
     # Determines the capacity of the skia cache.  The Skia cache is maintained
     # within Skia and is used to cache the results of complicated effects such
     # as shadows, so that Skia draw calls that are used repeatedly across
     # frames can be cached into surfaces.  This setting is only relevant when
-    # using the hardware-accelerated Skia rasterizer.
+    # using the hardware-accelerated Skia rasterizer (e.g. as opposed to the
+    # Blitter API).
     'skia_cache_size_in_bytes%': 4 * 1024 * 1024,
 
     # Determines the capacity of the scratch surface cache.  The scratch
@@ -124,6 +140,15 @@
     # nodes that are most CPU-expensive to render into surfaces.
     'surface_cache_size_in_bytes%': 0,
 
+    # Determines the capacity of the image cache which manages image surfaces
+    # downloaded from a web page.  While it depends on the platform, often (and
+    # ideally) these images are cached within GPU memory.
+    'image_cache_size_in_bytes%': 64 * 1024 * 1024,
+
+    # Determines the capacity of the remote typefaces cache which manages all
+    # typefaces downloaded from a web page.
+    'remote_typeface_cache_size_in_bytes%': 5 * 1024 * 1024,
+
     # Compiler configuration.
 
     # The following variables are used to specify compiler and linker
@@ -166,6 +191,11 @@
     # as expected, rather than requiring it to be set for each platform.
     #'javascript_engine%': 'javascriptcore',
 
+    # Enable jit by default. It can be set to 0 to run in interpreter-only mode.
+    # Setting this to 1 on a platform or engine for which there is no JIT
+    # implementation is a no-op.
+    'cobalt_enable_jit%': 1,
+
     # Customize variables used by Chromium's build/common.gypi.
 
     # Disable a check that looks for an official google api key.
@@ -287,7 +317,7 @@
           'COBALT_BOX_DUMP_ENABLED',
           'COBALT_BUILD_TYPE_DEBUG',
           '_DEBUG',
-          'ENABLE_COMMAND_LINE_SWITCHES',
+          'ENABLE_DEBUG_COMMAND_LINE_SWITCHES',
           'ENABLE_DEBUG_C_VAL',
           'ENABLE_DEBUG_CONSOLE',
           'ENABLE_DIR_SOURCE_ROOT_ACCESS',
@@ -310,7 +340,7 @@
           '_DEBUG',
           'ALLOCATOR_STATS_TRACKING',
           'COBALT_BUILD_TYPE_DEVEL',
-          'ENABLE_COMMAND_LINE_SWITCHES',
+          'ENABLE_DEBUG_COMMAND_LINE_SWITCHES',
           'ENABLE_DEBUG_C_VAL',
           'ENABLE_DEBUG_CONSOLE',
           'ENABLE_DIR_SOURCE_ROOT_ACCESS',
@@ -332,7 +362,7 @@
         'defines': [
           'ALLOCATOR_STATS_TRACKING',
           'COBALT_BUILD_TYPE_QA',
-          'ENABLE_COMMAND_LINE_SWITCHES',
+          'ENABLE_DEBUG_COMMAND_LINE_SWITCHES',
           'ENABLE_DEBUG_C_VAL',
           'ENABLE_DEBUG_CONSOLE',
           'ENABLE_DIR_SOURCE_ROOT_ACCESS',
diff --git a/src/cobalt/codereview.settings b/src/cobalt/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/cobalt/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/cobalt/cssom/animation_set.cc b/src/cobalt/cssom/animation_set.cc
index 37cea7d..a2459bb 100644
--- a/src/cobalt/cssom/animation_set.cc
+++ b/src/cobalt/cssom/animation_set.cc
@@ -99,7 +99,7 @@
 }
 }  // namespace
 
-void AnimationSet::Update(const base::TimeDelta& current_time,
+bool AnimationSet::Update(const base::TimeDelta& current_time,
                           const CSSComputedStyleData& style,
                           const CSSKeyframesRule::NameMap& keyframes_map) {
   const std::vector<scoped_refptr<PropertyValue> >& names =
@@ -115,9 +115,12 @@
       names[0] == KeywordValue::GetNone()) {
     // If we have no current animations playing and no animations were
     // specified, there is nothing to do so we can return immediately.
-    return;
+    return false;
   }
 
+  // Whether or not the animations have been modified by this update.
+  bool animations_modified = false;
+
   // Build a set of all animations in the new declared animation set, so that
   // we can later use this to decide which old animations are no longer active.
   std::set<std::string> declared_animation_set;
@@ -172,6 +175,8 @@
     if (event_handler_) {
       event_handler_->OnAnimationStarted(inserted->second);
     }
+
+    animations_modified = true;
   }
 
   // Finally check for any animations that are now ended.
@@ -189,10 +194,16 @@
       animations_to_end.push_back(iter->first);
     }
   }
-  for (std::vector<std::string>::iterator iter = animations_to_end.begin();
-       iter != animations_to_end.end(); ++iter) {
-    animations_.erase(*iter);
+  if (!animations_to_end.empty()) {
+    for (std::vector<std::string>::iterator iter = animations_to_end.begin();
+         iter != animations_to_end.end(); ++iter) {
+      animations_.erase(*iter);
+    }
+
+    animations_modified = true;
   }
+
+  return animations_modified;
 }
 
 }  // namespace cssom
diff --git a/src/cobalt/cssom/animation_set.h b/src/cobalt/cssom/animation_set.h
index 5ef8cf1..160377b 100644
--- a/src/cobalt/cssom/animation_set.h
+++ b/src/cobalt/cssom/animation_set.h
@@ -48,7 +48,8 @@
   // Update the internal state of animations based on our previous state and the
   // passed in computed style.  Animations may be started or ended when this
   // method is called.
-  void Update(const base::TimeDelta& current_time,
+  // Returns whether or not the update modified the animations.
+  bool Update(const base::TimeDelta& current_time,
               const CSSComputedStyleData& style,
               const CSSKeyframesRule::NameMap& keyframes_map);
 
diff --git a/src/cobalt/cssom/cascaded_style.cc b/src/cobalt/cssom/cascaded_style.cc
index 99511a2..7776979 100644
--- a/src/cobalt/cssom/cascaded_style.cc
+++ b/src/cobalt/cssom/cascaded_style.cc
@@ -69,7 +69,7 @@
   scoped_refptr<CSSComputedStyleData> cascaded_style(
       new CSSComputedStyleData());
 
-  // A sparce vector of CascadePrecedence values for all possible property
+  // A sparse vector of CascadePrecedence values for all possible property
   // values.
   base::optional<CascadePrecedence>
       cascade_precedences[static_cast<size_t>(kNumLonghandProperties)];
diff --git a/src/cobalt/cssom/computed_style.cc b/src/cobalt/cssom/computed_style.cc
index 30d4986..48d8223 100644
--- a/src/cobalt/cssom/computed_style.cc
+++ b/src/cobalt/cssom/computed_style.cc
@@ -23,6 +23,7 @@
 #include "cobalt/cssom/absolute_url_value.h"
 #include "cobalt/cssom/calc_value.h"
 #include "cobalt/cssom/css_computed_style_data.h"
+#include "cobalt/cssom/css_computed_style_declaration.h"
 #include "cobalt/cssom/font_weight_value.h"
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/length_value.h"
@@ -2484,16 +2485,18 @@
  public:
   CalculateComputedStyleContext(
       CSSComputedStyleData* cascaded_style,
-      const scoped_refptr<const CSSComputedStyleData>& parent_computed_style,
+      const scoped_refptr<CSSComputedStyleDeclaration>&
+          parent_computed_style_declaration,
       const scoped_refptr<const CSSComputedStyleData>& root_computed_style,
       const math::Size& viewport_size,
       GURLMap* const property_key_to_base_url_map)
       : cascaded_style_(cascaded_style),
-        parent_computed_style_(*parent_computed_style),
+        parent_computed_style_(*parent_computed_style_declaration->data()),
         root_computed_style_(*root_computed_style),
         viewport_size_(viewport_size),
         property_key_to_base_url_map_(property_key_to_base_url_map) {
-    cascaded_style_->SetParentComputedStyle(parent_computed_style);
+    cascaded_style_->SetParentComputedStyleDeclaration(
+        parent_computed_style_declaration);
   }
 
   // Updates the property specified by the iterator to its computed value.
@@ -2689,6 +2692,11 @@
 bool CalculateComputedStyleContext::HandleInheritOrInitial(
     PropertyKey key, scoped_refptr<PropertyValue>* value) {
   if (*value == KeywordValue::GetInherit()) {
+    // Add this property to the list of those that inherited their declared
+    // value from the parent. This allows the computed style to later determine
+    // if a value that was explicitly inherited from the parent is no longer
+    // valid.
+    cascaded_style_->AddDeclaredPropertyInheritedFromParent(key);
     *value = parent_computed_style_.GetPropertyValue(key);
     return true;
   } else if (*value == KeywordValue::GetInitial()) {
@@ -3067,22 +3075,39 @@
 
 void PromoteToComputedStyle(
     const scoped_refptr<CSSComputedStyleData>& cascaded_style,
-    const scoped_refptr<const CSSComputedStyleData>& parent_computed_style,
+    const scoped_refptr<CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration,
     const scoped_refptr<const CSSComputedStyleData>& root_computed_style,
     const math::Size& viewport_size,
     GURLMap* const property_key_to_base_url_map) {
   DCHECK(cascaded_style);
-  DCHECK(parent_computed_style);
+  DCHECK(parent_computed_style_declaration);
   DCHECK(root_computed_style);
 
   // Create a context for calculating the computed style.  This object is useful
   // because it can cache computed style values that are depended upon by other
   // properties' computed style calculations.
   CalculateComputedStyleContext calculate_computed_style_context(
-      cascaded_style.get(), parent_computed_style, root_computed_style,
-      viewport_size, property_key_to_base_url_map);
+      cascaded_style.get(), parent_computed_style_declaration,
+      root_computed_style, viewport_size, property_key_to_base_url_map);
 
-  // Go through all values declared values and calculate their computed values.
+  // For each inherited, animatable property, set the property value to
+  // inherited if it is not already declared. This causes the value to be
+  // explicitly set within the CSSComputedStyleData and ensures that the
+  // original value will be available for transitions (which need to know the
+  // before and after state of the property) even when the property is inherited
+  // from a parent that has changed.
+  const PropertyKeyVector& inherited_animatable_properties =
+      GetInheritedAnimatableProperties();
+  for (PropertyKeyVector::const_iterator iter =
+           inherited_animatable_properties.begin();
+       iter != inherited_animatable_properties.end(); ++iter) {
+    if (!cascaded_style->IsDeclared(*iter)) {
+      cascaded_style->SetPropertyValue(*iter, KeywordValue::GetInherit());
+    }
+  }
+
+  // Go through all declared values and calculate their computed values.
   CSSComputedStyleData::PropertyValues* declared_property_values =
       cascaded_style->declared_property_values();
   for (CSSComputedStyleData::PropertyValues::iterator property_value_iterator =
@@ -3095,11 +3120,13 @@
 }
 
 scoped_refptr<CSSComputedStyleData> GetComputedStyleOfAnonymousBox(
-    const scoped_refptr<const CSSComputedStyleData>& parent_computed_style) {
+    const scoped_refptr<CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration) {
   scoped_refptr<CSSComputedStyleData> computed_style =
       new CSSComputedStyleData();
-  PromoteToComputedStyle(computed_style, parent_computed_style,
-                         parent_computed_style, math::Size(), NULL);
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         parent_computed_style_declaration->data(),
+                         math::Size(), NULL);
   return computed_style;
 }
 
diff --git a/src/cobalt/cssom/computed_style.h b/src/cobalt/cssom/computed_style.h
index 9d356df..da9c9da 100644
--- a/src/cobalt/cssom/computed_style.h
+++ b/src/cobalt/cssom/computed_style.h
@@ -25,6 +25,7 @@
 namespace cssom {
 
 class CSSComputedStyleData;
+class CSSComputedStyleDeclaration;
 
 // The computed value is the result of resolving the specified value,
 // generally absolutizing it. The computed value is the value that is
@@ -32,11 +33,12 @@
 //   https://www.w3.org/TR/css-cascade-3/#computed
 
 // Converts specified values into computed values in place.
-// parent_computed_style and root_computed_style cannot be NULL.
+// parent_computed_style_declaration and root_computed_style cannot be NULL.
 // property_key_to_base_url_map can be NULL.
 void PromoteToComputedStyle(
     const scoped_refptr<CSSComputedStyleData>& specified_style,
-    const scoped_refptr<const CSSComputedStyleData>& parent_computed_style,
+    const scoped_refptr<CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration,
     const scoped_refptr<const CSSComputedStyleData>& root_computed_style,
     const math::Size& viewport_size,
     GURLMap* const property_key_to_base_url_map);
@@ -49,7 +51,8 @@
 //   https://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level
 //   https://www.w3.org/TR/CSS21/visuren.html#anonymous
 scoped_refptr<CSSComputedStyleData> GetComputedStyleOfAnonymousBox(
-    const scoped_refptr<const CSSComputedStyleData>& parent_computed_style);
+    const scoped_refptr<CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration);
 
 }  // namespace cssom
 }  // namespace cobalt
diff --git a/src/cobalt/cssom/computed_style_test.cc b/src/cobalt/cssom/computed_style_test.cc
index bd71ff9..d499787 100644
--- a/src/cobalt/cssom/computed_style_test.cc
+++ b/src/cobalt/cssom/computed_style_test.cc
@@ -23,6 +23,7 @@
 #include "cobalt/cssom/calc_value.h"
 #include "cobalt/cssom/css_computed_style_data.h"
 #include "cobalt/cssom/css_computed_style_declaration.h"
+#include "cobalt/cssom/font_style_value.h"
 #include "cobalt/cssom/font_weight_value.h"
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/length_value.h"
@@ -39,15 +40,25 @@
 namespace cobalt {
 namespace cssom {
 
+scoped_refptr<CSSComputedStyleDeclaration> CreateComputedStyleDeclaration(
+    scoped_refptr<CSSComputedStyleData> computed_style) {
+  scoped_refptr<CSSComputedStyleDeclaration> computed_style_declaration(
+      new CSSComputedStyleDeclaration());
+  computed_style_declaration->SetData(computed_style);
+  return computed_style_declaration;
+}
+
 TEST(PromoteToComputedStyle, FontWeightShouldBeBoldAsSpecified) {
   scoped_refptr<CSSComputedStyleData> computed_style(
       new CSSComputedStyleData());
   computed_style->set_font_weight(FontWeightValue::GetBoldAka700());
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(FontWeightValue::GetBoldAka700(),
@@ -62,8 +73,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_font_size = base::polymorphic_downcast<LengthValue*>(
@@ -81,12 +94,14 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
   scoped_refptr<CSSComputedStyleData> root_computed_style(
       new CSSComputedStyleData());
   root_computed_style->set_font_size(new LengthValue(200, kPixelsUnit));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          root_computed_style, math::Size(), NULL);
 
   LengthValue* computed_font_size = base::polymorphic_downcast<LengthValue*>(
@@ -105,8 +120,10 @@
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(360, 240), NULL);
 
   LengthValue* computed_font_size = base::polymorphic_downcast<LengthValue*>(
@@ -125,10 +142,12 @@
       new CSSComputedStyleData());
   computed_style->set_font_size(new LengthValue(50, kPixelsUnit));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_font_size = base::polymorphic_downcast<LengthValue*>(
@@ -142,10 +161,12 @@
       new CSSComputedStyleData());
   computed_style->set_line_height(KeywordValue::GetNormal());
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(KeywordValue::GetNormal(), computed_style->line_height());
@@ -160,8 +181,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_line_height = base::polymorphic_downcast<LengthValue*>(
@@ -179,8 +202,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_text_indent = base::polymorphic_downcast<LengthValue*>(
@@ -202,12 +227,14 @@
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
   GURLMap property_key_to_base_url_map;
   property_key_to_base_url_map[kBackgroundImageProperty] =
       GURL("file:///computed_style_test/style_sheet.css");
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(),
                          &property_key_to_base_url_map);
 
@@ -237,12 +264,14 @@
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
   GURLMap property_key_to_base_url_map;
   property_key_to_base_url_map[kBackgroundImageProperty] =
       GURL("file:///computed_style_test/document.html");
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(),
                          &property_key_to_base_url_map);
 
@@ -263,9 +292,12 @@
       GetPropertyInitialValue(kBackgroundPositionProperty));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -302,9 +334,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -340,9 +375,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -380,9 +418,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -419,9 +460,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -458,9 +502,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -497,9 +544,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -537,9 +587,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -577,9 +630,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -618,9 +674,12 @@
       new PropertyListValue(background_position_builder.Pass()));
   computed_style->set_background_position(background_position);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_position_list =
@@ -656,9 +715,12 @@
       new PropertyListValue(background_size_builder.Pass()));
   computed_style->set_background_size(background_size);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> background_size_list =
@@ -682,9 +744,12 @@
       new CSSComputedStyleData());
   computed_style->set_background_size(KeywordValue::GetContain());
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(KeywordValue::GetContain(), computed_style->background_size());
@@ -695,9 +760,12 @@
       new CSSComputedStyleData());
   computed_style->set_border_radius(new LengthValue(3, kFontSizesAkaEmUnit));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* border_radius = base::polymorphic_downcast<LengthValue*>(
@@ -712,9 +780,12 @@
   computed_style->set_border_left_color(KeywordValue::GetCurrentColor());
   computed_style->set_color(RGBAColorValue::GetAqua());
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<RGBAColorValue> border_color =
@@ -729,9 +800,12 @@
   computed_style->set_border_top_style(KeywordValue::GetNone());
   computed_style->set_border_top_width(new LengthValue(2, kFontSizesAkaEmUnit));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<LengthValue> border_top_width =
@@ -752,7 +826,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<LengthValue> border_left_width =
@@ -781,7 +858,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(50, kPixelsUnit));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> box_shadow_list =
@@ -824,7 +904,10 @@
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> box_shadow_list =
@@ -867,7 +950,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_color(new RGBAColorValue(0x0047abff));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> box_shadow_list =
@@ -918,7 +1004,10 @@
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(50, kPixelsUnit));
   parent_computed_style->set_color(new RGBAColorValue(0x0047ABFF));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> box_shadow_list =
@@ -970,7 +1059,10 @@
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(KeywordValue::GetNone(), computed_style->box_shadow());
@@ -982,9 +1074,12 @@
   computed_style->set_text_decoration_color(KeywordValue::GetCurrentColor());
   computed_style->set_color(RGBAColorValue::GetAqua());
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<RGBAColorValue> text_decoration_color =
@@ -1014,7 +1109,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(50, kPixelsUnit));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> text_shadow_list =
@@ -1055,7 +1153,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_color(new RGBAColorValue(0x0047abff));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> text_shadow_list =
@@ -1105,7 +1206,10 @@
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(50, kPixelsUnit));
   parent_computed_style->set_color(new RGBAColorValue(0x0047ABFF));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> text_shadow_list =
@@ -1156,7 +1260,10 @@
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(KeywordValue::GetNone(), computed_style->text_shadow());
@@ -1171,10 +1278,13 @@
       new CSSComputedStyleData());
   computed_style->set_height(new PercentageValue(0.50f));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   EXPECT_EQ(KeywordValue::GetAuto(), parent_computed_style->height());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(KeywordValue::GetAuto(), computed_style->height());
@@ -1190,10 +1300,13 @@
       new CSSComputedStyleData());
   computed_style->set_max_height(new PercentageValue(0.50f));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   EXPECT_EQ(KeywordValue::GetAuto(), parent_computed_style->height());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   EXPECT_EQ(KeywordValue::GetNone(), computed_style->max_height());
@@ -1209,10 +1322,13 @@
       new CSSComputedStyleData());
   computed_style->set_min_height(new PercentageValue(0.50f));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   EXPECT_EQ(KeywordValue::GetAuto(), parent_computed_style->height());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_min_height = base::polymorphic_downcast<LengthValue*>(
@@ -1229,15 +1345,22 @@
       new CSSComputedStyleData());
   computed_style->set_max_width(new PercentageValue(0.50f));
 
-  scoped_refptr<const CSSComputedStyleData> grandparent_computed_style(
+  scoped_refptr<CSSComputedStyleData> grandparent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration>
+      grandparent_computed_style_declaration(
+          CreateComputedStyleDeclaration(grandparent_computed_style));
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_width(new LengthValue(-16, kPixelsUnit));
-  PromoteToComputedStyle(parent_computed_style, grandparent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(parent_computed_style,
+                         grandparent_computed_style_declaration,
                          grandparent_computed_style, math::Size(), NULL);
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          grandparent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_max_width = base::polymorphic_downcast<LengthValue*>(
@@ -1254,15 +1377,22 @@
       new CSSComputedStyleData());
   computed_style->set_min_width(new PercentageValue(0.50f));
 
-  scoped_refptr<const CSSComputedStyleData> grandparent_computed_style(
+  scoped_refptr<CSSComputedStyleData> grandparent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration>
+      grandparent_computed_style_declaration(
+          CreateComputedStyleDeclaration(grandparent_computed_style));
 
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_width(new LengthValue(-16, kPixelsUnit));
-  PromoteToComputedStyle(parent_computed_style, grandparent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(parent_computed_style,
+                         grandparent_computed_style_declaration,
                          grandparent_computed_style, math::Size(), NULL);
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          grandparent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_min_width = base::polymorphic_downcast<LengthValue*>(
@@ -1280,10 +1410,12 @@
   computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
   computed_style->set_line_height(new PercentageValue(0.75f));
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
 
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   LengthValue* computed_line_height = base::polymorphic_downcast<LengthValue*>(
@@ -1304,9 +1436,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1347,9 +1482,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1391,9 +1529,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1435,9 +1576,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1479,9 +1623,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1523,9 +1670,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1568,9 +1718,12 @@
       new PropertyListValue(transform_origin_builder.Pass()));
   computed_style->set_transform_origin(transform_origin);
 
-  scoped_refptr<const CSSComputedStyleData> parent_computed_style(
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<PropertyListValue> transform_origin_list =
@@ -1614,7 +1767,10 @@
   scoped_refptr<CSSComputedStyleData> parent_computed_style(
       new CSSComputedStyleData());
   parent_computed_style->set_font_size(new LengthValue(100, kPixelsUnit));
-  PromoteToComputedStyle(computed_style, parent_computed_style,
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
                          parent_computed_style, math::Size(), NULL);
 
   scoped_refptr<TransformFunctionListValue> computed_transform =
@@ -1631,5 +1787,238 @@
   EXPECT_EQ(kPixelsUnit, computed_function->offset_as_length()->unit());
 }
 
+TEST(PromoteToComputedStyle,
+     InheritedAnimatablePropertyShouldAlwaysBeDeclared) {
+  scoped_refptr<CSSComputedStyleData> computed_style(
+      new CSSComputedStyleData());
+
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
+      new CSSComputedStyleData());
+  parent_computed_style->set_color(RGBAColorValue::GetAqua());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  // Verify that we're testing an inherited and animatable property.
+  ASSERT_TRUE(GetPropertyInheritance(kColorProperty) &&
+              GetPropertyAnimatable(kColorProperty));
+
+  // For each inherited, animatable property, the property value should be set
+  // to inherited if it is not already declared in PromoteToComputedStyle().
+  // This causes the value to be  explicitly set within the CSSComputedStyleData
+  // and ensures that the original value will be available for transitions
+  // (which need to know the before and after state of the property) even when
+  // the property is inherited from a parent that has changed.
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         parent_computed_style, math::Size(), NULL);
+
+  // Verify that the color is declared in the child even though it was not
+  // explicitly declared.
+  ASSERT_TRUE(computed_style->IsDeclared(kColorProperty));
+}
+
+TEST(PromoteToComputedStyle,
+     DeclaredPropertiesInheritedFromParentShouldRemainValidWhenSetToSameValue) {
+  scoped_refptr<CSSComputedStyleData> computed_style(
+      new CSSComputedStyleData());
+
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
+      new CSSComputedStyleData());
+  parent_computed_style->set_color(
+      new RGBAColorValue(uint8(10), uint8(10), uint8(10), uint8(10)));
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  // Verify that we're testing an inherited and animatable property.
+  ASSERT_TRUE(GetPropertyInheritance(kColorProperty) &&
+              GetPropertyAnimatable(kColorProperty));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         parent_computed_style, math::Size(), NULL);
+
+  // Verify that the declared properties inherited from the parent are valid.
+  ASSERT_TRUE(computed_style->AreDeclaredPropertiesInheritedFromParentValid());
+
+  parent_computed_style = new CSSComputedStyleData();
+  parent_computed_style->set_color(
+      new RGBAColorValue(uint8(10), uint8(10), uint8(10), uint8(10)));
+  parent_computed_style_declaration->SetData(parent_computed_style);
+
+  // Verify that the declared properties inherited from the parent are still
+  // valid.
+  ASSERT_TRUE(computed_style->AreDeclaredPropertiesInheritedFromParentValid());
+}
+
+TEST(PromoteToComputedStyle,
+     InheritedAnimatablePropertyShouldRetainValueAfterParentValueChanges) {
+  scoped_refptr<CSSComputedStyleData> computed_style(
+      new CSSComputedStyleData());
+
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
+      new CSSComputedStyleData());
+  parent_computed_style->set_color(RGBAColorValue::GetAqua());
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+
+  // Verify that we're testing an inherited and animatable property.
+  ASSERT_TRUE(GetPropertyInheritance(kColorProperty) &&
+              GetPropertyAnimatable(kColorProperty));
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         parent_computed_style, math::Size(), NULL);
+
+  // Verify that the child's color is Aqua and matches the parent's color.
+  EXPECT_EQ(RGBAColorValue::GetAqua(), computed_style->color());
+  EXPECT_EQ(parent_computed_style->color(), computed_style->color());
+
+  // Verify that the declared properties inherited from the parent are valid.
+  ASSERT_TRUE(computed_style->AreDeclaredPropertiesInheritedFromParentValid());
+
+  parent_computed_style = new CSSComputedStyleData();
+  parent_computed_style->set_color(RGBAColorValue::GetNavy());
+  parent_computed_style_declaration->SetData(parent_computed_style);
+
+  // Verify that the color is still Aqua but that it no longer matches the
+  // parent's color.
+  EXPECT_EQ(RGBAColorValue::GetAqua(), computed_style->color());
+  EXPECT_NE(parent_computed_style->color(), computed_style->color());
+
+  // Verify that the declared properties inherited from the parent are no
+  // longer valid.
+  ASSERT_FALSE(computed_style->AreDeclaredPropertiesInheritedFromParentValid());
+}
+
+TEST(UpdateInheritedData,
+     UpdateInheritedDataShouldFixInheritedDataAfterItIsAdded) {
+  scoped_refptr<CSSComputedStyleData> grandparent_computed_style(
+      new CSSComputedStyleData());
+  scoped_refptr<CSSComputedStyleDeclaration>
+      grandparent_computed_style_declaration(
+          CreateComputedStyleDeclaration(grandparent_computed_style));
+
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
+      new CSSComputedStyleData());
+  // The parent should initially have the default value of normal.
+  EXPECT_EQ(FontStyleValue::GetNormal(), parent_computed_style->font_style());
+
+  PromoteToComputedStyle(parent_computed_style,
+                         grandparent_computed_style_declaration,
+                         grandparent_computed_style, math::Size(), NULL);
+  // The parent should still have the default value of normal.
+  EXPECT_EQ(FontStyleValue::GetNormal(), parent_computed_style->font_style());
+
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+  scoped_refptr<CSSComputedStyleData> computed_style(
+      new CSSComputedStyleData());
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         grandparent_computed_style, math::Size(), NULL);
+
+  // The child should have the default value of normal.
+  EXPECT_EQ(FontStyleValue::GetNormal(), computed_style->font_style());
+
+  grandparent_computed_style = new CSSComputedStyleData();
+  grandparent_computed_style->set_font_style(FontStyleValue::GetOblique());
+  grandparent_computed_style_declaration->SetData(grandparent_computed_style);
+
+  // Even though the grandparent has changed, the child should have the original
+  // default value of normal until UpdateInheritedData() is called.
+  EXPECT_EQ(FontStyleValue::GetNormal(), computed_style->font_style());
+  parent_computed_style_declaration->UpdateInheritedData();
+
+  // Now that UpdateInheritedData() has been called, the child should have the
+  // new inherited value of oblique.
+  EXPECT_EQ(FontStyleValue::GetOblique(), computed_style->font_style());
+}
+
+TEST(UpdateInheritedData,
+     UpdateInheritedDataShouldFixInheritedDataAfterItIsRemoved) {
+  scoped_refptr<CSSComputedStyleData> grandparent_computed_style(
+      new CSSComputedStyleData());
+  grandparent_computed_style->set_font_style(FontStyleValue::GetItalic());
+  scoped_refptr<CSSComputedStyleDeclaration>
+      grandparent_computed_style_declaration(
+          CreateComputedStyleDeclaration(grandparent_computed_style));
+
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
+      new CSSComputedStyleData());
+  // The parent should initially have the default value of normal.
+  EXPECT_EQ(FontStyleValue::GetNormal(), parent_computed_style->font_style());
+
+  PromoteToComputedStyle(parent_computed_style,
+                         grandparent_computed_style_declaration,
+                         grandparent_computed_style, math::Size(), NULL);
+  // The parent should now have the inherited value of italic.
+  EXPECT_EQ(FontStyleValue::GetItalic(), parent_computed_style->font_style());
+
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+  scoped_refptr<CSSComputedStyleData> computed_style(
+      new CSSComputedStyleData());
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         grandparent_computed_style, math::Size(), NULL);
+
+  // The child should have the inherited value of italic.
+  EXPECT_EQ(FontStyleValue::GetItalic(), computed_style->font_style());
+
+  grandparent_computed_style = new CSSComputedStyleData();
+  grandparent_computed_style_declaration->SetData(grandparent_computed_style);
+
+  // Even though the grandparent has changed, the child should have the original
+  // inherited value of italic until UpdateInheritedData() is called.
+  EXPECT_EQ(FontStyleValue::GetItalic(), computed_style->font_style());
+  parent_computed_style_declaration->UpdateInheritedData();
+
+  // Now that UpdateInheritedData() has been called, the child should have the
+  // default value of normal.
+  EXPECT_EQ(FontStyleValue::GetNormal(), computed_style->font_style());
+}
+
+TEST(UpdateInheritedData,
+     UpdateInheritedDataShouldFixInheritedDataAfterItChanges) {
+  scoped_refptr<CSSComputedStyleData> grandparent_computed_style(
+      new CSSComputedStyleData());
+  grandparent_computed_style->set_font_style(FontStyleValue::GetItalic());
+  scoped_refptr<CSSComputedStyleDeclaration>
+      grandparent_computed_style_declaration(
+          CreateComputedStyleDeclaration(grandparent_computed_style));
+
+  scoped_refptr<CSSComputedStyleData> parent_computed_style(
+      new CSSComputedStyleData());
+  // The parent should initially have the default value of normal.
+  EXPECT_EQ(FontStyleValue::GetNormal(), parent_computed_style->font_style());
+
+  PromoteToComputedStyle(parent_computed_style,
+                         grandparent_computed_style_declaration,
+                         grandparent_computed_style, math::Size(), NULL);
+  // The parent should now have the inherited value of italic.
+  EXPECT_EQ(FontStyleValue::GetItalic(), parent_computed_style->font_style());
+
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+      CreateComputedStyleDeclaration(parent_computed_style));
+  scoped_refptr<CSSComputedStyleData> computed_style(
+      new CSSComputedStyleData());
+
+  PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+                         grandparent_computed_style, math::Size(), NULL);
+
+  // The child should have the inherited value of italic.
+  EXPECT_EQ(FontStyleValue::GetItalic(), computed_style->font_style());
+
+  grandparent_computed_style = new CSSComputedStyleData();
+  grandparent_computed_style->set_font_style(FontStyleValue::GetOblique());
+  grandparent_computed_style_declaration->SetData(grandparent_computed_style);
+
+  // Even though the grandparent has changed, the child should have the original
+  // inherited value of italic until UpdateInheritedData() is called.
+  EXPECT_EQ(FontStyleValue::GetItalic(), computed_style->font_style());
+  parent_computed_style_declaration->UpdateInheritedData();
+
+  // Now that UpdateInheritedData() has been called, the child should have the
+  // new inherited value of oblique.
+  EXPECT_EQ(FontStyleValue::GetOblique(), computed_style->font_style());
+}
+
 }  // namespace cssom
 }  // namespace cobalt
diff --git a/src/cobalt/cssom/css_computed_style_data.cc b/src/cobalt/cssom/css_computed_style_data.cc
index c2a4689..590ea05 100644
--- a/src/cobalt/cssom/css_computed_style_data.cc
+++ b/src/cobalt/cssom/css_computed_style_data.cc
@@ -20,6 +20,7 @@
 
 #include "base/lazy_instance.h"
 #include "base/string_util.h"
+#include "cobalt/cssom/css_computed_style_declaration.h"
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/length_value.h"
 
@@ -62,7 +63,9 @@
 }
 
 CSSComputedStyleData::CSSComputedStyleData()
-    : has_inherited_properties_(false) {}
+    : has_declared_inherited_properties_(false) {}
+
+CSSComputedStyleData::~CSSComputedStyleData() {}
 
 unsigned int CSSComputedStyleData::length() const {
   // Computed style declarations have all known longhand properties.
@@ -79,12 +82,18 @@
   DCHECK_GT(key, kNoneProperty);
   DCHECK_LE(key, kMaxLonghandPropertyKey);
 
+  // If the property's value is explicitly declared, then simply return it.
   if (declared_properties_[key]) {
     return declared_property_values_.find(key)->second;
   }
-  if (ancestor_computed_style_ &&
-      GetPropertyInheritance(key) == kInheritedYes) {
-    return ancestor_computed_style_->GetPropertyValueReference(key);
+
+  // Otherwise, if the property is inherited and the parent has inherited
+  // properties, then retrieve the parent's value for the property.
+  if (parent_computed_style_declaration_ &&
+      GetPropertyInheritance(key) == kInheritedYes &&
+      parent_computed_style_declaration_->HasInheritedProperties()) {
+    return parent_computed_style_declaration_
+        ->GetInheritedPropertyValueReference(key);
   }
 
   // For the root element, which has no parent element, the inherited value is
@@ -270,8 +279,18 @@
   if (value) {
     declared_properties_.set(key, true);
     declared_property_values_[key] = value;
-    has_inherited_properties_ = has_inherited_properties_ ||
-                                GetPropertyInheritance(key) == kInheritedYes;
+    // Only set |has_declared_inherited_properties_| if the property is
+    // inherited and the the value isn't explicitly set to "inherit". If it is
+    // set to "inherit", then the value is simply a copy of the parent's value,
+    // which doesn't necessitate the node being included in the inheritance
+    // tree, as it doesn't provide new information.
+    // NOTE: Declaring a value of "inherit" on an inherited property is used for
+    // transitions, which need to know the original value of the property (which
+    // would otherwise be lost when the parent changed).
+    has_declared_inherited_properties_ =
+        has_declared_inherited_properties_ ||
+        (GetPropertyInheritance(key) == kInheritedYes &&
+         value != KeywordValue::GetInherit());
   } else if (declared_properties_[key]) {
     declared_properties_.set(key, false);
     declared_property_values_.erase(key);
@@ -281,7 +300,10 @@
 void CSSComputedStyleData::AssignFrom(const CSSComputedStyleData& rhs) {
   declared_properties_ = rhs.declared_properties_;
   declared_property_values_ = rhs.declared_property_values_;
-  has_inherited_properties_ = rhs.has_inherited_properties_;
+  has_declared_inherited_properties_ = rhs.has_declared_inherited_properties_;
+  declared_properties_inherited_from_parent_ =
+      rhs.declared_properties_inherited_from_parent_;
+  parent_computed_style_declaration_ = rhs.parent_computed_style_declaration_;
 }
 
 std::string CSSComputedStyleData::SerializeCSSDeclarationBlock() const {
@@ -305,18 +327,84 @@
   return serialized_text;
 }
 
-void CSSComputedStyleData::SetParentComputedStyle(
-    const scoped_refptr<const CSSComputedStyleData>& parent_computed_style) {
-  if (parent_computed_style->has_inherited_properties_) {
-    ancestor_computed_style_ = parent_computed_style;
-  } else {
-    // If the parent style does not have any inherited properties, we will never
-    // need to refer to it for inherited properties, so we refer to the parent
-    // style's ancestor instead. This gives the number of ancestor dereferences
-    // needed to find the value of an inherited property an upper bound equal to
-    // the total number of inheritable properties.
-    ancestor_computed_style_ = parent_computed_style->ancestor_computed_style_;
+void CSSComputedStyleData::AddDeclaredPropertyInheritedFromParent(
+    PropertyKey key) {
+  declared_properties_inherited_from_parent_.push_back(key);
+}
+
+bool CSSComputedStyleData::AreDeclaredPropertiesInheritedFromParentValid()
+    const {
+  // If there are no declared properties inherited from the parent, then it's
+  // impossible for them to be invalid.
+  if (declared_properties_inherited_from_parent_.size() == 0) {
+    return true;
   }
+
+  if (!parent_computed_style_declaration_) {
+    return false;
+  }
+
+  const scoped_refptr<const CSSComputedStyleData>& parent_computed_style_data =
+      parent_computed_style_declaration_->data();
+  if (!parent_computed_style_data) {
+    return false;
+  }
+
+  // Verify that the parent's data is valid.
+  DCHECK(parent_computed_style_data
+             ->AreDeclaredPropertiesInheritedFromParentValid());
+
+  // Walk the declared properties inherited from the parent. They're invalid if
+  // any no longer match the parent's value.
+  for (PropertyKeyVector::const_iterator iter =
+           declared_properties_inherited_from_parent_.begin();
+       iter != declared_properties_inherited_from_parent_.end(); ++iter) {
+    if (!GetPropertyValueReference(*iter)->Equals(
+            *parent_computed_style_data->GetPropertyValueReference(*iter))) {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool CSSComputedStyleData::DoDeclaredPropertiesMatch(
+    const scoped_refptr<const CSSComputedStyleData>& other) const {
+  // If the bitsets don't match, then there's no need to check the values;
+  // the declared properties are guaranteed to not match.
+  if (declared_properties_ != other->declared_properties_) {
+    return false;
+  }
+
+  // Verify that the same number of declared property values exist within the
+  // two CSSComputedStyleData objects. This should be guaranteed by the
+  // bitsets matching.
+  DCHECK_EQ(declared_property_values_.size(),
+            other->declared_property_values_.size());
+
+  // Walk the two lists of declared property values looking for any keys or
+  // values that don't match.
+  PropertyValues::const_iterator iter1 = declared_property_values_.begin();
+  PropertyValues::const_iterator iter2 =
+      other->declared_property_values_.begin();
+  for (; iter1 != declared_property_values_.end(); ++iter1, ++iter2) {
+    if (iter1->first != iter2->first ||
+        !iter1->second->Equals(*iter2->second)) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+void CSSComputedStyleData::SetParentComputedStyleDeclaration(
+    const scoped_refptr<CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration) {
+  parent_computed_style_declaration_ = parent_computed_style_declaration;
+}
+
+const scoped_refptr<CSSComputedStyleDeclaration>&
+CSSComputedStyleData::GetParentComputedStyleDeclaration() const {
+  return parent_computed_style_declaration_;
 }
 
 }  // namespace cssom
diff --git a/src/cobalt/cssom/css_computed_style_data.h b/src/cobalt/cssom/css_computed_style_data.h
index 80c93b7..e303868 100644
--- a/src/cobalt/cssom/css_computed_style_data.h
+++ b/src/cobalt/cssom/css_computed_style_data.h
@@ -31,12 +31,11 @@
 namespace cobalt {
 namespace cssom {
 
+class CSSComputedStyleDeclaration;
+
 // CSSComputedStyleData which has PropertyValue type properties only used
-// internally and it is not exposed to JavaScript.  It derives from
-// RefCountedThreadSafe instead of RefCounted so that it can be passed forward
-// to another thread for animating before rendering a scene.
-class CSSComputedStyleData
-    : public base::RefCountedThreadSafe<CSSComputedStyleData> {
+// internally and it is not exposed to JavaScript.
+class CSSComputedStyleData : public base::RefCounted<CSSComputedStyleData> {
  public:
   // This class provides the ability to determine whether the properties of two
   // CSSComputedStyleData objects match for a given set of property keys.
@@ -61,6 +60,7 @@
                          16, std::equal_to<PropertyKey> > PropertyValues;
 
   CSSComputedStyleData();
+  ~CSSComputedStyleData();
 
   // The length attribute must return the number of CSS declarations in the
   // declarations.
@@ -661,25 +661,54 @@
 
   void AssignFrom(const CSSComputedStyleData& rhs);
 
+  // This returns the result of serializing a CSS declaration block.
+  // The current implementation does not handle shorthands.
+  //   https://www.w3.org/TR/cssom/#serialize-a-css-declaration-block
+  std::string SerializeCSSDeclarationBlock() const;
+
   // Returns true if the property is explicitly declared in this style, as
   // opposed to implicitly inheriting from its parent or the initial value.
   bool IsDeclared(const PropertyKey key) const {
     return declared_properties_[key];
   }
 
-  // This returns the result of serializing a CSS declaration block.
-  // The current implementation does not handle shorthands.
-  //   https://www.w3.org/TR/cssom/#serialize-a-css-declaration-block
-  std::string SerializeCSSDeclarationBlock() const;
+  // Whether or not any inherited properties have been declared.
+  // NOTE: Inherited properties that are set to a value "inherit" do not impact
+  // this flag, as they will have the same value as the parent and can be
+  // skipped by descendants retrieving their inherited value without impacting
+  // the returned value.
+  bool has_declared_inherited_properties() const {
+    return has_declared_inherited_properties_;
+  }
 
-  // Set the parent computed style for tracking inherited properties.
-  void SetParentComputedStyle(
-      const scoped_refptr<const CSSComputedStyleData>& parent_computed_style);
+  // Adds a declared property that was inherited from the parent to an
+  // internal list. This facilitates tracking of whether or not a value that was
+  // initially set to a parent's value continues to match the parent's value.
+  void AddDeclaredPropertyInheritedFromParent(PropertyKey key);
+
+  // Returns true if all of the declared properties that were inherited from the
+  // parent are still valid. They become invalid when the parent's value
+  // changes.
+  bool AreDeclaredPropertiesInheritedFromParentValid() const;
 
   PropertyValues* declared_property_values() {
     return &declared_property_values_;
   }
 
+  // Returns whether or not the declared properties in the passed in
+  // CSSComputedStyleData matches those declared within this one.
+  bool DoDeclaredPropertiesMatch(
+      const scoped_refptr<const CSSComputedStyleData>& other) const;
+
+  // Set the parent computed style for tracking inherited properties.
+  void SetParentComputedStyleDeclaration(
+      const scoped_refptr<CSSComputedStyleDeclaration>&
+          parent_computed_style_declaration);
+
+  // Returns the parent computed style used for tracking inherited properties.
+  const scoped_refptr<CSSComputedStyleDeclaration>&
+  GetParentComputedStyleDeclaration() const;
+
  private:
   // Helper function that returns the computed value if the initial property
   // value is not computed or returns the initial value if it is computed.
@@ -691,10 +720,25 @@
   LonghandPropertiesBitset declared_properties_;
   PropertyValues declared_property_values_;
 
-  scoped_refptr<const CSSComputedStyleData> ancestor_computed_style_;
+  // True if this style has any inherited properties declared.
+  // NOTE: Inherited properties that are set to a value "inherit" do not impact
+  // this flag, as they will have the same value as the parent and can be
+  // skipped by descendants retrieving their inherited value without impacting
+  // the returned value.
+  bool has_declared_inherited_properties_;
 
-  // True if this style has any inheritable properties defined.
-  bool has_inherited_properties_;
+  // Properties that were initially set to a value of "inherit" before being
+  // updated with the parent's value. This is used to determine whether the
+  // declared properties inherited from the parent have subsequently changed.
+  PropertyKeyVector declared_properties_inherited_from_parent_;
+
+  // The parent used for inherited properties.
+  // NOTE: The parent is a CSSComputedStyleDeclaration, rather than a
+  // CSSComputedStyleData, in order to allow for the replacement of ancestor
+  // CSSComputedStyleData objects without requiring all of its descendants to
+  // also be replaced. The descendant's inherited property value will instead
+  // dynamically update.
+  scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration_;
 };
 
 }  // namespace cssom
diff --git a/src/cobalt/cssom/css_computed_style_data_test.cc b/src/cobalt/cssom/css_computed_style_data_test.cc
index 3dd7f71..2fcb1ea 100644
--- a/src/cobalt/cssom/css_computed_style_data_test.cc
+++ b/src/cobalt/cssom/css_computed_style_data_test.cc
@@ -1128,5 +1128,68 @@
   EXPECT_EQ(KeywordValue::GetBlock(), style->display());
 }
 
+TEST(CSSComputedStyleDataTest,
+     DoDeclaredPropertiesMatchWorksWithUnequalNumberOfDeclaredProperties) {
+  scoped_refptr<CSSComputedStyleData> style1 = new CSSComputedStyleData();
+  style1->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  scoped_refptr<CSSComputedStyleData> style2 = new CSSComputedStyleData();
+
+  ASSERT_FALSE(style1->DoDeclaredPropertiesMatch(style2));
+  ASSERT_FALSE(style2->DoDeclaredPropertiesMatch(style1));
+}
+
+TEST(CSSComputedStyleDataTest,
+     DoDeclaredPropertiesMatchWorksWithSingleUnequalProperty) {
+  scoped_refptr<CSSComputedStyleData> style1 = new CSSComputedStyleData();
+  style1->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  scoped_refptr<CSSComputedStyleData> style2 = new CSSComputedStyleData();
+  style2->set_font_size(new LengthValue(30, kPixelsUnit));
+
+  ASSERT_FALSE(style1->DoDeclaredPropertiesMatch(style2));
+  ASSERT_FALSE(style2->DoDeclaredPropertiesMatch(style1));
+}
+
+TEST(CSSComputedStyleDataTest,
+     DoDeclaredPropertiesMatchWorksWithSingleEqualProperty) {
+  scoped_refptr<CSSComputedStyleData> style1 = new CSSComputedStyleData();
+  style1->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  scoped_refptr<CSSComputedStyleData> style2 = new CSSComputedStyleData();
+  style2->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  ASSERT_TRUE(style1->DoDeclaredPropertiesMatch(style2));
+  ASSERT_TRUE(style2->DoDeclaredPropertiesMatch(style1));
+}
+
+TEST(CSSComputedStyleDataTest,
+     DoDeclaredPropertiesMatchWorksWithMultipleUnequalProperties) {
+  scoped_refptr<CSSComputedStyleData> style1 = new CSSComputedStyleData();
+  style1->set_position(KeywordValue::GetAbsolute());
+  style1->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  scoped_refptr<CSSComputedStyleData> style2 = new CSSComputedStyleData();
+  style2->set_position(KeywordValue::GetAbsolute());
+  style2->set_font_size(new LengthValue(30, kPixelsUnit));
+
+  ASSERT_FALSE(style1->DoDeclaredPropertiesMatch(style2));
+  ASSERT_FALSE(style2->DoDeclaredPropertiesMatch(style1));
+}
+
+TEST(CSSComputedStyleDataTest,
+     DoDeclaredPropertiesMatchWorksWithMultipleEqualProperty) {
+  scoped_refptr<CSSComputedStyleData> style1 = new CSSComputedStyleData();
+  style1->set_position(KeywordValue::GetAbsolute());
+  style1->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  scoped_refptr<CSSComputedStyleData> style2 = new CSSComputedStyleData();
+  style2->set_position(KeywordValue::GetAbsolute());
+  style2->set_font_size(new LengthValue(50, kPixelsUnit));
+
+  ASSERT_TRUE(style1->DoDeclaredPropertiesMatch(style2));
+  ASSERT_TRUE(style2->DoDeclaredPropertiesMatch(style1));
+}
+
 }  // namespace cssom
 }  // namespace cobalt
diff --git a/src/cobalt/cssom/css_computed_style_declaration.cc b/src/cobalt/cssom/css_computed_style_declaration.cc
index 0d477a4..11c7dbb 100644
--- a/src/cobalt/cssom/css_computed_style_declaration.cc
+++ b/src/cobalt/cssom/css_computed_style_declaration.cc
@@ -72,5 +72,45 @@
                            exception_state);
 }
 
+void CSSComputedStyleDeclaration::SetData(
+    const scoped_refptr<const CSSComputedStyleData>& data) {
+  data_ = data;
+  // After setting |data_|, |data_with_inherited_properties_| needs to be
+  // updated. It may have changed.
+  UpdateInheritedData();
+}
+
+void CSSComputedStyleDeclaration::UpdateInheritedData() {
+  if (!data_) {
+    // If there's no data, then there can be no data with inherited properties.
+    data_with_inherited_properties_ = NULL;
+  } else if (data_->has_declared_inherited_properties()) {
+    // Otherwise, if the data has inherited properties, then it's also the first
+    // data with inherited properties.
+    data_with_inherited_properties_ = data_;
+  } else {
+    // Otherwise, |data_with_inherited_properties_| should be set to the parent
+    // computed style's |data_with_inherited_properties_|. This is because the
+    // updates always cascade down the tree and the parent is guaranteed to
+    // have already been updated when the child is updated.
+    const scoped_refptr<CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration =
+            data_->GetParentComputedStyleDeclaration();
+    if (parent_computed_style_declaration) {
+      data_with_inherited_properties_ =
+          parent_computed_style_declaration->data_with_inherited_properties_;
+    } else {
+      data_with_inherited_properties_ = NULL;
+    }
+  }
+}
+
+const scoped_refptr<PropertyValue>&
+CSSComputedStyleDeclaration::GetInheritedPropertyValueReference(
+    PropertyKey key) const {
+  DCHECK(data_with_inherited_properties_);
+  return data_with_inherited_properties_->GetPropertyValueReference(key);
+}
+
 }  // namespace cssom
 }  // namespace cobalt
diff --git a/src/cobalt/cssom/css_computed_style_declaration.h b/src/cobalt/cssom/css_computed_style_declaration.h
index 36a4947..e166979 100644
--- a/src/cobalt/cssom/css_computed_style_declaration.h
+++ b/src/cobalt/cssom/css_computed_style_declaration.h
@@ -58,10 +58,23 @@
   const scoped_refptr<const CSSComputedStyleData>& data() const {
     return data_;
   }
-  void set_data(const scoped_refptr<const CSSComputedStyleData>& data) {
-    data_ = data;
+  void SetData(const scoped_refptr<const CSSComputedStyleData>& data);
+
+  // Updates the pointer to the nearest CSSComputedStyleData ancestor,
+  // inclusive, which has inherited properties declared.
+  void UpdateInheritedData();
+
+  // Returns whether or not this object or any ancestors have inherited
+  // properties declared.
+  bool HasInheritedProperties() const {
+    return data_with_inherited_properties_ != NULL;
   }
 
+  // Returns the reference to the property value for an inherited property.
+  // Should only be called if HasInheritedProperties() returns true.
+  const scoped_refptr<PropertyValue>& GetInheritedPropertyValueReference(
+      PropertyKey key) const;
+
   const scoped_refptr<const web_animations::AnimationSet>& animations() const {
     return animations_;
   }
@@ -74,9 +87,15 @@
   // From CSSStyleDeclaration.
   std::string GetDeclaredPropertyValueStringByKey(
       const PropertyKey key) const OVERRIDE;
+
+  // The CSSComputedStyleData owned by this object.
   scoped_refptr<const CSSComputedStyleData> data_;
 
-  // All animation that applies to  the above computed style.
+  // The nearest CSSComputedStyleData ancestor, inclusive, which has inherited
+  // properties declared.
+  scoped_refptr<const CSSComputedStyleData> data_with_inherited_properties_;
+
+  // All animation that applies to the above computed style.
   scoped_refptr<const web_animations::AnimationSet> animations_;
 
   DISALLOW_COPY_AND_ASSIGN(CSSComputedStyleDeclaration);
diff --git a/src/cobalt/cssom/css_transition_set.cc b/src/cobalt/cssom/css_transition_set.cc
index 4292a94..6edeae6 100644
--- a/src/cobalt/cssom/css_transition_set.cc
+++ b/src/cobalt/cssom/css_transition_set.cc
@@ -84,10 +84,8 @@
   // For each animatable property, check to see if there are any transitions
   // assigned to it.  If so, check to see if there are any existing transitions
   // that must be updated, otherwise introduce new transitions.
-  const AnimatablePropertyList& animatable_properties =
-      GetAnimatableProperties();
-  for (AnimatablePropertyList::const_iterator iter =
-           animatable_properties.begin();
+  const PropertyKeyVector& animatable_properties = GetAnimatableProperties();
+  for (PropertyKeyVector::const_iterator iter = animatable_properties.begin();
        iter != animatable_properties.end(); ++iter) {
     UpdateTransitionForProperty(
         *iter, current_time, source_computed_style.GetPropertyValue(*iter),
@@ -216,7 +214,7 @@
 
       if (existing_transition &&
           current_time < existing_transition->EndTime()) {
-        // A transition is already ocurring, so we handle this case a bit
+        // A transition is already occurring, so we handle this case a bit
         // differently depending on if we're reversing the previous transition
         // or starting a completely different one.
         transitions_.UpdateTransitionForProperty(
diff --git a/src/cobalt/cssom/cssom.gyp b/src/cobalt/cssom/cssom.gyp
index ab8852c..63be9ea 100644
--- a/src/cobalt/cssom/cssom.gyp
+++ b/src/cobalt/cssom/cssom.gyp
@@ -227,6 +227,7 @@
       ],
       'dependencies': [
         '<(DEPTH)/cobalt/base/base.gyp:base',
+        '<(DEPTH)/cobalt/dom/dom_exception.gyp:dom_exception',
         '<(DEPTH)/cobalt/math/math.gyp:math',
         '<(DEPTH)/googleurl/googleurl.gyp:googleurl',
         'embed_resources_as_header_files',
diff --git a/src/cobalt/cssom/property_definitions.cc b/src/cobalt/cssom/property_definitions.cc
index d589181..8133992 100644
--- a/src/cobalt/cssom/property_definitions.cc
+++ b/src/cobalt/cssom/property_definitions.cc
@@ -49,6 +49,7 @@
       : name(NULL),
         inherited(kInheritedNo),
         animatable(kAnimatableNo),
+        impacts_child_declared_style(kImpactsChildDeclaredStyleNo),
         impacts_box_generation(kImpactsBoxGenerationNo),
         impacts_box_sizes(kImpactsBoxSizesNo),
         impacts_box_cross_references(kImpactsBoxCrossReferencesNo) {}
@@ -56,6 +57,7 @@
   const char* name;
   Inherited inherited;
   Animatable animatable;
+  ImpactsChildDeclaredStyle impacts_child_declared_style;
   ImpactsBoxGeneration impacts_box_generation;
   ImpactsBoxSizes impacts_box_sizes;
   ImpactsBoxCrossReferences impacts_box_cross_references;
@@ -68,11 +70,14 @@
 
   std::vector<PropertyKey> lexicographical_longhand_keys;
   PropertyDefinition properties[kMaxEveryPropertyKey + 1];
-  AnimatablePropertyList animatable_properties;
+  PropertyKeyVector animatable_properties;
+  PropertyKeyVector inherited_animatable_properties;
 
   void SetPropertyDefinition(
       PropertyKey key, const char* name, Inherited inherited,
-      Animatable animatable, ImpactsBoxGeneration impacts_box_generation,
+      Animatable animatable,
+      ImpactsChildDeclaredStyle impacts_child_declared_style,
+      ImpactsBoxGeneration impacts_box_generation,
       ImpactsBoxSizes impacts_box_sizes,
       ImpactsBoxCrossReferences impacts_box_cross_references,
       const scoped_refptr<PropertyValue>& initial_value) {
@@ -82,6 +87,7 @@
     definition.name = name;
     definition.inherited = inherited;
     definition.animatable = animatable;
+    definition.impacts_child_declared_style = impacts_child_declared_style;
     definition.impacts_box_generation = impacts_box_generation;
     definition.impacts_box_sizes = impacts_box_sizes;
     definition.impacts_box_cross_references = impacts_box_cross_references;
@@ -151,61 +157,65 @@
 
 NonTrivialGlobalVariables::NonTrivialGlobalVariables() {
   // https://www.w3.org/TR/css3-animations/#animation-delay-property
-  SetPropertyDefinition(kAnimationDelayProperty, "animation-delay",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        CreateTimeListWithZeroSeconds());
+  SetPropertyDefinition(
+      kAnimationDelayProperty, "animation-delay", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, CreateTimeListWithZeroSeconds());
 
   // https://www.w3.org/TR/css3-animations/#animation-direction-property
   SetPropertyDefinition(
       kAnimationDirectionProperty, "animation-direction", kInheritedNo,
-      kAnimatableNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
-      kImpactsBoxCrossReferencesNo,
+      kAnimatableNo, kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+      kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
       CreateSinglePropertyListWithValue(KeywordValue::GetNormal()));
 
   // https://www.w3.org/TR/css3-animations/#animation-duration-property
   SetPropertyDefinition(kAnimationDurationProperty, "animation-duration",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         CreateTimeListWithZeroSeconds());
 
   // https://www.w3.org/TR/css3-animations/#animation-fill-mode-property
   SetPropertyDefinition(
       kAnimationFillModeProperty, "animation-fill-mode", kInheritedNo,
-      kAnimatableNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
-      kImpactsBoxCrossReferencesNo,
+      kAnimatableNo, kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+      kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
       CreateSinglePropertyListWithValue(KeywordValue::GetNone()));
 
   // https://www.w3.org/TR/css3-animations/#animation-iteration-count-property
   SetPropertyDefinition(
       kAnimationIterationCountProperty, "animation-iteration-count",
-      kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
-      kImpactsBoxCrossReferencesNo,
+      kInheritedNo, kAnimatableNo, kImpactsChildDeclaredStyleNo,
+      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
       CreateSinglePropertyListWithValue(new NumberValue(1.0f)));
 
   // https://www.w3.org/TR/css3-animations/#animation-name-property
   SetPropertyDefinition(
       kAnimationNameProperty, "animation-name", kInheritedNo, kAnimatableNo,
-      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo,
       CreateSinglePropertyListWithValue(KeywordValue::GetNone()));
 
   // https://www.w3.org/TR/css3-animations/#animation-timing-function-property
-  SetPropertyDefinition(kAnimationTimingFunctionProperty,
-                        "animation-timing-function", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        CreateTransitionTimingFunctionListWithEase());
+  SetPropertyDefinition(
+      kAnimationTimingFunctionProperty, "animation-timing-function",
+      kInheritedNo, kAnimatableNo, kImpactsChildDeclaredStyleNo,
+      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+      CreateTransitionTimingFunctionListWithEase());
 
   // https://www.w3.org/TR/css3-background/#the-background-color
   SetPropertyDefinition(kBackgroundColorProperty, "background-color",
-                        kInheritedNo, kAnimatableYes, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableYes,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         new RGBAColorValue(0x00000000));
 
   // https://www.w3.org/TR/css3-background/#background-image
   SetPropertyDefinition(
       kBackgroundImageProperty, "background-image", kInheritedNo, kAnimatableNo,
-      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo,
       CreateSinglePropertyListWithValue(KeywordValue::GetNone()));
 
   // https://www.w3.org/TR/css3-background/#the-background-position
@@ -219,7 +229,8 @@
   scoped_refptr<PropertyListValue> background_position_list(
       new PropertyListValue(background_position_builder.Pass()));
   SetPropertyDefinition(kBackgroundPositionProperty, "background-position",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         background_position_list);
 
@@ -234,10 +245,10 @@
   background_repeat_builder->push_back(KeywordValue::GetRepeat());
   scoped_refptr<PropertyListValue> background_repeat_list(
       new PropertyListValue(background_repeat_builder.Pass()));
-  SetPropertyDefinition(kBackgroundRepeatProperty, "background-repeat",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        background_repeat_list);
+  SetPropertyDefinition(
+      kBackgroundRepeatProperty, "background-repeat", kInheritedNo,
+      kAnimatableNo, kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+      kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, background_repeat_list);
 
   // The first value gives the width of the corresponding image, and the second
   // value gives its height. If only one value is given, the second is assumed
@@ -250,52 +261,59 @@
   background_size_builder->push_back(KeywordValue::GetAuto());
   scoped_refptr<PropertyListValue> background_size_list(
       new PropertyListValue(background_size_builder.Pass()));
-  SetPropertyDefinition(kBackgroundSizeProperty, "background-size",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        background_size_list);
+  SetPropertyDefinition(
+      kBackgroundSizeProperty, "background-size", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, background_size_list);
 
   // This sets the foreground color of the border specified by the border-style
   // property.
   //   https://www.w3.org/TR/css3-background/#border-color
-  SetPropertyDefinition(kBorderTopColorProperty, "border-top-color",
-                        kInheritedNo, kAnimatableYes, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetCurrentColor());
+  SetPropertyDefinition(
+      kBorderTopColorProperty, "border-top-color", kInheritedNo, kAnimatableYes,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, KeywordValue::GetCurrentColor());
 
   SetPropertyDefinition(kBorderRightColorProperty, "border-right-color",
-                        kInheritedNo, kAnimatableYes, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableYes,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetCurrentColor());
 
   SetPropertyDefinition(kBorderBottomColorProperty, "border-bottom-color",
-                        kInheritedNo, kAnimatableYes, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableYes,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetCurrentColor());
 
   SetPropertyDefinition(kBorderLeftColorProperty, "border-left-color",
-                        kInheritedNo, kAnimatableYes, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableYes,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetCurrentColor());
 
   //   https://www.w3.org/TR/css3-background/#border-style
   SetPropertyDefinition(kBorderTopStyleProperty, "border-top-style",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNone());
 
   SetPropertyDefinition(kBorderRightStyleProperty, "border-right-style",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNone());
 
   SetPropertyDefinition(kBorderBottomStyleProperty, "border-bottom-style",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNone());
 
   SetPropertyDefinition(kBorderLeftStyleProperty, "border-left-style",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNone());
 
@@ -305,259 +323,290 @@
   // 'medium' font size is 17 px or less.
   //   https://www.w3.org/TR/css3-background/#border-width
   SetPropertyDefinition(kBorderTopWidthProperty, "border-top-width",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         new LengthValue(3, kPixelsUnit));
 
   SetPropertyDefinition(kBorderRightWidthProperty, "border-right-width",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         new LengthValue(3, kPixelsUnit));
 
   SetPropertyDefinition(kBorderBottomWidthProperty, "border-bottom-width",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         new LengthValue(3, kPixelsUnit));
 
   SetPropertyDefinition(kBorderLeftWidthProperty, "border-left-width",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                         new LengthValue(3, kPixelsUnit));
 
   // Cobalt only support a single length value that applies to all borders.
   //   https://www.w3.org/TR/css3-background/#the-border-radius
-  SetPropertyDefinition(kBorderRadiusProperty, "border-radius", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        new LengthValue(0, kPixelsUnit));
+  SetPropertyDefinition(
+      kBorderRadiusProperty, "border-radius", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS2/visuren.html#propdef-bottom
   SetPropertyDefinition(kBottomProperty, "bottom", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
-                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        KeywordValue::GetAuto());
 
   // https://www.w3.org/TR/css3-background/#the-box-shadow
   SetPropertyDefinition(kBoxShadowProperty, "box-shadow", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetNone());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());
 
   // Opaque black in Chromium and Cobalt.
   //   https://www.w3.org/TR/css3-color/#foreground
   SetPropertyDefinition(kColorProperty, "color", kInheritedYes, kAnimatableYes,
-                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
-                        kImpactsBoxCrossReferencesNo,
+                        kImpactsChildDeclaredStyleYes, kImpactsBoxGenerationYes,
+                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         new RGBAColorValue(0x000000ff));
 
   // https://www.w3.org/TR/CSS21/generate.html#content
   SetPropertyDefinition(kContentProperty, "content", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNormal());
 
   // https://www.w3.org/TR/CSS21/visuren.html#display-prop
   SetPropertyDefinition(kDisplayProperty, "display", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetInline());
 
   // Varies by platform in Chromium, Roboto in Cobalt.
   //   https://www.w3.org/TR/css3-fonts/#font-family-prop
   SetPropertyDefinition(
       kFontFamilyProperty, "font-family", kInheritedYes, kAnimatableNo,
-      kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
-      kImpactsBoxCrossReferencesNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationYes,
+      kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
       CreateSinglePropertyListWithValue(new StringValue("Roboto")));
 
   // "medium" translates to 16px in Chromium.
   // Cobalt does not support keyword sizes, so we simply hardcode 16px.
   //   https://www.w3.org/TR/css3-fonts/#font-size-prop
   SetPropertyDefinition(kFontSizeProperty, "font-size", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleYes,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(16, kPixelsUnit));
 
   // https://www.w3.org/TR/css3-fonts/#font-style-prop
   SetPropertyDefinition(kFontStyleProperty, "font-style", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         FontStyleValue::GetNormal());
 
   // https://www.w3.org/TR/css3-fonts/#font-weight-prop
   SetPropertyDefinition(kFontWeightProperty, "font-weight", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         FontWeightValue::GetNormalAka400());
 
   // https://www.w3.org/TR/CSS21/visudet.html#the-height-property
   SetPropertyDefinition(kHeightProperty, "height", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
-                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleYes, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        KeywordValue::GetAuto());
 
   // https://www.w3.org/TR/CSS2/visuren.html#propdef-left
   SetPropertyDefinition(kLeftProperty, "left", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
-                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        KeywordValue::GetAuto());
 
   // https://www.w3.org/TR/CSS21/visudet.html#line-height
   SetPropertyDefinition(kLineHeightProperty, "line-height", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNormal());
 
   // https://www.w3.org/TR/CSS21/box.html#margin-properties
   SetPropertyDefinition(kMarginBottomProperty, "margin-bottom", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS21/box.html#margin-properties
   SetPropertyDefinition(kMarginLeftProperty, "margin-left", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS21/box.html#margin-properties
   SetPropertyDefinition(kMarginRightProperty, "margin-right", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS21/box.html#margin-properties
   SetPropertyDefinition(kMarginTopProperty, "margin-top", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS2/visudet.html#propdef-max-height
   SetPropertyDefinition(kMaxHeightProperty, "max-height", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetNone());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());
 
   // https://www.w3.org/TR/CSS2/visudet.html#propdef-max-width
   SetPropertyDefinition(kMaxWidthProperty, "max-width", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetNone());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());
 
   // https://www.w3.org/TR/CSS2/visudet.html#propdef-min-height
   SetPropertyDefinition(kMinHeightProperty, "min-height", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS2/visudet.html#propdef-min-width
   SetPropertyDefinition(kMinWidthProperty, "min-width", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/css3-color/#opacity
   SetPropertyDefinition(kOpacityProperty, "opacity", kInheritedNo,
-                        kAnimatableYes, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesYes,
-                        new NumberValue(1.0f));
+                        kAnimatableYes, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+                        kImpactsBoxCrossReferencesYes, new NumberValue(1.0f));
 
   // https://www.w3.org/TR/css-overflow-3/#overflow-properties
   SetPropertyDefinition(kOverflowProperty, "overflow", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetVisible());
 
   // https://www.w3.org/TR/css-text-3/#overflow-wrap
   SetPropertyDefinition(kOverflowWrapProperty, "overflow-wrap", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNormal());
 
   // https://www.w3.org/TR/CSS21/box.html#padding-properties
   SetPropertyDefinition(kPaddingBottomProperty, "padding-bottom", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS21/box.html#padding-properties
   SetPropertyDefinition(kPaddingLeftProperty, "padding-left", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS21/box.html#padding-properties
   SetPropertyDefinition(kPaddingRightProperty, "padding-right", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/CSS21/box.html#padding-properties
   SetPropertyDefinition(kPaddingTopProperty, "padding-top", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/css3-positioning/#position-property
   SetPropertyDefinition(kPositionProperty, "position", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesYes,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesYes,
                         KeywordValue::GetStatic());
 
   // https://www.w3.org/TR/CSS2/visuren.html#propdef-right
   SetPropertyDefinition(kRightProperty, "right", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
-                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        KeywordValue::GetAuto());
 
   //   https://www.w3.org/TR/css-text-3/#text-align
   SetPropertyDefinition(kTextAlignProperty, "text-align", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetStart());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetStart());
 
   //   https://www.w3.org/TR/css-text-decor-3/#text-decoration-color
   SetPropertyDefinition(kTextDecorationColorProperty, "text-decoration-color",
-                        kInheritedNo, kAnimatableYes, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableYes,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetCurrentColor());
 
   //   https://www.w3.org/TR/css-text-decor-3/#text-decoration-line
   SetPropertyDefinition(kTextDecorationLineProperty, "text-decoration-line",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNone());
 
   // https://www.w3.org/TR/CSS21/text.html#propdef-text-indent
   SetPropertyDefinition(kTextIndentProperty, "text-indent", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         new LengthValue(0, kPixelsUnit));
 
   // https://www.w3.org/TR/css3-ui/#propdef-text-overflow
   SetPropertyDefinition(kTextOverflowProperty, "text-overflow", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetClip());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetClip());
 
   // https://www.w3.org/TR/css-text-decor-3/#text-shadow-property
   SetPropertyDefinition(kTextShadowProperty, "text-shadow", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetNone());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());
 
   // https://www.w3.org/TR/css3-text/#text-transform-property
   SetPropertyDefinition(kTextTransformProperty, "text-transform", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetNone());
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
+                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());
 
   // https://www.w3.org/TR/CSS2/visuren.html#propdef-top
   SetPropertyDefinition(kTopProperty, "top", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
-                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        KeywordValue::GetAuto());
 
   // https://www.w3.org/TR/css3-transforms/#transform-property
   SetPropertyDefinition(kTransformProperty, "transform", kInheritedNo,
-                        kAnimatableYes, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesYes,
-                        KeywordValue::GetNone());
+                        kAnimatableYes, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesYes, KeywordValue::GetNone());
 
   // https://www.w3.org/TR/css3-transforms/#propdef-transform-origin
   scoped_ptr<PropertyListValue::Builder> transform_origin_builder(
@@ -568,88 +617,94 @@
   transform_origin_builder->push_back(new LengthValue(0.0f, kPixelsUnit));
   scoped_refptr<PropertyListValue> transform_origin_list(
       new PropertyListValue(transform_origin_builder.Pass()));
-  SetPropertyDefinition(kTransformOriginProperty, "transform-origin",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        transform_origin_list);
+  SetPropertyDefinition(
+      kTransformOriginProperty, "transform-origin", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, transform_origin_list);
 
   // https://www.w3.org/TR/css3-transitions/#transition-delay-property
-  SetPropertyDefinition(kTransitionDelayProperty, "transition-delay",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        CreateTimeListWithZeroSeconds());
+  SetPropertyDefinition(
+      kTransitionDelayProperty, "transition-delay", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, CreateTimeListWithZeroSeconds());
 
   // https://www.w3.org/TR/css3-transitions/#transition-duration-property
   SetPropertyDefinition(kTransitionDurationProperty, "transition-duration",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         CreateTimeListWithZeroSeconds());
 
   // https://www.w3.org/TR/css3-transitions/#transition-property-property
   SetPropertyDefinition(kTransitionPropertyProperty, "transition-property",
-                        kInheritedNo, kAnimatableNo, kImpactsBoxGenerationNo,
+                        kInheritedNo, kAnimatableNo,
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                         kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                         CreatePropertyKeyListWithAll());
 
   // https://www.w3.org/TR/css3-transitions/#transition-timing-function-property
-  SetPropertyDefinition(kTransitionTimingFunctionProperty,
-                        "transition-timing-function", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        CreateTransitionTimingFunctionListWithEase());
+  SetPropertyDefinition(
+      kTransitionTimingFunctionProperty, "transition-timing-function",
+      kInheritedNo, kAnimatableNo, kImpactsChildDeclaredStyleNo,
+      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
+      CreateTransitionTimingFunctionListWithEase());
 
   // https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
-  SetPropertyDefinition(kVerticalAlignProperty, "vertical-align", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetBaseline());
+  SetPropertyDefinition(
+      kVerticalAlignProperty, "vertical-align", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, KeywordValue::GetBaseline());
 
   // https://www.w3.org/TR/CSS21/visufx.html#propdef-visibility
-  SetPropertyDefinition(kVisibilityProperty, "visibility", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        KeywordValue::GetVisible());
+  SetPropertyDefinition(
+      kVisibilityProperty, "visibility", kInheritedYes, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, KeywordValue::GetVisible());
 
   // https://www.w3.org/TR/css3-text/#white-space-property
   SetPropertyDefinition(kWhiteSpaceProperty, "white-space", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationYes,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNormal());
 
   // https://www.w3.org/TR/CSS21/visudet.html#the-width-property
   SetPropertyDefinition(kWidthProperty, "width", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
-                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleYes, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        KeywordValue::GetAuto());
 
   // https://www.w3.org/TR/CSS21/visuren.html#z-index
   SetPropertyDefinition(kZIndexProperty, "z-index", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
-                        kImpactsBoxCrossReferencesYes, KeywordValue::GetAuto());
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesYes,
+                        KeywordValue::GetAuto());
 
   // This property name can appear as a keyword for the transition-property
   // property.
   //   https://www.w3.org/TR/2013/WD-css3-transitions-20131119/#transition-property-property
   SetPropertyDefinition(kAllProperty, "all", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
-                        kImpactsBoxCrossReferencesNo, NULL);
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, NULL);
 
   // This is a descriptor for @font-face at-rules.
   //   https://www.w3.org/TR/css3-fonts/#descdef-src
   SetPropertyDefinition(kSrcProperty, "src", kInheritedNo, kAnimatableNo,
-                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
-                        kImpactsBoxCrossReferencesNo, NULL);
+                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
+                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, NULL);
 
   //   https://www.w3.org/TR/css3-fonts/#unicode-range-desc
-  SetPropertyDefinition(kUnicodeRangeProperty, "unicode-range", kInheritedNo,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
-                        new UnicodeRangeValue(0, 0x10FFFF));
+  SetPropertyDefinition(
+      kUnicodeRangeProperty, "unicode-range", kInheritedNo, kAnimatableNo,
+      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
+      kImpactsBoxCrossReferencesNo, new UnicodeRangeValue(0, 0x10FFFF));
 
   // This is an alias for kOverflowWrap
   //   https://www.w3.org/TR/css-text-3/#overflow-wrap
   SetPropertyDefinition(kWordWrapProperty, "word-wrap", kInheritedYes,
-                        kAnimatableNo, kImpactsBoxGenerationNo,
-                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
+                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
+                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
+                        kImpactsBoxCrossReferencesNo,
                         KeywordValue::GetNormal());
 
   // Shorthand properties.
@@ -790,6 +845,9 @@
   for (int i = 0; i < kMaxEveryPropertyKey + 1; ++i) {
     if (properties[i].animatable == kAnimatableYes) {
       animatable_properties.push_back(static_cast<PropertyKey>(i));
+      if (properties[i].inherited == kInheritedYes) {
+        inherited_animatable_properties.push_back(static_cast<PropertyKey>(i));
+      }
     }
   }
 }
@@ -842,6 +900,16 @@
   return non_trivial_global_variables.Get().properties[key].animatable;
 }
 
+ImpactsChildDeclaredStyle GetPropertyImpactsChildDeclaredStyle(
+    PropertyKey key) {
+  DCHECK(!IsShorthandProperty(key));
+  DCHECK_GT(key, kNoneProperty);
+  DCHECK_LE(key, kMaxEveryPropertyKey);
+  return non_trivial_global_variables.Get()
+      .properties[key]
+      .impacts_child_declared_style;
+}
+
 ImpactsBoxGeneration GetPropertyImpactsBoxGeneration(PropertyKey key) {
   DCHECK(!IsShorthandProperty(key));
   DCHECK_GT(key, kNoneProperty);
@@ -877,10 +945,14 @@
   return non_trivial_global_variables.Get().properties[key].longhand_properties;
 }
 
-const AnimatablePropertyList& GetAnimatableProperties() {
+const PropertyKeyVector& GetAnimatableProperties() {
   return non_trivial_global_variables.Get().animatable_properties;
 }
 
+const PropertyKeyVector& GetInheritedAnimatableProperties() {
+  return non_trivial_global_variables.Get().inherited_animatable_properties;
+}
+
 PropertyKey GetLexicographicalLonghandPropertyKey(const size_t index) {
   DCHECK_LE(
       index,
diff --git a/src/cobalt/cssom/property_definitions.h b/src/cobalt/cssom/property_definitions.h
index bbaf9a3..14a1c39 100644
--- a/src/cobalt/cssom/property_definitions.h
+++ b/src/cobalt/cssom/property_definitions.h
@@ -157,16 +157,33 @@
   kAnimatableYes,
 };
 
+// Any property that is referenced when calculating the declared property values
+// of children should have this set to true.
+// NOTE: This currently occurs within CalculateComputedStyleContext.
+enum ImpactsChildDeclaredStyle {
+  kImpactsChildDeclaredStyleNo,
+  kImpactsChildDeclaredStyleYes,
+};
+
+// Any property that is referenced during box generation should have this set to
+// true.
+// NOTE: This currently occurs within BoxGenerator.
 enum ImpactsBoxGeneration {
   kImpactsBoxGenerationNo,
   kImpactsBoxGenerationYes,
 };
 
+// Any property that is referenced when updating the size of boxes should have
+// this set to true.
+// NOTE: This currently occurs within Box::UpdateSize().
 enum ImpactsBoxSizes {
   kImpactsBoxSizesNo,
   kImpactsBoxSizesYes,
 };
 
+// Any property that is referenced when generating cross references should have
+// this set to true.
+// NOTE: This currently occurs within ContainerBox::UpdateCrossReferences().
 enum ImpactsBoxCrossReferences {
   kImpactsBoxCrossReferencesNo,
   kImpactsBoxCrossReferencesYes,
@@ -183,12 +200,14 @@
 
 Inherited GetPropertyInheritance(PropertyKey key);
 Animatable GetPropertyAnimatable(PropertyKey key);
+ImpactsChildDeclaredStyle GetPropertyImpactsChildDeclaredStyle(PropertyKey key);
 ImpactsBoxGeneration GetPropertyImpactsBoxGeneration(PropertyKey key);
 ImpactsBoxSizes GetPropertyImpactsBoxSizes(PropertyKey key);
 ImpactsBoxCrossReferences GetPropertyImpactsBoxCrossReferences(PropertyKey key);
 
-typedef std::vector<PropertyKey> AnimatablePropertyList;
-const AnimatablePropertyList& GetAnimatableProperties();
+typedef std::vector<PropertyKey> PropertyKeyVector;
+const PropertyKeyVector& GetAnimatableProperties();
+const PropertyKeyVector& GetInheritedAnimatableProperties();
 
 PropertyKey GetLexicographicalLonghandPropertyKey(const size_t index);
 
@@ -203,7 +222,6 @@
 const LonghandPropertySet& ExpandShorthandProperty(PropertyKey key);
 
 typedef std::bitset<kNumLonghandProperties> LonghandPropertiesBitset;
-typedef std::vector<PropertyKey> PropertyKeyVector;
 
 }  // namespace cssom
 }  // namespace cobalt
diff --git a/src/cobalt/debug/render_overlay.cc b/src/cobalt/debug/render_overlay.cc
index 85d03b0..5a60043 100644
--- a/src/cobalt/debug/render_overlay.cc
+++ b/src/cobalt/debug/render_overlay.cc
@@ -25,7 +25,7 @@
 RenderOverlay::RenderOverlay(
     const OnRenderTreeProducedCallback& render_tree_produced_callback)
     : render_tree_produced_callback_(render_tree_produced_callback),
-      input_layout_(NULL, NULL, base::TimeDelta()) {}
+      input_layout_(NULL, base::TimeDelta()) {}
 
 void RenderOverlay::OnRenderTreeProduced(const LayoutResults& layout_results) {
   input_layout_ = layout_results;
@@ -56,10 +56,10 @@
           new render_tree::CompositionNode(builder);
 
       render_tree_produced_callback_.Run(
-          LayoutResults(combined_tree, input_layout_.animations, layout_time));
+          LayoutResults(combined_tree, layout_time));
     } else {
-      render_tree_produced_callback_.Run(LayoutResults(
-          input_layout_.render_tree, input_layout_.animations, layout_time));
+      render_tree_produced_callback_.Run(
+          LayoutResults(input_layout_.render_tree, layout_time));
     }
   }
 }
diff --git a/src/cobalt/dom/Document.idl b/src/cobalt/dom/Document.idl
index 73fa7e6..d33334d 100644
--- a/src/cobalt/dom/Document.idl
+++ b/src/cobalt/dom/Document.idl
@@ -22,6 +22,10 @@
   readonly attribute DOMString documentURI;
   readonly attribute Element? documentElement;
 
+  // Non-standard return type, should be WindowProxy.
+  // https://www.w3.org/TR/html5/single-page.html#dom-document-defaultview
+  readonly attribute Window? defaultView;
+
   HTMLCollection getElementsByTagName(DOMString localName);
   HTMLCollection getElementsByClassName(DOMString classNames);
   [NewObject] Element createElement(DOMString localName);
diff --git a/src/cobalt/dom/HTMLVideoElement.idl b/src/cobalt/dom/HTMLVideoElement.idl
index 3793eab..7f44060 100644
--- a/src/cobalt/dom/HTMLVideoElement.idl
+++ b/src/cobalt/dom/HTMLVideoElement.idl
@@ -21,4 +21,7 @@
   attribute unsigned long height;
   readonly attribute unsigned long videoWidth;
   readonly attribute unsigned long videoHeight;
+
+  // https://www.w3.org/TR/media-source/#widl-HTMLVideoElement-getVideoPlaybackQuality-VideoPlaybackQuality
+  VideoPlaybackQuality getVideoPlaybackQuality();
 };
diff --git a/src/cobalt/dom/VideoPlaybackQuality.idl b/src/cobalt/dom/VideoPlaybackQuality.idl
new file mode 100644
index 0000000..8263a07
--- /dev/null
+++ b/src/cobalt/dom/VideoPlaybackQuality.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2016 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.
+ */
+
+// https://www.w3.org/TR/media-source/#idl-def-VideoPlaybackQuality
+
+interface VideoPlaybackQuality {
+  readonly attribute DOMHighResTimeStamp creationTime;
+  readonly attribute unsigned long totalVideoFrames;
+  readonly attribute unsigned long droppedVideoFrames;
+  readonly attribute unsigned long corruptedVideoFrames;
+  readonly attribute double totalFrameDelay;
+};
+
+typedef double DOMHighResTimeStamp;
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc
index cc586b7..0d2b543 100644
--- a/src/cobalt/dom/document.cc
+++ b/src/cobalt/dom/document.cc
@@ -53,6 +53,7 @@
 #include "cobalt/dom/node_descendants_iterator.h"
 #include "cobalt/dom/text.h"
 #include "cobalt/dom/ui_event.h"
+#include "cobalt/dom/window.h"
 
 namespace cobalt {
 namespace dom {
@@ -61,6 +62,7 @@
                    const Options& options)
     : ALLOW_THIS_IN_INITIALIZER_LIST(Node(this)),
       html_element_context_(html_element_context),
+      window_(options.window),
       implementation_(new DOMImplementation()),
       ALLOW_THIS_IN_INITIALIZER_LIST(
           style_sheets_(new cssom::StyleSheetList(this))),
@@ -81,7 +83,9 @@
       navigation_start_clock_(options.navigation_start_clock),
       ALLOW_THIS_IN_INITIALIZER_LIST(
           default_timeline_(new DocumentTimeline(this, 0))),
-      user_agent_style_sheet_(options.user_agent_style_sheet) {
+      user_agent_style_sheet_(options.user_agent_style_sheet),
+      initial_computed_style_declaration_(
+          new cssom::CSSComputedStyleDeclaration()) {
   DCHECK(options.url.is_empty() || options.url.is_valid());
 
   if (options.viewport_size) {
@@ -141,6 +145,8 @@
   return first_element_child();
 }
 
+scoped_refptr<Window> Document::default_view() const { return window_; }
+
 std::string Document::title() const {
   const char kTitleTag[] = "title";
   if (head()) {
@@ -543,14 +549,14 @@
     scoped_refptr<HTMLElement> root = html();
     if (root) {
       // First update the computed style for root element.
-      root->UpdateComputedStyle(initial_computed_style_,
-                                initial_computed_style_,
+      root->UpdateComputedStyle(initial_computed_style_declaration_,
+                                initial_computed_style_data_,
                                 style_change_event_time);
 
       // Then update the computed styles for the other elements.
-      root->UpdateComputedStyleRecursively(root->computed_style(),
-                                           root->computed_style(),
-                                           style_change_event_time, true);
+      root->UpdateComputedStyleRecursively(
+          root->css_computed_style_declaration(), root->computed_style(),
+          style_change_event_time, true);
     }
 
     is_computed_style_dirty_ = false;
@@ -589,9 +595,16 @@
 
 void Document::SetViewport(const math::Size& viewport_size) {
   viewport_size_ = viewport_size;
-  initial_computed_style_ = CreateInitialComputedStyle(*viewport_size_);
+  initial_computed_style_data_ = CreateInitialComputedStyle(*viewport_size_);
+  initial_computed_style_declaration_->SetData(initial_computed_style_data_);
+
   is_computed_style_dirty_ = true;
   is_selector_tree_dirty_ = true;
+
+  scoped_refptr<HTMLHtmlElement> current_html = html();
+  if (current_html) {
+    current_html->InvalidateComputedStylesRecursively();
+  }
 }
 
 Document::~Document() {
@@ -682,6 +695,13 @@
     keyframes_map_updater.ProcessCSSStyleSheet(user_agent_style_sheet_);
     keyframes_map_updater.ProcessStyleSheetList(style_sheets());
     are_keyframes_dirty_ = false;
+
+    // This should eventually be altered to only invalidate the tree when the
+    // the keyframes map changed.
+    scoped_refptr<HTMLHtmlElement> current_html = html();
+    if (current_html) {
+      current_html->InvalidateComputedStylesRecursively();
+    }
   }
 }
 
diff --git a/src/cobalt/dom/document.h b/src/cobalt/dom/document.h
index a312b1a..4d45315 100644
--- a/src/cobalt/dom/document.h
+++ b/src/cobalt/dom/document.h
@@ -27,7 +27,7 @@
 #include "base/optional.h"
 #include "base/string_piece.h"
 #include "cobalt/base/clock.h"
-#include "cobalt/cssom/css_computed_style_data.h"
+#include "cobalt/cssom/css_computed_style_declaration.h"
 #include "cobalt/cssom/css_keyframes_rule.h"
 #include "cobalt/cssom/css_style_sheet.h"
 #include "cobalt/cssom/mutation_observer.h"
@@ -61,6 +61,7 @@
 class HTMLScriptElement;
 class Location;
 class Text;
+class Window;
 
 class DocumentObserver {
  public:
@@ -88,9 +89,11 @@
     Options() : cookie_jar(NULL), csp_enforcement_mode(kCspEnforcementEnable) {}
     explicit Options(const GURL& url_value)
         : url(url_value),
+          window(NULL),
           cookie_jar(NULL),
           csp_enforcement_mode(kCspEnforcementEnable) {}
-    Options(const GURL& url_value, const base::Closure& hashchange_callback,
+    Options(const GURL& url_value, Window* window,
+            const base::Closure& hashchange_callback,
             const scoped_refptr<base::Clock>& navigation_start_clock_value,
             const base::Callback<void(const GURL&)>& navigation_callback,
             const scoped_refptr<cssom::CSSStyleSheet> user_agent_style_sheet,
@@ -102,6 +105,7 @@
             const base::Closure& csp_policy_changed_callback,
             int csp_insecure_allowed_token = 0)
         : url(url_value),
+          window(window),
           hashchange_callback(hashchange_callback),
           navigation_start_clock(navigation_start_clock_value),
           navigation_callback(navigation_callback),
@@ -115,6 +119,7 @@
           csp_insecure_allowed_token(csp_insecure_allowed_token) {}
 
     GURL url;
+    Window* window;
     base::Closure hashchange_callback;
     scoped_refptr<base::Clock> navigation_start_clock;
     base::Callback<void(const GURL&)> navigation_callback;
@@ -145,6 +150,8 @@
   scoped_refptr<Element> document_element() const;
   std::string title() const;
 
+  scoped_refptr<Window> default_view() const;
+
   scoped_refptr<HTMLCollection> GetElementsByTagName(
       const std::string& local_name) const;
   scoped_refptr<HTMLCollection> GetElementsByClassName(
@@ -298,9 +305,13 @@
   math::Size viewport_size() { return viewport_size_.value_or(math::Size()); }
   void SetViewport(const math::Size& viewport_size);
 
-  const scoped_refptr<cssom::CSSComputedStyleData>& initial_computed_style()
-      const {
-    return initial_computed_style_;
+  const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
+  initial_computed_style_declaration() const {
+    return initial_computed_style_declaration_;
+  }
+  const scoped_refptr<cssom::CSSComputedStyleData>&
+  initial_computed_style_data() const {
+    return initial_computed_style_data_;
   }
 
   void NotifyUrlChanged(const GURL& url);
@@ -334,6 +345,9 @@
 
   // Reference to HTML element context.
   HTMLElementContext* const html_element_context_;
+  // Reference to the Window object. We cannot hold a strong reference,
+  // otherwise we create a reference loop.
+  Window* window_;
   // Associated DOM implementation object.
   scoped_refptr<DOMImplementation> implementation_;
   // Associated location object.
@@ -387,7 +401,9 @@
 
   // Computed style of the initial containing block, width and height come from
   // the viewport size.
-  scoped_refptr<cssom::CSSComputedStyleData> initial_computed_style_;
+  scoped_refptr<cssom::CSSComputedStyleDeclaration>
+      initial_computed_style_declaration_;
+  scoped_refptr<cssom::CSSComputedStyleData> initial_computed_style_data_;
 };
 
 }  // namespace dom
diff --git a/src/cobalt/dom/dom.gyp b/src/cobalt/dom/dom.gyp
index d171fd3..5438684 100644
--- a/src/cobalt/dom/dom.gyp
+++ b/src/cobalt/dom/dom.gyp
@@ -64,8 +64,6 @@
         'document_type.h',
         'dom_animatable.cc',
         'dom_animatable.h',
-        'dom_exception.cc',
-        'dom_exception.h',
         'dom_implementation.cc',
         'dom_implementation.h',
         'dom_parser.cc',
@@ -248,6 +246,7 @@
         '<(DEPTH)/cobalt/base/base.gyp:base',
         '<(DEPTH)/cobalt/csp/csp.gyp:csp',
         '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
+        '<(DEPTH)/cobalt/dom/dom_exception.gyp:dom_exception',
         '<(DEPTH)/cobalt/loader/loader.gyp:loader',
         '<(DEPTH)/cobalt/media/media.gyp:media',
         # Interface layer to avoid directly depending on network.
diff --git a/src/cobalt/dom/dom_exception.gyp b/src/cobalt/dom/dom_exception.gyp
new file mode 100644
index 0000000..ba6dcf6
--- /dev/null
+++ b/src/cobalt/dom/dom_exception.gyp
@@ -0,0 +1,32 @@
+# Copyright 2016 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': {
+    'cobalt_code': 1,
+  },
+  'targets': [
+    {
+      'target_name': 'dom_exception',
+      'type': 'static_library',
+      'sources': [
+        'dom_exception.cc',
+        'dom_exception.h',
+      ],
+      'dependencies': [
+        '<(DEPTH)/cobalt/script/script.gyp:script',
+      ],
+    },
+  ],
+}
diff --git a/src/cobalt/dom/html_element.cc b/src/cobalt/dom/html_element.cc
index 29cbf3e..f63dbbf 100644
--- a/src/cobalt/dom/html_element.cc
+++ b/src/cobalt/dom/html_element.cc
@@ -77,18 +77,22 @@
 
 struct NonTrivialStaticFields {
   NonTrivialStaticFields() {
+    cssom::PropertyKeyVector computed_style_invalidation_properties;
     cssom::PropertyKeyVector layout_box_invalidation_properties;
     cssom::PropertyKeyVector size_invalidation_properties;
     cssom::PropertyKeyVector cross_references_invalidation_properties;
 
     for (int i = 0; i <= cssom::kMaxLonghandPropertyKey; ++i) {
       cssom::PropertyKey property_key = static_cast<cssom::PropertyKey>(i);
-      // TODO: Only invalidate layout boxes when a property that is used
-      // for box generation is modified. We currently have to also invalidate
-      // when any inheritable property is modified, because AnonymousBlockBox
-      // and TextBox use GetComputedStyleOfAnonymousBox() to store a copy of
-      // them that won't automatically get updated when the style() in a
-      // CSSComputedStyleDeclaration gets updated.
+
+      if (cssom::GetPropertyImpactsChildDeclaredStyle(property_key) ==
+          cssom::kImpactsChildDeclaredStyleYes) {
+        computed_style_invalidation_properties.push_back(property_key);
+      }
+
+      // TODO: Revisit inherited property handling. Currently, all boxes are
+      // invalidated if an inherited property changes, but now that inherited
+      // properties dynamically update, this is likely no longer necessary.
       if (cssom::GetPropertyInheritance(property_key) == cssom::kInheritedYes ||
           cssom::GetPropertyImpactsBoxGeneration(property_key) ==
               cssom::kImpactsBoxGenerationYes) {
@@ -105,6 +109,9 @@
       }
     }
 
+    computed_style_invalidation_property_checker =
+        cssom::CSSComputedStyleData::PropertySetMatcher(
+            computed_style_invalidation_properties);
     layout_box_invalidation_property_checker =
         cssom::CSSComputedStyleData::PropertySetMatcher(
             layout_box_invalidation_properties);
@@ -117,6 +124,8 @@
   }
 
   cssom::CSSComputedStyleData::PropertySetMatcher
+      computed_style_invalidation_property_checker;
+  cssom::CSSComputedStyleData::PropertySetMatcher
       layout_box_invalidation_property_checker;
   cssom::CSSComputedStyleData::PropertySetMatcher
       size_invalidation_property_checker;
@@ -570,9 +579,13 @@
   }
 
   matching_rules_valid_ = false;
-  computed_style_valid_ = false;
 
-  matching_rules_.clear();
+  // Move |matching_rules_| into |old_matching_rules_|. This is used for
+  // determining whether or not the matching rules actually changed when they
+  // are updated.
+  old_matching_rules_.swap(matching_rules_);
+
+  matching_rules_->clear();
   rule_matching_state_.matching_nodes.clear();
   rule_matching_state_.descendant_potential_nodes.clear();
   rule_matching_state_.following_sibling_potential_nodes.clear();
@@ -603,17 +616,28 @@
   }
 }
 
+void HTMLElement::InvalidateComputedStylesRecursively() {
+  computed_style_valid_ = false;
+
+  for (Element* element = first_element_child(); element;
+       element = element->next_element_sibling()) {
+    HTMLElement* html_element = element->AsHTMLElement();
+    DCHECK(html_element);
+    html_element->InvalidateComputedStylesRecursively();
+  }
+}
+
 void HTMLElement::UpdateComputedStyleRecursively(
-    const scoped_refptr<const cssom::CSSComputedStyleData>&
-        parent_computed_style,
+    const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration,
     const scoped_refptr<const cssom::CSSComputedStyleData>& root_computed_style,
     const base::TimeDelta& style_change_event_time, bool ancestors_were_valid) {
   // Update computed style for this element.
-  bool is_valid = ancestors_were_valid && computed_style_valid_;
+  bool is_valid =
+      ancestors_were_valid && matching_rules_valid_ && computed_style_valid_;
   if (!is_valid) {
-    UpdateComputedStyle(parent_computed_style, root_computed_style,
+    UpdateComputedStyle(parent_computed_style_declaration, root_computed_style,
                         style_change_event_time);
-    computed_style_valid_ = true;
   }
 
   // Do not update computed style for descendants of "display: none" elements,
@@ -630,8 +654,8 @@
     HTMLElement* html_element = element->AsHTMLElement();
     DCHECK(html_element);
     html_element->UpdateComputedStyleRecursively(
-        computed_style(), root_computed_style, style_change_event_time,
-        is_valid);
+        css_computed_style_declaration(), root_computed_style,
+        style_change_event_time, is_valid);
   }
 }
 
@@ -657,6 +681,12 @@
   }
 }
 
+void HTMLElement::InvalidateRenderTreeNodesFromNode() {
+  if (layout_boxes_) {
+    layout_boxes_->InvalidateRenderTreeNodes();
+  }
+}
+
 HTMLElement::HTMLElement(Document* document, base::Token tag_name)
     : Element(document, tag_name),
       directionality_(kNoExplicitDirectionality),
@@ -670,6 +700,8 @@
       ALLOW_THIS_IN_INITIALIZER_LIST(
           animations_adapter_(new DOMAnimatable(this))),
       css_animations_(&animations_adapter_),
+      old_matching_rules_(new cssom::RulesWithCascadePrecedence()),
+      matching_rules_(new cssom::RulesWithCascadePrecedence()),
       matching_rules_valid_(false),
       dom_stat_tracker_(document->html_element_context()->dom_stat_tracker()) {
   css_computed_style_declaration_->set_animations(animations());
@@ -729,16 +761,16 @@
     cssom::RulesWithCascadePrecedence* matching_rules,
     cssom::GURLMap* property_key_to_base_url_map,
     const scoped_refptr<const cssom::CSSDeclaredStyleData>& inline_style,
-    const scoped_refptr<const cssom::CSSComputedStyleData>&
-        parent_computed_style,
+    const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration,
     const scoped_refptr<const cssom::CSSComputedStyleData>& root_computed_style,
     const math::Size& viewport_size,
     const base::TimeDelta& style_change_event_time,
-    cssom::TransitionSet* css_transitions,
     const scoped_refptr<const cssom::CSSComputedStyleData>&
         previous_computed_style,
-    cssom::AnimationSet* css_animations,
-    const cssom::CSSKeyframesRule::NameMap& keyframes_map) {
+    cssom::TransitionSet* css_transitions, cssom::AnimationSet* css_animations,
+    const cssom::CSSKeyframesRule::NameMap& keyframes_map,
+    bool* animations_modified) {
   // Select the winning value for each property by performing the cascade,
   // that is, apply values from matching rules on top of inline style, taking
   // into account rule specificity and location in the source file, as well as
@@ -754,9 +786,9 @@
   // properties, like "font-family", computed value is the same as specified
   // value. Declarations that cannot be absolutized easily, like "width: auto;",
   // will be resolved during layout.
-  cssom::PromoteToComputedStyle(computed_style, parent_computed_style,
-                                root_computed_style, viewport_size,
-                                property_key_to_base_url_map);
+  cssom::PromoteToComputedStyle(
+      computed_style, parent_computed_style_declaration, root_computed_style,
+      viewport_size, property_key_to_base_url_map);
 
   if (previous_computed_style) {
     // Now that we have updated our computed style, compare it to the previous
@@ -764,13 +796,39 @@
     css_transitions->UpdateTransitions(
         style_change_event_time, *previous_computed_style, *computed_style);
   }
-  // Update the set of currently running animations.
-  css_animations->Update(style_change_event_time, *computed_style,
-                         keyframes_map);
+  // Update the set of currently running animations and track whether or not the
+  // animations changed.
+  *animations_modified = css_animations->Update(style_change_event_time,
+                                                *computed_style, keyframes_map);
 
   return computed_style;
 }
 
+// Flags tracking which cached values must be invalidated.
+struct UpdateComputedStyleInvalidationFlags {
+  UpdateComputedStyleInvalidationFlags()
+      : invalidate_descendant_computed_styles(false),
+        invalidate_layout_boxes(false),
+        invalidate_sizes(false),
+        invalidate_cross_references(false),
+        invalidate_render_tree_nodes(false) {}
+
+  bool invalidate_descendant_computed_styles;
+  bool invalidate_layout_boxes;
+  bool invalidate_sizes;
+  bool invalidate_cross_references;
+  bool invalidate_render_tree_nodes;
+};
+
+bool NewComputedStyleInvalidatesDescendantComputedStyles(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& old_computed_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& new_computed_style) {
+  return !non_trivial_static_fields.Get()
+              .computed_style_invalidation_property_checker
+              .DoDeclaredPropertiesMatch(old_computed_style,
+                                         new_computed_style);
+}
+
 bool NewComputedStyleInvalidatesLayoutBoxes(
     const scoped_refptr<const cssom::CSSComputedStyleData>& old_computed_style,
     const scoped_refptr<cssom::CSSComputedStyleData>& new_computed_style) {
@@ -797,24 +855,82 @@
                                          new_computed_style);
 }
 
+void UpdateInvalidationFlagsForNewComputedStyle(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& old_computed_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& new_computed_style,
+    bool animations_modified, UpdateComputedStyleInvalidationFlags* flags) {
+  if (old_computed_style) {
+    if (!flags->invalidate_descendant_computed_styles &&
+        NewComputedStyleInvalidatesDescendantComputedStyles(
+            old_computed_style, new_computed_style)) {
+      flags->invalidate_descendant_computed_styles = true;
+      flags->invalidate_layout_boxes = true;
+    } else if (!flags->invalidate_layout_boxes) {
+      if (NewComputedStyleInvalidatesLayoutBoxes(old_computed_style,
+                                                 new_computed_style)) {
+        flags->invalidate_layout_boxes = true;
+      } else {
+        if (!flags->invalidate_sizes &&
+            NewComputedStyleInvalidatesSizes(old_computed_style,
+                                             new_computed_style)) {
+          flags->invalidate_sizes = true;
+          flags->invalidate_render_tree_nodes = true;
+        }
+        if (!flags->invalidate_cross_references &&
+            NewComputedStyleInvalidatesCrossReferences(old_computed_style,
+                                                       new_computed_style)) {
+          flags->invalidate_cross_references = true;
+          flags->invalidate_render_tree_nodes = true;
+        }
+
+        flags->invalidate_render_tree_nodes =
+            flags->invalidate_render_tree_nodes || animations_modified ||
+            !new_computed_style->DoDeclaredPropertiesMatch(old_computed_style);
+      }
+    }
+  }
+}
+
 }  // namespace
 
 void HTMLElement::UpdateComputedStyle(
-    const scoped_refptr<const cssom::CSSComputedStyleData>&
-        parent_computed_style,
+    const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
+        parent_computed_style_declaration,
     const scoped_refptr<const cssom::CSSComputedStyleData>& root_computed_style,
     const base::TimeDelta& style_change_event_time) {
   Document* document = node_document();
   DCHECK(document) << "Element should be attached to document in order to "
                       "participate in layout.";
 
+  // If there is no previous computed style, there should also be no layout
+  // boxes.
+  DCHECK(computed_style() || NULL == layout_boxes());
+
   dom_stat_tracker_->OnUpdateComputedStyle();
 
+  // The computed style must be generated if either the computed style is
+  // invalid or no computed style has been created yet.
+  bool generate_computed_style = !computed_style_valid_ || !computed_style();
+
   // Update matching rules if necessary.
   if (!matching_rules_valid_) {
     dom_stat_tracker_->OnUpdateMatchingRules();
     UpdateMatchingRules(this);
     matching_rules_valid_ = true;
+
+    // Check for whether the matching rules have changed. If they have, then a
+    // new computed style must be generated from them.
+    if (!generate_computed_style && *old_matching_rules_ != *matching_rules_) {
+      generate_computed_style = true;
+    }
+  }
+
+  // If any declared properties inherited from the parent are no longer valid,
+  // then a new computed style must be generated with the updated inherited
+  // values.
+  if (!generate_computed_style &&
+      !computed_style()->AreDeclaredPropertiesInheritedFromParentValid()) {
+    generate_computed_style = true;
   }
 
   // TODO: It maybe helpful to generalize this mapping framework in the
@@ -824,95 +940,88 @@
   property_key_to_base_url_map[cssom::kBackgroundImageProperty] =
       document->url_as_gurl();
 
-  scoped_refptr<cssom::CSSComputedStyleData> new_computed_style =
-      PromoteMatchingRulesToComputedStyle(
-          matching_rules(), &property_key_to_base_url_map, style_->data(),
-          parent_computed_style, root_computed_style, document->viewport_size(),
-          style_change_event_time, &css_transitions_, computed_style(),
-          &css_animations_, document->keyframes_map());
+  // Flags tracking which cached values must be invalidated.
+  UpdateComputedStyleInvalidationFlags invalidation_flags;
 
-  // If there is no previous computed style, there should also be no layout
-  // boxes, and nothing has to be invalidated.
-  bool invalidate_layout_boxes = false;
-  bool invalidate_sizes = false;
-  bool invalidate_cross_references = false;
+  if (generate_computed_style) {
+    bool animations_modified = false;
 
-  DCHECK(computed_style() || NULL == layout_boxes());
-  if (computed_style()) {
-    if (NewComputedStyleInvalidatesLayoutBoxes(computed_style(),
-                                               new_computed_style)) {
-      invalidate_layout_boxes = true;
-    } else {
-      if (NewComputedStyleInvalidatesSizes(computed_style(),
-                                           new_computed_style)) {
-        invalidate_sizes = true;
-      }
-      if (NewComputedStyleInvalidatesCrossReferences(computed_style(),
-                                                     new_computed_style)) {
-        invalidate_cross_references = true;
-      }
-    }
+    scoped_refptr<cssom::CSSComputedStyleData> new_computed_style =
+        PromoteMatchingRulesToComputedStyle(
+            matching_rules(), &property_key_to_base_url_map, style_->data(),
+            parent_computed_style_declaration, root_computed_style,
+            document->viewport_size(), style_change_event_time,
+            computed_style(), &css_transitions_, &css_animations_,
+            document->keyframes_map(), &animations_modified);
+
+    UpdateInvalidationFlagsForNewComputedStyle(
+        computed_style(), new_computed_style, animations_modified,
+        &invalidation_flags);
+
+    css_computed_style_declaration_->SetData(new_computed_style);
+
+    // Update cached background images after resolving the urls in
+    // background_image CSS property of the computed style, so we have all the
+    // information to get the cached background images.
+    UpdateCachedBackgroundImagesFromComputedStyle();
+  } else {
+    // Update the inherited data if a new style was not generated. The ancestor
+    // data with inherited properties may have changed.
+    css_computed_style_declaration_->UpdateInheritedData();
   }
 
-  set_computed_style(new_computed_style);
-
-  // Update cached background images after resolving the urls in
-  // background_image CSS property of the computed style, so we have all the
-  // information to get the cached background images.
-  UpdateCachedBackgroundImagesFromComputedStyle();
+  // NOTE: Currently, pseudo elements computed styles are always generated. If
+  // this becomes a performance bottleneck, change the logic so that it only
+  // occurs when needed.
 
   // Promote the matching rules for all known pseudo elements.
   for (int pseudo_element_type = 0; pseudo_element_type < kMaxPseudoElementType;
        ++pseudo_element_type) {
     if (pseudo_elements_[pseudo_element_type]) {
+      bool animations_modified = false;
+
       scoped_refptr<cssom::CSSComputedStyleData> pseudo_element_computed_style =
           PromoteMatchingRulesToComputedStyle(
               pseudo_elements_[pseudo_element_type]->matching_rules(),
-              &property_key_to_base_url_map, style_->data(), computed_style(),
-              root_computed_style, document->viewport_size(),
-              style_change_event_time,
-              pseudo_elements_[pseudo_element_type]->css_transitions(),
+              &property_key_to_base_url_map, style_->data(),
+              css_computed_style_declaration(), root_computed_style,
+              document->viewport_size(), style_change_event_time,
               pseudo_elements_[pseudo_element_type]->computed_style(),
+              pseudo_elements_[pseudo_element_type]->css_transitions(),
               pseudo_elements_[pseudo_element_type]->css_animations(),
-              document->keyframes_map());
+              document->keyframes_map(), &animations_modified);
 
-      if (!invalidate_layout_boxes &&
-          pseudo_elements_[pseudo_element_type]->computed_style()) {
-        if (NewComputedStyleInvalidatesLayoutBoxes(
-                pseudo_elements_[pseudo_element_type]->computed_style(),
-                pseudo_element_computed_style)) {
-          invalidate_layout_boxes = true;
-        } else {
-          if (!invalidate_sizes &&
-              NewComputedStyleInvalidatesSizes(
-                  pseudo_elements_[pseudo_element_type]->computed_style(),
-                  pseudo_element_computed_style)) {
-            invalidate_sizes = true;
-          }
-          if (!invalidate_cross_references &&
-              NewComputedStyleInvalidatesCrossReferences(
-                  pseudo_elements_[pseudo_element_type]->computed_style(),
-                  pseudo_element_computed_style)) {
-            invalidate_cross_references = true;
-          }
-        }
-      }
-      pseudo_elements_[pseudo_element_type]->set_computed_style(
-          pseudo_element_computed_style);
+      UpdateInvalidationFlagsForNewComputedStyle(
+          pseudo_elements_[pseudo_element_type]->computed_style(),
+          pseudo_element_computed_style, animations_modified,
+          &invalidation_flags);
+
+      pseudo_elements_[pseudo_element_type]
+          ->css_computed_style_declaration()
+          ->SetData(pseudo_element_computed_style);
     }
   }
 
-  if (invalidate_layout_boxes) {
+  if (invalidation_flags.invalidate_descendant_computed_styles) {
+    InvalidateComputedStylesRecursively();
+  }
+
+  if (invalidation_flags.invalidate_layout_boxes) {
     InvalidateLayoutBoxesFromNodeAndAncestors();
     InvalidateLayoutBoxesFromNodeAndDescendants();
   } else {
-    if (invalidate_sizes) {
+    if (invalidation_flags.invalidate_sizes) {
       InvalidateLayoutBoxSizesFromNode();
     }
-    if (invalidate_cross_references) {
+    if (invalidation_flags.invalidate_cross_references) {
       InvalidateLayoutBoxCrossReferencesFromNode();
     }
+    if (invalidation_flags.invalidate_render_tree_nodes) {
+      InvalidateRenderTreeNodesFromNode();
+    }
   }
+
+  computed_style_valid_ = true;
 }
 
 void HTMLElement::UpdateCachedBackgroundImagesFromComputedStyle() {
diff --git a/src/cobalt/dom/html_element.h b/src/cobalt/dom/html_element.h
index eb6995f..11837a8 100644
--- a/src/cobalt/dom/html_element.h
+++ b/src/cobalt/dom/html_element.h
@@ -178,7 +178,7 @@
   //
   // Returns the cached matching rules of this element.
   cssom::RulesWithCascadePrecedence* matching_rules() {
-    return &matching_rules_;
+    return matching_rules_.get();
   }
   // Returns the rule matching state of this element.
   RuleMatchingState* rule_matching_state() { return &rule_matching_state_; }
@@ -199,13 +199,12 @@
       const {
     return css_computed_style_declaration_->data();
   }
-  void set_computed_style(
-      const scoped_refptr<cssom::CSSComputedStyleData>& computed_style) {
-    css_computed_style_declaration_->set_data(computed_style);
-  }
+
+  // Invalidates the cached computed style of this element and its descendants.
+  void InvalidateComputedStylesRecursively();
   // Updates the cached computed style of this element and its descendants.
   void UpdateComputedStyleRecursively(
-      const scoped_refptr<const cssom::CSSComputedStyleData>&
+      const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
           parent_computed_style,
       const scoped_refptr<const cssom::CSSComputedStyleData>&
           root_computed_style,
@@ -213,8 +212,8 @@
       bool ancestors_were_valid);
   // Updates the cached computed style of this element.
   void UpdateComputedStyle(
-      const scoped_refptr<const cssom::CSSComputedStyleData>&
-          parent_computed_style,
+      const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
+          parent_computed_style_declaration,
       const scoped_refptr<const cssom::CSSComputedStyleData>&
           root_computed_style,
       const base::TimeDelta& style_change_event_time);
@@ -233,6 +232,7 @@
   void InvalidateLayoutBoxesFromNodeAndDescendants() OVERRIDE;
   void InvalidateLayoutBoxSizesFromNode() OVERRIDE;
   void InvalidateLayoutBoxCrossReferencesFromNode() OVERRIDE;
+  void InvalidateRenderTreeNodesFromNode() OVERRIDE;
 
   // Determines whether this element is focusable.
   bool IsFocusable() const { return HasAttribute("tabindex"); }
@@ -313,7 +313,8 @@
   cssom::AnimationSet css_animations_;
 
   // The following fields are used in rule matching.
-  cssom::RulesWithCascadePrecedence matching_rules_;
+  scoped_ptr<cssom::RulesWithCascadePrecedence> old_matching_rules_;
+  scoped_ptr<cssom::RulesWithCascadePrecedence> matching_rules_;
   RuleMatchingState rule_matching_state_;
 
   // This contains information about the boxes generated from the element.
diff --git a/src/cobalt/dom/html_element_test.cc b/src/cobalt/dom/html_element_test.cc
index ce2a589..1e8bceb 100644
--- a/src/cobalt/dom/html_element_test.cc
+++ b/src/cobalt/dom/html_element_test.cc
@@ -86,6 +86,7 @@
 
   MOCK_METHOD0(InvalidateSizes, void());
   MOCK_METHOD0(InvalidateCrossReferences, void());
+  MOCK_METHOD0(InvalidateRenderTreeNodes, void());
 };
 
 // Takes the fist child of the given element repeatedly to the given depth.
@@ -136,7 +137,7 @@
         document_->CreateElement(*null_terminated_element_names)
             ->AsHTMLElement());
     DCHECK(child_html_element);
-    child_html_element->set_computed_style(
+    child_html_element->css_computed_style_declaration()->SetData(
         make_scoped_refptr(new cssom::CSSComputedStyleData()));
 
     if (parent_html_element) {
@@ -442,7 +443,8 @@
       make_scoped_refptr(new cssom::CSSComputedStyleData());
   computed_style_relative->set_position(cssom::KeywordValue::GetRelative());
   GetFirstChildAtDepth(root_html_element, 2)
-      ->set_computed_style(computed_style_relative);
+      ->css_computed_style_declaration()
+      ->SetData(computed_style_relative);
 
   // Return ancestor if it is the HTML body element.
   EXPECT_EQ(GetFirstChildAtDepth(root_html_element, 2)->offset_parent(),
@@ -454,7 +456,8 @@
       make_scoped_refptr(new cssom::CSSComputedStyleData());
   computed_style_fixed->set_position(cssom::KeywordValue::GetFixed());
   GetFirstChildAtDepth(root_html_element, 3)
-      ->set_computed_style(computed_style_fixed);
+      ->css_computed_style_declaration()
+      ->SetData(computed_style_fixed);
   EXPECT_FALSE(GetFirstChildAtDepth(root_html_element, 3)->offset_parent());
 
   // Return ancestor if its computed value of the 'position' property is not
diff --git a/src/cobalt/dom/html_video_element.cc b/src/cobalt/dom/html_video_element.cc
index b7e4751..89d0f1e 100644
--- a/src/cobalt/dom/html_video_element.cc
+++ b/src/cobalt/dom/html_video_element.cc
@@ -71,6 +71,17 @@
   return static_cast<uint32>(player()->GetNaturalSize().height());
 }
 
+scoped_refptr<VideoPlaybackQuality> HTMLVideoElement::GetVideoPlaybackQuality()
+    const {
+  // TODO: Provide all attributes with valid values.
+  return new VideoPlaybackQuality(
+      0.,   // creation_time
+      player() ? static_cast<uint32>(player()->GetDecodedFrameCount()) : 0,
+      player() ? static_cast<uint32>(player()->GetDroppedFrameCount()) : 0,
+      0,    // corrupted_video_frames
+      0.);  // total_frame_delay
+}
+
 scoped_refptr<ShellVideoFrameProvider>
 HTMLVideoElement::GetVideoFrameProvider() {
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/src/cobalt/dom/html_video_element.h b/src/cobalt/dom/html_video_element.h
index 0f83f04..2ac5c3f 100644
--- a/src/cobalt/dom/html_video_element.h
+++ b/src/cobalt/dom/html_video_element.h
@@ -20,6 +20,7 @@
 #include <string>
 
 #include "cobalt/dom/html_media_element.h"
+#include "cobalt/dom/video_playback_quality.h"
 #include "media/base/shell_video_frame_provider.h"
 
 namespace cobalt {
@@ -43,6 +44,7 @@
   void set_height(uint32 height);
   uint32 video_width() const;
   uint32 video_height() const;
+  scoped_refptr<VideoPlaybackQuality> GetVideoPlaybackQuality() const;
 
   // Custom, not in any spec
   //
diff --git a/src/cobalt/dom/layout_boxes.h b/src/cobalt/dom/layout_boxes.h
index 350a7cc..98eccce 100644
--- a/src/cobalt/dom/layout_boxes.h
+++ b/src/cobalt/dom/layout_boxes.h
@@ -81,6 +81,8 @@
   // Invalidate the cross references, which relates to both positioned children
   // of containing blocks and z-index children of stacking contexts.
   virtual void InvalidateCrossReferences() = 0;
+  // Invalidate the layout box's render tree nodes.
+  virtual void InvalidateRenderTreeNodes() = 0;
 
  protected:
   LayoutBoxes() {}
diff --git a/src/cobalt/dom/node.h b/src/cobalt/dom/node.h
index ceee672..0b2ca54 100644
--- a/src/cobalt/dom/node.h
+++ b/src/cobalt/dom/node.h
@@ -239,6 +239,8 @@
   virtual void InvalidateLayoutBoxSizesFromNode() {}
   // Invalidate the cross references within the layout boxes of this node.
   virtual void InvalidateLayoutBoxCrossReferencesFromNode() {}
+  // Invalidate the render tree nodes within the layout boxes of this node.
+  virtual void InvalidateRenderTreeNodesFromNode() {}
 
   // Triggers a generation update in this node and all its ancestor nodes.
   void UpdateGenerationForNodeAndAncestors();
diff --git a/src/cobalt/dom/pseudo_element.h b/src/cobalt/dom/pseudo_element.h
index 0531421..18e94d7 100644
--- a/src/cobalt/dom/pseudo_element.h
+++ b/src/cobalt/dom/pseudo_element.h
@@ -58,10 +58,6 @@
   scoped_refptr<const cssom::CSSComputedStyleData> computed_style() const {
     return css_computed_style_declaration_->data();
   }
-  void set_computed_style(
-      const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style) {
-    css_computed_style_declaration_->set_data(computed_style);
-  }
 
   cssom::RulesWithCascadePrecedence* matching_rules() {
     return &matching_rules_;
diff --git a/src/cobalt/dom/video_playback_quality.h b/src/cobalt/dom/video_playback_quality.h
new file mode 100644
index 0000000..e5e88e3
--- /dev/null
+++ b/src/cobalt/dom/video_playback_quality.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 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_DOM_VIDEO_PLAYBACK_QUALITY_H_
+#define COBALT_DOM_VIDEO_PLAYBACK_QUALITY_H_
+
+#include "base/basictypes.h"
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace dom {
+
+// The VideoPlaybackQuality interface exposes data to describe the video
+// playback quality.
+//   https://www.w3.org/TR/media-source/#idl-def-VideoPlaybackQuality
+class VideoPlaybackQuality : public script::Wrappable {
+ public:
+  VideoPlaybackQuality(double creation_time, uint32 total_video_frames,
+                       uint32 dropped_video_frames,
+                       uint32 corrupted_video_frames, double total_frame_delay)
+      : creation_time_(creation_time),
+        total_video_frames_(total_video_frames),
+        dropped_video_frames_(dropped_video_frames),
+        corrupted_video_frames_(corrupted_video_frames),
+        total_frame_delay_(total_frame_delay) {}
+
+  // Web API: VideoPlaybackQuality
+  //
+  double creation_time() const { return creation_time_; }
+  uint32 total_video_frames() const { return total_video_frames_; }
+  uint32 dropped_video_frames() const { return dropped_video_frames_; }
+  uint32 corrupted_video_frames() const { return corrupted_video_frames_; }
+  double total_frame_delay() const { return total_frame_delay_; }
+
+  DEFINE_WRAPPABLE_TYPE(VideoPlaybackQuality);
+
+ private:
+  double creation_time_;
+  uint32 total_video_frames_;
+  uint32 dropped_video_frames_;
+  uint32 corrupted_video_frames_;
+  double total_frame_delay_;
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_VIDEO_PLAYBACK_QUALITY_H_
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index e1f7bce..cdab450 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -90,7 +90,7 @@
       ALLOW_THIS_IN_INITIALIZER_LIST(document_(new Document(
           html_element_context_.get(),
           Document::Options(
-              url,
+              url, this,
               base::Bind(&Window::FireHashChangeEvent, base::Unretained(this)),
               performance_->timing()->GetNavigationStartClock(),
               navigation_callback, ParseUserAgentStyleSheet(css_parser),
diff --git a/src/cobalt/dom/window_timers.cc b/src/cobalt/dom/window_timers.cc
index 04e58b8..df784cd 100644
--- a/src/cobalt/dom/window_timers.cc
+++ b/src/cobalt/dom/window_timers.cc
@@ -73,7 +73,10 @@
 void WindowTimers::RunTimerCallback(int handle) {
   Timers::iterator timer = timers_.find(handle);
   DCHECK(timer != timers_.end());
-  timer->second->callback_reference().value().Run();
+  // Keep a |TimerInfo| reference, so it won't be released when running the
+  // callback.
+  scoped_refptr<TimerInfo> timer_info = timer->second;
+  timer_info->callback_reference().value().Run();
   // After running the callback, double check whether the timer is still there
   // since it might be deleted inside the callback.
   timer = timers_.find(handle);
diff --git a/src/cobalt/layout/anonymous_block_box.cc b/src/cobalt/layout/anonymous_block_box.cc
index b20e597..281cc70 100644
--- a/src/cobalt/layout/anonymous_block_box.cc
+++ b/src/cobalt/layout/anonymous_block_box.cc
@@ -62,11 +62,8 @@
 }
 
 void AnonymousBlockBox::RenderAndAnimateContent(
-    render_tree::CompositionNode::Builder* border_node_builder,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animations_map_builder) const {
-  ContainerBox::RenderAndAnimateContent(border_node_builder,
-                                        node_animations_map_builder);
+    render_tree::CompositionNode::Builder* border_node_builder) const {
+  ContainerBox::RenderAndAnimateContent(border_node_builder);
 
   if (computed_style()->visibility() != cssom::KeywordValue::GetVisible()) {
     return;
@@ -125,24 +122,20 @@
 
 scoped_ptr<FormattingContext> AnonymousBlockBox::UpdateRectOfInFlowChildBoxes(
     const LayoutParams& child_layout_params) {
-  // Check to see if ellipses are enabled:
-  // If they are, then retrieve the ellipsis width for the font and reset the
-  // ellipsis boxes on all child boxes because they are no longer valid.
-  // Otherwise, set the width to 0, which indicates that ellipses are not being
-  // used. In this case, child boxes do not need to have ellipses reset, as they
-  // could not have previously been set.
-  float ellipsis_width;
-  if (AreEllipsesEnabled()) {
-    ellipsis_width = used_font_->GetEllipsisWidth();
-
-    for (Boxes::const_iterator child_box_iterator = child_boxes().begin();
-         child_box_iterator != child_boxes().end(); ++child_box_iterator) {
-      (*child_box_iterator)->ResetEllipses();
-    }
-  } else {
-    ellipsis_width = 0;
+  // Do any processing needed prior to ellipsis placement on all of the
+  // children.
+  for (Boxes::const_iterator child_ellipsis_iterator = child_boxes().begin();
+       child_ellipsis_iterator != child_boxes().end();
+       ++child_ellipsis_iterator) {
+    (*child_ellipsis_iterator)->DoPreEllipsisPlacementProcessing();
   }
 
+  // If ellipses are enabled then retrieve the ellipsis width for the font;
+  // otherwise, set the width to 0, which indicates that ellipses are not being
+  // used.
+  float ellipsis_width =
+      AreEllipsesEnabled() ? used_font_->GetEllipsisWidth() : 0;
+
   // Lay out child boxes in the normal flow.
   //   https://www.w3.org/TR/CSS21/visuren.html#normal-flow
   scoped_ptr<InlineFormattingContext> inline_formatting_context(
@@ -204,6 +197,15 @@
   }
   inline_formatting_context->EndUpdates();
   ellipses_coordinates_ = inline_formatting_context->GetEllipsesCoordinates();
+
+  // Do any processing needed following ellipsis placement on all of the
+  // children.
+  for (Boxes::const_iterator child_ellipsis_iterator = child_boxes().begin();
+       child_ellipsis_iterator != child_boxes().end();
+       ++child_ellipsis_iterator) {
+    (*child_ellipsis_iterator)->DoPostEllipsisPlacementProcessing();
+  }
+
   return inline_formatting_context.PassAs<FormattingContext>();
 }
 
diff --git a/src/cobalt/layout/anonymous_block_box.h b/src/cobalt/layout/anonymous_block_box.h
index 54c1673..bda736f 100644
--- a/src/cobalt/layout/anonymous_block_box.h
+++ b/src/cobalt/layout/anonymous_block_box.h
@@ -47,10 +47,8 @@
 
   bool HasTrailingLineBreak() const OVERRIDE;
 
-  void RenderAndAnimateContent(
-      render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const OVERRIDE;
+  void RenderAndAnimateContent(render_tree::CompositionNode::Builder*
+                                   border_node_builder) const OVERRIDE;
 
   // From |ContainerBox|.
 
diff --git a/src/cobalt/layout/block_formatting_block_container_box.cc b/src/cobalt/layout/block_formatting_block_container_box.cc
index b4023d8..1c85502 100644
--- a/src/cobalt/layout/block_formatting_block_container_box.cc
+++ b/src/cobalt/layout/block_formatting_block_container_box.cc
@@ -96,14 +96,14 @@
     // TODO: Determine which animations to propagate to the anonymous block box,
     //       instead of none at all.
     scoped_refptr<cssom::CSSComputedStyleDeclaration>
-        css_computed_style_declaration =
+        new_computed_style_declaration =
             new cssom::CSSComputedStyleDeclaration();
-    css_computed_style_declaration->set_data(
-        GetComputedStyleOfAnonymousBox(computed_style()));
-    css_computed_style_declaration->set_animations(
+    new_computed_style_declaration->SetData(
+        GetComputedStyleOfAnonymousBox(css_computed_style_declaration()));
+    new_computed_style_declaration->set_animations(
         new web_animations::AnimationSet());
     scoped_refptr<AnonymousBlockBox> new_anonymous_block_box(
-        new AnonymousBlockBox(css_computed_style_declaration,
+        new AnonymousBlockBox(new_computed_style_declaration,
                               GetBaseDirection(), used_style_provider(),
                               layout_stat_tracker()));
     anonymous_block_box = new_anonymous_block_box.get();
@@ -144,7 +144,8 @@
                                        layout_stat_tracker),
       paragraph_(paragraph),
       text_position_(text_position),
-      is_hidden_by_ellipsis_(false) {}
+      is_hidden_by_ellipsis_(false),
+      was_hidden_by_ellipsis_(false) {}
 
 InlineLevelBlockContainerBox::~InlineLevelBlockContainerBox() {}
 
@@ -216,10 +217,17 @@
   return true;
 }
 
-void InlineLevelBlockContainerBox::ResetEllipses() {
+void InlineLevelBlockContainerBox::DoPreEllipsisPlacementProcessing() {
+  was_hidden_by_ellipsis_ = is_hidden_by_ellipsis_;
   is_hidden_by_ellipsis_ = false;
 }
 
+void InlineLevelBlockContainerBox::DoPostEllipsisPlacementProcessing() {
+  if (was_hidden_by_ellipsis_ != is_hidden_by_ellipsis_) {
+    InvalidateRenderTreeNodesOfBoxAndAncestors();
+  }
+}
+
 bool InlineLevelBlockContainerBox::IsHiddenByEllipsis() const {
   return is_hidden_by_ellipsis_;
 }
diff --git a/src/cobalt/layout/block_formatting_block_container_box.h b/src/cobalt/layout/block_formatting_block_container_box.h
index 197960b..a4a5bd9 100644
--- a/src/cobalt/layout/block_formatting_block_container_box.h
+++ b/src/cobalt/layout/block_formatting_block_container_box.h
@@ -117,7 +117,8 @@
   base::optional<int> GetBidiLevel() const OVERRIDE;
 
   bool DoesFulfillEllipsisPlacementRequirement() const OVERRIDE;
-  void ResetEllipses() OVERRIDE;
+  void DoPreEllipsisPlacementProcessing() OVERRIDE;
+  void DoPostEllipsisPlacementProcessing() OVERRIDE;
   bool IsHiddenByEllipsis() const OVERRIDE;
 
  protected:
@@ -143,6 +144,11 @@
   // the applicable edge(s) of the line as necessary to fit the ellipsis."
   //   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
   bool is_hidden_by_ellipsis_;
+  // Tracking of the previous value of |is_hidden_by_ellipsis_|, which allows
+  // for determination of whether or not the value changed during ellipsis
+  // placement. When this occurs, the cached render tree nodes of this box and
+  // its ancestors are invalidated.
+  bool was_hidden_by_ellipsis_;
 };
 
 }  // namespace layout
diff --git a/src/cobalt/layout/box.cc b/src/cobalt/layout/box.cc
index 82cbeb3..c8739ee 100644
--- a/src/cobalt/layout/box.cc
+++ b/src/cobalt/layout/box.cc
@@ -53,7 +53,7 @@
 using cobalt::render_tree::RoundedCorners;
 using cobalt::render_tree::ViewportFilter;
 using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::NodeAnimationsMap;
+using cobalt::render_tree::animations::AnimateNode;
 
 namespace cobalt {
 namespace layout {
@@ -110,6 +110,10 @@
   UpdateBorders();
   UpdatePaddings(layout_params);
   UpdateContentSizeAndMargins(layout_params);
+
+  // After a size update, this portion of the render tree must be updated, so
+  // invalidate any cached render tree nodes.
+  InvalidateRenderTreeNodesOfBoxAndAncestors();
 }
 
 bool Box::ValidateUpdateSizeInputs(const LayoutParams& params) {
@@ -190,6 +194,13 @@
   }
 }
 
+void Box::InvalidateRenderTreeNodesOfBoxAndAncestors() {
+  cached_render_tree_node_info_ = base::nullopt;
+  if (parent_) {
+    parent_->InvalidateRenderTreeNodesOfBoxAndAncestors();
+  }
+}
+
 LayoutUnit Box::GetMarginBoxWidth() const {
   return margin_left() + GetBorderBoxWidth() + margin_right();
 }
@@ -385,8 +396,25 @@
 
 void Box::RenderAndAnimate(
     CompositionNode::Builder* parent_content_node_builder,
-    NodeAnimationsMap::Builder* node_animations_map_builder,
-    const math::Vector2dF& offset_from_parent_node) const {
+    const math::Vector2dF& offset_from_parent_node) {
+  math::Vector2dF border_box_offset(left().toFloat() + margin_left().toFloat(),
+                                    top().toFloat() + margin_top().toFloat());
+  border_box_offset += offset_from_parent_node;
+
+  // If there's a pre-existing cached render tree node that is located at the
+  // border box offset, then simply use it. There's no more work to do.
+  if (cached_render_tree_node_info_ &&
+      cached_render_tree_node_info_->offset_ == border_box_offset) {
+    if (cached_render_tree_node_info_->node_) {
+      parent_content_node_builder->AddChild(
+          cached_render_tree_node_info_->node_);
+    }
+    return;
+  }
+
+  // Initialize the cached render tree node with the border box offset.
+  cached_render_tree_node_info_ = CachedRenderTreeNodeInfo(border_box_offset);
+
   float opacity = base::polymorphic_downcast<const cssom::NumberValue*>(
                       computed_style()->opacity().get())
                       ->value();
@@ -406,10 +434,8 @@
     return;
   }
 
-  math::Vector2dF border_box_offset(left().toFloat() + margin_left().toFloat(),
-                                    top().toFloat() + margin_top().toFloat());
-  border_box_offset += offset_from_parent_node;
   render_tree::CompositionNode::Builder border_node_builder(border_box_offset);
+  AnimateNode::Builder animate_node_builder;
 
   UsedBorderRadiusProvider border_radius_provider(GetBorderBoxSize());
   computed_style()->border_radius()->Accept(&border_radius_provider);
@@ -446,17 +472,14 @@
   // 'visibility: visible'.
   //   https://www.w3.org/TR/CSS21/visufx.html#propdef-visibility
   if (computed_style()->visibility() == cssom::KeywordValue::GetVisible()) {
-    RenderAndAnimateBackgroundColor(padding_rounded_corners,
-                                    &border_node_builder,
-                                    node_animations_map_builder);
-    RenderAndAnimateBackgroundImage(padding_rounded_corners,
-                                    &border_node_builder,
-                                    node_animations_map_builder);
+    RenderAndAnimateBackgroundColor(
+        padding_rounded_corners, &border_node_builder, &animate_node_builder);
+    RenderAndAnimateBackgroundImage(
+        padding_rounded_corners, &border_node_builder, &animate_node_builder);
     RenderAndAnimateBorder(border_radius_provider.rounded_corners(),
-                           &border_node_builder, node_animations_map_builder);
+                           &border_node_builder, &animate_node_builder);
     RenderAndAnimateBoxShadow(border_radius_provider.rounded_corners(),
-                              &border_node_builder,
-                              node_animations_map_builder);
+                              &border_node_builder, &animate_node_builder);
   }
 
   const bool overflow_hidden =
@@ -472,17 +495,17 @@
        border_insets_.zero())) {
     // If there's no reason to distinguish between content and background,
     // just add them all to the same composition node.
-    RenderAndAnimateContent(&border_node_builder, node_animations_map_builder);
+    RenderAndAnimateContent(&border_node_builder);
   } else {
     CompositionNode::Builder content_node_builder;
     // Otherwise, deal with content specifically so that we can apply overflow:
     // hidden to the content but not the background.
-    RenderAndAnimateContent(&content_node_builder, node_animations_map_builder);
+    RenderAndAnimateContent(&content_node_builder);
     if (!content_node_builder.children().empty()) {
       border_node_builder.AddChild(RenderAndAnimateOverflow(
           padding_rounded_corners,
           new CompositionNode(content_node_builder.Pass()),
-          node_animations_map_builder, math::Vector2dF(0, 0)));
+          &animate_node_builder, math::Vector2dF(0, 0)));
     }
     // We've already applied overflow hidden, no need to apply it again later.
     overflow_hidden_needs_to_be_applied = false;
@@ -492,16 +515,22 @@
     scoped_refptr<render_tree::Node> border_node =
         new CompositionNode(border_node_builder.Pass());
     if (overflow_hidden_needs_to_be_applied) {
-      border_node = RenderAndAnimateOverflow(
-          padding_rounded_corners, border_node, node_animations_map_builder,
-          border_box_offset);
+      border_node =
+          RenderAndAnimateOverflow(padding_rounded_corners, border_node,
+                                   &animate_node_builder, border_box_offset);
     }
-    border_node = RenderAndAnimateOpacity(
-        border_node, node_animations_map_builder, opacity, opacity_animated);
-    border_node = RenderAndAnimateTransform(
-        border_node, node_animations_map_builder, border_box_offset);
+    border_node = RenderAndAnimateOpacity(border_node, &animate_node_builder,
+                                          opacity, opacity_animated);
+    border_node = RenderAndAnimateTransform(border_node, &animate_node_builder,
+                                            border_box_offset);
 
-    parent_content_node_builder->AddChild(border_node);
+    cached_render_tree_node_info_->node_ =
+        animate_node_builder.empty()
+            ? border_node
+            : scoped_refptr<render_tree::Node>(
+                  new AnimateNode(animate_node_builder, border_node));
+
+    parent_content_node_builder->AddChild(cached_render_tree_node_info_->node_);
   }
 }
 
@@ -536,6 +565,14 @@
 #endif  // COBALT_BOX_DUMP_ENABLED
 
 namespace {
+void PopulateBaseStyleForBackgroundNode(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& source_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& destination_style) {
+  // NOTE: Properties set by PopulateBaseStyleForBackgroundNode() should match
+  // the properties used by SetupBackgroundNodeFromStyle().
+  destination_style->set_background_color(source_style->background_color());
+}
+
 void SetupBackgroundNodeFromStyle(
     const base::optional<RoundedCorners>& rounded_corners,
     const scoped_refptr<const cssom::CSSComputedStyleData>& style,
@@ -596,6 +633,36 @@
   return Border(left, right, top, bottom);
 }
 
+void PopulateBaseStyleForBorderNode(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& source_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& destination_style) {
+  // NOTE: Properties set by PopulateBaseStyleForBorderNode() should match the
+  // properties used by SetupBorderNodeFromStyle().
+
+  // Left
+  destination_style->set_border_left_width(source_style->border_left_width());
+  destination_style->set_border_left_style(source_style->border_left_style());
+  destination_style->set_border_left_color(source_style->border_left_color());
+
+  // Right
+  destination_style->set_border_right_width(source_style->border_right_width());
+  destination_style->set_border_right_style(source_style->border_right_style());
+  destination_style->set_border_right_color(source_style->border_right_color());
+
+  // Top
+  destination_style->set_border_top_width(source_style->border_top_width());
+  destination_style->set_border_top_style(source_style->border_top_style());
+  destination_style->set_border_top_color(source_style->border_top_color());
+
+  // Bottom
+  destination_style->set_border_bottom_width(
+      source_style->border_bottom_width());
+  destination_style->set_border_bottom_style(
+      source_style->border_bottom_style());
+  destination_style->set_border_bottom_color(
+      source_style->border_bottom_color());
+}
+
 void SetupBorderNodeFromStyle(
     const base::optional<RoundedCorners>& rounded_corners,
     const scoped_refptr<const cssom::CSSComputedStyleData>& style,
@@ -774,7 +841,7 @@
 // CSS transform style property.  If the object does not have a transform
 // style property set, this will be the identity matrix.  Otherwise, it is
 // calculated from the property value and returned.  The transform-origin
-// style property will also be taken into account, and therefore the layed
+// style property will also be taken into account, and therefore the laid
 // out size of the object is also required in order to resolve a
 // percentage-based transform-origin.
 math::Matrix3F GetCSSTransform(
@@ -797,10 +864,20 @@
          math::TranslateMatrix(-origin.x(), -origin.y());
 }
 
-// Used within the animation callback for CSS transforms.  This will
-// set the transform of a single-child composition node to that specified by
-// the CSS transform of the provided CSS Style Declaration.
-void SetupCompositionNodeFromCSSSStyleTransform(
+void PopulateBaseStyleForMatrixTransformNode(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& source_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& destination_style) {
+  // NOTE: Properties set by PopulateBaseStyleForMatrixTransformNode() should
+  // match the properties used by
+  // SetupMatrixTransformNodeFromCSSSStyleTransform().
+  destination_style->set_transform(source_style->transform());
+  destination_style->set_transform_origin(source_style->transform_origin());
+}
+
+// Used within the animation callback for CSS transforms.  This will set the
+// transform of a single-child matrix transform node to that specified by the
+// CSS transform of the provided CSS Style Declaration.
+void SetupMatrixTransformNodeFromCSSSStyleTransform(
     const math::RectF& used_rect,
     const scoped_refptr<const cssom::CSSComputedStyleData>& style,
     MatrixTransformNode::Builder* transform_node_builder) {
@@ -808,6 +885,14 @@
       GetCSSTransform(style->transform(), style->transform_origin(), used_rect);
 }
 
+void PopulateBaseStyleForFilterNode(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& source_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& destination_style) {
+  // NOTE: Properties set by PopulateBaseStyleForFilterNode() should match the
+  // properties used by SetupFilterNodeFromStyle().
+  destination_style->set_opacity(source_style->opacity());
+}
+
 void SetupFilterNodeFromStyle(
     const scoped_refptr<const cssom::CSSComputedStyleData>& style,
     FilterNode::Builder* filter_node_builder) {
@@ -843,8 +928,8 @@
 void Box::RenderAndAnimateBoxShadow(
     const base::optional<RoundedCorners>& rounded_corners,
     CompositionNode::Builder* border_node_builder,
-    NodeAnimationsMap::Builder* node_animations_map_builder) const {
-  UNREFERENCED_PARAMETER(node_animations_map_builder);
+    AnimateNode::Builder* animate_node_builder) {
+  UNREFERENCED_PARAMETER(animate_node_builder);
 
   if (computed_style()->box_shadow() != cssom::KeywordValue::GetNone()) {
     const cssom::PropertyListValue* box_shadow_list =
@@ -907,7 +992,7 @@
 void Box::RenderAndAnimateBorder(
     const base::optional<RoundedCorners>& rounded_corners,
     CompositionNode::Builder* border_node_builder,
-    NodeAnimationsMap::Builder* node_animations_map_builder) const {
+    AnimateNode::Builder* animate_node_builder) {
   // If the border is absent or all borders are transparent, there is no need
   // to render border.
   if (border_insets_.zero() || AreAllBordersTransparent(computed_style())) {
@@ -924,16 +1009,16 @@
 
   if (HasAnimatedBorder(animations())) {
     AddAnimations<RectNode>(
+        base::Bind(&PopulateBaseStyleForBorderNode),
         base::Bind(&SetupBorderNodeFromStyle, rounded_corners),
-        *css_computed_style_declaration(), border_node,
-        node_animations_map_builder);
+        *css_computed_style_declaration(), border_node, animate_node_builder);
   }
 }
 
 void Box::RenderAndAnimateBackgroundColor(
     const base::optional<RoundedCorners>& rounded_corners,
     render_tree::CompositionNode::Builder* border_node_builder,
-    NodeAnimationsMap::Builder* node_animations_map_builder) const {
+    AnimateNode::Builder* animate_node_builder) {
   // Only create the RectNode if the background color is not the initial value
   // (which we know is transparent) and not transparent.  If it's animated,
   // add it no matter what since its value may change over time to be
@@ -958,9 +1043,9 @@
       // instead here.
       if (background_color_animated) {
         AddAnimations<RectNode>(
+            base::Bind(&PopulateBaseStyleForBackgroundNode),
             base::Bind(&SetupBackgroundNodeFromStyle, rounded_corners),
-            *css_computed_style_declaration(), rect_node,
-            node_animations_map_builder);
+            *css_computed_style_declaration(), rect_node, animate_node_builder);
       }
     }
   }
@@ -969,8 +1054,8 @@
 void Box::RenderAndAnimateBackgroundImage(
     const base::optional<RoundedCorners>& rounded_corners,
     CompositionNode::Builder* border_node_builder,
-    NodeAnimationsMap::Builder* node_animations_map_builder) const {
-  UNREFERENCED_PARAMETER(node_animations_map_builder);
+    AnimateNode::Builder* animate_node_builder) {
+  UNREFERENCED_PARAMETER(animate_node_builder);
 
   math::RectF image_frame(
       math::PointF(border_left_width().toFloat(), border_top_width().toFloat()),
@@ -1012,9 +1097,8 @@
 
 scoped_refptr<render_tree::Node> Box::RenderAndAnimateOpacity(
     const scoped_refptr<render_tree::Node>& border_node,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animations_map_builder,
-    float opacity, bool opacity_animated) const {
+    AnimateNode::Builder* animate_node_builder, float opacity,
+    bool opacity_animated) {
   if (opacity < 1.0f || opacity_animated) {
     FilterNode::Builder filter_node_builder(border_node);
 
@@ -1026,9 +1110,10 @@
 
     if (opacity_animated) {
       // Possibly setup an animation for opacity.
-      AddAnimations<FilterNode>(base::Bind(&SetupFilterNodeFromStyle),
+      AddAnimations<FilterNode>(base::Bind(&PopulateBaseStyleForFilterNode),
+                                base::Bind(&SetupFilterNodeFromStyle),
                                 *css_computed_style_declaration(), filter_node,
-                                node_animations_map_builder);
+                                animate_node_builder);
     }
     return filter_node;
   }
@@ -1038,10 +1123,9 @@
 
 scoped_refptr<render_tree::Node> Box::RenderAndAnimateOverflow(
     const base::optional<render_tree::RoundedCorners>& rounded_corners,
-    const scoped_refptr<render_tree::Node>& content_node,
-    render_tree::animations::NodeAnimationsMap::Builder*
-    /* node_animations_map_builder */,
-    const math::Vector2dF& border_node_offset) const {
+    const scoped_refptr<render_tree::Node>& content_node, AnimateNode::Builder*
+    /* animate_node_builder */,
+    const math::Vector2dF& border_node_offset) {
   bool overflow_hidden =
       computed_style()->overflow().get() == cssom::KeywordValue::GetHidden();
 
@@ -1069,24 +1153,25 @@
 
 scoped_refptr<render_tree::Node> Box::RenderAndAnimateTransform(
     const scoped_refptr<render_tree::Node>& border_node,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animations_map_builder,
-    const math::Vector2dF& border_node_offset) const {
+    AnimateNode::Builder* animate_node_builder,
+    const math::Vector2dF& border_node_offset) {
   if (IsTransformable() &&
       animations()->IsPropertyAnimated(cssom::kTransformProperty)) {
     // If the CSS transform is animated, we cannot flatten it into the layout
-    // transform, thus we create a new composition node to separate it and
+    // transform, thus we create a new matrix transform node to separate it and
     // animate that node only.
     scoped_refptr<MatrixTransformNode> css_transform_node =
         new MatrixTransformNode(border_node, math::Matrix3F::Identity());
 
-    // Specifically animate only the composition node with the CSS transform.
+    // Specifically animate only the matrix transform node with the CSS
+    // transform.
     AddAnimations<MatrixTransformNode>(
-        base::Bind(&SetupCompositionNodeFromCSSSStyleTransform,
+        base::Bind(&PopulateBaseStyleForMatrixTransformNode),
+        base::Bind(&SetupMatrixTransformNodeFromCSSSStyleTransform,
                    math::RectF(PointAtOffsetFromOrigin(border_node_offset),
                                GetBorderBoxSize())),
         *css_computed_style_declaration(), css_transform_node,
-        node_animations_map_builder);
+        animate_node_builder);
 
     return css_transform_node;
   }
diff --git a/src/cobalt/layout/box.h b/src/cobalt/layout/box.h
index a85dfc5..676b04d 100644
--- a/src/cobalt/layout/box.h
+++ b/src/cobalt/layout/box.h
@@ -37,7 +37,7 @@
 #include "cobalt/layout/vector2d_layout_unit.h"
 #include "cobalt/math/point_f.h"
 #include "cobalt/math/rect_f.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/web_animations/animation_set.h"
 
@@ -314,8 +314,15 @@
   // element on a line."
   //   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
   virtual bool DoesFulfillEllipsisPlacementRequirement() const { return false; }
-  // Reset all ellipses-related state within the box.
-  virtual void ResetEllipses() {}
+  // Do any processing needed prior to ellipsis placement. This involves caching
+  // the old value and resetting the current value so it can be determined
+  // whether or not the ellipsis state within a box changed as a a result of
+  // ellipsis placement.
+  virtual void DoPreEllipsisPlacementProcessing() {}
+  // Do any processing needed following ellipsis placement. This involves
+  // checking the old value against the new value and resetting the cached
+  // render tree node if the ellipsis state changed.
+  virtual void DoPostEllipsisPlacementProcessing() {}
   // Whether or not the box is fully hidden by an ellipsis. This applies to
   // atomic inline-level elements that have had an ellipsis placed before them
   // on a line. https://www.w3.org/TR/css3-ui/#propdef-text-overflow
@@ -401,14 +408,16 @@
   // time they are needed.
   virtual void InvalidateCrossReferencesOfBoxAndAncestors();
 
+  // Invalidating the render tree nodes causes them to be re-generated the next
+  // time they are needed.
+  void InvalidateRenderTreeNodesOfBoxAndAncestors();
+
   // Converts a layout subtree into a render subtree.
   // This method defines the overall strategy of the conversion and relies
   // on the subclasses to provide the actual content.
   void RenderAndAnimate(
       render_tree::CompositionNode::Builder* parent_content_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder,
-      const math::Vector2dF& offset_from_parent_node) const;
+      const math::Vector2dF& offset_from_parent_node);
 
   // Poor man's reflection.
   virtual AnonymousBlockBox* AsAnonymousBlockBox();
@@ -528,9 +537,7 @@
 
   // Renders the content of the box.
   virtual void RenderAndAnimateContent(
-      render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const = 0;
+      render_tree::CompositionNode::Builder* border_node_builder) const = 0;
 
   // A transformable element is an element whose layout is governed by the CSS
   // box model which is either a block-level or atomic inline-level element.
@@ -564,6 +571,14 @@
       const base::optional<LayoutUnit>& possibly_overconstrained_margin_right);
 
  private:
+  struct CachedRenderTreeNodeInfo {
+    explicit CachedRenderTreeNodeInfo(const math::Vector2dF& offset)
+        : offset_(offset) {}
+
+    math::Vector2dF offset_;
+    scoped_refptr<render_tree::Node> node_;
+  };
+
   // Updates used values of "border" properties.
   void UpdateBorders();
   // Updates used values of "padding" properties.
@@ -583,47 +598,40 @@
   void RenderAndAnimateBorder(
       const base::optional<render_tree::RoundedCorners>& rounded_corners,
       render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder);
   void RenderAndAnimateBackgroundColor(
       const base::optional<render_tree::RoundedCorners>& rounded_corners,
       render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder);
   void RenderAndAnimateBackgroundImage(
       const base::optional<render_tree::RoundedCorners>& rounded_corners,
       render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder);
   void RenderAndAnimateBoxShadow(
       const base::optional<render_tree::RoundedCorners>& rounded_corners,
       render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder);
 
   // If opacity is animated or other than 1, wraps a border node into a filter
   // node. Otherwise returns the original border node.
   scoped_refptr<render_tree::Node> RenderAndAnimateOpacity(
       const scoped_refptr<render_tree::Node>& border_node,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder,
-      float opacity, bool opacity_animated) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder,
+      float opacity, bool opacity_animated);
 
   scoped_refptr<render_tree::Node> RenderAndAnimateOverflow(
       const base::optional<render_tree::RoundedCorners>& rounded_corners,
       const scoped_refptr<render_tree::Node>& border_node,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder,
-      const math::Vector2dF& border_node_offset) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder,
+      const math::Vector2dF& border_node_offset);
 
   // If transform is not "none", wraps a border node in a MatrixTransformNode.
   // If transform is "none", returns the original border node and leaves
   // |border_node_transform| intact.
   scoped_refptr<render_tree::Node> RenderAndAnimateTransform(
       const scoped_refptr<render_tree::Node>& border_node,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder,
-      const math::Vector2dF& border_node_offset) const;
+      render_tree::animations::AnimateNode::Builder* animate_node_builder,
+      const math::Vector2dF& border_node_offset);
 
   // The css_computed_style_declaration_ member references the
   // cssom::CSSComputedStyleDeclaration object owned by the HTML Element from
@@ -681,6 +689,10 @@
   // parameters we were passed during in last call to UpdateSizes().
   base::optional<LayoutParams> last_update_size_params_;
 
+  // Render tree node caching is used to prevent the node from needing to be
+  // recalculated during each call to RenderAndAnimateContent.
+  base::optional<CachedRenderTreeNodeInfo> cached_render_tree_node_info_;
+
   // For write access to parent/containing_block members.
   friend class ContainerBox;
   friend class LayoutBoxes;
diff --git a/src/cobalt/layout/box_generator.cc b/src/cobalt/layout/box_generator.cc
index a2affb9..1f2d803 100644
--- a/src/cobalt/layout/box_generator.cc
+++ b/src/cobalt/layout/box_generator.cc
@@ -317,8 +317,8 @@
 
   scoped_refptr<cssom::CSSComputedStyleDeclaration>
       css_computed_style_declaration = new cssom::CSSComputedStyleDeclaration();
-  css_computed_style_declaration->set_data(
-      GetComputedStyleOfAnonymousBox(br_element->computed_style()));
+  css_computed_style_declaration->SetData(GetComputedStyleOfAnonymousBox(
+      br_element->css_computed_style_declaration()));
 
   css_computed_style_declaration->set_animations(br_element->animations());
 
@@ -802,7 +802,7 @@
   new_data->AssignFrom(*style->data());
   new_data->SetPropertyValue(cssom::kBackgroundColorProperty, NULL);
   new_data->SetPropertyValue(cssom::kBackgroundImageProperty, NULL);
-  new_style->set_data(new_data);
+  new_style->SetData(new_data);
 
   return new_style;
 }
@@ -880,8 +880,8 @@
 void BoxGenerator::Visit(dom::Text* text) {
   scoped_refptr<cssom::CSSComputedStyleDeclaration>
       css_computed_style_declaration = new cssom::CSSComputedStyleDeclaration();
-  css_computed_style_declaration->set_data(GetComputedStyleOfAnonymousBox(
-      parent_css_computed_style_declaration_->data()));
+  css_computed_style_declaration->SetData(
+      GetComputedStyleOfAnonymousBox(parent_css_computed_style_declaration_));
 
   // Copy the animations from the parent.
   css_computed_style_declaration->set_animations(parent_animations_);
diff --git a/src/cobalt/layout/container_box.cc b/src/cobalt/layout/container_box.cc
index 24f72b1..4ee4b0b 100644
--- a/src/cobalt/layout/container_box.cc
+++ b/src/cobalt/layout/container_box.cc
@@ -93,6 +93,9 @@
     split_sibling->GetStackingContext()->are_cross_references_valid_ = false;
   }
 
+  // Invalidate the render tree nodes now that the children have changed.
+  InvalidateRenderTreeNodesOfBoxAndAncestors();
+
   return split_sibling_position;
 }
 
@@ -138,6 +141,9 @@
       !non_negative_z_index_child_.empty()) {
     are_cross_references_valid_ = false;
   }
+
+  // Invalidate the render tree nodes now that the children have changed.
+  InvalidateRenderTreeNodesOfBoxAndAncestors();
 }
 
 // Returns true if the given style allows a container box to act as a containing
@@ -471,8 +477,6 @@
 void ContainerBox::RenderAndAnimateStackingContextChildren(
     const ZIndexSortedList& z_index_child_list,
     render_tree::CompositionNode::Builder* content_node_builder,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animations_map_builder,
     const Vector2dLayoutUnit& offset_from_parent_node) const {
   // Render all children of the passed in list in sorted order.
   for (ZIndexSortedList::const_iterator iter = z_index_child_list.begin();
@@ -484,8 +488,7 @@
         GetOffsetFromStackingContextToContainingBlock(child_box) +
         offset_from_parent_node;
 
-    child_box->RenderAndAnimate(content_node_builder,
-                                node_animations_map_builder, position_offset);
+    child_box->RenderAndAnimate(content_node_builder, position_offset);
   }
 }
 
@@ -552,9 +555,7 @@
 }
 
 void ContainerBox::RenderAndAnimateContent(
-    render_tree::CompositionNode::Builder* border_node_builder,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animations_map_builder) const {
+    render_tree::CompositionNode::Builder* border_node_builder) const {
   // Ensure that the cross references are up to date.
   const_cast<ContainerBox*>(this)->UpdateCrossReferences();
 
@@ -564,22 +565,19 @@
   // z-index values.
   //   https://www.w3.org/TR/CSS21/visuren.html#z-index
   RenderAndAnimateStackingContextChildren(
-      negative_z_index_child_, border_node_builder, node_animations_map_builder,
-      content_box_offset);
+      negative_z_index_child_, border_node_builder, content_box_offset);
   // Render laid out child boxes.
   for (Boxes::const_iterator child_box_iterator = child_boxes_.begin();
        child_box_iterator != child_boxes_.end(); ++child_box_iterator) {
     Box* child_box = *child_box_iterator;
     if (!child_box->IsPositioned() && !child_box->IsTransformed()) {
-      child_box->RenderAndAnimate(
-          border_node_builder, node_animations_map_builder, content_box_offset);
+      child_box->RenderAndAnimate(border_node_builder, content_box_offset);
     }
   }
   // Render all positioned children with non-negative z-index values.
   //   https://www.w3.org/TR/CSS21/visuren.html#z-index
   RenderAndAnimateStackingContextChildren(
-      non_negative_z_index_child_, border_node_builder,
-      node_animations_map_builder, content_box_offset);
+      non_negative_z_index_child_, border_node_builder, content_box_offset);
 }
 
 #ifdef COBALT_BOX_DUMP_ENABLED
diff --git a/src/cobalt/layout/container_box.h b/src/cobalt/layout/container_box.h
index 31aba2b..2a13c91 100644
--- a/src/cobalt/layout/container_box.h
+++ b/src/cobalt/layout/container_box.h
@@ -62,10 +62,8 @@
   ContainerBox* AsContainerBox() OVERRIDE;
   const ContainerBox* AsContainerBox() const OVERRIDE;
 
-  void RenderAndAnimateContent(
-      render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const OVERRIDE;
+  void RenderAndAnimateContent(render_tree::CompositionNode::Builder*
+                                   border_node_builder) const OVERRIDE;
 
 #ifdef COBALT_BOX_DUMP_ENABLED
   void DumpChildrenWithIndent(std::ostream* stream, int indent) const OVERRIDE;
@@ -167,8 +165,6 @@
   void RenderAndAnimateStackingContextChildren(
       const ZIndexSortedList& z_index_child_list,
       render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder,
       const Vector2dLayoutUnit& offset_from_parent_node) const;
 
   // A list of our direct children.  If a box is one of our child boxes, we
diff --git a/src/cobalt/layout/initial_containing_block.cc b/src/cobalt/layout/initial_containing_block.cc
index 7c22f89..6bf5891 100644
--- a/src/cobalt/layout/initial_containing_block.cc
+++ b/src/cobalt/layout/initial_containing_block.cc
@@ -98,7 +98,7 @@
 
   scoped_refptr<cssom::CSSComputedStyleDeclaration> initial_style_state =
       new cssom::CSSComputedStyleDeclaration();
-  initial_style_state->set_data(initial_containing_block_style);
+  initial_style_state->SetData(initial_containing_block_style);
   initial_style_state->set_animations(new web_animations::AnimationSet());
 
   results.box = make_scoped_refptr(new BlockLevelBlockContainerBox(
diff --git a/src/cobalt/layout/inline_container_box.cc b/src/cobalt/layout/inline_container_box.cc
index 062bc6e..4ce8255 100644
--- a/src/cobalt/layout/inline_container_box.cc
+++ b/src/cobalt/layout/inline_container_box.cc
@@ -222,10 +222,17 @@
   return false;
 }
 
-void InlineContainerBox::ResetEllipses() {
+void InlineContainerBox::DoPreEllipsisPlacementProcessing() {
   for (Boxes::const_iterator child_box_iterator = child_boxes().begin();
        child_box_iterator != child_boxes().end(); ++child_box_iterator) {
-    (*child_box_iterator)->ResetEllipses();
+    (*child_box_iterator)->DoPreEllipsisPlacementProcessing();
+  }
+}
+
+void InlineContainerBox::DoPostEllipsisPlacementProcessing() {
+  for (Boxes::const_iterator child_box_iterator = child_boxes().begin();
+       child_box_iterator != child_boxes().end(); ++child_box_iterator) {
+    (*child_box_iterator)->DoPostEllipsisPlacementProcessing();
   }
 }
 
diff --git a/src/cobalt/layout/inline_container_box.h b/src/cobalt/layout/inline_container_box.h
index 8c873a0..6444c0e 100644
--- a/src/cobalt/layout/inline_container_box.h
+++ b/src/cobalt/layout/inline_container_box.h
@@ -58,7 +58,8 @@
   Box* GetSplitSibling() const OVERRIDE;
 
   bool DoesFulfillEllipsisPlacementRequirement() const OVERRIDE;
-  void ResetEllipses() OVERRIDE;
+  void DoPreEllipsisPlacementProcessing() OVERRIDE;
+  void DoPostEllipsisPlacementProcessing() OVERRIDE;
 
   bool TrySplitAtSecondBidiLevelRun() OVERRIDE;
   base::optional<int> GetBidiLevel() const OVERRIDE;
diff --git a/src/cobalt/layout/inline_level_replaced_box.cc b/src/cobalt/layout/inline_level_replaced_box.cc
index 8603e7d..9d6072c 100644
--- a/src/cobalt/layout/inline_level_replaced_box.cc
+++ b/src/cobalt/layout/inline_level_replaced_box.cc
@@ -35,7 +35,8 @@
                   text_position, maybe_intrinsic_width, maybe_intrinsic_height,
                   maybe_intrinsic_ratio, used_style_provider,
                   layout_stat_tracker),
-      is_hidden_by_ellipsis_(false) {}
+      is_hidden_by_ellipsis_(false),
+      was_hidden_by_ellipsis_(false) {}
 
 Box::Level InlineLevelReplacedBox::GetLevel() const { return kInlineLevel; }
 
@@ -46,7 +47,16 @@
   return true;
 }
 
-void InlineLevelReplacedBox::ResetEllipses() { is_hidden_by_ellipsis_ = false; }
+void InlineLevelReplacedBox::DoPreEllipsisPlacementProcessing() {
+  was_hidden_by_ellipsis_ = is_hidden_by_ellipsis_;
+  is_hidden_by_ellipsis_ = false;
+}
+
+void InlineLevelReplacedBox::DoPostEllipsisPlacementProcessing() {
+  if (was_hidden_by_ellipsis_ != is_hidden_by_ellipsis_) {
+    InvalidateRenderTreeNodesOfBoxAndAncestors();
+  }
+}
 
 bool InlineLevelReplacedBox::IsHiddenByEllipsis() const {
   return is_hidden_by_ellipsis_;
diff --git a/src/cobalt/layout/inline_level_replaced_box.h b/src/cobalt/layout/inline_level_replaced_box.h
index a53c1f6..b0f1a25 100644
--- a/src/cobalt/layout/inline_level_replaced_box.h
+++ b/src/cobalt/layout/inline_level_replaced_box.h
@@ -48,7 +48,8 @@
   Level GetLevel() const OVERRIDE;
 
   bool DoesFulfillEllipsisPlacementRequirement() const OVERRIDE;
-  void ResetEllipses() OVERRIDE;
+  void DoPreEllipsisPlacementProcessing() OVERRIDE;
+  void DoPostEllipsisPlacementProcessing() OVERRIDE;
   bool IsHiddenByEllipsis() const OVERRIDE;
 
  protected:
@@ -76,6 +77,11 @@
   // the applicable edge(s) of the line as necessary to fit the ellipsis."
   //   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
   bool is_hidden_by_ellipsis_;
+  // Tracking of the previous value of |is_hidden_by_ellipsis_|, which allows
+  // for determination of whether or not the value changed during ellipsis
+  // placement. When this occurs, the cached render tree nodes of this box and
+  // its ancestors are invalidated.
+  bool was_hidden_by_ellipsis_;
 };
 
 }  // namespace layout
diff --git a/src/cobalt/layout/layout.cc b/src/cobalt/layout/layout.cc
index 9acfffb..d517a4f 100644
--- a/src/cobalt/layout/layout.cc
+++ b/src/cobalt/layout/layout.cc
@@ -28,7 +28,7 @@
 #include "cobalt/layout/box_generator.h"
 #include "cobalt/layout/initial_containing_block.h"
 #include "cobalt/layout/used_style.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 
 namespace cobalt {
 namespace layout {
@@ -73,8 +73,8 @@
   // Create initial containing block.
   InitialContainingBlockCreationResults
       initial_containing_block_creation_results = CreateInitialContainingBlock(
-          document->initial_computed_style(), document, used_style_provider,
-          layout_stat_tracker);
+          document->initial_computed_style_data(), document,
+          used_style_provider, layout_stat_tracker);
   *initial_containing_block = initial_containing_block_creation_results.box;
 
   // Generate boxes.
@@ -128,7 +128,7 @@
   }
 }
 
-RenderTreeWithAnimations Layout(
+scoped_refptr<render_tree::Node> Layout(
     const icu::Locale& locale, const scoped_refptr<dom::Document>& document,
     UsedStyleProvider* used_style_provider,
     LayoutStatTracker* layout_stat_tracker,
@@ -141,8 +141,6 @@
       line_break_iterator, character_break_iterator, initial_containing_block);
 
   // Add to render tree.
-  render_tree::animations::NodeAnimationsMap::Builder
-      node_animations_map_builder;
   render_tree::CompositionNode::Builder render_tree_root_builder;
   {
     TRACE_EVENT0("cobalt::layout", kBenchmarkStatRenderAndAnimate);
@@ -151,14 +149,18 @@
         base::StopWatch::kAutoStartOn, layout_stat_tracker);
 
     (*initial_containing_block)
-        ->RenderAndAnimate(&render_tree_root_builder,
-                           &node_animations_map_builder, math::Vector2dF(0, 0));
+        ->RenderAndAnimate(&render_tree_root_builder, math::Vector2dF(0, 0));
   }
 
-  return RenderTreeWithAnimations(
-      new render_tree::CompositionNode(render_tree_root_builder.Pass()),
-      new render_tree::animations::NodeAnimationsMap(
-          node_animations_map_builder.Pass()));
+  render_tree::CompositionNode* static_root_node =
+      new render_tree::CompositionNode(render_tree_root_builder.Pass());
+
+  // Make it easy to animate the entire tree by placing an AnimateNode at the
+  // root to merge any sub-AnimateNodes.
+  render_tree::animations::AnimateNode* animate_node =
+      new render_tree::animations::AnimateNode(static_root_node);
+
+  return animate_node;
 }
 
 }  // namespace layout
diff --git a/src/cobalt/layout/layout.h b/src/cobalt/layout/layout.h
index 9b8bf8e..d9cdf7a 100644
--- a/src/cobalt/layout/layout.h
+++ b/src/cobalt/layout/layout.h
@@ -21,7 +21,7 @@
 #include "cobalt/layout/block_formatting_block_container_box.h"
 #include "cobalt/loader/image/image_cache.h"
 #include "cobalt/math/size_f.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/node.h"
 #include "cobalt/render_tree/resource_provider.h"
 #include "third_party/icu/public/common/unicode/brkiter.h"
@@ -40,17 +40,6 @@
 // (https://www.w3.org/TR/CSS2/visuren.html) as recommended by a newer draft
 // (http://dev.w3.org/csswg/css-box/) which is undergoing active changes.
 
-struct RenderTreeWithAnimations {
-  RenderTreeWithAnimations(
-      const scoped_refptr<render_tree::Node>& render_tree,
-      const scoped_refptr<render_tree::animations::NodeAnimationsMap>&
-          animations)
-      : render_tree(render_tree), animations(animations) {}
-
-  scoped_refptr<render_tree::Node> render_tree;
-  scoped_refptr<render_tree::animations::NodeAnimationsMap> animations;
-};
-
 // Update the computed styles, then generate and layout the box tree.
 void UpdateComputedStylesAndLayoutBoxTree(
     const icu::Locale& locale, const scoped_refptr<dom::Document>& document,
@@ -63,7 +52,7 @@
 // Main entry point to the layout engine.
 // Produces the render tree (along with corresponding animations) which is a
 // result of recursive layout of the given HTML element.
-RenderTreeWithAnimations Layout(
+scoped_refptr<render_tree::Node> Layout(
     const icu::Locale& locale, const scoped_refptr<dom::Document>& document,
     UsedStyleProvider* used_style_provider,
     LayoutStatTracker* layout_stat_tracker,
diff --git a/src/cobalt/layout/layout_boxes.cc b/src/cobalt/layout/layout_boxes.cc
index 2c65d99..8a95115 100644
--- a/src/cobalt/layout/layout_boxes.cc
+++ b/src/cobalt/layout/layout_boxes.cc
@@ -159,6 +159,17 @@
   }
 }
 
+void LayoutBoxes::InvalidateRenderTreeNodes() {
+  for (Boxes::const_iterator box_iterator = boxes_.begin();
+       box_iterator != boxes_.end(); ++box_iterator) {
+    Box* box = *box_iterator;
+    do {
+      box->InvalidateRenderTreeNodesOfBoxAndAncestors();
+      box = box->GetSplitSibling();
+    } while (box != NULL);
+  }
+}
+
 math::RectF LayoutBoxes::GetBoundingBorderRectangle() const {
   // In the CSSOM View extensions to the HTMLElement interface, at
   // https://www.w3.org/TR/2013/WD-cssom-view-20131217/#extensions-to-the-htmlelement-interface,
diff --git a/src/cobalt/layout/layout_boxes.h b/src/cobalt/layout/layout_boxes.h
index 28708a8..055d1e0 100644
--- a/src/cobalt/layout/layout_boxes.h
+++ b/src/cobalt/layout/layout_boxes.h
@@ -58,6 +58,7 @@
 
   void InvalidateSizes() OVERRIDE;
   void InvalidateCrossReferences() OVERRIDE;
+  void InvalidateRenderTreeNodes() OVERRIDE;
 
   // Other
   //
diff --git a/src/cobalt/layout/layout_manager.cc b/src/cobalt/layout/layout_manager.cc
index b92c47b..c0fb5c6 100644
--- a/src/cobalt/layout/layout_manager.cc
+++ b/src/cobalt/layout/layout_manager.cc
@@ -239,7 +239,7 @@
       TRACE_EVENT_BEGIN0("cobalt::layout", kBenchmarkStatLayout);
     }
 
-    RenderTreeWithAnimations render_tree_with_animations = layout::Layout(
+    scoped_refptr<render_tree::Node> render_tree_root = layout::Layout(
         locale_, window_->document(), used_style_provider_.get(),
         layout_stat_tracker_, line_break_iterator_.get(),
         character_break_iterator_.get(), &initial_containing_block_);
@@ -251,11 +251,9 @@
     }
 #endif  // ENABLE_TEST_RUNNER
     if (run_on_render_tree_produced_callback) {
-      on_render_tree_produced_callback_.Run(
-          LayoutResults(render_tree_with_animations.render_tree,
-                        render_tree_with_animations.animations,
-                        base::TimeDelta::FromMillisecondsD(
-                            *document->timeline()->current_time())));
+      on_render_tree_produced_callback_.Run(LayoutResults(
+          render_tree_root, base::TimeDelta::FromMillisecondsD(
+                                *document->timeline()->current_time())));
     }
 
     layout_dirty_ = false;
diff --git a/src/cobalt/layout/layout_manager.h b/src/cobalt/layout/layout_manager.h
index 4a9b405..39e4eb7 100644
--- a/src/cobalt/layout/layout_manager.h
+++ b/src/cobalt/layout/layout_manager.h
@@ -25,7 +25,6 @@
 #include "cobalt/dom/window.h"
 #include "cobalt/layout/layout_stat_tracker.h"
 #include "cobalt/loader/image/image_cache.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
 #include "cobalt/render_tree/node.h"
 #include "cobalt/render_tree/resource_provider.h"
 
@@ -37,19 +36,15 @@
  public:
   struct LayoutResults {
     LayoutResults(const scoped_refptr<render_tree::Node>& render_tree,
-                  const scoped_refptr<
-                      render_tree::animations::NodeAnimationsMap>& animations,
                   const base::TimeDelta& layout_time)
         : render_tree(render_tree),
-          animations(animations),
           layout_time(layout_time) {}
 
     // The render tree produced by a layout.
     scoped_refptr<render_tree::Node> render_tree;
-    // Animations that are to be applied to the layout's render tree.
-    scoped_refptr<render_tree::animations::NodeAnimationsMap> animations;
+
     // The time that the render tree was created, which will be used as a
-    // reference point for updating the animations specified above.
+    // reference point for updating the animations in the above render tree.
     base::TimeDelta layout_time;
   };
 
diff --git a/src/cobalt/layout/render_tree_animations.h b/src/cobalt/layout/render_tree_animations.h
index 07121eb..0c8a862 100644
--- a/src/cobalt/layout/render_tree_animations.h
+++ b/src/cobalt/layout/render_tree_animations.h
@@ -33,6 +33,15 @@
 // a convenience function that can be used by code that creates render tree
 // nodes (e.g. layout box tree processing).
 
+// This callback function defines a function that is expected to populate a
+// given CSS style object for a render tree node type.
+class PopulateBaseStyleForRenderTreeNode {
+ public:
+  typedef base::Callback<void(
+      const scoped_refptr<const cssom::CSSComputedStyleData>&,
+      const scoped_refptr<cssom::CSSComputedStyleData>&)> Function;
+};
+
 // This callback function defines a function that is expected to apply a given
 // CSS style to a render tree node builder object.  A function meeting this
 // specification can be passed into AddAnimations() in order to
@@ -47,16 +56,16 @@
       typename T::Builder*)> Function;
 };
 
-// Helper function that applies a animation set to a base style to produce
+// Helper function that applies an animation set to a base style to produce
 // an animated style that is then passed into the provided
 // ApplyStyleToRenderTreeNode<T>::Function callback function.
 template <typename T>
-void AnimateNode(const typename ApplyStyleToRenderTreeNode<T>::Function&
-                     apply_style_function,
-                 const web_animations::BakedAnimationSet& animations,
-                 const scoped_refptr<cssom::CSSComputedStyleData>& base_style,
-                 typename T::Builder* node_builder,
-                 base::TimeDelta time_elapsed) {
+void ApplyAnimation(
+    const typename ApplyStyleToRenderTreeNode<T>::Function&
+        apply_style_function,
+    const web_animations::BakedAnimationSet& animations,
+    const scoped_refptr<cssom::CSSComputedStyleData>& base_style,
+    typename T::Builder* node_builder, base::TimeDelta time_elapsed) {
   scoped_refptr<cssom::CSSComputedStyleData> animated_style =
       new cssom::CSSComputedStyleData();
   animated_style->AssignFrom(*base_style);
@@ -65,26 +74,30 @@
 }
 
 // If animations exist, this function will add an animation which represents
-// the animations to the passed in NodeAnimationsMap.  The animation will
+// the animations to the passed in ApplyAnimation.  The animation will
 // target the passed in render tree node.
 template <typename T>
 void AddAnimations(
+    const typename PopulateBaseStyleForRenderTreeNode::Function&
+        populate_base_style_function,
     const typename ApplyStyleToRenderTreeNode<T>::Function&
         apply_style_function,
     const cssom::CSSComputedStyleDeclaration& css_computed_style_declaration,
     const scoped_refptr<T>& target_node,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animation_map_builder) {
+    render_tree::animations::AnimateNode::Builder* node_animation_map_builder) {
   DCHECK(!css_computed_style_declaration.animations()->IsEmpty());
-  scoped_refptr<cssom::CSSComputedStyleData> base_style_copy =
+
+  // Populate the base style.
+  scoped_refptr<cssom::CSSComputedStyleData> base_style =
       new cssom::CSSComputedStyleData();
-  base_style_copy->AssignFrom(*css_computed_style_declaration.data());
+  populate_base_style_function.Run(css_computed_style_declaration.data(),
+                                   base_style);
 
   node_animation_map_builder->Add(
-      target_node, base::Bind(&AnimateNode<T>, apply_style_function,
+      target_node, base::Bind(&ApplyAnimation<T>, apply_style_function,
                               web_animations::BakedAnimationSet(
                                   *css_computed_style_declaration.animations()),
-                              base_style_copy));
+                              base_style));
 }
 
 }  // namespace layout
diff --git a/src/cobalt/layout/replaced_box.cc b/src/cobalt/layout/replaced_box.cc
index 62b771f..15f0d6a 100644
--- a/src/cobalt/layout/replaced_box.cc
+++ b/src/cobalt/layout/replaced_box.cc
@@ -46,7 +46,7 @@
 namespace cobalt {
 namespace layout {
 
-using render_tree::animations::NodeAnimationsMap;
+using render_tree::animations::AnimateNode;
 using render_tree::CompositionNode;
 using render_tree::ImageNode;
 using render_tree::PunchThroughVideoNode;
@@ -239,8 +239,7 @@
 }  // namespace
 
 void ReplacedBox::RenderAndAnimateContent(
-    CompositionNode::Builder* border_node_builder,
-    NodeAnimationsMap::Builder* node_animations_map_builder) const {
+    CompositionNode::Builder* border_node_builder) const {
   if (computed_style()->visibility() != cssom::KeywordValue::GetVisible()) {
     return;
   }
@@ -257,11 +256,13 @@
   scoped_refptr<CompositionNode> composition_node =
       new CompositionNode(composition_node_builder);
 
-  node_animations_map_builder->Add(
+  AnimateNode::Builder animate_node_builder;
+  animate_node_builder.Add(
       composition_node,
       base::Bind(AnimateCB, replace_image_cb_, content_box_size()));
 
-  border_node_builder->AddChild(composition_node);
+  border_node_builder->AddChild(
+      new AnimateNode(animate_node_builder, composition_node));
 }
 
 void ReplacedBox::UpdateContentSizeAndMargins(
diff --git a/src/cobalt/layout/replaced_box.h b/src/cobalt/layout/replaced_box.h
index f503db3..259b2d0 100644
--- a/src/cobalt/layout/replaced_box.h
+++ b/src/cobalt/layout/replaced_box.h
@@ -76,10 +76,8 @@
   // From |Box|.
   void UpdateContentSizeAndMargins(const LayoutParams& layout_params) OVERRIDE;
 
-  void RenderAndAnimateContent(
-      render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const OVERRIDE;
+  void RenderAndAnimateContent(render_tree::CompositionNode::Builder*
+                                   border_node_builder) const OVERRIDE;
 
   bool IsTransformable() const OVERRIDE { return true; }
 
diff --git a/src/cobalt/layout/text_box.cc b/src/cobalt/layout/text_box.cc
index 84e5823..1b4e96e 100644
--- a/src/cobalt/layout/text_box.cc
+++ b/src/cobalt/layout/text_box.cc
@@ -46,6 +46,7 @@
       text_start_position_(text_start_position),
       text_end_position_(text_end_position),
       truncated_text_end_position_(text_end_position),
+      previous_truncated_text_end_position_(text_end_position),
       truncated_text_offset_from_left_(0),
       used_font_(used_style_provider->GetUsedFontList(
           css_computed_style_declaration->data()->font_family(),
@@ -225,10 +226,17 @@
   return GetNonCollapsedTextStartPosition() < GetNonCollapsedTextEndPosition();
 }
 
-void TextBox::ResetEllipses() {
+void TextBox::DoPreEllipsisPlacementProcessing() {
+  previous_truncated_text_end_position_ = truncated_text_end_position_;
   truncated_text_end_position_ = text_end_position_;
 }
 
+void TextBox::DoPostEllipsisPlacementProcessing() {
+  if (previous_truncated_text_end_position_ != truncated_text_end_position_) {
+    InvalidateRenderTreeNodesOfBoxAndAncestors();
+  }
+}
+
 void TextBox::SplitBidiLevelRuns() {}
 
 bool TextBox::TrySplitAtSecondBidiLevelRun() {
@@ -299,6 +307,14 @@
 }
 
 namespace {
+void PopulateBaseStyleForTextNode(
+    const scoped_refptr<const cssom::CSSComputedStyleData>& source_style,
+    const scoped_refptr<cssom::CSSComputedStyleData>& destination_style) {
+  // NOTE: Properties set by PopulateBaseStyleForTextNode() should match the
+  // properties used by SetupTextNodeFromStyle().
+  destination_style->set_color(source_style->color());
+}
+
 void SetupTextNodeFromStyle(
     const scoped_refptr<const cssom::CSSComputedStyleData>& style,
     render_tree::TextNode::Builder* text_node_builder) {
@@ -340,11 +356,7 @@
 }  // namespace
 
 void TextBox::RenderAndAnimateContent(
-    render_tree::CompositionNode::Builder* border_node_builder,
-    render_tree::animations::NodeAnimationsMap::Builder*
-        node_animations_map_builder) const {
-  UNREFERENCED_PARAMETER(node_animations_map_builder);
-
+    render_tree::CompositionNode::Builder* border_node_builder) const {
   if (computed_style()->visibility() != cssom::KeywordValue::GetVisible()) {
     return;
   }
@@ -376,23 +388,15 @@
         text_shadow != cssom::KeywordValue::GetNone()) {
       int32 text_start_position = GetNonCollapsedTextStartPosition();
       int32 text_length = GetVisibleTextLength();
-      // Generate the glyph buffer if it does not already exist or the position
-      // it covers has changed. Otherwise, just use the cached glyph buffer.
-      if (!cached_glyph_buffer_info_.glyph_buffer ||
-          text_start_position != cached_glyph_buffer_info_.start_position ||
-          text_length != cached_glyph_buffer_info_.length) {
-        cached_glyph_buffer_info_.start_position = text_start_position;
-        cached_glyph_buffer_info_.length = text_length;
-        cached_glyph_buffer_info_.glyph_buffer = used_font_->CreateGlyphBuffer(
-            paragraph_->GetTextBuffer() +
-                cached_glyph_buffer_info_.start_position,
-            cached_glyph_buffer_info_.length,
-            paragraph_->IsRTL(text_start_position));
-      }
+
+      scoped_refptr<render_tree::GlyphBuffer> glyph_buffer =
+          used_font_->CreateGlyphBuffer(
+              paragraph_->GetTextBuffer() + text_start_position, text_length,
+              paragraph_->IsRTL(text_start_position));
 
       render_tree::TextNode::Builder text_node_builder(
           math::Vector2dF(truncated_text_offset_from_left_, ascent_),
-          cached_glyph_buffer_info_.glyph_buffer, used_color);
+          glyph_buffer, used_color);
 
       if (text_shadow != cssom::KeywordValue::GetNone()) {
         cssom::PropertyListValue* shadow_list =
@@ -407,13 +411,20 @@
 
       // The render tree API considers text coordinates to be a position
       // of a baseline, offset the text node accordingly.
-      border_node_builder->AddChild(text_node);
+      scoped_refptr<render_tree::Node> node_to_add;
       if (is_color_animated) {
+        render_tree::animations::AnimateNode::Builder animate_node_builder;
         AddAnimations<render_tree::TextNode>(
+            base::Bind(&PopulateBaseStyleForTextNode),
             base::Bind(&SetupTextNodeFromStyle),
             *css_computed_style_declaration(), text_node,
-            node_animations_map_builder);
+            &animate_node_builder);
+        node_to_add = new render_tree::animations::AnimateNode(
+            animate_node_builder, text_node);
+      } else {
+        node_to_add = text_node;
       }
+      border_node_builder->AddChild(node_to_add);
     }
   }
 }
diff --git a/src/cobalt/layout/text_box.h b/src/cobalt/layout/text_box.h
index 792e5a7..dc55439 100644
--- a/src/cobalt/layout/text_box.h
+++ b/src/cobalt/layout/text_box.h
@@ -57,7 +57,8 @@
   Box* GetSplitSibling() const OVERRIDE;
 
   bool DoesFulfillEllipsisPlacementRequirement() const OVERRIDE;
-  void ResetEllipses() OVERRIDE;
+  void DoPreEllipsisPlacementProcessing() OVERRIDE;
+  void DoPostEllipsisPlacementProcessing() OVERRIDE;
 
   void SplitBidiLevelRuns() OVERRIDE;
   bool TrySplitAtSecondBidiLevelRun() OVERRIDE;
@@ -82,10 +83,8 @@
 
  protected:
   // From |Box|.
-  void RenderAndAnimateContent(
-      render_tree::CompositionNode::Builder* border_node_builder,
-      render_tree::animations::NodeAnimationsMap::Builder*
-          node_animations_map_builder) const OVERRIDE;
+  void RenderAndAnimateContent(render_tree::CompositionNode::Builder*
+                                   border_node_builder) const OVERRIDE;
   bool IsTransformable() const OVERRIDE;
 
 #ifdef COBALT_BOX_DUMP_ENABLED
@@ -95,14 +94,6 @@
 #endif  // COBALT_BOX_DUMP_ENABLED
 
  private:
-  struct CachedGlyphBufferInfo {
-    CachedGlyphBufferInfo() : start_position(-1), length(0) {}
-
-    scoped_refptr<render_tree::GlyphBuffer> glyph_buffer;
-    int32 start_position;
-    int32 length;
-  };
-
   // From |Box|.
   void DoPlaceEllipsisOrProcessPlacedEllipsis(
       BaseDirection base_direction, LayoutUnit desired_offset,
@@ -162,6 +153,11 @@
   // the applicable edge(s) of the line as necessary to fit the ellipsis."
   //   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
   int32 truncated_text_end_position_;
+  // Tracking of the previous value of |truncated_text_end_position_|, which
+  // allows for determination of whether or not the value changed during
+  // ellipsis placement. When this occurs, the cached render tree nodes of this
+  // box and its ancestors are invalidated.
+  int32 previous_truncated_text_end_position_;
   // The horizontal offset to apply to rendered text as a result of an ellipsis
   // truncating the text. This value can be non-zero when the text box is in a
   // line with a right-to-left base direction. In this case, when an ellipsis is
@@ -197,11 +193,6 @@
   // The width of the portion of the text that is unaffected by whitespace
   // collapsing.
   base::optional<LayoutUnit> non_collapsible_text_width_;
-
-  // Glyph buffer caching is used to prevent it from needing to be recalculated
-  // during each call to RenderAndAnimateContent. It is mutable as a result of
-  // RenderAndAnimateContent being const.
-  mutable CachedGlyphBufferInfo cached_glyph_buffer_info_;
 };
 
 }  // namespace layout
diff --git a/src/cobalt/layout_tests/layout_benchmarks.cc b/src/cobalt/layout_tests/layout_benchmarks.cc
index 99e088d..164741c 100644
--- a/src/cobalt/layout_tests/layout_benchmarks.cc
+++ b/src/cobalt/layout_tests/layout_benchmarks.cc
@@ -62,9 +62,8 @@
     samples_to_gather_ = samples_to_gather;
     done_gathering_samples_.Reset();
 
-    renderer::Submission submission_with_callback(
-        layout_results.render_tree, layout_results.animations,
-        layout_results.layout_time);
+    renderer::Submission submission_with_callback(layout_results.render_tree,
+                                                  layout_results.layout_time);
     submission_with_callback.on_rasterized_callback = base::Bind(
         &RendererBenchmarkRunner::OnSubmitComplete, base::Unretained(this));
 
@@ -156,7 +155,7 @@
   layout_samples_[layout::kBenchmarkStatUpdateCrossReferences];
   layout_samples_[layout::kBenchmarkStatUpdateUsedSizes];
   layout_samples_[layout::kBenchmarkStatRenderAndAnimate];
-  renderer_samples_["NodeAnimationsMap::Apply()"];
+  renderer_samples_["AnimateNode::Apply()"];
   renderer_samples_["VisitRenderTree"];
   renderer_samples_["Skia Flush"];
 }
diff --git a/src/cobalt/layout_tests/layout_snapshot.cc b/src/cobalt/layout_tests/layout_snapshot.cc
index b07abfc..97b7689 100644
--- a/src/cobalt/layout_tests/layout_snapshot.cc
+++ b/src/cobalt/layout_tests/layout_snapshot.cc
@@ -41,8 +41,7 @@
     base::optional<browser::WebModule::LayoutResults>* out_results,
     base::RunLoop* run_loop, MessageLoop* message_loop,
     const browser::WebModule::LayoutResults& results) {
-  out_results->emplace(results.render_tree, results.animations,
-                       results.layout_time);
+  out_results->emplace(results.render_tree, results.layout_time);
   message_loop->PostTask(FROM_HERE, base::Bind(Quit, run_loop));
 }
 
diff --git a/src/cobalt/layout_tests/layout_tests.cc b/src/cobalt/layout_tests/layout_tests.cc
index 5a822d1..9ceb258 100644
--- a/src/cobalt/layout_tests/layout_tests.cc
+++ b/src/cobalt/layout_tests/layout_tests.cc
@@ -24,6 +24,7 @@
 #include "cobalt/layout_tests/layout_snapshot.h"
 #include "cobalt/layout_tests/test_parser.h"
 #include "cobalt/math/size.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/renderer/render_tree_pixel_tester.h"
 #include "googleurl/src/gurl.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -88,8 +89,13 @@
   browser::WebModule::LayoutResults layout_results = SnapshotURL(
       GetParam().url, viewport_size, pixel_tester.GetResourceProvider());
 
-  bool results = pixel_tester.TestTree(layout_results.render_tree,
-                                       GetParam().base_file_path);
+  render_tree::animations::AnimateNode* animated_node =
+      base::polymorphic_downcast<render_tree::animations::AnimateNode*>(
+          layout_results.render_tree.get());
+
+  bool results =
+      pixel_tester.TestTree(animated_node->Apply(layout_results.layout_time),
+                            GetParam().base_file_path);
   EXPECT_TRUE(results);
 
   if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kRebaseline) ||
diff --git a/src/cobalt/layout_tests/web_platform_tests.cc b/src/cobalt/layout_tests/web_platform_tests.cc
index 42dbc90..0c28e1a 100644
--- a/src/cobalt/layout_tests/web_platform_tests.cc
+++ b/src/cobalt/layout_tests/web_platform_tests.cc
@@ -123,8 +123,7 @@
     base::optional<browser::WebModule::LayoutResults>* out_results,
     base::RunLoop* run_loop, MessageLoop* message_loop,
     const browser::WebModule::LayoutResults& results) {
-  out_results->emplace(results.render_tree, results.animations,
-                       results.layout_time);
+  out_results->emplace(results.render_tree, results.layout_time);
   message_loop->PostTask(FROM_HERE, base::Bind(Quit, run_loop));
 }
 
diff --git a/src/cobalt/media/sandbox/media_sandbox.cc b/src/cobalt/media/sandbox/media_sandbox.cc
index e3859b0..4f3a1a3 100644
--- a/src/cobalt/media/sandbox/media_sandbox.cc
+++ b/src/cobalt/media/sandbox/media_sandbox.cc
@@ -24,7 +24,7 @@
 #include "cobalt/math/size.h"
 #include "cobalt/math/size_f.h"
 #include "cobalt/network/network_module.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/image_node.h"
 #include "cobalt/render_tree/resource_provider.h"
 #include "cobalt/renderer/pipeline.h"
@@ -85,7 +85,7 @@
   renderer_module_.reset(
       new renderer::RendererModule(system_window_.get(), renderer_options));
   MediaModule::Options media_module_options;
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   CommandLine* command_line = CommandLine::ForCurrentProcess();
   // Use string literals directly to avoid dependency on browser::switches.
   if (command_line->HasSwitch("audio_decoder_stub")) {
@@ -97,7 +97,7 @@
   if (command_line->HasSwitch("video_decoder_stub")) {
     media_module_options.use_video_decoder_stub = true;
   }
-#endif  // defined(ENABLE_COMMAND_LINE_SWITCHES)
+#endif  // defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 
   media_module_ =
       MediaModule::Create(renderer_module_->render_target()->GetSize(),
@@ -124,16 +124,15 @@
 void MediaSandbox::Impl::SetupAndSubmitScene() {
     scoped_refptr<render_tree::ImageNode> image_node =
         new render_tree::ImageNode(NULL);
-    render_tree::animations::NodeAnimationsMap::Builder
-        node_animations_map_builder;
+    render_tree::animations::AnimateNode::Builder animate_node_builder;
 
-    node_animations_map_builder.Add(
+    animate_node_builder.Add(
         image_node, base::Bind(&Impl::AnimateCB, base::Unretained(this)));
 
-    renderer_module_->pipeline()->Submit(renderer::Submission(
-        image_node, new render_tree::animations::NodeAnimationsMap(
-                        node_animations_map_builder.Pass()),
-        base::TimeDelta()));
+    renderer_module_->pipeline()->Submit(
+        renderer::Submission(new render_tree::animations::AnimateNode(
+                                 animate_node_builder, image_node),
+                             base::TimeDelta()));
 }
 
 MediaSandbox::MediaSandbox(int argc, char** argv,
diff --git a/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc b/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc
index b5ab128..724287e 100644
--- a/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc
+++ b/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc
@@ -192,9 +192,11 @@
     scoped_ptr<ShellRawVideoDecoder> decoder =
         media_sandbox_->GetMediaModule()->GetRawVideoDecoderFactory()->Create(
             demuxer->config(), NULL, false);
-    DCHECK(decoder);
-    VideoDecoderFuzzer decoder_fuzzer(fuzzing_content, demuxer, decoder.get());
-    decoder_fuzzer.Fuzz();
+    if (decoder) {
+      VideoDecoderFuzzer decoder_fuzzer(fuzzing_content, demuxer,
+                                        decoder.get());
+      decoder_fuzzer.Fuzz();
+    }
   }
 
  private:
diff --git a/src/cobalt/media/shell_media_platform_starboard.cc b/src/cobalt/media/shell_media_platform_starboard.cc
index 6278203..096b670 100644
--- a/src/cobalt/media/shell_media_platform_starboard.cc
+++ b/src/cobalt/media/shell_media_platform_starboard.cc
@@ -57,7 +57,8 @@
               kGPUMemoryBufferBudget);
     gpu_memory_pool_.reset(new nb::MemoryPool(
         gpu_memory_buffer_space_->GetMemory(),
-        gpu_memory_buffer_space_->GetSizeInBytes(), true /* thread_safe */));
+        gpu_memory_buffer_space_->GetSizeInBytes(), true, /* thread_safe */
+        true /* verify_full_capacity */));
   }
 
   DCHECK_LE(0, kMainMemoryBufferBudget > 0);
@@ -66,7 +67,8 @@
   DCHECK(main_memory_buffer_space_);
   main_memory_pool_.reset(new nb::MemoryPool(main_memory_buffer_space_.get(),
                                              kMainMemoryBufferBudget,
-                                             true /* thread_safe */));
+                                             true, /* thread_safe */
+                                             true /* verify_full_capacity */));
 
   ShellBufferFactory::Initialize();
   ShellAudioStreamer::Initialize();
diff --git a/src/cobalt/media/shell_video_data_allocator_common.cc b/src/cobalt/media/shell_video_data_allocator_common.cc
index be0107b..de8af74 100644
--- a/src/cobalt/media/shell_video_data_allocator_common.cc
+++ b/src/cobalt/media/shell_video_data_allocator_common.cc
@@ -89,29 +89,30 @@
   // TODO: Ensure it work with visible_rect with non-zero left and
   // top.  Note that simply add offset to the image buffer may cause alignment
   // issues.
-  gfx::Size visible_size(param.visible_rect().size());
+  gfx::Size plane_size(param.visible_rect().size());
 
   // Create image data descriptor for the frame in I420.
   MultiPlaneImageDataDescriptor descriptor(
       kMultiPlaneImageFormatYUV3PlaneBT709);
   descriptor.AddPlane(
       param.y_data() - frame_buffer->data(),
-      ImageDataDescriptor(visible_size, kPixelFormatY8,
+      ImageDataDescriptor(plane_size, kPixelFormatY8,
                           kAlphaFormatUnpremultiplied, param.y_pitch()));
-  visible_size.SetSize(visible_size.width() / 2, visible_size.height() / 2);
+  plane_size.SetSize(plane_size.width() / 2, plane_size.height() / 2);
   descriptor.AddPlane(
       param.u_data() - frame_buffer->data(),
-      ImageDataDescriptor(visible_size, kPixelFormatU8,
+      ImageDataDescriptor(plane_size, kPixelFormatU8,
                           kAlphaFormatUnpremultiplied, param.uv_pitch()));
   descriptor.AddPlane(
       param.v_data() - frame_buffer->data(),
-      ImageDataDescriptor(visible_size, kPixelFormatV8,
+      ImageDataDescriptor(plane_size, kPixelFormatV8,
                           kAlphaFormatUnpremultiplied, param.uv_pitch()));
 
   scoped_refptr<Image> image =
       resource_provider_->CreateMultiPlaneImageFromRawMemory(
           frame_buffer_common->DetachRawImageMemory(), descriptor);
 
+  gfx::Size visible_size(param.visible_rect().size());
   // The reference of the image is held by the closure that binds ReleaseImage,
   // so it won't be freed before the ReleaseImage is called.
   scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapNativeTexture(
@@ -130,7 +131,7 @@
   // TODO: Ensure it work with visible_rect with non-zero left and
   // top.  Note that simply add offset to the image buffer may cause alignment
   // issues.
-  gfx::Size visible_size(param.visible_rect().size());
+  gfx::Size plane_size(param.visible_rect().size());
 
   intptr_t offset = 0;
   int pitch_in_bytes = param.y_pitch();
@@ -141,12 +142,12 @@
   MultiPlaneImageDataDescriptor descriptor(
       kMultiPlaneImageFormatYUV2PlaneBT709);
   descriptor.AddPlane(
-      offset, ImageDataDescriptor(visible_size, kPixelFormatY8,
+      offset, ImageDataDescriptor(plane_size, kPixelFormatY8,
                                   kAlphaFormatPremultiplied, pitch_in_bytes));
   offset += pitch_in_bytes * param.decoded_height();
-  visible_size.SetSize(visible_size.width() / 2, visible_size.height() / 2);
+  plane_size.SetSize(plane_size.width() / 2, plane_size.height() / 2);
   descriptor.AddPlane(
-      offset, ImageDataDescriptor(visible_size, kPixelFormatUV8,
+      offset, ImageDataDescriptor(plane_size, kPixelFormatUV8,
                                   kAlphaFormatPremultiplied, pitch_in_bytes));
   offset += pitch_in_bytes * param.decoded_height() / 2;
   DCHECK_EQ(offset, pitch_in_bytes * param.decoded_height() * 3 / 2);
@@ -155,6 +156,7 @@
       resource_provider_->CreateMultiPlaneImageFromRawMemory(
           frame_buffer_common->DetachRawImageMemory(), descriptor);
 
+  gfx::Size visible_size(param.visible_rect().size());
   // The reference of the image is held by the closure that binds ReleaseImage,
   // so it won't be freed before the ReleaseImage is called.
   scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapNativeTexture(
diff --git a/src/cobalt/media/shell_video_data_allocator_common.h b/src/cobalt/media/shell_video_data_allocator_common.h
index 03cdbfa..9673ded 100644
--- a/src/cobalt/media/shell_video_data_allocator_common.h
+++ b/src/cobalt/media/shell_video_data_allocator_common.h
@@ -53,9 +53,13 @@
    public:
     explicit FrameBufferCommon(scoped_ptr<RawImageMemory> raw_image_memory);
 
-    uint8* data() const OVERRIDE { return raw_image_memory_->GetMemory(); }
+    uint8* data() const OVERRIDE {
+      return raw_image_memory_ ? raw_image_memory_->GetMemory() : NULL;
+    }
 
-    size_t size() const OVERRIDE { return raw_image_memory_->GetSizeInBytes(); }
+    size_t size() const OVERRIDE {
+      return raw_image_memory_ ? raw_image_memory_->GetSizeInBytes() : 0;
+    }
 
     // Disown the image_data_.
     scoped_ptr<RawImageMemory> DetachRawImageMemory();
diff --git a/src/cobalt/network/switches.cc b/src/cobalt/network/switches.cc
index 83bb9a7..158833f 100644
--- a/src/cobalt/network/switches.cc
+++ b/src/cobalt/network/switches.cc
@@ -20,7 +20,7 @@
 namespace network {
 namespace switches {
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 // Log network events using Chromium's network logger. If a parameter is
 // specified, the parameter shall be interpreted as a file path and the network
 // log will be written into the file. Otherwise, logging will be written to
@@ -30,7 +30,7 @@
 // Corresponds to the levels described in the NetLog::LogLevel enum defined in
 // net/base/net_log.h
 const char kNetLogLevel[] = "net_log_level";
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
 }  // namespace switches
 }  // namespace network
diff --git a/src/cobalt/network/switches.h b/src/cobalt/network/switches.h
index 996c1d5..e95a70d 100644
--- a/src/cobalt/network/switches.h
+++ b/src/cobalt/network/switches.h
@@ -21,10 +21,10 @@
 namespace network {
 namespace switches {
 
-#if defined(ENABLE_COMMAND_LINE_SWITCHES)
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 extern const char kNetLog[];
 extern const char kNetLogLevel[];
-#endif  // ENABLE_COMMAND_LINE_SWITCHES
+#endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
 }  // namespace switches
 }  // namespace network
diff --git a/src/cobalt/render_tree/animations/animate_node.cc b/src/cobalt/render_tree/animations/animate_node.cc
new file mode 100644
index 0000000..d51732a
--- /dev/null
+++ b/src/cobalt/render_tree/animations/animate_node.cc
@@ -0,0 +1,401 @@
+/*
+ * Copyright 2016 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/render_tree/animations/animate_node.h"
+
+#include "base/debug/trace_event.h"
+#include "cobalt/base/enable_if.h"
+#include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/render_tree/child_iterator.h"
+#include "cobalt/render_tree/node_visitor.h"
+
+namespace cobalt {
+namespace render_tree {
+namespace animations {
+
+void AnimateNode::Builder::AddInternal(
+    const scoped_refptr<Node>& target_node,
+    const scoped_refptr<AnimationListBase>& animation_list) {
+  DCHECK(node_animation_map_.find(target_node) == node_animation_map_.end())
+      << "The target render tree node already has an associated animation "
+         "list.";
+
+  node_animation_map_[target_node.get()] = animation_list;
+  node_refs_.push_back(target_node);
+}
+
+void AnimateNode::Builder::Merge(const AnimateNode::Builder& other) {
+#if !defined(NDEBUG)
+  for (InternalMap::const_iterator iter = node_animation_map_.begin();
+       iter != node_animation_map_.end(); ++iter) {
+    DCHECK(other.node_animation_map_.find(iter->first) ==
+           other.node_animation_map_.end())
+        << "Only mutually exclusive AnimateNode::Builders can be merged!";
+  }
+#endif
+  node_animation_map_.insert(other.node_animation_map_.begin(),
+                             other.node_animation_map_.end());
+  node_refs_.insert(node_refs_.end(), other.node_refs_.begin(),
+                    other.node_refs_.end());
+}
+
+// A helper render tree visitor class used to compile sub render-tree
+// animations.  The same instance of the TraverseListBuilder class is reused for
+// traversing all nodes in a tree.  After visiting a render tree,
+// |traverse_list_| will contain a post-order traversal of animated nodes where
+// children are visited from right to left, and this should be reversed to
+// obtain a pre-order traversal of animated nodes where children are visited
+// from left to right, which is much more natural.
+class AnimateNode::TraverseListBuilder : public NodeVisitor {
+ public:
+  TraverseListBuilder(const AnimateNode::Builder::InternalMap& animation_map,
+                      TraverseList* traverse_list)
+      : animation_map_(animation_map), traverse_list_(traverse_list) {}
+
+  void Visit(animations::AnimateNode* animate) OVERRIDE;
+  void Visit(CompositionNode* composition) OVERRIDE { VisitNode(composition); }
+  void Visit(FilterNode* text) OVERRIDE { VisitNode(text); }
+  void Visit(ImageNode* image) OVERRIDE { VisitNode(image); }
+  void Visit(MatrixTransformNode* transform) OVERRIDE { VisitNode(transform); }
+  void Visit(PunchThroughVideoNode* punch_through) OVERRIDE {
+    VisitNode(punch_through);
+  }
+  void Visit(RectNode* rect) OVERRIDE { VisitNode(rect); }
+  void Visit(RectShadowNode* rect) OVERRIDE { VisitNode(rect); }
+  void Visit(TextNode* text) OVERRIDE { VisitNode(text); }
+
+ private:
+  template <typename T>
+  typename base::enable_if<!ChildIterator<T>::has_children>::type VisitNode(
+      T* node);
+
+  template <typename T>
+  typename base::enable_if<ChildIterator<T>::has_children>::type VisitNode(
+      T* node);
+  void ProcessNode(Node* node, bool animated_children);
+
+  // Adds a node to |traverse_list_|, indicating that it or its descendants are
+  // involved in animation.
+  void AddToTraverseList(
+      Node* node, AnimateNode::Builder::InternalMap::const_iterator found);
+
+  // A reference to the mapping from render tree node to animations.
+  const AnimateNode::Builder::InternalMap& animation_map_;
+
+  // A list of nodes that, if reversed, gives a pre-order traversal of only
+  // animated nodes.
+  // |traverse_list_| is the primary output of this visitor class.
+  TraverseList* traverse_list_;
+
+  // Signals to the caller of Visit() that this node was animated and so any
+  // parent nodes should also be added to the traversal list.
+  bool animated_;
+
+  // If non-null, references a node that this visitor's parent should replace
+  // this visitor's associated node with in its list of child nodes.
+  scoped_refptr<Node> replace_with_;
+
+  friend class AnimateNode;
+};
+
+void AnimateNode::TraverseListBuilder::Visit(animations::AnimateNode* animate) {
+  if (!animate->traverse_list_.empty()) {
+    // We merge all the information from this AnimateNode into the one we are
+    // constructing now.  Simply append the sub-AnimateNode to |traverse_list_|,
+    // but reverse it so its finalized pre-order, left to right traversal is
+    // switched to the intermediate format of a post-order, right to left
+    // traversal.
+    size_t start_size = traverse_list_->size();
+    traverse_list_->insert(traverse_list_->end(),
+                           animate->traverse_list_.begin(),
+                           animate->traverse_list_.end());
+    std::reverse(traverse_list_->begin() + static_cast<int64>(start_size),
+                 traverse_list_->end());
+    animated_ = true;
+  } else {
+    animated_ = false;
+  }
+
+  // Now that we have merged the sub-AnimateNode's information with the one
+  // under construction, remove this AnimateNode from the tree in order to
+  // maintain the invariant that an AnimateNode does not contain any
+  // AnimateNode descendants.
+  replace_with_ = animate->source_;
+}
+
+template <typename T>
+typename base::enable_if<!ChildIterator<T>::has_children>::type
+AnimateNode::TraverseListBuilder::VisitNode(T* node) {
+  // If we are dealing with a render tree node that has no children, all we
+  // need to do is call ProcessNode().
+  animated_ = false;
+  replace_with_ = NULL;
+  ProcessNode(node, false);
+}
+
+template <typename T>
+typename base::enable_if<ChildIterator<T>::has_children>::type
+AnimateNode::TraverseListBuilder::VisitNode(T* node) {
+  ChildIterator<T> child_iterator(node, kChildIteratorDirectionBackwards);
+  bool modified_children = false;
+  bool animated_children = false;
+  while (Node* child = child_iterator.GetCurrent()) {
+    child->Accept(this);
+
+    // Mark us as animated if any of our children are animated, so that we make
+    // sure to add ourselves to |traverse_list_|.
+    animated_children |= animated_;
+
+    if (replace_with_) {
+      // If the child node wishes to replace itself with a new node, then
+      // replace it within its parent's child list.
+      child_iterator.ReplaceCurrent(replace_with_);
+      modified_children = true;
+    }
+
+    child_iterator.Next();
+  }
+
+  if (modified_children) {
+    replace_with_ = new T(child_iterator.TakeReplacedChildrenBuilder());
+  } else {
+    replace_with_ = NULL;
+  }
+
+  // Finally, add this node to |traverse_list_| if it is animated either
+  // directly or indirectly (i.e. because its children are animated).
+  animated_ = false;
+  ProcessNode(node, animated_children);
+}
+
+void AnimateNode::TraverseListBuilder::ProcessNode(Node* node,
+                                                   bool animated_children) {
+  // If this node is animated, add it to the |traverse_list_|.
+  AnimateNode::Builder::InternalMap::const_iterator found =
+      animation_map_.find(node);
+  if (animated_children || found != animation_map_.end()) {
+    AddToTraverseList(replace_with_ ? replace_with_.get() : node, found);
+  }
+}
+
+// Adds a node to |traverse_list_| so that it can be quickly
+// found in the future.
+void AnimateNode::TraverseListBuilder::AddToTraverseList(
+    Node* node, AnimateNode::Builder::InternalMap::const_iterator found) {
+  if (found != animation_map_.end()) {
+    traverse_list_->push_back(TraverseListEntry(node, found->second));
+  } else {
+    traverse_list_->push_back(TraverseListEntry(node));
+  }
+  animated_ = true;
+}
+
+// A helper render tree visitor class used to apply compiled sub render-tree
+// animations.  Only one of these visitors is needed to visit an entire render
+// tree.
+class AnimateNode::ApplyVisitor : public NodeVisitor {
+ public:
+  ApplyVisitor(const TraverseList& traverse_list, base::TimeDelta time_offset);
+
+  void Visit(animations::AnimateNode* /* animate */) OVERRIDE {
+    // An invariant of AnimateNodes is that they should never contain descendant
+    // AnimateNodes.
+    NOTREACHED();
+  }
+  // Immediately switch to a templated visitor function.
+  void Visit(CompositionNode* composition) OVERRIDE { VisitNode(composition); }
+  void Visit(FilterNode* text) OVERRIDE { VisitNode(text); }
+  void Visit(ImageNode* image) OVERRIDE { VisitNode(image); }
+  void Visit(MatrixTransformNode* transform) OVERRIDE { VisitNode(transform); }
+  void Visit(PunchThroughVideoNode* punch_through) OVERRIDE {
+    VisitNode(punch_through);
+  }
+  void Visit(RectNode* rect) OVERRIDE { VisitNode(rect); }
+  void Visit(RectShadowNode* rect) OVERRIDE { VisitNode(rect); }
+  void Visit(TextNode* text) OVERRIDE { VisitNode(text); }
+
+  // Returns the animated version of the node last visited.  This is how the
+  // final animated result can be pulled from this visitor.
+  const scoped_refptr<Node>& animated() const { return animated_; }
+
+ private:
+  template <typename T>
+  typename base::enable_if<!ChildIterator<T>::has_children>::type VisitNode(
+      T* node);
+  template <typename T>
+  typename base::enable_if<ChildIterator<T>::has_children>::type VisitNode(
+      T* node);
+  template <typename T>
+  void ApplyAnimations(const TraverseListEntry& entry,
+                       typename T::Builder* builder);
+  TraverseListEntry AdvanceIterator(Node* node);
+
+  // The time offset to be passed in to individual animations.
+  base::TimeDelta time_offset_;
+  // The animated version of the last node visited.
+  scoped_refptr<Node> animated_;
+  // A list of nodes that we are allowed to traverse into (i.e. a traversal that
+  // guides us to animated nodes).  It assumes that a pre-order traversal will
+  // be taken.
+  const TraverseList& traverse_list_;
+  // An iterator pointing to the next valid render tree node to visit.
+  TraverseList::const_iterator iterator_;
+};
+
+AnimateNode::ApplyVisitor::ApplyVisitor(const TraverseList& traverse_list,
+                                        base::TimeDelta time_offset)
+    : time_offset_(time_offset), traverse_list_(traverse_list) {
+  iterator_ = traverse_list_.begin();
+}
+
+template <typename T>
+typename base::enable_if<!ChildIterator<T>::has_children>::type
+AnimateNode::ApplyVisitor::VisitNode(T* node) {
+  TraverseListEntry current_entry = AdvanceIterator(node);
+  // If we don't have any children, then for this node to be visited, we must
+  // have animations.
+  DCHECK(current_entry.animations);
+  typename T::Builder builder(node->data());
+  ApplyAnimations<T>(current_entry, &builder);
+  animated_ = new T(builder);
+}
+
+template <typename T>
+typename base::enable_if<ChildIterator<T>::has_children>::type
+AnimateNode::ApplyVisitor::VisitNode(T* node) {
+  TraverseListEntry current_entry = AdvanceIterator(node);
+
+  // Traverse the child nodes, but only the ones that are on the
+  // |traverse_list_|.  In particular, the next node we are allowed to visit
+  // is the one in the traverse list pointed to by |iterator_->node|.
+  ChildIterator<T> child_iterator(node);
+  bool children_modified = false;
+  while (Node* child = child_iterator.GetCurrent()) {
+    if (iterator_ == traverse_list_.end()) {
+      // If we've reached the end of |traverse_list_| then we are done
+      // iterating and it's time to return.
+      break;
+    }
+
+    if (child == iterator_->node) {
+      // If one of our children is next up on the path to animation, traverse
+      // into it.
+      child->Accept(this);
+      // Traversing into the child means that it was animated, and so replaced
+      // by an animated node while it was visited.  Thus, replace it in the
+      // current node's child list with its animated version.
+      child_iterator.ReplaceCurrent(animated_);
+      children_modified = true;
+    }
+
+    child_iterator.Next();
+  }
+
+  if (current_entry.animations) {
+    base::optional<typename T::Builder> builder;
+    if (children_modified) {
+      // Reuse the modified Builder object from child traversal if one of
+      // our children was animated.
+      builder.emplace(child_iterator.TakeReplacedChildrenBuilder());
+    } else {
+      // Create a fresh copy of the Builder object for this animated node, to
+      // be passed into the animations.
+      builder.emplace(node->data());
+    }
+    ApplyAnimations<T>(current_entry, &(*builder));
+    animated_ = new T(*builder);
+  } else {
+    // If there were no animations targeting this node directly, then its
+    // children must have been modified since otherwise it wouldn't be in
+    // the traverse list.
+    DCHECK(children_modified);
+    animated_ = new T(child_iterator.TakeReplacedChildrenBuilder());
+  }
+}
+
+template <typename T>
+void AnimateNode::ApplyVisitor::ApplyAnimations(const TraverseListEntry& entry,
+                                                typename T::Builder* builder) {
+  TRACE_EVENT0("cobalt::renderer",
+               "AnimateNode::ApplyVisitor::ApplyAnimations()");
+  // Cast to the specific type we expect these animations to have.
+  const AnimationList<T>* typed_node_animations =
+      base::polymorphic_downcast<const AnimationList<T>*>(
+          entry.animations.get());
+
+  // Iterate through each animation applying them one at a time.
+  for (typename AnimationList<T>::InternalList::const_iterator iter =
+           typed_node_animations->data().animations.begin();
+       iter != typed_node_animations->data().animations.end(); ++iter) {
+    iter->Run(builder, time_offset_);
+  }
+}
+
+AnimateNode::TraverseListEntry AnimateNode::ApplyVisitor::AdvanceIterator(
+    Node* node) {
+  // Check that the iterator that we are advancing past is indeed the one we
+  // expect it to be.
+  DCHECK_EQ(node, iterator_->node);
+  return *(iterator_++);
+}
+
+AnimateNode::AnimateNode(const Builder& builder,
+                         const scoped_refptr<Node>& source) {
+  TRACE_EVENT0("cobalt::renderer", "AnimateNode::AnimateNode(builder, source)");
+  CommonInit(builder.node_animation_map_, source);
+}
+
+AnimateNode::AnimateNode(const scoped_refptr<Node>& source) {
+  TRACE_EVENT0("cobalt::renderer", "AnimateNode::AnimateNode(source)");
+  CommonInit(Builder::InternalMap(), source);
+}
+
+scoped_refptr<Node> AnimateNode::Apply(base::TimeDelta time_offset) {
+  TRACE_EVENT0("cobalt::renderer", "AnimateNode::Apply()");
+  if (traverse_list_.empty()) {
+    return source_;
+  } else {
+    ApplyVisitor apply_visitor(traverse_list_, time_offset);
+    source_->Accept(&apply_visitor);
+    return apply_visitor.animated();
+  }
+}
+
+void AnimateNode::CommonInit(const Builder::InternalMap& node_animation_map,
+                             const scoped_refptr<Node>& source) {
+  TraverseListBuilder traverse_list_builder(node_animation_map,
+                                            &traverse_list_);
+  source->Accept(&traverse_list_builder);
+
+  if (traverse_list_builder.replace_with_) {
+    source_ = traverse_list_builder.replace_with_;
+  } else {
+    source_ = source;
+  }
+
+  if (!traverse_list_.empty()) {
+    // We must adjust the resulting |traverse_list_| from an awkward
+    // intermediate format of post-order right to left traversal to the more
+    // natural pre-order left to right traversal expected by ApplyVisitor.
+    // This can be done by simply reversing the list.
+    std::reverse(traverse_list_.begin(), traverse_list_.end());
+    DCHECK(source_.get() == traverse_list_.begin()->node);
+  }
+}
+
+}  // namespace animations
+}  // namespace render_tree
+}  // namespace cobalt
diff --git a/src/cobalt/render_tree/animations/animate_node.h b/src/cobalt/render_tree/animations/animate_node.h
new file mode 100644
index 0000000..4b9bfae
--- /dev/null
+++ b/src/cobalt/render_tree/animations/animate_node.h
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2016 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_RENDER_TREE_ANIMATIONS_ANIMATE_NODE_H_
+#define COBALT_RENDER_TREE_ANIMATIONS_ANIMATE_NODE_H_
+
+#include <map>
+#include <vector>
+
+#include "base/containers/small_map.h"
+#include "base/memory/ref_counted.h"
+#include "cobalt/render_tree/animations/animation_list.h"
+#include "cobalt/render_tree/movable.h"
+#include "cobalt/render_tree/node.h"
+#include "cobalt/render_tree/node_visitor.h"
+
+namespace cobalt {
+namespace render_tree {
+namespace animations {
+
+// An AnimateNode describes a set of animations that affect the subtree attached
+// to the AnimateNode.  In order to create an AnimateNode, one must first
+// populate an AnimateNode::Builder with a mapping of render tree node
+// references to corresponding animations that should be applied to them.
+// Construction of an AnimateNode object requires a populated
+// AnimateNode::Builder instance as well as the sub-tree that the animations
+// apply to.  Upon construction, AnimateNode will compile the set of animated
+// nodes into a format specialized to the associated subtree such that it is
+// much faster to apply the animations.  Once an AnimateNode is constructed,
+// it can generate static render trees representing frames of animation via
+// calls to AnimateNode::Apply(), which returns a static render tree.
+// When AnimateNodes are constructed they maintain an invariant that
+// AnimateNodes never have other AnimateNodes as descendants.  It does this
+// by traversing the subtree on construction and if another AnimateNode is
+// encountered, its information is merged into this root AnimateNode, and the
+// sub-AnimateNode is removed from the tree.
+class AnimateNode : public Node {
+ public:
+  // Manages a mapping of render tree nodes to corresponding animations.  Users
+  // of AnimateNode should populate the Builder with animations and then use
+  // that to construct the AnimateNode.
+  class Builder {
+   public:
+    DECLARE_AS_MOVABLE(Builder);
+
+    Builder() {}
+    explicit Builder(Moved moved) {
+      node_animation_map_ = moved->node_animation_map_;
+      node_refs_.swap(moved->node_refs_);
+    }
+
+    // This method is a template so that we can ensure that animations are not
+    // mismatched with render tree nodes of the wrong type.
+    template <typename T>
+    void Add(const scoped_refptr<T>& target_node,
+             const scoped_refptr<AnimationList<T> >& animation_list) {
+      AddInternal(target_node, animation_list);
+    }
+
+    // Convenience method to attach a single animation to a target node.
+    template <typename T>
+    void Add(const scoped_refptr<T>& target_node,
+             const typename Animation<T>::Function& single_animation) {
+      AddInternal(target_node, scoped_refptr<AnimationListBase>(
+                                   new AnimationList<T>(single_animation)));
+    }
+
+    // Merge all mappings from another AnimateNode::Builder into this one.
+    // There cannot be any keys that are in both the merge target and source.
+    void Merge(const Builder& other);
+
+    // Returns true if there are no animations added to this
+    // AnimateNode::Builder.
+    bool empty() const { return node_animation_map_.empty(); }
+
+   private:
+    // A non-template function that contains the logic for storing a target
+    // node and animation list pair.
+    void AddInternal(const scoped_refptr<Node>& target_node,
+                     const scoped_refptr<AnimationListBase>& animation_list);
+
+    // The primary internal data structure used to organize and store the
+    // mapping between target render tree node and animation list.
+    // In many cases there are not many active animations, and so we use a
+    // base::SmallMap for this.  std::map was found to be more performant than
+    // base::hash_map, so it is used as the fallback map.
+    typedef base::SmallMap<std::map<Node*, scoped_refptr<AnimationListBase> >,
+                           4> InternalMap;
+    InternalMap node_animation_map_;
+    std::vector<scoped_refptr<Node> > node_refs_;
+
+    friend class AnimateNode;
+  };
+
+  AnimateNode(const Builder& builder, const scoped_refptr<Node>& source);
+
+  // This will create an AnimateNode with no animations.  It is useful because
+  // construction of AnimateNodes maintain an invariant that there are no
+  // sub-AnimateNodes underneath them.  Thus, adding a AnimateNode, even if it
+  // has no animations, to an existing tree will result in existing AnimateNodes
+  // being merged into the new root AnimateNode, which can simplify the
+  // underlying tree.
+  explicit AnimateNode(const scoped_refptr<Node>& source);
+
+  // Cannot visit this node.
+  void Accept(NodeVisitor* visitor) OVERRIDE { visitor->Visit(this); }
+
+  // Since we don't have any bounds on the animations contained in this tree,
+  // we cannot know the bounds of the tree over all time.  Indeed animations
+  // may not have any bounds as time goes to infinity.  Despite this, we return
+  // the bounds of the initial render tree to enable AnimateNodes to be setup
+  // as children of CompositionNodes.
+  math::RectF GetBounds() const OVERRIDE { return source_->GetBounds(); }
+
+  base::TypeId GetTypeId() const OVERRIDE {
+    return base::GetTypeId<AnimateNode>();
+  }
+
+  // Apply the animations to the sub render tree with the given |time_offset|.
+  // An animated sub-tree is returned, which is guaranteed to not contain any
+  // AnimateNodes.
+  scoped_refptr<Node> Apply(base::TimeDelta time_offset);
+
+  // Returns the sub-tree for which the animations apply to.
+  const scoped_refptr<Node> source() const { return source_; }
+
+ private:
+  // A helper render tree visitor class used to compile sub render-tree
+  // animations.
+  class TraverseListBuilder;
+  // A helper render tree visitor class used to apply compiled sub render-tree
+  // animations.  This class follows the traversal generated by
+  // TraverseListBuilder.
+  class ApplyVisitor;
+
+  void CommonInit(const Builder::InternalMap& node_animation_map,
+                  const scoped_refptr<Node>& source);
+
+  // The compiled node animation list is a sequence of nodes that are either
+  // animated themselves, or on the path to an animated node.  Only nodes in
+  // this sequence need to be traversed.  TraverseListEntry is an entry in this
+  // list, complete with animations to be applied to the given node, if any.
+  struct TraverseListEntry {
+    TraverseListEntry(Node* node,
+                      const scoped_refptr<AnimationListBase>& animations)
+        : node(node), animations(animations) {}
+    explicit TraverseListEntry(Node* node) : node(node) {}
+
+    Node* node;
+    scoped_refptr<AnimationListBase> animations;
+  };
+  typedef std::vector<TraverseListEntry> TraverseList;
+
+  // The compiled traversal list through the sub-tree represented by |source_|
+  // that guides us towards all nodes that need to be animated.
+  TraverseList traverse_list_;
+  scoped_refptr<Node> source_;
+};
+
+}  // namespace animations
+}  // namespace render_tree
+}  // namespace cobalt
+
+#endif  // COBALT_RENDER_TREE_ANIMATIONS_ANIMATE_NODE_H_
diff --git a/src/cobalt/render_tree/animations/node_animations_map_test.cc b/src/cobalt/render_tree/animations/animate_node_test.cc
similarity index 67%
rename from src/cobalt/render_tree/animations/node_animations_map_test.cc
rename to src/cobalt/render_tree/animations/animate_node_test.cc
index 5e45af5..f46e63e 100644
--- a/src/cobalt/render_tree/animations/node_animations_map_test.cc
+++ b/src/cobalt/render_tree/animations/animate_node_test.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Google Inc. All Rights Reserved.
+ * Copyright 2016 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.
@@ -21,7 +21,7 @@
 #include "cobalt/math/rect_f.h"
 #include "cobalt/math/size_f.h"
 #include "cobalt/math/transform_2d.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/brush.h"
 #include "cobalt/render_tree/color_rgba.h"
 #include "cobalt/render_tree/composition_node.h"
@@ -46,12 +46,12 @@
 // Helper function to create an animation set for a render tree that consists
 // of only one animation targeting only one node in the render tree.
 template <typename T>
-scoped_refptr<NodeAnimationsMap> CreateSingleAnimation(
+scoped_refptr<AnimateNode> CreateSingleAnimation(
     const scoped_refptr<T>& target,
     typename Animation<T>::Function anim_function) {
-  NodeAnimationsMap::Builder animations_builder;
+  AnimateNode::Builder animations_builder;
   animations_builder.Add(target, anim_function);
-  return new NodeAnimationsMap(animations_builder.Pass());
+  return new AnimateNode(animations_builder, target);
 }
 
 class ImageFake : public Image {
@@ -68,16 +68,16 @@
   UNREFERENCED_PARAMETER(time_elapsed);
   text_node->color = ColorRGBA(.5f, .5f, .5f);
 }
-TEST(NodeAnimationsMapTest, EnsureSingleTextNodeAnimates) {
+TEST(AnimateNodeTest, EnsureSingleTextNodeAnimates) {
   scoped_refptr<TextNode> text_node(
       new TextNode(math::Vector2dF(0, 0), new GlyphBuffer(RectF(0, 0, 1, 1)),
                    ColorRGBA(1.0f, 1.0f, 1.0f)));
 
-  scoped_refptr<NodeAnimationsMap> animations =
+  scoped_refptr<AnimateNode> with_animations =
       CreateSingleAnimation(text_node, base::Bind(&AnimateText));
 
   scoped_refptr<Node> animated_render_tree =
-      animations->Apply(text_node, base::TimeDelta::FromSeconds(1));
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
   TextNode* animated_text_node =
       dynamic_cast<TextNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_text_node);
@@ -89,15 +89,15 @@
   UNREFERENCED_PARAMETER(time_elapsed);
   image_node->destination_rect = RectF(2.0f, 2.0f);
 }
-TEST(NodeAnimationsMapTest, EnsureSingleImageNodeAnimates) {
+TEST(AnimateNodeTest, EnsureSingleImageNodeAnimates) {
   scoped_refptr<ImageNode> image_node(
       new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
 
-  scoped_refptr<NodeAnimationsMap> animations =
+  scoped_refptr<AnimateNode> with_animations =
       CreateSingleAnimation(image_node, base::Bind(&AnimateImage));
 
   scoped_refptr<Node> animated_render_tree =
-      animations->Apply(image_node, base::TimeDelta::FromSeconds(1));
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
   ImageNode* animated_image_node =
       dynamic_cast<ImageNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_image_node);
@@ -109,16 +109,16 @@
   UNREFERENCED_PARAMETER(time_elapsed);
   rect_node->rect = RectF(2.0f, 2.0f);
 }
-TEST(NodeAnimationsMapTest, EnsureSingleRectNodeAnimates) {
+TEST(AnimateNodeTest, EnsureSingleRectNodeAnimates) {
   scoped_refptr<RectNode> rect_node(new RectNode(
       RectF(1.0f, 1.0f),
       scoped_ptr<Brush>(new SolidColorBrush(ColorRGBA(1.0f, 1.0f, 1.0f)))));
 
-  scoped_refptr<NodeAnimationsMap> animations =
+  scoped_refptr<AnimateNode> with_animations =
       CreateSingleAnimation(rect_node, base::Bind(&AnimateRect));
 
   scoped_refptr<Node> animated_render_tree =
-      animations->Apply(rect_node, base::TimeDelta::FromSeconds(1));
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
   RectNode* animated_rect_node =
       dynamic_cast<RectNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_rect_node);
@@ -135,33 +135,32 @@
       static_cast<float>(time_elapsed.InSecondsF()),
       static_cast<float>(time_elapsed.InSecondsF()));
 }
-TEST(NodeAnimationsMapTest,
-     SingleImageNodeAnimatesOverTimeRepeatedlyCorrectly) {
+TEST(AnimateNodeTest, SingleImageNodeAnimatesOverTimeRepeatedlyCorrectly) {
   scoped_refptr<ImageNode> image_node(
       new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
 
-  scoped_refptr<NodeAnimationsMap> animations =
+  scoped_refptr<AnimateNode> with_animations =
       CreateSingleAnimation(image_node, base::Bind(&AnimateImageAddWithTime));
 
   scoped_refptr<Node> animated_render_tree;
   ImageNode* animated_image_node;
 
   animated_render_tree =
-      animations->Apply(image_node, base::TimeDelta::FromSeconds(1));
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
   animated_image_node = dynamic_cast<ImageNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_image_node);
   EXPECT_TRUE(animated_image_node);
   EXPECT_FLOAT_EQ(3.0f, animated_image_node->data().destination_rect.width());
 
   animated_render_tree =
-      animations->Apply(image_node, base::TimeDelta::FromSeconds(2));
+      with_animations->Apply(base::TimeDelta::FromSeconds(2));
   animated_image_node = dynamic_cast<ImageNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_image_node);
   EXPECT_TRUE(animated_image_node);
   EXPECT_FLOAT_EQ(5.0f, animated_image_node->data().destination_rect.width());
 
   animated_render_tree =
-      animations->Apply(image_node, base::TimeDelta::FromSeconds(4));
+      with_animations->Apply(base::TimeDelta::FromSeconds(4));
   animated_image_node = dynamic_cast<ImageNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_image_node);
   EXPECT_TRUE(animated_image_node);
@@ -177,8 +176,7 @@
                    static_cast<float>(time_elapsed.InSecondsF()));
   image_node->destination_rect.set_size(image_size);
 }
-TEST(NodeAnimationsMapTest,
-     MultipleAnimationsTargetingOneNodeApplyInCorrectOrder) {
+TEST(AnimateNodeTest, MultipleAnimationsTargetingOneNodeApplyInCorrectOrder) {
   scoped_refptr<ImageNode> image_node(
       new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
 
@@ -192,15 +190,15 @@
   animation_list_builder.animations.push_back(
       base::Bind(&AnimateImageScaleWithTime));
 
-  NodeAnimationsMap::Builder animations_builder;
+  AnimateNode::Builder animations_builder;
   animations_builder.Add(image_node,
                          make_scoped_refptr(new AnimationList<ImageNode>(
                              animation_list_builder.Pass())));
-  scoped_refptr<NodeAnimationsMap> animations(
-      new NodeAnimationsMap(animations_builder.Pass()));
+  scoped_refptr<AnimateNode> with_animations(
+      new AnimateNode(animations_builder, image_node));
 
   scoped_refptr<Node> animated_render_tree =
-      animations->Apply(image_node, base::TimeDelta::FromSeconds(3));
+      with_animations->Apply(base::TimeDelta::FromSeconds(3));
 
   ImageNode* animated_image_node =
       dynamic_cast<ImageNode*>(animated_render_tree.get());
@@ -216,22 +214,21 @@
   UNREFERENCED_PARAMETER(time_elapsed);
   transform_node->transform = math::TranslateMatrix(2.0f, 2.0f);
 }
-TEST(NodeAnimationsMapTest, AnimatingTransformNodeDoesNotAffectSourceChild) {
+TEST(AnimateNodeTest, AnimatingTransformNodeDoesNotAffectSourceChild) {
   scoped_refptr<ImageNode> image_node(
       new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
   scoped_refptr<MatrixTransformNode> transform_node(
       new MatrixTransformNode(image_node, math::Matrix3F::Identity()));
 
-  scoped_refptr<NodeAnimationsMap> animations =
+  scoped_refptr<AnimateNode> with_animations =
       CreateSingleAnimation(transform_node, base::Bind(&AnimateTransform));
 
   scoped_refptr<Node> animated_render_tree =
-      animations->Apply(transform_node, base::TimeDelta::FromSeconds(1));
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
 
   MatrixTransformNode* animated_transform_node =
       dynamic_cast<MatrixTransformNode*>(animated_render_tree.get());
   EXPECT_TRUE(animated_transform_node);
-  EXPECT_TRUE(animated_transform_node);
 
   EXPECT_EQ(math::TranslateMatrix(2.0f, 2.0f),
             animated_transform_node->data().transform);
@@ -241,7 +238,7 @@
 // Test that animating a child correctly adjusts sub-node parameters but
 // not parent node parameters, though both child and parent are different nodes
 // now.  The animated child's sibling should be left untouched.
-TEST(NodeAnimationsMapTest,
+TEST(AnimateNodeTest,
      AnimatingCompositionChildNodeAffectsParentAsWellButNotSibling) {
   scoped_refptr<ImageNode> image_node_a(
       new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
@@ -253,11 +250,13 @@
   scoped_refptr<CompositionNode> composition_node(
       new CompositionNode(composition_node_builder.Pass()));
 
-  scoped_refptr<NodeAnimationsMap> animations =
-      CreateSingleAnimation(image_node_a, base::Bind(&AnimateImage));
+  AnimateNode::Builder animation_builder;
+  animation_builder.Add(image_node_a, base::Bind(&AnimateImage));
+  scoped_refptr<AnimateNode> with_animations =
+      new AnimateNode(animation_builder, composition_node);
 
   scoped_refptr<Node> animated_render_tree =
-      animations->Apply(composition_node, base::TimeDelta::FromSeconds(1));
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
 
   CompositionNode* animated_composition_node =
       dynamic_cast<CompositionNode*>(animated_render_tree.get());
@@ -273,6 +272,76 @@
   EXPECT_EQ(image_node_b.get(), animated_image_node_b);
 }
 
+TEST(AnimateNodeTest, SimpleSubAnimateNode) {
+  // Test that we can properly animate trees that built upon multiple
+  // AnimateNodes.
+  scoped_refptr<ImageNode> image_node(
+      new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
+  scoped_refptr<AnimateNode> image_animation =
+      CreateSingleAnimation(image_node, base::Bind(&AnimateImage));
+
+  scoped_refptr<MatrixTransformNode> transform_node(
+      new MatrixTransformNode(image_animation, math::Matrix3F::Identity()));
+
+  scoped_refptr<AnimateNode> with_animations =
+      CreateSingleAnimation(transform_node, base::Bind(&AnimateTransform));
+
+  scoped_refptr<Node> animated_render_tree =
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
+
+  MatrixTransformNode* animated_transform_node =
+      dynamic_cast<MatrixTransformNode*>(animated_render_tree.get());
+  EXPECT_TRUE(animated_transform_node);
+
+  // Check that the matrix transform node is animated.
+  EXPECT_EQ(math::TranslateMatrix(2.0f, 2.0f),
+            animated_transform_node->data().transform);
+
+  // Check also that the image node is animated.
+  ImageNode* animated_image_node =
+      dynamic_cast<ImageNode*>(animated_transform_node->data().source.get());
+  EXPECT_TRUE(animated_image_node);
+  EXPECT_EQ(RectF(2.0f, 2.0f), animated_image_node->data().destination_rect);
+}
+
+TEST(AnimateNodeTest, SubAnimateNodeWithTwoAncestors) {
+  // Test that we can properly animate trees that built upon multiple
+  // AnimateNodes.
+  scoped_refptr<ImageNode> image_node(
+      new ImageNode(make_scoped_refptr(new ImageFake()), RectF(1.0f, 1.0f)));
+  scoped_refptr<AnimateNode> image_animation =
+      CreateSingleAnimation(image_node, base::Bind(&AnimateImage));
+
+  // This node is used to make it so there is more than one node on the path
+  // between the two AnimateNodes.
+  scoped_refptr<MatrixTransformNode> transform_node_a(
+      new MatrixTransformNode(image_animation, math::Matrix3F::Identity()));
+
+  scoped_refptr<MatrixTransformNode> transform_node_b(
+      new MatrixTransformNode(transform_node_a, math::Matrix3F::Identity()));
+
+  scoped_refptr<AnimateNode> with_animations =
+      new AnimateNode(transform_node_b);
+
+  scoped_refptr<Node> animated_render_tree =
+      with_animations->Apply(base::TimeDelta::FromSeconds(1));
+
+  MatrixTransformNode* animated_transform_node =
+      dynamic_cast<MatrixTransformNode*>(animated_render_tree.get());
+  EXPECT_TRUE(animated_transform_node);
+
+  // Check that the image node is animated.
+  MatrixTransformNode* animated_dummy_transform_node =
+      dynamic_cast<MatrixTransformNode*>(
+          animated_transform_node->data().source.get());
+  EXPECT_TRUE(animated_dummy_transform_node);
+
+  ImageNode* animated_image_node = dynamic_cast<ImageNode*>(
+      animated_dummy_transform_node->data().source.get());
+  EXPECT_TRUE(animated_image_node);
+  EXPECT_EQ(RectF(2.0f, 2.0f), animated_image_node->data().destination_rect);
+}
+
 }  // namespace animations
 }  // namespace render_tree
 }  // namespace cobalt
diff --git a/src/cobalt/render_tree/animations/animation_list.h b/src/cobalt/render_tree/animations/animation_list.h
index 8c83f36..a37bd3f 100644
--- a/src/cobalt/render_tree/animations/animation_list.h
+++ b/src/cobalt/render_tree/animations/animation_list.h
@@ -67,7 +67,7 @@
   //                  base::TimeDelta::FromSeconds(1)));
   //
   // You can now create an AnimationList object from the AnimationList::Builder
-  // and ultimately add that to a NodeAnimationsMap object so that it can be
+  // and ultimately add that to a AnimateNode::Builder object so that it can be
   // mapped to a specific TextNode that it should be applied to.
   typedef base::Callback<void(typename T::Builder*, base::TimeDelta)> Function;
 };
diff --git a/src/cobalt/render_tree/animations/node_animations_map.cc b/src/cobalt/render_tree/animations/node_animations_map.cc
deleted file mode 100644
index c123536..0000000
--- a/src/cobalt/render_tree/animations/node_animations_map.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright 2015 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/render_tree/animations/node_animations_map.h"
-
-#include "base/debug/trace_event.h"
-#include "base/optional.h"
-#include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/render_tree/composition_node.h"
-#include "cobalt/render_tree/filter_node.h"
-#include "cobalt/render_tree/image_node.h"
-#include "cobalt/render_tree/matrix_transform_node.h"
-#include "cobalt/render_tree/node_visitor.h"
-#include "cobalt/render_tree/punch_through_video_node.h"
-#include "cobalt/render_tree/rect_node.h"
-#include "cobalt/render_tree/rect_shadow_node.h"
-#include "cobalt/render_tree/text_node.h"
-
-namespace cobalt {
-namespace render_tree {
-namespace animations {
-
-void NodeAnimationsMap::Builder::AddInternal(
-    const scoped_refptr<Node>& target_node,
-    const scoped_refptr<AnimationListBase>& animation_list) {
-  DCHECK(node_animation_map_.find(target_node) == node_animation_map_.end())
-      << "The target render tree node already has an associated animation "
-         "list.";
-
-  node_animation_map_[target_node.get()] = animation_list;
-  node_refs_.push_back(target_node);
-}
-
-void NodeAnimationsMap::Builder::Merge(
-    const NodeAnimationsMap::Builder& other) {
-#if !defined(NDEBUG)
-  for (InternalMap::const_iterator iter = node_animation_map_.begin();
-       iter != node_animation_map_.end(); ++iter) {
-    DCHECK(other.node_animation_map_.find(iter->first) ==
-           other.node_animation_map_.end()) <<
-        "Only mutually exclusive NodeAnimationMaps can be merged!";
-  }
-#endif
-  node_animation_map_.insert(
-      other.node_animation_map_.begin(), other.node_animation_map_.end());
-  node_refs_.insert(
-      node_refs_.end(), other.node_refs_.begin(), other.node_refs_.end());
-}
-
-AnimationListBase* NodeAnimationsMap::GetAnimationsForNode(Node* target) const {
-  Builder::InternalMap::const_iterator found =
-      data_.node_animation_map_.find(target);
-  if (found == data_.node_animation_map_.end()) return NULL;
-  return found->second.get();
-}
-
-// This visitor object contains the logic for how to apply animation to each
-// render tree node.  Things are most interesting for node types that may
-// contain child render tree nodes, like CompositionNode.  In this case,
-// they will need to be animated not only if animations directly affect them,
-// but also if any of their children have been animated.
-class NodeAnimationsMap::NodeVisitor : public render_tree::NodeVisitor {
- public:
-  explicit NodeVisitor(const NodeAnimationsMap& animations,
-                       const base::TimeDelta& time_elapsed);
-
-  void Visit(CompositionNode* composition_node) OVERRIDE;
-  void Visit(FilterNode* image_node) OVERRIDE;
-  void Visit(ImageNode* image_node) OVERRIDE;
-  void Visit(MatrixTransformNode* matrix_transform_node) OVERRIDE;
-  void Visit(PunchThroughVideoNode* punch_through_video_node) OVERRIDE;
-  void Visit(RectNode* rect_node) OVERRIDE;
-  void Visit(RectShadowNode* rect_shadow_node) OVERRIDE;
-  void Visit(TextNode* text_node) OVERRIDE;
-
-  bool has_animated_node() const { return !!animated_node_; }
-
-  // NodeVisitor objects are intended to be "one-shot"
-  // visit objects.  The "return value" (e.g. the animated node) can be
-  // retrieved by calling animated_node() after Visit() has been called.
-  const scoped_refptr<Node>& animated_node() { return *animated_node_; }
-
-  // Helper function to apply all animations in a AnimationList to a specific
-  // node builder.
-  template <typename T>
-  static void ApplyAnimations(typename T::Builder* builder,
-                              const AnimationListBase* node_animations,
-                              base::TimeDelta time_elapsed);
-
-  // Helper function for applying animations to simple nodes that don't have any
-  // children or special cases.
-  template <typename T>
-  static base::optional<scoped_refptr<Node> >
-  MaybeCloneLeafNodeAndApplyAnimations(
-      T* node, const NodeAnimationsMap& animations,
-      base::TimeDelta time_elapsed);
-
- private:
-  const NodeAnimationsMap& animations_;
-  const base::TimeDelta& time_elapsed_;
-
-  base::optional<scoped_refptr<Node> > animated_node_;
-};
-
-NodeAnimationsMap::NodeVisitor::NodeVisitor(const NodeAnimationsMap& animations,
-                                            const base::TimeDelta& time_elapsed)
-    : animations_(animations), time_elapsed_(time_elapsed) {}
-
-template <typename T>
-void NodeAnimationsMap::NodeVisitor::ApplyAnimations(
-    typename T::Builder* builder, const AnimationListBase* node_animations,
-    base::TimeDelta time_elapsed) {
-  // Cast to the specific type we expect these animations to have.
-  const AnimationList<T>* typed_node_animations =
-      base::polymorphic_downcast<const AnimationList<T>*>(node_animations);
-
-  // Iterate through each animation applying them one at a time.
-  for (typename AnimationList<T>::InternalList::const_iterator iter =
-           typed_node_animations->data().animations.begin();
-       iter != typed_node_animations->data().animations.end(); ++iter) {
-    iter->Run(builder, time_elapsed);
-  }
-}
-
-template <typename T>
-base::optional<scoped_refptr<Node> >
-NodeAnimationsMap::NodeVisitor::MaybeCloneLeafNodeAndApplyAnimations(
-    T* node, const NodeAnimationsMap& animations,
-    base::TimeDelta time_elapsed) {
-  const AnimationListBase* node_animations =
-      animations.GetAnimationsForNode(node);
-  if (node_animations != NULL) {
-    typename T::Builder builder(node->data());
-
-    ApplyAnimations<T>(&builder, node_animations, time_elapsed);
-
-    return scoped_refptr<Node>(new T(builder));
-  } else {
-    // No animations were applied to this node, return NULL to signify this.
-    return base::nullopt;
-  }
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(CompositionNode* composition_node) {
-  // We declare the builder as an optional because we may not need one if we
-  // have no animations and none of our children are animated.
-  base::optional<CompositionNode::Builder> builder;
-
-  const CompositionNode::Children& original_children =
-      composition_node->data().children();
-
-  // Iterate through our children and visit them to apply animations.  After
-  // each one, check to see if it actually was animated, and if so, replace
-  // this composition node's reference to that child with the newly animated
-  // one.
-  for (size_t i = 0; i < original_children.size(); ++i) {
-    NodeVisitor child_visitor(animations_, time_elapsed_);
-    original_children[i]->Accept(&child_visitor);
-
-    // If a child was animated, then we must adjust our child node reference to
-    // the newly animated one.
-    if (child_visitor.has_animated_node()) {
-      if (!builder) {
-        builder.emplace(composition_node->data());
-      }
-      *builder->GetChild(static_cast<int>(i)) = child_visitor.animated_node();
-    }
-  }
-
-  // Check if any animations apply directly to us, and if so, apply them.
-  const AnimationListBase* animations =
-      animations_.GetAnimationsForNode(composition_node);
-  if (animations != NULL) {
-    if (!builder) {
-      builder.emplace(composition_node->data());
-    }
-    ApplyAnimations<CompositionNode>(&builder.value(), animations,
-                                     time_elapsed_);
-  }
-
-  // Return the animated node.  If no animations took place, leave
-  // animated_node_ as NULL to signify that no animations took place.
-  if (builder) {
-    animated_node_ = scoped_refptr<Node>(new CompositionNode(builder->Pass()));
-  }
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(FilterNode* filter_node) {
-  base::optional<FilterNode::Builder> builder;
-
-  // First check to see if our source node has any animations, and if so,
-  // animate it.
-  NodeVisitor child_visitor(animations_, time_elapsed_);
-  filter_node->data().source->Accept(&child_visitor);
-
-  if (child_visitor.has_animated_node()) {
-    // If our source node was animated, then so must we be, so create a
-    // builder and set it up to point to our animated source node.
-    builder.emplace(filter_node->data());
-    builder->source = child_visitor.animated_node();
-  }
-
-  // Apply any animations to the filter node itself.
-  const AnimationListBase* animations =
-      animations_.GetAnimationsForNode(filter_node);
-  if (animations != NULL) {
-    if (!builder) {
-      builder.emplace(filter_node->data());
-    }
-    ApplyAnimations<FilterNode>(&builder.value(), animations, time_elapsed_);
-  }
-
-  // Return the animated node.  If no animations took place, leave
-  // animated_node_ as NULL to signify that no animations took place.
-  if (builder) {
-    animated_node_ = scoped_refptr<Node>(new FilterNode(*builder));
-  }
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(ImageNode* image_node) {
-  animated_node_ = MaybeCloneLeafNodeAndApplyAnimations(
-      image_node, animations_, time_elapsed_);
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(
-    MatrixTransformNode* matrix_transform_node) {
-  base::optional<MatrixTransformNode::Builder> builder;
-
-  // First check to see if our source node has any animations, and if so,
-  // animate it.
-  NodeVisitor child_visitor(animations_, time_elapsed_);
-  matrix_transform_node->data().source->Accept(&child_visitor);
-
-  if (child_visitor.has_animated_node()) {
-    // If our source node was animated, then so must we be, so create a
-    // builder and set it up to point to our animated source node.
-    builder.emplace(matrix_transform_node->data());
-    builder->source = child_visitor.animated_node();
-  }
-
-  // Apply any animations to the filter node itself.
-  const AnimationListBase* animations =
-      animations_.GetAnimationsForNode(matrix_transform_node);
-  if (animations != NULL) {
-    if (!builder) {
-      builder.emplace(matrix_transform_node->data());
-    }
-    ApplyAnimations<MatrixTransformNode>(&builder.value(), animations,
-                                         time_elapsed_);
-  }
-
-  // Return the animated node.  If no animations took place, leave
-  // animated_node_ as NULL to signify that no animations took place.
-  if (builder) {
-    animated_node_ = scoped_refptr<Node>(new MatrixTransformNode(*builder));
-  }
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(
-    PunchThroughVideoNode* punch_through_video_node) {
-  animated_node_ = MaybeCloneLeafNodeAndApplyAnimations(
-      punch_through_video_node, animations_, time_elapsed_);
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(RectNode* rect_node) {
-  // We do not use MaybeCloneLeafNodeAndApplyAnimations() here so that we can
-  // construct our RectNode via a move of the RectNode::Builder object, instead
-  // of a copy.
-  const AnimationListBase* node_animations =
-      animations_.GetAnimationsForNode(rect_node);
-  if (node_animations != NULL) {
-    RectNode::Builder builder(rect_node->data());
-
-    ApplyAnimations<RectNode>(&builder, node_animations, time_elapsed_);
-
-    // Move construct our RectNode from the RectNode::Builder object.
-    animated_node_ = scoped_refptr<Node>(new RectNode(builder.Pass()));
-  }
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(RectShadowNode* rect_shadow_node) {
-  animated_node_ = MaybeCloneLeafNodeAndApplyAnimations(
-      rect_shadow_node, animations_, time_elapsed_);
-}
-
-void NodeAnimationsMap::NodeVisitor::Visit(TextNode* text_node) {
-  animated_node_ = MaybeCloneLeafNodeAndApplyAnimations(
-      text_node, animations_, time_elapsed_);
-}
-
-scoped_refptr<Node> NodeAnimationsMap::Apply(const scoped_refptr<Node>& root,
-                                             base::TimeDelta time_elapsed) {
-  TRACE_EVENT0("cobalt::renderer", "NodeAnimationsMap::Apply()");
-  NodeVisitor root_visitor(*this, time_elapsed);
-  root->Accept(&root_visitor);
-  return root_visitor.has_animated_node() ? root_visitor.animated_node() : root;
-}
-
-}  // namespace animations
-}  // namespace render_tree
-}  // namespace cobalt
diff --git a/src/cobalt/render_tree/animations/node_animations_map.h b/src/cobalt/render_tree/animations/node_animations_map.h
deleted file mode 100644
index 669cd61..0000000
--- a/src/cobalt/render_tree/animations/node_animations_map.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright 2015 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_RENDER_TREE_ANIMATIONS_NODE_ANIMATIONS_MAP_H_
-#define COBALT_RENDER_TREE_ANIMATIONS_NODE_ANIMATIONS_MAP_H_
-
-#include <map>
-#include <vector>
-
-#include "base/containers/small_map.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/render_tree/animations/animation_list.h"
-#include "cobalt/render_tree/movable.h"
-#include "cobalt/render_tree/node.h"
-
-namespace cobalt {
-namespace render_tree {
-namespace animations {
-
-// A NodeAnimationsMap object represents a reference counted and immutable (so
-// they can be easily shared between threads) set of animations, along with
-// references to the render tree Nodes that they target.  NodeAnimationsMap
-// objects contain animation information about corresponding render trees and
-// are intended to be passed alongside them to modules that would like to
-// animate render trees.
-// NodeAnimationsMap objects essentially organize their collections of
-// animations as an unordered map from render tree Node objects to
-// AnimationLists. Thus, animation can be applied to a render tree by traversing
-// it and for each element checking to see if any animations exist for them, and
-// if so, apply them.  Indeed, the NodeAnimationsMap object's primary method,
-// Apply(), does just this.
-class NodeAnimationsMap : public base::RefCountedThreadSafe<NodeAnimationsMap> {
- public:
-  // Use this NodeAnimationsMap::Builder object to construct your collection of
-  // animations and corresponding render_tree Nodes.  When setup is complete,
-  // construct a NodeAnimationsMap object with the Builder.
-  class Builder {
-   public:
-    DECLARE_AS_MOVABLE(Builder);
-
-    Builder() {}
-    explicit Builder(Moved moved) {
-      node_animation_map_ = moved->node_animation_map_;
-      node_refs_.swap(moved->node_refs_);
-    }
-
-    // This method is a template so that we can ensure that animations are not
-    // mismatched with render tree nodes of the wrong type.
-    template <typename T>
-    void Add(const scoped_refptr<T>& target_node,
-             const scoped_refptr<AnimationList<T> >& animation_list) {
-      AddInternal(target_node, animation_list);
-    }
-
-    // Convenience method to attach a single animation to a target node.
-    template <typename T>
-    void Add(const scoped_refptr<T>& target_node,
-             const typename Animation<T>::Function& single_animation) {
-      AddInternal(target_node, scoped_refptr<AnimationListBase>(
-                                   new AnimationList<T>(single_animation)));
-    }
-
-    // Merge all mappings from another NodeAnimationsMap into this one.  There
-    // cannot be any keys that are in both the merge target and source.
-    void Merge(const NodeAnimationsMap& other) { Merge(other.data_); }
-    void Merge(const NodeAnimationsMap::Builder& other);
-
-   private:
-    // A non-template function that contains the logic for storing a target
-    // node and animation list pair.
-    void AddInternal(const scoped_refptr<Node>& target_node,
-                     const scoped_refptr<AnimationListBase>& animation_list);
-
-    // The primary internal data structure used to organize and store the
-    // mapping between target render tree node and animation list.
-    // In many cases there are not many active animations, and so we use a
-    // base::SmallMap for this.  std::map was found to be more performant than
-    // base::hash_map, so it is used as the fallback map.
-    typedef base::SmallMap<
-        std::map<Node*, scoped_refptr<AnimationListBase> >, 4> InternalMap;
-    InternalMap node_animation_map_;
-    std::vector<scoped_refptr<Node> > node_refs_;
-
-    friend class NodeAnimationsMap;
-  };
-
-  // Since Builder objects are heavy-weight, this constructor allows them to
-  // be move constructed into the NodeAnimationsMap object.
-  explicit NodeAnimationsMap(Builder::Moved builder) : data_(builder) {}
-
-  // Given the passed in current time, this method will apply all contained
-  // animations to the passed in render tree, returning a new render tree that
-  // has animations applied.  Nodes will only be newly created if they are
-  // animated or one of their descendants are animated, otherwise the original
-  // input node will be used and returned.
-  scoped_refptr<Node> Apply(const scoped_refptr<Node>& root,
-                            base::TimeDelta time_elapsed);
-
- private:
-  ~NodeAnimationsMap() {}
-
-  // Returns NULL if no animations exist for target node.
-  AnimationListBase* GetAnimationsForNode(Node* target) const;
-
-  const Builder data_;
-
-  class NodeVisitor;
-  friend class NodeVisitor;
-
-  friend class base::RefCountedThreadSafe<NodeAnimationsMap>;
-};
-
-}  // namespace animations
-}  // namespace render_tree
-}  // namespace cobalt
-
-#endif  // COBALT_RENDER_TREE_ANIMATIONS_NODE_ANIMATIONS_MAP_H_
diff --git a/src/cobalt/render_tree/child_iterator.h b/src/cobalt/render_tree/child_iterator.h
new file mode 100644
index 0000000..d5567c5
--- /dev/null
+++ b/src/cobalt/render_tree/child_iterator.h
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2016 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_RENDER_TREE_CHILD_ITERATOR_H_
+#define COBALT_RENDER_TREE_CHILD_ITERATOR_H_
+
+#include "cobalt/render_tree/composition_node.h"
+#include "cobalt/render_tree/filter_node.h"
+#include "cobalt/render_tree/image_node.h"
+#include "cobalt/render_tree/matrix_transform_node.h"
+#include "cobalt/render_tree/node.h"
+#include "cobalt/render_tree/punch_through_video_node.h"
+#include "cobalt/render_tree/rect_node.h"
+#include "cobalt/render_tree/rect_shadow_node.h"
+#include "cobalt/render_tree/text_node.h"
+
+namespace cobalt {
+namespace render_tree {
+
+class ImageNode;
+class PunchThroughVideoNode;
+class RectNode;
+class RectShadowNode;
+class TextNode;
+
+// The ChildIterator template provides a way to iterate over the children of
+// a node without concern for what type of node it is (though since it is a
+// template, the compiler must know the type).  Thus, render_tree::NodeVisitor
+// subclasses can forward visits to a ChildIterator if they want to traverse
+// the tree without writing traversal code for specific render tree node types.
+// Additionally, ReplaceCurrent() can be used to modify the list of children
+// at a given node, allowing render tree modifications to be made by code that
+// does not care about what type of render tree nodes it is dealing with.
+// Note that child-related methods like GetCurrent(), Next(), and
+// ReplaceCurrent() are only enabled for nodes that have children.  This can
+// be checked via |ChildIterator<T>::has_children|.
+//
+// Example usage:
+//
+//    void Visit(CompositionNode* node) { VisitNode(node); }
+//    void Visit(ImageNode* node) { VisitNode(node); }
+//    ...
+//
+//    template <typename T>
+//    typename base::enable_if<!ChildIterator<T>::has_children>::type
+//    VisitNode(T* node) {
+//      ProcessNode();
+//    }
+//
+//    template <typename T>
+//    typename base::enable_if<ChildIterator<T>::has_children>::type VisitNode(
+//        T* node) {
+//      ProcessNode();
+//
+//      // Visit children
+//      ChildIterator<T> child_iterator(node);
+//      while (Node* child = child_iterator.GetCurrent()) {
+//        Visit(child);
+//        child_iterator.Next();
+//      }
+//    }
+//
+//    void ProcessNode(Node* node) {
+//      // Called on every node
+//      ...
+//    }
+//
+
+template <typename T, typename = void>
+class ChildIterator {
+ public:
+  // This default class is used for all nodes that have no children.
+  static const bool has_children = false;
+};
+
+enum ChildIteratorDirection {
+  // Decides whether we start at the first or last child.
+  kChildIteratorDirectionForwards,
+  kChildIteratorDirectionBackwards,
+};
+
+// CompositionNodes may have multiple children, so we setup ChildIterator
+// to iterate through each of them.
+template <>
+class ChildIterator<CompositionNode> {
+ public:
+  static const bool has_children = true;
+
+  explicit ChildIterator(
+      CompositionNode* composition,
+      ChildIteratorDirection direction = kChildIteratorDirectionForwards)
+      : composition_node_(composition),
+        children_(composition_node_->data().children()),
+        child_number_(0),
+        direction_(direction) {}
+
+  Node* GetCurrent() const {
+    return done() ? NULL : children_[child_index()].get();
+  }
+  void Next() { ++child_number_; }
+
+  void ReplaceCurrent(const scoped_refptr<Node>& new_child) {
+    DCHECK(!done());
+    if (!modified_children_builder_) {
+      // If we haven't replaced any children yet, we start by constructing a new
+      // modifiable version of this CompositionNode's data so that we can
+      // modify its children.
+      modified_children_builder_ = composition_node_->data();
+    }
+    // Update the modified children list with the newly replaced child.
+    *modified_children_builder_->GetChild(static_cast<int>(child_index())) =
+        new_child;
+  }
+  CompositionNode::Builder::Moved TakeReplacedChildrenBuilder() {
+    return modified_children_builder_->Pass();
+  }
+
+ private:
+  size_t child_index() const {
+    DCHECK(!done());
+    return direction_ == kChildIteratorDirectionForwards
+               ? child_number_
+               : children_.size() - child_number_ - 1;
+  }
+  bool done() const { return child_number_ >= children_.size(); }
+
+  // The node whose children we are iterating through.
+  CompositionNode* composition_node_;
+  // A quick reference to the node's children.
+  const CompositionNode::Children& children_;
+  // The current child index we are at with our iteration.
+  size_t child_number_;
+
+  ChildIteratorDirection direction_;
+
+  // The builder to use if we are modifying the children.  If constructed, it
+  // starts as a copy of the origin CompositionNode's data.
+  base::optional<CompositionNode::Builder> modified_children_builder_;
+};
+
+// FilterNodes can have up to 1 child.
+template <>
+class ChildIterator<FilterNode> {
+ public:
+  static const bool has_children = true;
+
+  explicit ChildIterator(
+      FilterNode* filter,
+      ChildIteratorDirection direction = kChildIteratorDirectionForwards)
+      : filter_node_(filter), source_(filter->data().source.get()) {
+    UNREFERENCED_PARAMETER(direction);
+  }
+
+  Node* GetCurrent() const { return source_; }
+  void Next() { source_ = NULL; }
+
+  void ReplaceCurrent(const scoped_refptr<Node>& new_child) {
+    DCHECK(GetCurrent());
+    if (!modified_children_builder_) {
+      modified_children_builder_ = filter_node_->data();
+    }
+    modified_children_builder_->source = new_child;
+  }
+  FilterNode::Builder TakeReplacedChildrenBuilder() {
+    return *modified_children_builder_;
+  }
+
+ private:
+  FilterNode* filter_node_;
+  Node* source_;
+
+  base::optional<FilterNode::Builder> modified_children_builder_;
+};
+
+// MatrixTransformNodes can have up to 1 child.
+template <>
+class ChildIterator<MatrixTransformNode> {
+ public:
+  static const bool has_children = true;
+
+  explicit ChildIterator(
+      MatrixTransformNode* matrix_transform,
+      ChildIteratorDirection direction = kChildIteratorDirectionForwards)
+      : matrix_transform_node_(matrix_transform),
+        source_(matrix_transform->data().source.get()) {
+    UNREFERENCED_PARAMETER(direction);
+  }
+
+  Node* GetCurrent() const { return source_; }
+  void Next() { source_ = NULL; }
+
+  void ReplaceCurrent(const scoped_refptr<Node>& new_child) {
+    DCHECK(GetCurrent());
+    if (!modified_children_builder_) {
+      modified_children_builder_ = matrix_transform_node_->data();
+    }
+    modified_children_builder_->source = new_child;
+  }
+  MatrixTransformNode::Builder TakeReplacedChildrenBuilder() {
+    return *modified_children_builder_;
+  }
+
+ private:
+  MatrixTransformNode* matrix_transform_node_;
+  Node* source_;
+
+  base::optional<MatrixTransformNode::Builder> modified_children_builder_;
+};
+
+}  // namespace render_tree
+}  // namespace cobalt
+
+#endif  // COBALT_RENDER_TREE_CHILD_ITERATOR_H_
diff --git a/src/cobalt/render_tree/dump_render_tree_to_string.cc b/src/cobalt/render_tree/dump_render_tree_to_string.cc
index adee88e..6fdc38e 100644
--- a/src/cobalt/render_tree/dump_render_tree_to_string.cc
+++ b/src/cobalt/render_tree/dump_render_tree_to_string.cc
@@ -31,6 +31,10 @@
 namespace cobalt {
 namespace render_tree {
 
+namespace animations {
+class AnimateNode;
+}  // namespace animations
+
 namespace {
 
 // A render tree visitor that accumulates node dumps to text within a
@@ -39,6 +43,7 @@
  public:
   DebugTreePrinter() : indent_(0) {}
 
+  void Visit(animations::AnimateNode* /* animate */) OVERRIDE { NOTREACHED(); }
   void Visit(CompositionNode* composition) OVERRIDE;
   void Visit(FilterNode* text) OVERRIDE;
   void Visit(ImageNode* image) OVERRIDE;
diff --git a/src/cobalt/render_tree/node_visitor.h b/src/cobalt/render_tree/node_visitor.h
index 73b9c21..de6c026 100644
--- a/src/cobalt/render_tree/node_visitor.h
+++ b/src/cobalt/render_tree/node_visitor.h
@@ -29,11 +29,16 @@
 class RectShadowNode;
 class TextNode;
 
+namespace animations {
+class AnimateNode;
+}  // namespace animations
+
 // Type-safe branching on a class hierarchy of render tree nodes,
 // implemented after a classical GoF pattern (see
 // http://en.wikipedia.org/wiki/Visitor_pattern#Java_example).
 class NodeVisitor {
  public:
+  virtual void Visit(animations::AnimateNode* animate) = 0;
   virtual void Visit(CompositionNode* composition) = 0;
   virtual void Visit(FilterNode* text) = 0;
   virtual void Visit(ImageNode* image) = 0;
diff --git a/src/cobalt/render_tree/node_visitor_test.cc b/src/cobalt/render_tree/node_visitor_test.cc
index 502a749..7a24cc4 100644
--- a/src/cobalt/render_tree/node_visitor_test.cc
+++ b/src/cobalt/render_tree/node_visitor_test.cc
@@ -20,6 +20,7 @@
 
 #include "cobalt/math/rect_f.h"
 #include "cobalt/math/size.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/render_tree/filter_node.h"
 #include "cobalt/render_tree/font.h"
@@ -33,6 +34,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::Brush;
 using cobalt::render_tree::BrushVisitor;
 using cobalt::render_tree::ColorRGBA;
@@ -53,6 +55,7 @@
 
 class MockNodeVisitor : public NodeVisitor {
  public:
+  MOCK_METHOD1(Visit, void(AnimateNode* animate));
   MOCK_METHOD1(Visit, void(CompositionNode* composition));
   MOCK_METHOD1(Visit, void(FilterNode* image));
   MOCK_METHOD1(Visit, void(ImageNode* image));
@@ -99,6 +102,15 @@
 
 }  // namespace
 
+TEST(NodeVisitorTest, VisitsAnimate) {
+  scoped_refptr<DummyImage> dummy_image = make_scoped_refptr(new DummyImage());
+  scoped_refptr<ImageNode> dummy_image_node(new ImageNode(dummy_image));
+  scoped_refptr<AnimateNode> animate_node(new AnimateNode(dummy_image_node));
+  MockNodeVisitor mock_visitor;
+  EXPECT_CALL(mock_visitor, Visit(animate_node.get()));
+  animate_node->Accept(&mock_visitor);
+}
+
 TEST(NodeVisitorTest, VisitsImage) {
   scoped_refptr<DummyImage> image = make_scoped_refptr(new DummyImage());
   scoped_refptr<ImageNode> image_node(new ImageNode(image));
diff --git a/src/cobalt/render_tree/render_tree.gyp b/src/cobalt/render_tree/render_tree.gyp
index 5af25ff..6e7c6a7 100644
--- a/src/cobalt/render_tree/render_tree.gyp
+++ b/src/cobalt/render_tree/render_tree.gyp
@@ -30,6 +30,7 @@
         'brush.cc',
         'brush.h',
         'brush_visitor.h',
+        'child_iterator.h',
         'color_rgba.h',
         'composition_node.cc',
         'composition_node.h',
@@ -73,8 +74,8 @@
       'target_name': 'animations',
       'type': 'static_library',
       'sources': [
-        'animations/node_animations_map.cc',
-        'animations/node_animations_map.h',
+        'animations/animate_node.cc',
+        'animations/animate_node.h',
       ],
       'dependencies': [
         'render_tree',
@@ -86,7 +87,7 @@
       'target_name': 'render_tree_test',
       'type': '<(gtest_target_type)',
       'sources': [
-        'animations/node_animations_map_test.cc',
+        'animations/animate_node_test.cc',
         'brush_visitor_test.cc',
         'color_rgba_test.cc',
         'node_visitor_test.cc',
diff --git a/src/cobalt/renderer/animations_test.cc b/src/cobalt/renderer/animations_test.cc
index 8c488a5..033a78f 100644
--- a/src/cobalt/renderer/animations_test.cc
+++ b/src/cobalt/renderer/animations_test.cc
@@ -16,6 +16,7 @@
 
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/simple_thread.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/image.h"
 #include "cobalt/render_tree/image_node.h"
 #include "cobalt/render_tree/resource_provider.h"
@@ -29,10 +30,10 @@
 
 #include "testing/gtest/include/gtest/gtest.h"
 
+using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::Image;
 using cobalt::render_tree::ImageNode;
 using cobalt::render_tree::ResourceProvider;
-using cobalt::render_tree::animations::NodeAnimationsMap;
 
 namespace cobalt {
 namespace renderer {
@@ -179,7 +180,7 @@
 
     // Animate the ImageNode and pass in our callback function to be executed
     // upon render_tree animation.
-    NodeAnimationsMap::Builder animations;
+    AnimateNode::Builder animations;
     bool first_animate = true;
     animations.Add(test_node,
                    base::Bind(&AnimateImageNode, &animate_has_started,
@@ -194,9 +195,8 @@
 
     // Submit the render tree and animation to the rendering pipeline for
     // rasterization (and the execution of our animation callback).
-    pipeline.Submit(Submission(
-        test_node, new NodeAnimationsMap(animations.Pass()),
-        base::Time::Now() - base::Time::UnixEpoch()));
+    pipeline.Submit(Submission(new AnimateNode(animations, test_node),
+                               base::Time::Now() - base::Time::UnixEpoch()));
 
     // Wait for all events that we have planned to occur.
     animate_has_started.Wait();
diff --git a/src/cobalt/renderer/pipeline.cc b/src/cobalt/renderer/pipeline.cc
index 66ea9a2..a5f38e7 100644
--- a/src/cobalt/renderer/pipeline.cc
+++ b/src/cobalt/renderer/pipeline.cc
@@ -22,10 +22,11 @@
 #include "base/file_util.h"
 #include "base/path_service.h"
 #include "cobalt/base/cobalt_paths.h"
+#include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/render_tree/dump_render_tree_to_string.h"
 
 using cobalt::render_tree::Node;
-using cobalt::render_tree::animations::NodeAnimationsMap;
+using cobalt::render_tree::animations::AnimateNode;
 
 namespace cobalt {
 namespace renderer {
@@ -134,10 +135,11 @@
 
 void Pipeline::Submit(const Submission& render_tree_submission) {
   TRACE_EVENT0("cobalt::renderer", "Pipeline::Submit()");
+
   // Execute the actual set of the new render tree on the rasterizer tree.
   rasterizer_thread_.message_loop()->PostTask(
       FROM_HERE, base::Bind(&Pipeline::SetNewRenderTree, base::Unretained(this),
-                            render_tree_submission));
+                            CollectAnimations(render_tree_submission)));
 }
 
 void Pipeline::Clear() {
@@ -160,7 +162,7 @@
     rasterizer_thread_.message_loop()->PostTask(
         FROM_HERE,
         base::Bind(&Pipeline::RasterizeToRGBAPixels, base::Unretained(this),
-                   render_tree_submission, complete));
+                   CollectAnimations(render_tree_submission), complete));
     return;
   }
   // Create a new target that is the same dimensions as the display target.
@@ -231,8 +233,11 @@
   TRACE_EVENT0("cobalt::renderer",
                "Pipeline::RasterizeSubmissionToRenderTarget()");
   // Animate the render tree using the submitted animations.
-  scoped_refptr<Node> animated_render_tree = submission.animations->Apply(
-      submission.render_tree, submission.time_offset);
+  render_tree::animations::AnimateNode* animate_node =
+      base::polymorphic_downcast<render_tree::animations::AnimateNode*>(
+          submission.render_tree.get());
+  scoped_refptr<Node> animated_render_tree =
+      animate_node->Apply(submission.time_offset);
 
   // Rasterize the animated render tree.
   rasterizer_->Submit(animated_render_tree, render_target);
@@ -311,8 +316,11 @@
   Submission submission =
       submission_queue_->GetCurrentSubmission(base::TimeTicks::Now());
 
-  scoped_refptr<Node> animated_render_tree = submission.animations->Apply(
-      submission.render_tree, submission.time_offset);
+  render_tree::animations::AnimateNode* animate_node =
+      base::polymorphic_downcast<render_tree::animations::AnimateNode*>(
+          submission.render_tree.get());
+  scoped_refptr<Node> animated_render_tree =
+      animate_node->Apply(submission.time_offset);
 
   std::string tree_dump =
       render_tree::DumpRenderTreeToString(animated_render_tree);
@@ -330,5 +338,16 @@
 }
 #endif  // #if defined(ENABLE_DEBUG_CONSOLE)
 
+Submission Pipeline::CollectAnimations(
+    const Submission& render_tree_submission) {
+  // Constructing an AnimateNode will result in the tree being traversed to
+  // collect all sub-AnimateNodes into the new one, in order to maintain the
+  // invariant that a sub-tree of an AnimateNode has no AnimateNodes.
+  Submission collected_submission = render_tree_submission;
+  collected_submission.render_tree = new render_tree::animations::AnimateNode(
+      render_tree_submission.render_tree);
+  return collected_submission;
+}
+
 }  // namespace renderer
 }  // namespace cobalt
diff --git a/src/cobalt/renderer/pipeline.h b/src/cobalt/renderer/pipeline.h
index 98f3f1c..ad05b29 100644
--- a/src/cobalt/renderer/pipeline.h
+++ b/src/cobalt/renderer/pipeline.h
@@ -27,7 +27,7 @@
 #include "base/threading/thread_checker.h"
 #include "base/timer.h"
 #include "cobalt/base/c_val_time_interval_timer.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/node.h"
 #include "cobalt/renderer/backend/graphics_context.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
@@ -125,6 +125,13 @@
   void OnDumpCurrentRenderTree(const std::string&);
 #endif  // defined(ENABLE_DEBUG_CONSOLE)
 
+  // Render trees may contain a number of AnimateNodes (or none).  In order
+  // to optimize for applying the animations on the rasterizer thread, this
+  // function searches the tree for AnimateNodes and collects all of their
+  // information into a single AnimateNode at the root of the returned
+  // render tree.
+  Submission CollectAnimations(const Submission& render_tree_submission);
+
   base::WaitableEvent rasterizer_created_event_;
 
   // The render_target that all submitted render trees will be rasterized to.
diff --git a/src/cobalt/renderer/rasterizer/benchmark.cc b/src/cobalt/renderer/rasterizer/benchmark.cc
index aefb362..097d0bf 100644
--- a/src/cobalt/renderer/rasterizer/benchmark.cc
+++ b/src/cobalt/renderer/rasterizer/benchmark.cc
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/math/size.h"
 #include "cobalt/renderer/backend/default_graphics_system.h"
 #include "cobalt/renderer/backend/graphics_context.h"
@@ -28,19 +29,20 @@
 using cobalt::math::Size;
 using cobalt::math::SizeF;
 using cobalt::render_tree::AlphaFormat;
+using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::ImageData;
+using cobalt::render_tree::Node;
 using cobalt::render_tree::PixelFormat;
 using cobalt::render_tree::ResourceProvider;
-using cobalt::renderer::rasterizer::Rasterizer;
-using cobalt::renderer::RendererModule;
 using cobalt::renderer::backend::Display;
 using cobalt::renderer::backend::GraphicsContext;
 using cobalt::renderer::backend::GraphicsSystem;
 using cobalt::renderer::backend::RenderTarget;
 using cobalt::renderer::backend::SurfaceInfo;
+using cobalt::renderer::rasterizer::Rasterizer;
+using cobalt::renderer::RendererModule;
 using cobalt::renderer::test::scenes::AddBlankBackgroundToScene;
 using cobalt::renderer::test::scenes::CreateAllScenesCombinedScene;
-using cobalt::renderer::test::scenes::RenderTreeWithAnimations;
 using cobalt::system_window::SystemWindow;
 
 namespace {
@@ -63,7 +65,7 @@
   kOutputSurfaceTypeOffscreen,
 };
 
-typedef base::Callback<RenderTreeWithAnimations(
+typedef base::Callback<scoped_refptr<Node>(
     ResourceProvider*, const SizeF&, base::TimeDelta)> SceneCreateFunction;
 
 // RunRenderTreeSceneBenchmark serves as a framework for render tree scene
@@ -105,15 +107,16 @@
     DLOG(FATAL) << "Unknown output surface type.";
   }
 
-  RenderTreeWithAnimations scene =
+  scoped_refptr<Node> scene =
       scene_create_function.Run(rasterizer->GetResourceProvider(),
                                 test_surface->GetSize(), base::TimeDelta());
 
   const int kRenderIterationCount = 100;
   const float kFixedTimeStepInSecondsPerFrame = 0.016f;
   for (int i = 0; i < kRenderIterationCount; ++i) {
-    scoped_refptr<cobalt::render_tree::Node> animated = scene.animations->Apply(
-        scene.render_tree,
+    AnimateNode* animate_node =
+        base::polymorphic_downcast<AnimateNode*>(scene.get());
+    scoped_refptr<Node> animated = animate_node->Apply(
         base::TimeDelta::FromSecondsD(i * kFixedTimeStepInSecondsPerFrame));
 
     // Submit the render tree to be rendered.
@@ -133,7 +136,7 @@
 #define RENDER_TREE_BUILDER_BENCHMARK(test_name)                              \
   TRACE_EVENT_BENCHMARK5(                                                     \
       test_name, "BuildRenderTree", cobalt::trace_event::IN_SCOPE_DURATION,   \
-      "NodeAnimationsMap::Apply()", cobalt::trace_event::IN_SCOPE_DURATION,   \
+      "AnimateNode::Apply()", cobalt::trace_event::IN_SCOPE_DURATION,         \
       "Rasterizer::Submit()", cobalt::trace_event::FLOW_DURATION,             \
       "Rasterizer::Submit()", cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS, \
       "VisitRenderTree", cobalt::trace_event::IN_SCOPE_DURATION)
diff --git a/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.cc b/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.cc
index 2f73a29..2868926 100644
--- a/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.cc
+++ b/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.cc
@@ -38,6 +38,7 @@
 class HardwareRasterizer::Impl {
  public:
   explicit Impl(backend::GraphicsContext* graphics_context,
+                int scratch_surface_size_in_bytes,
                 int surface_cache_size_in_bytes);
   ~Impl();
 
@@ -57,16 +58,21 @@
 
   int64 submit_count_;
 
+  ScratchSurfaceCache scratch_surface_cache_;
   base::optional<SurfaceCacheDelegate> surface_cache_delegate_;
   base::optional<common::SurfaceCache> surface_cache_;
 };
 
 HardwareRasterizer::Impl::Impl(backend::GraphicsContext* graphics_context,
+                               int scratch_surface_size_in_bytes,
                                int surface_cache_size_in_bytes)
     : context_(base::polymorphic_downcast<backend::GraphicsContextBlitter*>(
           graphics_context)),
       software_rasterizer_(0),
-      submit_count_(0) {
+      submit_count_(0),
+      scratch_surface_cache_(context_->GetSbBlitterDevice(),
+                             context_->GetSbBlitterContext(),
+                             scratch_surface_size_in_bytes) {
   resource_provider_ = scoped_ptr<render_tree::ResourceProvider>(
       new ResourceProvider(context_->GetSbBlitterDevice(),
                            software_rasterizer_.GetResourceProvider()));
@@ -126,7 +132,7 @@
         RenderState(render_target_blitter->GetSbRenderTarget(), Transform(),
                     BoundsStack(context_->GetSbBlitterContext(),
                                 math::Rect(render_target_blitter->GetSize()))),
-        &software_rasterizer_,
+        &software_rasterizer_, &scratch_surface_cache_,
         surface_cache_delegate_ ? &surface_cache_delegate_.value() : NULL,
         surface_cache_ ? &surface_cache_.value() : NULL);
     render_tree->Accept(&visitor);
@@ -144,8 +150,10 @@
 }
 
 HardwareRasterizer::HardwareRasterizer(
-    backend::GraphicsContext* graphics_context, int surface_cache_size_in_bytes)
-    : impl_(new Impl(graphics_context, surface_cache_size_in_bytes)) {}
+    backend::GraphicsContext* graphics_context,
+    int scratch_surface_size_in_bytes, int surface_cache_size_in_bytes)
+    : impl_(new Impl(graphics_context, scratch_surface_size_in_bytes,
+                     surface_cache_size_in_bytes)) {}
 
 HardwareRasterizer::~HardwareRasterizer() {}
 
diff --git a/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.h b/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.h
index 7562d32..abf4d4e 100644
--- a/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.h
+++ b/src/cobalt/renderer/rasterizer/blitter/hardware_rasterizer.h
@@ -21,6 +21,7 @@
 #include "cobalt/render_tree/resource_provider.h"
 #include "cobalt/renderer/backend/graphics_context.h"
 #include "cobalt/renderer/backend/render_target.h"
+#include "cobalt/renderer/rasterizer/blitter/scratch_surface_cache.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
 
 #if SB_HAS(BLITTER)
@@ -37,6 +38,7 @@
 class HardwareRasterizer : public Rasterizer {
  public:
   explicit HardwareRasterizer(backend::GraphicsContext* graphics_context,
+                              int scratch_surface_size_in_bytes,
                               int surface_cache_size_in_bytes);
   virtual ~HardwareRasterizer();
 
diff --git a/src/cobalt/renderer/rasterizer/blitter/rasterizer.gyp b/src/cobalt/renderer/rasterizer/blitter/rasterizer.gyp
index 0f7f474..8c75fd1 100644
--- a/src/cobalt/renderer/rasterizer/blitter/rasterizer.gyp
+++ b/src/cobalt/renderer/rasterizer/blitter/rasterizer.gyp
@@ -45,6 +45,7 @@
         'render_tree_blitter_conversions.cc',
         'render_tree_node_visitor.cc',
         'resource_provider.cc',
+        'scratch_surface_cache.cc',
         'surface_cache_delegate.cc',
       ],
 
diff --git a/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc b/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc
index 9af227b..3f37aeb 100644
--- a/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc
+++ b/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc
@@ -54,12 +54,14 @@
     SbBlitterDevice device, SbBlitterContext context,
     const RenderState& render_state,
     skia::SoftwareRasterizer* software_rasterizer,
+    ScratchSurfaceCache* scratch_surface_cache,
     SurfaceCacheDelegate* surface_cache_delegate,
     common::SurfaceCache* surface_cache)
     : software_rasterizer_(software_rasterizer),
       device_(device),
       context_(context),
       render_state_(render_state),
+      scratch_surface_cache_(scratch_surface_cache),
       surface_cache_delegate_(surface_cache_delegate),
       surface_cache_(surface_cache) {
   DCHECK_EQ(surface_cache_delegate_ == NULL, surface_cache_ == NULL);
@@ -135,16 +137,16 @@
 
     // Render our source subtree to an offscreen surface, and then we will
     // re-render it to our main render target with an alpha value applied to it.
-    OffscreenRender offscreen_render = RenderToOffscreenSurface(source);
-    if (!SbBlitterIsSurfaceValid(offscreen_render.surface)) {
+    scoped_ptr<OffscreenRender> offscreen_render =
+        RenderToOffscreenSurface(source);
+    if (!offscreen_render) {
       // This can happen if the output area of the source node is 0, in which
       // case we're trivially done.
       return;
     }
 
-    SbBlitterSurfaceInfo offscreen_surface_info;
-    CHECK(SbBlitterGetSurfaceInfo(offscreen_render.surface,
-                                  &offscreen_surface_info));
+    SbBlitterSurface offscreen_surface =
+        offscreen_render->scratch_surface->GetSurface();
 
     // Now blit our offscreen surface to our main render target with opacity
     // applied.
@@ -154,15 +156,10 @@
         context_,
         SbBlitterColorFromRGBA(255, 255, 255, static_cast<int>(255 * opacity)));
     SbBlitterBlitRectToRect(
-        context_, offscreen_render.surface,
-        SbBlitterMakeRect(0, 0, offscreen_surface_info.width,
-                          offscreen_surface_info.height),
-        SbBlitterMakeRect(
-            offscreen_render.position.x(), offscreen_render.position.y(),
-            offscreen_surface_info.width, offscreen_surface_info.height));
-
-    // Destroy our temporary offscreeen surface now that we are done with it.
-    SbBlitterDestroySurface(offscreen_render.surface);
+        context_, offscreen_surface,
+        SbBlitterMakeRect(0, 0, offscreen_render->destination_rect.width(),
+                          offscreen_render->destination_rect.height()),
+        RectFToBlitterRect(offscreen_render->destination_rect));
   }
 }
 
@@ -456,7 +453,7 @@
   SbBlitterDestroySurface(surface);
 }
 
-RenderTreeNodeVisitor::OffscreenRender
+scoped_ptr<RenderTreeNodeVisitor::OffscreenRender>
 RenderTreeNodeVisitor::RenderToOffscreenSurface(render_tree::Node* node) {
   common::OffscreenRenderCoordinateMapping coord_mapping =
       common::GetOffscreenRenderCoordinateMapping(
@@ -464,9 +461,7 @@
           render_state_.bounds_stack.Top());
   if (coord_mapping.output_bounds.IsEmpty()) {
     // There's nothing to render if the bounds are 0.
-    OffscreenRender ret;
-    ret.surface = kSbBlitterInvalidSurface;
-    return ret;
+    return scoped_ptr<OffscreenRender>();
   }
   DCHECK_GE(0.001f, std::abs(1.0f -
                              render_state_.transform.scale().x() *
@@ -475,28 +470,22 @@
                              render_state_.transform.scale().y() *
                                  coord_mapping.output_post_scale.y()));
 
-  SbBlitterSurface surface = SbBlitterCreateRenderTargetSurface(
-      device_, coord_mapping.output_bounds.width(),
-      coord_mapping.output_bounds.height(), kSbBlitterSurfaceFormatRGBA8);
+  scoped_ptr<CachedScratchSurface> scratch_surface(new CachedScratchSurface(
+      scratch_surface_cache_, coord_mapping.output_bounds.size()));
+  SbBlitterSurface surface = scratch_surface->GetSurface();
   SbBlitterRenderTarget render_target =
       SbBlitterGetRenderTargetFromSurface(surface);
 
   SbBlitterSetRenderTarget(context_, render_target);
 
-  // Clear the background to fully transparent before we begin rendering the
-  // subtree.
-  SbBlitterSetBlending(context_, false);
-  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 0, 0));
-  SbBlitterFillRect(
-      context_, RectToBlitterRect(Rect(coord_mapping.output_bounds.size())));
-
   // Render to the sub-surface.
   RenderTreeNodeVisitor sub_visitor(
       device_, context_,
       RenderState(
           render_target, Transform(coord_mapping.sub_render_transform),
           BoundsStack(context_, Rect(coord_mapping.output_bounds.size()))),
-      software_rasterizer_, surface_cache_delegate_, surface_cache_);
+      software_rasterizer_, scratch_surface_cache_, surface_cache_delegate_,
+      surface_cache_);
   node->Accept(&sub_visitor);
 
   // Restore our original render target.
@@ -509,11 +498,12 @@
                               coord_mapping.output_pre_translate +
                               render_state_.transform.translate();
 
-  OffscreenRender ret;
-  ret.position.SetPoint(output_point.x(), output_point.y());
-  ret.surface = surface;
+  scoped_ptr<OffscreenRender> ret(new OffscreenRender());
+  ret->destination_rect =
+      math::RectF(output_point, coord_mapping.output_bounds.size());
+  ret->scratch_surface = scratch_surface.Pass();
 
-  return ret;
+  return ret.Pass();
 }
 
 }  // namespace blitter
diff --git a/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.h b/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.h
index 3370321..4677308 100644
--- a/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.h
+++ b/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.h
@@ -33,6 +33,7 @@
 #include "cobalt/render_tree/rect_shadow_node.h"
 #include "cobalt/render_tree/text_node.h"
 #include "cobalt/renderer/rasterizer/blitter/render_state.h"
+#include "cobalt/renderer/rasterizer/blitter/scratch_surface_cache.h"
 #include "cobalt/renderer/rasterizer/blitter/surface_cache_delegate.h"
 #include "cobalt/renderer/rasterizer/common/surface_cache.h"
 #include "cobalt/renderer/rasterizer/skia/software_rasterizer.h"
@@ -42,6 +43,13 @@
 #if SB_HAS(BLITTER)
 
 namespace cobalt {
+
+namespace render_tree {
+namespace animations {
+class AnimateNode;
+}  // namespace animations
+}  // namespace render_tree
+
 namespace renderer {
 namespace rasterizer {
 namespace blitter {
@@ -55,9 +63,13 @@
   RenderTreeNodeVisitor(SbBlitterDevice device, SbBlitterContext context,
                         const RenderState& render_state,
                         skia::SoftwareRasterizer* software_rasterizer,
+                        ScratchSurfaceCache* scratch_surface_cache,
                         SurfaceCacheDelegate* surface_cache_delegate,
                         common::SurfaceCache* surface_cache);
 
+  void Visit(render_tree::animations::AnimateNode* animate_node) OVERRIDE {
+    NOTREACHED();
+  }
   void Visit(render_tree::CompositionNode* composition_node) OVERRIDE;
   void Visit(render_tree::FilterNode* filter_node) OVERRIDE;
   void Visit(render_tree::ImageNode* image_node) OVERRIDE;
@@ -82,10 +94,10 @@
   // Uses a Blitter API sub-visitor to render the provided render tree to a
   // offscreen SbBlitterSurface which is then returned.
   struct OffscreenRender {
-    math::Point position;
-    SbBlitterSurface surface;
+    math::RectF destination_rect;
+    scoped_ptr<CachedScratchSurface> scratch_surface;
   };
-  OffscreenRender RenderToOffscreenSurface(render_tree::Node* node);
+  scoped_ptr<OffscreenRender> RenderToOffscreenSurface(render_tree::Node* node);
 
   // We maintain an instance of a software skia rasterizer which is used to
   // render anything that we cannot render via the Blitter API directly.
@@ -97,6 +109,10 @@
   // Keeps track of our current render target, transform and clip stack.
   RenderState render_state_;
 
+  // Manager for scratch surfaces used for intermediate rendering during render
+  // tree traversal.
+  ScratchSurfaceCache* scratch_surface_cache_;
+
   SurfaceCacheDelegate* surface_cache_delegate_;
   common::SurfaceCache* surface_cache_;
   base::optional<SurfaceCacheDelegate::ScopedContext>
diff --git a/src/cobalt/renderer/rasterizer/blitter/scratch_surface_cache.cc b/src/cobalt/renderer/rasterizer/blitter/scratch_surface_cache.cc
new file mode 100644
index 0000000..d9b3790
--- /dev/null
+++ b/src/cobalt/renderer/rasterizer/blitter/scratch_surface_cache.cc
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2016 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/renderer/rasterizer/blitter/scratch_surface_cache.h"
+
+#include "cobalt/base/polymorphic_downcast.h"
+#include "starboard/blitter.h"
+
+#if SB_HAS(BLITTER)
+
+namespace cobalt {
+namespace renderer {
+namespace rasterizer {
+namespace blitter {
+
+namespace {
+
+class BlitterSurface : public common::ScratchSurfaceCache::Surface {
+ public:
+  BlitterSurface(SbBlitterSurface surface, const math::Size& size)
+      : surface_(surface), size_(size) {}
+  ~BlitterSurface() OVERRIDE { SbBlitterDestroySurface(surface_); }
+
+  math::Size GetSize() const OVERRIDE { return size_; }
+
+  SbBlitterSurface blitter_surface() { return surface_; }
+
+ private:
+  SbBlitterSurface surface_;
+  math::Size size_;
+};
+}  // namespace
+
+ScratchSurfaceCache::ScratchSurfaceCache(SbBlitterDevice device,
+                                         SbBlitterContext context,
+                                         int cache_capacity_in_bytes)
+    : delegate_(device, context), cache_(&delegate_, cache_capacity_in_bytes) {}
+
+ScratchSurfaceCache::Delegate::Delegate(SbBlitterDevice device,
+                                        SbBlitterContext context)
+    : device_(device), context_(context) {}
+
+common::ScratchSurfaceCache::Surface*
+ScratchSurfaceCache::Delegate::CreateSurface(const math::Size& size) {
+  return new BlitterSurface(
+      SbBlitterCreateRenderTargetSurface(device_, size.width(), size.height(),
+                                         kSbBlitterSurfaceFormatRGBA8),
+      size);
+}
+
+void ScratchSurfaceCache::Delegate::DestroySurface(
+    common::ScratchSurfaceCache::Surface* surface) {
+  delete surface;
+}
+
+void ScratchSurfaceCache::Delegate::PrepareForUse(
+    common::ScratchSurfaceCache::Surface* surface, const math::Size& area) {
+  SbBlitterSurface blitter_surface =
+      base::polymorphic_downcast<BlitterSurface*>(surface)->blitter_surface();
+
+  SbBlitterSetRenderTarget(
+      context_, SbBlitterGetRenderTargetFromSurface(blitter_surface));
+  SbBlitterSetBlending(context_, false);
+  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 0, 0));
+  SbBlitterFillRect(context_,
+                    SbBlitterMakeRect(0, 0, area.width(), area.height()));
+}
+
+SbBlitterSurface CachedScratchSurface::GetSurface() {
+  return base::polymorphic_downcast<BlitterSurface*>(
+             common_scratch_surface_.GetSurface())
+      ->blitter_surface();
+}
+
+}  // namespace blitter
+}  // namespace rasterizer
+}  // namespace renderer
+}  // namespace cobalt
+
+#endif  // SB_HAS(BLITTER)
diff --git a/src/cobalt/renderer/rasterizer/blitter/scratch_surface_cache.h b/src/cobalt/renderer/rasterizer/blitter/scratch_surface_cache.h
new file mode 100644
index 0000000..675a498
--- /dev/null
+++ b/src/cobalt/renderer/rasterizer/blitter/scratch_surface_cache.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2016 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_RENDERER_RASTERIZER_BLITTER_SCRATCH_SURFACE_CACHE_H_
+#define COBALT_RENDERER_RASTERIZER_BLITTER_SCRATCH_SURFACE_CACHE_H_
+
+#include "cobalt/math/size.h"
+#include "cobalt/renderer/rasterizer/common/scratch_surface_cache.h"
+#include "starboard/blitter.h"
+
+#if SB_HAS(BLITTER)
+
+namespace cobalt {
+namespace renderer {
+namespace rasterizer {
+namespace blitter {
+
+// We define a blitter::ScratchSurfaceCache class here that decorates
+// common::ScratchSurfaceCache by customizing it to be Blitter API specific.
+// A Blitter API renderer can use this class to request temporary scratch
+// SbBlitterSurfaces that can be automatically re-used over the course of a
+// frame.  CachedScratchSurface objects must be created in order to actually
+// interact with ScratchSurfaceCache.
+class ScratchSurfaceCache {
+ public:
+  // |device| specifies the |device| from which surfaces should be allocated
+  // from and |context| specifies which context to use when draw commands need
+  // to be issued (e.g. to clear a surface so it is ready for use).
+  ScratchSurfaceCache(SbBlitterDevice device, SbBlitterContext context,
+                      int cache_capacity_in_bytes);
+
+ private:
+  class Delegate : public common::ScratchSurfaceCache::Delegate {
+   public:
+    Delegate(SbBlitterDevice device, SbBlitterContext context);
+
+    common::ScratchSurfaceCache::Surface* CreateSurface(
+        const math::Size& size) OVERRIDE;
+    void DestroySurface(common::ScratchSurfaceCache::Surface* surface) OVERRIDE;
+    void PrepareForUse(common::ScratchSurfaceCache::Surface* surface,
+                       const math::Size& area) OVERRIDE;
+
+   private:
+    SbBlitterDevice device_;
+    SbBlitterContext context_;
+  };
+
+  Delegate delegate_;
+  common::ScratchSurfaceCache cache_;
+
+  friend class CachedScratchSurface;
+};
+
+// This class acts as the interface to ScratchSurfaceCache.  It does so by
+// decorating common::CachedScratchSurface and adding methods to obtain
+// a reference to the Blitter API-specific SbBlitterSurface object.
+class CachedScratchSurface {
+ public:
+  CachedScratchSurface(ScratchSurfaceCache* cache, const math::Size& size)
+      : common_scratch_surface_(&cache->cache_, size) {}
+
+  // Returns a pointer to the Blitter surface.
+  SbBlitterSurface GetSurface();
+
+ private:
+  common::CachedScratchSurface common_scratch_surface_;
+};
+
+}  // namespace blitter
+}  // namespace rasterizer
+}  // namespace renderer
+}  // namespace cobalt
+
+#endif  // SB_HAS(BLITTER)
+
+#endif  // COBALT_RENDERER_RASTERIZER_BLITTER_SCRATCH_SURFACE_CACHE_H_
diff --git a/src/cobalt/renderer/rasterizer/common/common.gyp b/src/cobalt/renderer/rasterizer/common/common.gyp
index b03b34a..3db2828 100644
--- a/src/cobalt/renderer/rasterizer/common/common.gyp
+++ b/src/cobalt/renderer/rasterizer/common/common.gyp
@@ -20,8 +20,13 @@
 
       'sources': [
         'offscreen_render_coordinate_mapping.cc',
+        'offscreen_render_coordinate_mapping.h',
+        'scratch_surface_cache.cc',
+        'scratch_surface_cache.h',
         'streaming_best_fit_line.cc',
+        'streaming_best_fit_line.h',
         'surface_cache.cc',
+        'surface_cache.h',
       ],
 
       'dependencies': [
diff --git a/src/cobalt/renderer/rasterizer/common/scratch_surface_cache.cc b/src/cobalt/renderer/rasterizer/common/scratch_surface_cache.cc
new file mode 100644
index 0000000..dac975b
--- /dev/null
+++ b/src/cobalt/renderer/rasterizer/common/scratch_surface_cache.cc
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2016 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/renderer/rasterizer/common/scratch_surface_cache.h"
+
+#include <limits>
+
+#include "base/debug/trace_event.h"
+
+namespace cobalt {
+namespace renderer {
+namespace rasterizer {
+namespace common {
+
+namespace {
+
+// Approximate the memory usage of a given surface size.
+size_t ApproximateSurfaceMemory(const math::Size& size) {
+  // Here we assume that we use 4 bytes per pixel.
+  return size.width() * size.height() * 4;
+}
+
+}  // namespace
+
+ScratchSurfaceCache::ScratchSurfaceCache(Delegate* delegate,
+                                         int cache_capacity_in_bytes)
+    : delegate_(delegate),
+      cache_capacity_in_bytes_(cache_capacity_in_bytes),
+      surface_memory_(0) {}
+
+ScratchSurfaceCache::~ScratchSurfaceCache() {
+  DCHECK(surface_stack_.empty());
+  for (std::vector<Surface*>::iterator iter = unused_surfaces_.begin();
+       iter != unused_surfaces_.end(); ++iter) {
+    delegate_->DestroySurface(*iter);
+  }
+}
+
+ScratchSurfaceCache::Surface* ScratchSurfaceCache::AcquireScratchSurface(
+    const math::Size& size) {
+  TRACE_EVENT2("cobalt::renderer",
+               "ScratchSurfaceCache::AcquireScratchSurface()", "width",
+               size.width(), "height", size.height());
+
+  // First check if we can find a suitable surface in our cache that is at
+  // least the size requested.
+  Surface* surface = FindBestCachedSurface(size);
+
+  // If we didn't have any suitable surfaces in our cache, create a new one.
+  if (!surface) {
+    // Increase our total memory used on surfaces, and then initiate a purge
+    // to reduce memory to below our cache limit, if necessary.
+    surface_memory_ += ApproximateSurfaceMemory(size);
+    Purge();
+
+    // Create the surface.
+    surface = delegate_->CreateSurface(size);
+
+    if (!surface) {
+      // We were unable to allocate a scratch surface, either because we are
+      // low on memory or because the requested surface has large dimensions.
+      // Return null.
+      surface_memory_ -= ApproximateSurfaceMemory(size);
+      return NULL;
+    }
+  }
+
+  DCHECK(surface);
+
+  // Track that we have handed out this surface.
+  surface_stack_.push_back(surface);
+
+  delegate_->PrepareForUse(surface, size);
+
+  return surface;
+}
+
+void ScratchSurfaceCache::ReleaseScratchSurface(Surface* surface) {
+  TRACE_EVENT2("cobalt::renderer",
+               "ScratchSurfaceCache::ReleaseScratchSurface()", "width",
+               surface->GetSize().width(), "height",
+               surface->GetSize().height());
+
+  DCHECK_EQ(surface_stack_.back(), surface);
+  surface_stack_.pop_back();
+
+  // Add this surface to the end (where most recently used surfaces go) of the
+  // unused surfaces list, so that it can be returned by later calls to acquire
+  // a surface.
+  unused_surfaces_.push_back(surface);
+}
+
+namespace {
+
+float GetMatchScoreForSurfaceAndSize(ScratchSurfaceCache::Surface* surface,
+                                     const math::Size& size) {
+  math::Size surface_size = surface->GetSize();
+
+  // We use the negated sum of the squared differences between the requested
+  // width/height and the surface width/height as the score.
+  // This promotes returning the smallest surface possible that has a similar
+  // ratio.
+  int width_diff = surface_size.width() - size.width();
+  int height_diff = surface_size.height() - size.height();
+
+  return -width_diff * width_diff - height_diff * height_diff;
+}
+
+}  // namespace
+
+ScratchSurfaceCache::Surface* ScratchSurfaceCache::FindBestCachedSurface(
+    const math::Size& size) {
+  // Iterate through all cached surfaces to find the one that is the best match
+  // for the given size.  The function GetMatchScoreForSurfaceAndSize() is
+  // responsible for assigning a score to a Surface/math::Size pair.
+  float max_surface_score = -std::numeric_limits<float>::infinity();
+  std::vector<Surface*>::iterator max_iter = unused_surfaces_.end();
+  for (std::vector<Surface*>::iterator iter = unused_surfaces_.begin();
+       iter != unused_surfaces_.end(); ++iter) {
+    Surface* current_surface = *iter;
+    math::Size surface_size = current_surface->GetSize();
+    if (surface_size.width() >= size.width() &&
+        surface_size.height() >= size.height()) {
+      float surface_score =
+          GetMatchScoreForSurfaceAndSize(current_surface, size);
+
+      if (surface_score > max_surface_score) {
+        max_surface_score = surface_score;
+        max_iter = iter;
+      }
+    }
+  }
+
+  // If any of the cached unused surfaces had at least the specified
+  // width/height, return the one that had the highest score.
+  if (max_iter != unused_surfaces_.end()) {
+    Surface* surface = *max_iter;
+    // Remove this surface from the list of unused surfaces.
+    unused_surfaces_.erase(max_iter);
+    // Return the cached surface.
+    return surface;
+  } else {
+    // Otherwise return NULL to indicate that we do not have any suitable cached
+    // surfaces.
+    return NULL;
+  }
+}
+
+void ScratchSurfaceCache::Purge() {
+  // Delete surfaces from the front (least recently used) of |unused_surfaces_|
+  // until we have deleted all surfaces or lowered our memory usage to under
+  // |cache_capacity_in_bytes_|.
+  while (!unused_surfaces_.empty() &&
+         surface_memory_ > cache_capacity_in_bytes_) {
+    Surface* to_free = unused_surfaces_.front();
+    math::Size surface_size = to_free->GetSize();
+    surface_memory_ -= ApproximateSurfaceMemory(
+        math::Size(surface_size.width(), surface_size.height()));
+    delegate_->DestroySurface(to_free);
+    unused_surfaces_.erase(unused_surfaces_.begin());
+  }
+}
+
+}  // namespace common
+}  // namespace rasterizer
+}  // namespace renderer
+}  // namespace cobalt
diff --git a/src/cobalt/renderer/rasterizer/common/scratch_surface_cache.h b/src/cobalt/renderer/rasterizer/common/scratch_surface_cache.h
new file mode 100644
index 0000000..a482ffc
--- /dev/null
+++ b/src/cobalt/renderer/rasterizer/common/scratch_surface_cache.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2016 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_RENDERER_RASTERIZER_COMMON_SCRATCH_SURFACE_CACHE_H_
+#define COBALT_RENDERER_RASTERIZER_COMMON_SCRATCH_SURFACE_CACHE_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/logging.h"
+#include "cobalt/math/size.h"
+
+namespace cobalt {
+namespace renderer {
+namespace rasterizer {
+namespace common {
+
+// The ScratchSurfaceCache manages a set of platform-specific surface objects
+// that can be used for offscreen rendering (e.g. by a RenderTreeNodeVisitor).
+// In order to acquire surfaces from ScratchSurfaceCache, one should construct
+// a CachedScratchSurface object, from which they can get a pointer to the
+// Surface object.
+// It is unique because it caters to RenderTreeNodeVisitor's scratch
+// surface allocation pattern.  In particular, we don't mind handing out very
+// large scratch surfaces when very small surfaces are requested, because
+// typically only one surface is ever needed at a time.  When multiple surfaces
+// are necessary, the subsequent ones tend to be smaller than the previous
+// (because rendering is now happening within the previous ones), and so handing
+// out textures in large to small order makes sense.
+class ScratchSurfaceCache {
+ public:
+  class Surface {
+   public:
+    virtual ~Surface() {}
+    virtual math::Size GetSize() const = 0;
+  };
+  class Delegate {
+   public:
+    virtual Surface* CreateSurface(const math::Size& size) = 0;
+    virtual void DestroySurface(Surface* surface) = 0;
+    virtual void PrepareForUse(Surface* surface, const math::Size& area) = 0;
+  };
+
+  ScratchSurfaceCache(Delegate* delegate, int cache_capacity_in_bytes);
+  ~ScratchSurfaceCache();
+
+ private:
+  // Acquire (either via cache lookup or by creation if that fails) a scratch
+  // surface.
+  Surface* AcquireScratchSurface(const math::Size& size);
+  void ReleaseScratchSurface(Surface* surface);
+
+  // Searches through |unused_surfaces_| for one the one that best matches the
+  // requested size, among all those cached surfaces that have at least the
+  // requested size.
+  Surface* FindBestCachedSurface(const math::Size& size);
+
+  // Removes elements from the cache until we are below the cache limit.
+  void Purge();
+
+  // Allocate a new Surface and return it.
+  Surface* CreateScratchSurface(const math::Size& size);
+
+  // Implementation-specific details about how to create/destroy surfaces.
+  Delegate* delegate_;
+
+  // The maximum number of surface bytes that can be stored in the cache.
+  int cache_capacity_in_bytes_;
+
+  // We keep track of all surfaces we've handed out using |surface_stack_|.
+  // This is mostly for debug checks to verify that surfaces returned to us
+  // actually did come from us, and that they are returned in the expected
+  // order.
+  std::vector<Surface*> surface_stack_;
+
+  // |unused_surfaces_| is the heart of the cache, as it stores the surfaces
+  // that are unused but allocated and available to be handed out upon request.
+  // Most recently used surfaces are found at the end of this vector.
+  std::vector<Surface*> unused_surfaces_;
+
+  // Tracks how much total memory we've allocated towards surfaces.
+  size_t surface_memory_;
+
+  friend class CachedScratchSurface;
+};
+
+// The primary interface to ScratchSurfaceCache is through CachedScratchSurface
+// objects.  These effectively scope the acquisition of a cached surface, RAII
+// style.
+class CachedScratchSurface {
+ public:
+  CachedScratchSurface(ScratchSurfaceCache* cache, const math::Size& size)
+      : cache_(cache) {
+    surface_ = cache_->AcquireScratchSurface(size);
+  }
+
+  ~CachedScratchSurface() {
+    if (surface_) {
+      cache_->ReleaseScratchSurface(surface_);
+    }
+  }
+
+  // Returns a pointer to the platform-specific surface.  The platform can then
+  // downcast to the expected surface type.
+  ScratchSurfaceCache::Surface* GetSurface() { return surface_; }
+
+ private:
+  ScratchSurfaceCache* cache_;
+  ScratchSurfaceCache::Surface* surface_;
+};
+
+}  // namespace common
+}  // namespace rasterizer
+}  // namespace renderer
+}  // namespace cobalt
+
+#endif  // COBALT_RENDERER_RASTERIZER_COMMON_SCRATCH_SURFACE_CACHE_H_
diff --git a/src/cobalt/renderer/rasterizer/rasterizer_benchmark.cc b/src/cobalt/renderer/rasterizer/rasterizer_benchmark.cc
index 943cb95..ca2cc73 100644
--- a/src/cobalt/renderer/rasterizer/rasterizer_benchmark.cc
+++ b/src/cobalt/renderer/rasterizer/rasterizer_benchmark.cc
@@ -134,14 +134,13 @@
 
 // Setup a quick macro so that we can measure the same events for each
 // render tree builder benchmark.
-#define RENDER_TREE_BUILDER_BENCHMARK(test_name)\
-TRACE_EVENT_BENCHMARK5(\
-    test_name, \
-    "BuildRenderTree", cobalt::trace_event::IN_SCOPE_DURATION, \
-    "NodeAnimationsMap::Apply()", cobalt::trace_event::IN_SCOPE_DURATION, \
-    "Rasterizer::Submit()", cobalt::trace_event::FLOW_DURATION, \
-    "Rasterizer::Submit()", cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS, \
-    "VisitRenderTree", cobalt::trace_event::IN_SCOPE_DURATION)
+#define RENDER_TREE_BUILDER_BENCHMARK(test_name)                              \
+  TRACE_EVENT_BENCHMARK5(                                                     \
+      test_name, "BuildRenderTree", cobalt::trace_event::IN_SCOPE_DURATION,   \
+      "AnimateNode::Apply()", cobalt::trace_event::IN_SCOPE_DURATION,         \
+      "Rasterizer::Submit()", cobalt::trace_event::FLOW_DURATION,             \
+      "Rasterizer::Submit()", cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS, \
+      "VisitRenderTree", cobalt::trace_event::IN_SCOPE_DURATION)
 
 // A catch-all test that excercises every different render tree node at the
 // same time.  This is the same render tree builder used by the renderer
diff --git a/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.h b/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.h
index 74f4be2..b325107 100644
--- a/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.h
+++ b/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.h
@@ -33,6 +33,13 @@
 #include "third_party/skia/include/core/SkCanvas.h"
 
 namespace cobalt {
+
+namespace render_tree {
+namespace animations {
+class AnimateNode;
+}  // namespace animations
+}  // namespace render_tree
+
 namespace renderer {
 namespace rasterizer {
 namespace skia {
@@ -68,6 +75,9 @@
       SurfaceCacheDelegate* surface_cache_delegate,
       common::SurfaceCache* surface_cache, Type visitor_type = kType_Normal);
 
+  void Visit(render_tree::animations::AnimateNode* animate_node) OVERRIDE {
+    NOTREACHED();
+  }
   void Visit(render_tree::CompositionNode* composition_node) OVERRIDE;
   void Visit(render_tree::FilterNode* filter_node) OVERRIDE;
   void Visit(render_tree::ImageNode* image_node) OVERRIDE;
diff --git a/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.cc b/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.cc
index 1b62b9c..409c787 100644
--- a/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.cc
+++ b/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.cc
@@ -16,10 +16,7 @@
 
 #include "cobalt/renderer/rasterizer/skia/scratch_surface_cache.h"
 
-#include <limits>
-
-#include "base/debug/trace_event.h"
-
+#include "cobalt/base/polymorphic_downcast.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 
 namespace cobalt {
@@ -29,160 +26,68 @@
 
 namespace {
 
-// Approximate the memory usage of a given surface size.
-size_t ApproximateSurfaceMemory(const math::Size& size) {
-  // Here we assume that we use 4 bytes per pixel.
-  return size.width() * size.height() * 4;
-}
+class SkiaSurface : public common::ScratchSurfaceCache::Surface {
+ public:
+  SkiaSurface(SkSurface* surface, const math::Size& size)
+      : surface_(surface), size_(size) {}
 
+  math::Size GetSize() const OVERRIDE { return size_; }
+
+  SkSurface* sk_surface() { return surface_.get(); }
+
+ private:
+  SkAutoTUnref<SkSurface> surface_;
+  math::Size size_;
+};
 }  // namespace
 
 ScratchSurfaceCache::ScratchSurfaceCache(
-    const CreateSkSurfaceFunction& create_sk_surface_function,
+    CreateSkSurfaceFunction create_sk_surface_function,
     int cache_capacity_in_bytes)
-    : create_sk_surface_function_(create_sk_surface_function),
-      cache_capacity_in_bytes_(cache_capacity_in_bytes),
-      surface_memory_(0) {}
+    : delegate_(create_sk_surface_function),
+      cache_(&delegate_, cache_capacity_in_bytes) {}
 
-ScratchSurfaceCache::~ScratchSurfaceCache() {
-  DCHECK(surface_stack_.empty());
-  for (std::vector<SkSurface*>::iterator iter = unused_surfaces_.begin();
-       iter != unused_surfaces_.end(); ++iter) {
-    (*iter)->unref();
-  }
+ScratchSurfaceCache::Delegate::Delegate(
+    CreateSkSurfaceFunction create_sk_surface_function)
+    : create_sk_surface_function_(create_sk_surface_function) {}
+
+common::ScratchSurfaceCache::Surface*
+ScratchSurfaceCache::Delegate::CreateSurface(const math::Size& size) {
+  return new SkiaSurface(create_sk_surface_function_.Run(size), size);
 }
 
-SkSurface* ScratchSurfaceCache::AcquireScratchSurface(const math::Size& size) {
-  TRACE_EVENT2("cobalt::renderer",
-               "ScratchSurfaceCache::AcquireScratchSurface()", "width",
-               size.width(), "height", size.height());
+void ScratchSurfaceCache::Delegate::DestroySurface(
+    common::ScratchSurfaceCache::Surface* surface) {
+  delete surface;
+}
 
-  // First check if we can find a suitable surface in our cache that is at
-  // least the size requested.
-  SkSurface* surface = FindBestCachedSurface(size);
+void ScratchSurfaceCache::Delegate::PrepareForUse(
+    common::ScratchSurfaceCache::Surface* surface, const math::Size& area) {
+  SkSurface* sk_surface =
+      base::polymorphic_downcast<SkiaSurface*>(surface)->sk_surface();
 
-  // If we didn't have any suitable surfaces in our cache, create a new one.
-  if (!surface) {
-    // Increase our total memory used on surfaces, and then initiate a purge
-    // to reduce memory to below our cache limit, if necessary.
-    surface_memory_ += ApproximateSurfaceMemory(size);
-    Purge();
-
-    // Create the surface.
-    surface = create_sk_surface_function_.Run(size);
-
-    if (!surface) {
-      // We were unable to allocate a scratch surface, either because we are
-      // low on memory or because the requested surface has large dimensions.
-      // Return null.
-      surface_memory_ -= ApproximateSurfaceMemory(size);
-      return NULL;
-    }
-  }
-
-  DCHECK(surface);
-
-  // Track that we have handed out this surface.
-  surface_stack_.push_back(surface);
-
-  // Reset the surface's canvas settings such as transform matrix and clip.
-  SkCanvas* canvas = surface->getCanvas();
+  // Reset the sk_surface's canvas settings such as transform matrix and clip.
+  SkCanvas* canvas = sk_surface->getCanvas();
   canvas->restoreToCount(1);
   // Setup a save marker on the reset canvas so that we can restore this reset
-  // state when re-using the surface.
+  // state when re-using the sk_surface.
   canvas->save();
 
-  // Setup a clip rect on the surface to the requested size.  This can save
-  // us from drawing to pixels outside of the requested size, since the actual
-  // surface returned may be larger than the requested size.
-  canvas->clipRect(SkRect::MakeWH(size.width(), size.height()),
+  // Setup a clip rect on the sk_surface to the requested area.  This can save
+  // us from drawing to pixels outside of the requested area, since the actual
+  // sk_surface returned may be larger than the requested area.
+  canvas->clipRect(SkRect::MakeWH(area.width(), area.height()),
                    SkRegion::kReplace_Op);
 
   // Clear the draw area to RGBA(0, 0, 0, 0), as expected for a fresh scratch
-  // surface, before returning.
+  // sk_surface, before returning.
   canvas->drawARGB(0, 0, 0, 0, SkXfermode::kClear_Mode);
-
-  return surface;
 }
 
-void ScratchSurfaceCache::ReleaseScratchSurface(SkSurface* surface) {
-  TRACE_EVENT2("cobalt::renderer",
-               "ScratchSurfaceCache::ReleaseScratchSurface()", "width",
-               surface->width(), "height", surface->height());
-
-  DCHECK_EQ(surface_stack_.back(), surface);
-  surface_stack_.pop_back();
-
-  // Add this surface to the end (where most recently used surfaces go) of the
-  // unused surfaces list, so that it can be returned by later calls to acquire
-  // a surface.
-  unused_surfaces_.push_back(surface);
-}
-
-namespace {
-
-float GetMatchScoreForSurfaceAndSize(SkSurface* surface,
-                                     const math::Size& size) {
-  // We use the negated sum of the squared differences between the requested
-  // width/height and the surface width/height as the score.
-  // This promotes returning the smallest surface possible that has a similar
-  // ratio.
-  int width_diff = surface->width() - size.width();
-  int height_diff = surface->height() - size.height();
-
-  return -width_diff * width_diff - height_diff * height_diff;
-}
-
-}  // namespace
-
-SkSurface* ScratchSurfaceCache::FindBestCachedSurface(const math::Size& size) {
-  // Iterate through all cached surfaces to find the one that is the best match
-  // for the given size.  The function GetMatchScoreForSurfaceAndSize() is
-  // responsible for assigning a score to a SkSurface/math::Size pair.
-  float max_surface_score = -std::numeric_limits<float>::infinity();
-  std::vector<SkSurface*>::iterator max_iter = unused_surfaces_.end();
-  for (std::vector<SkSurface*>::iterator iter = unused_surfaces_.begin();
-       iter != unused_surfaces_.end(); ++iter) {
-    SkSurface* current_surface = *iter;
-    if (current_surface->width() >= size.width() &&
-        current_surface->height() >= size.height()) {
-      float surface_score =
-          GetMatchScoreForSurfaceAndSize(current_surface, size);
-
-      if (surface_score > max_surface_score) {
-        max_surface_score = surface_score;
-        max_iter = iter;
-      }
-    }
-  }
-
-  // If any of the cached unused surfaces had at least the specified
-  // width/height, return the one that had the highest score.
-  if (max_iter != unused_surfaces_.end()) {
-    SkSurface* surface = *max_iter;
-    // Remove this surface from the list of unused surfaces.
-    unused_surfaces_.erase(max_iter);
-    // Return the cached surface.
-    return surface;
-  } else {
-    // Otherwise return NULL to indicate that we do not have any suitable cached
-    // surfaces.
-    return NULL;
-  }
-}
-
-void ScratchSurfaceCache::Purge() {
-  // Delete surfaces from the front (least recently used) of |unused_surfaces_|
-  // until we have deleted all surfaces or lowered our memory usage to under
-  // |cache_capacity_in_bytes_|.
-  while (!unused_surfaces_.empty() &&
-         surface_memory_ > cache_capacity_in_bytes_) {
-    SkSurface* to_free = unused_surfaces_.front();
-    surface_memory_ -= ApproximateSurfaceMemory(
-        math::Size(to_free->width(), to_free->height()));
-    to_free->unref();
-    unused_surfaces_.erase(unused_surfaces_.begin());
-  }
+SkSurface* CachedScratchSurface::GetSurface() {
+  return base::polymorphic_downcast<SkiaSurface*>(
+             common_scratch_surface_.GetSurface())
+      ->sk_surface();
 }
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.h b/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.h
index 374cc66..eaf7ea5 100644
--- a/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.h
+++ b/src/cobalt/renderer/rasterizer/skia/scratch_surface_cache.h
@@ -22,96 +22,52 @@
 #include "base/callback.h"
 #include "base/logging.h"
 #include "cobalt/math/size.h"
+#include "cobalt/renderer/rasterizer/common/scratch_surface_cache.h"
 #include "third_party/skia/include/core/SkSurface.h"
-#include "third_party/skia/include/core/SkSurfaceProps.h"
 
 namespace cobalt {
 namespace renderer {
 namespace rasterizer {
 namespace skia {
 
-// The ScratchSurfaceCache manages a set of Skia SkSurface objects that can
-// be used for offscreen rendering (mainly by SkiaRenderTreeNodeVisitor).
-// In order to acquire surfaces from ScratchSurfaceCache, one should construct
-// a CachedScratchSurface object, from which they can get a pointer to the
-// SkSurface object.
-// It is unique because it caters to SkiaRenderTreeNodeVisitor's scratch
-// surface allocation pattern.  In particular, we don't mind handing out very
-// large scratch surfaces when very small surfaces are requested, because
-// typically only one surface is ever needed at a time.  When multiple surfaces
-// are necessary, the subsequent ones tend to be smaller than the previous
-// (because rendering is now happening within the previous ones), and so handing
-// out textures in large to small order makes sense.
 class ScratchSurfaceCache {
  public:
   typedef base::Callback<SkSurface*(const math::Size&)> CreateSkSurfaceFunction;
 
-  ScratchSurfaceCache(const CreateSkSurfaceFunction& create_sk_surface_function,
+  ScratchSurfaceCache(CreateSkSurfaceFunction create_sk_surface_function,
                       int cache_capacity_in_bytes);
-  ~ScratchSurfaceCache();
 
  private:
-  // Acquire (either via cache lookup or by creation if that fails) a scratch
-  // surface.
-  SkSurface* AcquireScratchSurface(const math::Size& size);
-  void ReleaseScratchSurface(SkSurface* surface);
+  class Delegate : public common::ScratchSurfaceCache::Delegate {
+   public:
+    explicit Delegate(CreateSkSurfaceFunction create_sk_surface_function);
 
-  // Searches through |unused_surfaces_| for one the one that best matches the
-  // requested size, among all those cached surfaces that have at least the
-  // requested size.
-  SkSurface* FindBestCachedSurface(const math::Size& size);
+    common::ScratchSurfaceCache::Surface* CreateSurface(
+        const math::Size& size) OVERRIDE;
+    void DestroySurface(common::ScratchSurfaceCache::Surface* surface) OVERRIDE;
+    void PrepareForUse(common::ScratchSurfaceCache::Surface* surface,
+                       const math::Size& area) OVERRIDE;
 
-  // Removes elements from the cache until we are below the cache limit.
-  void Purge();
+   private:
+    CreateSkSurfaceFunction create_sk_surface_function_;
+  };
 
-  // Allocate a new SkSurface and return it.
-  SkSurface* CreateScratchSurface(const math::Size& size);
-
-  // Called to allocate new SkSurfaces.
-  CreateSkSurfaceFunction create_sk_surface_function_;
-
-  // The maximum number of surface bytes that can be stored in the cache.
-  int cache_capacity_in_bytes_;
-
-  // We keep track of all surfaces we've handed out using |surface_stack_|.
-  // This is mostly for debug checks to verify that surfaces returned to us
-  // actually did come from us, and that they are returned in the expected
-  // order.
-  std::vector<SkSurface*> surface_stack_;
-
-  // |unused_surfaces_| is the heart of the cache, as it stores the surfaces
-  // that are unused but allocated and available to be handed out upon request.
-  // Most recently used surfaces are found at the end of this vector.
-  std::vector<SkSurface*> unused_surfaces_;
-
-  // Tracks how much total memory we've allocated towards surfaces.
-  size_t surface_memory_;
+  Delegate delegate_;
+  common::ScratchSurfaceCache cache_;
 
   friend class CachedScratchSurface;
 };
 
-// The primary interface to ScratchSurfaceCache is through CachedScratchSurface
-// objects.  These effectively scope the acquisition of a cached surface, RAII
-// style.
 class CachedScratchSurface {
  public:
   CachedScratchSurface(ScratchSurfaceCache* cache, const math::Size& size)
-      : cache_(cache) {
-    surface_ = cache_->AcquireScratchSurface(size);
-  }
-
-  ~CachedScratchSurface() {
-    if (surface_) {
-      cache_->ReleaseScratchSurface(surface_);
-    }
-  }
+      : common_scratch_surface_(&cache->cache_, size) {}
 
   // Returns a pointer to the Skia SkSurface.
-  SkSurface* GetSurface() { return surface_; }
+  SkSurface* GetSurface();
 
  private:
-  ScratchSurfaceCache* cache_;
-  SkSurface* surface_;
+  common::CachedScratchSurface common_scratch_surface_;
 };
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/renderer_module_default_options_starboard.cc b/src/cobalt/renderer/renderer_module_default_options_starboard.cc
index 50a38f0..db5086b 100644
--- a/src/cobalt/renderer/renderer_module_default_options_starboard.cc
+++ b/src/cobalt/renderer/renderer_module_default_options_starboard.cc
@@ -53,7 +53,8 @@
 #else
   return scoped_ptr<rasterizer::Rasterizer>(
       new rasterizer::blitter::HardwareRasterizer(
-          graphics_context, options.surface_cache_size_in_bytes));
+          graphics_context, options.scratch_surface_cache_size_in_bytes,
+          options.surface_cache_size_in_bytes));
 #endif  // COBALT_FORCE_SOFTWARE_RASTERIZER
 #else
 #error "Either GLES2 or the Starboard Blitter API must be available."
diff --git a/src/cobalt/renderer/sandbox/renderer_sandbox_main.cc b/src/cobalt/renderer/sandbox/renderer_sandbox_main.cc
index dc54939..3fddb14 100644
--- a/src/cobalt/renderer/sandbox/renderer_sandbox_main.cc
+++ b/src/cobalt/renderer/sandbox/renderer_sandbox_main.cc
@@ -30,7 +30,6 @@
 using cobalt::render_tree::ResourceProvider;
 using cobalt::renderer::test::scenes::AddBlankBackgroundToScene;
 using cobalt::renderer::test::scenes::CreateAllScenesCombinedScene;
-using cobalt::renderer::test::scenes::RenderTreeWithAnimations;
 using cobalt::system_window::SystemWindow;
 
 namespace {
@@ -67,7 +66,7 @@
   // Construct our render tree and associated animations to be passed into
   // the renderer pipeline for display.
   base::TimeDelta start_time = base::Time::Now() - base::Time::UnixEpoch();
-  RenderTreeWithAnimations scene = AddBlankBackgroundToScene(
+  scoped_refptr<cobalt::render_tree::Node> scene = AddBlankBackgroundToScene(
       CreateAllScenesCombinedScene(
           renderer_module_->pipeline()->GetResourceProvider(),
           output_dimensions, start_time),
@@ -75,8 +74,8 @@
 
   // Pass the render tree along with associated animations into the renderer
   // module to be displayed.
-  renderer_module_->pipeline()->Submit(cobalt::renderer::Submission(
-      scene.render_tree, scene.animations, start_time));
+  renderer_module_->pipeline()->Submit(
+      cobalt::renderer::Submission(scene, start_time));
 }
 
 RendererSandbox* g_renderer_sandbox = NULL;
diff --git a/src/cobalt/renderer/sandbox/scaling_text_sandbox_main.cc b/src/cobalt/renderer/sandbox/scaling_text_sandbox_main.cc
index 20f2685..71d2f04 100644
--- a/src/cobalt/renderer/sandbox/scaling_text_sandbox_main.cc
+++ b/src/cobalt/renderer/sandbox/scaling_text_sandbox_main.cc
@@ -30,7 +30,6 @@
 using cobalt::render_tree::ResourceProvider;
 using cobalt::renderer::test::scenes::AddBlankBackgroundToScene;
 using cobalt::renderer::test::scenes::CreateScalingTextScene;
-using cobalt::renderer::test::scenes::RenderTreeWithAnimations;
 using cobalt::system_window::SystemWindow;
 
 namespace {
@@ -62,15 +61,15 @@
   // Construct our render tree and associated animations to be passed into
   // the renderer pipeline for display.
   base::TimeDelta start_time = base::Time::Now() - base::Time::UnixEpoch();
-  RenderTreeWithAnimations scene = AddBlankBackgroundToScene(
+  scoped_refptr<cobalt::render_tree::Node> scene = AddBlankBackgroundToScene(
       CreateScalingTextScene(renderer_module.pipeline()->GetResourceProvider(),
                              output_dimensions, start_time),
       output_dimensions);
 
   // Pass the render tree along with associated animations into the renderer
   // module to be displayed.
-  renderer_module.pipeline()->Submit(cobalt::renderer::Submission(
-      scene.render_tree, scene.animations, start_time));
+  renderer_module.pipeline()->Submit(
+      cobalt::renderer::Submission(scene, start_time));
 
   base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(30));
 
diff --git a/src/cobalt/renderer/submission.h b/src/cobalt/renderer/submission.h
index 7cc86f2..2652e35 100644
--- a/src/cobalt/renderer/submission.h
+++ b/src/cobalt/renderer/submission.h
@@ -21,7 +21,7 @@
 #include "base/debug/trace_event.h"
 #include "base/memory/ref_counted.h"
 #include "base/time.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/node.h"
 
 namespace cobalt {
@@ -32,20 +32,14 @@
   // Convenience constructor that assumes there are no animations and sets up
   // an empty animation map.
   explicit Submission(scoped_refptr<render_tree::Node> render_tree)
-      : render_tree(render_tree),
-        animations(new render_tree::animations::NodeAnimationsMap(
-            render_tree::animations::NodeAnimationsMap::Builder().Pass())) {}
+      : render_tree(render_tree) {}
 
   // Submit a render tree as well as associated animations.  The
   // time_offset parameter indicates a time that will be used to offset all
   // times passed into animation functions.
-  Submission(
-      scoped_refptr<render_tree::Node> render_tree,
-      scoped_refptr<render_tree::animations::NodeAnimationsMap> animations,
-      base::TimeDelta time_offset)
-      : render_tree(render_tree),
-        animations(animations),
-        time_offset(time_offset) {}
+  Submission(scoped_refptr<render_tree::Node> render_tree,
+             base::TimeDelta time_offset)
+      : render_tree(render_tree), time_offset(time_offset) {}
 
   ~Submission() {
     TRACE_EVENT0("cobalt::renderer", "~Submission()");
@@ -53,17 +47,11 @@
     // Explicitly dereference the render tree and animation under the scope of
     // the above trace event.
     render_tree = NULL;
-    animations = NULL;
   }
 
   // Maintains the current render tree that is to be rendered next frame.
   scoped_refptr<render_tree::Node> render_tree;
 
-  // Maintains the current animations that are to be in effect (i.e. applied
-  // to current_tree_) for all rasterizations until specifically updated by a
-  // call to Submit().
-  scoped_refptr<render_tree::animations::NodeAnimationsMap> animations;
-
   // The time from some origin that the associated render tree animations were
   // created.  This permits the render thread to compute times relative
   // to the same origin when updating the animations, as well as hinting
diff --git a/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc b/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc
index ff5045a..133aa88 100644
--- a/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc
+++ b/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc
@@ -29,48 +29,41 @@
 using cobalt::math::SizeF;
 using cobalt::render_tree::CompositionNode;
 using cobalt::render_tree::ResourceProvider;
-using cobalt::render_tree::animations::NodeAnimationsMap;
+using cobalt::render_tree::animations::AnimateNode;
 
 namespace cobalt {
 namespace renderer {
 namespace test {
 namespace scenes {
 
-RenderTreeWithAnimations CreateAllScenesCombinedScene(
+scoped_refptr<render_tree::Node> CreateAllScenesCombinedScene(
     ResourceProvider* resource_provider, const SizeF& output_dimensions,
     base::TimeDelta start_time) {
   TRACE_EVENT0("cobalt::renderer_sandbox",
                "CreateAllScenesCombinedScene()");
   CompositionNode::Builder all_scenes_combined_scene_builder;
-  NodeAnimationsMap::Builder animations;
 
   // Compose all the render trees representing the sub-scenes through a
   // composition node, and merge the animations into one large set.
-  RenderTreeWithAnimations growing_rect_scene =
+  scoped_refptr<render_tree::Node> growing_rect_scene =
       CreateGrowingRectScene(output_dimensions, start_time);
-  all_scenes_combined_scene_builder.AddChild(growing_rect_scene.render_tree);
-  animations.Merge(*growing_rect_scene.animations);
+  all_scenes_combined_scene_builder.AddChild(growing_rect_scene);
 
-  RenderTreeWithAnimations spinning_sprites_scene =
-      CreateSpinningSpritesScene(
-          resource_provider, output_dimensions, start_time);
-  all_scenes_combined_scene_builder.AddChild(
-      spinning_sprites_scene.render_tree);
-  animations.Merge(*spinning_sprites_scene.animations);
+  scoped_refptr<render_tree::Node> spinning_sprites_scene =
+      CreateSpinningSpritesScene(resource_provider, output_dimensions,
+                                 start_time);
+  all_scenes_combined_scene_builder.AddChild(spinning_sprites_scene);
 
-  RenderTreeWithAnimations image_wrap_scene =
+  scoped_refptr<render_tree::Node> image_wrap_scene =
       CreateImageWrapScene(resource_provider, output_dimensions, start_time);
-  all_scenes_combined_scene_builder.AddChild(image_wrap_scene.render_tree);
-  animations.Merge(*image_wrap_scene.animations);
+  all_scenes_combined_scene_builder.AddChild(image_wrap_scene);
 
-  RenderTreeWithAnimations marquee_scene =
+  scoped_refptr<render_tree::Node> marquee_scene =
       CreateMarqueeScene(resource_provider, output_dimensions, start_time);
-  all_scenes_combined_scene_builder.AddChild(marquee_scene.render_tree);
-  animations.Merge(*marquee_scene.animations);
+  all_scenes_combined_scene_builder.AddChild(marquee_scene);
 
-  return RenderTreeWithAnimations(
-      new CompositionNode(all_scenes_combined_scene_builder.Pass()),
-      new NodeAnimationsMap(animations.Pass()));
+  return new AnimateNode(
+      new CompositionNode(all_scenes_combined_scene_builder.Pass()));
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.h b/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.h
index 2d098fc..e5c1eec 100644
--- a/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.h
+++ b/src/cobalt/renderer/test/scenes/all_scenes_combined_scene.h
@@ -29,7 +29,7 @@
 
 // This scene will simply composite all other scene types together into one
 // mega scene.
-RenderTreeWithAnimations CreateAllScenesCombinedScene(
+scoped_refptr<render_tree::Node> CreateAllScenesCombinedScene(
     render_tree::ResourceProvider* resource_provider,
     const math::SizeF& output_dimensions, base::TimeDelta start_time);
 
diff --git a/src/cobalt/renderer/test/scenes/growing_rect_scene.cc b/src/cobalt/renderer/test/scenes/growing_rect_scene.cc
index 54edd16..1f06a4b 100644
--- a/src/cobalt/renderer/test/scenes/growing_rect_scene.cc
+++ b/src/cobalt/renderer/test/scenes/growing_rect_scene.cc
@@ -27,15 +27,15 @@
 using cobalt::math::ScaleMatrix;
 using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::Brush;
 using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::RectNode;
 using cobalt::render_tree::SolidColorBrush;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
-using cobalt::render_tree::animations::NodeAnimationsMap;
 
 namespace cobalt {
 namespace renderer {
@@ -62,13 +62,13 @@
 
 }  // namespace
 
-RenderTreeWithAnimations CreateGrowingRectScene(
+scoped_refptr<render_tree::Node> CreateGrowingRectScene(
     const math::SizeF& output_dimensions, base::TimeDelta start_time) {
   // Create a centered, sawtoothed-growing black rectangle.  We need a
   // composition node for this so that the rectangle's position can be set
   // and animated.  We also use the composition node to animate the RectNode's
   // size.
-  NodeAnimationsMap::Builder animations;
+  AnimateNode::Builder animations;
 
   scoped_refptr<RectNode> growing_rect_node(new RectNode(
       math::RectF(output_dimensions),
@@ -81,8 +81,7 @@
                  base::Bind(&AnimateGrowingRectComposition, start_time,
                             output_dimensions));
 
-  return RenderTreeWithAnimations(transformed_growing_rect,
-                                  new NodeAnimationsMap(animations.Pass()));
+  return new AnimateNode(animations, transformed_growing_rect);
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/growing_rect_scene.h b/src/cobalt/renderer/test/scenes/growing_rect_scene.h
index d57c5b7..9ffabbc 100644
--- a/src/cobalt/renderer/test/scenes/growing_rect_scene.h
+++ b/src/cobalt/renderer/test/scenes/growing_rect_scene.h
@@ -28,7 +28,7 @@
 
 // This scene gives a gray rectangle centered in the screen that slowly grows
 // to fill the screen.
-RenderTreeWithAnimations CreateGrowingRectScene(
+scoped_refptr<render_tree::Node> CreateGrowingRectScene(
     const math::SizeF& output_dimensions, base::TimeDelta start_time);
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/image_wrap_scene.cc b/src/cobalt/renderer/test/scenes/image_wrap_scene.cc
index ee70281..1add5b4 100644
--- a/src/cobalt/renderer/test/scenes/image_wrap_scene.cc
+++ b/src/cobalt/renderer/test/scenes/image_wrap_scene.cc
@@ -34,15 +34,15 @@
 
 using cobalt::math::Matrix3F;
 using cobalt::math::SizeF;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::CompositionNode;
 using cobalt::render_tree::Image;
 using cobalt::render_tree::ImageNode;
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::ResourceProvider;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
-using cobalt::render_tree::animations::NodeAnimationsMap;
 using cobalt::renderer::test::png_utils::DecodePNGToRenderTreeImage;
 
 namespace cobalt {
@@ -89,10 +89,10 @@
 
 }  // namespace
 
-RenderTreeWithAnimations CreateImageWrapScene(
+scoped_refptr<render_tree::Node> CreateImageWrapScene(
     ResourceProvider* resource_provider, const math::SizeF& output_dimensions,
     base::TimeDelta start_time) {
-  NodeAnimationsMap::Builder animations;
+  AnimateNode::Builder animations;
 
   // Create an image node that will have its local_transform animated to
   // demonstrate what local_transform allows one to do.
@@ -107,8 +107,7 @@
 
   animations.Add(image_node, base::Bind(&AnimateImage, start_time));
 
-  return RenderTreeWithAnimations(
-      image_wrap_scene, new NodeAnimationsMap(animations.Pass()));
+  return new AnimateNode(animations, image_wrap_scene);
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/image_wrap_scene.h b/src/cobalt/renderer/test/scenes/image_wrap_scene.h
index 4c2d631..27726ff 100644
--- a/src/cobalt/renderer/test/scenes/image_wrap_scene.h
+++ b/src/cobalt/renderer/test/scenes/image_wrap_scene.h
@@ -31,7 +31,7 @@
 // shrunk, and so the texture repeats to fill the size of the image node.
 // The texture is also spinning.  This scene effectively shows off
 // ImageNode's local_matrix parameter.
-RenderTreeWithAnimations CreateImageWrapScene(
+scoped_refptr<render_tree::Node> CreateImageWrapScene(
     render_tree::ResourceProvider* resource_provider,
     const math::SizeF& output_dimensions, base::TimeDelta start_time);
 
diff --git a/src/cobalt/renderer/test/scenes/marquee_scene.cc b/src/cobalt/renderer/test/scenes/marquee_scene.cc
index f2630ce..3d44382 100644
--- a/src/cobalt/renderer/test/scenes/marquee_scene.cc
+++ b/src/cobalt/renderer/test/scenes/marquee_scene.cc
@@ -33,6 +33,9 @@
 using cobalt::math::RectF;
 using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::Brush;
 using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::CompositionNode;
@@ -45,9 +48,6 @@
 using cobalt::render_tree::ResourceProvider;
 using cobalt::render_tree::SolidColorBrush;
 using cobalt::render_tree::TextNode;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
-using cobalt::render_tree::animations::NodeAnimationsMap;
 
 namespace cobalt {
 namespace renderer {
@@ -85,11 +85,11 @@
 
 }  // namespace
 
-RenderTreeWithAnimations CreateMarqueeScene(
+scoped_refptr<render_tree::Node> CreateMarqueeScene(
     ResourceProvider* resource_provider, const math::SizeF& output_dimensions,
     base::TimeDelta start_time) {
   CompositionNode::Builder marquee_scene_builder;
-  NodeAnimationsMap::Builder animations;
+  AnimateNode::Builder animations;
 
   const std::string kMarqueeText("YouTube");
 
@@ -130,8 +130,7 @@
   animations.Add(marquee_node, base::Bind(&AnimateMarqueeElement, start_time,
                                           text_bounds, output_dimensions));
 
-  return RenderTreeWithAnimations(marquee_node,
-                                  new NodeAnimationsMap(animations.Pass()));
+  return new AnimateNode(animations, marquee_node);
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/marquee_scene.h b/src/cobalt/renderer/test/scenes/marquee_scene.h
index 0d15965..5b2055a 100644
--- a/src/cobalt/renderer/test/scenes/marquee_scene.h
+++ b/src/cobalt/renderer/test/scenes/marquee_scene.h
@@ -29,7 +29,7 @@
 
 // This render tree builder will create a scene containing highlighted
 // text scrolling smoothly from left to right.
-RenderTreeWithAnimations CreateMarqueeScene(
+scoped_refptr<render_tree::Node> CreateMarqueeScene(
     render_tree::ResourceProvider* resource_provider,
     const math::SizeF& output_dimensions, base::TimeDelta start_time);
 
diff --git a/src/cobalt/renderer/test/scenes/scaling_text_scene.cc b/src/cobalt/renderer/test/scenes/scaling_text_scene.cc
index 4ac33b5..952b03b 100644
--- a/src/cobalt/renderer/test/scenes/scaling_text_scene.cc
+++ b/src/cobalt/renderer/test/scenes/scaling_text_scene.cc
@@ -45,7 +45,7 @@
 using cobalt::render_tree::TextNode;
 using cobalt::render_tree::animations::Animation;
 using cobalt::render_tree::animations::AnimationList;
-using cobalt::render_tree::animations::NodeAnimationsMap;
+using cobalt::render_tree::animations::AnimateNode;
 
 namespace cobalt {
 namespace renderer {
@@ -62,7 +62,7 @@
 
 }  // namespace
 
-RenderTreeWithAnimations CreateScalingTextScene(
+scoped_refptr<render_tree::Node> CreateScalingTextScene(
     ResourceProvider* resource_provider, const math::SizeF& output_dimensions,
     base::TimeDelta start_time) {
   const std::string kText(
@@ -91,11 +91,10 @@
       Matrix3F::Identity()));
 
   // Setup the scaling animation on the text
-  NodeAnimationsMap::Builder animations;
+  AnimateNode::Builder animations;
   animations.Add(scaling_text_node, base::Bind(&ScaleText));
 
-  return RenderTreeWithAnimations(scaling_text_node,
-                                  new NodeAnimationsMap(animations.Pass()));
+  return new AnimateNode(animations, scaling_text_node);
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/scaling_text_scene.h b/src/cobalt/renderer/test/scenes/scaling_text_scene.h
index c6d8771..4b3226d 100644
--- a/src/cobalt/renderer/test/scenes/scaling_text_scene.h
+++ b/src/cobalt/renderer/test/scenes/scaling_text_scene.h
@@ -31,7 +31,7 @@
 // scale being applied to it, and the scale of all text is animated.
 // This is very useful for investigating issues with text scaling, which
 // internally can be quite non-trivial.
-RenderTreeWithAnimations CreateScalingTextScene(
+scoped_refptr<render_tree::Node> CreateScalingTextScene(
     render_tree::ResourceProvider* resource_provider,
     const math::SizeF& output_dimensions, base::TimeDelta start_time);
 
diff --git a/src/cobalt/renderer/test/scenes/scene_helpers.cc b/src/cobalt/renderer/test/scenes/scene_helpers.cc
index 724142c..39aa8d5 100644
--- a/src/cobalt/renderer/test/scenes/scene_helpers.cc
+++ b/src/cobalt/renderer/test/scenes/scene_helpers.cc
@@ -36,8 +36,8 @@
 namespace test {
 namespace scenes {
 
-RenderTreeWithAnimations AddBlankBackgroundToScene(
-    const RenderTreeWithAnimations& scene,
+scoped_refptr<render_tree::Node> AddBlankBackgroundToScene(
+    const scoped_refptr<render_tree::Node>& scene,
     const SizeF& output_dimensions) {
   // Declare a rectangle that fills the background to effectively clear the
   // screen.
@@ -45,10 +45,10 @@
   with_background_scene_builder.AddChild(make_scoped_refptr(new RectNode(
       RectF(output_dimensions),
       scoped_ptr<Brush>(new SolidColorBrush(ColorRGBA(1.0f, 1.0f, 1.0f))))));
-  with_background_scene_builder.AddChild(scene.render_tree);
+  with_background_scene_builder.AddChild(scene);
 
-  return RenderTreeWithAnimations(new CompositionNode(
-      with_background_scene_builder.Pass()), scene.animations);
+  return new render_tree::animations::AnimateNode(
+      new CompositionNode(with_background_scene_builder.Pass()));
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/scene_helpers.h b/src/cobalt/renderer/test/scenes/scene_helpers.h
index 67b6ab1..7c84d41 100644
--- a/src/cobalt/renderer/test/scenes/scene_helpers.h
+++ b/src/cobalt/renderer/test/scenes/scene_helpers.h
@@ -18,7 +18,7 @@
 #define COBALT_RENDERER_TEST_SCENES_SCENE_HELPERS_H_
 
 #include "cobalt/math/size_f.h"
-#include "cobalt/render_tree/animations/node_animations_map.h"
+#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/node.h"
 
 namespace cobalt {
@@ -30,18 +30,8 @@
 // animations.
 inline float Sawtooth(float x) { return x - static_cast<int>(x); }
 
-struct RenderTreeWithAnimations {
-  RenderTreeWithAnimations(
-      scoped_refptr<render_tree::Node> render_tree,
-      scoped_refptr<render_tree::animations::NodeAnimationsMap> animations)
-      : render_tree(render_tree), animations(animations) {}
-
-  scoped_refptr<render_tree::Node> render_tree;
-  scoped_refptr<render_tree::animations::NodeAnimationsMap> animations;
-};
-
-RenderTreeWithAnimations AddBlankBackgroundToScene(
-    const RenderTreeWithAnimations& scene,
+scoped_refptr<render_tree::Node> AddBlankBackgroundToScene(
+    const scoped_refptr<render_tree::Node>& scene,
     const math::SizeF& output_dimensions);
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/spinning_sprites_scene.cc b/src/cobalt/renderer/test/scenes/spinning_sprites_scene.cc
index c338454..e54d4b0 100644
--- a/src/cobalt/renderer/test/scenes/spinning_sprites_scene.cc
+++ b/src/cobalt/renderer/test/scenes/spinning_sprites_scene.cc
@@ -35,20 +35,20 @@
 
 using cobalt::math::Matrix3F;
 using cobalt::math::PointF;
-using cobalt::math::RotateMatrix;
 using cobalt::math::RectF;
+using cobalt::math::RotateMatrix;
 using cobalt::math::ScaleMatrix;
 using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::CompositionNode;
 using cobalt::render_tree::Image;
 using cobalt::render_tree::ImageNode;
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::ResourceProvider;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
-using cobalt::render_tree::animations::NodeAnimationsMap;
 using cobalt::renderer::test::png_utils::DecodePNGToRenderTreeImage;
 
 namespace cobalt {
@@ -118,14 +118,14 @@
 
 }  // namespace
 
-RenderTreeWithAnimations CreateSpinningSpritesScene(
+scoped_refptr<render_tree::Node> CreateSpinningSpritesScene(
     ResourceProvider* resource_provider, const math::SizeF& output_dimensions,
     base::TimeDelta start_time) {
   // Create an image for each SpriteInfo we have in our sprite_infos vector.
   // They will be positioned and scaled according to their SpriteInfo settings,
   // and rotated according to time.
   CompositionNode::Builder spinning_sprites_scene_builder;
-  NodeAnimationsMap::Builder animations;
+  AnimateNode::Builder animations;
 
   // Now, setup a plurality of spinning images that contain the test image.
   std::vector<SpriteInfo> sprite_infos = CreateSpriteInfos();
@@ -154,8 +154,7 @@
   scoped_refptr<CompositionNode> spinning_sprites_composition(
       new CompositionNode(spinning_sprites_scene_builder.Pass()));
 
-  return RenderTreeWithAnimations(spinning_sprites_composition,
-                                  new NodeAnimationsMap(animations.Pass()));
+  return new AnimateNode(animations, spinning_sprites_composition);
 }
 
 }  // namespace scenes
diff --git a/src/cobalt/renderer/test/scenes/spinning_sprites_scene.h b/src/cobalt/renderer/test/scenes/spinning_sprites_scene.h
index 9e56e63..56595ab 100644
--- a/src/cobalt/renderer/test/scenes/spinning_sprites_scene.h
+++ b/src/cobalt/renderer/test/scenes/spinning_sprites_scene.h
@@ -29,7 +29,7 @@
 
 // This scene will create a plurality of randomly positioned and sized sprites
 // that are all spinning at different rates.
-RenderTreeWithAnimations CreateSpinningSpritesScene(
+scoped_refptr<render_tree::Node> CreateSpinningSpritesScene(
     render_tree::ResourceProvider* resource_provider,
     const math::SizeF& output_dimensions, base::TimeDelta start_time);
 
diff --git a/src/cobalt/script/javascriptcore/jsc_global_object.cc b/src/cobalt/script/javascriptcore/jsc_global_object.cc
index 6596d1b..9122348 100644
--- a/src/cobalt/script/javascriptcore/jsc_global_object.cc
+++ b/src/cobalt/script/javascriptcore/jsc_global_object.cc
@@ -17,6 +17,7 @@
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
 
 #include "base/logging.h"
+#include "cobalt/script/javascriptcore/util/exception_helpers.h"
 
 namespace cobalt {
 namespace script {
@@ -57,6 +58,10 @@
       script_object_registry_(script_object_registry),
       environment_settings_(environment_settings) {}
 
+std::vector<script::StackFrame> JSCGlobalObject::GetStackTrace(int max_frames) {
+  return util::GetStackTrace(globalExec(), max_frames);
+}
+
 }  // namespace javascriptcore
 }  // namespace script
 }  // namespace cobalt
diff --git a/src/cobalt/script/javascriptcore/jsc_global_object.h b/src/cobalt/script/javascriptcore/jsc_global_object.h
index 9671b44..89f0dc6 100644
--- a/src/cobalt/script/javascriptcore/jsc_global_object.h
+++ b/src/cobalt/script/javascriptcore/jsc_global_object.h
@@ -26,6 +26,7 @@
 #include "cobalt/script/javascriptcore/js_object_cache.h"
 #include "cobalt/script/javascriptcore/script_object_registry.h"
 #include "cobalt/script/javascriptcore/wrapper_factory.h"
+#include "cobalt/script/stack_frame.h"
 #include "cobalt/script/wrappable.h"
 #include "third_party/WebKit/Source/JavaScriptCore/config.h"
 #include "third_party/WebKit/Source/JavaScriptCore/runtime/JSGlobalData.h"
@@ -59,6 +60,7 @@
   EnvironmentSettings* GetEnvironmentSettings() {
     return environment_settings_;
   }
+  std::vector<StackFrame> GetStackTrace(int max_frames = 0);
 
   // JavaScriptCore stuff
   DECLARE_CLASSINFO();
diff --git a/src/cobalt/script/mozjs/mozjs.cc b/src/cobalt/script/mozjs/mozjs.cc
index 0de17d2..6625ed2 100644
--- a/src/cobalt/script/mozjs/mozjs.cc
+++ b/src/cobalt/script/mozjs/mozjs.cc
@@ -21,8 +21,10 @@
 #include "base/string_util.h"
 #include "cobalt/base/wrap_main.h"
 #include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/source_code.h"
 #include "cobalt/script/standalone_javascript_runner.h"
 #include "third_party/mozjs/js/src/jsapi.h"
+#include "third_party/mozjs/js/src/jsproxy.h"
 
 namespace cobalt {
 namespace script {
@@ -50,6 +52,8 @@
 }
 
 void SetupBindings(JSContext* context, JSObject* global_object) {
+  DCHECK(JS_IsGlobalObject(global_object));
+
   JSAutoRequest auto_request(context);
   JSAutoCompartment auto_comparment(context, global_object);
   JS_DefineFunction(context, global_object, "print", &Print, 0,
@@ -58,18 +62,43 @@
 
 int MozjsMain(int argc, char** argv) {
   cobalt::script::StandaloneJavascriptRunner standalone_runner;
-  MozjsGlobalObjectProxy* global_object_proxy =
+  MozjsGlobalObjectProxy* global_object_environment =
       static_cast<MozjsGlobalObjectProxy*>(
           standalone_runner.global_object_proxy().get());
 
-  SetupBindings(global_object_proxy->context(),
-                global_object_proxy->global_object());
+  SetupBindings(global_object_environment->context(),
+                global_object_environment->global_object());
 
-  CommandLine command_line(argc, argv);
-  CommandLine::StringVector args = command_line.GetArgs();
-  if (!args.empty()) {
-    FilePath source_file(args[0]);
-    standalone_runner.ExecuteFile(source_file);
+  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_object_environment->EvaluateScript(source, &result);
+        // Echo the results to stdout.
+        if (!success) {
+          std::cout << "Exception: ";
+        }
+        std::cout << result << std::endl;
+        ++i;
+      }
+    }
   } else {
     standalone_runner.RunInteractive();
   }
diff --git a/src/cobalt/script/mozjs/mozjs.gyp b/src/cobalt/script/mozjs/mozjs.gyp
index 58728de..49f8313 100644
--- a/src/cobalt/script/mozjs/mozjs.gyp
+++ b/src/cobalt/script/mozjs/mozjs.gyp
@@ -27,6 +27,7 @@
         'mozjs_property_enumerator.cc',
         'mozjs_source_code.cc',
         'proxy_handler.cc',
+        'util/exception_helpers.cc',
         'wrapper_factory.cc',
         'wrapper_private.cc',
       ],
@@ -41,6 +42,11 @@
         'ENGINE_SUPPORTS_INDEXED_DELETERS',
         'ENGINE_SUPPORTS_INT64', ],
       },
+      'conditions' :[
+        ['cobalt_enable_jit == 1', {
+          'defines': [ 'ENGINE_SUPPORTS_JIT', ],
+        }],
+      ],
     },
 
     {
diff --git a/src/cobalt/script/mozjs/mozjs_exception_state.cc b/src/cobalt/script/mozjs/mozjs_exception_state.cc
index a4c575b..e7839c4 100644
--- a/src/cobalt/script/mozjs/mozjs_exception_state.cc
+++ b/src/cobalt/script/mozjs/mozjs_exception_state.cc
@@ -49,7 +49,18 @@
 void MozjsExceptionState::SetException(
     const scoped_refptr<ScriptException>& exception) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  NOTIMPLEMENTED();
+  DCHECK(!is_exception_set_);
+
+  MozjsGlobalObjectProxy* global_object_proxy =
+      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context_));
+
+  JS::RootedObject exception_object(
+      context_,
+      global_object_proxy->wrapper_factory()->GetWrapperProxy(exception));
+  JS::RootedValue exception_value(context_, OBJECT_TO_JSVAL(exception_object));
+  JS_SetPendingException(context_, exception_value);
+
+  is_exception_set_ = true;
 }
 
 void MozjsExceptionState::SetSimpleException(
diff --git a/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc b/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
index 43c45bc..8622146 100644
--- a/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
+++ b/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
@@ -15,13 +15,18 @@
  */
 #include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
 
+#include <algorithm>
 #include <utility>
 
+#include "base/lazy_instance.h"
 #include "base/stringprintf.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_source_code.h"
+#include "cobalt/script/mozjs/mozjs_wrapper_handle.h"
+#include "cobalt/script/mozjs/proxy_handler.h"
+#include "cobalt/script/mozjs/util/exception_helpers.h"
 #include "third_party/mozjs/js/src/jsfriendapi.h"
 #include "third_party/mozjs/js/src/jsfun.h"
 #include "third_party/mozjs/js/src/jsobj.h"
@@ -66,6 +71,52 @@
 
 // This is the default in the spidermonkey shell.
 const uint32_t kMaxCodeCacheBytes = 16 * 1024 * 1024;
+
+// DOM proxies have an extra slot for the expando object at index
+// kJSProxySlotExpando.
+// The expando object is a plain JSObject whose properties correspond to
+// "expandos" (custom properties set by the script author).
+// The exact value stored in the kJSProxySlotExpando slot depends on whether
+// the interface is annotated with the [OverrideBuiltins] extended attribute.
+const uint32_t kJSProxySlotExpando = 0;
+
+// The DOMProxyShadowsCheck function will be called to check if the property for
+// id should be gotten from the prototype, or if there is an own property that
+// shadows it.
+js::DOMProxyShadowsResult DOMProxyShadowsCheck(JSContext* context,
+                                               JS::HandleObject proxy,
+                                               JS::HandleId id) {
+  DCHECK(IsProxy(proxy));
+  JS::Value value = js::GetProxyExtra(proxy, kJSProxySlotExpando);
+  DCHECK(value.isUndefined() || value.isObject());
+
+  // [OverrideBuiltins] extended attribute is not supported.
+  NOTIMPLEMENTED();
+
+  // If DoesntShadow is returned then the slot at listBaseExpandoSlot should
+  // either be undefined or point to an expando object that would contain the
+  // own property.
+  return js::DoesntShadow;
+}
+
+class MozjsStubHandler : public ProxyHandler {
+ public:
+  MozjsStubHandler()
+      : ProxyHandler(indexed_property_hooks, named_property_hooks) {}
+
+ private:
+  static NamedPropertyHooks named_property_hooks;
+  static IndexedPropertyHooks indexed_property_hooks;
+};
+
+ProxyHandler::NamedPropertyHooks MozjsStubHandler::named_property_hooks = {
+    NULL, NULL, NULL, NULL, NULL,
+};
+ProxyHandler::IndexedPropertyHooks MozjsStubHandler::indexed_property_hooks = {
+    NULL, NULL, NULL, NULL, NULL,
+};
+
+static base::LazyInstance<MozjsStubHandler> proxy_handler;
 }  // namespace
 
 MozjsGlobalObjectProxy::MozjsGlobalObjectProxy(JSRuntime* runtime)
@@ -82,16 +133,18 @@
 
   JS_SetGCParameterForThread(context_, JSGC_MAX_CODE_CACHE_BYTES,
                              kMaxCodeCacheBytes);
-
   uint32_t options =
       JSOPTION_TYPE_INFERENCE |
       JSOPTION_VAROBJFIX |       // Recommended to enable this in the API docs.
       JSOPTION_COMPILE_N_GO |    // Compiled scripts will be run only once.
       JSOPTION_UNROOTED_GLOBAL;  // Global handle must be visited to ensure it
                                  // is not GC'd.
-#if SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if ENGINE_SUPPORTS_JIT
   options |= JSOPTION_BASELINE |  // Enable baseline compiler.
              JSOPTION_ION;        // Enable IonMonkey
+  // This is required by baseline and IonMonkey.
+  js::SetDOMProxyInformation(0 /*domProxyHandlerFamily*/, kJSProxySlotExpando,
+                             DOMProxyShadowsCheck);
 #endif
 #if !defined(COBALT_BUILD_TYPE_GOLD) && !defined(COBALT_BUILD_TYPE_QA)
   options |= JSOPTION_EXTRA_WARNINGS;
@@ -101,6 +154,7 @@
   JS_SetErrorReporter(context_, &MozjsGlobalObjectProxy::ReportErrorHandler);
 
   wrapper_factory_.reset(new WrapperFactory(context_));
+
   JS_AddExtraGCRootsTracer(runtime, TraceFunction, this);
 }
 
@@ -111,7 +165,7 @@
 
 void MozjsGlobalObjectProxy::CreateGlobalObject() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!global_object_);
+  DCHECK(!global_object_proxy_);
 
   // The global object is automatically rooted unless the
   // JSOPTION_UNROOTED_GLOBAL option is set.
@@ -128,7 +182,11 @@
   JSAutoCompartment auto_compartment(context_, global_object);
   bool success = JS_InitStandardClasses(context_, global_object);
   DCHECK(success);
-  SetGlobalObject(global_object);
+
+  JS::RootedObject proxy(
+      context_, ProxyHandler::NewProxy(context_, global_object, NULL, NULL,
+                                       proxy_handler.Pointer()));
+  global_object_proxy_ = proxy;
 }
 
 bool MozjsGlobalObjectProxy::EvaluateScript(
@@ -142,12 +200,14 @@
   const base::SourceLocation location = mozjs_source_code->location();
 
   JSAutoRequest auto_request(context_);
-  JSAutoCompartment auto_comparment(context_, global_object_);
+  JSAutoCompartment auto_comparment(context_, global_object_proxy_);
   JS::RootedValue result_value(context_);
   std::string error_message;
   last_error_message_ = &error_message;
+  JS::RootedObject global_object(
+      context_, js::GetProxyTargetObject(global_object_proxy_));
   bool success = JS_EvaluateScript(
-      context_, global_object_, script.c_str(), script.size(),
+      context_, global_object, script.c_str(), script.size(),
       location.file_path.c_str(), location.line_number, result_value.address());
   if (out_result_utf8) {
     if (success) {
@@ -162,6 +222,11 @@
   return success;
 }
 
+std::vector<StackFrame> MozjsGlobalObjectProxy::GetStackTrace(int max_frames) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  return util::GetStackTrace(context_, max_frames);
+}
+
 void MozjsGlobalObjectProxy::DisableEval(const std::string& message) {
   DCHECK(thread_checker_.CalledOnValidThread());
   eval_disabled_message_.emplace(message);
@@ -183,11 +248,14 @@
 void MozjsGlobalObjectProxy::Bind(const std::string& identifier,
                                   const scoped_refptr<Wrappable>& impl) {
   JSAutoRequest auto_request(context_);
-  JSAutoCompartment auto_comparment(context_, global_object_);
+  JSAutoCompartment auto_comparment(context_, global_object_proxy_);
+
   JS::RootedObject wrapper_proxy(context_,
                                  wrapper_factory_->GetWrapperProxy(impl));
+  JS::RootedObject global_object(
+      context_, js::GetProxyTargetObject(global_object_proxy_));
   JS::Value wrapper_value = OBJECT_TO_JSVAL(wrapper_proxy);
-  bool success = JS_SetProperty(context_, global_object_, identifier.c_str(),
+  bool success = JS_SetProperty(context_, global_object, identifier.c_str(),
                                 &wrapper_value);
   DCHECK(success);
 }
@@ -208,6 +276,28 @@
   return global_proxy;
 }
 
+void MozjsGlobalObjectProxy::SetGlobalObjectProxyAndWrapper(
+    JS::HandleObject global_object_proxy,
+    const scoped_refptr<Wrappable>& wrappable) {
+  DCHECK(!global_object_proxy_);
+  DCHECK(global_object_proxy);
+  DCHECK(JS_IsGlobalObject(js::GetProxyTargetObject(global_object_proxy)));
+  DCHECK(IsObjectProxy(global_object_proxy));
+
+  global_object_proxy_ = global_object_proxy;
+
+  // Global object cached wrapper is not set as usual object.
+  // Set the global object cached wrapper, so we can get the object proxy
+  // through wrapper handle.
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromProxyObject(context_, global_object_proxy_);
+  DCHECK(wrapper_private);
+
+  scoped_ptr<Wrappable::WeakWrapperHandle> object_handle(
+      new MozjsWrapperHandle(wrapper_private));
+  SetCachedWrapper(wrappable.get(), object_handle.Pass());
+}
+
 void MozjsGlobalObjectProxy::CacheInterfaceData(intptr_t key,
                                                 InterfaceData* interface_data) {
   std::pair<CachedInterfaceData::iterator, bool> pib =
@@ -235,15 +325,16 @@
 }
 
 void MozjsGlobalObjectProxy::TraceFunction(JSTracer* trace, void* data) {
-  MozjsGlobalObjectProxy* global_object_proxy =
+  MozjsGlobalObjectProxy* global_object_environment =
       reinterpret_cast<MozjsGlobalObjectProxy*>(data);
-  if (global_object_proxy->global_object_) {
-    JS_CallHeapObjectTracer(trace, &global_object_proxy->global_object_,
+  if (global_object_environment->global_object_proxy_) {
+    JS_CallHeapObjectTracer(trace,
+                            &global_object_environment->global_object_proxy_,
                             "MozjsGlobalObjectProxy");
   }
   for (CachedInterfaceData::iterator it =
-           global_object_proxy->cached_interface_data_.begin();
-       it != global_object_proxy->cached_interface_data_.end(); ++it) {
+           global_object_environment->cached_interface_data_.begin();
+       it != global_object_environment->cached_interface_data_.end(); ++it) {
     InterfaceData* data = it->second;
     JS_CallHeapObjectTracer(trace, &data->prototype, "MozjsGlobalObjectProxy");
     JS_CallHeapObjectTracer(trace, &data->interface_object,
diff --git a/src/cobalt/script/mozjs/mozjs_global_object_proxy.h b/src/cobalt/script/mozjs/mozjs_global_object_proxy.h
index decac4e..0355d37 100644
--- a/src/cobalt/script/mozjs/mozjs_global_object_proxy.h
+++ b/src/cobalt/script/mozjs/mozjs_global_object_proxy.h
@@ -26,8 +26,10 @@
 #include "base/threading/thread_checker.h"
 #include "cobalt/script/global_object_proxy.h"
 #include "cobalt/script/mozjs/interface_data.h"
+#include "cobalt/script/mozjs/util/exception_helpers.h"
 #include "cobalt/script/mozjs/wrapper_factory.h"
 #include "third_party/mozjs/js/src/jsapi.h"
+#include "third_party/mozjs/js/src/jsproxy.h"
 
 namespace cobalt {
 namespace script {
@@ -35,7 +37,8 @@
 
 // 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 MozjsGlobalObjectProxy : public GlobalObjectProxy {
+class MozjsGlobalObjectProxy : public GlobalObjectProxy,
+                               public Wrappable::CachedWrapperAccessor {
  public:
   explicit MozjsGlobalObjectProxy(JSRuntime* runtime);
   ~MozjsGlobalObjectProxy() OVERRIDE;
@@ -53,10 +56,7 @@
     return false;
   }
 
-  std::vector<StackFrame> GetStackTrace(int max_frames) OVERRIDE {
-    NOTIMPLEMENTED();
-    return std::vector<StackFrame>();
-  }
+  std::vector<StackFrame> GetStackTrace(int max_frames = 0) OVERRIDE;
 
   void PreventGarbageCollection(
       const scoped_refptr<Wrappable>& wrappable) OVERRIDE {
@@ -79,7 +79,10 @@
 
   JSContext* context() const { return context_; }
 
-  JSObject* global_object() const { return global_object_; }
+  JSObject* global_object_proxy() const { return global_object_proxy_; }
+  JSObject* global_object() const {
+    return js::GetProxyTargetObject(global_object_proxy_);
+  }
 
   WrapperFactory* wrapper_factory() { return wrapper_factory_.get(); }
 
@@ -94,11 +97,9 @@
     return environment_settings_;
   }
 
-  void SetGlobalObject(JS::HandleObject global_object) {
-    DCHECK(!global_object_);
-    DCHECK(global_object);
-    global_object_ = global_object;
-  }
+  void SetGlobalObjectProxyAndWrapper(
+      JS::HandleObject global_object_proxy,
+      const scoped_refptr<Wrappable>& wrappable);
 
   // Any tracked InterfaceData will have it's GC handles visited and marked as
   // roots. The MozjsGlobalObjectProxy takes ownership of the InterfaceData
@@ -135,7 +136,7 @@
   STLValueDeleter<CachedInterfaceData> cached_interface_data_deleter_;
   ContextDestructor context_destructor_;
   scoped_ptr<WrapperFactory> wrapper_factory_;
-  JS::Heap<JSObject*> global_object_;
+  JS::Heap<JSObject*> global_object_proxy_;
   EnvironmentSettings* environment_settings_;
 
   // If non-NULL, the error message from the ReportErrorHandler will get
diff --git a/src/cobalt/script/mozjs/mozjs_user_object_holder.h b/src/cobalt/script/mozjs/mozjs_user_object_holder.h
index 0551bff..de47435 100644
--- a/src/cobalt/script/mozjs/mozjs_user_object_holder.h
+++ b/src/cobalt/script/mozjs/mozjs_user_object_holder.h
@@ -16,6 +16,8 @@
 #ifndef COBALT_SCRIPT_MOZJS_MOZJS_USER_OBJECT_HOLDER_H_
 #define COBALT_SCRIPT_MOZJS_MOZJS_USER_OBJECT_HOLDER_H_
 
+#include "base/hash_tables.h"
+#include "base/memory/weak_ptr.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/script/mozjs/wrapper_factory.h"
 #include "cobalt/script/mozjs/wrapper_private.h"
@@ -50,14 +52,21 @@
     JS::RootedObject owned_object(context_, js_object());
     WrapperPrivate* wrapper_private =
         WrapperPrivate::GetFromWrappable(owner, context_, wrapper_factory_);
+    wrappable_and_private_hash_map_.insert(
+        std::make_pair(owner, wrapper_private->AsWeakPtr()));
     wrapper_private->AddReferencedObject(owned_object);
   }
 
   void DeregisterOwner(Wrappable* owner) OVERRIDE {
     JS::RootedObject owned_object(context_, js_object());
-    WrapperPrivate* wrapper_private =
-        WrapperPrivate::GetFromWrappable(owner, context_, wrapper_factory_);
-    wrapper_private->RemoveReferencedObject(owned_object);
+    WrappableAndPrivateHashMap::iterator it =
+        wrappable_and_private_hash_map_.find(owner);
+    if (it != wrappable_and_private_hash_map_.end() && it->second) {
+      JS::RootedObject object_proxy(context_, it->second->js_object_proxy());
+      if (object_proxy) {
+        it->second->RemoveReferencedObject(owned_object);
+      }
+    }
   }
 
   const typename MozjsUserObjectType::BaseType* GetScriptObject()
@@ -89,9 +98,13 @@
   }
 
  private:
+  typedef base::hash_map<const Wrappable*, base::WeakPtr<WrapperPrivate> >
+      WrappableAndPrivateHashMap;
+
   JSContext* context_;
   base::optional<MozjsUserObjectType> object_handle_;
   WrapperFactory* wrapper_factory_;
+  WrappableAndPrivateHashMap wrappable_and_private_hash_map_;
 };
 
 }  // namespace mozjs
diff --git a/src/cobalt/script/mozjs/util/exception_helpers.cc b/src/cobalt/script/mozjs/util/exception_helpers.cc
new file mode 100644
index 0000000..9ef7f2c
--- /dev/null
+++ b/src/cobalt/script/mozjs/util/exception_helpers.cc
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2016 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/mozjs/util/exception_helpers.h"
+
+#include <algorithm>
+
+#include "cobalt/script/mozjs/conversion_helpers.h"
+#include "cobalt/script/mozjs/mozjs_exception_state.h"
+#include "third_party/mozjs/js/src/jsdbgapi.h"
+#include "third_party/mozjs/js/src/jsscript.h"
+
+namespace cobalt {
+namespace script {
+namespace mozjs {
+namespace util {
+std::vector<StackFrame> GetStackTrace(JSContext* context, int max_frames) {
+  JS::StackDescription* stack_description =
+      JS::DescribeStack(context, max_frames);
+  if (max_frames == 0) {
+    max_frames = static_cast<int>(stack_description->nframes);
+  } else {
+    max_frames =
+        std::min(max_frames, static_cast<int>(stack_description->nframes));
+  }
+  JS::FrameDescription* stack_trace = stack_description->frames;
+  std::vector<StackFrame> stack_frames(max_frames);
+  for (int i = 0; i < max_frames; ++i) {
+    StackFrame sf;
+    sf.line_number = stack_trace[i].lineno;
+    sf.column_number = 0;
+    sf.function_name = "global code";
+    if (stack_trace[i].fun) {
+      JS::RootedString rooted_string(context,
+                                     JS_GetFunctionId(stack_trace[i].fun));
+      JS::RootedValue rooted_value(context, STRING_TO_JSVAL(rooted_string));
+      MozjsExceptionState exception_state(context);
+      FromJSValue(context, rooted_value, kNoConversionFlags, &exception_state,
+                  &sf.function_name);
+    }
+    if (stack_trace[i].script) {
+      sf.source_url = stack_trace[i].script->filename();
+    }
+    stack_frames[i] = sf;
+  }
+  JS::FreeStackDescription(context, stack_description);
+  return stack_frames;
+}
+}  // namespace util
+}  // namespace mozjs
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/mozjs/util/exception_helpers.h b/src/cobalt/script/mozjs/util/exception_helpers.h
new file mode 100644
index 0000000..75dff27
--- /dev/null
+++ b/src/cobalt/script/mozjs/util/exception_helpers.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016 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_MOZJS_UTIL_EXCEPTION_HELPERS_H_
+#define COBALT_SCRIPT_MOZJS_UTIL_EXCEPTION_HELPERS_H_
+
+#include <vector>
+
+#include "cobalt/script/stack_frame.h"
+#include "third_party/mozjs/js/src/jsapi.h"
+
+namespace cobalt {
+namespace script {
+namespace mozjs {
+namespace util {
+std::vector<StackFrame> GetStackTrace(JSContext* context, int max_frames);
+}  // namespace util
+}  // namespace mozjs
+}  // namespace script
+}  // namespace cobalt
+#endif  // COBALT_SCRIPT_MOZJS_UTIL_EXCEPTION_HELPERS_H_
diff --git a/src/cobalt/script/mozjs/wrapper_private.cc b/src/cobalt/script/mozjs/wrapper_private.cc
index b7b3443..e129678 100644
--- a/src/cobalt/script/mozjs/wrapper_private.cc
+++ b/src/cobalt/script/mozjs/wrapper_private.cc
@@ -39,11 +39,13 @@
 }
 
 // static
-void WrapperPrivate::AddPrivateData(JS::HandleObject wrapper_proxy,
+void WrapperPrivate::AddPrivateData(JSContext* context,
+                                    JS::HandleObject wrapper_proxy,
                                     const scoped_refptr<Wrappable>& wrappable) {
   DCHECK(js::IsProxy(wrapper_proxy));
   WrapperPrivate* private_data = new WrapperPrivate(wrappable, wrapper_proxy);
-  JSObject* target_object = js::GetProxyTargetObject(wrapper_proxy);
+  JS::RootedObject target_object(context,
+                                 js::GetProxyTargetObject(wrapper_proxy));
   JS_SetPrivate(target_object, private_data);
   DCHECK_EQ(JS_GetPrivate(target_object), private_data);
 }
@@ -114,6 +116,8 @@
   DCHECK(js::IsProxy(wrapper_proxy));
 }
 
+WrapperPrivate::~WrapperPrivate() { wrapper_proxy_ = NULL; }
+
 }  // namespace mozjs
 }  // namespace script
 }  // namespace cobalt
diff --git a/src/cobalt/script/mozjs/wrapper_private.h b/src/cobalt/script/mozjs/wrapper_private.h
index 9bb4219..e80ec75 100644
--- a/src/cobalt/script/mozjs/wrapper_private.h
+++ b/src/cobalt/script/mozjs/wrapper_private.h
@@ -47,7 +47,7 @@
   void RemoveReferencedObject(JS::HandleObject referee);
 
   // Create a new WrapperPrivate instance and associate it with the wrapper.
-  static void AddPrivateData(JS::HandleObject wrapper_proxy,
+  static void AddPrivateData(JSContext* context, JS::HandleObject wrapper_proxy,
                              const scoped_refptr<Wrappable>& wrappable);
 
   // Get the WrapperPrivate associated with the given Wrappable. A new JSObject
@@ -78,6 +78,7 @@
   typedef ScopedVector<JS::Heap<JSObject*> > ReferencedObjectVector;
   WrapperPrivate(const scoped_refptr<Wrappable>& wrappable,
                  JS::HandleObject wrapper_proxy);
+  ~WrapperPrivate();
 
   scoped_refptr<Wrappable> wrappable_;
   JS::Heap<JSObject*> wrapper_proxy_;
diff --git a/src/cobalt/webdriver/window_driver.cc b/src/cobalt/webdriver/window_driver.cc
index cb14bb9..b896311 100644
--- a/src/cobalt/webdriver/window_driver.cc
+++ b/src/cobalt/webdriver/window_driver.cc
@@ -164,7 +164,13 @@
       get_global_object_proxy_(get_global_object_proxy_function),
       window_message_loop_(message_loop),
       element_driver_map_deleter_(&element_drivers_),
-      next_element_id_(0) {}
+      next_element_id_(0) {
+  // The WindowDriver may have been created on some arbitrary thread (i.e. the
+  // thread that owns the Window). Detach the thread checker so it can be
+  // re-bound to the next thread that calls a webdriver API, which should be
+  // the WebDriver thread.
+  thread_checker_.DetachFromThread();
+}
 
 WindowDriver::~WindowDriver() {
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/src/codereview.settings b/src/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/glimp/codereview.settings b/src/glimp/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/glimp/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/glimp/gles/pixel_format.cc b/src/glimp/gles/pixel_format.cc
index 5c0f76b..ac1672e 100644
--- a/src/glimp/gles/pixel_format.cc
+++ b/src/glimp/gles/pixel_format.cc
@@ -36,6 +36,14 @@
 int BytesPerPixel(PixelFormat format) {
   SB_COMPILE_ASSERT(SB_ARRAY_SIZE(kBytesPerPixel) == kPixelFormatNumFormats,
                     kBytesPerPixel_has_entries_for_each_enum_PixelFormat);
+  if (kPixelFormatInvalid == format) {
+    return 0;  // Invalid formats have 0 bytes per pixel.
+  }
+
+  if (format < 0 || format >= kPixelFormatNumFormats) {
+    SB_DCHECK(false) << "Invalid PixelFormat: " << format;
+    return 0;
+  }
   return kBytesPerPixel[format];
 }
 
diff --git a/src/googleurl/codereview.settings b/src/googleurl/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/googleurl/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/media/base/sbplayer_pipeline.cc b/src/media/base/sbplayer_pipeline.cc
index 5a9ce70..7248c25 100644
--- a/src/media/base/sbplayer_pipeline.cc
+++ b/src/media/base/sbplayer_pipeline.cc
@@ -649,7 +649,7 @@
   bool is_encrypted = IsEncrypted(stream);
   SbDrmSampleInfo drm_info;
 
-  if (is_encrypted) {
+  if (is_encrypted && !buffer->IsEndOfStream()) {
     FillDrmSampleInfo(buffer, &drm_info);
   }
 
diff --git a/src/media/base/shell_video_frame_provider.cc b/src/media/base/shell_video_frame_provider.cc
index e4910d2..589f886 100644
--- a/src/media/base/shell_video_frame_provider.cc
+++ b/src/media/base/shell_video_frame_provider.cc
@@ -22,9 +22,8 @@
 
 ShellVideoFrameProvider::ShellVideoFrameProvider(
     scoped_refptr<VideoFrame> punch_out)
-    : punch_out_(punch_out), has_consumed_frames_(false) {
+    : punch_out_(punch_out), has_consumed_frames_(false), dropped_frames_(0) {
 #if !defined(__LB_SHELL__FOR_RELEASE__)
-  dropped_frames_ = 0;
   max_delay_in_microseconds_ = 0;
 #endif  // !defined(__LB_SHELL__FOR_RELEASE__)
 }
@@ -67,24 +66,26 @@
         frame_time + kEpsilonInMicroseconds >= media_time.InMicroseconds())
       break;
 
-#if !defined(__LB_SHELL__FOR_RELEASE__)
-    const bool kLogFrameDrops ALLOW_UNUSED = false;
     if (current_frame_ != frames_[0]) {
       ++dropped_frames_;
+
+#if !defined(__LB_SHELL__FOR_RELEASE__)
       if (media_time.InMicroseconds() - frame_time > max_delay_in_microseconds_)
         max_delay_in_microseconds_ = media_time.InMicroseconds() - frame_time;
+      const bool kLogFrameDrops ALLOW_UNUSED = false;
       LOG_IF(WARNING, kLogFrameDrops)
           << "dropped one frame with timestamp "
           << frames_[0]->GetTimestamp().InMicroseconds() << " at media time "
           << media_time.InMicroseconds() << " total dropped " << dropped_frames_
           << " frames with a max delay of " << max_delay_in_microseconds_
           << " ms";
-    }
 #endif  // !defined(__LB_SHELL__FOR_RELEASE__)
+    }
 
     if (frames_.size() == 1) {
       current_frame_ = frames_[0];
     }
+
     frames_.erase(frames_.begin());
     has_consumed_frames_ = true;
   }
@@ -108,6 +109,7 @@
   base::AutoLock auto_lock(frames_lock_);
   frames_.clear();
   current_frame_ = NULL;
+  dropped_frames_ = 0;
 }
 
 size_t ShellVideoFrameProvider::GetNumOfFramesCached() const {
@@ -127,4 +129,11 @@
   return previous_value;
 }
 
+int ShellVideoFrameProvider::ResetAndReturnDroppedFrames() {
+  base::AutoLock auto_lock(frames_lock_);
+  int dropped_frames = dropped_frames_;
+  dropped_frames_ = 0;
+  return dropped_frames;
+}
+
 }  // namespace media
diff --git a/src/media/base/shell_video_frame_provider.h b/src/media/base/shell_video_frame_provider.h
index a26a2db..47ab8da 100644
--- a/src/media/base/shell_video_frame_provider.h
+++ b/src/media/base/shell_video_frame_provider.h
@@ -64,6 +64,9 @@
   // queue since the last time this was called.
   bool QueryAndResetHasConsumedFrames();
 
+  // Return the value of |dropped_frames_| and reset it to 0.
+  int ResetAndReturnDroppedFrames();
+
  private:
   base::TimeDelta GetMediaTime_Locked() const;
 
@@ -74,9 +77,9 @@
   std::vector<scoped_refptr<VideoFrame> > frames_;
   scoped_refptr<VideoFrame> current_frame_;
   bool has_consumed_frames_;
+  int dropped_frames_;
 
 #if !defined(__LB_SHELL__FOR_RELEASE__)
-  int dropped_frames_;
   int max_delay_in_microseconds_;
 #endif  // !defined(__LB_SHELL__FOR_RELEASE__)
 
diff --git a/src/media/filters/shell_demuxer.cc b/src/media/filters/shell_demuxer.cc
index 3da9455..6671985 100644
--- a/src/media/filters/shell_demuxer.cc
+++ b/src/media/filters/shell_demuxer.cc
@@ -232,27 +232,33 @@
       base::Bind(&ShellDemuxer::ParseConfigDone, this, status_cb));
 }
 
-bool ShellDemuxer::ParseConfigBlocking(const PipelineStatusCB& status_cb) {
+PipelineStatus ShellDemuxer::ParseConfigBlocking(
+    const PipelineStatusCB& status_cb) {
   DCHECK(blocking_thread_.message_loop_proxy()->BelongsToCurrentThread());
   DCHECK(!parser_);
 
   // construct stream parser with error callback
-  parser_ = ShellParser::Construct(reader_, status_cb);
+  PipelineStatus status = ShellParser::Construct(reader_, &parser_);
   // if we can't construct a parser for this stream it's a fatal error, return
   // false so ParseConfigDone will notify the caller to Initialize() via
   // status_cb.
-  if (!parser_) {
-    return false;
+  if (!parser_ || status != PIPELINE_OK) {
+    DCHECK(!parser_);
+    DCHECK_NE(status, PIPELINE_OK);
+    if (status == PIPELINE_OK) {
+      status = DEMUXER_ERROR_COULD_NOT_PARSE;
+    }
+    return status;
   }
 
   // instruct the parser to extract audio and video config from the file
   if (!parser_->ParseConfig()) {
-    return false;
+    return DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // make sure we got a valid and complete configuration
   if (!parser_->IsConfigComplete()) {
-    return false;
+    return DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // IsConfigComplete() should guarantee we know the duration
@@ -265,18 +271,19 @@
   }
 
   // successful parse of config data, inform the nonblocking demuxer thread
-  return true;
+  DCHECK_EQ(status, PIPELINE_OK);
+  return PIPELINE_OK;
 }
 
 void ShellDemuxer::ParseConfigDone(const PipelineStatusCB& status_cb,
-                                   bool result) {
+                                   PipelineStatus status) {
   DCHECK(MessageLoopBelongsToCurrentThread());
   // if the blocking parser thread cannot parse config we're done.
-  if (!result) {
-    status_cb.Run(DEMUXER_ERROR_COULD_NOT_PARSE);
+  if (status != PIPELINE_OK) {
+    status_cb.Run(status);
     return;
   }
-
+  DCHECK(parser_);
   // start downloading data
   Request(DemuxerStream::AUDIO);
 
diff --git a/src/media/filters/shell_demuxer.h b/src/media/filters/shell_demuxer.h
index c49c28e..886f7fc 100644
--- a/src/media/filters/shell_demuxer.h
+++ b/src/media/filters/shell_demuxer.h
@@ -121,14 +121,15 @@
   void BufferAllocated(scoped_refptr<DecoderBuffer> buffer);
 
  private:
-  void ParseConfigDone(const PipelineStatusCB& status_cb, bool result);
+  void ParseConfigDone(const PipelineStatusCB& status_cb,
+                       PipelineStatus status);
   void DataSourceStopped(const base::Closure& callback);
 
   // methods that perform blocking I/O, and are therefore run on the
   // blocking_thread_
   // download enough of the stream to parse the configuration. returns
   // false on error.
-  bool ParseConfigBlocking(const PipelineStatusCB& status_cb);
+  PipelineStatus ParseConfigBlocking(const PipelineStatusCB& status_cb);
   void RequestTask(DemuxerStream::Type type);
   void DownloadTask(scoped_refptr<DecoderBuffer> buffer);
   void IssueNextRequestTask();
diff --git a/src/media/filters/shell_flv_parser.cc b/src/media/filters/shell_flv_parser.cc
index 5d517ad..4492a49 100644
--- a/src/media/filters/shell_flv_parser.cc
+++ b/src/media/filters/shell_flv_parser.cc
@@ -70,28 +70,33 @@
 static const int kAMF0NumberLength = 9;
 
 // static
-scoped_refptr<ShellParser> ShellFLVParser::Construct(
+PipelineStatus ShellFLVParser::Construct(
     scoped_refptr<ShellDataSourceReader> reader,
     const uint8* construction_header,
-    const PipelineStatusCB& status_cb) {
+    scoped_refptr<ShellParser>* parser) {
+  DCHECK(parser);
+  *parser = NULL;
+
   // look for "FLV" string at top of file, mask off LSB
   uint32 FLV = endian_util::load_uint32_big_endian(construction_header) >> 8;
   if (FLV != kFLV) {
-    return NULL;
+    // Not an flv.
+    return DEMUXER_ERROR_COULD_NOT_PARSE;
   }
   // Check for availability of both an audio and video stream. Audio stream is
   // third bit, video stream is first bit in 5th byte of file header
   if ((construction_header[4] & 0x05) != 0x05) {
-    status_cb.Run(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
-    return NULL;
+    return DEMUXER_ERROR_NO_SUPPORTED_STREAMS;
   }
   // offset of first data tag in stream is next 4 bytes
   uint32 data_offset =
       endian_util::load_uint32_big_endian(construction_header + 5);
   // add four bytes to skip over PreviousTagSize0
   data_offset += 4;
-  // construct and return an FLV parser
-  return scoped_refptr<ShellParser>(new ShellFLVParser(reader, data_offset));
+
+  // construct an FLV parser
+  *parser = new ShellFLVParser(reader, data_offset);
+  return PIPELINE_OK;
 }
 
 ShellFLVParser::ShellFLVParser(scoped_refptr<ShellDataSourceReader> reader,
diff --git a/src/media/filters/shell_flv_parser.h b/src/media/filters/shell_flv_parser.h
index 992bee9..1f512c0 100644
--- a/src/media/filters/shell_flv_parser.h
+++ b/src/media/filters/shell_flv_parser.h
@@ -28,12 +28,12 @@
 class ShellFLVParser : public ShellAVCParser {
  public:
   // Attempts to make sense of the provided bytes of the top of a file as an
-  // flv, and if it does make sense returns a ShellFLVParser initialized with
-  // some basic state. If it doesn't make sense this returns NULL.
-  static scoped_refptr<ShellParser> Construct(
-      scoped_refptr<ShellDataSourceReader> reader,
-      const uint8* construction_header,
-      const PipelineStatusCB& status_cb);
+  // flv, and if it does make sense returns PIPELINE_OK and |*parser| contains a
+  // ShellFLVParser initialized with some basic state.  If it doesn't make sense
+  // this returns an error status and |*parser| contains NULL.
+  static PipelineStatus Construct(scoped_refptr<ShellDataSourceReader> reader,
+                                  const uint8* construction_header,
+                                  scoped_refptr<ShellParser>* parser);
   ShellFLVParser(scoped_refptr<ShellDataSourceReader> reader,
                  uint32 tag_start_offset);
   virtual ~ShellFLVParser();
diff --git a/src/media/filters/shell_mp4_parser.cc b/src/media/filters/shell_mp4_parser.cc
index 20ea082..0360858 100644
--- a/src/media/filters/shell_mp4_parser.cc
+++ b/src/media/filters/shell_mp4_parser.cc
@@ -72,34 +72,36 @@
 static const int kMapTableAtomCacheEntries_ctts = 51543 / kEntrySize_ctts;
 
 // static
-scoped_refptr<ShellParser> ShellMP4Parser::Construct(
+PipelineStatus ShellMP4Parser::Construct(
     scoped_refptr<ShellDataSourceReader> reader,
     const uint8* construction_header,
-    const PipelineStatusCB& status_cb) {
+    scoped_refptr<ShellParser>* parser) {
+  DCHECK(parser);
+  *parser = NULL;
+
   // detect mp4 stream by looking for ftyp atom at top of file
   uint32 ftyp = endian_util::load_uint32_big_endian(construction_header + 4);
   if (ftyp != kAtomType_ftyp) {
     // not an mp4
-    return NULL;
+    return DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // first 4 bytes will be the size of the ftyp atom
   uint32 ftyp_atom_size =
       endian_util::load_uint32_big_endian(construction_header);
   if (ftyp_atom_size < kAtomMinSize) {
-    status_cb.Run(DEMUXER_ERROR_COULD_NOT_PARSE);
-    return NULL;
+    return DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
-  // construct and return new mp4 parser
-  return scoped_refptr<ShellParser>(new ShellMP4Parser(reader, ftyp_atom_size));
+  // construct new mp4 parser
+  *parser = new ShellMP4Parser(reader, ftyp_atom_size);
+  return PIPELINE_OK;
 }
 
 ShellMP4Parser::ShellMP4Parser(scoped_refptr<ShellDataSourceReader> reader,
                                uint32 ftyp_atom_size)
     : ShellAVCParser(reader),
-      atom_offset_(ftyp_atom_size)  // start at next atom, skipping over ftyp
-      ,
+      atom_offset_(ftyp_atom_size),  // start at next atom, skipping over ftyp
       current_trak_is_video_(false),
       current_trak_is_audio_(false),
       current_trak_time_scale_(0),
diff --git a/src/media/filters/shell_mp4_parser.h b/src/media/filters/shell_mp4_parser.h
index a890c2c..bf7ea68 100644
--- a/src/media/filters/shell_mp4_parser.h
+++ b/src/media/filters/shell_mp4_parser.h
@@ -67,13 +67,13 @@
 
 class ShellMP4Parser : public ShellAVCParser {
  public:
-  // attempts to make sense of the provided bytes of the top of a file as an
-  // mp4, and if it does make sense returns a ShellMP4Parser initialized with
-  // some basic state. If it doesn't make sense this returns NULL
-  static scoped_refptr<ShellParser> Construct(
-      scoped_refptr<ShellDataSourceReader> reader,
-      const uint8* construction_header,
-      const PipelineStatusCB& status_cb);
+  // Attempts to make sense of the provided bytes of the top of a file as an
+  // flv, and if it does make sense returns PIPELINE_OK and |*parser| contains a
+  // ShellMP4Parser initialized with some basic state.  If it doesn't make sense
+  // this returns an error status and |*parser| contains NULL.
+  static PipelineStatus Construct(scoped_refptr<ShellDataSourceReader> reader,
+                                  const uint8* construction_header,
+                                  scoped_refptr<ShellParser>* parser);
   ShellMP4Parser(scoped_refptr<ShellDataSourceReader> reader,
                  uint32 ftyp_atom_size);
   virtual ~ShellMP4Parser();
diff --git a/src/media/filters/shell_parser.cc b/src/media/filters/shell_parser.cc
index b8b5c1c..f1d4958 100644
--- a/src/media/filters/shell_parser.cc
+++ b/src/media/filters/shell_parser.cc
@@ -16,6 +16,7 @@
 
 #include "media/filters/shell_parser.h"
 
+#include "base/logging.h"
 #include "media/filters/shell_flv_parser.h"
 #include "media/filters/shell_mp4_parser.h"
 
@@ -27,33 +28,27 @@
 const int ShellParser::kInitialHeaderSize = 9;
 
 // static
-scoped_refptr<ShellParser> ShellParser::Construct(
+PipelineStatus ShellParser::Construct(
     scoped_refptr<ShellDataSourceReader> reader,
-    const PipelineStatusCB& status_cb) {
-  scoped_refptr<ShellParser> parser;
+    scoped_refptr<ShellParser>* parser) {
+  DCHECK(parser);
+  *parser = NULL;
 
   // download first 16 bytes of stream to determine file type and extract basic
   // container-specific stream configuration information
   uint8 header[kInitialHeaderSize];
   int bytes_read = reader->BlockingRead(0, kInitialHeaderSize, header);
   if (bytes_read != kInitialHeaderSize) {
-    status_cb.Run(DEMUXER_ERROR_COULD_NOT_OPEN);
-    return NULL;
+    return DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // attempt to construct mp4 parser from this header
-  parser = ShellMP4Parser::Construct(reader, header, status_cb);
+  PipelineStatus status = ShellMP4Parser::Construct(reader, header, parser);
+  if (status == PIPELINE_OK) {
+    return status;
+  }
   // ok, attempt FLV
-  if (!parser) {
-    parser = ShellFLVParser::Construct(reader, header, status_cb);
-  }
-  // no additional supported container formats, set error and return
-  if (!parser) {
-    status_cb.Run(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
-    return NULL;
-  }
-
-  return parser;
+  return ShellFLVParser::Construct(reader, header, parser);
 }
 
 ShellParser::ShellParser(scoped_refptr<ShellDataSourceReader> reader)
diff --git a/src/media/filters/shell_parser.h b/src/media/filters/shell_parser.h
index 057cbae..6d349b0 100644
--- a/src/media/filters/shell_parser.h
+++ b/src/media/filters/shell_parser.h
@@ -32,10 +32,10 @@
 class ShellParser : public base::RefCountedThreadSafe<ShellParser> {
  public:
   static const int kInitialHeaderSize;
-  // Determine stream type, construct appropriate parser object, and return.
-  static scoped_refptr<ShellParser> Construct(
-      scoped_refptr<ShellDataSourceReader> reader,
-      const PipelineStatusCB& status_cb);
+  // Determine stream type, construct appropriate parser object, and returns
+  // PIPELINE_OK on success or error code.
+  static PipelineStatus Construct(scoped_refptr<ShellDataSourceReader> reader,
+                                  scoped_refptr<ShellParser>* parser);
   explicit ShellParser(scoped_refptr<ShellDataSourceReader> reader);
 
   // Seek through the file looking for audio and video configuration info,
diff --git a/src/media/filters/video_renderer_base.cc b/src/media/filters/video_renderer_base.cc
index f1fa6fc..80d1f3d 100644
--- a/src/media/filters/video_renderer_base.cc
+++ b/src/media/filters/video_renderer_base.cc
@@ -300,14 +300,17 @@
   uint32 frames_dropped = 0;
 
   for (;;) {
-    if (frames_dropped > 0) {
 #if defined(__LB_SHELL__) || defined(COBALT)
+    frames_dropped =
+        static_cast<uint32>(frame_provider_->ResetAndReturnDroppedFrames());
+    if (frames_dropped > 0) {
       SCOPED_MEDIA_STATISTICS(STAT_TYPE_VIDEO_FRAME_DROP);
+    }
 #endif  // defined(__LB_SHELL__) || defined(COBALT)
+    if (frames_dropped > 0) {
       PipelineStatistics statistics;
       statistics.video_frames_dropped = frames_dropped;
       statistics_cb_.Run(statistics);
-
       frames_dropped = 0;
     }
 
diff --git a/src/nb/codereview.settings b/src/nb/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/nb/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/nb/memory_pool.cc b/src/nb/memory_pool.cc
index a420420..840042c 100644
--- a/src/nb/memory_pool.cc
+++ b/src/nb/memory_pool.cc
@@ -20,13 +20,22 @@
 
 namespace nb {
 
-MemoryPool::MemoryPool(void* buffer, std::size_t size, bool thread_safe)
+MemoryPool::MemoryPool(void* buffer,
+                       std::size_t size,
+                       bool thread_safe,
+                       bool verify_full_capacity)
     : no_free_allocator_(buffer, size),
       reuse_allocator_(
           scoped_ptr<Allocator>(new ReuseAllocator(&no_free_allocator_)),
           thread_safe) {
   SB_DCHECK(buffer);
   SB_DCHECK(size != 0U);
+
+  if (verify_full_capacity) {
+    void* p = Allocate(size);
+    SB_DCHECK(p);
+    Free(p);
+  }
 }
 
 void MemoryPool::PrintAllocations() const {
diff --git a/src/nb/memory_pool.h b/src/nb/memory_pool.h
index c6245b9..cef03db 100644
--- a/src/nb/memory_pool.h
+++ b/src/nb/memory_pool.h
@@ -29,7 +29,22 @@
 // as necessary.
 class MemoryPool : public Allocator {
  public:
-  MemoryPool(void* buffer, std::size_t size, bool thread_safe);
+  // When |verify_full_capacity| is true, the ctor tries to allocate the whole
+  // budget and free it immediately.  This can:
+  // 1. Ensure the |size| is accurate after accounting for all implicit
+  //    alignment enforced by the underlying allocators.
+  // 2. The |reuse_allocator_| contains a free block of the whole budget.  As
+  //    the |reuse_allocator_| doesn't support extending of free block, an
+  //    allocation that is larger than the both biggest free block in the
+  //    |reuse_allocator_| and the remaining memory inside the
+  //    |no_free_allocator_| will fail even if the combination of both can
+  //    fulfill the allocation.
+  // Note that when |verify_full_capacity| is true, GetHighWaterMark() always
+  // return the budget, which makes memory usage tracking useless.
+  MemoryPool(void* buffer,
+             std::size_t size,
+             bool thread_safe,
+             bool verify_full_capacity = false);
 
   void* Allocate(std::size_t size) { return reuse_allocator_.Allocate(size); }
   void* Allocate(std::size_t size, std::size_t alignment) {
diff --git a/src/nb/reuse_allocator.cc b/src/nb/reuse_allocator.cc
index 8fc07cf..61a40a6 100644
--- a/src/nb/reuse_allocator.cc
+++ b/src/nb/reuse_allocator.cc
@@ -98,7 +98,7 @@
 }
 
 void* ReuseAllocator::Allocate(std::size_t size) {
-  return Allocate(size, 0);
+  return Allocate(size, 1);
 }
 
 void* ReuseAllocator::AllocateForAlignment(std::size_t size,
@@ -107,6 +107,10 @@
 }
 
 void* ReuseAllocator::Allocate(std::size_t size, std::size_t alignment) {
+  if (alignment == 0) {
+    alignment = 1;
+  }
+
   // Try to satisfy request from free list.
   // First look for a block that is appropriately aligned.
   // If we can't, look for a block that is big enough that we can
diff --git a/src/starboard/audio_sink.h b/src/starboard/audio_sink.h
index efedf24..59f507b 100644
--- a/src/starboard/audio_sink.h
+++ b/src/starboard/audio_sink.h
@@ -42,6 +42,14 @@
 // audio frame buffer passed to SbAudioSinkCreate as |frame_buffers|.  As
 // |frame_buffers| is a circular buffer, |offset_in_frames| can be used to
 // calculate the number of continuous frames towards the end of the buffer.
+// The audio sink can play the frames only when |is_playing| is true.  It should
+// pause the playback when |is_playing| is false.
+// The audio sink may cache certain amount of audio frames before start
+// playback.  It will start playback immediately when |is_eos_reached| is true
+// even if the amount of cached audio frames are not enough as no more frames
+// will be appended into the buffer when |is_eos_reached| is true.
+// It is possible for a host to set |is_eos_reached| to false after setting it
+// to true, usually this is caused by a seek.
 // All parameters except |context| cannot be NULL.
 // Note that this function only reports the status of the source, it doesn't
 // remove audio data from the source frame buffer.
diff --git a/src/starboard/codereview.settings b/src/starboard/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/starboard/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/starboard/configuration.h b/src/starboard/configuration.h
index a106891..cff8fa8 100644
--- a/src/starboard/configuration.h
+++ b/src/starboard/configuration.h
@@ -58,7 +58,8 @@
 #define SB_IS(SB_FEATURE) (defined(SB_IS_##SB_FEATURE) && SB_IS_##SB_FEATURE)
 
 // Determines at compile-time whether this platform has a quirk.
-#define SB_HAS_QUIRK(SB_FEATURE) (defined(SB_HAS_QUIRK_##SB_FEATURE) && SB_HAS_QUIRK_##SB_FEATURE)
+#define SB_HAS_QUIRK(SB_FEATURE) \
+  (defined(SB_HAS_QUIRK_##SB_FEATURE) && SB_HAS_QUIRK_##SB_FEATURE)
 
 // Determines at compile-time if this platform implements a given Starboard API
 // version number (or above).
@@ -335,10 +336,6 @@
 #error "Your platform must define SB_MAX_THREAD_NAME_LENGTH."
 #endif
 
-#if !SB_HAS(DECODER) && !SB_HAS(PLAYER)
-#error "Your platform must have either a decoder or a player (or both)."
-#endif
-
 #if SB_HAS(PLAYER)
 #if !SB_IS(PLAYER_COMPOSITED) && !SB_IS(PLAYER_PUNCHED_OUT) && \
     !SB_IS(PLAYER_PRODUCING_TEXTURE)
@@ -356,17 +353,15 @@
     SB_IS(PLAYER_PRODUCING_TEXTURE)
 #error "Your player can't have a composition method if it doesn't exist."
 #endif
-
-#if !SB_HAS(DECODER)
-#error "Your platform must have either a decoder or a player."
-#endif
 #endif  // SB_HAS(PLAYER)
 
-#if (SB_HAS(MANY_CORES) &&                                       \
-     (SB_HAS(2_CORES) || SB_HAS(4_CORES) || SB_HAS(6_CORES))) || \
-    (SB_HAS(2_CORES) && (SB_HAS(4_CORES) || SB_HAS(6_CORES))) || \
+#if (SB_HAS(MANY_CORES) && (SB_HAS(1_CORE) || SB_HAS(2_CORES) ||    \
+                            SB_HAS(4_CORES) || SB_HAS(6_CORES))) || \
+    (SB_HAS(1_CORE) &&                                              \
+     (SB_HAS(2_CORES) || SB_HAS(4_CORES) || SB_HAS(6_CORES))) ||    \
+    (SB_HAS(2_CORES) && (SB_HAS(4_CORES) || SB_HAS(6_CORES))) ||    \
     (SB_HAS(4_CORES) && SB_HAS(6_CORES))
-#error "Only one of SB_HAS_{MANY, 2, 4, 6}_CORES can be defined per platform."
+#error "Only one SB_HAS_{MANY, 1, 2, 4, 6}_CORE[S] can be defined per platform."
 #endif
 
 #if !defined(SB_PREFERRED_RGBA_BYTE_ORDER)
diff --git a/src/starboard/event.h b/src/starboard/event.h
index c9f5614..5c1db49 100644
--- a/src/starboard/event.h
+++ b/src/starboard/event.h
@@ -78,6 +78,19 @@
   // No data argument.
   kSbEventTypeVerticalSync,
 
+  // The platform has detected a network disconnection. The platform should make
+  // a best effort to send an event of this type when the network disconnects,
+  // but there are likely to be cases where the platform cannot detect the
+  // disconnection (e.g. if the connection is via a powered hub which becomes
+  // disconnected), so the current network state cannot always be inferred from
+  // the sequence of Connect/Disconnect events.
+  kSbEventTypeNetworkDisconnect,
+
+  // The platform has detected a network connection. This event may be sent at
+  // application start-up, and should always be sent if the network reconnects
+  // since a disconnection event was sent.
+  kSbEventTypeNetworkConnect,
+
   // An event type reserved for scheduled callbacks. It will only be sent in
   // response to an application call to SbEventSchedule(), and it will call the
   // callback directly, so SbEventHandle should never receive this event
diff --git a/src/starboard/linux/shared/configuration_public.h b/src/starboard/linux/shared/configuration_public.h
index 4a161d9..624909f 100644
--- a/src/starboard/linux/shared/configuration_public.h
+++ b/src/starboard/linux/shared/configuration_public.h
@@ -234,18 +234,12 @@
 
 // --- Media Configuration ---------------------------------------------------
 
-// Specifies whether this platform has support for direct access to a decoder
-// for at least H.264/AAC. The decoder is likely to be faster-than-realtime, and
-// it is up to the client to retain decoded frames and display them synchronized
-// with the audio. The decoder must be wired up to the DRM system such that it
-// accepts encrypted samples.
-#define SB_HAS_DECODER 0
-
-// Specifies whether this platform has support for a decrypting elementary
-// stream player for at least AES128-CTR/H.264/AAC. A player is responsible for
-// ingesting an audio and video elementary stream, optionally-encrypted, and
-// ultimately producing synchronized audio/video. If a player is defined, it
-// must choose one of the supported composition methods below.
+// Specifies whether this platform has support for a possibly-decrypting
+// elementary stream player for at least H.264/AAC (and AES-128-CTR, if
+// decrypting). A player is responsible for ingesting an audio and video
+// elementary stream, optionally-encrypted, and ultimately producing
+// synchronized audio/video. If a player is defined, it must choose one of the
+// supported composition methods below.
 #define SB_HAS_PLAYER 1
 
 // Specifies whether this platform's player will produce an OpenGL texture that
diff --git a/src/starboard/linux/x64directfb/starboard_platform.gyp b/src/starboard/linux/x64directfb/starboard_platform.gyp
index 279c8d9..e692647 100644
--- a/src/starboard/linux/x64directfb/starboard_platform.gyp
+++ b/src/starboard/linux/x64directfb/starboard_platform.gyp
@@ -150,8 +150,6 @@
         '<(DEPTH)/starboard/shared/nouser/user_get_property.cc',
         '<(DEPTH)/starboard/shared/nouser/user_get_signed_in.cc',
         '<(DEPTH)/starboard/shared/nouser/user_internal.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_is_age_restricted.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_start_sign_in.cc',
         '<(DEPTH)/starboard/shared/posix/directory_create.cc',
         '<(DEPTH)/starboard/shared/posix/file_can_open.cc',
         '<(DEPTH)/starboard/shared/posix/file_close.cc',
@@ -301,6 +299,7 @@
         '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
         '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
         '<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc',
+        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
         '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
       ],
       'include_dirs': [
diff --git a/src/starboard/linux/x64x11/configuration_public.h b/src/starboard/linux/x64x11/configuration_public.h
index f11107c..2291350 100644
--- a/src/starboard/linux/x64x11/configuration_public.h
+++ b/src/starboard/linux/x64x11/configuration_public.h
@@ -83,6 +83,9 @@
 // wildly varying number of cores.
 #define SB_HAS_MANY_CORES 1
 
+// Whether the current platform is expected to have exactly 1 core.
+#define SB_HAS_1_CORE 0
+
 // Whether the current platform is expected to have exactly 2 cores.
 #define SB_HAS_2_CORES 0
 
diff --git a/src/starboard/linux/x64x11/starboard_platform.gyp b/src/starboard/linux/x64x11/starboard_platform.gyp
index 46ea9aa..1609af2 100644
--- a/src/starboard/linux/x64x11/starboard_platform.gyp
+++ b/src/starboard/linux/x64x11/starboard_platform.gyp
@@ -113,8 +113,6 @@
         '<(DEPTH)/starboard/shared/nouser/user_get_property.cc',
         '<(DEPTH)/starboard/shared/nouser/user_get_signed_in.cc',
         '<(DEPTH)/starboard/shared/nouser/user_internal.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_is_age_restricted.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_start_sign_in.cc',
         '<(DEPTH)/starboard/shared/posix/directory_create.cc',
         '<(DEPTH)/starboard/shared/posix/file_can_open.cc',
         '<(DEPTH)/starboard/shared/posix/file_close.cc',
@@ -262,6 +260,7 @@
         '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
         '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
         '<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc',
+        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
         '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
         '<(DEPTH)/starboard/shared/x11/application_x11.cc',
         '<(DEPTH)/starboard/shared/x11/window_create.cc',
diff --git a/src/starboard/log.h b/src/starboard/log.h
index 5f3aa9f..3693925 100644
--- a/src/starboard/log.h
+++ b/src/starboard/log.h
@@ -141,6 +141,7 @@
 const SbLogPriority SB_LOG_WARNING = kSbLogPriorityWarning;
 const SbLogPriority SB_LOG_ERROR = kSbLogPriorityError;
 const SbLogPriority SB_LOG_FATAL = kSbLogPriorityFatal;
+const SbLogPriority SB_LOG_0 = SB_LOG_ERROR;
 
 class SB_EXPORT LogMessage {
  public:
@@ -185,6 +186,10 @@
   ::starboard::logging::LogMessage(__FILE__, __LINE__, \
                                    ::starboard::logging::SB_LOG_FATAL)
 
+// Compatibility with base/logging.h which defines ERROR to be 0 to workaround
+// some system header defines that do the same thing.
+#define SB_LOG_MESSAGE_0 SB_LOG_MESSAGE_ERROR
+
 #define SB_LOG_STREAM(severity) SB_LOG_MESSAGE_##severity.stream()
 #define SB_LAZY_STREAM(stream, condition) \
   !(condition) ? (void)0 : ::starboard::logging::LogMessageVoidify() & (stream)
diff --git a/src/starboard/nplb/nplb.gyp b/src/starboard/nplb/nplb.gyp
index 0835148..3761520 100644
--- a/src/starboard/nplb/nplb.gyp
+++ b/src/starboard/nplb/nplb.gyp
@@ -190,6 +190,7 @@
         'system_get_stack_test.cc',
         'system_get_total_memory_test.cc',
         'system_has_capability_test.cc',
+        'system_hide_splash_screen_test.cc',
         'system_is_debugger_attached_test.cc',
         'system_sort_test.cc',
         'system_symbolize_test.cc',
diff --git a/src/starboard/nplb/system_hide_splash_screen_test.cc b/src/starboard/nplb/system_hide_splash_screen_test.cc
new file mode 100644
index 0000000..a97392e
--- /dev/null
+++ b/src/starboard/nplb/system_hide_splash_screen_test.cc
@@ -0,0 +1,35 @@
+// Copyright 2016 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.
+
+// Here we are not trying to do anything fancy, just to really sanity check that
+// this is hooked up to something.
+
+#include "starboard/system.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace starboard {
+namespace nplb {
+namespace {
+
+TEST(SbSystemHideSplashScreenTest, SunnyDay) {
+  // Function returns no result, and correct execution cannot be determined
+  // programatically, but we should at least be able to call it twice without
+  // crashing.
+  SbSystemHideSplashScreen();
+  SbSystemHideSplashScreen();
+}
+
+}  // namespace
+}  // namespace nplb
+}  // namespace starboard
diff --git a/src/starboard/raspi/1/configuration_public.h b/src/starboard/raspi/1/configuration_public.h
index df2d8bf..3cedc59 100644
--- a/src/starboard/raspi/1/configuration_public.h
+++ b/src/starboard/raspi/1/configuration_public.h
@@ -71,7 +71,10 @@
 
 // Whether the current platform is expected to have many cores (> 6), or a
 // wildly varying number of cores.
-#define SB_HAS_MANY_CORES 1
+#define SB_HAS_MANY_CORES 0
+
+// Whether the current platform is expected to have exactly 1 core.
+#define SB_HAS_1_CORE 1
 
 // Whether the current platform is expected to have exactly 2 cores.
 #define SB_HAS_2_CORES 0
diff --git a/src/starboard/raspi/1/starboard_platform.gyp b/src/starboard/raspi/1/starboard_platform.gyp
index 1b80d83..7206d0c 100644
--- a/src/starboard/raspi/1/starboard_platform.gyp
+++ b/src/starboard/raspi/1/starboard_platform.gyp
@@ -120,8 +120,6 @@
         '<(DEPTH)/starboard/shared/nouser/user_get_property.cc',
         '<(DEPTH)/starboard/shared/nouser/user_get_signed_in.cc',
         '<(DEPTH)/starboard/shared/nouser/user_internal.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_is_age_restricted.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_start_sign_in.cc',
         '<(DEPTH)/starboard/shared/posix/directory_create.cc',
         '<(DEPTH)/starboard/shared/posix/file_can_open.cc',
         '<(DEPTH)/starboard/shared/posix/file_close.cc',
@@ -269,6 +267,7 @@
         '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
         '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
         '<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc',
+        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
         '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
       ],
       'defines': [
diff --git a/src/starboard/raspi/shared/configuration_public.h b/src/starboard/raspi/shared/configuration_public.h
index de26224..b7ba3a6 100644
--- a/src/starboard/raspi/shared/configuration_public.h
+++ b/src/starboard/raspi/shared/configuration_public.h
@@ -229,18 +229,12 @@
 
 // --- Media Configuration ---------------------------------------------------
 
-// Specifies whether this platform has support for direct access to a decoder
-// for at least H.264/AAC. The decoder is likely to be faster-than-realtime, and
-// it is up to the client to retain decoded frames and display them synchronized
-// with the audio. The decoder must be wired up to the DRM system such that it
-// accepts encrypted samples.
-#define SB_HAS_DECODER 0
-
-// Specifies whether this platform has support for a decrypting elementary
-// stream player for at least AES128-CTR/H.264/AAC. A player is responsible for
-// ingesting an audio and video elementary stream, optionally-encrypted, and
-// ultimately producing synchronized audio/video. If a player is defined, it
-// must choose one of the supported composition methods below.
+// Specifies whether this platform has support for a possibly-decrypting
+// elementary stream player for at least H.264/AAC (and AES-128-CTR, if
+// decrypting). A player is responsible for ingesting an audio and video
+// elementary stream, optionally-encrypted, and ultimately producing
+// synchronized audio/video. If a player is defined, it must choose one of the
+// supported composition methods below.
 #define SB_HAS_PLAYER 1
 
 // Specifies whether this platform's player will produce an OpenGL texture that
diff --git a/src/starboard/shared/alsa/alsa_audio_sink_type.cc b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
index 5a89222..8f2ce61 100644
--- a/src/starboard/shared/alsa/alsa_audio_sink_type.cc
+++ b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
@@ -14,10 +14,13 @@
 
 #include "starboard/shared/alsa/alsa_audio_sink_type.h"
 
+#include <alsa/asoundlib.h>
+
 #include <algorithm>
 #include <vector>
 
 #include "starboard/condition_variable.h"
+#include "starboard/memory.h"
 #include "starboard/mutex.h"
 #include "starboard/shared/alsa/alsa_util.h"
 #include "starboard/thread.h"
@@ -49,6 +52,23 @@
 // that is too large can waste some memory as the extra buffer is never used.
 const int kALSABufferSizeInFrames = 8192;
 
+// Helper function to compute the size of the two valid starboard audio sample
+// types.
+size_t GetSampleSize(SbMediaAudioSampleType sample_type) {
+  switch (sample_type) {
+    case kSbMediaAudioSampleTypeFloat32:
+      return sizeof(float);
+    case kSbMediaAudioSampleTypeInt16:
+      return sizeof(int16_t);
+  }
+  SB_NOTREACHED();
+  return 0u;
+}
+
+void* IncrementPointerByBytes(void* pointer, size_t offset) {
+  return static_cast<void*>(static_cast<uint8_t*>(pointer) + offset);
+}
+
 // This class is an ALSA based audio sink with the following features:
 // 1. It doesn't cache any data internally and maintains minimum data inside
 //    the ALSA buffer.  It relies on pulling data from its source in high
@@ -61,6 +81,7 @@
   AlsaAudioSink(Type* type,
                 int channels,
                 int sampling_frequency_hz,
+                SbMediaAudioSampleType sample_type,
                 SbAudioSinkFrameBuffers frame_buffers,
                 int frames_per_channel,
                 SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
@@ -95,6 +116,7 @@
 
   int channels_;
   int sampling_frequency_hz_;
+  SbMediaAudioSampleType sample_type_;
 
   SbThread audio_out_thread_;
   starboard::Mutex mutex_;
@@ -104,9 +126,9 @@
 
   bool destroying_;
 
-  float* frame_buffer_;
+  void* frame_buffer_;
   int frames_per_channel_;
-  std::vector<float> silence_frames_;
+  void* silence_frames_;
 
   void* playback_handle_;
 };
@@ -115,6 +137,7 @@
     Type* type,
     int channels,
     int sampling_frequency_hz,
+    SbMediaAudioSampleType sample_type,
     SbAudioSinkFrameBuffers frame_buffers,
     int frames_per_channel,
     SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
@@ -123,6 +146,7 @@
     : type_(type),
       channels_(channels),
       sampling_frequency_hz_(sampling_frequency_hz),
+      sample_type_(sample_type),
       update_source_status_func_(update_source_status_func),
       consume_frame_func_(consume_frame_func),
       context_(context),
@@ -131,19 +155,23 @@
       time_to_wait_(kFramesPerRequest * kSbTimeSecond / sampling_frequency_hz /
                     2),
       destroying_(false),
-      frame_buffer_(reinterpret_cast<float*>(frame_buffers[0])),
+      frame_buffer_(frame_buffers[0]),
       frames_per_channel_(frames_per_channel),
-      silence_frames_(channels * kFramesPerRequest),
+      silence_frames_(new uint8_t[channels * kFramesPerRequest *
+                                  GetSampleSize(sample_type)]),
       playback_handle_(NULL) {
   SB_DCHECK(update_source_status_func_);
   SB_DCHECK(consume_frame_func_);
   SB_DCHECK(frame_buffer_);
+  SB_DCHECK(SbAudioSinkIsAudioSampleTypeSupported(sample_type_));
 
   ScopedLock lock(mutex_);
   audio_out_thread_ =
       SbThreadCreate(0, kSbThreadPriorityRealTime, kSbThreadNoAffinity, true,
                      "alsa_audio_out", &AlsaAudioSink::ThreadEntryPoint, this);
   SB_DCHECK(SbThreadIsValid(audio_out_thread_));
+  SbMemorySet(silence_frames_, 0,
+              channels * kFramesPerRequest * GetSampleSize(sample_type));
   creation_signal_.Wait();
 }
 
@@ -153,6 +181,8 @@
     destroying_ = true;
   }
   SbThreadJoin(audio_out_thread_, NULL);
+
+  delete[] static_cast<uint8_t*>(silence_frames_);
 }
 
 // static
@@ -165,9 +195,13 @@
 }
 
 void AlsaAudioSink::AudioThreadFunc() {
+  snd_pcm_format_t alsa_sample_type =
+      sample_type_ == kSbMediaAudioSampleTypeFloat32 ? SND_PCM_FORMAT_FLOAT_LE
+                                                     : SND_PCM_FORMAT_S16;
+
   playback_handle_ = starboard::shared::alsa::AlsaOpenPlaybackDevice(
       channels_, sampling_frequency_hz_, kFramesPerRequest,
-      kALSABufferSizeInFrames);
+      kALSABufferSizeInFrames, alsa_sample_type);
   creation_signal_.Signal();
   if (!playback_handle_) {
     return;
@@ -206,7 +240,7 @@
     }
     int delayed_frame = AlsaGetBufferedFrames(playback_handle_);
     if (delayed_frame < kMinimumFramesInALSA) {
-      AlsaWriteFrames(playback_handle_, &silence_frames_[0], kFramesPerRequest);
+      AlsaWriteFrames(playback_handle_, silence_frames_, kFramesPerRequest);
     } else {
       SbThreadSleep(time_to_wait_);
     }
@@ -255,9 +289,11 @@
 
   int frames_to_buffer_end = frames_per_channel_ - offset_in_frames;
   if (frames_to_write > frames_to_buffer_end) {
-    int consumed = AlsaWriteFrames(playback_handle_,
-                                   frame_buffer_ + offset_in_frames * channels_,
-                                   frames_to_buffer_end);
+    int consumed = AlsaWriteFrames(
+        playback_handle_,
+        IncrementPointerByBytes(frame_buffer_, offset_in_frames * channels_ *
+                                                   GetSampleSize(sample_type_)),
+        frames_to_buffer_end);
     consume_frame_func_(consumed, context_);
     if (consumed != frames_to_buffer_end) {
       return;
@@ -267,9 +303,11 @@
     offset_in_frames = 0;
   }
 
-  int consumed = AlsaWriteFrames(playback_handle_,
-                                 frame_buffer_ + offset_in_frames * channels_,
-                                 frames_to_write);
+  int consumed = AlsaWriteFrames(
+      playback_handle_,
+      IncrementPointerByBytes(frame_buffer_, offset_in_frames * channels_ *
+                                                 GetSampleSize(sample_type_)),
+      frames_to_write);
   consume_frame_func_(consumed, context_);
 }
 
@@ -286,8 +324,9 @@
     SbAudioSinkConsumeFramesFunc consume_frames_func,
     void* context) {
   AlsaAudioSink* audio_sink = new AlsaAudioSink(
-      this, channels, sampling_frequency_hz, frame_buffers, frames_per_channel,
-      update_source_status_func, consume_frames_func, context);
+      this, channels, sampling_frequency_hz, audio_sample_type, frame_buffers,
+      frames_per_channel, update_source_status_func, consume_frames_func,
+      context);
   if (!audio_sink->is_valid()) {
     delete audio_sink;
     return kSbAudioSinkInvalid;
diff --git a/src/starboard/shared/alsa/alsa_util.cc b/src/starboard/shared/alsa/alsa_util.cc
index 6638e81..c713015 100644
--- a/src/starboard/shared/alsa/alsa_util.cc
+++ b/src/starboard/shared/alsa/alsa_util.cc
@@ -92,7 +92,11 @@
 void* AlsaOpenPlaybackDevice(int channel,
                              int sample_rate,
                              int frames_per_request,
-                             int buffer_size_in_frames) {
+                             int buffer_size_in_frames,
+                             snd_pcm_format_t sample_type) {
+  SB_DCHECK(sample_type == SND_PCM_FORMAT_FLOAT_LE ||
+            sample_type == SND_PCM_FORMAT_S16);
+
   PcmHandle playback_handle;
   int error =
       snd_pcm_open(&playback_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
@@ -111,8 +115,7 @@
                                        SND_PCM_ACCESS_RW_INTERLEAVED);
   ALSA_CHECK(error, snd_pcm_hw_params_set_access, NULL);
 
-  error = snd_pcm_hw_params_set_format(playback_handle, hw_params,
-                                       SND_PCM_FORMAT_FLOAT_LE);
+  error = snd_pcm_hw_params_set_format(playback_handle, hw_params, sample_type);
   ALSA_CHECK(error, snd_pcm_hw_params_set_format, NULL);
 
   error =
@@ -159,7 +162,7 @@
 }
 
 int AlsaWriteFrames(void* playback_handle,
-                    const float* buffer,
+                    const void* buffer,
                     int frames_to_write) {
   if (frames_to_write == 0) {
     return 0;
diff --git a/src/starboard/shared/alsa/alsa_util.h b/src/starboard/shared/alsa/alsa_util.h
index 9cfe472..bbbe04f 100644
--- a/src/starboard/shared/alsa/alsa_util.h
+++ b/src/starboard/shared/alsa/alsa_util.h
@@ -15,6 +15,8 @@
 #ifndef STARBOARD_SHARED_ALSA_ALSA_UTIL_H_
 #define STARBOARD_SHARED_ALSA_ALSA_UTIL_H_
 
+#include <alsa/asoundlib.h>
+
 #include "starboard/shared/internal_only.h"
 
 namespace starboard {
@@ -26,10 +28,11 @@
 void* AlsaOpenPlaybackDevice(int channel,
                              int sample_rate,
                              int frames_per_request,
-                             int buffer_size_in_frames);
+                             int buffer_size_in_frames,
+                             snd_pcm_format_t sample_type);
 bool AlsaStartPlay(void* playback_handle);
 int AlsaWriteFrames(void* playback_handle,
-                    const float* buffer,
+                    const void* buffer,
                     int frames_to_write);
 int AlsaGetBufferedFrames(void* playback_handle);
 void AlsaCloseDevice(void* playback_handle);
diff --git a/src/starboard/shared/linux/page_internal.cc b/src/starboard/shared/linux/page_internal.cc
index 5aec2ed..8b84135 100644
--- a/src/starboard/shared/linux/page_internal.cc
+++ b/src/starboard/shared/linux/page_internal.cc
@@ -44,10 +44,12 @@
     mmap_protect |= PROT_WRITE;
     flag_set = true;
   }
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
   if (sb_flags & kSbMemoryMapProtectExec) {
     mmap_protect |= PROT_EXEC;
     flag_set = true;
   }
+#endif
   if (!flag_set) {
     mmap_protect = PROT_NONE;
   }
diff --git a/src/starboard/shared/pthread/thread_create.cc b/src/starboard/shared/pthread/thread_create.cc
index 813d3ac..70a1fdb 100644
--- a/src/starboard/shared/pthread/thread_create.cc
+++ b/src/starboard/shared/pthread/thread_create.cc
@@ -63,6 +63,14 @@
     return kSbThreadInvalid;
   }
 
+#if defined(ADDRESS_SANITIZER)
+  // Set a big thread stack size when in ADDRESS_SANITIZER mode.
+  // This eliminates buffer overflows for deeply nested callstacks.
+  if (stack_size == 0) {
+    stack_size = 4096 * 1024;  // 4MB
+  }
+#endif
+
   pthread_attr_t attributes;
   int result = pthread_attr_init(&attributes);
   if (!IsSuccess(result)) {
diff --git a/src/starboard/shared/signal/crash_signals.cc b/src/starboard/shared/signal/crash_signals.cc
index 2ea26a7..5c20870 100644
--- a/src/starboard/shared/signal/crash_signals.cc
+++ b/src/starboard/shared/signal/crash_signals.cc
@@ -61,13 +61,13 @@
 
 void InstallCrashSignalHandlers() {
   for (int i = 0; i < SB_ARRAY_SIZE_INT(kSignalsToTrap); ++i) {
-    ::signal(i, &DumpStackSignalSafe);
+    ::signal(kSignalsToTrap[i], &DumpStackSignalSafe);
   }
 }
 
 void UninstallCrashSignalHandlers() {
   for (int i = 0; i < SB_ARRAY_SIZE_INT(kSignalsToTrap); ++i) {
-    ::signal(i, SIG_DFL);
+    ::signal(kSignalsToTrap[i], SIG_DFL);
   }
 }
 
diff --git a/src/starboard/shared/stub/user_start_sign_in.cc b/src/starboard/shared/stub/system_hide_splash_screen.cc
similarity index 90%
rename from src/starboard/shared/stub/user_start_sign_in.cc
rename to src/starboard/shared/stub/system_hide_splash_screen.cc
index 9a99a99..cccc8d5 100644
--- a/src/starboard/shared/stub/user_start_sign_in.cc
+++ b/src/starboard/shared/stub/system_hide_splash_screen.cc
@@ -12,7 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/user.h"
+#include "starboard/system.h"
 
-void SbUserStartSignIn() {
-}
+void SbSystemHideSplashScreen() {}
diff --git a/src/starboard/shared/stub/user_is_age_restricted.cc b/src/starboard/shared/stub/user_is_age_restricted.cc
deleted file mode 100644
index a875b2a..0000000
--- a/src/starboard/shared/stub/user_is_age_restricted.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2016 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 "starboard/user.h"
-
-bool SbUserIsAgeRestricted(SbUser /*user*/) {
-  return false;
-}
diff --git a/src/starboard/stub/configuration_public.h b/src/starboard/stub/configuration_public.h
index 744c7d5..af9c671 100644
--- a/src/starboard/stub/configuration_public.h
+++ b/src/starboard/stub/configuration_public.h
@@ -73,6 +73,9 @@
 // wildly varying number of cores.
 #define SB_HAS_MANY_CORES 1
 
+// Whether the current platform is expected to have exactly 1 core.
+#define SB_HAS_1_CORE 0
+
 // Whether the current platform is expected to have exactly 2 cores.
 #define SB_HAS_2_CORES 0
 
@@ -299,18 +302,12 @@
 
 // --- Media Configuration ---------------------------------------------------
 
-// Specifies whether this platform has support for direct access to a decoder
-// for at least H.264/AAC. The decoder is likely to be faster-than-realtime, and
-// it is up to the client to retain decoded frames and display them synchronized
-// with the audio. The decoder must be wired up to the DRM system such that it
-// accepts encrypted samples.
-#define SB_HAS_DECODER 0
-
-// Specifies whether this platform has support for a decrypting elementary
-// stream player for at least AES128-CTR/H.264/AAC. A player is responsible for
-// ingesting an audio and video elementary stream, optionally-encrypted, and
-// ultimately producing synchronized audio/video. If a player is defined, it
-// must choose one of the supported composition methods below.
+// Specifies whether this platform has support for a possibly-decrypting
+// elementary stream player for at least H.264/AAC (and AES-128-CTR, if
+// decrypting). A player is responsible for ingesting an audio and video
+// elementary stream, optionally-encrypted, and ultimately producing
+// synchronized audio/video. If a player is defined, it must choose one of the
+// supported composition methods below.
 #define SB_HAS_PLAYER 1
 
 // Specifies whether this platform's player will produce an OpenGL texture that
diff --git a/src/starboard/stub/starboard_platform.gyp b/src/starboard/stub/starboard_platform.gyp
index 1279317..e871191 100644
--- a/src/starboard/stub/starboard_platform.gyp
+++ b/src/starboard/stub/starboard_platform.gyp
@@ -184,6 +184,7 @@
         '<(DEPTH)/starboard/shared/stub/system_get_stack.cc',
         '<(DEPTH)/starboard/shared/stub/system_get_total_memory.cc',
         '<(DEPTH)/starboard/shared/stub/system_has_capability.cc',
+        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
         '<(DEPTH)/starboard/shared/stub/system_is_debugger_attached.cc',
         '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
         '<(DEPTH)/starboard/shared/stub/system_request_stop.cc',
@@ -212,8 +213,6 @@
         '<(DEPTH)/starboard/shared/stub/user_get_current.cc',
         '<(DEPTH)/starboard/shared/stub/user_get_property.cc',
         '<(DEPTH)/starboard/shared/stub/user_get_signed_in.cc',
-        '<(DEPTH)/starboard/shared/stub/user_is_age_restricted.cc',
-        '<(DEPTH)/starboard/shared/stub/user_start_sign_in.cc',
         '<(DEPTH)/starboard/shared/stub/window_create.cc',
         '<(DEPTH)/starboard/shared/stub/window_destroy.cc',
         '<(DEPTH)/starboard/shared/stub/window_get_platform_handle.cc',
diff --git a/src/starboard/system.h b/src/starboard/system.h
index 616d421..5cdad66 100644
--- a/src/starboard/system.h
+++ b/src/starboard/system.h
@@ -365,6 +365,11 @@
                             size_t element_width,
                             SbSystemComparator comparator);
 
+// Hides the system splash screen, on systems that support a splash screen that
+// is displayed while the application is loading. This function may be called
+// from any thread and must be idempotent.
+SB_EXPORT void SbSystemHideSplashScreen();
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/src/starboard/user.h b/src/starboard/user.h
index 9dd1e1a..bf9a5d4 100644
--- a/src/starboard/user.h
+++ b/src/starboard/user.h
@@ -96,10 +96,6 @@
 // will persist for the lifetime of the app.
 SB_EXPORT SbUser SbUserGetCurrent();
 
-// Returns whether |user| is age-restricted according to the platform's age
-// policies.
-SB_EXPORT bool SbUserIsAgeRestricted(SbUser user);
-
 // Gets the size of the value of |property_id| for |user|, INCLUDING the
 // terminating null character. Returns 0 if if |user| is invalid, |property_id|
 // isn't recognized, supported, or set for |user|.
@@ -113,10 +109,6 @@
                                  char* out_value,
                                  int value_size);
 
-// Begins the user sign-in flow for the given platform, which may result in a
-// user changed event being dispatched.
-SB_EXPORT void SbUserStartSignIn();
-
 #if SB_HAS(USER_APPLICATION_LINKING_SUPPORT)
 // Initiates a process to link |user| with a per-application authentication
 // token. On success, |out_token| is populated with the authentication token
diff --git a/src/testing/gmock/codereview.settings b/src/testing/gmock/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/testing/gmock/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/testing/gtest-parallel/LICENSE b/src/testing/gtest-parallel/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/src/testing/gtest-parallel/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/src/testing/gtest-parallel/README.cobalt b/src/testing/gtest-parallel/README.cobalt
new file mode 100644
index 0000000..0d388eb
--- /dev/null
+++ b/src/testing/gtest-parallel/README.cobalt
@@ -0,0 +1,59 @@
+Name: gtest-parallel
+URL: https://github.com/google/gtest-parallel
+Version: 0
+License: Apache 2.0
+Security Critical: no
+
+Description
+    This directory contains the source code of a python project that helps run
+    gtest binaries in parallel using multiple processes.
+
+How to use
+    Pre-reqs: Python (2)
+    1.  ./gtest-parallel <name-of-gtest-binary>
+
+    for additional options, see ./gtest-parallel --help
+
+    If all the tests pass, you will be see one line on the screen get updated.
+    If a test fails, it will print out the test result and scroll a little bit.
+
+    Example: $ ./gtest-parallel ~/cobalt/src/out/linux-x64x11_debug/layout_tests
+    [436/436] BidiLayoutTests/LayoutTest.LayoutTest/1 (1285 ms)
+
+Troubleshooting
+    1.  Make sure that the gtest-parallel script is executable:
+      chmod +x ./gtest-parallel
+
+Source
+1.  a) The external repo was imported into our git server on lbshell-internal,
+       repo name is gtest-parallel
+    b) A new branch was created with the date of last commit
+    c) Then it was pushed to the COBALT branch
+
+    Steps for step 1.b:
+    $ git clone https://lbshell-internal.googlesource.com/testing/gtest-parallel
+    $ cd gtest-parallel/
+    $ git remote add upstream https://github.com/google/gtest-parallel.git
+    $ git fetch upstream
+    $ git checkout -b 20160803 upstream/master
+    $ git push origin
+
+    You will likely need admin permissions on the repo to execute the git push.
+
+2. A patch was applied since gtest now prints some things to stderr instead of
+   stdout.
+
+    $ patch < patches/stderr_out.patch
+
+FAQ
+1.  Do the tests need to be thread safe?
+
+    No, the script first asks the binary for the list of tests, and then splits
+    them across multiple processes.
+
+Patches
+1.  patches/stderr_out.patch
+
+    Starboard redirects some output from stdout to stderr.
+    Therefore, we needed to modify the the gtest-parallel script to parse stderr
+    instead of stdout.
diff --git a/src/testing/gtest-parallel/gtest-parallel b/src/testing/gtest-parallel/gtest-parallel
new file mode 100755
index 0000000..a258a87
--- /dev/null
+++ b/src/testing/gtest-parallel/gtest-parallel
@@ -0,0 +1,411 @@
+#!/usr/bin/env python2
+# Copyright 2013 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.
+import cPickle
+import errno
+import gzip
+import multiprocessing
+import optparse
+import os
+import signal
+import subprocess
+import sys
+import tempfile
+import thread
+import threading
+import time
+import zlib
+
+# An object that catches SIGINT sent to the Python process and notices
+# if processes passed to wait() die by SIGINT (we need to look for
+# both of those cases, because pressing Ctrl+C can result in either
+# the main process or one of the subprocesses getting the signal).
+#
+# Before a SIGINT is seen, wait(p) will simply call p.wait() and
+# return the result. Once a SIGINT has been seen (in the main process
+# or a subprocess, including the one the current call is waiting for),
+# wait(p) will call p.terminate() and raise ProcessWasInterrupted.
+class SigintHandler(object):
+  class ProcessWasInterrupted(Exception): pass
+  sigint_returncodes = {-signal.SIGINT,  # Unix
+                        -1073741510,     # Windows
+                        }
+  def __init__(self):
+    self.__lock = threading.Lock()
+    self.__processes = set()
+    self.__got_sigint = False
+    signal.signal(signal.SIGINT, self.__sigint_handler)
+  def __on_sigint(self):
+    self.__got_sigint = True
+    while self.__processes:
+      try:
+        self.__processes.pop().terminate()
+      except OSError:
+        pass
+  def __sigint_handler(self, signal_num, frame):
+    with self.__lock:
+      self.__on_sigint()
+  def got_sigint(self):
+    with self.__lock:
+      return self.__got_sigint
+  def wait(self, p):
+    with self.__lock:
+      if self.__got_sigint:
+        p.terminate()
+      self.__processes.add(p)
+    code = p.wait()
+    with self.__lock:
+      self.__processes.discard(p)
+      if code in self.sigint_returncodes:
+        self.__on_sigint()
+      if self.__got_sigint:
+        raise self.ProcessWasInterrupted
+    return code
+sigint_handler = SigintHandler()
+
+# Return the width of the terminal, or None if it couldn't be
+# determined (e.g. because we're not being run interactively).
+def term_width(out):
+  if not out.isatty():
+    return None
+  try:
+    p = subprocess.Popen(["stty", "size"],
+                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    (out, err) = p.communicate()
+    if p.returncode != 0 or err:
+      return None
+    return int(out.split()[1])
+  except (IndexError, OSError, ValueError):
+    return None
+
+# Output transient and permanent lines of text. If several transient
+# lines are written in sequence, the new will overwrite the old. We
+# use this to ensure that lots of unimportant info (tests passing)
+# won't drown out important info (tests failing).
+class Outputter(object):
+  def __init__(self, out_file):
+    self.__out_file = out_file
+    self.__previous_line_was_transient = False
+    self.__width = term_width(out_file)  # Line width, or None if not a tty.
+  def transient_line(self, msg):
+    if self.__width is None:
+      self.__out_file.write(msg + "\n")
+    else:
+      self.__out_file.write("\r" + msg[:self.__width].ljust(self.__width))
+      self.__previous_line_was_transient = True
+  def flush_transient_output(self):
+    if self.__previous_line_was_transient:
+      self.__out_file.write("\n")
+      self.__previous_line_was_transient = False
+  def permanent_line(self, msg):
+    self.flush_transient_output()
+    self.__out_file.write(msg + "\n")
+
+stdout_lock = threading.Lock()
+
+class FilterFormat:
+  if sys.stdout.isatty():
+    # stdout needs to be unbuffered since the output is interactive.
+    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
+
+  out = Outputter(sys.stdout)
+  total_tests = 0
+  finished_tests = 0
+
+  tests = {}
+  outputs = {}
+  failures = []
+
+  def print_test_status(self, last_finished_test, time_ms):
+    self.out.transient_line("[%d/%d] %s (%d ms)"
+                            % (self.finished_tests, self.total_tests,
+                               last_finished_test, time_ms))
+
+  def handle_meta(self, job_id, args):
+    (command, arg) = args.split(' ', 1)
+    if command == "TEST":
+      (binary, test) = arg.split(' ', 1)
+      self.tests[job_id] = (binary, test.strip())
+    elif command == "EXIT":
+      (exit_code, time_ms) = [int(x) for x in arg.split(' ', 1)]
+      self.finished_tests += 1
+      (binary, test) = self.tests[job_id]
+      self.print_test_status(test, time_ms)
+      if exit_code != 0:
+        self.failures.append(self.tests[job_id])
+        with open(self.outputs[job_id]) as f:
+          for line in f.readlines():
+            self.out.permanent_line(line.rstrip())
+        self.out.permanent_line(
+          "[%d/%d] %s returned/aborted with exit code %d (%d ms)"
+          % (self.finished_tests, self.total_tests, test, exit_code, time_ms))
+    elif command == "TESTCNT":
+      self.total_tests = int(arg.split(' ', 1)[1])
+      self.out.transient_line("[0/%d] Running tests..." % self.total_tests)
+
+  def logfile(self, job_id, name):
+    self.outputs[job_id] = name
+
+  def log(self, line):
+    stdout_lock.acquire()
+    (prefix, output) = line.split(' ', 1)
+
+    assert prefix[-1] == ':'
+    self.handle_meta(int(prefix[:-1]), output)
+    stdout_lock.release()
+
+  def end(self):
+    if self.failures:
+      self.out.permanent_line("FAILED TESTS (%d/%d):"
+                              % (len(self.failures), self.total_tests))
+      for (binary, test) in self.failures:
+        self.out.permanent_line(" " + binary + ": " + test)
+    self.out.flush_transient_output()
+
+class RawFormat:
+  def log(self, line):
+    stdout_lock.acquire()
+    sys.stdout.write(line + "\n")
+    sys.stdout.flush()
+    stdout_lock.release()
+  def logfile(self, job_id, name):
+    with open(name) as f:
+      for line in f.readlines():
+        self.log(str(job_id) + '> ' + line.rstrip())
+  def end(self):
+    pass
+
+# Record of test runtimes. Has built-in locking.
+class TestTimes(object):
+  def __init__(self, save_file):
+    "Create new object seeded with saved test times from the given file."
+    self.__times = {}  # (test binary, test name) -> runtime in ms
+
+    # Protects calls to record_test_time(); other calls are not
+    # expected to be made concurrently.
+    self.__lock = threading.Lock()
+
+    try:
+      with gzip.GzipFile(save_file, "rb") as f:
+        times = cPickle.load(f)
+    except (EOFError, IOError, cPickle.UnpicklingError, zlib.error):
+      # File doesn't exist, isn't readable, is malformed---whatever.
+      # Just ignore it.
+      return
+
+    # Discard saved times if the format isn't right.
+    if type(times) is not dict:
+      return
+    for ((test_binary, test_name), runtime) in times.items():
+      if (type(test_binary) is not str or type(test_name) is not str
+          or type(runtime) not in {int, long, type(None)}):
+        return
+
+    self.__times = times
+
+  def get_test_time(self, binary, testname):
+    """Return the last duration for the given test as an integer number of
+    milliseconds, or None if the test failed or if there's no record for it."""
+    return self.__times.get((binary, testname), None)
+
+  def record_test_time(self, binary, testname, runtime_ms):
+    """Record that the given test ran in the specified number of
+    milliseconds. If the test failed, runtime_ms should be None."""
+    with self.__lock:
+      self.__times[(binary, testname)] = runtime_ms
+
+  def write_to_file(self, save_file):
+    "Write all the times to file."
+    try:
+      with open(save_file, "wb") as f:
+        with gzip.GzipFile("", "wb", 9, f) as gzf:
+          cPickle.dump(self.__times, gzf, cPickle.HIGHEST_PROTOCOL)
+    except IOError:
+      pass  # ignore errors---saving the times isn't that important
+
+# Remove additional arguments (anything after --).
+additional_args = []
+
+for i in range(len(sys.argv)):
+  if sys.argv[i] == '--':
+    additional_args = sys.argv[i+1:]
+    sys.argv = sys.argv[:i]
+    break
+
+parser = optparse.OptionParser(
+    usage = 'usage: %prog [options] binary [binary ...] -- [additional args]')
+
+parser.add_option('-d', '--output_dir', type='string',
+                  default=os.path.join(tempfile.gettempdir(), "gtest-parallel"),
+                  help='output directory for test logs')
+parser.add_option('-r', '--repeat', type='int', default=1,
+                  help='repeat tests')
+parser.add_option('--failed', action='store_true', default=False,
+                  help='run only failed and new tests')
+parser.add_option('-w', '--workers', type='int',
+                  default=multiprocessing.cpu_count(),
+                  help='number of workers to spawn')
+parser.add_option('--gtest_color', type='string', default='yes',
+                  help='color output')
+parser.add_option('--gtest_filter', type='string', default='',
+                  help='test filter')
+parser.add_option('--gtest_also_run_disabled_tests', action='store_true',
+                  default=False, help='run disabled tests too')
+parser.add_option('--format', type='string', default='filter',
+                  help='output format (raw,filter)')
+parser.add_option('--print_test_times', action='store_true', default=False,
+                  help='When done, list the run time of each test')
+
+(options, binaries) = parser.parse_args()
+
+if binaries == []:
+  parser.print_usage()
+  sys.exit(1)
+
+logger = RawFormat()
+if options.format == 'raw':
+  pass
+elif options.format == 'filter':
+  logger = FilterFormat()
+else:
+  sys.exit("Unknown output format: " + options.format)
+
+# Find tests.
+save_file = os.path.join(os.path.expanduser("~"), ".gtest-parallel-times")
+times = TestTimes(save_file)
+tests = []
+for test_binary in binaries:
+  command = [test_binary]
+  if options.gtest_also_run_disabled_tests:
+    command += ['--gtest_also_run_disabled_tests']
+
+  list_command = list(command)
+  if options.gtest_filter != '':
+    list_command += ['--gtest_filter=' + options.gtest_filter]
+
+  try:
+    test_list = subprocess.Popen(list_command + ['--gtest_list_tests'],
+                                 stderr=subprocess.PIPE).communicate()[1]
+  except OSError as e:
+    sys.exit("%s: %s" % (test_binary, str(e)))
+
+  command += additional_args
+
+  test_group = ''
+  for line in test_list.split('\n'):
+    if not line.strip():
+      continue
+    if line[0] != " ":
+      # Remove comments for typed tests and strip whitespace.
+      test_group = line.split('#')[0].strip()
+      continue
+    # Remove comments for parameterized tests and strip whitespace.
+    line = line.split('#')[0].strip()
+    if not line:
+      continue
+
+    test = test_group + line
+    if not options.gtest_also_run_disabled_tests and 'DISABLED_' in test:
+      continue
+    tests.append((times.get_test_time(test_binary, test),
+                  test_binary, test, command))
+
+if options.failed:
+  # The first element of each entry is the runtime of the most recent
+  # run if it was successful, or None if the test is new or the most
+  # recent run failed.
+  tests = [x for x in tests if x[0] is None]
+
+# Sort tests by falling runtime (with None, which is what we get for
+# new and failing tests, being considered larger than any real
+# runtime).
+tests.sort(reverse=True, key=lambda x: ((1 if x[0] is None else 0), x))
+
+# Repeat tests (-r flag).
+tests *= options.repeat
+test_lock = threading.Lock()
+job_id = 0
+logger.log(str(-1) + ': TESTCNT ' + ' ' + str(len(tests)))
+
+exit_code = 0
+
+# Create directory for test log output.
+try:
+  os.makedirs(options.output_dir)
+except OSError as e:
+  # Ignore errors if this directory already exists.
+  if e.errno != errno.EEXIST or not os.path.isdir(options.output_dir):
+    raise e
+# Remove files from old test runs.
+for logfile in os.listdir(options.output_dir):
+  os.remove(os.path.join(options.output_dir, logfile))
+
+# Run the specified job. Return the elapsed time in milliseconds if
+# the job succeeds, or None if the job fails. (This ensures that
+# failing tests will run first the next time.)
+def run_job((command, job_id, test)):
+  begin = time.time()
+
+  with tempfile.NamedTemporaryFile(dir=options.output_dir, delete=False) as log:
+    sub = subprocess.Popen(command + ['--gtest_filter=' + test] +
+                             ['--gtest_color=' + options.gtest_color],
+                           stdout=log.file,
+                           stderr=log.file)
+    try:
+      code = sigint_handler.wait(sub)
+    except sigint_handler.ProcessWasInterrupted:
+      thread.exit()
+    runtime_ms = int(1000 * (time.time() - begin))
+    logger.logfile(job_id, log.name)
+
+  logger.log("%s: EXIT %s %d" % (job_id, code, runtime_ms))
+  if code == 0:
+    return runtime_ms
+  global exit_code
+  exit_code = code
+  return None
+
+def worker():
+  global job_id
+  while True:
+    job = None
+    test_lock.acquire()
+    if job_id < len(tests):
+      (_, test_binary, test, command) = tests[job_id]
+      logger.log(str(job_id) + ': TEST ' + test_binary + ' ' + test)
+      job = (command, job_id, test)
+    job_id += 1
+    test_lock.release()
+    if job is None:
+      return
+    times.record_test_time(test_binary, test, run_job(job))
+
+def start_daemon(func):
+  t = threading.Thread(target=func)
+  t.daemon = True
+  t.start()
+  return t
+
+workers = [start_daemon(worker) for i in range(options.workers)]
+
+[t.join() for t in workers]
+logger.end()
+times.write_to_file(save_file)
+if options.print_test_times:
+  ts = sorted((times.get_test_time(test_binary, test), test_binary, test)
+              for (_, test_binary, test, _) in tests
+              if times.get_test_time(test_binary, test) is not None)
+  for (time_ms, test_binary, test) in ts:
+    print "%8s %s" % ("%dms" % time_ms, test)
+sys.exit(-signal.SIGINT if sigint_handler.got_sigint() else exit_code)
diff --git a/src/testing/gtest-parallel/patches/stderr_out.patch b/src/testing/gtest-parallel/patches/stderr_out.patch
new file mode 100644
index 0000000..ddaf9df
--- /dev/null
+++ b/src/testing/gtest-parallel/patches/stderr_out.patch
@@ -0,0 +1,19 @@
+commit 0dec4f46db1b072591cb6703c68a2ebb0279026d
+Author: Navreet Gill <navreetgill@google.com>
+Date:   Wed Aug 24 11:32:47 2016 -0700
+
+    test
+
+diff --git a/gtest-parallel b/gtest-parallel
+index 4e80928..a258a87 100755
+--- a/gtest-parallel
++++ b/gtest-parallel
+@@ -296,7 +296,7 @@ for test_binary in binaries:
+ 
+   try:
+     test_list = subprocess.Popen(list_command + ['--gtest_list_tests'],
+-                                 stdout=subprocess.PIPE).communicate()[0]
++                                 stderr=subprocess.PIPE).communicate()[1]
+   except OSError as e:
+     sys.exit("%s: %s" % (test_binary, str(e)))
+ 
diff --git a/src/testing/gtest/codereview.settings b/src/testing/gtest/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/testing/gtest/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/WebKit/codereview.settings b/src/third_party/WebKit/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/WebKit/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/angle/codereview.settings b/src/third_party/angle/codereview.settings
deleted file mode 100644
index 1295fd9..0000000
--- a/src/third_party/angle/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/dlmalloc/codereview.settings b/src/third_party/dlmalloc/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/dlmalloc/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/freetype2/codereview.settings b/src/third_party/freetype2/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/freetype2/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/icu/codereview.settings b/src/third_party/icu/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/icu/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/libvpx/codereview.settings b/src/third_party/libvpx/codereview.settings
deleted file mode 100644
index d7c8d39..0000000
--- a/src/third_party/libvpx/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: chromium-review.googlesource.com
-GERRIT_PORT: 29418
-CODE_REVIEW_SERVER: chromium-review.googlesource.com
diff --git a/src/third_party/mozjs/codereview.settings b/src/third_party/mozjs/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/mozjs/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/mozjs/js/src/assembler/wtf/Platform.h b/src/third_party/mozjs/js/src/assembler/wtf/Platform.h
index 2e440e3..05b1155 100644
--- a/src/third_party/mozjs/js/src/assembler/wtf/Platform.h
+++ b/src/third_party/mozjs/js/src/assembler/wtf/Platform.h
@@ -1033,14 +1033,6 @@
 #define ENABLE_REPAINT_THROTTLING 0
 #endif
 
-#if defined(WTF_OS_STARBOARD)
-#if SB_CAN(MAP_EXECUTABLE_MEMORY)
-#define ENABLE_JIT 1
-#else
-#define ENABLE_JIT 0
-#endif
-#endif
-
 /* Disable the JIT on versions of GCC prior to 4.1 */
 #if !defined(ENABLE_JIT) && WTF_COMPILER_GCC && !GCC_VERSION_AT_LEAST(4, 1, 0)
 #define ENABLE_JIT 0
@@ -1050,7 +1042,7 @@
 #if !defined(ENABLE_JIT) \
     && (WTF_CPU_X86 || WTF_CPU_X86_64 || WTF_CPU_ARM || WTF_CPU_SPARC32 || WTF_CPU_MIPS) \
     && (WTF_OS_DARWIN || !WTF_COMPILER_GCC || GCC_VERSION_AT_LEAST(4, 1, 0)) \
-    && !WTF_OS_WINCE
+    && !WTF_OS_WINCE && !defined(WTF_OS_STARBOARD)
 #define ENABLE_JIT 1
 #endif
 
diff --git a/src/third_party/mozjs/js/src/jit/CodeGenerator.cpp b/src/third_party/mozjs/js/src/jit/CodeGenerator.cpp
index 294a955..ab8ea02 100644
--- a/src/third_party/mozjs/js/src/jit/CodeGenerator.cpp
+++ b/src/third_party/mozjs/js/src/jit/CodeGenerator.cpp
@@ -715,6 +715,12 @@
 }
 
 bool
+CodeGenerator::visitMop(LMop *lir)
+{
+    return true;
+}
+
+bool
 CodeGenerator::visitOsiPoint(LOsiPoint *lir)
 {
     // Note: markOsiPoint ensures enough space exists between the last
@@ -4254,6 +4260,13 @@
             masm.add32(Imm32(min), temp);
             if (!bailoutIf(Assembler::Overflow, lir->snapshot()))
                 return false;
+        }
+
+        masm.cmp32(temp, Imm32(0));
+        if (!bailoutIf(Assembler::LessThan, lir->snapshot()))
+            return false;
+
+        if (min != 0) {
             int32_t diff;
             if (SafeSub(max, min, &diff))
                 max = diff;
@@ -4261,9 +4274,6 @@
                 masm.sub32(Imm32(min), temp);
         }
 
-        masm.cmp32(temp, Imm32(0));
-        if (!bailoutIf(Assembler::LessThan, lir->snapshot()))
-            return false;
     }
 
     // Compute the maximum possible index. No overflow check is needed when
diff --git a/src/third_party/mozjs/js/src/jit/CodeGenerator.h b/src/third_party/mozjs/js/src/jit/CodeGenerator.h
index 873d7f2..94854d4 100644
--- a/src/third_party/mozjs/js/src/jit/CodeGenerator.h
+++ b/src/third_party/mozjs/js/src/jit/CodeGenerator.h
@@ -51,6 +51,7 @@
 
     bool visitLabel(LLabel *lir);
     bool visitNop(LNop *lir);
+    bool visitMop(LMop *lir);
     bool visitOsiPoint(LOsiPoint *lir);
     bool visitGoto(LGoto *lir);
     bool visitTableSwitch(LTableSwitch *ins);
diff --git a/src/third_party/mozjs/js/src/jit/IonCaches.cpp b/src/third_party/mozjs/js/src/jit/IonCaches.cpp
index 30d3711..f833d0f 100644
--- a/src/third_party/mozjs/js/src/jit/IonCaches.cpp
+++ b/src/third_party/mozjs/js/src/jit/IonCaches.cpp
@@ -2522,6 +2522,9 @@
     cache.getScriptedLocation(&script, &pc);
     RootedValue lval(cx, ObjectValue(*obj));
 
+    // Override the return value if the script is invalidated (bug 728188).
+    AutoDetectInvalidation adi(cx, res.address(), ion);
+
     if (cache.isDisabled()) {
         if (!GetElementOperation(cx, JSOp(*pc), &lval, idval, res))
             return false;
@@ -2529,9 +2532,7 @@
         return true;
     }
 
-    // Override the return value if we are invalidated (bug 728188).
-    AutoFlushCache afc ("GetElementCache");
-    AutoDetectInvalidation adi(cx, res.address(), ion);
+    AutoFlushCache afc("GetElementCache");
 
     RootedId id(cx);
     if (!ValueToId<CanGC>(cx, idval, &id))
diff --git a/src/third_party/mozjs/js/src/jit/LIR-Common.h b/src/third_party/mozjs/js/src/jit/LIR-Common.h
index 5a87e04..fb43cfc 100644
--- a/src/third_party/mozjs/js/src/jit/LIR-Common.h
+++ b/src/third_party/mozjs/js/src/jit/LIR-Common.h
@@ -46,6 +46,12 @@
     LIR_HEADER(Nop)
 };
 
+class LMop : public LInstructionHelper<0, 0, 0>
+{
+  public:
+    LIR_HEADER(Mop)
+};
+
 // An LOsiPoint captures a snapshot after a call and ensures enough space to
 // patch in a call to the invalidation mechanism.
 //
diff --git a/src/third_party/mozjs/js/src/jit/LOpcodes.h b/src/third_party/mozjs/js/src/jit/LOpcodes.h
index 1520829..dfbd53a 100644
--- a/src/third_party/mozjs/js/src/jit/LOpcodes.h
+++ b/src/third_party/mozjs/js/src/jit/LOpcodes.h
@@ -10,6 +10,7 @@
 #define LIR_COMMON_OPCODE_LIST(_)   \
     _(Label)                        \
     _(Nop)                          \
+    _(Mop)                          \
     _(OsiPoint)                     \
     _(MoveGroup)                    \
     _(Integer)                      \
diff --git a/src/third_party/mozjs/js/src/jit/Lowering.cpp b/src/third_party/mozjs/js/src/jit/Lowering.cpp
index fd1dc57..19e7425 100644
--- a/src/third_party/mozjs/js/src/jit/Lowering.cpp
+++ b/src/third_party/mozjs/js/src/jit/Lowering.cpp
@@ -2836,13 +2836,25 @@
     ins->setInWorklistUnchecked();
 #endif
 
+    // If we added a Nop for this instruction, we'll also add a Mop, so that
+    // that live-ranges for fixed register defs, which with LSRA extend through
+    // the Nop so that they can extend through the OsiPoint don't, with their
+    // one-extra extension, extend into a position where they use the input
+    // move group for the following instruction.
+    bool needsMop = !current->instructions().empty() && current->rbegin()->isNop();
+
     // If no safepoint was created, there's no need for an OSI point.
     if (LOsiPoint *osiPoint = popOsiPoint()) {
         if (!add(osiPoint))
             return false;
     }
 
-    return true;
+    if (needsMop) {
+        if (!add(new LMop()))
+            return false;
+    }
+
+     return true;
 }
 
 bool
diff --git a/src/third_party/mozjs/js/src/jit/RangeAnalysis.cpp b/src/third_party/mozjs/js/src/jit/RangeAnalysis.cpp
index fd68f91..c8cbc20 100644
--- a/src/third_party/mozjs/js/src/jit/RangeAnalysis.cpp
+++ b/src/third_party/mozjs/js/src/jit/RangeAnalysis.cpp
@@ -339,7 +339,9 @@
     // Instead, we should use it to eliminate the dead block.
     // (Bug 765127)
     if (r->upper_ < r->lower_) {
-        *emptyRange = true;
+        // If both ranges can be NaN, the result can still be NaN.
+        if (!lhs->isInfinite() || !rhs->isInfinite())
+            *emptyRange = true;
         r->makeRangeInfinite();
     }
 
diff --git a/src/third_party/mozjs/js/src/jit/arm/MacroAssembler-arm.h b/src/third_party/mozjs/js/src/jit/arm/MacroAssembler-arm.h
index 04d68af..c46883a 100644
--- a/src/third_party/mozjs/js/src/jit/arm/MacroAssembler-arm.h
+++ b/src/third_party/mozjs/js/src/jit/arm/MacroAssembler-arm.h
@@ -763,8 +763,9 @@
         if (lhs.getTag() == Operand::OP2) {
             branch32(cond, lhs.toReg(), rhs, label);
         } else {
-            ma_ldr(lhs, ScratchRegister);
-            branch32(cond, ScratchRegister, rhs, label);
+          // branch32 will use ScratchRegister.
+          ma_ldr(lhs, secondScratchReg_);
+          branch32(cond, secondScratchReg_, rhs, label);
         }
     }
     void branch32(Condition cond, const Address &lhs, Register rhs, Label *label) {
@@ -772,8 +773,9 @@
         branch32(cond, ScratchRegister, rhs, label);
     }
     void branch32(Condition cond, const Address &lhs, Imm32 rhs, Label *label) {
-        load32(lhs, ScratchRegister);
-        branch32(cond, ScratchRegister, rhs, label);
+      // branch32 will use ScratchRegister.
+      load32(lhs, secondScratchReg_);
+      branch32(cond, secondScratchReg_, rhs, label);
     }
     void branchPtr(Condition cond, const Address &lhs, Register rhs, Label *label) {
         branch32(cond, lhs, rhs, label);
@@ -856,8 +858,9 @@
         ma_b(label, cond);
     }
     void branchTest32(Condition cond, const Address &address, Imm32 imm, Label *label) {
-        ma_ldr(Operand(address.base, address.offset), ScratchRegister);
-        branchTest32(cond, ScratchRegister, imm, label);
+      // branchTest32 will use ScratchRegister.
+      load32(address, secondScratchReg_);
+      branchTest32(cond, secondScratchReg_, imm, label);
     }
     void branchTestPtr(Condition cond, const Register &lhs, const Register &rhs, Label *label) {
         branchTest32(cond, lhs, rhs, label);
diff --git a/src/third_party/mozjs/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h b/src/third_party/mozjs/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h
index ec0886c..eed3ffd 100644
--- a/src/third_party/mozjs/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h
+++ b/src/third_party/mozjs/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h
@@ -216,8 +216,6 @@
         isBranch[idx >> 3] |= 1 << (idx & 0x7);
     }
     bool isNextBranch() {
-        if (this->nodeSize == InstBaseSize)
-            return false;
         int idx = this->nodeSize / InstBaseSize;
         return (isBranch[idx >> 3] >> (idx & 0x7)) & 1;
     }
diff --git a/src/third_party/mozjs/js/src/jsbool.cpp b/src/third_party/mozjs/js/src/jsbool.cpp
index 3b97d25..1df3511 100644
--- a/src/third_party/mozjs/js/src/jsbool.cpp
+++ b/src/third_party/mozjs/js/src/jsbool.cpp
@@ -200,7 +200,8 @@
 bool
 js::BooleanGetPrimitiveValueSlow(HandleObject wrappedBool, JSContext *cx)
 {
-    JSObject *obj = GetProxyTargetObject(wrappedBool);
-    JS_ASSERT(obj);
+    JSObject *obj = CheckedUnwrap(wrappedBool);
+    if (!obj || !obj->is<BooleanObject>())
+        return false;
     return obj->as<BooleanObject>().unbox();
 }
diff --git a/src/third_party/mozjs/js/src/jsobj.cpp b/src/third_party/mozjs/js/src/jsobj.cpp
index d922358..c8fc252 100644
--- a/src/third_party/mozjs/js/src/jsobj.cpp
+++ b/src/third_party/mozjs/js/src/jsobj.cpp
@@ -279,11 +279,18 @@
     if (pobj->isNative()) {
         desc->attrs = GetShapeAttributes(shape);
         if (desc->attrs & (JSPROP_GETTER | JSPROP_SETTER)) {
+            MOZ_ASSERT(desc.isShared());
             doGet = false;
             if (desc->attrs & JSPROP_GETTER)
                 desc->getter = CastAsPropertyOp(shape->getterObject());
             if (desc->attrs & JSPROP_SETTER)
                 desc->setter = CastAsStrictPropertyOp(shape->setterObject());
+        } else {
+             // This is either a straight-up data property or (rarely) a
+             // property with a JSPropertyOp getter/setter. The latter must be
+             // reported to the caller as a plain data property, so don't
+             // populate desc.getter/setter, and mask away the SHARED bit.
+             desc->attrs &= ~JSPROP_SHARED;
         }
     } else {
         if (!JSObject::getGenericAttributes(cx, pobj, id, &desc->attrs))
@@ -5337,4 +5344,3 @@
 #endif
     }
 }
-
diff --git a/src/third_party/mozjs/js/src/jsproxy.cpp b/src/third_party/mozjs/js/src/jsproxy.cpp
index 2dbad14..eddf34f 100644
--- a/src/third_party/mozjs/js/src/jsproxy.cpp
+++ b/src/third_party/mozjs/js/src/jsproxy.cpp
@@ -2328,7 +2328,9 @@
     AutoEnterPolicy policy(cx, handler, proxy, id, BaseProxyHandler::GET, true);
     if (!policy.allowed())
         return policy.returnValue();
-    return handler->getOwnPropertyDescriptor(cx, proxy, id, desc, flags);
+    bool ok = handler->getOwnPropertyDescriptor(cx, proxy, id, desc, flags);
+    MOZ_ASSERT_IF(ok && desc.isShared(), desc.hasGetterOrSetterObject());
+    return ok;
 }
 
 bool
diff --git a/src/third_party/mozjs/mozjs.gyp b/src/third_party/mozjs/mozjs.gyp
index c3ed096..c646032 100644
--- a/src/third_party/mozjs/mozjs.gyp
+++ b/src/third_party/mozjs/mozjs.gyp
@@ -17,10 +17,11 @@
   ],
   'variables': {
     'common_jit_defines': [
+      'ENABLE_JIT=1',
+      'ENABLE_YARR_JIT=1',
       'JS_ION=1',
       'JS_METHODJIT=1',
       'JS_METHODJIT_TYPED_ARRAY=1',
-      'ENABLE_YARR_JIT=1',
     ],
   },
   'target_defaults': {
@@ -47,20 +48,22 @@
         'defines': [
           'JS_CPU_X64=1',
           'JS_PUNBOX64=1',
-          '<@(common_jit_defines)',
         ],
       }],
       [ 'target_arch == "x86"', {
         'defines': [
           'JS_CPU_X86=1',
           'JS_NUNBOX32=1',
-          '<@(common_jit_defines)',
         ],
       }],
       [ 'target_arch == "arm"', {
         'defines': [
           'JS_CPU_ARM=1',
           'JS_NUNBOX32=1',
+        ],
+      }],
+      [ 'cobalt_enable_jit == 1', {
+        'defines': [
           '<@(common_jit_defines)',
         ],
       }],
@@ -98,7 +101,7 @@
         'js-confdefs.h',
       ],
       'conditions': [
-        [ 'target_arch == "x64"', {
+        [ 'target_arch == "x64" and cobalt_enable_jit == 1', {
           'sources': [
             'js/src/assembler/assembler/MacroAssemblerX86Common.cpp',
             'js/src/jit/shared/Assembler-x86-shared.cpp',
@@ -119,7 +122,7 @@
             '<@(mozjs_jit_sources)',
           ],
         }],
-        [ 'target_arch == "x86"', {
+        [ 'target_arch == "x86" and cobalt_enable_jit == 1', {
           'sources': [
             'js/src/assembler/assembler/MacroAssemblerX86Common.cpp',
             'js/src/jit/shared/Assembler-x86-shared.cpp',
@@ -140,7 +143,7 @@
             '<@(mozjs_jit_sources)',
           ],
         }],
-        [ 'target_arch == "arm"', {
+        [ 'target_arch == "arm" and cobalt_enable_jit == 1', {
           'sources': [
             'js/src/assembler/assembler/ARMAssembler.cpp',
             'js/src/assembler/assembler/MacroAssemblerARM.cpp',
diff --git a/src/third_party/openssl/README.chromium b/src/third_party/openssl/README.chromium
index fbae0aa..6c8889b 100644
--- a/src/third_party/openssl/README.chromium
+++ b/src/third_party/openssl/README.chromium
@@ -1,6 +1,6 @@
 Name: openssl
 URL: http://openssl.org/source/
-Version: 1.0.1c
+Version: 1.0.1p
 License: BSDish
 License File: openssl/LICENSE
 License Android Compatible: yes
diff --git a/src/third_party/openssl/codereview.settings b/src/third_party/openssl/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/openssl/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/third_party/ots/codereview.settings b/src/third_party/ots/codereview.settings
deleted file mode 100644
index acbc431..0000000
--- a/src/third_party/ots/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
\ No newline at end of file
diff --git a/src/third_party/ots/include/opentype-sanitiser.h b/src/third_party/ots/include/opentype-sanitiser.h
index fc76b90..1380ac7 100644
--- a/src/third_party/ots/include/opentype-sanitiser.h
+++ b/src/third_party/ots/include/opentype-sanitiser.h
@@ -82,8 +82,10 @@
     }
 
     while (length >= 4) {
-      chksum_ += ntohl(*reinterpret_cast<const uint32_t*>(
-          reinterpret_cast<const uint8_t*>(data) + offset));
+      uint32_t tmp;
+      std::memcpy(&tmp, reinterpret_cast<const uint8_t *>(data) + offset,
+        sizeof(uint32_t));
+      chksum_ += ntohl(tmp);
       length -= 4;
       offset += 4;
     }
diff --git a/src/third_party/skia/codereview.settings b/src/third_party/skia/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/third_party/skia/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/src/tools/gyp/codereview.settings b/src/tools/gyp/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/src/tools/gyp/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
