Import Cobalt 20.master.0.223212
diff --git a/src/base/threading/thread.h b/src/base/threading/thread.h
index 9434c84..b5603c1 100644
--- a/src/base/threading/thread.h
+++ b/src/base/threading/thread.h
@@ -27,6 +27,10 @@
 class MessagePump;
 class RunLoop;
 
+#if defined(STARBOARD)
+const size_t kUnitTestStackSize = 1024 * 1024;
+#endif
+
 namespace sequence_manager {
 class SequenceManager;
 }  // namespace sequence_manager
diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index 1e75f4e..7f3a40e 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -2,6 +2,14 @@
 
 This document records all notable changes made to Cobalt since the last release.
 
+## Version 21
+
+ - **DevTools shows asynchronous stack traces.**
+
+  When stopped at a breakpoint within the handler function for an asynchronous
+  operation, the call stack in DevTools now shows both the current function as
+  well as the function where the asynchronous operation was initiated.
+
 ## Version 20
 
  - **Support for QUIC and SPDY is now enabled.**
@@ -131,7 +139,7 @@
    options to be instead run-time options.  This will primarily be enabled
    by the new Starboard extensions framework.  An example of an platform
    specific option added in this way can be found in
-   `cobalt/extension/graphis.h`.
+   `cobalt/extension/graphics.h`.
 
  - **Cobalt code assumes that no errors are generated for unused parameters**
 
diff --git a/src/cobalt/base/debugger_hooks.h b/src/cobalt/base/debugger_hooks.h
new file mode 100644
index 0000000..b0ac836
--- /dev/null
+++ b/src/cobalt/base/debugger_hooks.h
@@ -0,0 +1,78 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#ifndef COBALT_BASE_DEBUGGER_HOOKS_H_
+#define COBALT_BASE_DEBUGGER_HOOKS_H_
+
+#include <string>
+
+namespace base {
+
+// Interface to allow the WebModule and the various objects implementing the
+// DOM, etc. to report their behaviour to the web debugger, without needing to
+// directly access the DebugModule.
+class DebuggerHooks {
+ public:
+  // Record the JavaScript stack on the WebModule thread at the point a task is
+  // initiated that will run at a later time (on the same thread), allowing it
+  // to be seen as the originator when breaking in the asynchronous task.
+  //
+  // |task| is a pointer to any arbitrary object (e.g. callback, timer, etc.)
+  // uniquely associated with the execution that will take place at a later
+  // time.
+  //
+  // |name| is a user-visible label shown in the debugger to identify what the
+  // asynchronous stack trace is.
+  //
+  // |recurring| is true if the task may be run more than once.
+  virtual void AsyncTaskScheduled(void* task, const std::string& name,
+                                  bool recurring = false) const = 0;
+
+  // Inform the debugger that a scheduled task is starting to run.
+  virtual void AsyncTaskStarted(void* task) const = 0;
+
+  // Inform the debugger that a scheduled task has finished running.
+  virtual void AsyncTaskFinished(void* task) const = 0;
+
+  // Inform the debugger that a scheduled task will no longer be run, and that
+  // it may free any resources associated with it.
+  virtual void AsyncTaskCanceled(void* task) const = 0;
+};
+
+// Helper to start & finish async tasks using RAII.
+class ScopedAsyncTask {
+ public:
+  ScopedAsyncTask(const DebuggerHooks& debugger_hooks, void* task)
+      : debugger_hooks_(debugger_hooks), task_(task) {
+    debugger_hooks_.AsyncTaskStarted(task_);
+  }
+  ~ScopedAsyncTask() { debugger_hooks_.AsyncTaskFinished(task_); }
+
+ private:
+  const DebuggerHooks& debugger_hooks_;
+  void* const task_;
+};
+
+// Null implementation for gold builds and tests where there is no debugger.
+class NullDebuggerHooks : public DebuggerHooks {
+ public:
+  void AsyncTaskScheduled(void* task, const std::string& name,
+                          bool recurring) const override {}
+  void AsyncTaskStarted(void* task) const override {}
+  void AsyncTaskFinished(void* task) const override {}
+  void AsyncTaskCanceled(void* task) const override {}
+};
+
+}  // namespace base
+
+#endif  // COBALT_BASE_DEBUGGER_HOOKS_H_
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_indexed_getter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_indexed_getter_interface.cc
index f0bd582..dd9e3ca 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_indexed_getter_interface.cc
@@ -240,9 +240,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -348,9 +347,7 @@
 
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "length",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -365,7 +362,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -431,10 +427,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_getter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_getter_interface.cc
index 2e770b3..865b7df 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_getter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_getter_interface.cc
@@ -242,9 +242,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -302,9 +301,7 @@
 };
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -313,7 +310,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -379,10 +375,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_indexed_getter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_indexed_getter_interface.cc
index 1b596da..e98dcd8 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_anonymous_named_indexed_getter_interface.cc
@@ -339,9 +339,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -447,9 +446,7 @@
 
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "length",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -464,7 +461,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -530,10 +526,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_arbitrary_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_arbitrary_interface.cc
index 429154a..663868c 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_arbitrary_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_arbitrary_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -344,10 +343,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "arbitraryProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -365,7 +361,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -440,10 +435,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_base_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_base_interface.cc
index c4e13c1..374da1c 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_base_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_base_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -292,10 +291,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "baseAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -313,7 +309,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -388,10 +383,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_boolean_type_test_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_boolean_type_test_interface.cc
index b35bd91..3e5cb25 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_boolean_type_test_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_boolean_type_test_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -367,7 +366,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_booleanReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -420,10 +418,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "booleanProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -444,7 +439,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -510,10 +504,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_function_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_function_interface.cc
index dd4017b..916a189 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_function_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_function_interface.cc
@@ -147,9 +147,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -471,7 +470,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_takesFunctionWithNullableParameters(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -536,7 +534,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_takesFunctionWithOneParameter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -601,7 +598,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_takesFunctionWithSeveralParameters(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -666,7 +662,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_takesVoidFunction(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -731,10 +726,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "callbackAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -770,7 +762,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -836,10 +827,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_interface_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_interface_interface.cc
index 57ad85b..20d8f61 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_interface_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_callback_interface_interface.cc
@@ -147,9 +147,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -371,7 +370,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_someOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -418,10 +416,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "callbackAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -442,7 +437,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -508,10 +502,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_conditional_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_conditional_interface.cc
index dfb4d96..8b87d23 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_conditional_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_conditional_interface.cc
@@ -146,9 +146,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -411,6 +410,7 @@
 #endif  // NO_ENABLE_CONDITIONAL_PROPERTY
 #if defined(NO_ENABLE_CONDITIONAL_PROPERTY)
 
+
 bool fcn_disabledOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -460,6 +460,7 @@
 #endif  // NO_ENABLE_CONDITIONAL_PROPERTY
 #if defined(ENABLE_CONDITIONAL_PROPERTY)
 
+
 bool fcn_enabledOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -508,9 +509,7 @@
 
 #endif  // ENABLE_CONDITIONAL_PROPERTY
 
-
 const JSPropertySpec prototype_properties[] = {
-
 #if defined(ENABLE_CONDITIONAL_PROPERTY)
   {  // Read/Write property
     "enabledAttribute",
@@ -545,7 +544,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -611,10 +609,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constants_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constants_interface.cc
index 43785e0..e7f9026 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constants_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constants_interface.cc
@@ -143,48 +143,8 @@
   return false;
 }
 
-bool get_INTEGER_CONSTANT(
-    JSContext* context, unsigned argc, JS::Value* vp) {
-  COMPILE_ASSERT(ConstantsInterface::kIntegerConstant == 5,
-                 ValueForConstantsInterface_kIntegerConstantDoesNotMatchIDL);
-  JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-  if (!args.thisv().isObject()) {
-    MozjsExceptionState exception(context);
-    exception.SetSimpleException(script::kTypeError, "Invalid this.");
-    return false;
-  }
-  JS::RootedObject object(context, &args.thisv().toObject());
-  MozjsExceptionState exception_state(context);
-  JS::RootedValue result_value(context);
-  ToJSValue(context, 5, &result_value);
-  if (!exception_state.is_exception_set()) {
-    args.rval().set(result_value);
-  }
-  return !exception_state.is_exception_set();
-}
-bool get_DOUBLE_CONSTANT(
-    JSContext* context, unsigned argc, JS::Value* vp) {
-  DCHECK_EQ(2.718, ConstantsInterface::kDoubleConstant) <<
-      "The value for ConstantsInterface::kDoubleConstant does not match "
-      "the value in the interface definition.";
-  JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-  if (!args.thisv().isObject()) {
-    MozjsExceptionState exception(context);
-    exception.SetSimpleException(script::kTypeError, "Invalid this.");
-    return false;
-  }
-  JS::RootedObject object(context, &args.thisv().toObject());
-  MozjsExceptionState exception_state(context);
-  JS::RootedValue result_value(context);
-  ToJSValue(context, 2.718, &result_value);
-  if (!exception_state.is_exception_set()) {
-    args.rval().set(result_value);
-  }
-  return !exception_state.is_exception_set();
-}
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -242,21 +202,7 @@
 };
 
 
-
 const JSPropertySpec prototype_properties[] = {
-  {
-      "INTEGER_CONSTANT",
-      JSPROP_PERMANENT | JSPROP_SHARED | JSPROP_ENUMERATE,
-      { { &get_INTEGER_CONSTANT, NULL } },
-      JSNATIVE_WRAPPER(NULL)
-  },
-  {
-      "DOUBLE_CONSTANT",
-      JSPROP_PERMANENT | JSPROP_SHARED | JSPROP_ENUMERATE,
-      { { &get_DOUBLE_CONSTANT, NULL } },
-      JSNATIVE_WRAPPER(NULL)
-  },
-
   JS_PS_END
 };
 
@@ -265,19 +211,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-  {
-    "INTEGER_CONSTANT",
-    JSPROP_SHARED | JSPROP_ENUMERATE,
-    { { &get_INTEGER_CONSTANT, NULL } },
-    JSNATIVE_WRAPPER(NULL),
-  },
-  {
-    "DOUBLE_CONSTANT",
-    JSPROP_SHARED | JSPROP_ENUMERATE,
-    { { &get_DOUBLE_CONSTANT, NULL } },
-    JSNATIVE_WRAPPER(NULL),
-  },
-
   JS_PS_END
 };
 
@@ -343,10 +276,33 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define constants.
+  {
+    success = JS_DefineProperty(context, rooted_prototype,
+        "INTEGER_CONSTANT", 5,
+        JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT, NULL, NULL);
+    DCHECK(success);
+    success = JS_DefineProperty(context, rooted_interface_object,
+        "INTEGER_CONSTANT", 5,
+        JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT, NULL, NULL);
+    DCHECK(success);
+  }
+  {
+    success = JS_DefineProperty(context, rooted_prototype,
+        "DOUBLE_CONSTANT", 2.718,
+        JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT, NULL, NULL);
+    DCHECK(success);
+    success = JS_DefineProperty(context, rooted_interface_object,
+        "DOUBLE_CONSTANT", 2.718,
+        JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT, NULL, NULL);
+    DCHECK(success);
+  }
+
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_interface.cc
index 086f001..2c78212 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -198,9 +197,7 @@
 };
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -209,7 +206,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -284,10 +280,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_with_arguments_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_with_arguments_interface.cc
index ee0d5a5..71f8d3a 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_with_arguments_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_constructor_with_arguments_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -342,9 +341,7 @@
 
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "longArg",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -371,7 +368,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -446,10 +442,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
@@ -590,11 +587,13 @@
   if (args.length() > 2) {
     JS::RootedValue optional_value0(
         context, args[2]);
-    FromJSValue(context,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &defaultArg);
+    if (!optional_value0.isUndefined()) {
+      FromJSValue(context,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &defaultArg);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_convert_simple_object_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_convert_simple_object_interface.cc
index 969ff32..2c1151d 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_convert_simple_object_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_convert_simple_object_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -262,10 +261,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -277,7 +273,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -352,10 +347,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_getter_setter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_getter_setter_interface.cc
index 56b32c5..e090b2c 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_getter_setter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_getter_setter_interface.cc
@@ -343,9 +343,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -621,7 +620,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_derivedIndexedSetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -698,7 +696,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_operationOnDerivedClass(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -745,10 +742,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "length",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -778,7 +772,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -849,10 +842,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_interface.cc
index e2076d7..e2b04ca 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_derived_interface.cc
@@ -142,9 +142,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -296,10 +295,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "derivedAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -317,7 +313,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -397,10 +392,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dictionary_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dictionary_interface.cc
index 9476c72..39b1361 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dictionary_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dictionary_interface.cc
@@ -149,9 +149,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -373,7 +372,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_dictionaryOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -438,7 +436,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_testOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -503,10 +500,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "dictionarySequence",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -530,7 +524,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -596,10 +589,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_disabled_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_disabled_interface.cc
index 737c6e5..f67b624 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_disabled_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_disabled_interface.cc
@@ -146,9 +146,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -352,10 +351,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "disabledProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -373,7 +369,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -439,10 +434,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dom_string_test_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dom_string_test_interface.cc
index 8743ada..da518fd 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dom_string_test_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_dom_string_test_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -699,9 +698,7 @@
 }
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "property",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -746,7 +743,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -812,10 +808,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_enumeration_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_enumeration_interface.cc
index f750d28..60f5f0f 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_enumeration_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_enumeration_interface.cc
@@ -140,9 +140,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -347,11 +346,13 @@
   if (args.length() > 0) {
     JS::RootedValue optional_value0(
         context, args[0]);
-    FromJSValue(context,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &value);
+    if (!optional_value0.isUndefined()) {
+      FromJSValue(context,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &value);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -362,10 +363,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "enumProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -383,7 +381,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -458,10 +455,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exception_object_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exception_object_interface.cc
index 28d588b..f5f02b5 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exception_object_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exception_object_interface.cc
@@ -144,9 +144,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -300,9 +299,7 @@
 
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "error",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -323,7 +320,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -392,10 +388,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exceptions_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exceptions_interface.cc
index 79f7962..398330a 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exceptions_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_exceptions_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -344,10 +343,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "attributeThrowsException",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -365,7 +361,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -440,10 +435,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_extended_idl_attributes_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_extended_idl_attributes_interface.cc
index beb697c..87b9b72 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_extended_idl_attributes_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_extended_idl_attributes_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -351,7 +350,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_clampArgument(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -416,10 +414,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "default",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -440,7 +435,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -506,10 +500,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_garbage_collection_test_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_garbage_collection_test_interface.cc
index d922064..6e26a32 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_garbage_collection_test_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_garbage_collection_test_interface.cc
@@ -142,9 +142,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -402,9 +401,7 @@
 }
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "previous",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -425,7 +422,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -500,10 +496,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_global_interface_parent.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_global_interface_parent.cc
index 3ae7d9d..869928f 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_global_interface_parent.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_global_interface_parent.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -249,10 +248,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -264,7 +260,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -330,10 +325,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_indexed_getter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_indexed_getter_interface.cc
index 77c559c..a2341c9 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_indexed_getter_interface.cc
@@ -256,9 +256,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -428,7 +427,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_indexedGetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -499,7 +497,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_indexedSetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -576,10 +573,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "length",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -603,7 +597,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -669,10 +662,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any.cc
index 8503fb6..3e3e903 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -250,7 +249,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setAny(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -315,10 +313,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -333,7 +328,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -408,10 +402,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any_dictionary.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any_dictionary.cc
index 2d4626f..23dd4cf 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any_dictionary.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_any_dictionary.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -250,7 +249,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_hasAny(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -303,7 +301,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_hasAnyDefault(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -356,7 +353,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setAny(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -421,10 +417,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -445,7 +438,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -520,10 +512,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_date.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_date.cc
index 60f9c6b..754f59e 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_date.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_date.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -250,7 +249,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setDate(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -315,10 +313,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -333,7 +328,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -408,10 +402,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_unsupported_properties.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_unsupported_properties.cc
index 5d45693..bea1780 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_unsupported_properties.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_interface_with_unsupported_properties.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -251,9 +250,7 @@
 
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "supportedAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -268,7 +265,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -334,10 +330,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_constructor_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_constructor_interface.cc
index f0d0dcb..2e8864f 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_constructor_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_constructor_interface.cc
@@ -138,9 +138,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -198,9 +197,7 @@
 };
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -209,7 +206,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -284,10 +280,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_getter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_getter_interface.cc
index 324ea48..7957141 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_getter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_getter_interface.cc
@@ -258,9 +258,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -382,7 +381,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_namedGetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -453,7 +451,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_namedSetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -530,10 +527,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -551,7 +545,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -617,10 +610,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_indexed_getter_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_indexed_getter_interface.cc
index 5f8a2c5..1e46aa2 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_named_indexed_getter_interface.cc
@@ -339,9 +339,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -617,7 +616,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_indexedSetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -694,7 +692,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_namedGetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -765,7 +762,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_namedSetter(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -842,7 +838,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_operationOnBaseClass(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -889,10 +884,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Readonly attribute
     "length",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -928,7 +920,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -994,10 +985,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nested_put_forwards_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nested_put_forwards_interface.cc
index 158b7da..ce32a61 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nested_put_forwards_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nested_put_forwards_interface.cc
@@ -147,9 +147,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -329,9 +328,7 @@
 }
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "nestedForwardingAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -346,7 +343,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -412,10 +408,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_constructor_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_constructor_interface.cc
index f3e738c..66d3768 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_constructor_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_constructor_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -203,9 +202,7 @@
 };
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -214,7 +211,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -280,10 +276,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_interface_object_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_interface_object_interface.cc
index 272309c..5f2fcb2 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_interface_object_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_no_interface_object_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -203,9 +202,7 @@
 };
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -214,7 +211,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nullable_types_test_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nullable_types_test_interface.cc
index 2969ca0..c91673c 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nullable_types_test_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_nullable_types_test_interface.cc
@@ -149,9 +149,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -773,7 +772,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableBooleanOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -826,7 +824,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableDictionaryArgument(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -891,7 +888,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableDictionaryOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -944,7 +940,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableNumericArgument(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1009,7 +1004,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableNumericOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1062,7 +1056,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableObjectArgument(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1127,7 +1120,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableObjectOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1180,7 +1172,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableStringArgument(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1245,7 +1236,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_nullableStringOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1298,10 +1288,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "nullableBooleanProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -1370,7 +1357,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -1436,10 +1422,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_numeric_types_test_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_numeric_types_test_interface.cc
index 627b79d..238661c 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_numeric_types_test_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_numeric_types_test_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -2067,7 +2066,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_byteReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2120,7 +2118,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_doubleArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2185,7 +2182,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_doubleReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2238,7 +2234,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_longArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2303,7 +2298,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_longLongArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2368,7 +2362,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_longLongReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2421,7 +2414,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_longReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2474,7 +2466,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_octetArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2539,7 +2530,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_octetReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2592,7 +2582,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_shortArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2657,7 +2646,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_shortReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2710,7 +2698,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unrestrictedDoubleArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2775,7 +2762,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unrestrictedDoubleReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2828,7 +2814,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unsignedLongArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2893,7 +2878,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unsignedLongLongArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -2958,7 +2942,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unsignedLongLongReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -3011,7 +2994,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unsignedLongReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -3064,7 +3046,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unsignedShortArgumentOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -3129,7 +3110,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_unsignedShortReturnOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -3182,10 +3162,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "byteProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -3362,7 +3339,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -3428,10 +3404,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_object_type_bindings_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_object_type_bindings_interface.cc
index 23efb2f..cf4f96a 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_object_type_bindings_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_object_type_bindings_interface.cc
@@ -155,9 +155,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -563,9 +562,7 @@
 }
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "arbitraryObject",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -598,7 +595,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -664,10 +660,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_operations_test_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_operations_test_interface.cc
index f6340c9..08ac798 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_operations_test_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_operations_test_interface.cc
@@ -147,9 +147,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -259,7 +258,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_objectFunctionNoArgs(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -312,7 +310,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_optionalArgumentWithDefault(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -360,11 +357,13 @@
   if (args.length() > 0) {
     JS::RootedValue optional_value0(
         context, args[0]);
-    FromJSValue(context,
-                optional_value0,
-                (kConversionFlagRestricted),
-                &exception_state,
-                &arg1);
+    if (!optional_value0.isUndefined()) {
+      FromJSValue(context,
+                  optional_value0,
+                  (kConversionFlagRestricted),
+                  &exception_state,
+                  &arg1);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -375,7 +374,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_optionalArguments(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -441,11 +439,13 @@
   if (args.length() > 1) {
     JS::RootedValue optional_value0(
         context, args[1]);
-    FromJSValue(context,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &arg2);
+    {
+      FromJSValue(context,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &arg2);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -454,11 +454,13 @@
   if (args.length() > 2) {
     JS::RootedValue optional_value1(
         context, args[2]);
-    FromJSValue(context,
-                optional_value1,
-                kNoConversionFlags,
-                &exception_state,
-                &arg3);
+    {
+      FromJSValue(context,
+                  optional_value1,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &arg3);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -492,7 +494,6 @@
   }
 }
 
-
 bool fcn_optionalNullableArgumentsWithDefaults(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -542,11 +543,13 @@
   if (args.length() > 0) {
     JS::RootedValue optional_value0(
         context, args[0]);
-    FromJSValue(context,
-                optional_value0,
-                (kConversionFlagNullable),
-                &exception_state,
-                &arg1);
+    if (!optional_value0.isUndefined()) {
+      FromJSValue(context,
+                  optional_value0,
+                  (kConversionFlagNullable),
+                  &exception_state,
+                  &arg1);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -554,11 +557,13 @@
   if (args.length() > 1) {
     JS::RootedValue optional_value1(
         context, args[1]);
-    FromJSValue(context,
-                optional_value1,
-                (kConversionFlagNullable),
-                &exception_state,
-                &arg2);
+    if (!optional_value1.isUndefined()) {
+      FromJSValue(context,
+                  optional_value1,
+                  (kConversionFlagNullable),
+                  &exception_state,
+                  &arg2);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -568,7 +573,6 @@
   result_value.set(JS::UndefinedHandleValue);
   return !exception_state.is_exception_set();
 }
-
 bool fcn_overloadedFunction1(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -984,7 +988,6 @@
   exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
   return false;
 }
-
 bool fcn_overloadedNullable1(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1146,7 +1149,6 @@
   return false;
 }
 
-
 bool fcn_stringFunctionNoArgs(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1199,7 +1201,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_variadicPrimitiveArguments(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1266,7 +1267,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_variadicStringArgumentsAfterOptionalArgument(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1315,11 +1315,13 @@
   if (args.length() > 0) {
     JS::RootedValue optional_value0(
         context, args[0]);
-    FromJSValue(context,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &optionalArg);
+    {
+      FromJSValue(context,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &optionalArg);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -1371,7 +1373,6 @@
   }
 }
 
-
 bool fcn_voidFunctionLongArg(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1436,7 +1437,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_voidFunctionNoArgs(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1483,7 +1483,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_voidFunctionObjectArg(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1548,7 +1547,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_voidFunctionStringArg(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1612,7 +1610,6 @@
   result_value.set(JS::UndefinedHandleValue);
   return !exception_state.is_exception_set();
 }
-
 bool staticfcn_overloadedFunction1(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1715,10 +1712,7 @@
   return false;
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -1769,7 +1763,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -1838,10 +1831,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_promise_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_promise_interface.cc
index f82e2fd..86b4e6e 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_promise_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_promise_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -249,7 +248,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_returnBooleanPromise(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -302,7 +300,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_returnInterfacePromise(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -355,7 +352,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_returnStringPromise(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -408,7 +404,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_returnVoidPromise(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -461,10 +456,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -488,7 +480,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -554,10 +545,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_put_forwards_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_put_forwards_interface.cc
index dff63a2..43f3409 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_put_forwards_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_put_forwards_interface.cc
@@ -147,9 +147,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -382,9 +381,7 @@
 }
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "forwardingAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -399,7 +396,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   {  // Static read/write attribute.
     "staticForwardingAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -471,10 +467,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_sequence_user.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_sequence_user.cc
index 3a35cfd..ac54ebb 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_sequence_user.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_sequence_user.cc
@@ -142,9 +142,8 @@
 
 bool Constructor(JSContext* context, unsigned int argc, JS::Value* vp);
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -254,7 +253,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_getInterfaceSequenceSequenceSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -307,7 +305,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_getLongSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -360,7 +357,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_getStringSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -413,7 +409,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_getStringSequenceSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -466,7 +461,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_getUnionOfStringAndStringSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -519,7 +513,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_getUnionSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -572,7 +565,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setInterfaceSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -637,7 +629,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setInterfaceSequenceSequenceSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -702,7 +693,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setLongSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -767,7 +757,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setStringSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -832,7 +821,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setStringSequenceSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -897,7 +885,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setUnionOfStringAndStringSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -962,7 +949,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setUnionSequence(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -1027,10 +1013,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -1081,7 +1064,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -1156,10 +1138,11 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_static_properties_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_static_properties_interface.cc
index 5e684bf..475f184 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_static_properties_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_static_properties_interface.cc
@@ -147,9 +147,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -505,10 +504,7 @@
   return false;
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -517,7 +513,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   {  // Static read/write attribute.
     "staticAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -592,10 +587,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_anonymous_operation_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_anonymous_operation_interface.cc
index 173a856..4a01004 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_anonymous_operation_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_anonymous_operation_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -264,7 +263,6 @@
 }
 
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -274,7 +272,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -340,10 +337,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_attribute_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_attribute_interface.cc
index 5aa0204..b381538 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_attribute_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_attribute_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -364,7 +363,6 @@
 }
 
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "theStringifierAttribute",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -380,7 +378,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -446,10 +443,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_operation_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_operation_interface.cc
index a023c7c..23d64c2 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_operation_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_stringifier_operation_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -255,7 +254,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool Stringifier(JSContext* context, unsigned argc, JS::Value *vp) {
   MozjsExceptionState exception_state(context);
   // Compute the 'this' value.
@@ -317,7 +315,6 @@
 }
 
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -330,7 +327,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -396,10 +392,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_target_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_target_interface.cc
index 3aaea2c..1bbecb3 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_target_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_target_interface.cc
@@ -143,9 +143,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -249,7 +248,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_partialInterfaceFunction(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -296,10 +294,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   JS_PS_END
 };
 
@@ -314,7 +309,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -380,10 +374,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_union_types_interface.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_union_types_interface.cc
index dc8e9dc..ba3e4fc 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_union_types_interface.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_union_types_interface.cc
@@ -151,9 +151,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -611,9 +610,7 @@
 }
 
 
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "unionProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -646,7 +643,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -712,10 +708,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_window.cc b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_window.cc
index 2a97c33..5248d37 100644
--- a/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_window.cc
+++ b/src/cobalt/bindings/generated/mozjs45/testing/cobalt/bindings/testing/mozjs_window.cc
@@ -360,9 +360,8 @@
   return false;
 }
 
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -722,7 +721,6 @@
   return !exception_state.is_exception_set();
 }
 
-
 bool fcn_setTimeout(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -787,11 +785,13 @@
   if (args.length() > 1) {
     JS::RootedValue optional_value0(
         context, args[1]);
-    FromJSValue(context,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &timeout);
+    {
+      FromJSValue(context,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &timeout);
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
@@ -830,7 +830,6 @@
   }
 }
 
-
 bool fcn_windowOperation(
     JSContext* context, uint32_t argc, JS::Value *vp) {
   JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
@@ -877,10 +876,7 @@
   return !exception_state.is_exception_set();
 }
 
-
-
 const JSPropertySpec prototype_properties[] = {
-
   {  // Read/Write property
     "windowProperty",
     JSPROP_SHARED | JSPROP_ENUMERATE,
@@ -916,7 +912,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-
   JS_PS_END
 };
 
@@ -987,10 +982,11 @@
       NULL, NULL);
   DCHECK(success);
 
-  // Define interface object properties (including constants).
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc
index ea635f3..7a34bae 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -105,14 +106,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousIndexedGetterInterface>().get();
   if (index >= impl->length()) {
     // |index| is out of bounds, so return undefined.
     return;
@@ -122,7 +121,7 @@
     ToJSValue(isolate,
               impl->AnonymousIndexedGetter(index),
               &result_value);
-  }
+}
   info.GetReturnValue().Set(result_value);
 }
 
@@ -137,14 +136,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousIndexedGetterInterface>().get();
   const uint32_t length = impl->length();
   v8::Local<v8::Array> array = v8::Array::New(isolate, length);
   for (uint32_t i = 0; i < length; ++i) {
@@ -171,14 +168,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousIndexedGetterInterface>().get();
   if (index >= impl->length()) {
     return;
   }
@@ -190,7 +185,7 @@
   }
 
   impl->AnonymousIndexedSetter(index, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -209,40 +204,20 @@
 
 void lengthAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cAnonymousIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  AnonymousIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousIndexedGetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<AnonymousIndexedGetterInterface,
+                                                    V8cAnonymousIndexedGetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, AnonymousIndexedGetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->length(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -302,38 +277,23 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "length");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, lengthAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "length"
+                  ,lengthAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc
index 19f942c..4f2c6cc 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -102,14 +103,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   if (!impl->CanQueryNamedProperty(property_name)) {
     return;
@@ -119,7 +118,7 @@
     ToJSValue(isolate,
               impl->AnonymousNamedGetter(property_name),
               &result_value);
-  }
+}
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -138,14 +137,12 @@
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   bool result = impl->CanQueryNamedProperty(property_name);
   if (!result) {
@@ -174,14 +171,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedGetterInterface>().get();
   v8::Local<v8::Array> array = v8::Array::New(isolate);
   V8cPropertyEnumerator property_enumerator(isolate, &array);
   impl->EnumerateNamedProperties(&property_enumerator);
@@ -198,14 +193,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   TypeTraits<std::string>::ConversionType native_value;
   FromJSValue(isolate, value, kNoConversionFlags,
@@ -215,7 +208,7 @@
   }
 
   impl->AnonymousNamedSetter(property_name, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc
index afaafa4..27aaca4 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -102,14 +103,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   if (!impl->CanQueryNamedProperty(property_name)) {
     return;
@@ -119,7 +118,7 @@
     ToJSValue(isolate,
               impl->AnonymousNamedGetter(property_name),
               &result_value);
-  }
+}
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -132,14 +131,12 @@
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   bool result = impl->CanQueryNamedProperty(property_name);
   if (!result) {
@@ -162,14 +159,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   v8::Local<v8::Array> array = v8::Array::New(isolate);
   V8cPropertyEnumerator property_enumerator(isolate, &array);
   impl->EnumerateNamedProperties(&property_enumerator);
@@ -186,14 +181,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   TypeTraits<std::string>::ConversionType native_value;
   FromJSValue(isolate, value, kNoConversionFlags,
@@ -203,7 +196,7 @@
   }
 
   impl->AnonymousNamedSetter(property_name, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -222,14 +215,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   if (index >= impl->length()) {
     // |index| is out of bounds, so return undefined.
     return;
@@ -239,7 +230,7 @@
     ToJSValue(isolate,
               impl->AnonymousIndexedGetter(index),
               &result_value);
-  }
+}
   info.GetReturnValue().Set(result_value);
 }
 
@@ -254,14 +245,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   const uint32_t length = impl->length();
   v8::Local<v8::Array> array = v8::Array::New(isolate, length);
   for (uint32_t i = 0; i < length; ++i) {
@@ -288,14 +277,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  AnonymousNamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             AnonymousNamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
   if (index >= impl->length()) {
     return;
   }
@@ -307,7 +294,7 @@
   }
 
   impl->AnonymousIndexedSetter(index, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -326,40 +313,20 @@
 
 void lengthAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cAnonymousNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  AnonymousNamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<AnonymousNamedIndexedGetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<AnonymousNamedIndexedGetterInterface,
+                                                    V8cAnonymousNamedIndexedGetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, AnonymousNamedIndexedGetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->length(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -419,38 +386,23 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "length");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, lengthAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "length"
+                  ,lengthAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc
index 47f8230..e5ea426 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -121,67 +122,31 @@
 
 void arbitraryPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cArbitraryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ArbitraryInterface* impl =
-      wrapper_private->wrappable<ArbitraryInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ArbitraryInterface,
+                                                    V8cArbitraryInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ArbitraryInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->arbitrary_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void arbitraryPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cArbitraryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ArbitraryInterface* impl =
-      wrapper_private->wrappable<ArbitraryInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ArbitraryInterface, V8cArbitraryInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ArbitraryInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -190,8 +155,9 @@
   }
 
   impl->set_arbitrary_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -199,28 +165,21 @@
 void arbitraryFunctionMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cArbitraryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cArbitraryInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ArbitraryInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ArbitraryInterface>(object);
+  if (!impl) {
     return;
   }
-  ArbitraryInterface* impl =
-      wrapper_private->wrappable<ArbitraryInterface>().get();
 
   impl->ArbitraryFunction();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -281,39 +240,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "arbitraryProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, arbitraryPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, arbitraryPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "arbitraryProperty"
+                  ,arbitraryPropertyAttributeGetter
+                  ,arbitraryPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc
index 74adfb7..9afee57 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -121,40 +122,20 @@
 
 void baseAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cBaseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  BaseInterface* impl =
-      wrapper_private->wrappable<BaseInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<BaseInterface,
+                                                    V8cBaseInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, BaseInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->base_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -163,28 +144,21 @@
 void baseOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cBaseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cBaseInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  BaseInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             BaseInterface>(object);
+  if (!impl) {
     return;
   }
-  BaseInterface* impl =
-      wrapper_private->wrappable<BaseInterface>().get();
 
   impl->BaseOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -245,38 +219,23 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "baseAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, baseAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "baseAttribute"
+                  ,baseAttributeAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc
index 827670c..33a9f16 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,67 +111,31 @@
 
 void booleanPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cBooleanTypeTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  BooleanTypeTestInterface* impl =
-      wrapper_private->wrappable<BooleanTypeTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<BooleanTypeTestInterface,
+                                                    V8cBooleanTypeTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, BooleanTypeTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->boolean_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void booleanPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cBooleanTypeTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  BooleanTypeTestInterface* impl =
-      wrapper_private->wrappable<BooleanTypeTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<BooleanTypeTestInterface, V8cBooleanTypeTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, BooleanTypeTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<bool >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -179,8 +144,9 @@
   }
 
   impl->set_boolean_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -188,25 +154,18 @@
 void booleanArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cBooleanTypeTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cBooleanTypeTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  BooleanTypeTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             BooleanTypeTestInterface>(object);
+  if (!impl) {
     return;
   }
-  BooleanTypeTestInterface* impl =
-      wrapper_private->wrappable<BooleanTypeTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -225,7 +184,7 @@
   }
 
   impl->BooleanArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -234,31 +193,24 @@
 void booleanReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cBooleanTypeTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cBooleanTypeTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  BooleanTypeTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             BooleanTypeTestInterface>(object);
+  if (!impl) {
     return;
   }
-  BooleanTypeTestInterface* impl =
-      wrapper_private->wrappable<BooleanTypeTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->BooleanReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -321,39 +273,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "booleanProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, booleanPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, booleanPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "booleanProperty"
+                  ,booleanPropertyAttributeGetter
+                  ,booleanPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc
index d3c8f0d..2ca0c2e 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -114,67 +115,31 @@
 
 void callbackAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<CallbackFunctionInterface,
+                                                    V8cCallbackFunctionInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, CallbackFunctionInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->callback_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void callbackAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<CallbackFunctionInterface, V8cCallbackFunctionInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, CallbackFunctionInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<CallbackFunctionInterface::VoidFunction >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -183,74 +148,39 @@
   }
 
   impl->set_callback_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableCallbackAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<CallbackFunctionInterface,
+                                                    V8cCallbackFunctionInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, CallbackFunctionInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_callback_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableCallbackAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<CallbackFunctionInterface, V8cCallbackFunctionInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, CallbackFunctionInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<CallbackFunctionInterface::VoidFunction >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -259,8 +189,9 @@
   }
 
   impl->set_nullable_callback_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -268,25 +199,18 @@
 void takesFunctionThatReturnsStringMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackFunctionInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackFunctionInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackFunctionInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -305,7 +229,7 @@
   }
 
   impl->TakesFunctionThatReturnsString(cb);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -314,25 +238,18 @@
 void takesFunctionWithNullableParametersMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackFunctionInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackFunctionInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackFunctionInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -351,7 +268,7 @@
   }
 
   impl->TakesFunctionWithNullableParameters(cb);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -360,25 +277,18 @@
 void takesFunctionWithOneParameterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackFunctionInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackFunctionInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackFunctionInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -397,7 +307,7 @@
   }
 
   impl->TakesFunctionWithOneParameter(cb);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -406,25 +316,18 @@
 void takesFunctionWithSeveralParametersMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackFunctionInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackFunctionInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackFunctionInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -443,7 +346,7 @@
   }
 
   impl->TakesFunctionWithSeveralParameters(cb);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -452,25 +355,18 @@
 void takesVoidFunctionMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackFunctionInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackFunctionInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackFunctionInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackFunctionInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackFunctionInterface* impl =
-      wrapper_private->wrappable<CallbackFunctionInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -489,7 +385,7 @@
   }
 
   impl->TakesVoidFunction(cb);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -549,75 +445,45 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "callbackAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, callbackAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, callbackAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "callbackAttribute"
+                  ,callbackAttributeAttributeGetter
+                  ,callbackAttributeAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableCallbackAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableCallbackAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableCallbackAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableCallbackAttribute"
+                  ,nullableCallbackAttributeAttributeGetter
+                  ,nullableCallbackAttributeAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc
index 1cd9aeb..068f1cb 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -114,67 +115,31 @@
 
 void callbackAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackInterfaceInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  CallbackInterfaceInterface* impl =
-      wrapper_private->wrappable<CallbackInterfaceInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<CallbackInterfaceInterface,
+                                                    V8cCallbackInterfaceInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, CallbackInterfaceInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->callback_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void callbackAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackInterfaceInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  CallbackInterfaceInterface* impl =
-      wrapper_private->wrappable<CallbackInterfaceInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<CallbackInterfaceInterface, V8cCallbackInterfaceInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, CallbackInterfaceInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<::cobalt::script::CallbackInterfaceTraits<SingleOperationInterface > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -183,8 +148,9 @@
   }
 
   impl->set_callback_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -192,25 +158,18 @@
 void registerCallbackMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackInterfaceInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackInterfaceInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackInterfaceInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackInterfaceInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackInterfaceInterface* impl =
-      wrapper_private->wrappable<CallbackInterfaceInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -229,7 +188,7 @@
   }
 
   impl->RegisterCallback(callbackInterface);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -238,28 +197,21 @@
 void someOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cCallbackInterfaceInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cCallbackInterfaceInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  CallbackInterfaceInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             CallbackInterfaceInterface>(object);
+  if (!impl) {
     return;
   }
-  CallbackInterfaceInterface* impl =
-      wrapper_private->wrappable<CallbackInterfaceInterface>().get();
 
   impl->SomeOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -319,39 +271,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "callbackAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, callbackAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, callbackAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "callbackAttribute"
+                  ,callbackAttributeAttributeGetter
+                  ,callbackAttributeAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc
index 2ebfed4..3a9752d 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc
@@ -53,6 +53,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -114,67 +115,31 @@
 
 void enabledAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConditionalInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConditionalInterface* impl =
-      wrapper_private->wrappable<ConditionalInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ConditionalInterface,
+                                                    V8cConditionalInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConditionalInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->enabled_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void enabledAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConditionalInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConditionalInterface* impl =
-      wrapper_private->wrappable<ConditionalInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ConditionalInterface, V8cConditionalInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConditionalInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -183,8 +148,9 @@
   }
 
   impl->set_enabled_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 #endif  // ENABLE_CONDITIONAL_PROPERTY
@@ -192,67 +158,31 @@
 
 void disabledAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConditionalInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConditionalInterface* impl =
-      wrapper_private->wrappable<ConditionalInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ConditionalInterface,
+                                                    V8cConditionalInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConditionalInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->disabled_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void disabledAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConditionalInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConditionalInterface* impl =
-      wrapper_private->wrappable<ConditionalInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ConditionalInterface, V8cConditionalInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConditionalInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -261,8 +191,9 @@
   }
 
   impl->set_disabled_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 #endif  // NO_ENABLE_CONDITIONAL_PROPERTY
@@ -272,28 +203,21 @@
 void disabledOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConditionalInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cConditionalInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ConditionalInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ConditionalInterface>(object);
+  if (!impl) {
     return;
   }
-  ConditionalInterface* impl =
-      wrapper_private->wrappable<ConditionalInterface>().get();
 
   impl->DisabledOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -304,28 +228,21 @@
 void enabledOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConditionalInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cConditionalInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ConditionalInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ConditionalInterface>(object);
+  if (!impl) {
     return;
   }
-  ConditionalInterface* impl =
-      wrapper_private->wrappable<ConditionalInterface>().get();
 
   impl->EnabledOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -387,77 +304,47 @@
   // follows:
 #if defined(ENABLE_CONDITIONAL_PROPERTY)
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "enabledAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, enabledAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, enabledAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "enabledAttribute"
+                  ,enabledAttributeAttributeGetter
+                  ,enabledAttributeAttributeSetter
+                  );
 
   }
 #endif  // ENABLE_CONDITIONAL_PROPERTY
 #if defined(NO_ENABLE_CONDITIONAL_PROPERTY)
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "disabledAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, disabledAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, disabledAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "disabledAttribute"
+                  ,disabledAttributeAttributeGetter
+                  ,disabledAttributeAttributeSetter
+                  );
 
   }
 #endif  // NO_ENABLE_CONDITIONAL_PROPERTY
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc
index 2287821..a8a9b3f 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc
index 463ab84..4ec70f5 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc
index 330ec14..0505e2f 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -136,11 +137,13 @@
   size_t num_set_arguments = 3;
   if (info.Length() > 2) {
     v8::Local<v8::Value> optional_value0 = info[2];
-    FromJSValue(isolate,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &defaultArg);
+    if (!optional_value0->IsUndefined()) {
+      FromJSValue(isolate,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &defaultArg);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
@@ -162,120 +165,60 @@
 
 void longArgAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConstructorWithArgumentsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConstructorWithArgumentsInterface* impl =
-      wrapper_private->wrappable<ConstructorWithArgumentsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ConstructorWithArgumentsInterface,
+                                                    V8cConstructorWithArgumentsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConstructorWithArgumentsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->long_arg(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void booleanArgAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConstructorWithArgumentsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConstructorWithArgumentsInterface* impl =
-      wrapper_private->wrappable<ConstructorWithArgumentsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ConstructorWithArgumentsInterface,
+                                                    V8cConstructorWithArgumentsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConstructorWithArgumentsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->boolean_arg(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void stringArgAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConstructorWithArgumentsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ConstructorWithArgumentsInterface* impl =
-      wrapper_private->wrappable<ConstructorWithArgumentsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ConstructorWithArgumentsInterface,
+                                                    V8cConstructorWithArgumentsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ConstructorWithArgumentsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->string_arg(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -336,108 +279,63 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "longArg");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, longArgAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "longArg"
+                  ,longArgAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "booleanArg");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, booleanArgAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "booleanArg"
+                  ,booleanArgAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "stringArg");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, stringArgAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "stringArg"
+                  ,stringArgAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc
index f62c57c..58007b9 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -123,25 +124,18 @@
 void convertSimpleObjectToMapTestMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cConvertSimpleObjectInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cConvertSimpleObjectInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ConvertSimpleObjectInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ConvertSimpleObjectInterface>(object);
+  if (!impl) {
     return;
   }
-  ConvertSimpleObjectInterface* impl =
-      wrapper_private->wrappable<ConvertSimpleObjectInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -160,7 +154,7 @@
   }
 
   impl->ConvertSimpleObjectToMapTest(value, &exception_state);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc
index 865b1a7..53fe18e 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -106,14 +107,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   if (!impl->CanQueryNamedProperty(property_name)) {
     return;
@@ -123,7 +122,7 @@
     ToJSValue(isolate,
               impl->AnonymousNamedGetter(property_name),
               &result_value);
-  }
+}
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -136,14 +135,12 @@
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   bool result = impl->CanQueryNamedProperty(property_name);
   if (!result) {
@@ -166,14 +163,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   v8::Local<v8::Array> array = v8::Array::New(isolate);
   V8cPropertyEnumerator property_enumerator(isolate, &array);
   impl->EnumerateNamedProperties(&property_enumerator);
@@ -190,14 +185,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   TypeTraits<std::string>::ConversionType native_value;
   FromJSValue(isolate, value, kNoConversionFlags,
@@ -207,7 +200,7 @@
   }
 
   impl->AnonymousNamedSetter(property_name, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -226,14 +219,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   if (index >= impl->length()) {
     // |index| is out of bounds, so return undefined.
     return;
@@ -243,7 +234,7 @@
     ToJSValue(isolate,
               impl->DerivedIndexedGetter(index),
               &result_value);
-  }
+}
   info.GetReturnValue().Set(result_value);
 }
 
@@ -258,14 +249,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   const uint32_t length = impl->length();
   v8::Local<v8::Array> array = v8::Array::New(isolate, length);
   for (uint32_t i = 0; i < length; ++i) {
@@ -292,14 +281,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   if (index >= impl->length()) {
     return;
   }
@@ -311,7 +298,7 @@
   }
 
   impl->DerivedIndexedSetter(index, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -330,107 +317,51 @@
 
 void lengthAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedGetterSetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DerivedGetterSetterInterface,
+                                                    V8cDerivedGetterSetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DerivedGetterSetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->length(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void propertyOnDerivedClassAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedGetterSetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DerivedGetterSetterInterface,
+                                                    V8cDerivedGetterSetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DerivedGetterSetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->property_on_derived_class(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void propertyOnDerivedClassAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedGetterSetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DerivedGetterSetterInterface, V8cDerivedGetterSetterInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DerivedGetterSetterInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<bool >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -439,8 +370,9 @@
   }
 
   impl->set_property_on_derived_class(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -448,25 +380,18 @@
 void derivedIndexedGetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedGetterSetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDerivedGetterSetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -488,7 +413,7 @@
     ToJSValue(isolate,
               impl->DerivedIndexedGetter(index),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -500,25 +425,18 @@
 void derivedIndexedSetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedGetterSetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDerivedGetterSetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
   const size_t kMinArguments = 2;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -547,7 +465,7 @@
   }
 
   impl->DerivedIndexedSetter(index, value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -556,28 +474,21 @@
 void operationOnDerivedClassMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedGetterSetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDerivedGetterSetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedGetterSetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedGetterSetterInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedGetterSetterInterface* impl =
-      wrapper_private->wrappable<DerivedGetterSetterInterface>().get();
 
   impl->OperationOnDerivedClass();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -652,74 +563,44 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "length");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, lengthAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "length"
+                  ,lengthAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "propertyOnDerivedClass");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, propertyOnDerivedClassAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, propertyOnDerivedClassAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "propertyOnDerivedClass"
+                  ,propertyOnDerivedClassAttributeGetter
+                  ,propertyOnDerivedClassAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc
index 1e1f37b..a38b1ba 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -125,40 +126,20 @@
 
 void derivedAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DerivedInterface* impl =
-      wrapper_private->wrappable<DerivedInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DerivedInterface,
+                                                    V8cDerivedInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DerivedInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->derived_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -167,28 +148,21 @@
 void derivedOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDerivedInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDerivedInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DerivedInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DerivedInterface>(object);
+  if (!impl) {
     return;
   }
-  DerivedInterface* impl =
-      wrapper_private->wrappable<DerivedInterface>().get();
 
   impl->DerivedOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -264,38 +238,23 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "derivedAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, derivedAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "derivedAttribute"
+                  ,derivedAttributeAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc
index 6e389bd..4a9a740 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc
@@ -53,6 +53,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -116,67 +117,31 @@
 
 void dictionarySequenceAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDictionaryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DictionaryInterface* impl =
-      wrapper_private->wrappable<DictionaryInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DictionaryInterface,
+                                                    V8cDictionaryInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DictionaryInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->dictionary_sequence(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void dictionarySequenceAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDictionaryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DictionaryInterface* impl =
-      wrapper_private->wrappable<DictionaryInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DictionaryInterface, V8cDictionaryInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DictionaryInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<::cobalt::script::Sequence< TestDictionary > >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -185,8 +150,9 @@
   }
 
   impl->set_dictionary_sequence(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -194,25 +160,18 @@
 void derivedDictionaryOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDictionaryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDictionaryInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DictionaryInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DictionaryInterface>(object);
+  if (!impl) {
     return;
   }
-  DictionaryInterface* impl =
-      wrapper_private->wrappable<DictionaryInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -231,7 +190,7 @@
   }
 
   impl->DerivedDictionaryOperation(dictionary);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -240,25 +199,18 @@
 void dictionaryOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDictionaryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDictionaryInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DictionaryInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DictionaryInterface>(object);
+  if (!impl) {
     return;
   }
-  DictionaryInterface* impl =
-      wrapper_private->wrappable<DictionaryInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -277,7 +229,7 @@
   }
 
   impl->DictionaryOperation(dictionary);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -286,25 +238,18 @@
 void testOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDictionaryInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDictionaryInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DictionaryInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DictionaryInterface>(object);
+  if (!impl) {
     return;
   }
-  DictionaryInterface* impl =
-      wrapper_private->wrappable<DictionaryInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -323,7 +268,7 @@
   }
 
   impl->TestOperation(dict);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -383,39 +328,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "dictionarySequence");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, dictionarySequenceAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, dictionarySequenceAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "dictionarySequence"
+                  ,dictionarySequenceAttributeGetter
+                  ,dictionarySequenceAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc
index cb69572..2d4bffe 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc
@@ -53,6 +53,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -113,67 +114,31 @@
 
 void disabledPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDisabledInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DisabledInterface* impl =
-      wrapper_private->wrappable<DisabledInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DisabledInterface,
+                                                    V8cDisabledInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DisabledInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->disabled_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void disabledPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDisabledInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DisabledInterface* impl =
-      wrapper_private->wrappable<DisabledInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DisabledInterface, V8cDisabledInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DisabledInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -182,8 +147,9 @@
   }
 
   impl->set_disabled_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -191,28 +157,21 @@
 void disabledFunctionMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDisabledInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cDisabledInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  DisabledInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             DisabledInterface>(object);
+  if (!impl) {
     return;
   }
-  DisabledInterface* impl =
-      wrapper_private->wrappable<DisabledInterface>().get();
 
   impl->DisabledFunction();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -272,39 +231,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "disabledProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, disabledPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, disabledPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "disabledProperty"
+                  ,disabledPropertyAttributeGetter
+                  ,disabledPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc
index 624ea31..856fa69 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,67 +111,31 @@
 
 void propertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DOMStringTestInterface,
+                                                    V8cDOMStringTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void propertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DOMStringTestInterface, V8cDOMStringTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -179,154 +144,79 @@
   }
 
   impl->set_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void readOnlyPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DOMStringTestInterface,
+                                                    V8cDOMStringTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->read_only_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void readOnlyTokenPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DOMStringTestInterface,
+                                                    V8cDOMStringTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->read_only_token_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void nullIsEmptyPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DOMStringTestInterface,
+                                                    V8cDOMStringTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->null_is_empty_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullIsEmptyPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DOMStringTestInterface, V8cDOMStringTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagTreatNullAsEmptyString), &exception_state,
               &value);
@@ -335,74 +225,39 @@
   }
 
   impl->set_null_is_empty_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void undefinedIsEmptyPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DOMStringTestInterface,
+                                                    V8cDOMStringTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->undefined_is_empty_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void undefinedIsEmptyPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DOMStringTestInterface, V8cDOMStringTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagTreatUndefinedAsEmptyString), &exception_state,
               &value);
@@ -411,74 +266,39 @@
   }
 
   impl->set_undefined_is_empty_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableUndefinedIsEmptyPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<DOMStringTestInterface,
+                                                    V8cDOMStringTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_undefined_is_empty_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableUndefinedIsEmptyPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cDOMStringTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  DOMStringTestInterface* impl =
-      wrapper_private->wrappable<DOMStringTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<DOMStringTestInterface, V8cDOMStringTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, DOMStringTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<std::string > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable | kConversionFlagTreatUndefinedAsEmptyString), &exception_state,
               &value);
@@ -487,8 +307,9 @@
   }
 
   impl->set_nullable_undefined_is_empty_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -547,217 +368,127 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "property");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, propertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, propertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "property"
+                  ,propertyAttributeGetter
+                  ,propertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "readOnlyProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, readOnlyPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "readOnlyProperty"
+                  ,readOnlyPropertyAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "readOnlyTokenProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, readOnlyTokenPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "readOnlyTokenProperty"
+                  ,readOnlyTokenPropertyAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullIsEmptyProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullIsEmptyPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullIsEmptyPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullIsEmptyProperty"
+                  ,nullIsEmptyPropertyAttributeGetter
+                  ,nullIsEmptyPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "undefinedIsEmptyProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, undefinedIsEmptyPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, undefinedIsEmptyPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "undefinedIsEmptyProperty"
+                  ,undefinedIsEmptyPropertyAttributeGetter
+                  ,undefinedIsEmptyPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableUndefinedIsEmptyProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableUndefinedIsEmptyPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableUndefinedIsEmptyPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableUndefinedIsEmptyProperty"
+                  ,nullableUndefinedIsEmptyPropertyAttributeGetter
+                  ,nullableUndefinedIsEmptyPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc
index 85ddfc5..c2e8669 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc
@@ -51,6 +51,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -123,67 +124,31 @@
 
 void enumPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cEnumerationInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  EnumerationInterface* impl =
-      wrapper_private->wrappable<EnumerationInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<EnumerationInterface,
+                                                    V8cEnumerationInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, EnumerationInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->enum_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void enumPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cEnumerationInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  EnumerationInterface* impl =
-      wrapper_private->wrappable<EnumerationInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<EnumerationInterface, V8cEnumerationInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, EnumerationInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<TestEnum >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -192,8 +157,9 @@
   }
 
   impl->set_enum_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -201,43 +167,38 @@
 void optionalEnumWithDefaultMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cEnumerationInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cEnumerationInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  EnumerationInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             EnumerationInterface>(object);
+  if (!impl) {
     return;
   }
-  EnumerationInterface* impl =
-      wrapper_private->wrappable<EnumerationInterface>().get();
   // Optional arguments with default values
   TypeTraits<TestEnum >::ConversionType value =
       kTestEnumBeta;
   size_t num_set_arguments = 1;
   if (info.Length() > 0) {
     v8::Local<v8::Value> optional_value0 = info[0];
-    FromJSValue(isolate,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &value);
+    if (!optional_value0->IsUndefined()) {
+      FromJSValue(isolate,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &value);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
   }
 
   impl->OptionalEnumWithDefault(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -298,39 +259,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "enumProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, enumPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, enumPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "enumProperty"
+                  ,enumPropertyAttributeGetter
+                  ,enumPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc
index 2a19a04..996888b 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,80 +111,40 @@
 
 void errorAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExceptionObjectInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ExceptionObjectInterface* impl =
-      wrapper_private->wrappable<ExceptionObjectInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ExceptionObjectInterface,
+                                                    V8cExceptionObjectInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ExceptionObjectInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->error(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void messageAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExceptionObjectInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ExceptionObjectInterface* impl =
-      wrapper_private->wrappable<ExceptionObjectInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ExceptionObjectInterface,
+                                                    V8cExceptionObjectInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ExceptionObjectInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->message(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -233,12 +194,7 @@
     // A spicy hack from Chromium in order to achieve
     // https://heycam.github.io/webidl/#es-DOMException-specialness
     // See https://cs.chromium.org/chromium/src/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl?l=630&rcl=0f7c2c752bb24ad08c17017e4e68401093fe76a0
-    v8::Local<v8::FunctionTemplate> intrinsic_error_prototype_interface_template =
-        v8::FunctionTemplate::New(isolate);
-    intrinsic_error_prototype_interface_template->RemovePrototype();
-    intrinsic_error_prototype_interface_template->SetIntrinsicDataProperty(
-        NewInternalString(isolate, "prototype"), v8::kErrorPrototype);
-    function_template->Inherit(intrinsic_error_prototype_interface_template);
+    script::v8c::shared_bindings::set_intrinsic_error_prototype_interface_template(isolate, function_template);
   }
 
   // https://heycam.github.io/webidl/#es-constants
@@ -254,73 +210,43 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "error");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, errorAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "error"
+                  ,errorAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "message");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, messageAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "message"
+                  ,messageAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc
index 9da312f..889822e 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -125,67 +126,31 @@
 
 void attributeThrowsExceptionAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExceptionsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ExceptionsInterface* impl =
-      wrapper_private->wrappable<ExceptionsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ExceptionsInterface,
+                                                    V8cExceptionsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ExceptionsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->attribute_throws_exception(&exception_state),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void attributeThrowsExceptionAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExceptionsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ExceptionsInterface* impl =
-      wrapper_private->wrappable<ExceptionsInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ExceptionsInterface, V8cExceptionsInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ExceptionsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<bool >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -194,8 +159,9 @@
   }
 
   impl->set_attribute_throws_exception(value, &exception_state);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -203,28 +169,21 @@
 void functionThrowsExceptionMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExceptionsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cExceptionsInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ExceptionsInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ExceptionsInterface>(object);
+  if (!impl) {
     return;
   }
-  ExceptionsInterface* impl =
-      wrapper_private->wrappable<ExceptionsInterface>().get();
 
   impl->FunctionThrowsException(&exception_state);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -285,39 +244,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "attributeThrowsException");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, attributeThrowsExceptionAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, attributeThrowsExceptionAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "attributeThrowsException"
+                  ,attributeThrowsExceptionAttributeGetter
+                  ,attributeThrowsExceptionAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc
index ef85bf5..70762e2 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,67 +111,31 @@
 
 void defaultAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExtendedIDLAttributesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ExtendedIDLAttributesInterface* impl =
-      wrapper_private->wrappable<ExtendedIDLAttributesInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ExtendedIDLAttributesInterface,
+                                                    V8cExtendedIDLAttributesInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ExtendedIDLAttributesInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->attribute_default(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void defaultAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExtendedIDLAttributesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ExtendedIDLAttributesInterface* impl =
-      wrapper_private->wrappable<ExtendedIDLAttributesInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ExtendedIDLAttributesInterface, V8cExtendedIDLAttributesInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ExtendedIDLAttributesInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<bool >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -179,8 +144,9 @@
   }
 
   impl->set_attribute_default(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -188,29 +154,22 @@
 void callWithSettingsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExtendedIDLAttributesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cExtendedIDLAttributesInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ExtendedIDLAttributesInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ExtendedIDLAttributesInterface>(object);
+  if (!impl) {
     return;
   }
-  ExtendedIDLAttributesInterface* impl =
-      wrapper_private->wrappable<ExtendedIDLAttributesInterface>().get();
   V8cGlobalEnvironment* callwith_global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
 
   impl->CallWithSettings(callwith_global_environment->GetEnvironmentSettings());
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -219,25 +178,18 @@
 void clampArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cExtendedIDLAttributesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cExtendedIDLAttributesInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  ExtendedIDLAttributesInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             ExtendedIDLAttributesInterface>(object);
+  if (!impl) {
     return;
   }
-  ExtendedIDLAttributesInterface* impl =
-      wrapper_private->wrappable<ExtendedIDLAttributesInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -256,7 +208,7 @@
   }
 
   impl->ClampArgument(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -316,39 +268,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "default");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, defaultAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, defaultAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "default"
+                  ,defaultAttributeGetter
+                  ,defaultAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc
index 50cbe7c..2119709 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -125,67 +126,31 @@
 
 void previousAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cGarbageCollectionTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  GarbageCollectionTestInterface* impl =
-      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<GarbageCollectionTestInterface,
+                                                    V8cGarbageCollectionTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, GarbageCollectionTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->previous(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void previousAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cGarbageCollectionTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  GarbageCollectionTestInterface* impl =
-      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<GarbageCollectionTestInterface, V8cGarbageCollectionTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, GarbageCollectionTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<scoped_refptr<GarbageCollectionTestInterface> >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -194,74 +159,39 @@
   }
 
   impl->set_previous(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nextAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cGarbageCollectionTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  GarbageCollectionTestInterface* impl =
-      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<GarbageCollectionTestInterface,
+                                                    V8cGarbageCollectionTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, GarbageCollectionTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->next(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nextAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cGarbageCollectionTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  GarbageCollectionTestInterface* impl =
-      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<GarbageCollectionTestInterface, V8cGarbageCollectionTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, GarbageCollectionTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<scoped_refptr<GarbageCollectionTestInterface> >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -270,8 +200,9 @@
   }
 
   impl->set_next(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -331,75 +262,45 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "previous");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, previousAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, previousAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "previous"
+                  ,previousAttributeGetter
+                  ,previousAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "next");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nextAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nextAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "next"
+                  ,nextAttributeGetter
+                  ,nextAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc
index b07760f..2692728 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -112,28 +113,21 @@
 void parentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cGlobalInterfaceParent::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cGlobalInterfaceParent::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  GlobalInterfaceParent* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             GlobalInterfaceParent>(object);
+  if (!impl) {
     return;
   }
-  GlobalInterfaceParent* impl =
-      wrapper_private->wrappable<GlobalInterfaceParent>().get();
 
   impl->ParentOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc
index 5588dc1..960e6aa 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -105,14 +106,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   if (index >= impl->length()) {
     // |index| is out of bounds, so return undefined.
     return;
@@ -122,7 +121,7 @@
     ToJSValue(isolate,
               impl->IndexedGetter(index),
               &result_value);
-  }
+}
   info.GetReturnValue().Set(result_value);
 }
 
@@ -137,14 +136,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   const uint32_t length = impl->length();
   v8::Local<v8::Array> array = v8::Array::New(isolate, length);
   for (uint32_t i = 0; i < length; ++i) {
@@ -171,14 +168,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   if (index >= impl->length()) {
     return;
   }
@@ -190,7 +185,7 @@
   }
 
   impl->IndexedSetter(index, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -205,20 +200,18 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   if (index >= impl->length()) {
     return;
   }
 
   impl->IndexedDeleter(index);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -236,40 +229,20 @@
 
 void lengthAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<IndexedGetterInterface,
+                                                    V8cIndexedGetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, IndexedGetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->length(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -278,25 +251,18 @@
 void indexedDeleterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -315,7 +281,7 @@
   }
 
   impl->IndexedDeleter(index);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -324,25 +290,18 @@
 void indexedGetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -364,7 +323,7 @@
     ToJSValue(isolate,
               impl->IndexedGetter(index),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -376,25 +335,18 @@
 void indexedSetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  IndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             IndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  IndexedGetterInterface* impl =
-      wrapper_private->wrappable<IndexedGetterInterface>().get();
   const size_t kMinArguments = 2;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -423,7 +375,7 @@
   }
 
   impl->IndexedSetter(index, value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -483,38 +435,23 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "length");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, lengthAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "length"
+                  ,lengthAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc
index 19e7249..9815598 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -123,31 +124,24 @@
 void getAnyMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithAny::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithAny::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithAny* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithAny>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithAny* impl =
-      wrapper_private->wrappable<InterfaceWithAny>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetAny(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -159,25 +153,18 @@
 void setAnyMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithAny::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithAny::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithAny* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithAny>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithAny* impl =
-      wrapper_private->wrappable<InterfaceWithAny>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -196,7 +183,7 @@
   }
 
   impl->SetAny(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc
index 89200e8..caee69f 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -123,31 +124,24 @@
 void getAnyMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithAnyDictionary::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithAnyDictionary::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithAnyDictionary* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithAnyDictionary>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithAnyDictionary* impl =
-      wrapper_private->wrappable<InterfaceWithAnyDictionary>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetAny(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -159,31 +153,24 @@
 void hasAnyMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithAnyDictionary::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithAnyDictionary::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithAnyDictionary* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithAnyDictionary>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithAnyDictionary* impl =
-      wrapper_private->wrappable<InterfaceWithAnyDictionary>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->HasAny(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -195,31 +182,24 @@
 void hasAnyDefaultMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithAnyDictionary::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithAnyDictionary::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithAnyDictionary* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithAnyDictionary>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithAnyDictionary* impl =
-      wrapper_private->wrappable<InterfaceWithAnyDictionary>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->HasAnyDefault(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -231,25 +211,18 @@
 void setAnyMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithAnyDictionary::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithAnyDictionary::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithAnyDictionary* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithAnyDictionary>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithAnyDictionary* impl =
-      wrapper_private->wrappable<InterfaceWithAnyDictionary>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -268,7 +241,7 @@
   }
 
   impl->SetAny(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc
index 69c9991..2d0756e 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -123,31 +124,24 @@
 void getDateMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithDate::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithDate::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithDate* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithDate>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithDate* impl =
-      wrapper_private->wrappable<InterfaceWithDate>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetDate(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -159,25 +153,18 @@
 void setDateMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithDate::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cInterfaceWithDate::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  InterfaceWithDate* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             InterfaceWithDate>(object);
+  if (!impl) {
     return;
   }
-  InterfaceWithDate* impl =
-      wrapper_private->wrappable<InterfaceWithDate>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -196,7 +183,7 @@
   }
 
   impl->SetDate(date);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc
index 76f8964..6f2c401 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,40 +111,20 @@
 
 void supportedAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cInterfaceWithUnsupportedProperties::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  InterfaceWithUnsupportedProperties* impl =
-      wrapper_private->wrappable<InterfaceWithUnsupportedProperties>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<InterfaceWithUnsupportedProperties,
+                                                    V8cInterfaceWithUnsupportedProperties>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, InterfaceWithUnsupportedProperties* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->supported_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
@@ -203,38 +184,23 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "supportedAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, supportedAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "supportedAttribute"
+                  ,supportedAttributeAttributeGetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc
index 60b60c8..8889530 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc
index d663fc2..efafcad 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -102,14 +103,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   if (!impl->CanQueryNamedProperty(property_name)) {
     return;
@@ -119,7 +118,7 @@
     ToJSValue(isolate,
               impl->NamedGetter(property_name),
               &result_value);
-  }
+}
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -138,14 +137,12 @@
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   bool result = impl->CanQueryNamedProperty(property_name);
   if (!result) {
@@ -174,14 +171,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   v8::Local<v8::Array> array = v8::Array::New(isolate);
   V8cPropertyEnumerator property_enumerator(isolate, &array);
   impl->EnumerateNamedProperties(&property_enumerator);
@@ -198,14 +193,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   TypeTraits<std::string>::ConversionType native_value;
   FromJSValue(isolate, value, kNoConversionFlags,
@@ -215,7 +208,7 @@
   }
 
   impl->NamedSetter(property_name, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -239,21 +232,19 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   if (!impl->CanQueryNamedProperty(property_name)) {
     return;
   }
 
   impl->NamedDeleter(property_name);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -285,25 +276,18 @@
 void namedDeleterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -322,7 +306,7 @@
   }
 
   impl->NamedDeleter(name);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -331,25 +315,18 @@
 void namedGetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -371,7 +348,7 @@
     ToJSValue(isolate,
               impl->NamedGetter(name),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -383,25 +360,18 @@
 void namedSetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedGetterInterface* impl =
-      wrapper_private->wrappable<NamedGetterInterface>().get();
   const size_t kMinArguments = 2;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -430,7 +400,7 @@
   }
 
   impl->NamedSetter(name, value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc
index e38e088..cb2a42d 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -102,14 +103,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   if (!impl->CanQueryNamedProperty(property_name)) {
     return;
@@ -119,7 +118,7 @@
     ToJSValue(isolate,
               impl->NamedGetter(property_name),
               &result_value);
-  }
+}
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -132,14 +131,12 @@
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   bool result = impl->CanQueryNamedProperty(property_name);
   if (!result) {
@@ -162,14 +159,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   v8::Local<v8::Array> array = v8::Array::New(isolate);
   V8cPropertyEnumerator property_enumerator(isolate, &array);
   impl->EnumerateNamedProperties(&property_enumerator);
@@ -186,14 +181,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   std::string property_name = *v8::String::Utf8Value(isolate, property);
   TypeTraits<std::string>::ConversionType native_value;
   FromJSValue(isolate, value, kNoConversionFlags,
@@ -203,7 +196,7 @@
   }
 
   impl->NamedSetter(property_name, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -222,14 +215,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   if (index >= impl->length()) {
     // |index| is out of bounds, so return undefined.
     return;
@@ -239,7 +230,7 @@
     ToJSValue(isolate,
               impl->IndexedGetter(index),
               &result_value);
-  }
+}
   info.GetReturnValue().Set(result_value);
 }
 
@@ -254,14 +245,12 @@
     const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   const uint32_t length = impl->length();
   v8::Local<v8::Array> array = v8::Array::New(isolate, length);
   for (uint32_t i = 0; i < length; ++i) {
@@ -288,14 +277,12 @@
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   if (index >= impl->length()) {
     return;
   }
@@ -307,7 +294,7 @@
   }
 
   impl->IndexedSetter(index, native_value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   if (exception_state.is_exception_set()) {
     return;
   }
@@ -326,107 +313,51 @@
 
 void lengthAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NamedIndexedGetterInterface,
+                                                    V8cNamedIndexedGetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NamedIndexedGetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->length(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void propertyOnBaseClassAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NamedIndexedGetterInterface,
+                                                    V8cNamedIndexedGetterInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NamedIndexedGetterInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->property_on_base_class(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void propertyOnBaseClassAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NamedIndexedGetterInterface, V8cNamedIndexedGetterInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NamedIndexedGetterInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<bool >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -435,8 +366,9 @@
   }
 
   impl->set_property_on_base_class(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -444,25 +376,18 @@
 void indexedGetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -484,7 +409,7 @@
     ToJSValue(isolate,
               impl->IndexedGetter(index),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -496,25 +421,18 @@
 void indexedSetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   const size_t kMinArguments = 2;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -543,7 +461,7 @@
   }
 
   impl->IndexedSetter(index, value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -552,25 +470,18 @@
 void namedGetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -592,7 +503,7 @@
     ToJSValue(isolate,
               impl->NamedGetter(name),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -604,25 +515,18 @@
 void namedSetterMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
   const size_t kMinArguments = 2;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -651,7 +555,7 @@
   }
 
   impl->NamedSetter(name, value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -660,28 +564,21 @@
 void operationOnBaseClassMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNamedIndexedGetterInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNamedIndexedGetterInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NamedIndexedGetterInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NamedIndexedGetterInterface>(object);
+  if (!impl) {
     return;
   }
-  NamedIndexedGetterInterface* impl =
-      wrapper_private->wrappable<NamedIndexedGetterInterface>().get();
 
   impl->OperationOnBaseClass();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -741,74 +638,44 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "length");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, lengthAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "length"
+                  ,lengthAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "propertyOnBaseClass");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, propertyOnBaseClassAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, propertyOnBaseClassAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "propertyOnBaseClass"
+                  ,propertyOnBaseClassAttributeGetter
+                  ,propertyOnBaseClassAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc
index d01a524..0d1fc79 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -114,67 +115,31 @@
 
 void nestedForwardingAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNestedPutForwardsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NestedPutForwardsInterface* impl =
-      wrapper_private->wrappable<NestedPutForwardsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NestedPutForwardsInterface,
+                                                    V8cNestedPutForwardsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NestedPutForwardsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nested_forwarding_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nestedForwardingAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNestedPutForwardsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NestedPutForwardsInterface* impl =
-      wrapper_private->wrappable<NestedPutForwardsInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NestedPutForwardsInterface, V8cNestedPutForwardsInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NestedPutForwardsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   { // Begin scope of scoped_refptr<PutForwardsInterface> forwarded_impl.
     scoped_refptr<PutForwardsInterface> forwarded_impl =
        impl->nested_forwarding_attribute();
@@ -199,7 +164,7 @@
   }
 
   forwarded_forwarded_impl->set_arbitrary_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
 }
     return;
@@ -207,6 +172,7 @@
 }
     return;
   } // End scope of scoped_refptr<PutForwardsInterface> forwarded_impl.
+});
 }
 
 
@@ -265,39 +231,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nestedForwardingAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nestedForwardingAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nestedForwardingAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nestedForwardingAttribute"
+                  ,nestedForwardingAttributeAttributeGetter
+                  ,nestedForwardingAttributeAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc
index a451d14..32869a1 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc
index 8107531..d105c81 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc
index d1e376e..07ec89c 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc
@@ -53,6 +53,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -116,67 +117,31 @@
 
 void nullableBooleanPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NullableTypesTestInterface,
+                                                    V8cNullableTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_boolean_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableBooleanPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NullableTypesTestInterface, V8cNullableTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<bool > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -185,74 +150,39 @@
   }
 
   impl->set_nullable_boolean_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableNumericPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NullableTypesTestInterface,
+                                                    V8cNullableTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_numeric_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableNumericPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NullableTypesTestInterface, V8cNullableTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<int32_t > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -261,74 +191,39 @@
   }
 
   impl->set_nullable_numeric_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableStringPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NullableTypesTestInterface,
+                                                    V8cNullableTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_string_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableStringPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NullableTypesTestInterface, V8cNullableTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<std::string > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -337,74 +232,39 @@
   }
 
   impl->set_nullable_string_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableDictionaryPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NullableTypesTestInterface,
+                                                    V8cNullableTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_dictionary_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableDictionaryPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NullableTypesTestInterface, V8cNullableTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<TestDictionary > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -413,74 +273,39 @@
   }
 
   impl->set_nullable_dictionary_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableObjectPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NullableTypesTestInterface,
+                                                    V8cNullableTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_object_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableObjectPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NullableTypesTestInterface, V8cNullableTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<scoped_refptr<ArbitraryInterface> >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -489,8 +314,9 @@
   }
 
   impl->set_nullable_object_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -498,25 +324,18 @@
 void nullableBooleanArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -535,7 +354,7 @@
   }
 
   impl->NullableBooleanArgument(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -544,31 +363,24 @@
 void nullableBooleanOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->NullableBooleanOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -580,25 +392,18 @@
 void nullableDictionaryArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -617,7 +422,7 @@
   }
 
   impl->NullableDictionaryArgument(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -626,31 +431,24 @@
 void nullableDictionaryOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->NullableDictionaryOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -662,25 +460,18 @@
 void nullableNumericArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -699,7 +490,7 @@
   }
 
   impl->NullableNumericArgument(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -708,31 +499,24 @@
 void nullableNumericOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->NullableNumericOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -744,25 +528,18 @@
 void nullableObjectArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -781,7 +558,7 @@
   }
 
   impl->NullableObjectArgument(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -790,31 +567,24 @@
 void nullableObjectOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->NullableObjectOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -826,25 +596,18 @@
 void nullableStringArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -863,7 +626,7 @@
   }
 
   impl->NullableStringArgument(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -872,31 +635,24 @@
 void nullableStringOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNullableTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNullableTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NullableTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NullableTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NullableTypesTestInterface* impl =
-      wrapper_private->wrappable<NullableTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->NullableStringOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -959,183 +715,108 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableBooleanProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableBooleanPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableBooleanPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableBooleanProperty"
+                  ,nullableBooleanPropertyAttributeGetter
+                  ,nullableBooleanPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableNumericProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableNumericPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableNumericPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableNumericProperty"
+                  ,nullableNumericPropertyAttributeGetter
+                  ,nullableNumericPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableStringProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableStringPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableStringPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableStringProperty"
+                  ,nullableStringPropertyAttributeGetter
+                  ,nullableStringPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableDictionaryProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableDictionaryPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableDictionaryPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableDictionaryProperty"
+                  ,nullableDictionaryPropertyAttributeGetter
+                  ,nullableDictionaryPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableObjectProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableObjectPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableObjectPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableObjectProperty"
+                  ,nullableObjectPropertyAttributeGetter
+                  ,nullableObjectPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc
index d63da1b..ac35ce5 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,67 +111,31 @@
 
 void bytePropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->byte_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void bytePropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int8_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -179,74 +144,39 @@
   }
 
   impl->set_byte_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void byteClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->byte_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void byteClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int8_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -255,74 +185,39 @@
   }
 
   impl->set_byte_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void octetPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->octet_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void octetPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint8_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -331,74 +226,39 @@
   }
 
   impl->set_octet_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void octetClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->octet_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void octetClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint8_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -407,74 +267,39 @@
   }
 
   impl->set_octet_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void shortPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->short_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void shortPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int16_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -483,74 +308,39 @@
   }
 
   impl->set_short_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void shortClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->short_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void shortClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int16_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -559,74 +349,39 @@
   }
 
   impl->set_short_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unsignedShortPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unsigned_short_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unsignedShortPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint16_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -635,74 +390,39 @@
   }
 
   impl->set_unsigned_short_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unsignedShortClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unsigned_short_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unsignedShortClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint16_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -711,74 +431,39 @@
   }
 
   impl->set_unsigned_short_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void longPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->long_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void longPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -787,74 +472,39 @@
   }
 
   impl->set_long_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void longClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->long_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void longClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -863,74 +513,39 @@
   }
 
   impl->set_long_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unsignedLongPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unsigned_long_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unsignedLongPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -939,74 +554,39 @@
   }
 
   impl->set_unsigned_long_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unsignedLongClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unsigned_long_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unsignedLongClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint32_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -1015,74 +595,39 @@
   }
 
   impl->set_unsigned_long_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void longLongPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->long_long_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void longLongPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int64_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -1091,74 +636,39 @@
   }
 
   impl->set_long_long_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void longLongClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->long_long_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void longLongClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<int64_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -1167,74 +677,39 @@
   }
 
   impl->set_long_long_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unsignedLongLongPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unsigned_long_long_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unsignedLongLongPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint64_t >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -1243,74 +718,39 @@
   }
 
   impl->set_unsigned_long_long_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unsignedLongLongClampPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unsigned_long_long_clamp_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unsignedLongLongClampPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<uint64_t >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagClamped), &exception_state,
               &value);
@@ -1319,74 +759,39 @@
   }
 
   impl->set_unsigned_long_long_clamp_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void doublePropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->double_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void doublePropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<double >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagRestricted), &exception_state,
               &value);
@@ -1395,74 +800,39 @@
   }
 
   impl->set_double_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unrestrictedDoublePropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<NumericTypesTestInterface,
+                                                    V8cNumericTypesTestInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->unrestricted_double_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unrestrictedDoublePropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<NumericTypesTestInterface, V8cNumericTypesTestInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<double >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -1471,8 +841,9 @@
   }
 
   impl->set_unrestricted_double_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -1480,25 +851,18 @@
 void byteArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1517,7 +881,7 @@
   }
 
   impl->ByteArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1526,31 +890,24 @@
 void byteReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ByteReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -1562,25 +919,18 @@
 void doubleArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1599,7 +949,7 @@
   }
 
   impl->DoubleArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1608,31 +958,24 @@
 void doubleReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->DoubleReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -1644,25 +987,18 @@
 void longArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1681,7 +1017,7 @@
   }
 
   impl->LongArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1690,25 +1026,18 @@
 void longLongArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1727,7 +1056,7 @@
   }
 
   impl->LongLongArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1736,31 +1065,24 @@
 void longLongReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->LongLongReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -1772,31 +1094,24 @@
 void longReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->LongReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -1808,25 +1123,18 @@
 void octetArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1845,7 +1153,7 @@
   }
 
   impl->OctetArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1854,31 +1162,24 @@
 void octetReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->OctetReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -1890,25 +1191,18 @@
 void shortArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1927,7 +1221,7 @@
   }
 
   impl->ShortArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1936,31 +1230,24 @@
 void shortReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ShortReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -1972,25 +1259,18 @@
 void unrestrictedDoubleArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -2009,7 +1289,7 @@
   }
 
   impl->UnrestrictedDoubleArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -2018,31 +1298,24 @@
 void unrestrictedDoubleReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->UnrestrictedDoubleReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -2054,25 +1327,18 @@
 void unsignedLongArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -2091,7 +1357,7 @@
   }
 
   impl->UnsignedLongArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -2100,25 +1366,18 @@
 void unsignedLongLongArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -2137,7 +1396,7 @@
   }
 
   impl->UnsignedLongLongArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -2146,31 +1405,24 @@
 void unsignedLongLongReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->UnsignedLongLongReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -2182,31 +1434,24 @@
 void unsignedLongReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->UnsignedLongReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -2218,25 +1463,18 @@
 void unsignedShortArgumentOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -2255,7 +1493,7 @@
   }
 
   impl->UnsignedShortArgumentOperation(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -2264,31 +1502,24 @@
 void unsignedShortReturnOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cNumericTypesTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cNumericTypesTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  NumericTypesTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             NumericTypesTestInterface>(object);
+  if (!impl) {
     return;
   }
-  NumericTypesTestInterface* impl =
-      wrapper_private->wrappable<NumericTypesTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->UnsignedShortReturnOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -2351,651 +1582,381 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "byteProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, bytePropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, bytePropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "byteProperty"
+                  ,bytePropertyAttributeGetter
+                  ,bytePropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "byteClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, byteClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, byteClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "byteClampProperty"
+                  ,byteClampPropertyAttributeGetter
+                  ,byteClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "octetProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, octetPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, octetPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "octetProperty"
+                  ,octetPropertyAttributeGetter
+                  ,octetPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "octetClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, octetClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, octetClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "octetClampProperty"
+                  ,octetClampPropertyAttributeGetter
+                  ,octetClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "shortProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, shortPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, shortPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "shortProperty"
+                  ,shortPropertyAttributeGetter
+                  ,shortPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "shortClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, shortClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, shortClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "shortClampProperty"
+                  ,shortClampPropertyAttributeGetter
+                  ,shortClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unsignedShortProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unsignedShortPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unsignedShortPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unsignedShortProperty"
+                  ,unsignedShortPropertyAttributeGetter
+                  ,unsignedShortPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unsignedShortClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unsignedShortClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unsignedShortClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unsignedShortClampProperty"
+                  ,unsignedShortClampPropertyAttributeGetter
+                  ,unsignedShortClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "longProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, longPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, longPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "longProperty"
+                  ,longPropertyAttributeGetter
+                  ,longPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "longClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, longClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, longClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "longClampProperty"
+                  ,longClampPropertyAttributeGetter
+                  ,longClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unsignedLongProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unsignedLongPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unsignedLongPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unsignedLongProperty"
+                  ,unsignedLongPropertyAttributeGetter
+                  ,unsignedLongPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unsignedLongClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unsignedLongClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unsignedLongClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unsignedLongClampProperty"
+                  ,unsignedLongClampPropertyAttributeGetter
+                  ,unsignedLongClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "longLongProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, longLongPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, longLongPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "longLongProperty"
+                  ,longLongPropertyAttributeGetter
+                  ,longLongPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "longLongClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, longLongClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, longLongClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "longLongClampProperty"
+                  ,longLongClampPropertyAttributeGetter
+                  ,longLongClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unsignedLongLongProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unsignedLongLongPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unsignedLongLongPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unsignedLongLongProperty"
+                  ,unsignedLongLongPropertyAttributeGetter
+                  ,unsignedLongLongPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unsignedLongLongClampProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unsignedLongLongClampPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unsignedLongLongClampPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unsignedLongLongClampProperty"
+                  ,unsignedLongLongClampPropertyAttributeGetter
+                  ,unsignedLongLongClampPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "doubleProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, doublePropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, doublePropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "doubleProperty"
+                  ,doublePropertyAttributeGetter
+                  ,doublePropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unrestrictedDoubleProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unrestrictedDoublePropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unrestrictedDoublePropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unrestrictedDoubleProperty"
+                  ,unrestrictedDoublePropertyAttributeGetter
+                  ,unrestrictedDoublePropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc
index 4162e1d..6542141 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc
@@ -56,6 +56,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -122,67 +123,31 @@
 
 void arbitraryObjectAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ObjectTypeBindingsInterface,
+                                                    V8cObjectTypeBindingsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->arbitrary_object(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void arbitraryObjectAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ObjectTypeBindingsInterface, V8cObjectTypeBindingsInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<scoped_refptr<ArbitraryInterface> >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -191,114 +156,59 @@
   }
 
   impl->set_arbitrary_object(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void baseInterfaceAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ObjectTypeBindingsInterface,
+                                                    V8cObjectTypeBindingsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->base_interface(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void derivedInterfaceAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ObjectTypeBindingsInterface,
+                                                    V8cObjectTypeBindingsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->derived_interface(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void derivedInterfaceAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ObjectTypeBindingsInterface, V8cObjectTypeBindingsInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<scoped_refptr<DerivedInterface> >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -307,74 +217,39 @@
   }
 
   impl->set_derived_interface(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void objectPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<ObjectTypeBindingsInterface,
+                                                    V8cObjectTypeBindingsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->object_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void objectPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cObjectTypeBindingsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  ObjectTypeBindingsInterface* impl =
-      wrapper_private->wrappable<ObjectTypeBindingsInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<ObjectTypeBindingsInterface, V8cObjectTypeBindingsInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<::cobalt::script::ValueHandle >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable | kConversionFlagObjectOnly), &exception_state,
               &value);
@@ -383,8 +258,9 @@
   }
 
   impl->set_object_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -443,146 +319,86 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "arbitraryObject");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, arbitraryObjectAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, arbitraryObjectAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "arbitraryObject"
+                  ,arbitraryObjectAttributeGetter
+                  ,arbitraryObjectAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "baseInterface");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, baseInterfaceAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "baseInterface"
+                  ,baseInterfaceAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "derivedInterface");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, derivedInterfaceAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, derivedInterfaceAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "derivedInterface"
+                  ,derivedInterfaceAttributeGetter
+                  ,derivedInterfaceAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "objectProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, objectPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, objectPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "objectProperty"
+                  ,objectPropertyAttributeGetter
+                  ,objectPropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc
index fb718c6..4f4e6e1 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -116,31 +117,24 @@
 void longFunctionNoArgsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->LongFunctionNoArgs(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -152,31 +146,24 @@
 void objectFunctionNoArgsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ObjectFunctionNoArgs(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -188,43 +175,38 @@
 void optionalArgumentWithDefaultMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   // Optional arguments with default values
   TypeTraits<double >::ConversionType arg1 =
       2.718;
   size_t num_set_arguments = 1;
   if (info.Length() > 0) {
     v8::Local<v8::Value> optional_value0 = info[0];
-    FromJSValue(isolate,
-                optional_value0,
-                (kConversionFlagRestricted),
-                &exception_state,
-                &arg1);
+    if (!optional_value0->IsUndefined()) {
+      FromJSValue(isolate,
+                  optional_value0,
+                  (kConversionFlagRestricted),
+                  &exception_state,
+                  &arg1);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
   }
 
   impl->OptionalArgumentWithDefault(arg1);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -233,25 +215,18 @@
 void optionalArgumentsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -274,11 +249,13 @@
   size_t num_set_arguments = 1;
   if (info.Length() > 1) {
     v8::Local<v8::Value> optional_value0 = info[1];
-    FromJSValue(isolate,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &arg2);
+    {
+      FromJSValue(isolate,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &arg2);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
@@ -286,11 +263,13 @@
   }
   if (info.Length() > 2) {
     v8::Local<v8::Value> optional_value1 = info[2];
-    FromJSValue(isolate,
-                optional_value1,
-                kNoConversionFlags,
-                &exception_state,
-                &arg3);
+    {
+      FromJSValue(isolate,
+                  optional_value1,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &arg3);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
@@ -300,19 +279,19 @@
     case 1:
       {
           impl->OptionalArguments(arg1);
-          result_value = v8::Undefined(isolate);
+        result_value = v8::Undefined(isolate);
       }
       break;
     case 2:
       {
           impl->OptionalArguments(arg1, arg2);
-          result_value = v8::Undefined(isolate);
+        result_value = v8::Undefined(isolate);
       }
       break;
     case 3:
       {
           impl->OptionalArguments(arg1, arg2, arg3);
-          result_value = v8::Undefined(isolate);
+        result_value = v8::Undefined(isolate);
       }
       break;
     default:
@@ -326,25 +305,18 @@
 void optionalNullableArgumentsWithDefaultsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   // Optional arguments with default values
   TypeTraits<base::Optional<bool > >::ConversionType arg1 =
       base::nullopt;
@@ -353,29 +325,33 @@
   size_t num_set_arguments = 2;
   if (info.Length() > 0) {
     v8::Local<v8::Value> optional_value0 = info[0];
-    FromJSValue(isolate,
-                optional_value0,
-                (kConversionFlagNullable),
-                &exception_state,
-                &arg1);
+    if (!optional_value0->IsUndefined()) {
+      FromJSValue(isolate,
+                  optional_value0,
+                  (kConversionFlagNullable),
+                  &exception_state,
+                  &arg1);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
   }
   if (info.Length() > 1) {
     v8::Local<v8::Value> optional_value1 = info[1];
-    FromJSValue(isolate,
-                optional_value1,
-                (kConversionFlagNullable),
-                &exception_state,
-                &arg2);
+    if (!optional_value1->IsUndefined()) {
+      FromJSValue(isolate,
+                  optional_value1,
+                  (kConversionFlagNullable),
+                  &exception_state,
+                  &arg2);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
   }
 
   impl->OptionalNullableArgumentsWithDefaults(arg1, arg2);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -384,53 +360,39 @@
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
 
   impl->OverloadedFunction();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void overloadedFunctionMethod2(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -449,32 +411,25 @@
   }
 
   impl->OverloadedFunction(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void overloadedFunctionMethod3(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -493,32 +448,25 @@
   }
 
   impl->OverloadedFunction(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void overloadedFunctionMethod4(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 3;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -557,32 +505,25 @@
   }
 
   impl->OverloadedFunction(arg1, arg2, arg3);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void overloadedFunctionMethod5(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 3;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -621,7 +562,7 @@
   }
 
   impl->OverloadedFunction(arg1, arg2, arg3);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -643,9 +584,7 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       v8::Local<v8::Value> arg = info[0];
-      V8cGlobalEnvironment* global_environment =
-          V8cGlobalEnvironment::GetFromIsolate(isolate);
-      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
+      WrapperFactory* wrapper_factory = V8cGlobalEnvironment::GetFromIsolate(isolate)->wrapper_factory();
       v8::Local<v8::Object> object;
       if (arg->IsObject()) {
         object = arg->ToObject();
@@ -671,9 +610,7 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       v8::Local<v8::Value> arg = info[2];
-      V8cGlobalEnvironment* global_environment =
-          V8cGlobalEnvironment::GetFromIsolate(isolate);
-      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
+      WrapperFactory* wrapper_factory = V8cGlobalEnvironment::GetFromIsolate(isolate)->wrapper_factory();
       v8::Local<v8::Object> object;
       if (arg->IsObject()) {
         object = arg->ToObject();
@@ -704,25 +641,18 @@
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -741,32 +671,25 @@
   }
 
   impl->OverloadedNullable(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void overloadedNullableMethod2(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -785,7 +708,7 @@
   }
 
   impl->OverloadedNullable(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -797,9 +720,7 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       v8::Local<v8::Value> arg = info[0];
-      V8cGlobalEnvironment* global_environment =
-          V8cGlobalEnvironment::GetFromIsolate(isolate);
-      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
+      WrapperFactory* wrapper_factory = V8cGlobalEnvironment::GetFromIsolate(isolate)->wrapper_factory();
       v8::Local<v8::Object> object;
       if (arg->IsObject()) {
         object = arg->ToObject();
@@ -830,31 +751,24 @@
 void stringFunctionNoArgsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->StringFunctionNoArgs(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -866,25 +780,18 @@
 void variadicPrimitiveArgumentsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   // Variadic argument
   TypeTraits<std::vector<int32_t> >::ConversionType bools;
 
@@ -906,7 +813,7 @@
   }
 
   impl->VariadicPrimitiveArguments(bools);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -915,25 +822,18 @@
 void variadicStringArgumentsAfterOptionalArgumentMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   // Optional arguments
   TypeTraits<bool >::ConversionType optionalArg;
   // Variadic argument
@@ -941,11 +841,13 @@
   size_t num_set_arguments = 0;
   if (info.Length() > 0) {
     v8::Local<v8::Value> optional_value0 = info[0];
-    FromJSValue(isolate,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &optionalArg);
+    {
+      FromJSValue(isolate,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &optionalArg);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
@@ -979,13 +881,13 @@
     case 0:
       {
           impl->VariadicStringArgumentsAfterOptionalArgument();
-          result_value = v8::Undefined(isolate);
+        result_value = v8::Undefined(isolate);
       }
       break;
     case 2:
       {
           impl->VariadicStringArgumentsAfterOptionalArgument(optionalArg, strings);
-          result_value = v8::Undefined(isolate);
+        result_value = v8::Undefined(isolate);
       }
       break;
     default:
@@ -999,25 +901,18 @@
 void voidFunctionLongArgMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1036,7 +931,7 @@
   }
 
   impl->VoidFunctionLongArg(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1045,28 +940,21 @@
 void voidFunctionNoArgsMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
 
   impl->VoidFunctionNoArgs();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1075,25 +963,18 @@
 void voidFunctionObjectArgMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1112,7 +993,7 @@
   }
 
   impl->VoidFunctionObjectArg(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1121,25 +1002,18 @@
 void voidFunctionStringArgMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cOperationsTestInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cOperationsTestInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  OperationsTestInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             OperationsTestInterface>(object);
+  if (!impl) {
     return;
   }
-  OperationsTestInterface* impl =
-      wrapper_private->wrappable<OperationsTestInterface>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -1158,7 +1032,7 @@
   }
 
   impl->VoidFunctionStringArg(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -1187,7 +1061,7 @@
   }
 
   OperationsTestInterface::OverloadedFunction(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void overloadedFunctionStaticMethod2(
@@ -1224,7 +1098,7 @@
   }
 
   OperationsTestInterface::OverloadedFunction(arg1, arg2);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc
index be33c06..e8f7ad5 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -112,28 +113,21 @@
 void onSuccessMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPromiseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cPromiseInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  PromiseInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             PromiseInterface>(object);
+  if (!impl) {
     return;
   }
-  PromiseInterface* impl =
-      wrapper_private->wrappable<PromiseInterface>().get();
 
   impl->OnSuccess();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -142,31 +136,24 @@
 void returnBooleanPromiseMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPromiseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cPromiseInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  PromiseInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             PromiseInterface>(object);
+  if (!impl) {
     return;
   }
-  PromiseInterface* impl =
-      wrapper_private->wrappable<PromiseInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ReturnBooleanPromise(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -178,31 +165,24 @@
 void returnInterfacePromiseMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPromiseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cPromiseInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  PromiseInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             PromiseInterface>(object);
+  if (!impl) {
     return;
   }
-  PromiseInterface* impl =
-      wrapper_private->wrappable<PromiseInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ReturnInterfacePromise(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -214,31 +194,24 @@
 void returnStringPromiseMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPromiseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cPromiseInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  PromiseInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             PromiseInterface>(object);
+  if (!impl) {
     return;
   }
-  PromiseInterface* impl =
-      wrapper_private->wrappable<PromiseInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ReturnStringPromise(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -250,31 +223,24 @@
 void returnVoidPromiseMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPromiseInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cPromiseInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  PromiseInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             PromiseInterface>(object);
+  if (!impl) {
     return;
   }
-  PromiseInterface* impl =
-      wrapper_private->wrappable<PromiseInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->ReturnVoidPromise(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc
index 3387251..b9a59f0 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -114,67 +115,31 @@
 
 void forwardingAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPutForwardsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  PutForwardsInterface* impl =
-      wrapper_private->wrappable<PutForwardsInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<PutForwardsInterface,
+                                                    V8cPutForwardsInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, PutForwardsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->forwarding_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void forwardingAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cPutForwardsInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  PutForwardsInterface* impl =
-      wrapper_private->wrappable<PutForwardsInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<PutForwardsInterface, V8cPutForwardsInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, PutForwardsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   { // Begin scope of scoped_refptr<ArbitraryInterface> forwarded_impl.
     scoped_refptr<ArbitraryInterface> forwarded_impl =
        impl->forwarding_attribute();
@@ -191,44 +156,42 @@
   }
 
   forwarded_impl->set_arbitrary_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
 }
     return;
   } // End scope of scoped_refptr<ArbitraryInterface> forwarded_impl.
+});
 }
 
 
 void staticForwardingAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<PutForwardsInterface,
+                                                    V8cPutForwardsInterface>(
+                    info,
+                    true,
+                    false,
+                    [](v8::Isolate* isolate, PutForwardsInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               PutForwardsInterface::static_forwarding_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void staticForwardingAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
+  script::v8c::shared_bindings::AttributeSetterImpl<PutForwardsInterface, V8cPutForwardsInterface>(info,
+                    true,
+                    false,
+                    [](v8::Isolate* isolate, PutForwardsInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   { // Begin scope of scoped_refptr<ArbitraryInterface> forwarded_impl.
     scoped_refptr<ArbitraryInterface> forwarded_impl =
        PutForwardsInterface::static_forwarding_attribute();
@@ -245,11 +208,12 @@
   }
 
   forwarded_impl->set_arbitrary_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
 }
     return;
   } // End scope of scoped_refptr<ArbitraryInterface> forwarded_impl.
+});
 }
 
 
@@ -308,79 +272,45 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "forwardingAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, forwardingAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, forwardingAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "forwardingAttribute"
+                  ,forwardingAttributeAttributeGetter
+                  ,forwardingAttributeAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "staticForwardingAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, staticForwardingAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, staticForwardingAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Operations installed on the interface object must be static methods, so
-    // no need to specify a signature, i.e. no need to do type check against a
-    // holder.
-
-    // If the attribute is a static attribute, then there is a single
-    // corresponding property and it exists on the interface's interface object.
-    function_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  true,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "staticForwardingAttribute"
+                  ,staticForwardingAttributeAttributeGetter
+                  ,staticForwardingAttributeAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc
index 6598389..798d426 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -127,31 +128,24 @@
 void getInterfaceSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetInterfaceSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -163,31 +157,24 @@
 void getInterfaceSequenceSequenceSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetInterfaceSequenceSequenceSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -199,31 +186,24 @@
 void getLongSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetLongSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -235,31 +215,24 @@
 void getStringSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetStringSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -271,31 +244,24 @@
 void getStringSequenceSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetStringSequenceSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -307,31 +273,24 @@
 void getUnionOfStringAndStringSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetUnionOfStringAndStringSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -343,31 +302,24 @@
 void getUnionSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetUnionSequence(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -379,25 +331,18 @@
 void setInterfaceSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -416,7 +361,7 @@
   }
 
   impl->SetInterfaceSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -425,25 +370,18 @@
 void setInterfaceSequenceSequenceSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -462,7 +400,7 @@
   }
 
   impl->SetInterfaceSequenceSequenceSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -471,25 +409,18 @@
 void setLongSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -508,7 +439,7 @@
   }
 
   impl->SetLongSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -517,25 +448,18 @@
 void setStringSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -554,7 +478,7 @@
   }
 
   impl->SetStringSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -563,25 +487,18 @@
 void setStringSequenceSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -600,7 +517,7 @@
   }
 
   impl->SetStringSequenceSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -609,25 +526,18 @@
 void setUnionOfStringAndStringSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -646,7 +556,7 @@
   }
 
   impl->SetUnionOfStringAndStringSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -655,25 +565,18 @@
 void setUnionSequenceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cSequenceUser::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cSequenceUser::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  SequenceUser* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             SequenceUser>(object);
+  if (!impl) {
     return;
   }
-  SequenceUser* impl =
-      wrapper_private->wrappable<SequenceUser>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -692,7 +595,7 @@
   }
 
   impl->SetUnionSequence(elements);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc
index ed60f65..e92c7c4 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc
@@ -52,6 +52,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -114,34 +115,31 @@
 
 void staticAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<StaticPropertiesInterface,
+                                                    V8cStaticPropertiesInterface>(
+                    info,
+                    true,
+                    false,
+                    [](v8::Isolate* isolate, StaticPropertiesInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               StaticPropertiesInterface::static_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void staticAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
+  script::v8c::shared_bindings::AttributeSetterImpl<StaticPropertiesInterface, V8cStaticPropertiesInterface>(info,
+                    true,
+                    false,
+                    [](v8::Isolate* isolate, StaticPropertiesInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -150,8 +148,9 @@
   }
 
   StaticPropertiesInterface::set_static_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -163,7 +162,7 @@
 
 
   StaticPropertiesInterface::StaticFunction();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void staticFunctionStaticMethod2(
@@ -190,7 +189,7 @@
   }
 
   StaticPropertiesInterface::StaticFunction(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void staticFunctionStaticMethod3(
@@ -217,7 +216,7 @@
   }
 
   StaticPropertiesInterface::StaticFunction(arg);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void staticFunctionStaticMethod4(
@@ -264,7 +263,7 @@
   }
 
   StaticPropertiesInterface::StaticFunction(arg1, arg2, arg3);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 void staticFunctionStaticMethod5(
@@ -311,7 +310,7 @@
   }
 
   StaticPropertiesInterface::StaticFunction(arg1, arg2, arg3);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -333,9 +332,7 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       v8::Local<v8::Value> arg = info[0];
-      V8cGlobalEnvironment* global_environment =
-          V8cGlobalEnvironment::GetFromIsolate(isolate);
-      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
+      WrapperFactory* wrapper_factory = V8cGlobalEnvironment::GetFromIsolate(isolate)->wrapper_factory();
       v8::Local<v8::Object> object;
       if (arg->IsObject()) {
         object = arg->ToObject();
@@ -361,9 +358,7 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       v8::Local<v8::Value> arg = info[2];
-      V8cGlobalEnvironment* global_environment =
-          V8cGlobalEnvironment::GetFromIsolate(isolate);
-      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
+      WrapperFactory* wrapper_factory = V8cGlobalEnvironment::GetFromIsolate(isolate)->wrapper_factory();
       v8::Local<v8::Object> object;
       if (arg->IsObject()) {
         object = arg->ToObject();
@@ -445,43 +440,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "staticAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, staticAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, staticAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Operations installed on the interface object must be static methods, so
-    // no need to specify a signature, i.e. no need to do type check against a
-    // holder.
-
-    // If the attribute is a static attribute, then there is a single
-    // corresponding property and it exists on the interface's interface object.
-    function_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  true,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "staticAttribute"
+                  ,staticAttributeAttributeGetter
+                  ,staticAttributeAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc
index 7affa31..ead2354 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -109,40 +110,15 @@
 
 
 void Stringifier(const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  V8cExceptionState exception_state(isolate);
+  auto* impl = script::v8c::shared_bindings::get_impl_class_from_info<StringifierAnonymousOperationInterface, V8cStringifierAnonymousOperationInterface>(info);
 
-    V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cStringifierAnonymousOperationInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-
-  // |WrapperPrivate::GetFromObject| can fail if |object| is not a |Wrapper|
-  // object.
-  if (!wrapper_private) {
-    exception_state.SetSimpleException(cobalt::script::kStringifierProblem);
-    return;
-  }
-
-  StringifierAnonymousOperationInterface* impl =
-      wrapper_private->wrappable<StringifierAnonymousOperationInterface>().get();
   if (!impl) {
-    exception_state.SetSimpleException(cobalt::script::kStringifierProblem);
-    NOTREACHED();
     return;
   }
   std::string stringified = impl->AnonymousStringifier();
 
   v8::Local<v8::Value> v8_stringified;
-  ToJSValue(isolate, stringified, &v8_stringified);
+  ToJSValue(info.GetIsolate(), stringified, &v8_stringified);
 
   info.GetReturnValue().Set(v8_stringified);
 }
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc
index 58269d7..38eb8b3 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -110,67 +111,31 @@
 
 void theStringifierAttributeAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cStringifierAttributeInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  StringifierAttributeInterface* impl =
-      wrapper_private->wrappable<StringifierAttributeInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<StringifierAttributeInterface,
+                                                    V8cStringifierAttributeInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, StringifierAttributeInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->the_stringifier_attribute(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void theStringifierAttributeAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cStringifierAttributeInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  StringifierAttributeInterface* impl =
-      wrapper_private->wrappable<StringifierAttributeInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<StringifierAttributeInterface, V8cStringifierAttributeInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, StringifierAttributeInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -179,46 +144,22 @@
   }
 
   impl->set_the_stringifier_attribute(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void Stringifier(const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  V8cExceptionState exception_state(isolate);
+  auto* impl = script::v8c::shared_bindings::get_impl_class_from_info<StringifierAttributeInterface, V8cStringifierAttributeInterface>(info);
 
-    V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cStringifierAttributeInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-
-  // |WrapperPrivate::GetFromObject| can fail if |object| is not a |Wrapper|
-  // object.
-  if (!wrapper_private) {
-    exception_state.SetSimpleException(cobalt::script::kStringifierProblem);
-    return;
-  }
-
-  StringifierAttributeInterface* impl =
-      wrapper_private->wrappable<StringifierAttributeInterface>().get();
   if (!impl) {
-    exception_state.SetSimpleException(cobalt::script::kStringifierProblem);
-    NOTREACHED();
     return;
   }
   std::string stringified = impl->the_stringifier_attribute();
 
   v8::Local<v8::Value> v8_stringified;
-  ToJSValue(isolate, stringified, &v8_stringified);
+  ToJSValue(info.GetIsolate(), stringified, &v8_stringified);
 
   info.GetReturnValue().Set(v8_stringified);
 }
@@ -277,39 +218,24 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "theStringifierAttribute");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, theStringifierAttributeAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, theStringifierAttributeAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "theStringifierAttribute"
+                  ,theStringifierAttributeAttributeGetter
+                  ,theStringifierAttributeAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc
index 043c675..71766c1 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -112,31 +113,24 @@
 void theStringifierOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cStringifierOperationInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cStringifierOperationInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  StringifierOperationInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             StringifierOperationInterface>(object);
+  if (!impl) {
     return;
   }
-  StringifierOperationInterface* impl =
-      wrapper_private->wrappable<StringifierOperationInterface>().get();
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->TheStringifierOperation(),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -145,40 +139,15 @@
 
 
 void Stringifier(const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  V8cExceptionState exception_state(isolate);
+  auto* impl = script::v8c::shared_bindings::get_impl_class_from_info<StringifierOperationInterface, V8cStringifierOperationInterface>(info);
 
-    V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cStringifierOperationInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-
-  // |WrapperPrivate::GetFromObject| can fail if |object| is not a |Wrapper|
-  // object.
-  if (!wrapper_private) {
-    exception_state.SetSimpleException(cobalt::script::kStringifierProblem);
-    return;
-  }
-
-  StringifierOperationInterface* impl =
-      wrapper_private->wrappable<StringifierOperationInterface>().get();
   if (!impl) {
-    exception_state.SetSimpleException(cobalt::script::kStringifierProblem);
-    NOTREACHED();
     return;
   }
   std::string stringified = impl->TheStringifierOperation();
 
   v8::Local<v8::Value> v8_stringified;
-  ToJSValue(isolate, stringified, &v8_stringified);
+  ToJSValue(info.GetIsolate(), stringified, &v8_stringified);
 
   info.GetReturnValue().Set(v8_stringified);
 }
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc
index f1fa8a8..d98c088 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc
@@ -50,6 +50,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -112,28 +113,21 @@
 void implementedInterfaceFunctionMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cTargetInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cTargetInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  TargetInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             TargetInterface>(object);
+  if (!impl) {
     return;
   }
-  TargetInterface* impl =
-      wrapper_private->wrappable<TargetInterface>().get();
 
   impl->ImplementedInterfaceFunction();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -142,28 +136,21 @@
 void partialInterfaceFunctionMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cTargetInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cTargetInterface::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  TargetInterface* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             TargetInterface>(object);
+  if (!impl) {
     return;
   }
-  TargetInterface* impl =
-      wrapper_private->wrappable<TargetInterface>().get();
 
   impl->PartialInterfaceFunction();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc
index b1f1049..7ee0d0e 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc
@@ -54,6 +54,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -118,67 +119,31 @@
 
 void unionPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<UnionTypesInterface,
+                                                    V8cUnionTypesInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->union_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unionPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<UnionTypesInterface, V8cUnionTypesInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<::cobalt::script::UnionType4<std::string, bool, scoped_refptr<ArbitraryInterface>, int32_t > >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -187,74 +152,39 @@
   }
 
   impl->set_union_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unionWithNullableMemberPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<UnionTypesInterface,
+                                                    V8cUnionTypesInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->union_with_nullable_member_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unionWithNullableMemberPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<UnionTypesInterface, V8cUnionTypesInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<::cobalt::script::UnionType2<double, std::string > > >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -263,74 +193,39 @@
   }
 
   impl->set_union_with_nullable_member_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void nullableUnionPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<UnionTypesInterface,
+                                                    V8cUnionTypesInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->nullable_union_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void nullableUnionPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<UnionTypesInterface, V8cUnionTypesInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<base::Optional<::cobalt::script::UnionType2<double, std::string > > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -339,74 +234,39 @@
   }
 
   impl->set_nullable_union_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void unionBasePropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<UnionTypesInterface,
+                                                    V8cUnionTypesInterface>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->union_base_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void unionBasePropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cUnionTypesInterface::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  UnionTypesInterface* impl =
-      wrapper_private->wrappable<UnionTypesInterface>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<UnionTypesInterface, V8cUnionTypesInterface>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, UnionTypesInterface* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<::cobalt::script::UnionType2<scoped_refptr<BaseInterface>, std::string > >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -415,8 +275,9 @@
   }
 
   impl->set_union_base_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -475,147 +336,87 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unionProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unionPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unionPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unionProperty"
+                  ,unionPropertyAttributeGetter
+                  ,unionPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unionWithNullableMemberProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unionWithNullableMemberPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unionWithNullableMemberPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unionWithNullableMemberProperty"
+                  ,unionWithNullableMemberPropertyAttributeGetter
+                  ,unionWithNullableMemberPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "nullableUnionProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, nullableUnionPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, nullableUnionPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "nullableUnionProperty"
+                  ,nullableUnionPropertyAttributeGetter
+                  ,nullableUnionPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "unionBaseProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, unionBasePropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, unionBasePropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, the property exists solely on the interface's interface
-    // prototype object.
-    prototype_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  false,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "unionBaseProperty"
+                  ,unionBasePropertyAttributeGetter
+                  ,unionBasePropertyAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc
index 3aef49e..e1fb14a 100644
--- a/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc
+++ b/src/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc
@@ -152,6 +152,7 @@
 #include "cobalt/script/v8c/v8c_property_enumerator.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/v8c/wrapper_private.h"
+#include "cobalt/script/v8c/common_v8c_bindings_code.h"
 #include "v8/include/v8.h"
 
 
@@ -322,67 +323,31 @@
 
 void windowPropertyAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<Window,
+                                                    V8cWindow>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, Window* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->window_property(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void windowPropertyAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<Window, V8cWindow>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, Window* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<std::string >::ConversionType value;
   FromJSValue(isolate, v8_value, kNoConversionFlags, &exception_state,
               &value);
@@ -391,114 +356,59 @@
   }
 
   impl->set_window_property(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
 void windowAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<Window,
+                                                    V8cWindow>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, Window* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->window(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 
 
 void onEventAttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
-
-
-  if (!exception_state.is_exception_set()) {
-    ToJSValue(isolate,
+  script::v8c::shared_bindings::AttributeGetterImpl<Window,
+                                                    V8cWindow>(
+                    info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, Window* impl,
+                       cobalt::script::ExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value) {
+  
+      ToJSValue(isolate,
               impl->on_event(),
               &result_value);
-  }
-  if (exception_state.is_exception_set()) {
-    return;
-  }
-  info.GetReturnValue().Set(result_value);
+
+  });
 }
 
 void onEventAttributeSetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-  v8::Local<v8::Object> object = info.Holder();
-  v8::Local<v8::Value> v8_value = info[0];
-
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
-    return;
-  }
-  V8cExceptionState exception_state{isolate};
-  v8::Local<v8::Value> result_value;
-
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
-    return;
-  }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
+  script::v8c::shared_bindings::AttributeSetterImpl<Window, V8cWindow>(info,
+                    false,
+                    false,
+                    [](v8::Isolate* isolate, Window* impl,
+                       V8cExceptionState& exception_state,
+                       v8::Local<v8::Value>& result_value,
+                       v8::Local<v8::Value> v8_value) {
   TypeTraits<::cobalt::script::CallbackInterfaceTraits<SingleOperationInterface > >::ConversionType value;
   FromJSValue(isolate, v8_value, (kConversionFlagNullable), &exception_state,
               &value);
@@ -507,8 +417,9 @@
   }
 
   impl->set_on_event(value);
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
   return;
+});
 }
 
 
@@ -516,32 +427,25 @@
 void getStackTraceMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cWindow::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  Window* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             Window>(object);
+  if (!impl) {
     return;
   }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
   V8cGlobalEnvironment* callwith_global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(isolate,
               impl->GetStackTrace(callwith_global_environment->GetStackTrace()),
               &result_value);
-  }
+}
   if (!exception_state.is_exception_set()) {
     info.GetReturnValue().Set(result_value);
   }
@@ -553,25 +457,18 @@
 void setTimeoutMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cWindow::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  Window* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             Window>(object);
+  if (!impl) {
     return;
   }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
   const size_t kMinArguments = 1;
   if (info.Length() < kMinArguments) {
     exception_state.SetSimpleException(script::kInvalidNumberOfArguments);
@@ -593,11 +490,13 @@
   size_t num_set_arguments = 1;
   if (info.Length() > 1) {
     v8::Local<v8::Value> optional_value0 = info[1];
-    FromJSValue(isolate,
-                optional_value0,
-                kNoConversionFlags,
-                &exception_state,
-                &timeout);
+    {
+      FromJSValue(isolate,
+                  optional_value0,
+                  kNoConversionFlags,
+                  &exception_state,
+                  &timeout);
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
@@ -610,7 +509,7 @@
             ToJSValue(isolate,
                       impl->SetTimeout(handler),
                       &result_value);
-          }
+        }
           if (!exception_state.is_exception_set()) {
             info.GetReturnValue().Set(result_value);
           }
@@ -622,7 +521,7 @@
             ToJSValue(isolate,
                       impl->SetTimeout(handler, timeout),
                       &result_value);
-          }
+        }
           if (!exception_state.is_exception_set()) {
             info.GetReturnValue().Set(result_value);
           }
@@ -639,28 +538,21 @@
 void windowOperationMethod(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Object> object = info.Holder();
-  V8cGlobalEnvironment* global_environment = V8cGlobalEnvironment::GetFromIsolate(isolate);
-  WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
-  if (!WrapperPrivate::HasWrapperPrivate(object) ||
-      !V8cWindow::GetTemplate(isolate)->HasInstance(object)) {
-    V8cExceptionState exception(isolate);
-    exception.SetSimpleException(script::kDoesNotImplementInterface);
+  if (!script::v8c::shared_bindings::object_implements_interface(V8cWindow::GetTemplate(isolate), isolate, object)) {
     return;
   }
   V8cExceptionState exception_state{isolate};
   v8::Local<v8::Value> result_value;
 
-  WrapperPrivate* wrapper_private =
-      WrapperPrivate::GetFromWrapperObject(object);
-  if (!wrapper_private) {
-    NOTIMPLEMENTED();
+  Window* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             Window>(object);
+  if (!impl) {
     return;
   }
-  Window* impl =
-      wrapper_private->wrappable<Window>().get();
 
   impl->WindowOperation();
-  result_value = v8::Undefined(isolate);
+result_value = v8::Undefined(isolate);
 
 }
 
@@ -735,113 +627,65 @@
   // corresponding property. The characteristics of this property are as
   // follows:
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "windowProperty");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, windowPropertyAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, windowPropertyAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, if the attribute is unforgeable on the interface or if the
-    // interface was declared with the [Global] extended attribute, then the
-    // property exists on every object that implements the interface.
-    instance_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  true,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "windowProperty"
+                  ,windowPropertyAttributeGetter
+                  ,windowPropertyAttributeSetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "window");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, windowAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter;
-
-    // The location of the property is determined as follows:
-    // Otherwise, if the attribute is unforgeable on the interface or if the
-    // interface was declared with the [Global] extended attribute, then the
-    // property exists on every object that implements the interface.
-    instance_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  false,
+                  false,
+                  true,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "window"
+                  ,windowAttributeGetter
+                  );
 
   }
   {
-    // The name of the property is the identifier of the attribute.
-    v8::Local<v8::String> name = NewInternalString(
-        isolate,
-        "onEvent");
 
+    script::v8c::shared_bindings::set_property_for_nonconstructor_attribute(
+                  isolate,
     // The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
     // true, [[Configurable]]: configurable }, where: configurable is false if
     // the attribute was declared with the [Unforgeable] extended attribute and
     // true otherwise;
-    bool configurable = true;
-    v8::PropertyAttribute attributes = static_cast<v8::PropertyAttribute>(
-        configurable ? v8::None : v8::DontDelete);
-
-    // G is the attribute getter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property;
-    // and
-    //
-    // S is the attribute setter created given the attribute, the interface, and
-    // the relevant Realm of the object that is the location of the property.
-    v8::Local<v8::FunctionTemplate> getter =
-        v8::FunctionTemplate::New(isolate, onEventAttributeGetter);
-    v8::Local<v8::FunctionTemplate> setter =
-        v8::FunctionTemplate::New(isolate, onEventAttributeSetter);
-
-    // The location of the property is determined as follows:
-    // Otherwise, if the attribute is unforgeable on the interface or if the
-    // interface was declared with the [Global] extended attribute, then the
-    // property exists on every object that implements the interface.
-    instance_template->
-        SetAccessorProperty(
-            name,
-            getter,
-            setter,
-            attributes);
+                  true,
+                  true,
+                  false,
+                  true,
+                  function_template,
+                  instance_template,
+                  prototype_template,
+                  "onEvent"
+                  ,onEventAttributeGetter
+                  ,onEventAttributeSetter
+                  );
 
   }
 
diff --git a/src/cobalt/bindings/mozjs45/templates/interface.cc.template b/src/cobalt/bindings/mozjs45/templates/interface.cc.template
index 1a26bab..03f736c 100644
--- a/src/cobalt/bindings/mozjs45/templates/interface.cc.template
+++ b/src/cobalt/bindings/mozjs45/templates/interface.cc.template
@@ -355,36 +355,8 @@
 }
 {% endif %}
 
-{% for constant in constants %}
-bool get_{{constant.idl_name}}(
-    JSContext* context, unsigned argc, JS::Value* vp) {
-{% if constant.can_use_compile_assert %}
-  COMPILE_ASSERT({{impl_class}}::{{constant.name}} == {{constant.value}},
-                 ValueFor{{impl_class}}_{{constant.name}}DoesNotMatchIDL);
-{% else %}
-  DCHECK_EQ({{constant.value}}, {{impl_class}}::{{constant.name}}) <<
-      "The value for {{impl_class}}::{{constant.name}} does not match "
-      "the value in the interface definition.";
-{% endif %}
-  JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-  if (!args.thisv().isObject()) {
-    MozjsExceptionState exception(context);
-    exception.SetSimpleException(script::kTypeError, "Invalid this.");
-    return false;
-  }
-  JS::RootedObject object(context, &args.thisv().toObject());
-  MozjsExceptionState exception_state(context);
-  JS::RootedValue result_value(context);
-  ToJSValue(context, {{constant.value}}, &result_value);
-  if (!exception_state.is_exception_set()) {
-    args.rval().set(result_value);
-  }
-  return !exception_state.is_exception_set();
-}
-{% endfor %}
-
 bool HasInstance(JSContext *context, JS::HandleObject type,
-                   JS::MutableHandleValue vp, bool *success) {
+                 JS::MutableHandleValue vp, bool *success) {
   JS::RootedObject global_object(
       context, JS_GetGlobalForObject(context, type));
   DCHECK(global_object);
@@ -534,6 +506,7 @@
 {%- for operation in operations + static_operations %}
 {% if operation.conditional %}
 #if defined({{operation.conditional}})
+
 {% endif %}
 {% set boundFunctionPrefix = "staticfcn_" if operation.is_static else "fcn_" %}
 {% for overload in operation.overloads if operation.overloads|length > 1 %}
@@ -552,13 +525,13 @@
       operation, boundFunctionPrefix + operation.idl_name) }}
 {% endif %}
 }
-
 {% if operation.conditional %}
+
 #endif  // {{operation.conditional}}
 {% endif %}
 {% endfor %}
-
 {% if stringifier %}
+
 bool Stringifier(JSContext* context, unsigned argc, JS::Value *vp) {
   MozjsExceptionState exception_state(context);
   // Compute the 'this' value.
@@ -603,15 +576,6 @@
 {% endif %}
 
 const JSPropertySpec prototype_properties[] = {
-{% for constant in constants %}
-  {
-      "{{constant.idl_name}}",
-      JSPROP_PERMANENT | JSPROP_SHARED | JSPROP_ENUMERATE,
-      { { &get_{{constant.idl_name}}, NULL } },
-      JSNATIVE_WRAPPER(NULL)
-  },
-{% endfor %}
-
 {% for attribute in attributes if not attribute.is_constructor_attribute %}
 {% if attribute.conditional %}
 #if defined({{attribute.conditional}})
@@ -657,15 +621,6 @@
 };
 
 const JSPropertySpec interface_object_properties[] = {
-{% for constant in constants %}
-  {
-    "{{constant.idl_name}}",
-    JSPROP_SHARED | JSPROP_ENUMERATE,
-    { { &get_{{constant.idl_name}}, NULL } },
-    JSNATIVE_WRAPPER(NULL),
-  },
-{% endfor %}
-
 {% for attribute in static_attributes %}
 {% if attribute.conditional %}
 #if defined({{attribute.conditional}})
@@ -811,11 +766,28 @@
       JSPROP_READONLY, NULL, NULL);
   DCHECK(success);
 {% endif %}
+{% if constants %}
 
-  // Define interface object properties (including constants).
+  // Define constants.
+{% for constant in constants %}
+  {
+    success = JS_DefineProperty(context, rooted_prototype,
+        "{{constant.idl_name}}", {{constant.value}},
+        JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT, NULL, NULL);
+    DCHECK(success);
+    success = JS_DefineProperty(context, rooted_interface_object,
+        "{{constant.idl_name}}", {{constant.value}},
+        JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT, NULL, NULL);
+    DCHECK(success);
+  }
+{% endfor %}
+{% endif %}
+
+  // Define interface object properties (excluding constants).
   success = JS_DefineProperties(context, rooted_interface_object,
                                 interface_object_properties);
   DCHECK(success);
+
   // Define interface object functions (static).
   success = JS_DefineFunctions(context, rooted_interface_object,
                                interface_object_functions);
diff --git a/src/cobalt/bindings/mozjs45/templates/macros.cc.template b/src/cobalt/bindings/mozjs45/templates/macros.cc.template
index f804251..446b596 100644
--- a/src/cobalt/bindings/mozjs45/templates/macros.cc.template
+++ b/src/cobalt/bindings/mozjs45/templates/macros.cc.template
@@ -196,11 +196,17 @@
   if (args.length() > {{loop.index0 + non_optional_arguments|length}}) {
     JS::RootedValue optional_value{{loop.index0}}(
         context, args[{{loop.index0 + non_optional_arguments|length}}]);
-    FromJSValue(context,
-                optional_value{{loop.index0}},
-                {{argument.conversion_flags}},
-                &exception_state,
-                &{{argument.name}});
+{% if argument.default_value %}
+    if (!optional_value{{loop.index0}}.isUndefined()) {
+{% else %}
+    {
+{% endif %}
+      FromJSValue(context,
+                  optional_value{{loop.index0}},
+                  {{argument.conversion_flags}},
+                  &exception_state,
+                  &{{argument.name}});
+    }
     if (exception_state.is_exception_set()) {
       return false;
     }
diff --git a/src/cobalt/bindings/v8c/templates/interface.cc.template b/src/cobalt/bindings/v8c/templates/interface.cc.template
index c2c9da6..2b29c85 100644
--- a/src/cobalt/bindings/v8c/templates/interface.cc.template
+++ b/src/cobalt/bindings/v8c/templates/interface.cc.template
@@ -395,17 +395,18 @@
 {% else %}
 void {{attribute.idl_name}}AttributeGetter(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-
-  script::v8c::shared_bindings::AttributeGetterImpl<{{impl_class}}, {{binding_class}}>(info,
+  script::v8c::shared_bindings::AttributeGetterImpl<{{impl_class}},
+                                                    {{binding_class}}>(
+                    info,
                     {{ "true" if attribute.is_static else "false"}},
                     {{ "true" if attribute.type == "void" else "false"}},
                     [](v8::Isolate* isolate, {{impl_class}}* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-    {{ get_cobalt_value(impl_class, attribute.type,
-                        attribute.getter_function_name, [],
-                        attribute.raises_exception, attribute.call_with,
-                        attribute.is_static) }}
+{{ get_cobalt_value(impl_class, attribute.type,
+                    attribute.getter_function_name, [],
+                    attribute.raises_exception, attribute.call_with,
+                    attribute.is_static) }}
   });
 }
 
diff --git a/src/cobalt/bindings/v8c/templates/macros.cc.template b/src/cobalt/bindings/v8c/templates/macros.cc.template
index 9566390..67b53cf 100644
--- a/src/cobalt/bindings/v8c/templates/macros.cc.template
+++ b/src/cobalt/bindings/v8c/templates/macros.cc.template
@@ -162,11 +162,17 @@
 {% endif %}
   if (info.Length() > {{loop.index0 + non_optional_arguments|length}}) {
     v8::Local<v8::Value> optional_value{{loop.index0}} = info[{{loop.index0 + non_optional_arguments|length}}];
-    FromJSValue(isolate,
-                optional_value{{loop.index0}},
-                {{argument.conversion_flags}},
-                &exception_state,
-                &{{argument.name}});
+{% if argument.default_value %}
+    if (!optional_value{{loop.index0}}->IsUndefined()) {
+{% else %}
+    {
+{% endif %}
+      FromJSValue(isolate,
+                  optional_value{{loop.index0}},
+                  {{argument.conversion_flags}},
+                  &exception_state,
+                  &{{argument.name}});
+    }
     if (exception_state.is_exception_set()) {
       return;
     }
@@ -294,8 +300,7 @@
 {% macro call_nonvoid_function(return_type, function_name, arguments,
                                impl_class, is_static) %}
   if (!exception_state.is_exception_set()) {
-
-  {{call_nonvoid_function_internal(function_name, arguments,
+{{call_nonvoid_function_internal(function_name, arguments,
                                 impl_class, is_static) -}}
   }
 {%- endmacro %}
@@ -308,7 +313,9 @@
 {%- endmacro %}
 
 {% macro get_impl_class_instance(impl_class) %}
-  {{impl_class}}* impl = script::v8c::shared_bindings::get_impl_from_object<{{impl_class}}>(object);
+  {{impl_class}}* impl =
+          script::v8c::shared_bindings::get_impl_from_object<
+             {{impl_class}}>(object);
   if (!impl) {
     return;
   }
diff --git a/src/cobalt/black_box_tests/README.md b/src/cobalt/black_box_tests/README.md
index 10ee071..d830906 100644
--- a/src/cobalt/black_box_tests/README.md
+++ b/src/cobalt/black_box_tests/README.md
@@ -35,6 +35,13 @@
      $ python path/to/black_box_tests.py --platform linux-x64x11 --config devel
        --test_name preload_font
 
+     You can apply --gtest_filter through --target_params, e.g.
+     $ python path/to/black_box_tests.py --platform linux-x64x11 --config devel
+       --test_name web_platform_tests
+       --target_params="--gtest_filter=fetch/*"
+
+     Note: When declaring a gtest_filter, it will override the filters defined
+     in GetWebPlatformTestFilters in configuration.py.
 
 ## Tests
 
diff --git a/src/cobalt/browser/browser_bindings_gen.gyp b/src/cobalt/browser/browser_bindings_gen.gyp
index 4d50786..29cbc9d 100644
--- a/src/cobalt/browser/browser_bindings_gen.gyp
+++ b/src/cobalt/browser/browser_bindings_gen.gyp
@@ -47,6 +47,8 @@
         '../cssom/style_sheet.idl',
         '../cssom/style_sheet_list.idl',
 
+        '../dom/abort_controller.idl',
+        '../dom/abort_signal.idl',
         '../dom/animation_event.idl',
         '../dom/attr.idl',
         '../dom/audio_track.idl',
@@ -174,6 +176,7 @@
         '../h5vcc/h5vcc_runtime_event_target.idl',
         '../h5vcc/h5vcc_settings.idl',
         '../h5vcc/h5vcc_sso.idl',
+        '../h5vcc/h5vcc_storage.idl',
         '../h5vcc/h5vcc_system.idl',
         '../h5vcc/h5vcc_trace_event.idl',
 
diff --git a/src/cobalt/browser/cobalt.gyp b/src/cobalt/browser/cobalt.gyp
index 5f11d1a..ec30b50 100644
--- a/src/cobalt/browser/cobalt.gyp
+++ b/src/cobalt/browser/cobalt.gyp
@@ -20,34 +20,17 @@
     {
       'target_name': 'cobalt',
       'type': '<(final_executable_type)',
+      'sources': [
+        'main.cc',
+      ],
+      'dependencies': [
+        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
+        '<(DEPTH)/net/net.gyp:net',
+      ],
       'conditions': [
-        ['sb_evergreen != 1', {
-          'sources': [
-            'main.cc',
-          ],
+        ['cobalt_splash_screen_file != ""', {
           'dependencies': [
-            '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-            '<(DEPTH)/net/net.gyp:net',
-          ],
-          'conditions': [
-            ['cobalt_splash_screen_file != ""', {
-              'dependencies': [
-                '<(DEPTH)/cobalt/browser/splash_screen/splash_screen.gyp:copy_splash_screen',
-              ],
-            }],
-          ],
-        }],
-        ['sb_evergreen == 1', {
-          'ldflags': [
-            '-Wl,--dynamic-list=<(DEPTH)/starboard/starboard.syms',
-            '-Wl,--whole-archive',
-            # TODO: Figure out how to take the gyp output from a variable.
-            'obj/starboard/linux/x64x11/evergreen/libstarboard_platform.a',
-            '-Wl,--no-whole-archive',
-          ],
-          'dependencies': [
-            '<(DEPTH)/cobalt/browser/cobalt.gyp:cobalt_evergreen',
-            '<(DEPTH)/starboard/starboard.gyp:starboard_full',
+            '<(DEPTH)/cobalt/browser/splash_screen/splash_screen.gyp:copy_splash_screen',
           ],
         }],
       ],
@@ -75,46 +58,6 @@
     },
   ],
   'conditions': [
-    ['sb_evergreen == 1', {
-      'targets': [
-        {
-          'target_name': 'cobalt_evergreen',
-          'type': 'shared_library',
-          'libraries/': [
-            ['exclude', '.*'],
-          ],
-          'dependencies': [
-            '<(DEPTH)/cobalt/base/base.gyp:base',
-            '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-            '<(DEPTH)/net/net.gyp:net',
-            '<(DEPTH)/starboard/common/common.gyp:common',
-          ],
-          'sources': [
-            'main.cc',
-          ],
-          'ldflags/': [
-            ['exclude', '-Wl,--wrap=eglSwapBuffers'],
-          ],
-          'conditions': [
-            ['clang and target_os not in ["tvos", "android", "orbis"] and sb_target_platform not in ["linux-x64x11-clang-3-6", "linux-x86x11"]', {
-              'dependencies': [
-                '<(DEPTH)/third_party/musl/musl.gyp:c',
-                '<(DEPTH)/third_party/llvm-project/compiler-rt/compiler-rt.gyp:compiler_rt',
-                '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind',
-                '<(DEPTH)/third_party/llvm-project/libcxxabi/libcxxabi.gyp:cxxabi',
-                '<(DEPTH)/third_party/llvm-project/libcxx/libcxx.gyp:cxx',
-              ],
-              'includes': [ '<(DEPTH)/cobalt/browser/cobalt_evergreen.gypi' ],
-            }],
-            ['cobalt_splash_screen_file != ""', {
-              'dependencies': [
-                '<(DEPTH)/cobalt/browser/splash_screen/splash_screen.gyp:copy_splash_screen',
-              ],
-            }],
-          ],
-        },
-      ]
-    }],
     ['build_snapshot_app_stats', {
       'targets': [
         {
diff --git a/src/cobalt/browser/cobalt_evergreen.gypi b/src/cobalt/browser/cobalt_evergreen.gypi
deleted file mode 100644
index 8809ec3..0000000
--- a/src/cobalt/browser/cobalt_evergreen.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'cflags!': [
-    # This flag makes the compilier complain warnings as errors.
-    '-Werror',
-  ],
-  'cflags': [
-    # We use -nostdlibinc instead of -nostdinc because even though we don't
-    # want the compiler to search the standard system directories for include
-    # files, we still want it to search in clang's builtin directories for
-    # include files.
-    '-nostdlibinc',
-    '-Wno-conversion',
-    '-Wno-bitwise-op-parentheses',
-    '-Wno-shift-op-parentheses',
-    '-Wno-shorten-64-to-32',
-    '-Wno-unused-command-line-argument',
-  ],
-  'cflags_cc': [
-    '-nostdinc++',
-    '-std=c++11',
-  ],
-  'ldflags': [
-    '-stdlib=libc++',
-    '-nostdlib',
-  ],
-  'defines' : [
-    # Ensure that the Starboardized __external_threading file is included.
-    '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-    '_LIBCPP_HAS_MUSL_LIBC',
-  ],
-}
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 40bce3c..43468e0 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -38,7 +38,6 @@
 #include "cobalt/browser/switches.h"
 #include "cobalt/browser/web_module_stat_tracker.h"
 #include "cobalt/css_parser/parser.h"
-#include "cobalt/debug/backend/debug_module.h"
 #include "cobalt/dom/blob.h"
 #include "cobalt/dom/csp_delegate_factory.h"
 #include "cobalt/dom/element.h"
@@ -69,6 +68,10 @@
 #include "starboard/accessibility.h"
 #include "starboard/common/log.h"
 
+#if defined(ENABLE_DEBUGGER)
+#include "cobalt/debug/backend/debug_module.h"
+#endif  // defined(ENABLE_DEBUGGER)
+
 namespace cobalt {
 namespace browser {
 
@@ -420,6 +423,12 @@
   base::WaitableEvent wait_for_web_debugger_finished_ = {
       base::WaitableEvent::ResetPolicy::MANUAL,
       base::WaitableEvent::InitialState::NOT_SIGNALED};
+
+  // Interface to report behaviour relevant to the web debugger.
+  debug::backend::DebuggerHooksImpl debugger_hooks_;
+#else
+  // Null implementation used in gold builds without checking ENABLE_DEBUGGER.
+  base::NullDebuggerHooks debugger_hooks_;
 #endif  // ENABLE_DEBUGGER
 
   // DocumentObserver that observes the loading document.
@@ -656,8 +665,9 @@
                  base::Unretained(this)),
       base::Bind(&WebModule::Impl::OnStopDispatchEvent, base::Unretained(this)),
       data.options.provide_screenshot_function, &synchronous_loader_interrupt_,
-      data.ui_nav_root, data.options.csp_insecure_allowed_token,
-      data.dom_max_element_depth, data.options.video_playback_rate_multiplier,
+      debugger_hooks_, data.ui_nav_root,
+      data.options.csp_insecure_allowed_token, data.dom_max_element_depth,
+      data.options.video_playback_rate_multiplier,
 #if defined(ENABLE_TEST_RUNNER)
       data.options.layout_trigger == layout::LayoutManager::kTestRunnerMode
           ? dom::Window::kClockTypeTestRunner
@@ -735,8 +745,9 @@
       new debug::backend::RenderOverlay(render_tree_produced_callback_));
 
   debug_module_.reset(new debug::backend::DebugModule(
-      window_->console(), global_environment_.get(), debug_overlay_.get(),
-      resource_provider_, window_, data.options.debugger_state));
+      &debugger_hooks_, window_->console(), global_environment_.get(),
+      debug_overlay_.get(), resource_provider_, window_,
+      data.options.debugger_state));
 #endif  // ENABLE_DEBUGGER
 
   is_running_ = true;
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index d86e0d5..92e701a 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-221987
\ No newline at end of file
+223212
\ No newline at end of file
diff --git a/src/cobalt/build/cobalt_configuration.py b/src/cobalt/build/cobalt_configuration.py
index eae97f9..ddb656e 100644
--- a/src/cobalt/build/cobalt_configuration.py
+++ b/src/cobalt/build/cobalt_configuration.py
@@ -136,6 +136,7 @@
         'layout_tests',
         'loader_test',
         'math_test',
+        'media_capture_test',
         'media_session_test',
         'media_stream_test',
         'memory_store_test',
diff --git a/src/cobalt/css_parser/grammar.y b/src/cobalt/css_parser/grammar.y
index 63f869d..798c4b6 100644
--- a/src/cobalt/css_parser/grammar.y
+++ b/src/cobalt/css_parser/grammar.y
@@ -5943,6 +5943,9 @@
     std::unique_ptr<FlexShorthand> flex(new FlexShorthand());
     flex->grow = new cssom::NumberValue($1);
     flex->shrink = new cssom::NumberValue($2);
+    // When omitted from the flex shorthand, flex-basis specified value is 0.
+    //  https://www.w3.org/TR/css-flexbox-1/#valdef-flex-flex-basis
+    flex->basis = new cssom::LengthValue(0, cssom::kPixelsUnit);
     $$ = flex.release();
   }
   | non_negative_number flex_basis_element {
diff --git a/src/cobalt/css_parser/parser_test.cc b/src/cobalt/css_parser/parser_test.cc
index fa1511c..fcdc5fb 100644
--- a/src/cobalt/css_parser/parser_test.cc
+++ b/src/cobalt/css_parser/parser_test.cc
@@ -5050,8 +5050,6 @@
   scoped_refptr<cssom::CSSDeclaredStyleData> style =
       parser_.ParseStyleDeclarationList("flex: 1 2;", source_location_);
 
-  // The keyword none expands to 0 0 auto.
-  //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-none
   ASSERT_TRUE(style->IsDeclared(cssom::kFlexGrowProperty));
   scoped_refptr<cssom::NumberValue> flex_grow =
       dynamic_cast<cssom::NumberValue*>(
@@ -5066,17 +5064,20 @@
   ASSERT_TRUE(flex_shrink);
   EXPECT_FLOAT_EQ(2, flex_shrink->value());
 
+  // When omitted from the flex shorthand, flex-basis specified value is 0.
+  //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-flex-basis
   ASSERT_TRUE(style->IsDeclared(cssom::kFlexBasisProperty));
-  EXPECT_EQ(cssom::KeywordValue::GetInitial(),
-            style->GetPropertyValue(cssom::kFlexBasisProperty));
+  scoped_refptr<cssom::LengthValue> flex_basis =
+      dynamic_cast<cssom::LengthValue*>(
+          style->GetPropertyValue(cssom::kFlexBasisProperty).get());
+  ASSERT_TRUE(flex_basis);
+  EXPECT_FLOAT_EQ(0, flex_basis->value());
 }
 
 TEST_F(ParserTest, ParsesFlexOneTwoZero) {
   scoped_refptr<cssom::CSSDeclaredStyleData> style =
       parser_.ParseStyleDeclarationList("flex: 1 2 0;", source_location_);
 
-  // The keyword none expands to 0 0 auto.
-  //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-none
   ASSERT_TRUE(style->IsDeclared(cssom::kFlexGrowProperty));
   scoped_refptr<cssom::NumberValue> flex_grow =
       dynamic_cast<cssom::NumberValue*>(
@@ -5103,8 +5104,6 @@
   scoped_refptr<cssom::CSSDeclaredStyleData> style =
       parser_.ParseStyleDeclarationList("flex: 0 100px;", source_location_);
 
-  // The keyword none expands to 0 0 auto.
-  //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-none
   ASSERT_TRUE(style->IsDeclared(cssom::kFlexGrowProperty));
   scoped_refptr<cssom::NumberValue> flex_grow =
       dynamic_cast<cssom::NumberValue*>(
@@ -5158,8 +5157,6 @@
   scoped_refptr<cssom::CSSDeclaredStyleData> style =
       parser_.ParseStyleDeclarationList("flex: 100px 0;", source_location_);
 
-  // The keyword none expands to 0 0 auto.
-  //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-none
   ASSERT_TRUE(style->IsDeclared(cssom::kFlexGrowProperty));
   scoped_refptr<cssom::NumberValue> flex_grow =
       dynamic_cast<cssom::NumberValue*>(
@@ -5184,8 +5181,6 @@
   scoped_refptr<cssom::CSSDeclaredStyleData> style =
       parser_.ParseStyleDeclarationList("flex: 100px 1 2;", source_location_);
 
-  // The keyword none expands to 0 0 auto.
-  //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-none
   ASSERT_TRUE(style->IsDeclared(cssom::kFlexGrowProperty));
   scoped_refptr<cssom::NumberValue> flex_grow =
       dynamic_cast<cssom::NumberValue*>(
diff --git a/src/cobalt/cssom/animation.h b/src/cobalt/cssom/animation.h
index 3d35a99..1880dae 100644
--- a/src/cobalt/cssom/animation.h
+++ b/src/cobalt/cssom/animation.h
@@ -31,10 +31,6 @@
 // animation references.
 class Animation {
  public:
-  // The enum IsCanceled is used as a flag to indicate if a removed animation
-  // is canceled or removed after finishing.
-  enum IsCanceled { kIsNotCanceled, kIsCanceled };
-
   // Determines how the animation should interact with the style before the
   // animation starts and after it ends.
   enum FillMode {
diff --git a/src/cobalt/cssom/animation_set.cc b/src/cobalt/cssom/animation_set.cc
index 9c1b426..751b72a 100644
--- a/src/cobalt/cssom/animation_set.cc
+++ b/src/cobalt/cssom/animation_set.cc
@@ -160,22 +160,21 @@
 
     // Create the animation and insert it into our map of currently active
     // animations.
-    InternalAnimationMap::iterator inserted =
-        animations_
-            .insert(std::make_pair(
-                name_string,
-                Animation(name_string, keyframes, current_time,
-                          GetTimeValue(i, style.animation_delay().get()),
-                          GetTimeValue(i, style.animation_duration().get()),
-                          GetFillMode(i, style.animation_fill_mode().get()),
-                          GetIterationCount(
-                              i, style.animation_iteration_count().get()),
-                          GetDirection(i, style.animation_direction().get()),
-                          GetTimingFunction(
-                              i, style.animation_timing_function().get()))))
-            .first;
+    InternalAnimationMap::iterator inserted = animations_.insert(
+        std::make_pair(
+            name_string,
+            AnimationEntry(Animation(name_string, keyframes, current_time,
+                GetTimeValue(i, style.animation_delay().get()),
+                GetTimeValue(i, style.animation_duration().get()),
+                GetFillMode(i, style.animation_fill_mode().get()),
+                GetIterationCount(
+                    i, style.animation_iteration_count().get()),
+                GetDirection(i, style.animation_direction().get()),
+                GetTimingFunction(
+                    i, style.animation_timing_function().get())))))
+        .first;
     if (event_handler_) {
-      event_handler_->OnAnimationStarted(inserted->second, this);
+      event_handler_->OnAnimationStarted(inserted->second.animation, this);
     }
 
     animations_modified = true;
@@ -185,28 +184,31 @@
   std::vector<std::string> animations_to_end;
   for (InternalAnimationMap::iterator iter = animations_.begin();
        iter != animations_.end(); ++iter) {
+    // If the animation is playing, but the current time is past the end time,
+    // then we should signal to the event handler that it has ended.
+    bool animation_has_ended =
+        current_time >= iter->second.animation.start_time() +
+                        iter->second.animation.duration();
+    if (animation_has_ended && !iter->second.ended) {
+      iter->second.ended = true;
+      if (event_handler_) {
+        event_handler_->OnAnimationEnded(iter->second.animation);
+      }
+    }
+
     // If the animation used to be playing, but it no longer appears in the
     // list of declared animations, then it has ended and we should mark it
     // as such.
     bool animation_is_removed = declared_animation_set.find(iter->first) ==
                                 declared_animation_set.end();
     if (animation_is_removed) {
+      if (event_handler_) {
+        event_handler_->OnAnimationRemoved(iter->second.animation);
+      }
       animations_to_end.push_back(iter->first);
     }
-
-    if (event_handler_) {
-      // If the animation is playing, but the current time is past the end time,
-      // then we should signal to the event handler that it has ended but is not
-      // canceled.
-      bool animation_has_ended =
-          current_time >= iter->second.start_time() + iter->second.duration();
-      if (animation_is_removed || animation_has_ended) {
-        event_handler_->OnAnimationRemoved(
-            iter->second, animation_has_ended ? cssom::Animation::kIsNotCanceled
-                                              : cssom::Animation::kIsCanceled);
-      }
-    }
   }
+
   if (!animations_to_end.empty()) {
     for (std::vector<std::string>::iterator iter = animations_to_end.begin();
          iter != animations_to_end.end(); ++iter) {
@@ -220,9 +222,10 @@
 }
 
 void AnimationSet::Clear() {
-  for (auto& animation : animations_) {
-    event_handler_->OnAnimationRemoved(animation.second,
-                                       cssom::Animation::kIsCanceled);
+  for (auto& iter : animations_) {
+    if (event_handler_) {
+      event_handler_->OnAnimationRemoved(iter.second.animation);
+    }
   }
   animations_.clear();
 }
diff --git a/src/cobalt/cssom/animation_set.h b/src/cobalt/cssom/animation_set.h
index ee5a005..081ab95 100644
--- a/src/cobalt/cssom/animation_set.h
+++ b/src/cobalt/cssom/animation_set.h
@@ -37,8 +37,8 @@
    public:
     virtual void OnAnimationStarted(const Animation& animation,
                                     AnimationSet* animation_set) = 0;
-    virtual void OnAnimationRemoved(const Animation& animation,
-                                    Animation::IsCanceled is_canceled) = 0;
+    virtual void OnAnimationEnded(const Animation& animation) = 0;
+    virtual void OnAnimationRemoved(const Animation& animation) = 0;
   };
 
   // Create an Animation with the specified EventHandler, whose methods will
@@ -62,7 +62,13 @@
  private:
   // Our internal collection of animations, mapping 'animation-name' to
   // a Animation object.
-  typedef std::map<std::string, Animation> InternalAnimationMap;
+  struct AnimationEntry {
+    explicit AnimationEntry(Animation&& in_animation)
+        : animation(std::move(in_animation)) {}
+    Animation animation;
+    bool ended = false;
+  };
+  typedef std::map<std::string, AnimationEntry> InternalAnimationMap;
 
   EventHandler* event_handler_;
   InternalAnimationMap animations_;
diff --git a/src/cobalt/debug/backend/debug_module.cc b/src/cobalt/debug/backend/debug_module.cc
index e1849a9..0a854a2 100644
--- a/src/cobalt/debug/backend/debug_module.cc
+++ b/src/cobalt/debug/backend/debug_module.cc
@@ -66,30 +66,33 @@
 
 }  // namespace
 
-DebugModule::DebugModule(dom::Console* console,
+DebugModule::DebugModule(DebuggerHooksImpl* debugger_hooks,
+                         dom::Console* console,
                          script::GlobalEnvironment* global_environment,
                          RenderOverlay* render_overlay,
                          render_tree::ResourceProvider* resource_provider,
                          dom::Window* window, DebuggerState* debugger_state) {
-  ConstructionData data(console, global_environment,
+  ConstructionData data(debugger_hooks, console, global_environment,
                         base::MessageLoop::current(), render_overlay,
                         resource_provider, window, debugger_state);
   Build(data);
 }
 
-DebugModule::DebugModule(dom::Console* console,
+DebugModule::DebugModule(DebuggerHooksImpl* debugger_hooks,
+                         dom::Console* console,
                          script::GlobalEnvironment* global_environment,
                          RenderOverlay* render_overlay,
                          render_tree::ResourceProvider* resource_provider,
                          dom::Window* window, DebuggerState* debugger_state,
                          base::MessageLoop* message_loop) {
-  ConstructionData data(console, global_environment, message_loop,
-                        render_overlay, resource_provider, window,
+  ConstructionData data(debugger_hooks, console, global_environment,
+                        message_loop, render_overlay, resource_provider, window,
                         debugger_state);
   Build(data);
 }
 
 DebugModule::~DebugModule() {
+  debugger_hooks_->DetachDebugger();
   if (!is_frozen_) {
     // Shutting down without navigating. Give everything a chance to cleanup by
     // freezing, but throw away the state.
@@ -140,6 +143,9 @@
       data.global_environment, script_debugger_.get(),
       base::Bind(&DebugModule::SendEvent, base::Unretained(this))));
 
+  debugger_hooks_ = data.debugger_hooks;
+  debugger_hooks_->AttachDebugger(script_debugger_.get());
+
   // Create render layers for the agents that need them and chain them
   // together. Ownership will be passed to the agent that uses each layer.
   // The layers will be painted in the reverse order they are listed here.
diff --git a/src/cobalt/debug/backend/debug_module.h b/src/cobalt/debug/backend/debug_module.h
index ccf942c..07bb642 100644
--- a/src/cobalt/debug/backend/debug_module.h
+++ b/src/cobalt/debug/backend/debug_module.h
@@ -19,11 +19,13 @@
 
 #include "base/message_loop/message_loop.h"
 #include "base/synchronization/waitable_event.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/debug/backend/console_agent.h"
 #include "cobalt/debug/backend/css_agent.h"
 #include "cobalt/debug/backend/debug_backend.h"
 #include "cobalt/debug/backend/debug_dispatcher.h"
 #include "cobalt/debug/backend/debug_script_runner.h"
+#include "cobalt/debug/backend/debugger_hooks_impl.h"
 #include "cobalt/debug/backend/debugger_state.h"
 #include "cobalt/debug/backend/dom_agent.h"
 #include "cobalt/debug/backend/log_agent.h"
@@ -51,14 +53,14 @@
 class DebugModule : public script::ScriptDebugger::Delegate {
  public:
   // Construct the debug dispatcher on the current message loop.
-  DebugModule(dom::Console* console,
+  DebugModule(DebuggerHooksImpl* debugger_hooks, dom::Console* console,
               script::GlobalEnvironment* global_environment,
               RenderOverlay* render_overlay,
               render_tree::ResourceProvider* resource_provider,
               dom::Window* window, DebuggerState* debugger_state);
 
   // Construct the debug dispatcher on the specified message loop.
-  DebugModule(dom::Console* console,
+  DebugModule(DebuggerHooksImpl* debugger_hooks, dom::Console* console,
               script::GlobalEnvironment* global_environment,
               RenderOverlay* render_overlay,
               render_tree::ResourceProvider* resource_provider,
@@ -80,13 +82,14 @@
   // Data used to construct an instance of this class that does not need to be
   // persisted.
   struct ConstructionData {
-    ConstructionData(dom::Console* console,
+    ConstructionData(DebuggerHooksImpl* debugger_hooks, dom::Console* console,
                      script::GlobalEnvironment* global_environment,
                      base::MessageLoop* message_loop,
                      RenderOverlay* render_overlay,
                      render_tree::ResourceProvider* resource_provider,
                      dom::Window* window, DebuggerState* debugger_state)
-        : console(console),
+        : debugger_hooks(debugger_hooks),
+          console(console),
           global_environment(global_environment),
           message_loop(message_loop),
           render_overlay(render_overlay),
@@ -94,6 +97,7 @@
           window(window),
           debugger_state(debugger_state) {}
 
+    DebuggerHooksImpl* debugger_hooks;
     dom::Console* console;
     script::GlobalEnvironment* global_environment;
     base::MessageLoop* message_loop;
@@ -123,6 +127,8 @@
 
   bool is_frozen_ = true;
 
+  DebuggerHooksImpl* debugger_hooks_ = nullptr;
+
   // Handles all debugging interaction with the JavaScript engine.
   std::unique_ptr<script::ScriptDebugger> script_debugger_;
 
diff --git a/src/cobalt/debug/backend/debugger_hooks_impl.cc b/src/cobalt/debug/backend/debugger_hooks_impl.cc
new file mode 100644
index 0000000..2ba4d2d
--- /dev/null
+++ b/src/cobalt/debug/backend/debugger_hooks_impl.cc
@@ -0,0 +1,62 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/debug/backend/debugger_hooks_impl.h"
+
+#include "cobalt/script/script_debugger.h"
+
+namespace cobalt {
+namespace debug {
+namespace backend {
+
+void DebuggerHooksImpl::AttachDebugger(
+    script::ScriptDebugger* script_debugger) {
+  script_debugger_ = script_debugger;
+}
+
+void DebuggerHooksImpl::DetachDebugger() {
+  if (script_debugger_) {
+    script_debugger_->AllAsyncTasksCanceled();
+  }
+  script_debugger_ = nullptr;
+}
+
+void DebuggerHooksImpl::AsyncTaskScheduled(void* task, const std::string& name,
+                                           bool recurring) const {
+  if (script_debugger_) {
+    script_debugger_->AsyncTaskScheduled(task, name, recurring);
+  }
+}
+
+void DebuggerHooksImpl::AsyncTaskStarted(void* task) const {
+  if (script_debugger_) {
+    script_debugger_->AsyncTaskStarted(task);
+  }
+}
+
+void DebuggerHooksImpl::AsyncTaskFinished(void* task) const {
+  if (script_debugger_) {
+    script_debugger_->AsyncTaskFinished(task);
+  }
+}
+
+void DebuggerHooksImpl::AsyncTaskCanceled(void* task) const {
+  if (script_debugger_) {
+    script_debugger_->AsyncTaskCanceled(task);
+  }
+}
+
+}  // namespace backend
+}  // namespace debug
+}  // namespace cobalt
diff --git a/src/cobalt/debug/backend/debugger_hooks_impl.h b/src/cobalt/debug/backend/debugger_hooks_impl.h
new file mode 100644
index 0000000..17a6115
--- /dev/null
+++ b/src/cobalt/debug/backend/debugger_hooks_impl.h
@@ -0,0 +1,54 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#ifndef COBALT_DEBUG_BACKEND_DEBUGGER_HOOKS_IMPL_H_
+#define COBALT_DEBUG_BACKEND_DEBUGGER_HOOKS_IMPL_H_
+
+#include <string>
+
+#include "cobalt/base/debugger_hooks.h"
+
+namespace cobalt {
+
+namespace script {
+class ScriptDebugger;
+}  // namespace script
+
+namespace debug {
+namespace backend {
+
+class DebugModule;
+
+class DebuggerHooksImpl : public base::DebuggerHooks {
+ public:
+  void AsyncTaskScheduled(void* task, const std::string& name,
+                          bool recurring) const override;
+  void AsyncTaskStarted(void* task) const override;
+  void AsyncTaskFinished(void* task) const override;
+  void AsyncTaskCanceled(void* task) const override;
+
+ private:
+  // Only DebugModule can attach/detach the debugger.
+  friend class backend::DebugModule;
+
+  void AttachDebugger(script::ScriptDebugger* script_debugger);
+  void DetachDebugger();
+
+  script::ScriptDebugger* script_debugger_ = nullptr;
+};
+
+}  // namespace backend
+}  // namespace debug
+}  // namespace cobalt
+
+#endif  // COBALT_DEBUG_BACKEND_DEBUGGER_HOOKS_IMPL_H_
diff --git a/src/cobalt/debug/debug.gyp b/src/cobalt/debug/debug.gyp
index a59acd7..059acf9 100644
--- a/src/cobalt/debug/debug.gyp
+++ b/src/cobalt/debug/debug.gyp
@@ -34,6 +34,8 @@
         'backend/debug_module.h',
         'backend/debug_script_runner.cc',
         'backend/debug_script_runner.h',
+        'backend/debugger_hooks_impl.cc',
+        'backend/debugger_hooks_impl.h',
         'backend/dom_agent.cc',
         'backend/dom_agent.h',
         'backend/log_agent.cc',
diff --git a/src/cobalt/dom/abort_controller.cc b/src/cobalt/dom/abort_controller.cc
new file mode 100644
index 0000000..546d5c4
--- /dev/null
+++ b/src/cobalt/dom/abort_controller.cc
@@ -0,0 +1,33 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/dom/abort_controller.h"
+
+namespace cobalt {
+namespace dom {
+
+AbortController::AbortController() {
+  abort_signal_ = new AbortSignal();
+}
+
+void AbortController::Abort() {
+  abort_signal_->SignalAbort();
+}
+
+void AbortController::TraceMembers(script::Tracer* tracer) {
+  tracer->Trace(abort_signal_);
+}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/abort_controller.h b/src/cobalt/dom/abort_controller.h
new file mode 100644
index 0000000..be273b0
--- /dev/null
+++ b/src/cobalt/dom/abort_controller.h
@@ -0,0 +1,46 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DOM_ABORT_CONTROLLER_H_
+#define COBALT_DOM_ABORT_CONTROLLER_H_
+
+#include "cobalt/dom/abort_signal.h"
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace dom {
+
+// This represents the DOM AbortController object.
+//    https://dom.spec.whatwg.org/#interface-abortcontroller
+class AbortController : public script::Wrappable {
+ public:
+  // Web API: AbortController
+  AbortController();
+
+  const scoped_refptr<AbortSignal>& signal() const { return abort_signal_; }
+  void Abort();
+
+  DEFINE_WRAPPABLE_TYPE(AbortController);
+  void TraceMembers(script::Tracer* tracer) override;
+
+ private:
+  scoped_refptr<AbortSignal> abort_signal_;
+
+  DISALLOW_COPY_AND_ASSIGN(AbortController);
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_ABORT_CONTROLLER_H_
diff --git a/src/cobalt/dom/abort_controller.idl b/src/cobalt/dom/abort_controller.idl
new file mode 100644
index 0000000..7612f56
--- /dev/null
+++ b/src/cobalt/dom/abort_controller.idl
@@ -0,0 +1,21 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://dom.spec.whatwg.org/#interface-abortcontroller
+
+[Constructor]
+interface AbortController {
+  [SameObject] readonly attribute AbortSignal signal;
+  void abort();
+};
diff --git a/src/cobalt/dom/abort_signal.cc b/src/cobalt/dom/abort_signal.cc
new file mode 100644
index 0000000..f313df3
--- /dev/null
+++ b/src/cobalt/dom/abort_signal.cc
@@ -0,0 +1,72 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/dom/abort_signal.h"
+
+#include "cobalt/dom/event.h"
+
+namespace cobalt {
+namespace dom {
+
+// https://dom.spec.whatwg.org/#abortsignal-follow
+void AbortSignal::Follow(const scoped_refptr<AbortSignal>& parent_signal) {
+  // 1. If followingSignal's aborted flag is set, then return.
+  if (aborted_) {
+    return;
+  }
+
+  if (!parent_signal) {
+    return;
+  }
+
+  // 2. If parentSignal's aborted flag is set, then signal abort on
+  //    followingSignal.
+  if (parent_signal->aborted()) {
+    SignalAbort();
+    return;
+  }
+
+  // 3. Otherwise, add the following abort steps to parentSignal:
+  //    a. Signal abort on followingSignal.
+  parent_signal->following_signals_.emplace_back(this);
+}
+
+// https://dom.spec.whatwg.org/#abortsignal-signal-abort
+void AbortSignal::SignalAbort() {
+  // 1. If signal's aborted flag is set, then return.
+  if (aborted_) {
+    return;
+  }
+
+  // 2. Set signal's aborted flag.
+  aborted_ = true;
+
+  // 3. For each algorithm in signal's abort algorithms: run algorithm.
+  for (auto& following_signal : following_signals_) {
+    following_signal->SignalAbort();
+  }
+
+  // 4. Empty signal's abort algorithms.
+  following_signals_.clear();
+
+  // 5. Fire an event named abort at signal.
+  DispatchEvent(new Event(base::Tokens::abort()));
+}
+
+void AbortSignal::TraceMembers(script::Tracer* tracer) {
+  tracer->TraceItems(following_signals_);
+}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/abort_signal.h b/src/cobalt/dom/abort_signal.h
new file mode 100644
index 0000000..69db444
--- /dev/null
+++ b/src/cobalt/dom/abort_signal.h
@@ -0,0 +1,64 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DOM_ABORT_SIGNAL_H_
+#define COBALT_DOM_ABORT_SIGNAL_H_
+
+#include <vector>
+
+#include "cobalt/base/tokens.h"
+#include "cobalt/dom/event_target.h"
+
+namespace cobalt {
+namespace dom {
+
+// This represents the DOM AbortSignal object.
+//    https://dom.spec.whatwg.org/#interface-AbortSignal
+class AbortSignal : public EventTarget {
+ public:
+  AbortSignal() {}
+
+  // Web API: AbortSignal
+  bool aborted() const { return aborted_; }
+  const EventListenerScriptValue* onabort() const {
+    return GetAttributeEventListener(base::Tokens::abort());
+  }
+  void set_onabort(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::abort(), event_listener);
+  }
+
+  // https://dom.spec.whatwg.org/#abortsignal-follow
+  void Follow(const scoped_refptr<AbortSignal>& parent_signal);
+
+  // Run the abort algorithms then trigger the abort event.
+  //   https://dom.spec.whatwg.org/#abortsignal-signal-abort
+  void SignalAbort();
+
+  DEFINE_WRAPPABLE_TYPE(AbortSignal);
+  void TraceMembers(script::Tracer* tracer) override;
+
+ private:
+  // Keep track of the signals following this abort signal. These will be
+  // traced to keep them alive and also signalled when this is signalled.
+  std::vector<scoped_refptr<AbortSignal>> following_signals_;
+
+  bool aborted_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(AbortSignal);
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_ABORT_SIGNAL_H_
diff --git a/src/cobalt/dom/abort_signal.idl b/src/cobalt/dom/abort_signal.idl
new file mode 100644
index 0000000..f11c1ea
--- /dev/null
+++ b/src/cobalt/dom/abort_signal.idl
@@ -0,0 +1,24 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://dom.spec.whatwg.org/#interface-AbortSignal
+
+interface AbortSignal : EventTarget {
+  readonly attribute boolean aborted;
+  attribute EventHandler onabort;
+
+  // Non-standard exposure of "follow" API to facilitate polyfills.
+  // https://dom.spec.whatwg.org/#abortsignal-follow
+  void follow(AbortSignal parentSignal);
+};
diff --git a/src/cobalt/dom/css_animations_adapter.cc b/src/cobalt/dom/css_animations_adapter.cc
index 02b3cb3..c886de6 100644
--- a/src/cobalt/dom/css_animations_adapter.cc
+++ b/src/cobalt/dom/css_animations_adapter.cc
@@ -192,37 +192,38 @@
   web_animation->Play();
 }
 
+void CSSAnimationsAdapter::OnAnimationEnded(
+    const cssom::Animation& css_animation) {
+  // An animation has entered the "after phase", so we should correspondingly
+  // fire the animationend event.
+  //   https://drafts.csswg.org/date/2015-03-02/web-animations-css-integration/#css-animations-events
+  // Cobalt assumes that the CSSOM does not change during computed style
+  // calculation. Post to dispatch the event asynchronously here to avoid
+  // calling event handlers during computed style calculation, which in turn
+  // may modify CSSOM and require restart of the computed style calculation.
+  animatable_->GetEventTarget()->PostToDispatchEvent(
+      FROM_HERE,
+      new AnimationEvent(
+          base::Tokens::animationend(), css_animation.name(),
+          static_cast<float>(css_animation.duration().InMillisecondsF() *
+                             css_animation.iteration_count())));
+}
+
 void CSSAnimationsAdapter::OnAnimationRemoved(
-    const cssom::Animation& css_animation,
-    cssom::Animation::IsCanceled is_canceled) {
+    const cssom::Animation& css_animation) {
   // If a CSS Animation is removed from an element, its corresponding
   // Web Animations animation should be stopped and removed also.
   AnimationMap::iterator found = animation_map_.find(css_animation.name());
-  if (animation_map_.end() != found) {
-    if (is_canceled == cssom::Animation::kIsNotCanceled) {
-      // An animation has entered the "after phase", so we should
-      // correspondingly fire the animationend event.
-      //   https://drafts.csswg.org/date/2015-03-02/web-animations-css-integration/#css-animations-events
-      // Cobalt assumes that the CSSOM does not change during computed style
-      // calculation. Post to dispatch the event asynchronously here to avoid
-      // calling event handlers during computed style calculation, which in turn
-      // may modify CSSOM and require restart of the computed style calculation.
-      animatable_->GetEventTarget()->PostToDispatchEvent(
-          FROM_HERE,
-          new AnimationEvent(
-              base::Tokens::animationend(), css_animation.name(),
-              static_cast<float>(css_animation.duration().InMillisecondsF() *
-                                 css_animation.iteration_count())));
-    }
+  DCHECK(animation_map_.end() != found);
 
-    found->second->animation->Cancel();
-    delete found->second;
-    animation_map_.erase(found);
-  }
+  found->second->animation->Cancel();
+  delete found->second;
+  animation_map_.erase(found);
 }
 
 void CSSAnimationsAdapter::HandleAnimationEnterAfterPhase(
     cssom::AnimationSet* animation_set) {
+  // The update processing handles signalling when an animation ends.
   DCHECK(animatable_->GetDefaultTimeline()->current_time());
   base::TimeDelta current_time = base::TimeDelta::FromMillisecondsD(
       animatable_->GetDefaultTimeline()->current_time().value_or(0));
diff --git a/src/cobalt/dom/css_animations_adapter.h b/src/cobalt/dom/css_animations_adapter.h
index 6c0b7df..2574e4e 100644
--- a/src/cobalt/dom/css_animations_adapter.h
+++ b/src/cobalt/dom/css_animations_adapter.h
@@ -44,8 +44,8 @@
   // From cssom::AnimationSet::EventHandler.
   void OnAnimationStarted(const cssom::Animation& css_animation,
                           cssom::AnimationSet* animation_set) override;
-  void OnAnimationRemoved(const cssom::Animation& css_animation,
-                          cssom::Animation::IsCanceled is_canceled) override;
+  void OnAnimationEnded(const cssom::Animation& css_animation) override;
+  void OnAnimationRemoved(const cssom::Animation& css_animation) override;
 
  private:
   // The AnimationWithEventHandler struct maintains a reference to the Animation
diff --git a/src/cobalt/dom/custom_event_test.cc b/src/cobalt/dom/custom_event_test.cc
index 119dcc3..1c12230 100644
--- a/src/cobalt/dom/custom_event_test.cc
+++ b/src/cobalt/dom/custom_event_test.cc
@@ -21,6 +21,7 @@
 #include "base/callback.h"
 #include "base/optional.h"
 #include "base/threading/platform_thread.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/custom_event_init.h"
@@ -86,7 +87,8 @@
         base::Closure() /* window_minimize */, NULL, NULL, NULL,
         dom::Window::OnStartDispatchEventCallback(),
         dom::Window::OnStopDispatchEventCallback(),
-        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL);
+        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL,
+        null_debugger_hooks_);
     global_environment_->CreateGlobalObject(window_,
                                             environment_settings_.get());
   }
@@ -105,6 +107,7 @@
   std::unique_ptr<loader::LoaderFactory> loader_factory_;
   dom::LocalStorageDatabase local_storage_database_;
   GURL url_;
+  base::NullDebuggerHooks null_debugger_hooks_;
   scoped_refptr<Window> window_;
 };
 
diff --git a/src/cobalt/dom/dom.gyp b/src/cobalt/dom/dom.gyp
index 569d9eb..e4a81eb 100644
--- a/src/cobalt/dom/dom.gyp
+++ b/src/cobalt/dom/dom.gyp
@@ -23,6 +23,10 @@
       'target_name': 'dom',
       'type': 'static_library',
       'sources': [
+        'abort_controller.h',
+        'abort_controller.cc',
+        'abort_signal.h',
+        'abort_signal.cc',
         'animation_event.h',
         'animation_frame_request_callback_list.cc',
         'animation_frame_request_callback_list.h',
diff --git a/src/cobalt/dom/dom_exception.cc b/src/cobalt/dom/dom_exception.cc
index e1a8129..85cc3a7 100644
--- a/src/cobalt/dom/dom_exception.cc
+++ b/src/cobalt/dom/dom_exception.cc
@@ -17,45 +17,72 @@
 namespace cobalt {
 namespace dom {
 namespace {
+
+// https://heycam.github.io/webidl/#dfn-error-names-table
+const char* kCodeToErrorName[] = {
+  "",
+  "IndexSizeError",
+  "DOMStringSizeError",
+  "HierarchyRequestError",
+  "WrongDocumentError",
+  "InvalidCharacterError",
+  "NoDataAllowedError",
+  "NoModificationAllowedError",
+  "NotFoundError",
+  "NotSupportedError",
+  "InUseAttributeError",
+  "InvalidStateError",
+  "SyntaxError",
+  "InvalidModificationError",
+  "NamespaceError",
+  "InvalidAccessError",
+  "ValidationError",
+  "TypeMismatchError",
+  "SecurityError",
+  "NetworkError",
+  "AbortError",
+  "URLMismatchError",
+  "QuotaExceededError",
+  "TimeoutError",
+  "InvalidNodeTypeError",
+  "DataCloneError",
+};
+
 const char* GetErrorName(DOMException::ExceptionCode code) {
+  // Use the table for errors that have a corresponding code.
+  static_assert(arraysize(kCodeToErrorName) ==
+                DOMException::kHighestErrCodeValue + 1,
+                "Mismatch number of entries in error table");
+  if (code <= DOMException::kHighestErrCodeValue) {
+    return kCodeToErrorName[code];
+  }
+
   // Error names are enumerated here:
   //   http://heycam.github.io/webidl/#idl-DOMException-error-names
   switch (code) {
-    case DOMException::kNone:
-      return "";
-    case DOMException::kIndexSizeErr:
-      return "IndexSizeError";
-    case DOMException::kInvalidCharacterErr:
-      return "InvalidCharacterError";
-    case DOMException::kNoModificationAllowedErr:
-      return "NoModificationAllowedError";
-    case DOMException::kNotFoundErr:
-      return "NotFoundError";
-    case DOMException::kNotSupportedErr:
-      return "NotSupportedError";
-    case DOMException::kInvalidStateErr:
-      return "InvalidStateError";
-    case DOMException::kSyntaxErr:
-      return "SyntaxError";
-    case DOMException::kInvalidAccessErr:
-      return "InvalidAccessError";
-    case DOMException::kTypeMismatchErr:
-      return "TypeMismatchError";
-    case DOMException::kSecurityErr:
-      return "SecurityError";
-    case DOMException::kQuotaExceededErr:
-      return "QuotaExceededError";
     case DOMException::kReadOnlyErr:
       return "ReadOnlyError";
     case DOMException::kInvalidPointerIdErr:
       return "InvalidPointerId";
     case DOMException::kNotAllowedErr:
       return "NotAllowedError";
+    default:
+      NOTREACHED();
+      break;
   }
-  NOTREACHED();
+
   return "";
 }
 
+DOMException::ExceptionCode GetErrorCode(const std::string& name) {
+  for (size_t i = 0; i < arraysize(kCodeToErrorName); ++i) {
+    if (name == kCodeToErrorName[i]) {
+      return static_cast<DOMException::ExceptionCode>(i);
+    }
+  }
+  return DOMException::kNone;
+}
+
 // The code attribute's getter must return the legacy code indicated in the
 // error names table for this DOMException object's name, or 0 if no such entry
 // exists in the table.
@@ -75,6 +102,11 @@
       name_(GetErrorName(code)),
       message_(message) {}
 
+DOMException::DOMException(const std::string& message, const std::string& name)
+    : code_(GetErrorCode(name)),
+      name_(name),
+      message_(message) {}
+
 // static
 void DOMException::Raise(ExceptionCode code,
                          script::ExceptionState* exception_state) {
diff --git a/src/cobalt/dom/dom_exception.h b/src/cobalt/dom/dom_exception.h
index 16f9748..5651525 100644
--- a/src/cobalt/dom/dom_exception.h
+++ b/src/cobalt/dom/dom_exception.h
@@ -27,24 +27,45 @@
  public:
   // List of exceptions and codes found here:
   //   http://heycam.github.io/webidl/#idl-DOMException-error-names
-  // Add more codes as Cobalt needs them.
   enum ExceptionCode {
     // If the error name does not have a corresponding code, set the code to 0.
     kNone = 0,
-    kIndexSizeErr = 1,
-    kInvalidCharacterErr = 5,
-    kNoModificationAllowedErr = 7,
-    kNotFoundErr = 8,
-    kNotSupportedErr = 9,
-    kInvalidStateErr = 11,
-    kSyntaxErr = 12,
-    kInvalidAccessErr = 15,
+
+    // These errors have legacy code values (corresponding to the enum).
+    kIndexSizeErr,                // Deprecated. Use RangeError instead.
+    kDomstringSizeErr,            // Deprecated. Use RangeError instead.
+    kHierarchyRequestErr,
+    kWrongDocumentErr,
+    kInvalidCharacterErr,
+    kNoDataAllowedErr,            // Deprecated.
+    kNoModificationAllowedErr,
+    kNotFoundErr,
+    kNotSupportedErr,
+    kInuseAttributeErr,
+    kInvalidStateErr,
+    kSyntaxErr,
+    kInvalidModificationErr,
+    kNamespaceErr,
+    // kInvalidAccessErr is Deprecated. Use TypeError for invalid arguments,
+    // "NotSupportedError" DOMException for unsupported operations, and
+    // "NotAllowedError" DOMException for denied requests instead.
+    kInvalidAccessErr,
+    kValidationErr,               // Deprecated.
     // Note that TypeMismatchErr is replaced by TypeError but we keep using it
     // to be in sync with Chrome.
-    kTypeMismatchErr = 17,
-    kSecurityErr = 18,
-    kQuotaExceededErr = 22,
-    kHighestErrCodeValue = kQuotaExceededErr,
+    kTypeMismatchErr,
+    kSecurityErr,
+    kNetworkErr,
+    kAbortErr,
+    kUrlMismatchErr,
+    kQuotaExceededErr,
+    kTimeoutErr,
+    kInvalidNodeTypeErr,
+    kDataCloneErr,
+
+    kHighestErrCodeValue = kDataCloneErr,
+
+    // These errors have no legacy code values. They will use code kNone.
     kReadOnlyErr,
     kInvalidPointerIdErr,
     kNotAllowedErr
@@ -52,6 +73,7 @@
 
   explicit DOMException(ExceptionCode code);
   DOMException(ExceptionCode code, const std::string& message);
+  DOMException(const std::string& message, const std::string& name);
 
   uint16 code() const { return static_cast<uint16>(code_); }
   std::string name() const override { return name_; }
diff --git a/src/cobalt/dom/dom_exception.idl b/src/cobalt/dom/dom_exception.idl
index 2ec24f2..b277104 100644
--- a/src/cobalt/dom/dom_exception.idl
+++ b/src/cobalt/dom/dom_exception.idl
@@ -14,6 +14,8 @@
 
 // http://heycam.github.io/webidl/#idl-DOMException
 
+[Constructor(optional DOMString message = "",
+             optional DOMString name = "Error")]
 exception DOMException {
   readonly attribute unsigned short code;
   readonly attribute DOMString name;
@@ -22,10 +24,28 @@
   // List of exceptions and codes found here:
   //   http://heycam.github.io/webidl/#idl-DOMException-error-names
   const unsigned short INDEX_SIZE_ERR = 1;
+  const unsigned short DOMSTRING_SIZE_ERR = 2;
+  const unsigned short HIERARCHY_REQUEST_ERR = 3;
+  const unsigned short WRONG_DOCUMENT_ERR = 4;
+  const unsigned short INVALID_CHARACTER_ERR = 5;
+  const unsigned short NO_DATA_ALLOWED_ERR = 6;
+  const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;
   const unsigned short NOT_FOUND_ERR = 8;
   const unsigned short NOT_SUPPORTED_ERR = 9;
+  const unsigned short INUSE_ATTRIBUTE_ERR = 10;
   const unsigned short INVALID_STATE_ERR = 11;
   const unsigned short SYNTAX_ERR = 12;
+  const unsigned short INVALID_MODIFICATION_ERR = 13;
+  const unsigned short NAMESPACE_ERR = 14;
   const unsigned short INVALID_ACCESS_ERR = 15;
+  const unsigned short VALIDATION_ERR = 16;
+  const unsigned short TYPE_MISMATCH_ERR = 17;
+  const unsigned short SECURITY_ERR = 18;
+  const unsigned short NETWORK_ERR = 19;
+  const unsigned short ABORT_ERR = 20;
+  const unsigned short URL_MISMATCH_ERR = 21;
   const unsigned short QUOTA_EXCEEDED_ERR = 22;
+  const unsigned short TIMEOUT_ERR = 23;
+  const unsigned short INVALID_NODE_TYPE_ERR = 24;
+  const unsigned short DATA_CLONE_ERR = 25;
 };
diff --git a/src/cobalt/dom/error_event_test.cc b/src/cobalt/dom/error_event_test.cc
index 82d0137..abf844b 100644
--- a/src/cobalt/dom/error_event_test.cc
+++ b/src/cobalt/dom/error_event_test.cc
@@ -21,6 +21,7 @@
 #include "base/callback.h"
 #include "base/optional.h"
 #include "base/threading/platform_thread.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/error_event_init.h"
@@ -87,7 +88,8 @@
         base::Closure() /* window_minimize */, NULL, NULL, NULL,
         dom::Window::OnStartDispatchEventCallback(),
         dom::Window::OnStopDispatchEventCallback(),
-        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL);
+        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL,
+        null_debugger_hooks_);
 
     global_environment_->CreateGlobalObject(window_,
                                             environment_settings_.get());
@@ -107,6 +109,7 @@
   std::unique_ptr<loader::LoaderFactory> loader_factory_;
   dom::LocalStorageDatabase local_storage_database_;
   GURL url_;
+  base::NullDebuggerHooks null_debugger_hooks_;
   scoped_refptr<Window> window_;
 };
 
diff --git a/src/cobalt/dom/on_screen_keyboard_test.cc b/src/cobalt/dom/on_screen_keyboard_test.cc
index c2d26e4..59e4260 100644
--- a/src/cobalt/dom/on_screen_keyboard_test.cc
+++ b/src/cobalt/dom/on_screen_keyboard_test.cc
@@ -19,6 +19,7 @@
 #include "base/callback.h"
 #include "base/optional.h"
 #include "base/threading/platform_thread.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/bindings/testing/utils.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/viewport_size.h"
@@ -225,7 +226,7 @@
             dom::Window::OnStartDispatchEventCallback(),
             dom::Window::OnStopDispatchEventCallback(),
             dom::ScreenshotManager::ProvideScreenshotFunctionCallback(),
-            NULL)) {
+            NULL, null_debugger_hooks_)) {
     global_environment_->CreateGlobalObject(window_,
                                             environment_settings_.get());
     on_screen_keyboard_bridge_->window_ = window_;
@@ -273,6 +274,7 @@
   std::unique_ptr<script::JavaScriptEngine> engine_;
   scoped_refptr<script::GlobalEnvironment> global_environment_;
   std::unique_ptr<OnScreenKeyboardMockBridge> on_screen_keyboard_bridge_;
+  base::NullDebuggerHooks null_debugger_hooks_;
   scoped_refptr<Window> window_;
 };
 
diff --git a/src/cobalt/dom/testing/stub_window.h b/src/cobalt/dom/testing/stub_window.h
index cb96c49..4e4964a 100644
--- a/src/cobalt/dom/testing/stub_window.h
+++ b/src/cobalt/dom/testing/stub_window.h
@@ -23,6 +23,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/optional.h"
 #include "base/threading/platform_thread.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/dom_settings.h"
@@ -76,7 +77,8 @@
         base::Closure() /* window_minimize */, NULL, NULL, NULL,
         dom::Window::OnStartDispatchEventCallback(),
         dom::Window::OnStopDispatchEventCallback(),
-        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL);
+        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL,
+        null_debugger_hooks_);
     environment_settings_ =
         environment_settings.get()
             ? std::move(environment_settings)
@@ -114,6 +116,7 @@
   std::unique_ptr<script::EnvironmentSettings> environment_settings_;
   std::unique_ptr<script::JavaScriptEngine> engine_;
   scoped_refptr<script::GlobalEnvironment> global_environment_;
+  base::NullDebuggerHooks null_debugger_hooks_;
   scoped_refptr<dom::Window> window_;
 };
 
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index 1925f64..d11d43d 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -130,6 +130,7 @@
     const ScreenshotManager::ProvideScreenshotFunctionCallback&
         screenshot_function_callback,
     base::WaitableEvent* synchronous_loader_interrupt,
+    const base::DebuggerHooks& debugger_hooks,
     const scoped_refptr<ui_navigation::NavItem>& ui_nav_root,
     int csp_insecure_allowed_token, int dom_max_element_depth,
     float video_playback_rate_multiplier, ClockType clock_type,
@@ -173,7 +174,8 @@
       ALLOW_THIS_IN_INITIALIZER_LIST(
           relay_on_load_event_(new RelayLoadEvent(this))),
       console_(new Console(execution_state)),
-      ALLOW_THIS_IN_INITIALIZER_LIST(window_timers_(new WindowTimers(this))),
+      ALLOW_THIS_IN_INITIALIZER_LIST(
+          window_timers_(new WindowTimers(this, debugger_hooks))),
       ALLOW_THIS_IN_INITIALIZER_LIST(animation_frame_request_callback_list_(
           new AnimationFrameRequestCallbackList(this))),
       crypto_(new Crypto()),
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h
index 341cd88..a824e37 100644
--- a/src/cobalt/dom/window.h
+++ b/src/cobalt/dom/window.h
@@ -27,6 +27,7 @@
 #include "base/timer/timer.h"
 #include "cobalt/base/application_state.h"
 #include "cobalt/base/clock.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/cssom/css_parser.h"
 #include "cobalt/cssom/css_style_declaration.h"
 #include "cobalt/cssom/viewport_size.h"
@@ -172,6 +173,7 @@
       const ScreenshotManager::ProvideScreenshotFunctionCallback&
           screenshot_function_callback,
       base::WaitableEvent* synchronous_loader_interrupt,
+      const base::DebuggerHooks& debugger_hooks,
       const scoped_refptr<ui_navigation::NavItem>& ui_nav_root = nullptr,
       int csp_insecure_allowed_token = 0, int dom_max_element_depth = 0,
       float video_playback_rate_multiplier = 1.f,
diff --git a/src/cobalt/dom/window_test.cc b/src/cobalt/dom/window_test.cc
index 3f4592f..80bc5c6 100644
--- a/src/cobalt/dom/window_test.cc
+++ b/src/cobalt/dom/window_test.cc
@@ -21,6 +21,7 @@
 #include "base/callback.h"
 #include "base/message_loop/message_loop.h"
 #include "base/optional.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/local_storage_database.h"
@@ -74,7 +75,8 @@
         base::Closure() /* window_minimize */, NULL, NULL, NULL,
         dom::Window::OnStartDispatchEventCallback(),
         dom::Window::OnStopDispatchEventCallback(),
-        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL);
+        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL,
+        null_debugger_hooks_);
   }
 
   ~WindowTest() override {}
@@ -88,6 +90,7 @@
   std::unique_ptr<script::JavaScriptEngine> engine_;
   scoped_refptr<script::GlobalEnvironment> global_environment_;
   GURL url_;
+  base::NullDebuggerHooks null_debugger_hooks_;
   scoped_refptr<Window> window_;
 };
 
diff --git a/src/cobalt/dom/window_timers.cc b/src/cobalt/dom/window_timers.cc
index 368273a..dd88196 100644
--- a/src/cobalt/dom/window_timers.cc
+++ b/src/cobalt/dom/window_timers.cc
@@ -43,6 +43,7 @@
                             base::Unretained(this), handle));
     timers_[handle] = new TimerInfo(
         owner_, std::unique_ptr<base::internal::TimerBase>(timer), handler);
+    debugger_hooks_.AsyncTaskScheduled(timers_[handle], "SetTimeout");
   } else {
     timers_[handle] = nullptr;
   }
@@ -68,6 +69,7 @@
                             base::Unretained(this), handle));
     timers_[handle] = new TimerInfo(
         owner_, std::unique_ptr<base::internal::TimerBase>(timer), handler);
+    debugger_hooks_.AsyncTaskScheduled(timers_[handle], "SetInterval");
   } else {
     timers_[handle] = nullptr;
   }
@@ -75,14 +77,26 @@
   return handle;
 }
 
-void WindowTimers::ClearInterval(int handle) { timers_.erase(handle); }
+void WindowTimers::ClearInterval(int handle) {
+  Timers::iterator timer = timers_.find(handle);
+  if (timer != timers_.end()) {
+    debugger_hooks_.AsyncTaskCanceled(timer->second);
+    timers_.erase(timer);
+  }
+}
 
-void WindowTimers::ClearAllIntervalsAndTimeouts() { timers_.clear(); }
+void WindowTimers::ClearAllIntervalsAndTimeouts() {
+  for (auto& timer_entry : timers_) {
+    debugger_hooks_.AsyncTaskCanceled(timer_entry.second);
+  }
+  timers_.clear();
+}
 
 void WindowTimers::DisableCallbacks() {
   callbacks_active_ = false;
   // Immediately cancel any pending timers.
   for (auto& timer_entry : timers_) {
+    debugger_hooks_.AsyncTaskCanceled(timer_entry.second);
     timer_entry.second = nullptr;
   }
 }
@@ -117,16 +131,21 @@
   // The callback is now being run. Track it in the global stats.
   GlobalStats::GetInstance()->StartJavaScriptEvent();
 
-  // 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();
+  {
+    // Keep a |TimerInfo| reference, so it won't be released when running the
+    // callback.
+    scoped_refptr<TimerInfo> timer_info = timer->second;
+    base::ScopedAsyncTask async_task(debugger_hooks_, timer_info);
+    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);
   // If the timer is not deleted and is not running, it means it is an oneshot
   // timer and has just fired the shot, and it should be deleted now.
   if (timer != timers_.end() && !timer->second->timer()->IsRunning()) {
+    debugger_hooks_.AsyncTaskCanceled(timer->second);
     timers_.erase(timer);
   }
 
diff --git a/src/cobalt/dom/window_timers.h b/src/cobalt/dom/window_timers.h
index 884ac90..73bec1f 100644
--- a/src/cobalt/dom/window_timers.h
+++ b/src/cobalt/dom/window_timers.h
@@ -20,6 +20,7 @@
 #include "base/containers/hash_tables.h"
 #include "base/memory/ref_counted.h"
 #include "base/timer/timer.h"
+#include "cobalt/base/debugger_hooks.h"
 #include "cobalt/script/callback_function.h"
 #include "cobalt/script/script_value.h"
 #include "cobalt/script/wrappable.h"
@@ -31,8 +32,11 @@
  public:
   typedef script::CallbackFunction<void()> TimerCallback;
   typedef script::ScriptValue<TimerCallback> TimerCallbackArg;
-  explicit WindowTimers(script::Wrappable* const owner)
-      : current_timer_index_(0), owner_(owner) {}
+  explicit WindowTimers(script::Wrappable* const owner,
+                        const base::DebuggerHooks& debugger_hooks)
+      : current_timer_index_(0),
+        owner_(owner),
+        debugger_hooks_(debugger_hooks) {}
   ~WindowTimers() {}
 
   int SetTimeout(const TimerCallbackArg& handler, int timeout);
@@ -82,6 +86,7 @@
   Timers timers_;
   int current_timer_index_;
   script::Wrappable* const owner_;
+  const base::DebuggerHooks& debugger_hooks_;
 
   // Set to false when we're about to shutdown, to ensure that no new JavaScript
   // is fired as we are waiting for it to drain.
diff --git a/src/cobalt/fetch/embedded_scripts/fetch.js b/src/cobalt/fetch/embedded_scripts/fetch.js
index c32ecaf..ac5a7a3 100644
--- a/src/cobalt/fetch/embedded_scripts/fetch.js
+++ b/src/cobalt/fetch/embedded_scripts/fetch.js
@@ -1,24 +1,22 @@
-'use strict';(function(d){function I(a){"string"!==typeof a&&(a=String(a));if(/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(a))throw new g("Invalid character in header field name");return a.toLowerCase()}function V(a){"string"!==typeof a&&(a=String(a));var b;var c=0;for(b=a.length;c<b;c++){var e=a.charCodeAt(c);if(9!==e&&10!==e&&13!==e&&32!==e)break}for(b=a.length-1;b>c&&(e=a.charCodeAt(b),9===e||10===e||13===e||32===e);b--);a=a.substring(c,b+1);c=0;for(b=a.length;c<b;c++)if(e=a.charCodeAt(c),256<=e||0===e||
-10===e||13===e)throw new g("Invalid character in header field value");return a}function da(a,b){throw new g("Immutable header cannot be modified");}function ea(a,b){return!1}function fa(a,b){a=a.toLowerCase();return-1<ha.indexOf(a)||a.startsWith("proxy-")||a.startsWith("sec-")?!0:!1}function ia(a,b){a=a.toLowerCase();return-1<ja.indexOf(a)||"content-type"===a&&(b=b.split(";")[0].toLowerCase(),-1<ka.indexOf(b))?!1:!0}function R(a,b){return-1<la.indexOf(a.toLowerCase())?!0:!1}function h(a){this[k]=
-new O;void 0===this[z]&&(this[z]=ea);if(void 0!==a){if(null===a||"object"!==typeof a)throw new g("Constructing Headers with invalid parameters");a instanceof h?a.forEach(function(a,c){this.append(c,a)},this):J.isArray(a)?a.forEach(function(a){if(2!==a.length)throw new g("Constructing Headers with invalid parameters");this.append(a[0],a[1])},this):Object.getOwnPropertyNames(a).forEach(function(b){this.append(b,a[b])},this)}}function K(a,b){var c=ma(h.prototype);c[z]=b;h.call(c,a);return c}function S(a){if(a.bodyUsed)return t.reject(new g("Body was already read"));
-if(null===a.body)return t.resolve(new y(0));if(na(a.body))return t.reject(new g("ReadableStream was already locked"));var b=a.body.getReader(),c=[],e=0;return b.read().then(function oa(a){if(a.done){if(0===c.length)a=new y(0);else if(1===c.length)a=new y(c[0].buffer);else{a=new y(e);for(var d=0,f=c.length,h=0;d<f;d++)a.set(c[d],h),h+=c[d].length}return a}return a.value instanceof y?(e+=a.value.length,c.push(a.value),b.read().then(oa)):t.reject(new g("Invalid stream data type"))})}function W(){this._initBody=
-function(a){this[T]=!1;this[n]=null===a||void 0===a?null:a instanceof U?a:new U({start:function(b){if(a)if("string"===typeof a)b.enqueue(FetchInternal.encodeToUTF8(a));else if(X.prototype.isPrototypeOf(a))b.enqueue(new y(a.slice(0)));else if(pa(a))b.enqueue(new y(a.buffer.slice(0)));else if(a instanceof Blob)b.enqueue(new y(FetchInternal.blobToArrayBuffer(a)));else throw new g("Unsupported BodyInit type");b.close()}});this[q].get("content-type")||("string"===typeof a?this[q].set("content-type","text/plain;charset=UTF-8"):
-a instanceof Blob&&""!==a.type&&this[q].set("content-type",a.type))};L(this,{body:{get:function(){return this[n]}},bodyUsed:{get:function(){return this[T]?!0:this[n]?!!qa(this[n]):!1}}});this.arrayBuffer=function(){return this[D]?t.reject(new w):S(this).then(function(a){return a.buffer})};this.text=function(){return this[D]?t.reject(new w):S(this).then(function(a){return FetchInternal.decodeFromUTF8(a)})};this.json=function(){return this[D]?t.reject(new w):this.text().then(JSON.parse)};return this}
-function m(a){var b=this;this[E]=null;a instanceof m?(this[E]=a.onabort,this[M]=a[M],this[r]=a[r]):(this[M]={is_aborted:!1},this[r]={});L(this,{aborted:{get:function(){return b[M].is_aborted}},onabort:{get:function(){return b[E]},set:function(a){return b[E]=a}}})}function A(a,b){var c=void 0!==b&&null!==b&&void 0===b.cloneBody;b=b||{};var e=b.body||b.cloneBody,d=b.headers;if(a instanceof A)this[B]=a.url,this[F]=a.cache,this[G]=a.credentials,void 0===d&&(d=a.headers),this[H]=a.integrity,this[C]=a.method,
-this[p]=a.mode,c&&"navigate"===this[p]&&(this[p]="same-origin"),this[N]=a.redirect,e||null===a.body||(e=a.body,a[T]=!0),this[u]="signal"in b&&null==b.signal?new m:"signal"in b?b.signal:a[u];else{this[B]=String(a);if(!FetchInternal.isUrlValid(this[B],!1))throw new g("Invalid request URL");this[p]="cors";this[G]="same-origin";this[u]=b.signal&&null!=b.signal?new m(b.signal):new m}if(void 0!==b.window&&null!==b.window)throw new g("Invalid request window");this[F]=b.cache||this[F]||"default";if(-1===
-ra.indexOf(this[F]))throw new g("Invalid request cache mode");this[G]=b.credentials||this[G]||"same-origin";if(-1===sa.indexOf(this[G]))throw new g("Invalid request credentials");void 0!==b.integrity?this[H]=b.integrity:void 0===this[H]&&(this[H]="");a=(b.method||this[C]||"GET").toUpperCase();if(-1===ta.indexOf(a))throw new g("Invalid request method");this[C]=a;if(b.mode&&-1===ua.indexOf(b.mode))throw new g("Invalid request mode");this[p]=b.mode||this[p]||"no-cors";if("no-cors"===this[p]){if(-1===
-va.indexOf(this[C]))throw new g("Invalid request method for no-cors");if(""!==this[H])throw new g("Request integrity data is not allowed with no-cors");}if("same-origin"!==this[p]&&"only-if-cached"===this[F])throw new g("Request mode must be same-origin for only-if-cached");this[N]=b.redirect||this[N]||"follow";if(-1===wa.indexOf(this[N]))throw new g("Invalid request redirect mode");this[q]="no-cors"===this[p]?K(d,ia):K(d,fa);if(("GET"===this[C]||"HEAD"===this[C])&&e)throw new g("Request body is not allowed for GET or HEAD");
-this._initBody(e)}function xa(a,b){var c=K(void 0,b);a.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(a){var b=a.split(":");if(a=b.shift().trim())b=b.join(":").trim(),c.append(a,b)});return c}function v(a,b){b||(b={});this[P]="default";this[x]="status"in b?b.status:200;if(200>this[x]||599<this[x])throw new Y("Invalid response status");this[Z]=200<=this[x]&&300>this[x];if("statusText"in b){var c=b.statusText;for(var e=0,d=c.length,f;e<d;e++)if(f=c.charCodeAt(e),9!==f&&(32>f||255<f||127===
-f))throw g("Invalid response status text");}else c="OK";this[Q]=c;this[q]=K(b.headers,R);this[B]=b.url||"";if(a&&-1<ya.indexOf(this[x]))throw new g("Response body is not allowed with a null body status");this[D]=b.is_aborted||!1;this._initBody(a)}function aa(){ba(this,"signal",{value:new m,writable:!1})}if(!d.fetch){var J=d.Array,X=d.ArrayBuffer,ma=d.Object.create,L=d.Object.defineProperties,ba=d.Object.defineProperty,f=d.Symbol,za=f.iterator,O=d.Map,Y=d.RangeError,g=d.TypeError,y=d.Uint8Array,t=
-d.Promise,U=d.ReadableStream,ca=d.ReadableStreamTee,qa=d.IsReadableStreamDisturbed,na=d.IsReadableStreamLocked,n=f("body"),T=f("bodyUsed"),F=f("cache"),G=f("credentials"),z=f("guardCallback"),q=f("headers"),H=f("integrity"),k=f("map"),C=f("method"),p=f("mode"),Z=f("ok"),N=f("redirect"),x=f("status"),Q=f("statusText"),P=f("type"),B=f("url"),D=f("is_aborted"),u=f("signal"),E=f("onabort"),M=f("abort_hash"),r=f("listeners"),ha="accept-charset accept-encoding access-control-request-headers access-control-request-method connection content-length cookie cookie2 date dnt expect host keep-alive origin referer te trailer transfer-encoding upgrade via".split(" "),
-la=["set-cookie","set-cookie2"],ja=["accept","accept-language","content-language"],ka=["application/x-www-form-urlencoded","multipart/form-data","text/plain"],ra="default no-store reload no-cache force-cache only-if-cached".split(" "),sa=["omit","same-origin","include"],ta="DELETE GET HEAD OPTIONS POST PUT".split(" "),va=["GET","HEAD","POST"],ua=["same-origin","no-cors","cors"],wa=["follow","error","manual"],ya=[101,204,205,304],Aa=[301,302,303,307,308],Ba="[object Int8Array];[object Uint8Array];[object Uint8ClampedArray];[object Int16Array];[object Uint16Array];[object Int32Array];[object Uint32Array];[object Float32Array];[object Float64Array]".split(";"),
-pa=X.isView||function(a){return a&&-1<Ba.indexOf(Object.prototype.toString.call(a))},w=function(){L(this,{message:{value:"Aborted",writable:!1},name:{value:"AbortError",writable:!1},code:{value:20,writable:!1}})};w.prototype.constructor=w;h.prototype.append=function(a,b){if(2!==arguments.length)throw g("Invalid parameters to append");a=I(a);b=V(b);this[z](a,b)||(this[k].has(a)?this[k].set(a,this[k].get(a)+", "+b):this[k].set(a,b))};h.prototype["delete"]=function(a){if(1!==arguments.length)throw g("Invalid parameters to delete");
-this[z](a,"invalid")||this[k].delete(I(a))};h.prototype.get=function(a){if(1!==arguments.length)throw g("Invalid parameters to get");a=I(a);var b=this[k].get(a);return void 0!==b?b:null};h.prototype.has=function(a){if(1!==arguments.length)throw g("Invalid parameters to has");return this[k].has(I(a))};h.prototype.set=function(a,b){if(2!==arguments.length)throw g("Invalid parameters to set");a=I(a);b=V(b);this[z](a,b)||this[k].set(a,b)};h.prototype.forEach=function(a,b){var c=this;J.from(this[k].entries()).sort().forEach(function(e){a.call(b,
-e[1],e[0],c)})};h.prototype.keys=function(){return(new O(J.from(this[k].entries()).sort())).keys()};h.prototype.values=function(){return(new O(J.from(this[k].entries()).sort())).values()};h.prototype.entries=function(){return(new O(J.from(this[k].entries()).sort())).entries()};h.prototype[za]=h.prototype.entries;m.prototype.constructor=m;m.prototype.dispatchEvent=function(a){"abort"===a.type&&(this[M].is_aborted=!0,"function"===typeof this[E]&&this[E].call(this,a));if(a.type in this[r]){for(var b=
-this[r][a.type],c=b.length-1;0<=c;c--)b[c].call(this,a);return!a.defaultPrevented}};m.prototype.addEventListener=function(a,b){a in this[r]||(this[r][a]=[]);this[r][a].push(b)};m.prototype.removeEventListener=function(a,b){if(a in this[r]){a=this[r][type];for(var c=0,e=a.length;c<e;c++)if(a[c]===b){a.splice(c,1);break}}};m.prototype.clone=function(){return new m(this)};d.AbortSignal=m;A.prototype.clone=function(){var a=null;null!==this[n]&&(a=ca(this[n],!0),this[n]=a[0],a=a[1]);return new A(this,
-{cloneBody:a,signal:this[u].clone()})};L(A.prototype,{cache:{get:function(){return this[F]}},credentials:{get:function(){return this[G]}},headers:{get:function(){return this[q]}},integrity:{get:function(){return this[H]}},method:{get:function(){return this[C]}},mode:{get:function(){return this[p]}},redirect:{get:function(){return this[N]}},url:{get:function(){return this[B]}},signal:{get:function(){return this[u]}}});W.call(A.prototype);W.call(v.prototype);v.prototype.clone=function(){var a=null;
-null!==this[n]&&(a=ca(this[n],!0),this[n]=a[0],a=a[1]);return new v(a,{status:this[x],statusText:this[Q],headers:K(this[q],R),url:this[B],is_aborted:this[D]})};L(v.prototype,{headers:{get:function(){return this[q]}},ok:{get:function(){return this[Z]}},status:{get:function(){return this[x]}},statusText:{get:function(){return this[Q]}},type:{get:function(){return this[P]}},url:{get:function(){return this[B]}}});v.error=function(){var a=new v(null);a[q][z]=da;a[P]="error";a[x]=0;a[Q]="";return a};v.redirect=
-function(a,b){if(!FetchInternal.isUrlValid(a,!0))throw new g("Invalid URL for response redirect");void 0===b&&(b=302);if(-1===Aa.indexOf(b))throw new Y("Invalid status code for response redirect");return new v(null,{status:b,headers:{location:a}})};d.Headers=h;d.Request=A;d.Response=v;d.fetch=function(a,b){return new t(function(c,e){var d=!1,f=!1,h=new A(a,b),l=new XMLHttpRequest,k=null;if(h.signal.aborted)return e(new w);var m=new U({start:function(a){k=a},cancel:function(a){d=!0;l.abort()}}),n=
-function(){if(!d){d=!0;m.cancel();if(k)try{k.close()}catch(Ca){}setTimeout(function(){try{l.abort()}catch(Ca){}},0)}},r=m.getReader;m.getReader=function(){var a=r.bind(this).call(),b=a.read,c=a.closed;a.read=function(){return h[u]&&h[u].aborted?(n(),t.reject(new w)):b.bind(this).call()};ba(a,"closed",{get:function(){return h[u]&&h[u].aborted?(n(),t.reject(new w)):c}});return a};l.onload=function(){k.close()};l.onreadystatechange=function(){if(l.readyState===l.HEADERS_RECEIVED){var a={status:l.status,
-statusText:l.statusText,headers:xa(l.getAllResponseHeaders()||"",R)};a.url="responseURL"in l?l.responseURL:a.headers.get("X-Request-URL");try{var b=new v(m,a);h[u].addEventListener("abort",function(){b[D]=!0;n();e(new w)});b[P]=f?"cors":"basic";c(b)}catch(Da){e(Da)}}};l.onerror=function(){k.error(new g("Network request failed"));e(new g("Network request failed"))};l.ontimeout=function(){k.error(new g("Network request failed"));e(new g("Network request failed"))};l.open(h.method,h.url,!0);"include"===
-h.credentials&&(l.withCredentials=!0);h.headers.forEach(function(a,b){l.setRequestHeader(b,a)});var p=function(a){d||k.enqueue(a)},q=function(a){f=a};null===h.body?l.fetch(p,q,null):S(h).then(function(a){l.fetch(p,q,a)})})};aa.prototype.abort=function(){this.signal.dispatchEvent(new Event("abort"))};d.AbortController=aa;d.fetch.polyfill=!0}})(this);
\ No newline at end of file
+'use strict';(function(c){function E(a){"string"!==typeof a&&(a=String(a));if(/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(a))throw new g("Invalid character in header field name");return a.toLowerCase()}function Q(a){"string"!==typeof a&&(a=String(a));var b;var d=0;for(b=a.length;d<b;d++){var e=a.charCodeAt(d);if(9!==e&&10!==e&&13!==e&&32!==e)break}for(b=a.length-1;b>d&&(e=a.charCodeAt(b),9===e||10===e||13===e||32===e);b--);a=a.substring(d,b+1);d=0;for(b=a.length;d<b;d++)if(e=a.charCodeAt(d),256<=e||0===e||
+10===e||13===e)throw new g("Invalid character in header field value");return a}function W(a,b){throw new g("Immutable header cannot be modified");}function X(a,b){return!1}function Y(a,b){a=a.toLowerCase();return-1<Z.indexOf(a)||a.startsWith("proxy-")||a.startsWith("sec-")?!0:!1}function aa(a,b){a=a.toLowerCase();return-1<ba.indexOf(a)||"content-type"===a&&(b=b.split(";")[0].toLowerCase(),-1<ca.indexOf(b))?!1:!0}function L(a,b){return-1<da.indexOf(a.toLowerCase())?!0:!1}function h(a){this[l]=new I;
+void 0===this[v]&&(this[v]=X);if(void 0!==a){if(null===a||"object"!==typeof a)throw new g("Constructing Headers with invalid parameters");a instanceof h?a.forEach(function(a,d){this.append(d,a)},this):F.isArray(a)?a.forEach(function(a){if(2!==a.length)throw new g("Constructing Headers with invalid parameters");this.append(a[0],a[1])},this):Object.getOwnPropertyNames(a).forEach(function(b){this.append(b,a[b])},this)}}function G(a,b){var d=ea(h.prototype);d[v]=b;h.call(d,a);return d}function M(a){if(a.bodyUsed)return t.reject(new g("Body was already read"));
+if(null===a.body)return t.resolve(new u(0));if(fa(a.body))return t.reject(new g("ReadableStream was already locked"));var b=a.body.getReader(),d=[],e=0;return b.read().then(function ha(a){if(a.done){if(0===d.length)a=new u(0);else if(1===d.length)a=new u(d[0].buffer);else{a=new u(e);for(var k=0,c=d.length,f=0;k<c;k++)a.set(d[k],f),f+=d[k].length}return a}return a.value instanceof u?(e+=a.value.length,d.push(a.value),b.read().then(ha)):t.reject(new g("Invalid stream data type"))})}function R(){this._initBody=
+function(a){this[N]=!1;this[m]=null===a||void 0===a?null:a instanceof O?a:new O({start:function(b){if(a)if("string"===typeof a)b.enqueue(FetchInternal.encodeToUTF8(a));else if(S.prototype.isPrototypeOf(a))b.enqueue(new u(a.slice(0)));else if(ia(a))b.enqueue(new u(a.buffer.slice(0)));else if(a instanceof Blob)b.enqueue(new u(FetchInternal.blobToArrayBuffer(a)));else throw new g("Unsupported BodyInit type");b.close()}});this[n].get("content-type")||("string"===typeof a?this[n].set("content-type","text/plain;charset=UTF-8"):
+a instanceof Blob&&""!==a.type&&this[n].set("content-type",a.type))};P(this,{body:{get:function(){return this[m]}},bodyUsed:{get:function(){return this[N]?!0:this[m]?!!ja(this[m]):!1}}});this.arrayBuffer=function(){return this[z]?t.reject(new DOMException("Aborted","AbortError")):M(this).then(function(a){return a.buffer})};this.text=function(){return this[z]?t.reject(new DOMException("Aborted","AbortError")):M(this).then(function(a){return FetchInternal.decodeFromUTF8(a)})};this.json=function(){return this[z]?
+t.reject(new DOMException("Aborted","AbortError")):this.text().then(JSON.parse)};return this}function w(a,b){var d=void 0!==b&&null!==b&&void 0===b.cloneBody;b=b||{};var e=b.body||b.cloneBody,c=b.headers,f=new AbortController;this[A]=f.signal;f=null;if(a instanceof w)this[x]=a.url,this[B]=a.cache,this[C]=a.credentials,void 0===c&&(c=a.headers),this[D]=a.integrity,this[y]=a.method,this[p]=a.mode,d&&"navigate"===this[p]&&(this[p]="same-origin"),this[H]=a.redirect,e||null===a.body||(e=a.body,a[N]=!0),
+f=a[A];else{this[x]=String(a);if(!FetchInternal.isUrlValid(this[x],!1))throw new g("Invalid request URL");this[p]="cors";this[C]="same-origin"}if(void 0!==b.window&&null!==b.window)throw new g("Invalid request window");this[B]=b.cache||this[B]||"default";if(-1===ka.indexOf(this[B]))throw new g("Invalid request cache mode");this[C]=b.credentials||this[C]||"same-origin";if(-1===la.indexOf(this[C]))throw new g("Invalid request credentials");void 0!==b.integrity?this[D]=b.integrity:void 0===this[D]&&
+(this[D]="");a=(b.method||this[y]||"GET").toUpperCase();if(-1===ma.indexOf(a))throw new g("Invalid request method");this[y]=a;if(b.mode&&-1===na.indexOf(b.mode))throw new g("Invalid request mode");this[p]=b.mode||this[p]||"no-cors";if("no-cors"===this[p]){if(-1===oa.indexOf(this[y]))throw new g("Invalid request method for no-cors");if(""!==this[D])throw new g("Request integrity data is not allowed with no-cors");}if("same-origin"!==this[p]&&"only-if-cached"===this[B])throw new g("Request mode must be same-origin for only-if-cached");
+this[H]=b.redirect||this[H]||"follow";if(-1===pa.indexOf(this[H]))throw new g("Invalid request redirect mode");this[n]="no-cors"===this[p]?G(c,aa):G(c,Y);if(("GET"===this[y]||"HEAD"===this[y])&&e)throw new g("Request body is not allowed for GET or HEAD");"signal"in b&&(f=b.signal);f&&this[A].follow(f);this._initBody(e)}function qa(a,b){var d=G(void 0,b);a.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(a){var b=a.split(":");if(a=b.shift().trim())b=b.join(":").trim(),d.append(a,b)});return d}
+function r(a,b){b||(b={});this[J]="default";this[q]="status"in b?b.status:200;if(200>this[q]||599<this[q])throw new T("Invalid response status");this[U]=200<=this[q]&&300>this[q];if("statusText"in b){var d=b.statusText;for(var e=0,f=d.length,c;e<f;e++)if(c=d.charCodeAt(e),9!==c&&(32>c||255<c||127===c))throw g("Invalid response status text");}else d="OK";this[K]=d;this[n]=G(b.headers,L);this[x]=b.url||"";if(a&&-1<ra.indexOf(this[q]))throw new g("Response body is not allowed with a null body status");
+this[z]=b.is_aborted||!1;this._initBody(a)}if(!c.fetch){var F=c.Array,S=c.ArrayBuffer,ea=c.Object.create,P=c.Object.defineProperties,f=c.Symbol,sa=f.iterator,I=c.Map,T=c.RangeError,g=c.TypeError,u=c.Uint8Array,t=c.Promise,O=c.ReadableStream,V=c.ReadableStreamTee,ja=c.IsReadableStreamDisturbed,fa=c.IsReadableStreamLocked,m=f("body"),N=f("bodyUsed"),B=f("cache"),C=f("credentials"),v=f("guardCallback"),n=f("headers"),D=f("integrity"),l=f("map"),y=f("method"),p=f("mode"),U=f("ok"),H=f("redirect"),q=f("status"),
+K=f("statusText"),J=f("type"),x=f("url"),z=f("is_aborted"),A=f("signal"),Z="accept-charset accept-encoding access-control-request-headers access-control-request-method connection content-length cookie cookie2 date dnt expect host keep-alive origin referer te trailer transfer-encoding upgrade via".split(" "),da=["set-cookie","set-cookie2"],ba=["accept","accept-language","content-language"],ca=["application/x-www-form-urlencoded","multipart/form-data","text/plain"],ka="default no-store reload no-cache force-cache only-if-cached".split(" "),
+la=["omit","same-origin","include"],ma="DELETE GET HEAD OPTIONS POST PUT".split(" "),oa=["GET","HEAD","POST"],na=["same-origin","no-cors","cors"],pa=["follow","error","manual"],ra=[101,204,205,304],ta=[301,302,303,307,308],ua="[object Int8Array];[object Uint8Array];[object Uint8ClampedArray];[object Int16Array];[object Uint16Array];[object Int32Array];[object Uint32Array];[object Float32Array];[object Float64Array]".split(";"),ia=S.isView||function(a){return a&&-1<ua.indexOf(Object.prototype.toString.call(a))};
+h.prototype.append=function(a,b){if(2!==arguments.length)throw g("Invalid parameters to append");a=E(a);b=Q(b);this[v](a,b)||(this[l].has(a)?this[l].set(a,this[l].get(a)+", "+b):this[l].set(a,b))};h.prototype["delete"]=function(a){if(1!==arguments.length)throw g("Invalid parameters to delete");this[v](a,"invalid")||this[l].delete(E(a))};h.prototype.get=function(a){if(1!==arguments.length)throw g("Invalid parameters to get");a=E(a);var b=this[l].get(a);return void 0!==b?b:null};h.prototype.has=function(a){if(1!==
+arguments.length)throw g("Invalid parameters to has");return this[l].has(E(a))};h.prototype.set=function(a,b){if(2!==arguments.length)throw g("Invalid parameters to set");a=E(a);b=Q(b);this[v](a,b)||this[l].set(a,b)};h.prototype.forEach=function(a,b){var d=this;F.from(this[l].entries()).sort().forEach(function(e){a.call(b,e[1],e[0],d)})};h.prototype.keys=function(){return(new I(F.from(this[l].entries()).sort())).keys()};h.prototype.values=function(){return(new I(F.from(this[l].entries()).sort())).values()};
+h.prototype.entries=function(){return(new I(F.from(this[l].entries()).sort())).entries()};h.prototype[sa]=h.prototype.entries;w.prototype.clone=function(){var a=null;null!==this[m]&&(a=V(this[m],!0),this[m]=a[0],a=a[1]);return new w(this,{cloneBody:a,signal:this[A]})};P(w.prototype,{cache:{get:function(){return this[B]}},credentials:{get:function(){return this[C]}},headers:{get:function(){return this[n]}},integrity:{get:function(){return this[D]}},method:{get:function(){return this[y]}},mode:{get:function(){return this[p]}},
+redirect:{get:function(){return this[H]}},url:{get:function(){return this[x]}},signal:{get:function(){return this[A]}}});R.call(w.prototype);R.call(r.prototype);r.prototype.clone=function(){var a=null;null!==this[m]&&(a=V(this[m],!0),this[m]=a[0],a=a[1]);return new r(a,{status:this[q],statusText:this[K],headers:G(this[n],L),url:this[x],is_aborted:this[z]})};P(r.prototype,{headers:{get:function(){return this[n]}},ok:{get:function(){return this[U]}},status:{get:function(){return this[q]}},statusText:{get:function(){return this[K]}},
+type:{get:function(){return this[J]}},url:{get:function(){return this[x]}}});r.error=function(){var a=new r(null);a[n][v]=W;a[J]="error";a[q]=0;a[K]="";return a};r.redirect=function(a,b){if(!FetchInternal.isUrlValid(a,!0))throw new g("Invalid URL for response redirect");void 0===b&&(b=302);if(-1===ta.indexOf(b))throw new T("Invalid status code for response redirect");return new r(null,{status:b,headers:{location:a}})};c.Headers=h;c.Request=w;c.Response=r;c.fetch=function(a,b){return new t(function(d,
+e){var c=!1,f=!1,h=new w(a,b),k=new XMLHttpRequest,l=null;if(h.signal.aborted)return e(new DOMException("Aborted","AbortError"));var m=new O({start:function(a){l=a},cancel:function(a){c=!0;k.abort()}}),p=function(){if(!c){c=!0;m.cancel();if(l)try{ReadableStreamDefaultControllerError(l,new DOMException("Aborted","AbortError"))}catch(va){}setTimeout(function(){try{k.abort()}catch(va){}},0)}};k.onload=function(){l.close()};k.onreadystatechange=function(){if(k.readyState===k.HEADERS_RECEIVED){var a={status:k.status,
+statusText:k.statusText,headers:qa(k.getAllResponseHeaders()||"",L)};a.url="responseURL"in k?k.responseURL:a.headers.get("X-Request-URL");try{var b=new r(m,a);h[A].addEventListener("abort",function(){b[z]=!0;p();e(new DOMException("Aborted","AbortError"))});b[J]=f?"cors":"basic";d(b)}catch(wa){e(wa)}}};k.onerror=function(){l.error(new g("Network request failed"));e(new g("Network request failed"))};k.ontimeout=function(){l.error(new g("Network request failed"));e(new g("Network request failed"))};
+k.open(h.method,h.url,!0);"include"===h.credentials&&(k.withCredentials=!0);h.headers.forEach(function(a,b){k.setRequestHeader(b,a)});var n=function(a){c||l.enqueue(a)},q=function(a){f=a};null===h.body?k.fetch(n,q,null):M(h).then(function(a){k.fetch(n,q,a)})})};c.fetch.polyfill=!0}})(this);
\ No newline at end of file
diff --git a/src/cobalt/fetch/fetch.js b/src/cobalt/fetch/fetch.js
index f1e4892..b5de929 100644
--- a/src/cobalt/fetch/fetch.js
+++ b/src/cobalt/fetch/fetch.js
@@ -55,6 +55,9 @@
   const IsReadableStreamDisturbed = self.IsReadableStreamDisturbed
   const IsReadableStreamLocked = self.IsReadableStreamLocked
 
+  const ABORT_ERROR = 'AbortError'
+  const ABORT_MESSAGE = 'Aborted'
+
   const ERROR_INVALID_HEADERS_INIT =
       'Constructing Headers with invalid parameters'
   const ERROR_NETWORK_REQUEST_FAILED = 'Network request failed'
@@ -78,9 +81,6 @@
   const URL_SLOT = Symbol('url')
   const IS_ABORTED_SLOT = Symbol('is_aborted')
   const SIGNAL_SLOT = Symbol('signal')
-  const ONABORT_SLOT = Symbol('onabort')
-  const ABORT_HASH_SLOT = Symbol('abort_hash')
-  const LISTENERS_SLOT = Symbol('listeners')
 
   // Forbidden headers corresponding to various header guard types.
   const INVALID_HEADERS_REQUEST = [
@@ -263,18 +263,6 @@
     return false
   }
 
-  const ABORT_ERROR_ID = 20
-  var AbortException = function() {
-    defineProperties(this, {
-      'message': { value: 'Aborted', writable: false},
-      'name' : { value: 'AbortError', writable: false},
-      'code': { value: ABORT_ERROR_ID, writable: false}
-    })
-  }
-  // TODO: This doesn't work under unit tests, should be implemented in IDL
-  // AbortException.prototype = DOMException
-  AbortException.prototype.constructor = AbortException
-
   // https://fetch.spec.whatwg.org/#headers-class
   function Headers(init) {
     this[MAP_SLOT] = new Map();
@@ -499,7 +487,7 @@
 
     this.arrayBuffer = function() {
       if (this[IS_ABORTED_SLOT]) {
-        return Promise.reject(new AbortException())
+        return Promise.reject(new DOMException(ABORT_MESSAGE, ABORT_ERROR))
       }
       return consumeBodyAsUint8Array(this).then(function(data) {
         return data.buffer
@@ -508,7 +496,7 @@
 
     this.text = function() {
       if (this[IS_ABORTED_SLOT]) {
-        return Promise.reject(new AbortException())
+        return Promise.reject(new DOMException(ABORT_MESSAGE, ABORT_ERROR))
       }
       return consumeBodyAsUint8Array(this).then(function(data) {
         return FetchInternal.decodeFromUTF8(data)
@@ -517,7 +505,7 @@
 
     this.json = function() {
       if (this[IS_ABORTED_SLOT]) {
-        return Promise.reject(new AbortException())
+        return Promise.reject(new DOMException(ABORT_MESSAGE, ABORT_ERROR))
       }
       return this.text().then(JSON.parse)
     }
@@ -533,66 +521,6 @@
     return upcased
   }
 
-  // https://dom.spec.whatwg.org/#interface-AbortSignal
-  function AbortSignal(input) {
-    this[ONABORT_SLOT] = null
-    if(input instanceof AbortSignal) {
-      this[ONABORT_SLOT] = input.onabort
-      this[ABORT_HASH_SLOT] = input[ABORT_HASH_SLOT]
-      this[LISTENERS_SLOT] = input[LISTENERS_SLOT]
-    } else {
-      this[ABORT_HASH_SLOT] = { is_aborted: false }
-      this[LISTENERS_SLOT] = {}
-    }
-
-    defineProperties(this,{
-      'aborted': { get: () => this[ABORT_HASH_SLOT].is_aborted },
-      'onabort': {
-        get: () => this[ONABORT_SLOT],
-        set: value => this[ONABORT_SLOT] = value
-      }
-    })
-  }
-  AbortSignal.prototype.constructor = AbortSignal
-  AbortSignal.prototype.dispatchEvent =  function(ev){
-    if(ev.type === 'abort') {
-      this[ABORT_HASH_SLOT].is_aborted = true
-      if(typeof this[ONABORT_SLOT] === 'function') {
-        this[ONABORT_SLOT].call(this,ev)
-      }
-    }
-    if (!(ev.type in this[LISTENERS_SLOT])) {
-      return
-    }
-    const type_listener_array = this[LISTENERS_SLOT][ev.type]
-    for (var i = type_listener_array.length - 1; i >= 0; i--) {
-      type_listener_array[i].call(this,ev)
-    }
-    return !ev.defaultPrevented
-  }
-  AbortSignal.prototype.addEventListener = function(listener_type, listener) {
-    if (!(listener_type in this[LISTENERS_SLOT])) {
-      this[LISTENERS_SLOT][listener_type] = []
-    }
-    this[LISTENERS_SLOT][listener_type].push(listener)
-  }
-  AbortSignal.prototype.removeEventListener = function(listener_type, listener) {
-    if (!(listener_type in this[LISTENERS_SLOT])) {
-      return
-    }
-    const type_listener_array = this[LISTENERS_SLOT][type]
-    for (var i = 0, l = type_listener_array.length; i < l; i++) {
-      if (type_listener_array[i] === listener) {
-        type_listener_array.splice(i, 1)
-        return
-      }
-    }
-  }
-  AbortSignal.prototype.clone = function() {
-    return new AbortSignal(this)
-  }
-  self.AbortSignal = AbortSignal
-
   // https://fetch.spec.whatwg.org/#request-class
   function Request(input, init) {
     // When cloning a request, |init| will have the non-standard member
@@ -603,6 +531,15 @@
     var body = init.body || init.cloneBody
     var headersInit = init.headers
 
+    // AbortSignal cannot be constructed directly, so create a temporary
+    // AbortController and steal its signal. This signal is only used to follow
+    // another signal, so the controller isn't needed.
+    var tempController = new AbortController()
+    this[SIGNAL_SLOT] = tempController.signal
+
+    // Let signal be null.
+    var signal = null
+
     if (input instanceof Request) {
       this[URL_SLOT] = input.url
       this[CACHE_SLOT] = input.cache
@@ -623,15 +560,8 @@
         input[BODY_USED_SLOT] = true
       }
 
-      if(('signal' in init) && (init.signal == null)) {
-        this[SIGNAL_SLOT] = new AbortSignal()
-      } else {
-        if('signal' in init) {
-          this[SIGNAL_SLOT] = init.signal
-        } else {
-          this[SIGNAL_SLOT] = input[SIGNAL_SLOT]
-        }
-      }
+      // Set signal to input's signal.
+      signal = input[SIGNAL_SLOT]
     } else {
       this[URL_SLOT] = String(input)
       if (!FetchInternal.isUrlValid(this[URL_SLOT],
@@ -640,12 +570,6 @@
       }
       this[MODE_SLOT] = 'cors'
       this[CREDENTIALS_SLOT] = 'same-origin'
-
-      if ((init.signal) && !(init.signal == null) ) {
-        this[SIGNAL_SLOT] = new AbortSignal(init.signal)
-      } else {
-        this[SIGNAL_SLOT] = new AbortSignal()
-      }
     }
 
     if (init.window !== undefined && init.window !== null) {
@@ -706,6 +630,17 @@
     if ((this[METHOD_SLOT] === 'GET' || this[METHOD_SLOT] === 'HEAD') && body) {
       throw new TypeError('Request body is not allowed for GET or HEAD')
     }
+
+    // If init["signal"] exists, then set signal to it.
+    if ('signal' in init) {
+      signal = init.signal
+    }
+
+    // If signal is not null, then make r's signal follow signal.
+    if (signal) {
+      this[SIGNAL_SLOT].follow(signal)
+    }
+
     this._initBody(body)
   }
 
@@ -717,7 +652,7 @@
       this[BODY_SLOT] = streams[0]
       cloneBody = streams[1]
     }
-    return new Request(this, { cloneBody: cloneBody, signal: this[SIGNAL_SLOT].clone() })
+    return new Request(this, { cloneBody: cloneBody, signal: this[SIGNAL_SLOT] })
   }
 
   defineProperties(Request.prototype, {
@@ -863,7 +798,7 @@
       //    Abort fetch with p, request, and null.
       //    Return p.
       if (request.signal.aborted) {
-        return reject(new AbortException())
+        return reject(new DOMException(ABORT_MESSAGE, ABORT_ERROR))
       }
 
       // 5. If requests clients global object is a ServiceWorkerGlobalScope object,
@@ -880,46 +815,22 @@
         }
       })
 
-      var cleanup = function() {
+      var handleAbort = function() {
         if (!cancelled) {
           cancelled = true
           responseStream.cancel()
           if(responseStreamController) {
             try {
-              responseStreamController.close()
+              ReadableStreamDefaultControllerError(responseStreamController,
+                  new DOMException(ABORT_MESSAGE, ABORT_ERROR))
             } catch(_) {}
           }
           setTimeout(function() {
               try {
                 xhr.abort()
               } catch(_) {}
-            },0)
-          }
-      }
-
-      // Intercept getReader calls, and patch returned reader objects for abort
-      // This is required to make reader calls reject correctly with Abort
-      // as a result
-      const getReader_original = responseStream.getReader
-      responseStream.getReader = function() {
-        var reader = getReader_original.bind(this).call()
-        const read_original = reader.read
-        const closed_original = reader.closed
-        reader.read = function() {
-          if(request[SIGNAL_SLOT] && request[SIGNAL_SLOT].aborted) {
-            cleanup()
-            return Promise.reject(new AbortException())
-          }
-          return read_original.bind(this).call()
+            }, 0)
         }
-        defineProperty(reader,'closed',{ get: function() {
-            if(request[SIGNAL_SLOT] && request[SIGNAL_SLOT].aborted) {
-              cleanup()
-              return Promise.reject(new AbortException())
-            }
-            return closed_original
-          }})
-        return reader
       }
 
       xhr.onload = function() {
@@ -946,8 +857,8 @@
               // 8.2 Abort fetch with p, request, and responseObject.
               // 8.3 Terminate the ongoing fetch with the aborted flag set.
               response[IS_ABORTED_SLOT] = true
-              cleanup()
-              reject(new AbortException())
+              handleAbort()
+              reject(new DOMException(ABORT_MESSAGE, ABORT_ERROR))
             })
 
             response[TYPE_SLOT] = isCORSMode ? 'cors' : 'basic'
@@ -1009,14 +920,5 @@
     })
   }
 
-  // https://dom.spec.whatwg.org/#interface-abortcontroller
-  function AbortController() {
-    defineProperty(this, 'signal', {value: new AbortSignal(), writable: false})
-  }
-  AbortController.prototype.abort = function() {
-    this.signal.dispatchEvent(new Event('abort'))
-  }
-  self.AbortController = AbortController
-
   self.fetch.polyfill = true
 })(this);
diff --git a/src/cobalt/h5vcc/h5vcc.cc b/src/cobalt/h5vcc/h5vcc.cc
index 5ba9959..701d785 100644
--- a/src/cobalt/h5vcc/h5vcc.cc
+++ b/src/cobalt/h5vcc/h5vcc.cc
@@ -33,6 +33,7 @@
 #if defined(COBALT_ENABLE_SSO)
   sso_ = new H5vccSso();
 #endif
+  storage_ = new H5vccStorage(settings.network_module);
   system_ = new H5vccSystem();
   trace_event_ = new H5vccTraceEvent();
 }
@@ -46,6 +47,7 @@
   tracer->Trace(runtime_);
   tracer->Trace(settings_);
   tracer->Trace(sso_);
+  tracer->Trace(storage_);
   tracer->Trace(system_);
   tracer->Trace(trace_event_);
 }
diff --git a/src/cobalt/h5vcc/h5vcc.gyp b/src/cobalt/h5vcc/h5vcc.gyp
index 3378152..18a74fe 100644
--- a/src/cobalt/h5vcc/h5vcc.gyp
+++ b/src/cobalt/h5vcc/h5vcc.gyp
@@ -48,6 +48,8 @@
         'h5vcc_runtime_event_target.h',
         'h5vcc_settings.cc',
         'h5vcc_settings.h',
+        'h5vcc_storage.cc',
+        'h5vcc_storage.h',
         'h5vcc_system.cc',
         'h5vcc_system.h',
         'h5vcc_trace_event.cc',
diff --git a/src/cobalt/h5vcc/h5vcc.h b/src/cobalt/h5vcc/h5vcc.h
index 210f29e..d87120f 100644
--- a/src/cobalt/h5vcc/h5vcc.h
+++ b/src/cobalt/h5vcc/h5vcc.h
@@ -28,6 +28,7 @@
 #include "cobalt/h5vcc/h5vcc_runtime.h"
 #include "cobalt/h5vcc/h5vcc_settings.h"
 #include "cobalt/h5vcc/h5vcc_sso.h"
+#include "cobalt/h5vcc/h5vcc_storage.h"
 #include "cobalt/h5vcc/h5vcc_system.h"
 #include "cobalt/h5vcc/h5vcc_trace_event.h"
 #include "cobalt/script/wrappable.h"
@@ -68,6 +69,7 @@
 #if defined(COBALT_ENABLE_SSO)
   const scoped_refptr<H5vccSso>& sso() const { return sso_; }
 #endif
+  const scoped_refptr<H5vccStorage>& storage() const { return storage_; }
   const scoped_refptr<H5vccSystem>& system() const { return system_; }
   const scoped_refptr<H5vccTraceEvent>& trace_event() const {
     return trace_event_;
@@ -85,6 +87,7 @@
   scoped_refptr<H5vccRuntime> runtime_;
   scoped_refptr<H5vccSettings> settings_;
   scoped_refptr<H5vccSso> sso_;
+  scoped_refptr<H5vccStorage> storage_;
   scoped_refptr<H5vccSystem> system_;
   scoped_refptr<H5vccTraceEvent> trace_event_;
 
diff --git a/src/cobalt/h5vcc/h5vcc.idl b/src/cobalt/h5vcc/h5vcc.idl
index ed7818d..5155763 100644
--- a/src/cobalt/h5vcc/h5vcc.idl
+++ b/src/cobalt/h5vcc/h5vcc.idl
@@ -18,9 +18,9 @@
 // APIs which allow clients to call non-standard native functions that we
 // expose.
 //
-// For example we provide a h5vcc.accessibility.textToSpeech, which tells
-// whether the platform supports text-to-speech capability. Other H5vcc
-// modules can run an in-app DIAL server or expose availables CVals.
+// For example we provide a h5vcc.storage.ClearCookies(), which can empty the
+// cookie jar in response to the user's request. Other H5vcc modules expose
+// audio capabilities about the platform, or run an in-app DIAL server.
 //
 // The H5vcc node should just be a collection of readonly sub-nodes.
 // This is created by the BrowserModule and passed directly to the Window
@@ -37,6 +37,7 @@
   readonly attribute H5vccSettings settings;
   [Conditional=COBALT_ENABLE_SSO]
       readonly attribute H5vccSso sso;
+  readonly attribute H5vccStorage storage;
   readonly attribute H5vccSystem system;
   readonly attribute H5vccTraceEvent traceEvent;
 };
diff --git a/src/cobalt/h5vcc/h5vcc_storage.cc b/src/cobalt/h5vcc/h5vcc_storage.cc
new file mode 100644
index 0000000..8bc8c5d
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_storage.cc
@@ -0,0 +1,54 @@
+// Copyright 2015 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/h5vcc/h5vcc_storage.h"
+
+#include "cobalt/storage/storage_manager.h"
+#include "net/url_request/url_request_context.h"
+
+namespace cobalt {
+namespace h5vcc {
+
+H5vccStorage::H5vccStorage(network::NetworkModule* network_module)
+    : network_module_(network_module) {}
+
+void H5vccStorage::ClearCookies() {
+  net::CookieStore* cookie_store =
+      network_module_->url_request_context()->cookie_store();
+  auto* cookie_monster = static_cast<net::CookieMonster*>(cookie_store);
+  network_module_->task_runner()->PostBlockingTask(
+      FROM_HERE,
+      base::Bind(&net::CookieMonster::DeleteAllMatchingInfoAsync,
+                 base::Unretained(cookie_monster), net::CookieDeletionInfo(),
+                 base::Passed(net::CookieStore::DeleteCallback())));
+}
+
+void H5vccStorage::Flush(const base::Optional<bool>& sync) {
+  if (sync.value_or(false) == true) {
+    DLOG(WARNING) << "Synchronous flush is not supported.";
+  }
+
+  network_module_->storage_manager()->FlushNow(base::Closure());
+}
+
+bool H5vccStorage::GetCookiesEnabled() {
+  return network_module_->network_delegate()->cookies_enabled();
+}
+
+void H5vccStorage::SetCookiesEnabled(bool enabled) {
+  network_module_->network_delegate()->set_cookies_enabled(enabled);
+}
+
+}  // namespace h5vcc
+}  // namespace cobalt
diff --git a/src/cobalt/h5vcc/h5vcc_storage.h b/src/cobalt/h5vcc/h5vcc_storage.h
new file mode 100644
index 0000000..613f024
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_storage.h
@@ -0,0 +1,44 @@
+// Copyright 2015 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_H5VCC_H5VCC_STORAGE_H_
+#define COBALT_H5VCC_H5VCC_STORAGE_H_
+
+#include "base/optional.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace h5vcc {
+
+class H5vccStorage : public script::Wrappable {
+ public:
+  explicit H5vccStorage(network::NetworkModule* network_module);
+  void ClearCookies();
+  void Flush(const base::Optional<bool>& sync);
+  bool GetCookiesEnabled();
+  void SetCookiesEnabled(bool enabled);
+
+  DEFINE_WRAPPABLE_TYPE(H5vccStorage);
+
+ private:
+  network::NetworkModule* network_module_;
+
+  DISALLOW_COPY_AND_ASSIGN(H5vccStorage);
+};
+
+}  // namespace h5vcc
+}  // namespace cobalt
+
+#endif  // COBALT_H5VCC_H5VCC_STORAGE_H_
diff --git a/src/cobalt/h5vcc/h5vcc_storage.idl b/src/cobalt/h5vcc/h5vcc_storage.idl
new file mode 100644
index 0000000..7a30dec
--- /dev/null
+++ b/src/cobalt/h5vcc/h5vcc_storage.idl
@@ -0,0 +1,21 @@
+// Copyright 2015 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+interface H5vccStorage {
+  void clearCookies();
+  // We don't support synchronous flush, this is legacy.
+  void flush(optional boolean sync = false);
+  boolean getCookiesEnabled();
+  void setCookiesEnabled(boolean value);
+};
diff --git a/src/cobalt/layout/block_container_box.h b/src/cobalt/layout/block_container_box.h
index 510989c..21ace30 100644
--- a/src/cobalt/layout/block_container_box.h
+++ b/src/cobalt/layout/block_container_box.h
@@ -80,6 +80,10 @@
 
   BaseDirection base_direction() const { return base_direction_; }
 
+  LayoutUnit GetShrinkToFitWidth(
+      LayoutUnit containing_block_width,
+      const base::Optional<LayoutUnit>& maybe_height);
+
  protected:
   // From |Box|.
   bool IsTransformable() const override;
@@ -147,10 +151,6 @@
       const base::Optional<LayoutUnit>& maybe_margin_bottom,
       const FormattingContext& formatting_context);
 
-  LayoutUnit GetShrinkToFitWidth(
-      LayoutUnit containing_block_width,
-      const base::Optional<LayoutUnit>& maybe_height);
-
   // A vertical offset of the baseline of the last child box that has one,
   // relatively to the origin of the block container box. Disengaged, if none
   // of the child boxes have a baseline.
diff --git a/src/cobalt/layout/flex_container_box.cc b/src/cobalt/layout/flex_container_box.cc
index ae418bd..bacd234 100644
--- a/src/cobalt/layout/flex_container_box.cc
+++ b/src/cobalt/layout/flex_container_box.cc
@@ -38,7 +38,11 @@
 FlexContainerBox::~FlexContainerBox() {}
 
 void FlexContainerBox::DetermineAvailableSpace(
-    const LayoutParams& layout_params, bool main_direction_is_horizontal) {
+    const LayoutParams& layout_params, bool main_direction_is_horizontal,
+    bool width_depends_on_containing_block,
+    const base::Optional<LayoutUnit>& maybe_width,
+    bool height_depends_on_containing_block,
+    const base::Optional<LayoutUnit>& maybe_height) {
   // Line Length Determination:
   //   https://www.w3.org/TR/css-flexbox-1/#line-sizing
   // 2. Determine the available main and cross space for the flex items.
@@ -46,15 +50,6 @@
   base::Optional<LayoutUnit> cross_space;
   bool main_space_depends_on_containing_block;
 
-  bool width_depends_on_containing_block;
-  base::Optional<LayoutUnit> maybe_width = GetUsedWidthIfNotAuto(
-      computed_style(), layout_params.containing_block_size,
-      &width_depends_on_containing_block);
-  bool height_depends_on_containing_block;
-  base::Optional<LayoutUnit> maybe_height = GetUsedHeightIfNotAuto(
-      computed_style(), layout_params.containing_block_size,
-      &height_depends_on_containing_block);
-
   base::Optional<LayoutUnit> min_width = GetUsedMinWidthIfNotAuto(
       computed_style(), layout_params.containing_block_size, NULL);
   base::Optional<LayoutUnit> max_width = GetUsedMaxWidthIfNotNone(
@@ -175,7 +170,19 @@
   //   https://www.w3.org/TR/css-flexbox-1/#line-sizing
   // 2. Determine the available main and cross space for the flex items.
   //      https://www.w3.org/TR/css-flexbox-1/#algo-available
-  DetermineAvailableSpace(layout_params, main_direction_is_horizontal);
+
+  bool width_depends_on_containing_block;
+  base::Optional<LayoutUnit> maybe_width = GetUsedWidthIfNotAuto(
+      computed_style(), layout_params.containing_block_size,
+      &width_depends_on_containing_block);
+  bool height_depends_on_containing_block;
+  base::Optional<LayoutUnit> maybe_height = GetUsedHeightIfNotAuto(
+      computed_style(), layout_params.containing_block_size,
+      &height_depends_on_containing_block);
+
+  DetermineAvailableSpace(layout_params, main_direction_is_horizontal,
+                          width_depends_on_containing_block, maybe_width,
+                          height_depends_on_containing_block, maybe_height);
 
   // 3. Determine the flex base size and hypothetical main size of each item.
   //      https://www.w3.org/TR/css-flexbox-1/#algo-main-item
@@ -201,7 +208,7 @@
       flex_formatting_context.UpdateRect(child_box);
 
       auto item = FlexItem::Create(child_box, main_direction_is_horizontal);
-      item->DetermineFlexBaseSize(child_layout_params, main_space_,
+      item->DetermineFlexBaseSize(main_space_,
                                   layout_params.shrink_to_fit_width_forced);
       item->DetermineHypotheticalMainSize(
           child_layout_params.containing_block_size);
@@ -209,22 +216,41 @@
     }
   }
 
+  base::Optional<LayoutUnit> maybe_margin_left = GetUsedMarginLeftIfNotAuto(
+      computed_style(), layout_params.containing_block_size);
+  base::Optional<LayoutUnit> maybe_margin_right = GetUsedMarginRightIfNotAuto(
+      computed_style(), layout_params.containing_block_size);
+  base::Optional<LayoutUnit> maybe_left = GetUsedLeftIfNotAuto(
+      computed_style(), layout_params.containing_block_size);
+  base::Optional<LayoutUnit> maybe_right = GetUsedRightIfNotAuto(
+      computed_style(), layout_params.containing_block_size);
+
+  base::Optional<LayoutUnit> maybe_margin_top = GetUsedMarginTopIfNotAuto(
+      computed_style(), layout_params.containing_block_size);
+  base::Optional<LayoutUnit> maybe_margin_bottom = GetUsedMarginBottomIfNotAuto(
+      computed_style(), layout_params.containing_block_size);
+
+  if (IsAbsolutelyPositioned()) {
+    UpdateWidthAssumingAbsolutelyPositionedBox(
+        layout_params.containing_block_size.width(), maybe_left, maybe_right,
+        maybe_width, maybe_margin_left, maybe_margin_right, maybe_height);
+
+    base::Optional<LayoutUnit> maybe_top = GetUsedTopIfNotAuto(
+        computed_style(), layout_params.containing_block_size);
+    base::Optional<LayoutUnit> maybe_bottom = GetUsedBottomIfNotAuto(
+        computed_style(), layout_params.containing_block_size);
+
+    UpdateHeightAssumingAbsolutelyPositionedBox(
+        layout_params.containing_block_size.height(), maybe_top, maybe_bottom,
+        maybe_height, maybe_margin_top, maybe_margin_bottom,
+        flex_formatting_context);
+  }
+
   LayoutUnit main_size = LayoutUnit();
   // 4. Determine the main size of the flex container using the rules of the
   // formatting context in which it participates.
   if (main_direction_is_horizontal) {
     if (!layout_params.freeze_width) {
-      bool width_depends_on_containing_block = true;
-      base::Optional<LayoutUnit> maybe_margin_left = GetUsedMarginLeftIfNotAuto(
-          computed_style(), layout_params.containing_block_size);
-      base::Optional<LayoutUnit> maybe_margin_right =
-          GetUsedMarginRightIfNotAuto(computed_style(),
-                                      layout_params.containing_block_size);
-      base::Optional<LayoutUnit> maybe_left = GetUsedLeftIfNotAuto(
-          computed_style(), layout_params.containing_block_size);
-      base::Optional<LayoutUnit> maybe_right = GetUsedRightIfNotAuto(
-          computed_style(), layout_params.containing_block_size);
-
       UpdateContentWidthAndMargins(
           layout_params.containing_block_size.width(),
           layout_params.shrink_to_fit_width_forced,
@@ -281,19 +307,8 @@
     set_width(flex_formatting_context.cross_size());
   }
 
-  base::Optional<LayoutUnit> maybe_margin_left = GetUsedMarginLeftIfNotAuto(
-      computed_style(), layout_params.containing_block_size);
-  base::Optional<LayoutUnit> maybe_margin_right = GetUsedMarginRightIfNotAuto(
-      computed_style(), layout_params.containing_block_size);
-
   set_margin_left(maybe_margin_left.value_or(LayoutUnit()));
   set_margin_right(maybe_margin_right.value_or(LayoutUnit()));
-
-  base::Optional<LayoutUnit> maybe_margin_top = GetUsedMarginTopIfNotAuto(
-      computed_style(), layout_params.containing_block_size);
-  base::Optional<LayoutUnit> maybe_margin_bottom = GetUsedMarginBottomIfNotAuto(
-      computed_style(), layout_params.containing_block_size);
-
   set_margin_top(maybe_margin_top.value_or(LayoutUnit()));
   set_margin_bottom(maybe_margin_bottom.value_or(LayoutUnit()));
   if (child_boxes().empty()) {
@@ -307,6 +322,14 @@
     WrapAtPolicy wrap_at_policy, WrapOpportunityPolicy wrap_opportunity_policy,
     bool is_line_existence_justified, LayoutUnit available_width,
     bool should_collapse_trailing_white_space) {
+  DCHECK(!IsAbsolutelyPositioned());
+  // Wrapping is not allowed until the line's existence is justified, meaning
+  // that wrapping cannot occur before the box. Given that this box cannot be
+  // split, no wrappable point is available.
+  if (!is_line_existence_justified) {
+    return kWrapResultNoWrap;
+  }
+
   return (GetLevel() == kInlineLevel) ? kWrapResultWrapBefore
                                       : kWrapResultNoWrap;
 }
diff --git a/src/cobalt/layout/flex_container_box.h b/src/cobalt/layout/flex_container_box.h
index 5c5007b..a962d44 100644
--- a/src/cobalt/layout/flex_container_box.h
+++ b/src/cobalt/layout/flex_container_box.h
@@ -114,12 +114,11 @@
 
   // First step of the line length determination.
   void DetermineAvailableSpace(const LayoutParams& layout_params,
-                               bool main_direction_is_horizontal);
-
-  // Determine the flex base size and hypothetical main size of the item.
-  //   https://www.w3.org/TR/css-flexbox-1/#algo-main-item
-  LayoutUnit DetermineFlexBaseSize(Box* item, const LayoutParams& layout_params,
-                                   bool container_shrink_to_fit_width_forced);
+                               bool main_direction_is_horizontal,
+                               bool width_depends_on_containing_block,
+                               const base::Optional<LayoutUnit>& maybe_width,
+                               bool height_depends_on_containing_block,
+                               const base::Optional<LayoutUnit>& maybe_height);
 
   AnonymousBlockBox* GetLastChildAsAnonymousBlockBox();
   AnonymousBlockBox* GetOrAddAnonymousBlockBox();
diff --git a/src/cobalt/layout/flex_formatting_context.cc b/src/cobalt/layout/flex_formatting_context.cc
index 7a7a9e7..af19fc0 100644
--- a/src/cobalt/layout/flex_formatting_context.cc
+++ b/src/cobalt/layout/flex_formatting_context.cc
@@ -103,7 +103,7 @@
 
   // If the flex container is single-line and has a definite cross size, the
   // cross size of the flex line is the flex container's inner cross size.
-  if (!multi_line_ && cross_space) {
+  if (!multi_line_ && cross_space && !lines_.empty()) {
     lines_.front()->set_cross_size(*cross_space);
   } else {
     // Otherwise, for each flex line:
@@ -115,7 +115,7 @@
   // If the flex container is single-line, then clamp the line's cross-size
   // to be within the container's computed min and max cross sizes.
   //   https://www.w3.org/TR/css-flexbox-1/#change-201403-clamp-single-line
-  if (!multi_line_) {
+  if (!multi_line_ && !lines_.empty()) {
     LayoutUnit line_cross_size = lines_.front()->cross_size();
     if (min_cross_space && line_cross_size < *min_cross_space) {
       lines_.front()->set_cross_size(*min_cross_space);
diff --git a/src/cobalt/layout/flex_item.cc b/src/cobalt/layout/flex_item.cc
index 45370f9..231594b 100644
--- a/src/cobalt/layout/flex_item.cc
+++ b/src/cobalt/layout/flex_item.cc
@@ -20,6 +20,7 @@
 #include "base/memory/ptr_util.h"
 #include "cobalt/cssom/css_computed_style_data.h"
 #include "cobalt/cssom/number_value.h"
+#include "cobalt/layout/block_container_box.h"
 #include "cobalt/layout/box.h"
 #include "cobalt/layout/container_box.h"
 #include "cobalt/layout/used_style.h"
@@ -340,7 +341,6 @@
 }
 
 void FlexItem::DetermineFlexBaseSize(
-    const LayoutParams& layout_params,
     const base::Optional<LayoutUnit>& main_space,
     bool container_shrink_to_fit_width_forced) {
   // Absolutely positioned boxes are not flex items.
@@ -357,7 +357,7 @@
   bool flex_basis_depends_on_available_space;
   base::Optional<LayoutUnit> flex_basis = GetUsedFlexBasisIfNotContent(
       computed_style(), main_direction_is_horizontal_,
-      layout_params.containing_block_size,
+      main_space.value_or(LayoutUnit()),
       &flex_basis_depends_on_available_space);
   bool flex_basis_is_definite =
       flex_basis && (!flex_basis_depends_on_available_space || main_space);
@@ -434,21 +434,14 @@
   // size suggestion is that size (clamped by its max main size property if
   // it's definite). It is otherwise undefined.
   //   https://www.w3.org/TR/css-flexbox-1/#specified-size-suggestion
-  base::Optional<LayoutUnit> specified_min_size_suggestion =
-      GetUsedMinMainAxisSizeIfNotAuto(containing_block_size);
-
   base::Optional<LayoutUnit> specified_size_suggestion =
       GetUsedMainAxisSizeIfNotAuto(containing_block_size);
-  if (specified_size_suggestion.has_value()) {
-    return specified_min_size_suggestion;
-  }
-
   base::Optional<LayoutUnit> maybe_max_main_size =
       GetUsedMaxMainAxisSizeIfNotNone(containing_block_size);
-  if (specified_min_size_suggestion.has_value() &&
-      maybe_max_main_size.has_value()) {
-    specified_min_size_suggestion =
-        std::min(*maybe_max_main_size, *specified_min_size_suggestion);
+  if (maybe_max_main_size.has_value() &&
+      specified_size_suggestion.has_value()) {
+    specified_size_suggestion =
+        std::min(*maybe_max_main_size, *specified_size_suggestion);
   }
 
   // The content size suggestion is the min-content size in the main axis,
@@ -456,28 +449,40 @@
   //   https://www.w3.org/TR/css-flexbox-1/#content-size-suggestion
   base::Optional<LayoutUnit> content_size_suggestion;
   if (OverflowIsVisible()) {
-    content_size_suggestion = GetContentBoxMainSize();
+    if (main_direction_is_horizontal_) {
+      base::Optional<LayoutUnit> maybe_height =
+          GetUsedHeightIfNotAuto(computed_style(), containing_block_size, NULL);
+      content_size_suggestion =
+          box()->AsBlockContainerBox()->GetShrinkToFitWidth(
+              containing_block_size.width(), maybe_height);
+    } else {
+      content_size_suggestion = GetContentBoxMainSize();
+    }
     if (maybe_max_main_size.has_value()) {
       content_size_suggestion =
           std::min(*maybe_max_main_size, *content_size_suggestion);
     }
   }
 
-  if (!specified_min_size_suggestion.has_value()) {
-    // If the box has neither a specified size suggestion nor an aspect ratio,
-    // its content-based minimum size is the content size suggestion.
-    return content_size_suggestion;
-  } else {
-    if (content_size_suggestion.has_value()) {
-      // In general, the content-based minimum size of a flex item is the
-      // smaller of its content size suggestion and its specified size
-      // suggestion.
-      specified_min_size_suggestion =
-          std::min(*content_size_suggestion, *specified_min_size_suggestion);
-      return specified_min_size_suggestion;
-    }
+  // If the box has neither a specified size suggestion nor an aspect ratio,
+  // its content-based minimum size is the content size suggestion.
+  base::Optional<LayoutUnit> content_based_minimum_size =
+      content_size_suggestion;
+  // In general, the content-based minimum size of a flex item is the smaller
+  // of its content size suggestion and its specified size suggestion.
+  if (content_size_suggestion.has_value() &&
+      specified_size_suggestion.has_value()) {
+    content_based_minimum_size =
+        std::min(*content_size_suggestion, *specified_size_suggestion);
   }
-  return specified_min_size_suggestion;
+
+  base::Optional<LayoutUnit> specified_min_size_suggestion =
+      GetUsedMinMainAxisSizeIfNotAuto(containing_block_size);
+  if (specified_min_size_suggestion.has_value()) {
+    content_based_minimum_size = specified_min_size_suggestion;
+  }
+
+  return content_based_minimum_size;
 }
 
 }  // namespace layout
diff --git a/src/cobalt/layout/flex_item.h b/src/cobalt/layout/flex_item.h
index 91d16bf..becc390 100644
--- a/src/cobalt/layout/flex_item.h
+++ b/src/cobalt/layout/flex_item.h
@@ -80,8 +80,7 @@
 
   // Determine the flex base size.
   //   https://www.w3.org/TR/css-flexbox-1/#flex-base-size
-  void DetermineFlexBaseSize(const LayoutParams& layout_params,
-                             const base::Optional<LayoutUnit>& main_space,
+  void DetermineFlexBaseSize(const base::Optional<LayoutUnit>& main_space,
                              bool container_shrink_to_fit_width_forced);
 
   // Determine the hypothetical main size.
diff --git a/src/cobalt/layout/used_style.cc b/src/cobalt/layout/used_style.cc
index 76ce1cc..cd89a85 100644
--- a/src/cobalt/layout/used_style.cc
+++ b/src/cobalt/layout/used_style.cc
@@ -1706,16 +1706,13 @@
 //   https://www.w3.org/TR/css-flexbox-1/#flex-basis-property
 base::Optional<LayoutUnit> GetUsedFlexBasisIfNotContent(
     const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
-    const bool main_direction_is_horizontal,
-    const SizeLayoutUnit& flex_container_size,
+    bool main_direction_is_horizontal,
+    LayoutUnit main_space,
     bool* flex_basis_depends_on_available_space) {
   // Percentage values of flex-basis are resolved against the flex item's
   // containing block (i.e. its flex container).
   //   https://www.w3.org/TR/css-flexbox-1/#flex-basis-property
-  LayoutUnit flex_container_main_size = main_direction_is_horizontal
-                                            ? flex_container_size.width()
-                                            : flex_container_size.height();
-  UsedFlexBasisProvider used_flex_basis_provider(flex_container_main_size);
+  UsedFlexBasisProvider used_flex_basis_provider(main_space);
   computed_style->flex_basis()->Accept(&used_flex_basis_provider);
   if (used_flex_basis_provider.flex_basis_is_auto()) {
     // The auto keyword retrieves the value of the main size property as
@@ -1723,9 +1720,11 @@
     // value is content.
     //   https://www.w3.org/TR/css-flexbox-1/#valdef-flex-basis-auto
     if (main_direction_is_horizontal) {
+      SizeLayoutUnit flex_container_size(main_space, LayoutUnit());
       return GetUsedWidthIfNotAuto(computed_style, flex_container_size,
                                    flex_basis_depends_on_available_space);
     } else {
+      SizeLayoutUnit flex_container_size(LayoutUnit(), main_space);
       return GetUsedHeightIfNotAuto(computed_style, flex_container_size,
                                     flex_basis_depends_on_available_space);
     }
diff --git a/src/cobalt/layout/used_style.h b/src/cobalt/layout/used_style.h
index f2a859a..0dbd9d3 100644
--- a/src/cobalt/layout/used_style.h
+++ b/src/cobalt/layout/used_style.h
@@ -381,8 +381,8 @@
     const SizeLayoutUnit& containing_block_size);
 base::Optional<LayoutUnit> GetUsedFlexBasisIfNotContent(
     const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
-    const bool main_direction_is_horizontal,
-    const SizeLayoutUnit& flex_container_size,
+    bool main_direction_is_horizontal,
+    LayoutUnit main_space,
     bool* flex_basis_depends_on_available_space);
 base::Optional<LayoutUnit> GetUsedWidthIfNotAuto(
     const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
diff --git a/src/cobalt/layout/used_style_test.cc b/src/cobalt/layout/used_style_test.cc
index f19fa22..e381683 100644
--- a/src/cobalt/layout/used_style_test.cc
+++ b/src/cobalt/layout/used_style_test.cc
@@ -436,13 +436,15 @@
   SizeLayoutUnit flex_container_size(LayoutUnit(200), LayoutUnit(80));
   bool depends_on_flex_container = false;
   auto used_flex_basis = GetUsedFlexBasisIfNotContent(
-      computed_style, true, flex_container_size, &depends_on_flex_container);
+      computed_style, true, flex_container_size.width(),
+      &depends_on_flex_container);
   EXPECT_TRUE(depends_on_flex_container);
   EXPECT_FALSE(used_flex_basis);
 
   depends_on_flex_container = false;
-  used_flex_basis = GetUsedFlexBasisIfNotContent(
-      computed_style, false, flex_container_size, &depends_on_flex_container);
+  used_flex_basis = GetUsedFlexBasisIfNotContent(computed_style, false,
+                                                 flex_container_size.height(),
+                                                 &depends_on_flex_container);
   EXPECT_TRUE(depends_on_flex_container);
   EXPECT_FALSE(used_flex_basis);
 }
@@ -454,14 +456,16 @@
   SizeLayoutUnit flex_container_size(LayoutUnit(200), LayoutUnit(80));
   bool depends_on_flex_container = false;
   auto used_flex_basis = GetUsedFlexBasisIfNotContent(
-      computed_style, true, flex_container_size, &depends_on_flex_container);
+      computed_style, true, flex_container_size.width(),
+      &depends_on_flex_container);
   EXPECT_TRUE(depends_on_flex_container);
   EXPECT_TRUE(used_flex_basis);
   EXPECT_EQ(*used_flex_basis, LayoutUnit(50));
 
   depends_on_flex_container = false;
-  used_flex_basis = GetUsedFlexBasisIfNotContent(
-      computed_style, false, flex_container_size, &depends_on_flex_container);
+  used_flex_basis = GetUsedFlexBasisIfNotContent(computed_style, false,
+                                                 flex_container_size.height(),
+                                                 &depends_on_flex_container);
   EXPECT_TRUE(depends_on_flex_container);
   EXPECT_TRUE(used_flex_basis);
   EXPECT_EQ(*used_flex_basis, LayoutUnit(20));
@@ -475,14 +479,16 @@
   SizeLayoutUnit flex_container_size(LayoutUnit(200), LayoutUnit(80));
   bool depends_on_flex_container = false;
   auto used_flex_basis = GetUsedFlexBasisIfNotContent(
-      computed_style, true, flex_container_size, &depends_on_flex_container);
+      computed_style, true, flex_container_size.width(),
+      &depends_on_flex_container);
   EXPECT_FALSE(depends_on_flex_container);
   EXPECT_TRUE(used_flex_basis);
   EXPECT_EQ(*used_flex_basis, LayoutUnit(25));
 
   depends_on_flex_container = false;
-  used_flex_basis = GetUsedFlexBasisIfNotContent(
-      computed_style, false, flex_container_size, &depends_on_flex_container);
+  used_flex_basis = GetUsedFlexBasisIfNotContent(computed_style, false,
+                                                 flex_container_size.height(),
+                                                 &depends_on_flex_container);
   EXPECT_FALSE(depends_on_flex_container);
   EXPECT_TRUE(used_flex_basis);
   EXPECT_EQ(*used_flex_basis, LayoutUnit(25));
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001-expected.png
new file mode 100644
index 0000000..3dbc055
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html
new file mode 100644
index 0000000..815c29f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD//XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+        <title>CSS Test: The 'flex' shorthand adjusting the 'flex-grow' sub-property</title>
+        <link href="http://www.microsoft.com/" rel="author" title="Microsoft">
+        <link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+        <link href="reference/justify-content-001-ref.htm" rel="match">
+        <meta content="" name="flags">
+        <meta content="This test checks that the flex grow factor determines the distribution of positive free space." name="assert">
+        <style type="text/css">
+            body {
+              margin: 0px;
+              background-color: white;
+              font-family: Roboto;
+              font-size: 16px;
+            }
+            #flexbox
+            {
+                background-color: red;
+                display: flex;
+                width: 300px;
+            }
+            div div
+            {
+                background-color: #ffa500;
+                flex: 1 0 auto;
+                height: 100px;
+            }
+            #flexItem1
+            {
+                background-color: blue;
+            }
+        </style>
+    </head>
+    <body>
+        <span>Test passes if there is a single blue rectangle on the left, a single orange rectangle directly to its right, and there is no red visible on the page.</span>
+        <div id="flexbox">
+            <div id="flexItem1"></div>
+            <div></div>
+        </div>
+    
+
+</body></html>
+
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002-expected.png
new file mode 100644
index 0000000..3dbc055
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html
new file mode 100644
index 0000000..707d15f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD//XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+        <title>CSS Test: The 'flex' shorthand adjusting the 'flex-shrink' sub-property</title>
+        <link href="http://www.microsoft.com/" rel="author" title="Microsoft">
+        <link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+        <link href="reference/justify-content-001-ref.htm" rel="match">
+        <meta content="" name="flags">
+        <meta content="This test checks that the flex shrink factor is multiplied by the flex base size when distributing negative space." name="assert">
+        <style type="text/css">
+            body {
+              margin: 0px;
+              background-color: white;
+              font-family: Roboto;
+              font-size: 16px;
+            }
+            div
+            {
+                height: 50px;
+            }
+            #flexbox
+            {
+                background-color: red;
+                display: flex;
+                width: 300px;
+            }
+            #flexItem1
+            {
+                flex: 0 2 auto;
+                width: 300px;
+            }
+            #flexItem2
+            {
+                width: 200px;
+            }
+            #flexItem1, #ref1
+            {
+                background-color: blue;
+            }
+            #flexItem2, #ref2
+            {
+                background-color: #ffa500;
+            }
+            #ref1, #ref2
+            {
+                display: inline-block;
+                width: 150px;
+            }
+        </style>
+    </head>
+    <body>
+        <span>Test passes if there is a single blue rectangle on the left, a single orange rectangle directly to its right, and there is no red visible on the page.</span>
+        <div id="flexbox">
+            <div id="flexItem1"></div>
+            <div id="flexItem2"></div>
+        </div>
+        <div id="ref1"></div><div id="ref2"></div>
+    
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003-expected.png
new file mode 100644
index 0000000..3dbc055
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html
new file mode 100644
index 0000000..0051e30
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD//XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+        <title>CSS Test: Comparing two different elements using different values for the 'flex-grow' sub-property on the 'flex' shorthand</title>
+        <link href="http://www.microsoft.com/" rel="author" title="Microsoft">
+        <link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+        <link href="reference/justify-content-001-ref.htm" rel="match">
+        <meta content="" name="flags">
+        <meta content="This test checks that the flex items with a different flex grow factor have different flexibilities." name="assert">
+        <style type="text/css">
+            body {
+              margin: 0px;
+              background-color: white;
+              font-family: Roboto;
+              font-size: 16px;
+            }
+            div
+            {
+                height: 50px;
+            }
+            #flexbox
+            {
+                background-color: red;
+                display: flex;
+                width: 300px;
+            }
+            #flexItem1
+            {
+                flex: 1 0 auto;
+                width: 100px;
+            }
+            #flexItem2
+            {
+                flex: 2 0 auto;
+                width: 50px;
+            }
+            #flexItem1, #ref1
+            {
+                background-color: blue;
+            }
+            #flexItem2, #ref2
+            {
+                background-color: #ffa500;
+            }
+            #ref1, #ref2
+            {
+                display: inline-block;
+                width: 150px;
+            }
+        </style>
+    </head>
+    <body>
+        <span>Test passes if there is a single blue rectangle on the left, a single orange rectangle directly to its right, and there is no red visible on the page.</span>
+        <div id="flexbox">
+            <div id="flexItem1"></div>
+            <div id="flexItem2"></div>
+        </div>
+        <div id="ref1"></div><div id="ref2"></div>
+    
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004-expected.png
new file mode 100644
index 0000000..3dbc055
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html
new file mode 100644
index 0000000..6ab472d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD//XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+        <title>CSS Test: Comparing two different elements using different values for the 'flex-shrink' sub-property on the 'flex' shorthand</title>
+        <link href="http://www.microsoft.com/" rel="author" title="Microsoft">
+        <link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+        <link href="reference/justify-content-001-ref.htm" rel="match">
+        <meta content="" name="flags">
+        <meta content="This test checks that the flex items with a different flex shrink factor have different flexibilities." name="assert">
+        <style type="text/css">
+            body {
+              margin: 0px;
+              background-color: white;
+              font-family: Roboto;
+              font-size: 16px;
+            }
+            div
+            {
+                height: 50px;
+            }
+            #flexbox
+            {
+                background-color: red;
+                display: flex;
+                width: 300px;
+            }
+            #flexItem1
+            {
+                flex: 0 2 auto;
+                width: 300px;
+            }
+            #flexItem2
+            {
+                flex: 0 3 auto;
+                width: 600px;
+            }
+            #flexItem1, #ref1
+            {
+                background-color: blue;
+            }
+            #flexItem2, #ref2
+            {
+                background-color: #ffa500;
+            }
+            #ref1, #ref2
+            {
+                display: inline-block;
+                width: 150px;
+            }
+        </style>
+    </head>
+    <body>
+        <span>Test passes if there is a single blue rectangle on the left, a single orange rectangle directly to its right, and there is no red visible on the page.</span>
+        <div id="flexbox">
+            <div id="flexItem1"></div>
+            <div id="flexItem2"></div>
+        </div>
+        <div id="ref1"></div><div id="ref2"></div>
+    
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-001-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-001-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-001-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-001.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-001.html
new file mode 100644
index 0000000..a260857
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-001.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - positive number</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set positive number, the actual value of test element size is same as the positive number" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div{
+    background-color: green;
+    height: 100px;
+  }
+  #test {
+    flex-basis: 60px;
+  }
+  #ref {
+    width: 40px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+    <div id="ref"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-002-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-002-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-002-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-002.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-002.html
new file mode 100644
index 0000000..c711e1a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-002.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - positive number</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property specified correct value, the actual value of test element size is same as to the value of 'flex-basis' property, and the 'width' property is invalid." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div{
+    height: 100px;
+  }
+  #test {
+    flex-basis: 60px;
+    width: 80px;
+  }
+  #ref {
+    background-color: green;
+    width: 40px;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-top: -100px;
+    width: 60px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+    <div id="ref"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-003-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-003-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-003-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-003.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-003.html
new file mode 100644
index 0000000..b4bd554
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-003.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - negative number(width not specified)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set negative number, the tested element is not shown when width not set either." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div{
+    height: 100px;
+  }
+  #test {
+    flex-basis: -50px;
+  }
+  #ref {
+    background-color: green;
+    width: 50px;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-left: 50px;
+    margin-top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+    <div id="ref"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-004-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-004-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-004-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-004.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-004.html
new file mode 100644
index 0000000..c22b4c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-004.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - negative number(width specified)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set negative number, the actual width of tested element is same as the value of 'width' property specified." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div{
+    background-color: green;
+    height: 100px;
+  }
+  #test {
+    flex-basis: -50px;
+    width: 30px;
+  }
+  #ref {
+    width: 50px;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-left: 80px;
+    margin-top: -100px;
+    width: 20px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+    <div id="ref"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-005-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-005-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-005-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-005.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-005.html
new file mode 100644
index 0000000..bbfb2be
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-005.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - 0</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set '0', the actual width of tested element is same as 0." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: green;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #test {
+    background-color: red;
+    flex-basis: 0;
+    height: 100px;
+    width: 100px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-006-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-006-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-006-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-006.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-006.html
new file mode 100644
index 0000000..22cb901
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-006.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - 0%</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set '0%', the actual width of tested element is same as 0." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: green;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #test {
+    background-color: red;
+    flex-basis: 0%;
+    height: 100px;
+    width: 100px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-007-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-007-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-007-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-007.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-007.html
new file mode 100644
index 0000000..4d13219
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-007.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - auto</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set 'auto', the actual width of tested element same as the value which specified by width property." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div{
+    background-color: green;
+    height: 100px;
+  }
+  #ref {
+    width: 50px;
+  }
+  #test {
+    flex-basis: auto;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test"></div>
+    <div id="ref"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-008-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-008-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-008-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-008.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-008.html
new file mode 100644
index 0000000..7fc0ec6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-008.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-basis - 50%</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Intel">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help" title="7.3.3. The 'flex-basis' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-basis' property set positive percentage, the actual width of tested element same as the percentage of flex container size." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div{
+    background-color: green;
+    height: 100px;
+  }
+  #ref {
+    width: 40px;
+  }
+  #test {
+    flex-basis: 60%;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="ref"></div>
+    <div id="test"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-010-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-010-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-010-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-010.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-010.html
new file mode 100644
index 0000000..1931633
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-basis-010.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: Indefinite % flex-basis should cause height to be ignored</title>
+<link href="https://www.google.com" rel="author" title="Google LLC">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    width: 100px;
+    flex-direction: column;
+  }
+  #item {
+    flex: 0 0 0%;
+    height: 500px;
+    background-color: red;
+  }
+  #child {
+    width: 100px; /* Cobalt does not support sizing from intrinsic ratio */
+    height: 100px;
+    background-color: green;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="item">
+      <div id="child"></div>
+    </div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-001-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-001-expected.png
new file mode 100644
index 0000000..5c2039d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-001-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-001.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-001.html
new file mode 100644
index 0000000..5229a83
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-001.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html>
+ <head>
+  <title>CSS Test: Flex-grow Property of Block-level Flex Items</title>
+  <link rel="author" title="Hanrui Gao" href="mailto:hanrui.gao@gmail.com">
+  <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property">
+  <link rel="match" href="reference/flex-grow-001-ref.htm">
+  <meta name="flags" content="">
+  <meta name="assert" content="'flex-grow' property specifies the flex grow factor, which determines how much the flex item will grow relative to the rest of the flex items in the flex container when positive free space is distributed.">
+  <style type="text/css">
+   body {
+     margin: 0px;
+     background-color: white;
+     font-family: Roboto;
+     font-size: 16px;
+   }
+   #container {
+     width: 240px;
+     height: 60px;
+     border: 1px solid #000;
+     display: flex;
+   }
+   #container > div {
+     width: 30px;
+     height: 100%;
+   }
+   #child_1 {
+     flex-grow: 0;
+     background-color: green;
+   }
+   #child_2 {
+     flex-grow: 1;
+     background-color: blue;
+   }
+   #child_3 {
+     flex-grow: 2;
+     background-color: gray;
+   }
+  </style>
+ </head>
+ <body>
+   <div id="container">
+      <div id="child_1"></div>
+      <div id="child_2"></div>
+      <div id="child_3"></div>
+   </div>
+ </body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-002-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-002-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-002-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-002.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-002.html
new file mode 100644
index 0000000..f80a198
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-002.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-grow - 0(initial value)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property" rel="help" title="7.3.1. The 'flex-grow' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-grow' property initial value is '0', the flex item will keep the width when 'flex-grow' set '0'" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+    width: 20px;
+  }
+  #test1 {
+    background-color: green;
+    flex-grow: 1;
+  }
+  #test2 {
+    background-color: green;
+    flex-grow: 0;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-left: 80px;
+    margin-top: -100px;
+    width: 20px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+    <div id="test3"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-003-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-003-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-003-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-003.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-003.html
new file mode 100644
index 0000000..dec50a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-003.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-grow - negative number</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property" rel="help" title="7.3.1. The 'flex-grow' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-grow' property set negative number, the flex item will not grow." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: green;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    background-color: red;
+    height: 100px;
+  }
+  #test1 {
+    flex-grow: -2;
+    width: 25px;
+  }
+  #test2 {
+    flex-grow: -3;
+    width: 25px;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    position: relative;
+    top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-004-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-004-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-004-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-004.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-004.html
new file mode 100644
index 0000000..5dc73ab
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-004.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-grow - (invalid when no space distributed)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property" rel="help" title="7.3.1. The 'flex-grow' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-grow' property is invalid when the flex container has no space distributed." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+  }
+  #test1 {
+    flex-grow: 3;
+    width: 50px;
+  }
+  #test2 {
+    background-color: green;
+    flex-grow: 2;
+    width: 50px;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    position: relative;
+    top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-005-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-005-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-005-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-005.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-005.html
new file mode 100644
index 0000000..5777b89
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-005.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-grow - (invalid when applied to flex container)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property" rel="help" title="7.3.1. The 'flex-grow' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The 'flex-grow' property is invalid when the property applied to flex container." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: green;
+    display: flex;
+    flex-grow: 2;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    background-color: red;
+    height: 100px;
+    width: 25px;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    position: relative;
+    top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div></div>
+    <div></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-006-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-006-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-006-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-006.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-006.html
new file mode 100644
index 0000000..27f467e
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-006.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-grow - positive number(fill all space)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property" rel="help" title="7.3.1. The 'flex-grow' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="Test checks that all space of flex container will be filled when there is only one flex item and 'flex-grow' set any positive number." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  .container {
+    background-color: red;
+    display: flex;
+    height: 50px;
+    width: 100px;
+  }
+  .container > div {
+    background-color: green;
+    height: 50px;
+    width: 25px;
+  }
+  #test1 {
+    flex-grow: 1.5;
+  }
+  #test2 {
+    flex-grow: 2;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div class="container">
+    <div id="test1"></div>
+  </div>
+  <div class="container">
+    <div id="test2"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-007-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-007-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-007-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-007.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-007.html
new file mode 100644
index 0000000..7ad8bd2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-grow-007.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-grow - less than one</title>
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-grow-property" rel="help" title="7.3.1. The 'flex-grow' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="Test checks that remaining free space is calculated from 'flex-grow' set to positive number less than one." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  .container {
+    background: red;
+    height: 50px;
+    width: 100px;
+  }
+  #test1, #test2 {
+    display: flex;
+    width: 190px;
+  }
+  #test1 > div, #test2 > div {
+    background: green;
+    height: 50px;
+  }
+  #test1 > div {
+    flex-grow: 0.1;
+    width: 90px;
+  }
+  #test2 > div {
+    flex-grow: 0.05;
+    width: 45px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div class="container">
+    <div id="test1">
+      <div></div>
+    </div>
+  </div>
+  <div class="container">
+    <div id="test2">
+      <div></div>
+      <div></div>
+    </div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-001-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-001-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-001-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-001.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-001.html
new file mode 100644
index 0000000..c3e9400
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-001.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - number(positive)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex-shrink property set positive number determines how much the flex item will shrink relative to the rest of the flex items in the flex container when negative free space is distributed" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+    width: 100px;
+  }
+  #test1 {
+    flex-shrink: 2;
+  }
+  #test2 {
+    background-color: green;
+    flex-shrink: 3;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-top: -100px;
+    width: 60px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-002-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-002-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-002-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-002.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-002.html
new file mode 100644
index 0000000..3886162
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-002.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - number(negative)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex-shrink property set negative is invalid to shrink flex items when negative free space is distributed" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+    width: 100px;
+  }
+  #test1 {
+    flex-shrink: -2;
+  }
+  #test2 {
+    background-color: green;
+    flex-shrink: -3;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-003-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-003-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-003-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-003.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-003.html
new file mode 100644
index 0000000..74e8efe
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-003.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - 1(initial value)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex-shrink property initial value is 1" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+    width: 100px;
+  }
+  #test2 {
+    background-color: green;
+    flex-shrink: 4;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-top: -100px;
+    width: 80px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-004-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-004-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-004-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-004.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-004.html
new file mode 100644
index 0000000..7083ada
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-004.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - number(flex container has enough space)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex-shrink property is invalid when flex container has enough space to load flex items" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    background-color: green;
+    height: 100px;
+    width: 40px;
+  }
+  #test1 {
+    flex-shrink: 2;
+  }
+  #test2 {
+    flex-shrink: 3;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-left: 80px;
+    margin-top: -100px;
+    width: 20px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-005-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-005-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-005-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-005.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-005.html
new file mode 100644
index 0000000..a344bfc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-005.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - 0</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex-shrink property set 0 will ignore the flex container" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 50px;
+  }
+  #container div {
+    height: 100px;
+    width: 50px;
+  }
+  #test1 {
+    flex-shrink: 0;
+  }
+  #test2 {
+    background-color: green;
+    flex-shrink: 0;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-006-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-006-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-006-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-006.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-006.html
new file mode 100644
index 0000000..9a47f04
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-006.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - 0(one of flex-shrinks sets 0, another not)</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex item whose flex-shrink property of set 0 will displayed on the top of all flex items" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+    width: 100px;
+  }
+  #test1 {
+    background-color: green;
+    flex-shrink: 0;
+  }
+  #test2 {
+    background-color: yellow;
+    flex-shrink: 0.1;
+  }
+  #test3 {
+    background-color: blue;
+    flex-shrink: 2;
+  }
+  #test2 {
+    background-color: black;
+    flex-shrink: 3;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+    <div id="test3"></div>
+    <div id="test4"></div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-007-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-007-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-007-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-007.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-007.html
new file mode 100644
index 0000000..4057f82
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-007.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - applied to flex container</title>
+<link href="http://www.intel.com" rel="author" title="Intel">
+<link href="mailto:shiyoux.tan@intel.com" rel="author" title="Shiyou Tan">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.2. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="The flex-shrink property applied to flex container is invalid, all flex items will use the default value 1" name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  #container {
+    background-color: red;
+    display: flex;
+    flex-shrink: 2;
+    height: 100px;
+    width: 100px;
+  }
+  #container div {
+    height: 100px;
+    width: 100px;
+  }
+  #test2 {
+    background-color: green;
+  }
+  #cover {
+    background-color: green;
+    height: 100px;
+    margin-top: -100px;
+    width: 50px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div id="container">
+    <div id="test1"></div>
+    <div id="test2"></div>
+  </div>
+  <div id="cover"></div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-008-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-008-expected.png
new file mode 100644
index 0000000..a3672fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-008-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-008.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-008.html
new file mode 100644
index 0000000..19b88e0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-shrink-008.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><meta charset="utf-8">
+<title>CSS Flexbox Test: flex-shrink - less than one</title>
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-shrink-property" rel="help" title="7.3.1. The 'flex-shrink' property">
+<link href="reference/ref-filled-green-100px-square.htm" rel="match">
+<meta content="" name="flags">
+<meta content="Test checks that remaining free space is calculated from 'flex-shrink' set to positive number less than one." name="assert">
+<style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  .container {
+    background: red;
+    height: 50px;
+    width: 100px;
+  }
+  #test1, #test2 {
+    display: flex;
+    width: 50px;
+  }
+  #test1 > div, #test2 > div {
+    background: green;
+    height: 50px;
+  }
+  #test1 > div {
+    flex-shrink: 0.9;
+    width: 550px;
+  }
+  #test2 > div {
+    flex-shrink: 0.25;
+    width: 75px;
+  }
+</style>
+</head><body>
+  <span>Test passes if there is a filled green square and no red.</span>
+  <div class="container">
+    <div id="test1">
+      <div></div>
+    </div>
+  </div>
+  <div class="container">
+    <div id="test2">
+      <div></div>
+      <div></div>
+    </div>
+  </div>
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001a-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001a-expected.png
new file mode 100644
index 0000000..44c98e6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001a-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001a.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001a.html
new file mode 100644
index 0000000..ae12316
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001a.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+--><html><head>
+  <title>
+    CSS Test: Testing "flex-basis: content" in a row-oriented flex container
+  </title>
+  <meta charset="utf-8">
+  <link href="mailto:dholbert@mozilla.com" rel="author" title="Daniel Holbert">
+  <link href="https://www.w3.org/TR/css-flexbox-1/#propdef-flex-basis" rel="help">
+  <link href="reference/flexbox-flex-basis-content-001-ref.htm" rel="match">
+  <style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 24px;
+  }
+  .container {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    border: 2px solid purple;
+    padding: 2px;
+    margin-bottom: 2em;
+    height: 50px;
+    width: 200px;
+  }
+
+  .container > * {
+    /* All flex items have "flex-basis: content" (and zero flex-shrink and
+       min-main-size, to avoid any influence from those). */
+    flex-basis: content;
+    flex-shrink: 0;
+    min-width: 0;
+    border: 2px solid #008080;
+  }
+
+  .smallText { font: 10px Roboto; }
+  .bigText   { font: 20px Roboto; }
+  .spacerChild::before {
+    content: '';
+    display: block;
+    background: #A52A2A;
+    height: 10px;
+    width: 10px;
+  }
+  .justPadding {
+    /* Empty div with 5px padding on each side */
+    padding: 5px;
+    background: #00FFFF;
+  }
+  #canvas { background: fuchsia }
+  </style>
+</head>
+<body>
+<!-- Flex items have unspecified size properties: -->
+<div class="container">
+  <div class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div class="bigText">&#x2588;</div>
+  <div class="spacerChild"></div>
+  <div class="justPadding"></div>
+  <div id="canvas" style="width: 20px"></div>
+</div>
+
+<!-- Various specified main-size values (should be ignored): -->
+<div class="container">
+  <div style="width: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="width: 40px" class="bigText">&#x2588;</div>
+  <div style="width: 20px" class="spacerChild"></div>
+  <div style="width: 10px" class="justPadding"></div>
+  <div id="canvas" style="width: 8px"></div>
+</div>
+
+<!-- Various specified cross-size values (should be honored): -->
+<div class="container">
+  <div style="height: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="height: 40px" class="bigText">&#x2588;</div>
+  <div style="height: 20px" class="spacerChild"></div>
+  <div style="height: 10px" class="justPadding"></div>
+  <div id="canvas" style="height: 8px"></div>
+</div>
+
+
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001b-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001b-expected.png
new file mode 100644
index 0000000..4acefcb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001b-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001b.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001b.html
new file mode 100644
index 0000000..efd948f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-001b.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+--><html><head>
+  <title>
+    CSS Test: Testing "flex-basis: content" (set via the "flex" shorthand)
+    in a row-oriented flex container.
+  </title>
+  <meta charset="utf-8">
+  <link href="mailto:dholbert@mozilla.com" rel="author" title="Daniel Holbert">
+  <link href="https://www.w3.org/TR/css-flexbox-1/#propdef-flex-basis" rel="help">
+  <link href="reference/flexbox-flex-basis-content-001-ref.htm" rel="match">
+  <style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  .container {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    border: 2px solid purple;
+    padding: 2px;
+    margin-bottom: 2em;
+    height: 50px;
+    width: 200px;
+  }
+
+  .container > * {
+    /* All flex items have "flex-basis: content" (and zero flex-shrink and
+       min-main-size, to avoid any influence from those). */
+    flex: 0 0 content;
+    min-width: 0;
+    border: 2px solid #008080;
+  }
+
+  .smallText { font: 10px Roboto; }
+  .bigText   { font: 20px Roboto; }
+  .spacerChild::before {
+    content: '';
+    display: block;
+    background: #A52A2A;
+    height: 10px;
+    width: 10px;
+  }
+  .justPadding {
+    /* Empty div with 5px padding on each side */
+    padding: 5px;
+    background: #00FFFF;
+  }
+  #canvas { background: fuchsia }
+  </style>
+</head>
+<body>
+<!-- Flex items have unspecified size properties: -->
+<div class="container">
+  <div class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div class="bigText">&#x2588;</div>
+  <div class="spacerChild"></div>
+  <div class="justPadding"></div>
+  <div id="canvas" style="width: 20px;"></div>
+</div>
+
+<!-- Various specified main-size values (should be ignored): -->
+<div class="container">
+  <div style="width: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="width: 40px" class="bigText">&#x2588;</div>
+  <div style="width: 20px" class="spacerChild"></div>
+  <div style="width: 10px" class="justPadding"></div>
+  <div id="canvas" style="width: 8px"></div>
+</div>
+
+<!-- Various specified cross-size values (should be honored): -->
+<div class="container">
+  <div style="height: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="height: 40px" class="bigText">&#x2588;</div>
+  <div style="height: 20px" class="spacerChild"></div>
+  <div style="height: 10px" class="justPadding"></div>
+  <div id="canvas" style="height: 8px"></div>
+</div>
+
+
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002a-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002a-expected.png
new file mode 100644
index 0000000..7ec04ca
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002a-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002a.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002a.html
new file mode 100644
index 0000000..8626ce9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002a.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+--><html><head>
+  <title>
+    CSS Test: Testing "flex-basis: content" in a column-oriented flex container
+  </title>
+  <meta charset="utf-8">
+  <link href="mailto:dholbert@mozilla.com" rel="author" title="Daniel Holbert">
+  <link href="https://www.w3.org/TR/css-flexbox-1/#propdef-flex-basis" rel="help">
+  <link href="reference/flexbox-flex-basis-content-002-ref.htm" rel="match">
+  <style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  .container {
+    display: inline-flex;
+    vertical-align: top;
+    flex-direction: column;
+    justify-content: space-between;
+    border: 2px solid purple;
+    padding: 2px;
+    margin-right: 2em;
+    width: 50px;
+    height: 200px;
+  }
+
+  .container > * {
+    /* All flex items have "flex-basis: content" (and zero flex-shrink and
+       min-main-size, to avoid any influence from those). */
+    flex-basis: content;
+    flex-shrink: 0;
+    min-height: 0;
+    border: 2px solid #008080;
+  }
+
+  .smallText { font: 10px Roboto; }
+  .bigText   { font: 20px Roboto; }
+  .spacerChild::before {
+    content: '';
+    display: block;
+    background: #A52A2A;
+    height: 10px;
+    width: 10px;
+  }
+  .justPadding {
+    /* Empty div with 5px padding on each side */
+    padding: 5px;
+    background: #00FFFF;
+  }
+  #canvas { background: fuchsia }
+  </style>
+</head>
+<body>
+<!-- Flex items have unspecified size properties: -->
+<div class="container">
+  <div class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div class="bigText">&#x2588;</div>
+  <div class="spacerChild"></div>
+  <div class="justPadding"></div>
+  <div id="canvas" style="height: 20px;"></div>
+</div>
+
+<!-- Various specified main-size values (should be ignored): -->
+<div class="container">
+  <div style="height: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="height: 40px" class="bigText">&#x2588;</div>
+  <div style="height: 20px" class="spacerChild"></div>
+  <div style="height: 10px" class="justPadding"></div>
+  <div id="canvas" style="height: 8px"></div>
+</div>
+
+<!-- Various specified cross-size values (should be honored): -->
+<div class="container">
+  <div style="width: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="width: 40px" class="bigText">&#x2588;</div>
+  <div style="width: 20px" class="spacerChild"></div>
+  <div style="width: 10px" class="justPadding"></div>
+  <div id="canvas" style="width: 8px"></div>
+</div>
+
+
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002b-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002b-expected.png
new file mode 100644
index 0000000..7ec04ca
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002b-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002b.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002b.html
new file mode 100644
index 0000000..d2d5caa
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox-flex-basis-content-002b.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+--><html><head>
+  <title>
+    CSS Test: Testing "flex-basis: content" (set via the "flex" shorthand)
+    in a column-oriented flex container.
+  </title>
+  <meta charset="utf-8">
+  <link href="mailto:dholbert@mozilla.com" rel="author" title="Daniel Holbert">
+  <link href="https://www.w3.org/TR/css-flexbox-1/#propdef-flex-basis" rel="help">
+  <link href="reference/flexbox-flex-basis-content-002-ref.htm" rel="match">
+  <style>
+  body {
+    margin: 0px;
+    background-color: white;
+    font-family: Roboto;
+    font-size: 16px;
+  }
+  .container {
+    display: inline-flex;
+    vertical-align: top;
+    flex-direction: column;
+    justify-content: space-between;
+    border: 2px solid purple;
+    padding: 2px;
+    margin-right: 2em;
+    width: 50px;
+    height: 200px;
+  }
+
+  .container > * {
+    /* All flex items have "flex-basis: content" (and zero flex-shrink and
+       min-main-size, to avoid any influence from those). */
+    flex: 0 0 content;
+    min-height: 0;
+    border: 2px solid #008080;
+  }
+
+  .smallText { font: 10px Roboto; }
+  .bigText   { font: 20px Roboto; }
+  .spacerChild::before {
+    content: '';
+    display: block;
+    background: #A52A2A;
+    height: 10px;
+    width: 10px;
+  }
+  .justPadding {
+    /* Empty div with 5px padding on each side */
+    padding: 5px;
+    background: #00FFFF;
+  }
+  #canvas { background: fuchsia }
+  </style>
+</head>
+<body>
+<!-- Flex items have unspecified size properties: -->
+<div class="container">
+  <div class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div class="bigText">&#x2588;</div>
+  <div class="spacerChild"></div>
+  <div class="justPadding"></div>
+  <div id="canvas" style="height: 20px;"></div>
+</div>
+
+<!-- Various specified main-size values (should be ignored): -->
+<div class="container">
+  <div style="height: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="height: 40px" class="bigText">&#x2588;</div>
+  <div style="height: 20px" class="spacerChild"></div>
+  <div style="height: 10px" class="justPadding"></div>
+  <div id="canvas" style="height: 8px"></div>
+</div>
+
+<!-- Various specified cross-size values (should be honored): -->
+<div class="container">
+  <div style="width: 0px" class="smallText">&#x2588;&#x2002;&#x2002;&#x2588;</div>
+  <div style="width: 40px" class="bigText">&#x2588;</div>
+  <div style="width: 20px" class="spacerChild"></div>
+  <div style="width: 10px" class="justPadding"></div>
+  <div id="canvas" style="width: 8px"></div>
+</div>
+
+
+
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html
new file mode 100644
index 0000000..13cd33d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html><head><title>flexbox | flex: 0 0 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
+
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0.html
new file mode 100644
index 0000000..d925ce1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-expected.png
new file mode 100644
index 0000000..68f4821
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink-expected.png
new file mode 100644
index 0000000..8f80abb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html
new file mode 100644
index 0000000..6fd71f1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis-expected.png
new file mode 100644
index 0000000..f551ef2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html
new file mode 100644
index 0000000..ff27572
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 N unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-unitless-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 4;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html
new file mode 100644
index 0000000..4282bbb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-expected.png
new file mode 100644
index 0000000..cb5a5d5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink-expected.png
new file mode 100644
index 0000000..ad09585
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html
new file mode 100644
index 0000000..653d7fb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html
new file mode 100644
index 0000000..cd52187
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-expected.png
new file mode 100644
index 0000000..f551ef2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink-expected.png
new file mode 100644
index 0000000..14e1f95
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html
new file mode 100644
index 0000000..82f3196
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 0 auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto.html
new file mode 100644
index 0000000..da3f2cf
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html><head><title>flexbox | flex: 0 0 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0.html
new file mode 100644
index 0000000..76216b1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html><head><title>flexbox | flex: 0 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 79px;
+	display: inline-block;
+
+  flex: 0 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html
new file mode 100644
index 0000000..b5a184e
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html
new file mode 100644
index 0000000..f384e46
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis-expected.png
new file mode 100644
index 0000000..f551ef2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html
new file mode 100644
index 0000000..cfb60db
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 1 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-unitless-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 1;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-expected.png
new file mode 100644
index 0000000..68f4821
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html
new file mode 100644
index 0000000..fee0867
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis-expected.png
new file mode 100644
index 0000000..f551ef2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html
new file mode 100644
index 0000000..ef1642c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 N unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-unitless-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 4;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html
new file mode 100644
index 0000000..53b2092
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-expected.png
new file mode 100644
index 0000000..cb5a5d5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html
new file mode 100644
index 0000000..85de799
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html
new file mode 100644
index 0000000..cbbbfdf
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-expected.png
new file mode 100644
index 0000000..f551ef2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink-expected.png
new file mode 100644
index 0000000..83908a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html
new file mode 100644
index 0000000..6b5af92
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html
new file mode 100644
index 0000000..8394293
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html
new file mode 100644
index 0000000..23133be
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 1</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 1;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html
new file mode 100644
index 0000000..ad11723
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html
new file mode 100644
index 0000000..5591371
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-expected.png
new file mode 100644
index 0000000..68f4821
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html
new file mode 100644
index 0000000..c1f9664
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html
new file mode 100644
index 0000000..87a779a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-expected.png
new file mode 100644
index 0000000..cb5a5d5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html
new file mode 100644
index 0000000..bdb31b9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html
new file mode 100644
index 0000000..c5ef228
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-expected.png
new file mode 100644
index 0000000..f551ef2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink-expected.png
new file mode 100644
index 0000000..83908a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html
new file mode 100644
index 0000000..50b8362
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html
new file mode 100644
index 0000000..1cad65a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-expected.png
new file mode 100644
index 0000000..70bfb71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html
new file mode 100644
index 0000000..8ff465f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-0-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 0 2;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-auto-expected.png
new file mode 100644
index 0000000..3a40ec6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-auto.html
new file mode 100644
index 0000000..9721f85
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-auto.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 0 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-initial-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 22em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em;
+	width: 5em;
+	display: inline-block;
+	flex: 0 auto;
+}
+#flex span {
+	flex: 0 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+
+<div id="flex">
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html
new file mode 100644
index 0000000..1d91ca7
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html
new file mode 100644
index 0000000..1b872f3
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink-expected.png
new file mode 100644
index 0000000..8f80abb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html
new file mode 100644
index 0000000..6db4e48
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html
new file mode 100644
index 0000000..143a3f8
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink-expected.png
new file mode 100644
index 0000000..ad09585
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html
new file mode 100644
index 0000000..16accb5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html
new file mode 100644
index 0000000..49f167c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink-expected.png
new file mode 100644
index 0000000..14e1f95
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html
new file mode 100644
index 0000000..3ac1b32
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html
new file mode 100644
index 0000000..a47aa92
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html
new file mode 100644
index 0000000..5f81201
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html
new file mode 100644
index 0000000..d0ca3ad
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html
new file mode 100644
index 0000000..36b42cf
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html
new file mode 100644
index 0000000..19f6aaf
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html
new file mode 100644
index 0000000..a4d66ef
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html
new file mode 100644
index 0000000..7767e48
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html
new file mode 100644
index 0000000..d418b74
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink-expected.png
new file mode 100644
index 0000000..83908a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html
new file mode 100644
index 0000000..c450b73
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html
new file mode 100644
index 0000000..2042924
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html
new file mode 100644
index 0000000..4beb0d0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 1</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html
new file mode 100644
index 0000000..50222c1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html
new file mode 100644
index 0000000..305b009
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html
new file mode 100644
index 0000000..d84e167
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html
new file mode 100644
index 0000000..0ab4625
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html
new file mode 100644
index 0000000..81a4616
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html
new file mode 100644
index 0000000..70a627a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink-expected.png
new file mode 100644
index 0000000..83908a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html
new file mode 100644
index 0000000..ab9b624
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html
new file mode 100644
index 0000000..4db4360
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html
new file mode 100644
index 0000000..963ac54
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: 1 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-1-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 2;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html
new file mode 100644
index 0000000..3615e92
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html
new file mode 100644
index 0000000..2fc964e
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink-expected.png
new file mode 100644
index 0000000..8f80abb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html
new file mode 100644
index 0000000..49535e8
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html
new file mode 100644
index 0000000..f92c08f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink-expected.png
new file mode 100644
index 0000000..ad09585
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html
new file mode 100644
index 0000000..078e7de
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html
new file mode 100644
index 0000000..742276d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink-expected.png
new file mode 100644
index 0000000..a6e5b45
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html
new file mode 100644
index 0000000..367c74f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html
new file mode 100644
index 0000000..e828eb1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html
new file mode 100644
index 0000000..c7055f9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-0-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html
new file mode 100644
index 0000000..47692f2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html
new file mode 100644
index 0000000..908d527
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html
new file mode 100644
index 0000000..a465efc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html
new file mode 100644
index 0000000..4ff4338
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html
new file mode 100644
index 0000000..2f4aac2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html
new file mode 100644
index 0000000..f265c9f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink-expected.png
new file mode 100644
index 0000000..83908a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html
new file mode 100644
index 0000000..b1104db
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html
new file mode 100644
index 0000000..cbdeebd
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1 auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html
new file mode 100644
index 0000000..b7b0dd5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N 1</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-1-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 1;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html
new file mode 100644
index 0000000..caa8853
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N 0 unitless</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 0;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html
new file mode 100644
index 0000000..13aa940
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N 0</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html
new file mode 100644
index 0000000..2b1ea71
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N N | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-N-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html
new file mode 100644
index 0000000..ef9ee60
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-N-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 4em;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink-expected.png
new file mode 100644
index 0000000..705ab99
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html
new file mode 100644
index 0000000..18cc941
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N N% | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-Npercent-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 12em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html
new file mode 100644
index 0000000..f34d420
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N N%</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-Npercent-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 20%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink-expected.png
new file mode 100644
index 0000000..83908a1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html
new file mode 100644
index 0000000..e9c477c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N auto | shrinking</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-auto-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 16em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html
new file mode 100644
index 0000000..5632c6e
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-expected.png
new file mode 100644
index 0000000..abe04c5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html
new file mode 100644
index 0000000..af36e0b
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: N N</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-property" rel="help">
+<link href="reference/flexbox_flex-N-N-0-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 4 2;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-auto-expected.png
new file mode 100644
index 0000000..40a52ad
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-auto.html
new file mode 100644
index 0000000..45e6326
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-auto.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-common" rel="help">
+<link href="reference/flexbox_flex-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 32em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em;
+	width: 5em;
+	display: inline-block;
+
+	flex: auto;
+}
+#flex span {
+	flex: 1 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+
+<div id="flex">
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-expected.png
new file mode 100644
index 0000000..723273a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-shrink-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-shrink-expected.png
new file mode 100644
index 0000000..16b719f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-shrink-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-shrink.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-shrink.html
new file mode 100644
index 0000000..9f0f5aa
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis-shrink.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex-basis: percentage, flex-shrink: +integer</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/flexbox_flex-basis-shrink-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 24em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 50%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis.html
new file mode 100644
index 0000000..f662992
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-basis.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex-basis: percentage</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/flexbox_flex-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 8em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex-grow: 1;
+	flex-shrink: 0;
+	flex-basis: 100%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-2-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-2-expected.png
new file mode 100644
index 0000000..e33fba9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-2-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-2.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-2.html
new file mode 100644
index 0000000..e771372
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-2.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: initial</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-common" rel="help">
+<link href="reference/flexbox_flex-initial-2-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 40em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em;
+	width: 5em;
+	display: inline-block;
+	flex: initial;
+}
+#flex span {
+	flex: 0 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+
+<div id="flex">
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-expected.png
new file mode 100644
index 0000000..3a40ec6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial.html
new file mode 100644
index 0000000..45a9e9f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-initial.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: initial</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-common" rel="help">
+<link href="reference/flexbox_flex-initial-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 22em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em;
+	width: 5em;
+	display: inline-block;
+	flex: initial;
+}
+#flex span {
+	flex: 0 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+
+<div id="flex">
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-expected.png
new file mode 100644
index 0000000..15e8ee6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto-expected.png
new file mode 100644
index 0000000..d2247f2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html
new file mode 100644
index 0000000..eaee537
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: larger integer, mixed basis, auto</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/flexbox_flex-natural-mixed-basis-auto-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	font-family: Roboto;
+	background: blue;
+	height: 8em;
+	width: 35em;
+
+	display: flex;
+}
+span {
+	font-family: Roboto;
+	background: white;
+
+	flex: 1 1 auto;
+}
+span:nth-child(1) {
+	flex: 1 1 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">&#x2588;</span>
+	<span style="background: #FFC0CB;">&#x2588;&#x2588;&#x2588;</span>
+	<span style="background: #ADD8E6;">&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;</span>
+	<span style="background: #808080;">&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;</span>
+</div>
+</body></html>
+
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-expected.png
new file mode 100644
index 0000000..e9d91b0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis.html
new file mode 100644
index 0000000..29211df
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: larger integer, mixed basis</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/flexbox_flex-natural-mixed-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	height: 8em;
+	width: 35em;
+
+	display: flex;
+}
+span {
+	background: white;
+	width: 5em;
+
+	flex: 1 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow; flex: 1 1 0%;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-auto-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-auto-basis-expected.png
new file mode 100644
index 0000000..90a7936
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-auto-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-auto-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-auto-basis.html
new file mode 100644
index 0000000..bbb8754
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-auto-basis.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: larger integer, auto basis</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/flexbox_flex-natural-variable-auto-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	border: 1px solid black;
+	height: 8em;
+	width: 32em;
+
+	display: flex;
+}
+span {
+	width: 5em;
+	display: inline-block;
+
+	flex: 1 1 auto;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB; flex: 3 1 auto;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-zero-basis-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-zero-basis-expected.png
new file mode 100644
index 0000000..188c761
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-zero-basis-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-zero-basis.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-zero-basis.html
new file mode 100644
index 0000000..6bbbe18
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-variable-zero-basis.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: larger integer, zero basis</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property" rel="help">
+<link href="reference/flexbox_flex-natural-variable-zero-basis-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	border: 1px solid black;
+	height: 8em;
+	width: 36em;
+
+	display: flex;
+}
+span {
+	width: 6em;
+	display: block;
+
+	flex: 1 1 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB; flex: 3 1 0%;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural.html
new file mode 100644
index 0000000..6c34222
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: larger integer</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-common" rel="help">
+<link href="reference/flexbox_flex-natural-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 800px;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em 0;
+	width: 5em;
+	display: inline-block;
+
+	flex: 2;
+}
+#flex span {
+	flex: 666 1 0%;
+}
+</style>
+
+</head><body><div>
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+
+<div id="flex">
+	<span style="background: yellow;">one</span>
+	<span style="background: #FFC0CB;">two</span>
+	<span style="background: #ADD8E6;">three</span>
+	<span style="background: #808080;">four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-none-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-none-expected.png
new file mode 100644
index 0000000..0d3fe60
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-none-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-none.html b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-none.html
new file mode 100644
index 0000000..1b48c38
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-none.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<!--
+ | Flexbox unit test from csswg.
+ |   http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ -->
+<html><head><title>flexbox | flex: none</title>
+<link href="http://opera.com" rel="author" title="Opera Software">
+<link href="http://www.w3.org/TR/css-flexbox-1/#flex-common" rel="help">
+<link href="reference/flexbox_flex-none-ref.htm" rel="match">
+<style>
+body {
+  margin: 0px;
+  background-color: white;
+  font-family: Roboto;
+  font-size: 16px;
+}
+div {
+	background: blue;
+	margin: 1em 0;
+	border: 1px solid black;
+	height: 8em;
+	width: 32em;
+
+	display: flex;
+}
+span {
+	background: white;
+	margin: 1em;
+	width: 5em;
+	display: inline-block;
+
+	flex: none;
+}
+#flex span {
+	flex: 0 0 auto;
+}
+</style>
+
+</head><body><div>
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+
+<div id="flex">
+	<span>one</span>
+	<span>two</span>
+	<span>three</span>
+	<span>four</span>
+</div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/flex-items-flexibility-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/flex-items-flexibility-expected.png
new file mode 100644
index 0000000..42eecb9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/flex-items-flexibility-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/flex-items-flexibility.html b/src/cobalt/layout_tests/testdata/css3-flexbox/flex-items-flexibility.html
new file mode 100644
index 0000000..96f144f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/flex-items-flexibility.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<!--
+ | Testcase from:
+ | http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/chapter-7.htm
+ | Test: flex-items-flexibility
+ | http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/html/flex-items-flexibility.htm
+ -->
+<html>
+  <head>
+    <title>CSS Flex-basis Test</title>
+    <link href="mailto:zhangcs_423@163.com" rel="author" title="Chunsheng Zhang">
+    <link href="http://www.w3.org/TR/css-flexbox-1/#flexibility" rel="help">
+    <link href="reference/flex-items-flexibility.htm" rel="match">
+    <meta content="flex items flexibility" name="assert">
+    <style type="text/css">
+      body {
+        margin: 0px;
+        background-color: white;
+        font-family: Roboto;
+        font-size: 16px;
+      }
+      #container {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border: 5px solid green;
+        width: 600px;
+        height: 200px;
+        padding: 5px;
+        border-radius: 3px;
+        position: absolute;
+        top: 70px;
+        left: 10px;
+      }
+      div {
+        padding: 10px;
+        width: 30px;
+        height: 40px;
+        text-align: center;
+        flex: 1 0 auto;
+      }
+      #flex {
+        border: 2px dotted blue;
+        background: green;
+        border-radius: 3px;
+        flex: 2 0 auto;
+      }
+      #fail-flag {
+        position: absolute;
+        padding: 10px;
+        top: 150px;
+        left: 183px;
+        width: 254px;
+        height: 40px;
+        background: red;
+      }
+    </style>
+  </head>
+  <body>
+    <p>This case tests that flex items flexibility</p>
+    <p>The test passes if there is no red</p>
+    <div id="fail-flag"></div>
+    <section id="container">
+      <div></div>
+      <div id="flex"></div>
+      <div></div>
+    </section>
+  </body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt b/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt
index 0249f80..c8a34e8 100644
--- a/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt
@@ -5,3 +5,133 @@
 combined-shrinking-and-justify-content
 combined-with-baselines-percentages
 content-based-minimum-size
+csswg_flex-001
+csswg_flex-002
+csswg_flex-003
+csswg_flex-004
+csswg_flex-basis-001
+csswg_flex-basis-002
+csswg_flex-basis-003
+csswg_flex-basis-004
+csswg_flex-basis-005
+csswg_flex-basis-006
+csswg_flex-basis-007
+csswg_flex-basis-008
+# Disabled edge case. csswg_flex-basis-010
+csswg_flexbox_flex-0-0
+csswg_flexbox_flex-0-0-0
+csswg_flexbox_flex-0-0-0-unitless
+csswg_flexbox_flex-0-0-auto
+csswg_flexbox_flex-0-0-auto-shrink
+csswg_flexbox_flex-0-0-N
+csswg_flexbox_flex-0-0-Npercent
+csswg_flexbox_flex-0-0-Npercent-shrink
+csswg_flexbox_flex-0-0-N-shrink
+csswg_flexbox_flex-0-0-N-unitless-basis
+csswg_flexbox_flex-0-1
+csswg_flexbox_flex-0-1-0
+csswg_flexbox_flex-0-1-0-unitless
+csswg_flexbox_flex-0-1-1-unitless-basis
+csswg_flexbox_flex-0-1-auto
+csswg_flexbox_flex-0-1-auto-shrink
+csswg_flexbox_flex-0-1-N
+csswg_flexbox_flex-0-1-Npercent
+csswg_flexbox_flex-0-1-Npercent-shrink
+csswg_flexbox_flex-0-1-N-shrink
+csswg_flexbox_flex-0-1-N-unitless-basis
+csswg_flexbox_flex-0-auto
+csswg_flexbox_flex-0-N
+csswg_flexbox_flex-0-N-0
+csswg_flexbox_flex-0-N-0-unitless
+csswg_flexbox_flex-0-N-auto
+csswg_flexbox_flex-0-N-auto-shrink
+csswg_flexbox_flex-0-N-N
+csswg_flexbox_flex-0-N-Npercent
+csswg_flexbox_flex-0-N-Npercent-shrink
+csswg_flexbox_flex-0-N-N-shrink
+csswg_flexbox_flex-1-0
+csswg_flexbox_flex-1-0-0
+csswg_flexbox_flex-1-0-0-unitless
+csswg_flexbox_flex-1-0-auto
+csswg_flexbox_flex-1-0-auto-shrink
+csswg_flexbox_flex-1-0-N
+csswg_flexbox_flex-1-0-Npercent
+csswg_flexbox_flex-1-0-Npercent-shrink
+csswg_flexbox_flex-1-0-N-shrink
+csswg_flexbox_flex-1-1
+csswg_flexbox_flex-1-1-0
+csswg_flexbox_flex-1-1-0-unitless
+csswg_flexbox_flex-1-1-auto
+csswg_flexbox_flex-1-1-auto-shrink
+csswg_flexbox_flex-1-1-N
+csswg_flexbox_flex-1-1-Npercent
+csswg_flexbox_flex-1-1-Npercent-shrink
+csswg_flexbox_flex-1-1-N-shrink
+csswg_flexbox_flex-1-N
+csswg_flexbox_flex-1-N-0
+csswg_flexbox_flex-1-N-0-unitless
+csswg_flexbox_flex-1-N-auto
+csswg_flexbox_flex-1-N-auto-shrink
+csswg_flexbox_flex-1-N-N
+csswg_flexbox_flex-1-N-Npercent
+csswg_flexbox_flex-1-N-Npercent-shrink
+csswg_flexbox_flex-1-N-N-shrink
+csswg_flexbox_flex-auto
+csswg_flexbox_flex-basis
+csswg_flexbox-flex-basis-content-001a
+csswg_flexbox-flex-basis-content-001b
+csswg_flexbox-flex-basis-content-002a
+csswg_flexbox-flex-basis-content-002b
+csswg_flexbox_flex-basis-shrink
+csswg_flexbox_flex-initial
+csswg_flexbox_flex-initial-2
+csswg_flexbox_flex-N-0
+csswg_flexbox_flex-N-0-0
+csswg_flexbox_flex-N-0-0-unitless
+csswg_flexbox_flex-N-0-auto
+csswg_flexbox_flex-N-0-auto-shrink
+csswg_flexbox_flex-N-0-N
+csswg_flexbox_flex-N-0-Npercent
+csswg_flexbox_flex-N-0-Npercent-shrink
+csswg_flexbox_flex-N-0-N-shrink
+csswg_flexbox_flex-N-1
+csswg_flexbox_flex-N-1-0
+csswg_flexbox_flex-N-1-0-unitless
+csswg_flexbox_flex-N-1-auto
+csswg_flexbox_flex-N-1-auto-shrink
+csswg_flexbox_flex-N-1-N
+csswg_flexbox_flex-N-1-Npercent
+csswg_flexbox_flex-N-1-Npercent-shrink
+csswg_flexbox_flex-N-1-N-shrink
+csswg_flexbox_flex-natural
+csswg_flexbox_flex-natural-mixed-basis
+csswg_flexbox_flex-natural-mixed-basis-auto
+csswg_flexbox_flex-natural-variable-auto-basis
+csswg_flexbox_flex-natural-variable-zero-basis
+csswg_flexbox_flex-N-N
+csswg_flexbox_flex-N-N-0
+csswg_flexbox_flex-N-N-0-unitless
+csswg_flexbox_flex-N-N-auto
+csswg_flexbox_flex-N-N-auto-shrink
+csswg_flexbox_flex-N-N-N
+csswg_flexbox_flex-N-N-Npercent
+csswg_flexbox_flex-N-N-Npercent-shrink
+csswg_flexbox_flex-N-N-N-shrink
+csswg_flexbox_flex-none
+csswg_flex-grow-001
+csswg_flex-grow-002
+csswg_flex-grow-003
+csswg_flex-grow-004
+csswg_flex-grow-005
+csswg_flex-grow-006
+csswg_flex-grow-007
+csswg_flex-shrink-001
+csswg_flex-shrink-002
+csswg_flex-shrink-003
+csswg_flex-shrink-004
+csswg_flex-shrink-005
+csswg_flex-shrink-006
+csswg_flex-shrink-007
+csswg_flex-shrink-008
+flex-items-flexibility
+positioned-containers
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/positioned-containers-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/positioned-containers-expected.png
new file mode 100644
index 0000000..c6b3339
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/positioned-containers-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/positioned-containers.html b/src/cobalt/layout_tests/testdata/css3-flexbox/positioned-containers.html
new file mode 100644
index 0000000..456dafa
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/positioned-containers.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<!--
+ | Test flexbox containers with absolute positioning.
+ -->
+<html><head>
+    <style type="text/css">
+      body {
+        margin: 0px;
+        background-color: white;
+        font-family: Roboto;
+        font-size: 16px;
+      }
+      .container {
+        display: flex;
+        justify-content: flex-start;
+        align-items: flex-start;
+        border: 5px solid green;
+        width: 40px;
+        height: 50px;
+        padding: 4%;
+        top: 30px;
+        left: 20px;
+        margin: 1%;
+      }
+      .column {
+        flex-direction: column;
+      }
+      .absolute {
+        position: absolute;
+      }
+      .fixed {
+        position: fixed;
+      }
+      .relative {
+        position: relative;
+      }
+      .static {
+        position: static;
+      }
+      .container > div {
+        padding: 5px;
+        width: 5px;
+        height: 20px;
+        text-align: center;
+        border: 2px solid blue;
+        background: green;
+        flex: 1 0 auto;
+      }
+      .column > div {
+        background: #80ff80;
+      }
+      .containingblock {
+        display: inline-block;
+        position: relative;
+        width: 80px;
+        height: 190px;
+        background-color: yellow;
+      }
+    </style>
+  </head>
+  <body>
+    <div class="containingblock">
+      <span class="relative container">
+        <div>AA</div>
+      </span>
+    </div>
+    <div class="containingblock">
+      <span class="static container">
+        <div>BB</div>
+      </span>
+    </div>
+    <div class="containingblock">
+      <span class="absolute container">
+        <div>CC</div>
+      </span>
+      <span class="fixed container">
+        <div>DD</div>
+      </span>
+    </div>
+    <div class="containingblock">
+      <span class="relative column container">
+        <div>a</div>
+      </span>
+    </div>
+    <div class="containingblock">
+      <span class="static column container">
+        <div>b</div>
+      </span>
+    </div>
+    <div class="containingblock">
+      <span class="absolute column container">
+        <div>c</div>
+      </span>
+      <span class="fixed column container">
+        <div>d</div>
+      </span>
+    </div>
+</body></html>
diff --git a/src/cobalt/layout_tests/testdata/web-platform-tests/WebIDL/web_platform_tests.txt b/src/cobalt/layout_tests/testdata/web-platform-tests/WebIDL/web_platform_tests.txt
new file mode 100644
index 0000000..dc6f18a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/web-platform-tests/WebIDL/web_platform_tests.txt
@@ -0,0 +1,8 @@
+# DOMException
+ecmascript-binding/es-exceptions/DOMException-constants.any.html,PASS
+# Fails because Cobalt IDL type 'exception' is enumerable.
+ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.html,DISABLE
+ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.html,PASS
+ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.html,PASS
+# Fails because iframes are not supported.
+ecmascript-binding/es-exceptions/exceptions.html,DISABLE
diff --git a/src/cobalt/layout_tests/testdata/web-platform-tests/dom/web_platform_tests.txt b/src/cobalt/layout_tests/testdata/web-platform-tests/dom/web_platform_tests.txt
index 01f0c75..1682272 100644
--- a/src/cobalt/layout_tests/testdata/web-platform-tests/dom/web_platform_tests.txt
+++ b/src/cobalt/layout_tests/testdata/web-platform-tests/dom/web_platform_tests.txt
@@ -1,3 +1,6 @@
+# AbortController and AbortSignal
+abort/event.any.html,PASS
+
 # MutationObserver tests
 
 # Disabled, until test driver executes fully without Javascript errors
diff --git a/src/cobalt/layout_tests/web_platform_tests.cc b/src/cobalt/layout_tests/web_platform_tests.cc
index 3ae6e78..82f0734 100644
--- a/src/cobalt/layout_tests/web_platform_tests.cc
+++ b/src/cobalt/layout_tests/web_platform_tests.cc
@@ -297,9 +297,8 @@
 }
 
 ::testing::AssertionResult CheckHarnessResult(const char* /* expectation_str */,
-                                              const char* /* results_str */,
-                                              WebPlatformTestInfo::State expect_status,
-                                              const HarnessResult& result) {
+    const char* /* results_str */, WebPlatformTestInfo::State expect_status,
+    const HarnessResult& result) {
   if ((expect_status == WebPlatformTestInfo::State::kPass) &&
       (result.status != kTestsOk)) {
     return ::testing::AssertionFailure()
@@ -423,6 +422,10 @@
                             "streams", "'ReadableStream' in this")),
                         GetTestName());
 
+INSTANTIATE_TEST_CASE_P(webidl, WebPlatformTest,
+    ::testing::ValuesIn(EnumerateWebPlatformTests("WebIDL")),
+    GetTestName());
+
 #endif  // !defined(COBALT_WIN)
 
 }  // namespace layout_tests
diff --git a/src/cobalt/loader/image/image_encoder.cc b/src/cobalt/loader/image/image_encoder.cc
index beebfa2..6cd3787 100644
--- a/src/cobalt/loader/image/image_encoder.cc
+++ b/src/cobalt/loader/image/image_encoder.cc
@@ -44,20 +44,14 @@
       break;
     }
 
-    case ImageFormat::kJPEG: {
-// jpeg_utils pulls in libjpeg-turbo as an additional dependency, which
-// increases the size of the cobalt binary. Because jpeg_utils is only used for
-// screencasting, which is only needed for non-gold builds, we can disable this
-// logic for gold builds.
 #if !defined(COBALT_BUILD_TYPE_GOLD)
+    case ImageFormat::kJPEG: {
       compressed_data = renderer::test::jpeg_utils::EncodeRGBAToBuffer(
           image_data, dimensions.width(), dimensions.height(),
           kPitchSizeInBytes, &num_bytes);
       break;
-#else
-      NOTREACHED();
-#endif
     }
+#endif
 
     case ImageFormat::kWEBP:
       NOTIMPLEMENTED();
diff --git a/src/cobalt/loader/image/image_encoder.h b/src/cobalt/loader/image/image_encoder.h
index 91ee6d8..cf12a20 100644
--- a/src/cobalt/loader/image/image_encoder.h
+++ b/src/cobalt/loader/image/image_encoder.h
@@ -29,7 +29,13 @@
 class EncodedStaticImage : public Image {
  public:
   enum class ImageFormat {
+// kJPEG uses jpeg_utils, and jpeg_utils pulls in libjpeg-turbo as an additional
+// dependency, which increases the size of the cobalt binary. Because jpeg_utils
+// is only used for screencasting, which is only needed for non-gold builds, we
+// can disable kJPEG for gold builds.
+#if !defined(COBALT_BUILD_TYPE_GOLD)
     kJPEG,
+#endif
     kPNG,
     kWEBP,
   };
diff --git a/src/cobalt/media_capture/media_recorder.cc b/src/cobalt/media_capture/media_recorder.cc
index e9f90cc..77455bf 100644
--- a/src/cobalt/media_capture/media_recorder.cc
+++ b/src/cobalt/media_capture/media_recorder.cc
@@ -196,12 +196,16 @@
   // Add some padding to the end of the buffer to account for jitter in
   // scheduling, etc.
   // This allows us to potentially avoid unnecessary resizing.
-  base::TimeDelta recommended_time_slice =
-      timeslice_ +
-      base::TimeDelta::FromMilliseconds(kSchedulingLatencyBufferMilliseconds);
-  int64 buffer_size_hint =
-      GetRecommendedBufferSizeInBytes(recommended_time_slice, bits_per_second);
-  buffer_.reserve(static_cast<size_t>(buffer_size_hint));
+  // If the timeslice is using the default maximum long value, do not reserve
+  // space for buffer as we don't know how much is needed.
+  if (!timeslice_unspecified_) {
+    base::TimeDelta recommended_time_slice =
+        timeslice_ +
+        base::TimeDelta::FromMilliseconds(kSchedulingLatencyBufferMilliseconds);
+    int64 buffer_size_hint = GetRecommendedBufferSizeInBytes(
+        recommended_time_slice, bits_per_second);
+    buffer_.reserve(static_cast<size_t>(buffer_size_hint));
+  }
 }
 
 void MediaRecorder::OnReadyStateChanged(
@@ -274,6 +278,7 @@
   WriteData(std::move(empty), true, now);
 
   timeslice_ = base::TimeDelta::FromSeconds(0);
+  timeslice_unspecified_ = false;
   DispatchEvent(new dom::Event(base::Tokens::stop()));
 }
 
diff --git a/src/cobalt/media_capture/media_recorder.h b/src/cobalt/media_capture/media_recorder.h
index 4e761c5..a7b1c9d 100644
--- a/src/cobalt/media_capture/media_recorder.h
+++ b/src/cobalt/media_capture/media_recorder.h
@@ -68,6 +68,7 @@
   void Start(int32 timeslice, script::ExceptionState* exception_state);
 
   void Start(script::ExceptionState* exception_state) {
+    timeslice_unspecified_ = true;
     Start(kint32max, exception_state);
   }
 
@@ -162,6 +163,8 @@
 
   base::WeakPtrFactory<MediaRecorder> weak_ptr_factory_;
   base::WeakPtr<MediaRecorder> weak_this_;
+
+  bool timeslice_unspecified_ = false;
 };
 
 }  // namespace media_capture
diff --git a/src/cobalt/media_stream/microphone_audio_source.cc b/src/cobalt/media_stream/microphone_audio_source.cc
index 59bc3e8..f54e857 100644
--- a/src/cobalt/media_stream/microphone_audio_source.cc
+++ b/src/cobalt/media_stream/microphone_audio_source.cc
@@ -80,7 +80,9 @@
     // Furthermore, it is an error to destruct the microphone manager
     // without stopping it, so these callbacks are not to be called
     // during the destruction of the object.
-    : javascript_message_loop_(base::MessageLoop::current()->task_runner()),
+    : javascript_thread_task_runner_(
+          base::MessageLoop::current()->task_runner()),
+      ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
       successful_open_callback_(successful_open),
       completion_callback_(completion),
       error_callback_(error),
@@ -103,9 +105,11 @@
 }
 
 void MicrophoneAudioSource::OnDataCompletion() {
-  if (javascript_message_loop_ != base::MessageLoop::current()->task_runner()) {
-    javascript_message_loop_->PostTask(
-        FROM_HERE, base::Bind(&MicrophoneAudioSource::OnDataCompletion, this));
+  if (javascript_thread_task_runner_ !=
+      base::MessageLoop::current()->task_runner()) {
+    javascript_thread_task_runner_->PostTask(
+        FROM_HERE, base::Bind(&MicrophoneAudioSource::OnDataCompletion,
+                              weak_ptr_factory_.GetWeakPtr()));
     return;
   }
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -118,9 +122,11 @@
 }
 
 void MicrophoneAudioSource::OnMicrophoneOpen() {
-  if (javascript_message_loop_ != base::MessageLoop::current()->task_runner()) {
-    javascript_message_loop_->PostTask(
-        FROM_HERE, base::Bind(&MicrophoneAudioSource::OnMicrophoneOpen, this));
+  if (javascript_thread_task_runner_ !=
+      base::MessageLoop::current()->task_runner()) {
+    javascript_thread_task_runner_->PostTask(
+        FROM_HERE, base::Bind(&MicrophoneAudioSource::OnMicrophoneOpen,
+                              weak_ptr_factory_.GetWeakPtr()));
     return;
   }
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -132,10 +138,12 @@
 void MicrophoneAudioSource::OnMicrophoneError(
     speech::MicrophoneManager::MicrophoneError error,
     std::string error_message) {
-  if (javascript_message_loop_ != base::MessageLoop::current()->task_runner()) {
-    javascript_message_loop_->PostTask(
-        FROM_HERE, base::Bind(&MicrophoneAudioSource::OnMicrophoneError, this,
-                              error, error_message));
+  if (javascript_thread_task_runner_ !=
+      base::MessageLoop::current()->task_runner()) {
+    javascript_thread_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&MicrophoneAudioSource::OnMicrophoneError,
+                   weak_ptr_factory_.GetWeakPtr(), error, error_message));
     return;
   }
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/src/cobalt/media_stream/microphone_audio_source.h b/src/cobalt/media_stream/microphone_audio_source.h
index 08a44f5..d3049d7 100644
--- a/src/cobalt/media_stream/microphone_audio_source.h
+++ b/src/cobalt/media_stream/microphone_audio_source.h
@@ -77,7 +77,9 @@
   void OnMicrophoneError(speech::MicrophoneManager::MicrophoneError error,
                          std::string error_message);
 
-  scoped_refptr<base::SingleThreadTaskRunner> javascript_message_loop_;
+  scoped_refptr<base::SingleThreadTaskRunner> javascript_thread_task_runner_;
+
+  base::WeakPtrFactory<MicrophoneAudioSource> weak_ptr_factory_;
 
   // These are passed into |microphone_manager_| below, so they must be
   // defined before it.
diff --git a/src/cobalt/network/url_request_context.cc b/src/cobalt/network/url_request_context.cc
index 4cfb2c8..7b532ae 100644
--- a/src/cobalt/network/url_request_context.cc
+++ b/src/cobalt/network/url_request_context.cc
@@ -124,6 +124,7 @@
 #if defined(COBALT_ENABLE_QUIC)
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   params.enable_quic = !command_line->HasSwitch(switches::kDisableQuic);
+  params.use_quic_for_unknown_origins = params.enable_quic;
 #endif
 #if defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
   params.ignore_certificate_errors = ignore_certificate_errors;
diff --git a/src/cobalt/script/script_debugger.h b/src/cobalt/script/script_debugger.h
index e03dcc0..716e798 100644
--- a/src/cobalt/script/script_debugger.h
+++ b/src/cobalt/script/script_debugger.h
@@ -128,6 +128,26 @@
   virtual PauseOnExceptionsState SetPauseOnExceptions(
       PauseOnExceptionsState state) = 0;  // Returns the previous state.
 
+  // Record the JavaScript stack on the WebModule thread at the point a task is
+  // initiated that will run at a later time (on the same thread), allowing it
+  // to be seen as the originator when breaking in the asynchronous task.
+  virtual void AsyncTaskScheduled(void* task, const std::string& name,
+                                  bool recurring) = 0;
+
+  // A scheduled task is starting to run.
+  virtual void AsyncTaskStarted(void* task) = 0;
+
+  // A scheduled task has finished running.
+  virtual void AsyncTaskFinished(void* task) = 0;
+
+  // A scheduled task will no longer be run, and resources associated with it
+  // may be released.
+  virtual void AsyncTaskCanceled(void* task) = 0;
+
+  // All scheduled tasks will no longer be run, and resources associated with
+  // them may be released.
+  virtual void AllAsyncTasksCanceled() = 0;
+
  protected:
   virtual ~ScriptDebugger() {}
   friend std::unique_ptr<ScriptDebugger>::deleter_type;
diff --git a/src/cobalt/script/shared/stub_script_debugger.cc b/src/cobalt/script/shared/stub_script_debugger.cc
index a8ef40b..c2a145d 100644
--- a/src/cobalt/script/shared/stub_script_debugger.cc
+++ b/src/cobalt/script/shared/stub_script_debugger.cc
@@ -73,6 +73,15 @@
     return kNone;
   }
 
+  // The AsyncTask functions will be called regardless whether there's a
+  // functioning debugger, so don't call NOTIMPLEMENTED() to avoid log spam.
+  void AsyncTaskScheduled(void* task, const std::string& name,
+                          bool recurring) override {}
+  void AsyncTaskStarted(void* task) override {}
+  void AsyncTaskFinished(void* task) override {}
+  void AsyncTaskCanceled(void* task) override {}
+  void AllAsyncTasksCanceled() override {}
+
  private:
   GlobalEnvironment* global_environment_;
   Delegate* delegate_;
diff --git a/src/cobalt/script/v8c/v8c_script_debugger.cc b/src/cobalt/script/v8c/v8c_script_debugger.cc
index e996e44..a698db7 100644
--- a/src/cobalt/script/v8c/v8c_script_debugger.cc
+++ b/src/cobalt/script/v8c/v8c_script_debugger.cc
@@ -241,6 +241,27 @@
   tracing_controller->StopTracing();
 }
 
+void V8cScriptDebugger::AsyncTaskScheduled(void* task, const std::string& name,
+                                           bool recurring) {
+  inspector_->asyncTaskScheduled(ToStringView(name), task, recurring);
+}
+
+void V8cScriptDebugger::AsyncTaskStarted(void* task) {
+  inspector_->asyncTaskStarted(task);
+}
+
+void V8cScriptDebugger::AsyncTaskFinished(void* task) {
+  inspector_->asyncTaskFinished(task);
+}
+
+void V8cScriptDebugger::AsyncTaskCanceled(void* task) {
+  inspector_->asyncTaskCanceled(task);
+}
+
+void V8cScriptDebugger::AllAsyncTasksCanceled() {
+  inspector_->allAsyncTasksCanceled();
+}
+
 // v8_inspector::V8InspectorClient implementation.
 void V8cScriptDebugger::runMessageLoopOnPause(int contextGroupId) {
   DCHECK(contextGroupId == kContextGroupId);
@@ -270,7 +291,7 @@
   if (url.length()) {
     std::ostringstream oss;
     oss << ": " << FromStringView(url) << ", Line " << lineNumber << ", Col "
-       << columnNumber;
+        << columnNumber;
     source = oss.str();
   }
 
diff --git a/src/cobalt/script/v8c/v8c_script_debugger.h b/src/cobalt/script/v8c/v8c_script_debugger.h
index 2216b7c..f7c342c 100644
--- a/src/cobalt/script/v8c/v8c_script_debugger.h
+++ b/src/cobalt/script/v8c/v8c_script_debugger.h
@@ -60,6 +60,13 @@
   PauseOnExceptionsState SetPauseOnExceptions(
       PauseOnExceptionsState state) override;
 
+  void AsyncTaskScheduled(void* task, const std::string& name,
+                          bool recurring) override;
+  void AsyncTaskStarted(void* task) override;
+  void AsyncTaskFinished(void* task) override;
+  void AsyncTaskCanceled(void* task) override;
+  void AllAsyncTasksCanceled() override;
+
   // v8_inspector::V8InspectorClient implementation.
   void runMessageLoopOnPause(int contextGroupId) override;
   void quitMessageLoopOnPause() override;
diff --git a/src/cobalt/site/docs/reference/starboard/configuration-public.md b/src/cobalt/site/docs/reference/starboard/configuration-public.md
index 59dfffd..71529cd 100644
--- a/src/cobalt/site/docs/reference/starboard/configuration-public.md
+++ b/src/cobalt/site/docs/reference/starboard/configuration-public.md
@@ -22,11 +22,6 @@
 | **`SB_HAS_64_BIT_LONG`**<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_64_BIT_POINTERS`**<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_64_BIT_LONG`**<br><br>The default value in the Stub implementation is `0` |
-| **`SB_HAS_MANY_CORES`**<br><br> Whether the current platform is expected to have many cores (> 6), or a wildly varying number of cores.<br><br>The default value in the Stub implementation is `1` |
-| **`SB_HAS_1_CORE`**<br><br>Whether the current platform is expected to have exactly 1 core.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_HAS_2_CORES`**<br><br>Whether the current platform is expected to have exactly 2 cores.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_HAS_4_CORES`**<br><br>Whether the current platform is expected to have exactly 4 cores.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_HAS_6_CORES`**<br><br>Whether the current platform is expected to have exactly 6 cores.<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_CROSS_CORE_SCHEDULER`**<br><br>Whether the current platform's thread scheduler will automatically balance threads between cores, as opposed to systems where threads will only ever run on the specifically pinned core.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES`**<br><br>Some platforms will not align variables on the stack with an alignment greater than 16 bytes. Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_THREAD_AFFINITY_UNSUPPORTED`**<br><br>Some platforms do not have thread affinity support. Platforms where this is the case should define the following quirk.<br><br>By default, this property is undefined. |
@@ -161,7 +156,6 @@
 | **`SB_HAS_STDINT_H`**<br><br>Whether the current platform provides the standard header stdint.h.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_INTTYPES_H`**<br><br>Whether the current platform provides the standard header inttypes.h.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_SYS_TYPES_H`**<br><br>Whether the current platform provides the standard header sys/types.h.<br><br>The default value in the Stub implementation is `0` |
-| **`SB_HAS_WCHAR_H`**<br><br>Whether the current platform provides the standard header wchar.h.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_LIMITS_H`**<br><br>Whether the current platform provides the standard header limits.h.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_FLOAT_H`**<br><br>Whether the current platform provides the standard header float.h.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_SSIZE_T`**<br><br>Whether the current platform provides ssize_t.<br><br>The default value in the Stub implementation is `1` |
diff --git a/src/net/cert/test_root_certs_unittest.cc b/src/net/cert/test_root_certs_unittest.cc
index 0754440..4613690 100644
--- a/src/net/cert/test_root_certs_unittest.cc
+++ b/src/net/cert/test_root_certs_unittest.cc
@@ -112,10 +112,8 @@
   int good_status =
       verify_proc->Verify(test_cert.get(), "127.0.0.1", std::string(), flags,
                           NULL, CertificateList(), &good_verify_result);
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
   EXPECT_THAT(good_status, IsOk());
   EXPECT_EQ(0u, good_verify_result.cert_status);
-#endif
 
   test_roots->Clear();
   EXPECT_TRUE(test_roots->IsEmpty());
diff --git a/src/net/cert_net/cert_net_fetcher_impl_unittest.cc b/src/net/cert_net/cert_net_fetcher_impl_unittest.cc
index 7dae657..388a8f9 100644
--- a/src/net/cert_net/cert_net_fetcher_impl_unittest.cc
+++ b/src/net/cert_net/cert_net_fetcher_impl_unittest.cc
@@ -520,7 +520,13 @@
 
 // Fetch the same URLs in parallel and verify that only 1 request is made per
 // URL.
+#if defined(STARBOARD)
+// STARBOARD does not use CertNetFetcher at all, but this test fails on some
+// platform.
+TEST_F(CertNetFetcherImplTest, DISABLED_ParallelFetchDuplicates) {
+#else
 TEST_F(CertNetFetcherImplTest, ParallelFetchDuplicates) {
+#endif
   ASSERT_TRUE(test_server_.Start());
 
   CreateFetcher();
@@ -586,7 +592,13 @@
 }
 
 // Start duplicate requests and then cancel all of them.
+#if defined(STARBOARD)
+// STARBOARD does not use CertNetFetcher at all, but this test fails on some
+// platform.
+TEST_F(CertNetFetcherImplTest, DISABLED_CancelAll) {
+#else
 TEST_F(CertNetFetcherImplTest, CancelAll) {
+#endif
   ASSERT_TRUE(test_server_.Start());
 
   CreateFetcher();
diff --git a/src/net/dial/dial_udp_socket_factory.cc b/src/net/dial/dial_udp_socket_factory.cc
index 4f03a74..b991daf 100644
--- a/src/net/dial/dial_udp_socket_factory.cc
+++ b/src/net/dial/dial_udp_socket_factory.cc
@@ -27,8 +27,10 @@
     return NULL;
   }
 
-  if (!sock->AllowAddressReuse()) {
-    LOG(WARNING) << "AllowAddressReuse failed on DIAL UDP socket.";
+  int set_socket_reuse_success = sock->AllowAddressReuse();
+  if (set_socket_reuse_success != OK) {
+    LOG(WARNING) << "AllowAddressReuse failed on DIAL UDP socket with code "
+                 << set_socket_reuse_success;
   }
 
   if (sock->Bind(address) != net::OK) {
diff --git a/src/net/http/http_network_session.cc b/src/net/http/http_network_session.cc
index 0415c27..58cf10f 100644
--- a/src/net/http/http_network_session.cc
+++ b/src/net/http/http_network_session.cc
@@ -114,6 +114,9 @@
 #if defined(COBALT_QUIC46)
       enable_quic_proxies_for_https_urls(false),
 #endif
+#if defined(STARBOARD)
+      use_quic_for_unknown_origins(false),
+#endif
 #if !defined(QUIC_DISABLED_FOR_STARBOARD)
       quic_max_packet_length(quic::kDefaultMaxPacketSize),
 #endif
@@ -558,6 +561,10 @@
 void HttpNetworkSession::ToggleQuic() {
   params_.enable_quic = !params_.enable_quic;
 }
+
+bool HttpNetworkSession::UseQuicForUnknownOrigin() const {
+  return params_.use_quic_for_unknown_origins;
+}
 #endif  // defined(STARBOARD)
 
 ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
diff --git a/src/net/http/http_network_session.h b/src/net/http/http_network_session.h
index ded46f4..ff8ce8f 100644
--- a/src/net/http/http_network_session.h
+++ b/src/net/http/http_network_session.h
@@ -149,6 +149,12 @@
     bool enable_quic_proxies_for_https_urls;
 #endif
 
+#if defined(STARBOARD)
+    // If true, request to an origin without recorded alt-svc info will
+    // try to establish both QUIC and TCP connections and use the faster one.
+    bool use_quic_for_unknown_origins;
+#endif
+
     // QUIC runtime configuration options.
 
     // Versions of QUIC which may be used.
@@ -403,6 +409,9 @@
 #if defined(STARBOARD)
   // Toggle QUIC support for new streams.
   void ToggleQuic();
+
+  // Whether to try QUIC connection for origins without alt-svc on record.
+  bool UseQuicForUnknownOrigin() const;
 #endif  // defined(STARBOARD)
 
  private:
diff --git a/src/net/http/http_stream_factory_job_controller.cc b/src/net/http/http_stream_factory_job_controller.cc
index 198d9f3..451d4d5 100644
--- a/src/net/http/http_stream_factory_job_controller.cc
+++ b/src/net/http/http_stream_factory_job_controller.cc
@@ -29,6 +29,10 @@
 
 namespace {
 
+#if defined(STARBOARD)
+const int kDefaultQUICServerPort = 443;
+#endif
+
 // Returns parameters associated with the proxy resolution.
 std::unique_ptr<base::Value> NetLogHttpStreamJobProxyServerResolved(
     const ProxyServer& proxy_server,
@@ -1135,8 +1139,25 @@
       *session_->http_server_properties();
   const AlternativeServiceInfoVector alternative_service_info_vector =
       http_server_properties.GetAlternativeServiceInfos(origin);
+#if defined(STARBOARD)
+  // This block of code suggests QUIC connection for initial requests to a
+  // stranger host. This method is proven to provide performance benefit while
+  // still enabling Cobalt network module to fall back on TCP connection when
+  // QUIC fails or is too slow.
+  if (alternative_service_info_vector.empty() && session_->IsQuicEnabled() &&
+      session_->UseQuicForUnknownOrigin()) {
+    if (origin.port() == kDefaultQUICServerPort) {
+      return AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
+          AlternativeService(net::kProtoQUIC, origin.host(),
+                             kDefaultQUICServerPort),
+          base::Time::Max(), {quic::QUIC_VERSION_46});
+    }
+    return AlternativeServiceInfo();
+  }
+#else
   if (alternative_service_info_vector.empty())
     return AlternativeServiceInfo();
+#endif
 
   bool quic_advertised = false;
   bool quic_all_broken = true;
diff --git a/src/net/net.gyp b/src/net/net.gyp
index c90b5b3..9b5ebf6 100644
--- a/src/net/net.gyp
+++ b/src/net/net.gyp
@@ -18,7 +18,6 @@
         # TODO[johnx]: find out how we can verify local cert issuer and
         # re-enable this test. Consider adding a binary cert for local issuer
         # for debug builds.
-        'STARBOARD_NO_LOCAL_ISSUER',
         'QUIC_TRACE_DISABLED',
         'COBALT_QUIC46',
         'COMMON_CERT_SET_DISABLED_FOR_STARBOARD',
@@ -27,7 +26,6 @@
         'defines': [
           'HTTP_CACHE_DISABLED_FOR_STARBOARD',
           'ENABLE_BUILT_IN_DNS',
-          'STARBOARD_NO_LOCAL_ISSUER',
           'QUIC_TRACE_DISABLED',
           'COBALT_QUIC46',
           'COMMON_CERT_SET_DISABLED_FOR_STARBOARD',
diff --git a/src/net/test/embedded_test_server/embedded_test_server.cc b/src/net/test/embedded_test_server/embedded_test_server.cc
index 490dc46..41aa8d1 100644
--- a/src/net/test/embedded_test_server/embedded_test_server.cc
+++ b/src/net/test/embedded_test_server/embedded_test_server.cc
@@ -178,6 +178,9 @@
   base::Thread::Options thread_options;
   thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
   io_thread_.reset(new base::Thread("EmbeddedTestServer IO Thread"));
+#if defined(STARBOARD)
+  thread_options.stack_size = base::kUnitTestStackSize;
+#endif
   CHECK(io_thread_->StartWithOptions(thread_options));
   CHECK(io_thread_->WaitUntilThreadStarted());
 
diff --git a/src/net/test/embedded_test_server/embedded_test_server_unittest.cc b/src/net/test/embedded_test_server/embedded_test_server_unittest.cc
index ca10a84..236e85a 100644
--- a/src/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/src/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -132,6 +132,9 @@
   void SetUp() override {
     base::Thread::Options thread_options;
     thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
+#if defined(STARBOARD)
+    thread_options.stack_size = base::kUnitTestStackSize;
+#endif
     ASSERT_TRUE(io_thread_.StartWithOptions(thread_options));
 
     request_context_getter_ =
@@ -233,7 +236,6 @@
   }
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_P(EmbeddedTestServerTest, RegisterRequestHandler) {
   server_->RegisterRequestHandler(base::BindRepeating(
       &EmbeddedTestServerTest::HandleRequest, base::Unretained(this), "/test",
@@ -310,7 +312,6 @@
   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
   EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode());
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 TEST_P(EmbeddedTestServerTest, ConnectionListenerAccept) {
   ASSERT_TRUE(server_->Start());
@@ -331,7 +332,6 @@
   EXPECT_FALSE(connection_listener_.DidReadFromSocket());
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_P(EmbeddedTestServerTest, ConnectionListenerRead) {
   ASSERT_TRUE(server_->Start());
 
@@ -392,7 +392,6 @@
   EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3));
   EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3));
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 namespace {
 
@@ -592,7 +591,8 @@
 #if defined(STARBOARD)
   // Some platforms have low default stack size that can't support unit tests.
   ASSERT_TRUE(
-      base::PlatformThread::Create(256 * 1024, &delegate, &thread_handle));
+      base::PlatformThread::Create(base::kUnitTestStackSize, &delegate,
+                                   &thread_handle));
 #else
   ASSERT_TRUE(base::PlatformThread::Create(0, &delegate, &thread_handle));
 #endif
diff --git a/src/net/url_request/url_request_unittest.cc b/src/net/url_request/url_request_unittest.cc
index 7303603..d58d057 100644
--- a/src/net/url_request/url_request_unittest.cc
+++ b/src/net/url_request/url_request_unittest.cc
@@ -3217,7 +3217,6 @@
   }
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_F(URLRequestTest, SecureCookiePrefixSecure) {
   EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
   https_server.AddDefaultHandlers(
@@ -3255,7 +3254,6 @@
     EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
   }
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 // Tests that secure cookies can't be set on non-secure origins if strict secure
 // cookies are enabled.
@@ -3301,7 +3299,6 @@
   }
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 // Tests that secure cookies can be set on secure origins even if strict secure
 // cookies are enabled.
 TEST_F(URLRequestTest, StrictSecureCookiesOnSecureOrigin) {
@@ -3341,7 +3338,6 @@
     EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
   }
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 // The parameter is true for same-site and false for cross-site requests.
 class URLRequestTestParameterizedSameSite
@@ -3373,7 +3369,6 @@
                         URLRequestTestParameterizedSameSite,
                         ::testing::Bool());
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_P(URLRequestTestParameterizedSameSite, CookieAgeMetrics) {
   const bool same_site = GetParam();
   const std::string kInitiatingHost = same_site ? kHost_ : kCrossHost_;
@@ -3465,7 +3460,6 @@
     EXPECT_TRUE(d.data_received().find("cookie2=value2") != std::string::npos);
   }
 }
-#endif
 
 // Cookies with secure attribute (no HSTS) --> k1pSecureAttribute
 TEST_P(URLRequestTestParameterizedSameSite,
@@ -6608,7 +6602,6 @@
 // TODO(svaldez): iOS tests are flaky with EmbeddedTestServer and transport
 // security state. (see http://crbug.com/550977).
 #if !defined(OS_IOS)
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_F(URLRequestTestHTTP, ProcessSTS) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_test_server.SetSSLConfig(
@@ -6643,7 +6636,6 @@
   EXPECT_FALSE(pkp_state.HasPublicKeyPins());
 #endif
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 TEST_F(URLRequestTestHTTP, STSNotProcessedOnIP) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
@@ -6673,7 +6665,6 @@
 const char kHPKPReportUri[] = "https://hpkp-report.test";
 }  // namespace
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 // Tests that enabling HPKP on a domain does not affect the HSTS
 // validity/expiration.
 TEST_F(URLRequestTestHTTP, ProcessPKP) {
@@ -6709,7 +6700,6 @@
   EXPECT_EQ(report_uri, pkp_state.report_uri);
   EXPECT_NE(sts_state.expiry, pkp_state.expiry);
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 // Tests that reports get sent on HPKP violations when a report-uri is set.
 TEST_F(URLRequestTestHTTP, ProcessPKPAndSendReport) {
@@ -6978,7 +6968,6 @@
   EXPECT_TRUE(request->ssl_info().pkp_bypassed);
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_test_server.SetSSLConfig(
@@ -7089,7 +7078,6 @@
   EXPECT_TRUE(sts_state.include_subdomains);
   EXPECT_FALSE(pkp_state.include_subdomains);
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 // An ExpectCTReporter that records the number of times OnExpectCTFailed() was
 // called.
@@ -7429,7 +7417,6 @@
   EXPECT_TRUE(reporting_service.headers().empty());
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_F(URLRequestTestHTTP, ProcessReportToHeaderHTTPS) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_test_server.RegisterRequestHandler(
@@ -7454,7 +7441,6 @@
   EXPECT_EQ(request_url, reporting_service.headers()[0].url);
   EXPECT_EQ("foo, bar", reporting_service.headers()[0].header_value);
 }
-#endif
 
 TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderInvalidHttps) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
@@ -7603,7 +7589,6 @@
   EXPECT_TRUE(nel_service.headers().empty());
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_F(URLRequestTestHTTP, ProcessNelHeaderHttps) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_test_server.RegisterRequestHandler(base::BindRepeating(&SendNelHeader));
@@ -7630,7 +7615,6 @@
   EXPECT_TRUE(nel_service.headers()[0].MatchesAddressList(address_list));
   EXPECT_EQ("foo", nel_service.headers()[0].value);
 }
-#endif
 
 TEST_F(URLRequestTestHTTP, DontProcessNelHeaderInvalidHttps) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
@@ -7731,7 +7715,6 @@
   URLRequestFilter::GetInstance()->ClearHandlers();
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 // Also test with a real server, to exercise interactions with
 // URLRequestHttpJob.
 TEST_F(URLRequestTestHTTP, ForwardErrorToNelHttps_Real) {
@@ -7759,7 +7742,6 @@
   EXPECT_EQ(0, nel_service.errors()[0].status_code);
   EXPECT_EQ(ERR_EMPTY_RESPONSE, nel_service.errors()[0].type);
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 TEST_F(URLRequestTestHTTP, NelReportUserAgentWithHeaderWithSettings) {
   EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
@@ -9653,7 +9635,7 @@
   VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
+
 TEST_F(URLRequestTestReferrerPolicy, HTTPSToSameOriginHTTPS) {
   InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTPS);
   GURL referrer = origin_server()->GetURL("/path/to/file.html");
@@ -9815,7 +9797,6 @@
 
   VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 class HTTPSRequestTest : public TestWithScopedTaskEnvironment {
  public:
@@ -9832,7 +9813,6 @@
   TestURLRequestContext default_context_;
 };
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 TEST_F(HTTPSRequestTest, HTTPSGetTest) {
   EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
   test_server.AddDefaultHandlers(
@@ -9859,7 +9839,6 @@
               r->GetSocketAddress().port());
   }
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
   EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
@@ -10237,7 +10216,6 @@
 
 }  // namespace
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 // TODO(davidben): Test the rest of the code. Specifically,
 // - Filtering which certificates to select.
 // - Getting a certificate request in an SSL renegotiation sending the
@@ -10359,7 +10337,6 @@
     EXPECT_EQ(2, private_key->sign_count());
   }
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 
 // Test that private keys that fail to sign anything get evicted from the cache.
 TEST_F(HTTPSRequestTest, ClientAuthFailSigning) {
@@ -10439,7 +10416,6 @@
   }
 }
 
-#if !defined(STARBOARD_NO_LOCAL_ISSUER)
 // Test that cached private keys that fail to sign anything trigger a
 // retry. This is so we handle unplugged smartcards
 // gracefully. https://crbug.com/813022.
@@ -10522,7 +10498,6 @@
     EXPECT_EQ(0, d.bytes_received());
   }
 }
-#endif  // defined(STARBOARD_NO_LOCAL_ISSUER)
 #endif  // !defiend(OS_IOS)
 #if !defined(STARBOARD)
 #if !defined(OS_IOS)
diff --git a/src/starboard/android/shared/configuration_public.h b/src/starboard/android/shared/configuration_public.h
index 8236b6e..dba33b1 100644
--- a/src/starboard/android/shared/configuration_public.h
+++ b/src/starboard/android/shared/configuration_public.h
@@ -81,22 +81,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
@@ -130,9 +114,6 @@
 // Whether the current platform provides the standard header inttypes.h.
 #define SB_HAS_INTTYPES_H 1
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/starboard/android/shared/gyp_configuration.gypi b/src/starboard/android/shared/gyp_configuration.gypi
index faa78d0..12dd798 100644
--- a/src/starboard/android/shared/gyp_configuration.gypi
+++ b/src/starboard/android/shared/gyp_configuration.gypi
@@ -48,14 +48,24 @@
     ],
     'compiler_flags_qa': [
       '-fno-rtti',
-      '-O2',
       '-gline-tables-only',
     ],
+    'compiler_flags_qa_size': [
+      '-Os',
+    ],
+    'compiler_flags_qa_speed': [
+      '-O2',
+    ],
     'compiler_flags_gold': [
       '-fno-rtti',
-      '-O2',
       '-gline-tables-only',
     ],
+    'compiler_flags_gold_size': [
+      '-Os',
+    ],
+    'compiler_flags_gold_speed': [
+      '-O2',
+    ],
     'platform_libraries': [
       '-lEGL',
       '-lGLESv2',
diff --git a/src/starboard/android/shared/gyp_configuration.py b/src/starboard/android/shared/gyp_configuration.py
index cde48b1..0f3648a 100644
--- a/src/starboard/android/shared/gyp_configuration.py
+++ b/src/starboard/android/shared/gyp_configuration.py
@@ -292,4 +292,15 @@
           # the following tests depend upon.
           'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/*',
       ],
+      'nplb': [
+          # These are failing on the internal test lab network that doesn't
+          # support IPv6.
+          'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest'
+          '.SunnyDayDestination/1',
+          'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest'
+          '.SunnyDaySourceForDestination/1',
+          'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest'
+          '.SunnyDaySourceNotLoopback/1',
+          'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
+      ],
   }
diff --git a/src/starboard/android/shared/starboard_platform.gypi b/src/starboard/android/shared/starboard_platform.gypi
index 186c9df..2401618 100644
--- a/src/starboard/android/shared/starboard_platform.gypi
+++ b/src/starboard/android/shared/starboard_platform.gypi
@@ -432,7 +432,7 @@
         '<(DEPTH)/starboard/shared/starboard/system_supports_resume.cc',
         '<(DEPTH)/starboard/shared/starboard/thread_checker.h',
         '<(DEPTH)/starboard/shared/starboard/window_set_default_options.cc',
-        '<(DEPTH)/starboard/shared/stub/cpu_features_get.cc',
+        '<(DEPTH)/starboard/shared/linux/cpu_features_get.cc',
         '<(DEPTH)/starboard/shared/stub/cryptography_create_transformer.cc',
         '<(DEPTH)/starboard/shared/stub/cryptography_destroy_transformer.cc',
         '<(DEPTH)/starboard/shared/stub/cryptography_get_tag.cc',
diff --git a/src/starboard/common/test_main.cc b/src/starboard/common/test_main.cc
index 4100fa8..9144eaa 100644
--- a/src/starboard/common/test_main.cc
+++ b/src/starboard/common/test_main.cc
@@ -24,4 +24,9 @@
 }
 }  // namespace
 
+// When we are building Evergreen we need to export SbEventHandle so that the
+// ELF loader can find and invoke it.
+#if SB_IS(EVERGREEN)
+SB_EXPORT
+#endif  // SB_IS(EVERGREEN)
 STARBOARD_WRAP_SIMPLE_MAIN(InitAndRunAllTests);
diff --git a/src/starboard/configuration.h b/src/starboard/configuration.h
index e06b52e..a781aba 100644
--- a/src/starboard/configuration.h
+++ b/src/starboard/configuration.h
@@ -499,15 +499,6 @@
 #error "New versions of Starboard specify player output mode at runtime."
 #endif
 
-#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 SB_HAS_{MANY, 1, 2, 4, 6}_CORE[S] can be defined per platform."
-#endif
-
 #if !defined(SB_HAS_THREAD_PRIORITY_SUPPORT)
 #error "Your platform must define SB_HAS_THREAD_PRIORITY_SUPPORT."
 #endif
diff --git a/src/starboard/contrib/creator/shared/configuration_public.h b/src/starboard/contrib/creator/shared/configuration_public.h
index 13e71ba..c950015 100644
--- a/src/starboard/contrib/creator/shared/configuration_public.h
+++ b/src/starboard/contrib/creator/shared/configuration_public.h
@@ -66,22 +66,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// wildly varying number of cores.
-#define SB_HAS_MANY_CORES 0
-
-// 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 1
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
@@ -110,9 +94,6 @@
 // Whether the current platform provides the standard header inttypes.h.
 #define SB_HAS_INTTYPES_H 1
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/starboard/contrib/linux/x64wl/configuration_public.h b/src/starboard/contrib/linux/x64wl/configuration_public.h
index bb1e1a0..b6f76b6 100644
--- a/src/starboard/contrib/linux/x64wl/configuration_public.h
+++ b/src/starboard/contrib/linux/x64wl/configuration_public.h
@@ -79,22 +79,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
diff --git a/src/starboard/contrib/tizen/armv7l/configuration_public.h b/src/starboard/contrib/tizen/armv7l/configuration_public.h
index e8f4c21..1342fe7 100644
--- a/src/starboard/contrib/tizen/armv7l/configuration_public.h
+++ b/src/starboard/contrib/tizen/armv7l/configuration_public.h
@@ -72,22 +72,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
diff --git a/src/starboard/contrib/tizen/shared/configuration_public.h b/src/starboard/contrib/tizen/shared/configuration_public.h
index d004436..4d103b2 100644
--- a/src/starboard/contrib/tizen/shared/configuration_public.h
+++ b/src/starboard/contrib/tizen/shared/configuration_public.h
@@ -37,9 +37,6 @@
 // Whether the current platform provides the standard header inttypes.h.
 #define SB_HAS_INTTYPES_H 1
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/starboard/elf_loader/elf_loader.gyp b/src/starboard/elf_loader/elf_loader.gyp
index 7860e03..4bdbd76 100644
--- a/src/starboard/elf_loader/elf_loader.gyp
+++ b/src/starboard/elf_loader/elf_loader.gyp
@@ -13,26 +13,14 @@
 # limitations under the License.
 
 {
-  'targets': [
-    {
-      'target_name': 'elf_loader',
-      'type': 'static_library',
-      'include_dirs': [
-        'src/include',
-        'src/src/',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
+  'variables': {
+    'common_elf_loader_sources': [
         'elf_header.h',
         'elf_header.cc',
         'elf_hash_table.h',
         'elf_hash_table.cc',
         'elf_loader.h',
         'elf_loader.cc',
-        'elf_loader_impl.h',
-        'elf_loader_impl.cc',
         'exported_symbols.cc',
         'file.h',
         'file_impl.h',
@@ -45,6 +33,47 @@
         'program_table.cc',
         'relocations.h',
         'relocations.cc',
+    ],
+    'elf_loader_impl_sources': [
+        'elf_loader_impl.h',
+        'elf_loader_impl.cc',
+    ],
+    'elf_loader_sys_sources': [
+        'elf_loader_sys_impl.h',
+        'elf_loader_sys_impl.cc',
+    ]
+  },
+  'targets': [
+    {
+      'target_name': 'elf_loader',
+      'type': 'static_library',
+      'include_dirs': [
+        'src/include',
+        'src/src/',
+      ],
+      'dependencies': [
+        '<(DEPTH)/starboard/starboard.gyp:starboard',
+      ],
+      'sources': [
+        '<@(common_elf_loader_sources)',
+        '<@(elf_loader_impl_sources)',
+      ],
+    },
+    {
+      # System loader based on dlopen/dlsym.
+      # Should be used only for debugging/troubleshooting.
+      'target_name': 'elf_loader_sys',
+      'type': 'static_library',
+      'include_dirs': [
+        'src/include',
+        'src/src/',
+      ],
+      'dependencies': [
+        '<(DEPTH)/starboard/starboard.gyp:starboard',
+      ],
+      'sources': [
+        '<@(common_elf_loader_sources)',
+        '<@(elf_loader_sys_sources)',
       ],
     },
     {
@@ -63,6 +92,33 @@
       ],
     },
     {
+      # To properly function the system loader requires the starboard
+      # symbols to be exported from the binary.
+      # To allow symbols to be exported remove the '-fvisibility=hidden' flag
+      # from your compiler_flags.gypi.
+      # Example run:
+      # export LD_LIBRARY_PATH=.
+      # out/linux-x64x11_qa/elf_loader_sys_sandbox out/evergreen-x64-sbversion-12_qa/lib/libcobalt_evergreen.so
+      #
+      'target_name': 'elf_loader_sys_sandbox',
+      'type': '<(final_executable_type)',
+      'include_dirs': [
+        'src/include',
+        'src/src/',
+      ],
+      'dependencies': [
+        'elf_loader_sys',
+        '<(DEPTH)/starboard/starboard.gyp:starboard_full',
+      ],
+      'sources': [
+        'sandbox.cc',
+      ],
+      'ldflags': [
+        '-Wl,--dynamic-list=<(DEPTH)/starboard/starboard.syms',
+        '-ldl' ,
+      ],
+    },
+    {
       'target_name': 'elf_loader_test',
       'type': '<(gtest_target_type)',
       'sources': [
diff --git a/src/starboard/elf_loader/elf_loader_sys_impl.cc b/src/starboard/elf_loader/elf_loader_sys_impl.cc
new file mode 100644
index 0000000..40fa30b
--- /dev/null
+++ b/src/starboard/elf_loader/elf_loader_sys_impl.cc
@@ -0,0 +1,58 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/elf_loader/elf_loader_sys_impl.h"
+
+#include <dlfcn.h>
+
+#include "starboard/common/log.h"
+#include "starboard/elf_loader/exported_symbols.h"
+
+namespace starboard {
+namespace elf_loader {
+
+ElfLoaderImpl::ElfLoaderImpl() {}
+
+bool ElfLoaderImpl::Load(const char* name) {
+  SB_LOG(INFO) << "Loading: " << name;
+
+  // Creating the instance forces the binary to keep all the symbols.
+  ExportedSymbols symbols;
+
+  handle_ = dlopen(name, RTLD_NOW);
+  if (!handle_) {
+    SB_LOG(ERROR) << "dlopen failure: " << dlerror();
+    return false;
+  }
+  return true;
+}
+
+void* ElfLoaderImpl::LookupSymbol(const char* symbol) {
+  if (handle_) {
+    void* p = dlsym(handle_, symbol);
+    if (!p) {
+      SB_LOG(ERROR) << "dlsym failure: " << dlerror();
+    }
+    return p;
+  }
+  return NULL;
+}
+
+ElfLoaderImpl::~ElfLoaderImpl() {
+  if (handle_) {
+    dlclose(handle_);
+  }
+}
+}  // namespace elf_loader
+}  // namespace starboard
diff --git a/src/starboard/elf_loader/elf_loader_sys_impl.h b/src/starboard/elf_loader/elf_loader_sys_impl.h
new file mode 100644
index 0000000..d8118c5
--- /dev/null
+++ b/src/starboard/elf_loader/elf_loader_sys_impl.h
@@ -0,0 +1,39 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_ELF_LOADER_ELF_LOADER_SYS_IMPL_H_
+#define STARBOARD_ELF_LOADER_ELF_LOADER_SYS_IMPL_H_
+
+#include "starboard/common/scoped_ptr.h"
+
+namespace starboard {
+namespace elf_loader {
+
+// Implementation of the elf loader.
+class ElfLoaderImpl {
+ public:
+  ElfLoaderImpl();
+  bool Load(const char* file_name);
+  void* LookupSymbol(const char* symbol);
+  ~ElfLoaderImpl();
+
+ private:
+  void* handle_;
+
+  SB_DISALLOW_COPY_AND_ASSIGN(ElfLoaderImpl);
+};
+
+}  // namespace elf_loader
+}  // namespace starboard
+#endif  // STARBOARD_ELF_LOADER_ELF_LOADER_SYS_IMPL_H_
diff --git a/src/starboard/elf_loader/exported_symbols.cc b/src/starboard/elf_loader/exported_symbols.cc
index f0d9912..903dcc3 100644
--- a/src/starboard/elf_loader/exported_symbols.cc
+++ b/src/starboard/elf_loader/exported_symbols.cc
@@ -20,6 +20,7 @@
 #include "starboard/character.h"
 #include "starboard/condition_variable.h"
 #include "starboard/cpu_features.h"
+#include "starboard/cryptography.h"
 #include "starboard/decode_target.h"
 #include "starboard/directory.h"
 #include "starboard/double.h"
@@ -45,490 +46,314 @@
 #include "starboard/time_zone.h"
 #include "starboard/ui_navigation.h"
 
+#define REGISTER_SYMBOL(s) REGISTER_SYMBOL_AS(s, s)
+#define REGISTER_SYMBOL_AS(k, v)                    \
+    do {                                            \
+      map_[#k] = reinterpret_cast<const void*>(&v); \
+    } while (0)
+
 namespace starboard {
 namespace elf_loader {
 
 ExportedSymbols::ExportedSymbols() {
-  map_["SbAccessibilityGetDisplaySettings"] =
-      reinterpret_cast<const void*>(SbAccessibilityGetDisplaySettings);
-  map_["SbAccessibilityGetTextToSpeechSettings"] =
-      reinterpret_cast<const void*>(SbAccessibilityGetTextToSpeechSettings);
-  map_["SbAudioSinkCreate"] = reinterpret_cast<const void*>(SbAudioSinkCreate);
-  map_["SbAudioSinkDestroy"] =
-      reinterpret_cast<const void*>(SbAudioSinkDestroy);
-#if SB_API_VERSION >= 11
-  map_["SbAudioSinkGetMinBufferSizeInFrames"] =
-      reinterpret_cast<const void*>(SbAudioSinkGetMinBufferSizeInFrames);
-#endif
-  map_["SbAudioSinkGetNearestSupportedSampleFrequency"] =
-      reinterpret_cast<const void*>(
-          SbAudioSinkGetNearestSupportedSampleFrequency);
-  map_["SbAudioSinkIsAudioFrameStorageTypeSupported"] =
-      reinterpret_cast<const void*>(
-          SbAudioSinkIsAudioFrameStorageTypeSupported);
-  map_["SbAudioSinkIsAudioSampleTypeSupported"] =
-      reinterpret_cast<const void*>(SbAudioSinkIsAudioSampleTypeSupported);
-  map_["SbAudioSinkIsValid"] =
-      reinterpret_cast<const void*>(SbAudioSinkIsValid);
-  map_["SbByteSwapU16"] = reinterpret_cast<const void*>(SbByteSwapU16);
-  map_["SbByteSwapU32"] = reinterpret_cast<const void*>(SbByteSwapU32);
-  map_["SbByteSwapU64"] = reinterpret_cast<const void*>(SbByteSwapU64);
-  map_["SbCharacterIsDigit"] =
-      reinterpret_cast<const void*>(SbCharacterIsDigit);
-  map_["SbCharacterIsHexDigit"] =
-      reinterpret_cast<const void*>(SbCharacterIsHexDigit);
-  map_["SbCharacterIsSpace"] =
-      reinterpret_cast<const void*>(SbCharacterIsSpace);
-  map_["SbCharacterToLower"] =
-      reinterpret_cast<const void*>(SbCharacterToLower);
-  map_["SbCharacterToUpper"] =
-      reinterpret_cast<const void*>(SbCharacterToUpper);
-  map_["SbConditionVariableBroadcast"] =
-      reinterpret_cast<const void*>(SbConditionVariableBroadcast);
-  map_["SbConditionVariableCreate"] =
-      reinterpret_cast<const void*>(SbConditionVariableCreate);
-  map_["SbConditionVariableDestroy"] =
-      reinterpret_cast<const void*>(SbConditionVariableDestroy);
-  map_["SbConditionVariableSignal"] =
-      reinterpret_cast<const void*>(SbConditionVariableSignal);
-  map_["SbConditionVariableWait"] =
-      reinterpret_cast<const void*>(SbConditionVariableWait);
-  map_["SbConditionVariableWaitTimed"] =
-      reinterpret_cast<const void*>(SbConditionVariableWaitTimed);
+  REGISTER_SYMBOL(SbAccessibilityGetDisplaySettings);
+  REGISTER_SYMBOL(SbAccessibilityGetTextToSpeechSettings);
+  REGISTER_SYMBOL(SbAudioSinkCreate);
+  REGISTER_SYMBOL(SbAudioSinkDestroy);
+  REGISTER_SYMBOL(SbAudioSinkGetMaxChannels);
+  REGISTER_SYMBOL(SbAudioSinkGetNearestSupportedSampleFrequency);
+  REGISTER_SYMBOL(SbAudioSinkIsAudioFrameStorageTypeSupported);
+  REGISTER_SYMBOL(SbAudioSinkIsAudioSampleTypeSupported);
+  REGISTER_SYMBOL(SbAudioSinkIsValid);
+  REGISTER_SYMBOL(SbByteSwapS16);
+  REGISTER_SYMBOL(SbByteSwapS32);
+  REGISTER_SYMBOL(SbByteSwapS64);
+  REGISTER_SYMBOL(SbByteSwapU16);
+  REGISTER_SYMBOL(SbByteSwapU32);
+  REGISTER_SYMBOL(SbByteSwapU64);
+  REGISTER_SYMBOL(SbCharacterIsAlphanumeric);
+  REGISTER_SYMBOL(SbCharacterIsDigit);
+  REGISTER_SYMBOL(SbCharacterIsHexDigit);
+  REGISTER_SYMBOL(SbCharacterIsSpace);
+  REGISTER_SYMBOL(SbCharacterIsUpper);
+  REGISTER_SYMBOL(SbCharacterToLower);
+  REGISTER_SYMBOL(SbCharacterToUpper);
+  REGISTER_SYMBOL(SbConditionVariableBroadcast);
+  REGISTER_SYMBOL(SbConditionVariableCreate);
+  REGISTER_SYMBOL(SbConditionVariableDestroy);
+  REGISTER_SYMBOL(SbConditionVariableSignal);
+  REGISTER_SYMBOL(SbConditionVariableWait);
+  REGISTER_SYMBOL(SbConditionVariableWaitTimed);
+  REGISTER_SYMBOL(SbCryptographyCreateTransformer);
+  REGISTER_SYMBOL(SbCryptographyDestroyTransformer);
+  REGISTER_SYMBOL(SbCryptographyGetTag);
+  REGISTER_SYMBOL(SbCryptographySetAuthenticatedData);
+  REGISTER_SYMBOL(SbCryptographySetInitializationVector);
+  REGISTER_SYMBOL(SbCryptographyTransform);
+  REGISTER_SYMBOL(SbDecodeTargetGetInfo);
+  REGISTER_SYMBOL(SbDecodeTargetRelease);
+  REGISTER_SYMBOL(SbDirectoryCanOpen);
+  REGISTER_SYMBOL(SbDirectoryClose);
+  REGISTER_SYMBOL(SbDirectoryCreate);
+  REGISTER_SYMBOL(SbDirectoryGetNext);
+  REGISTER_SYMBOL(SbDirectoryOpen);
+  REGISTER_SYMBOL(SbDoubleAbsolute);
+  REGISTER_SYMBOL(SbDoubleExponent);
+  REGISTER_SYMBOL(SbDoubleFloor);
+  REGISTER_SYMBOL(SbDoubleIsFinite);
+  REGISTER_SYMBOL(SbDoubleIsNan);
+  REGISTER_SYMBOL(SbDrmCloseSession);
+  REGISTER_SYMBOL(SbDrmCreateSystem);
+  REGISTER_SYMBOL(SbDrmDestroySystem);
+  REGISTER_SYMBOL(SbDrmGenerateSessionUpdateRequest);
+  REGISTER_SYMBOL(SbDrmUpdateSession);
+  REGISTER_SYMBOL(SbEventCancel);
+  REGISTER_SYMBOL(SbEventSchedule);
+  REGISTER_SYMBOL(SbFileCanOpen);
+  REGISTER_SYMBOL(SbFileClose);
+  REGISTER_SYMBOL(SbFileDelete);
+  REGISTER_SYMBOL(SbFileExists);
+  REGISTER_SYMBOL(SbFileFlush);
+  REGISTER_SYMBOL(SbFileGetInfo);
+  REGISTER_SYMBOL(SbFileGetPathInfo);
+  REGISTER_SYMBOL(SbFileModeStringToFlags);
+  REGISTER_SYMBOL(SbFileOpen);
+  REGISTER_SYMBOL(SbFileRead);
+  REGISTER_SYMBOL(SbFileSeek);
+  REGISTER_SYMBOL(SbFileTruncate);
+  REGISTER_SYMBOL(SbFileWrite);
+  REGISTER_SYMBOL(SbGetEglInterface);
+  REGISTER_SYMBOL(SbGetGlesInterface);
+  REGISTER_SYMBOL(SbImageDecode);
+  REGISTER_SYMBOL(SbImageIsDecodeSupported);
+  REGISTER_SYMBOL(SbLog);
+  REGISTER_SYMBOL(SbLogFlush);
+  REGISTER_SYMBOL(SbLogFormat);
+  REGISTER_SYMBOL(SbLogIsTty);
+  REGISTER_SYMBOL(SbLogRaw);
+  REGISTER_SYMBOL(SbLogRawDumpStack);
+  REGISTER_SYMBOL(SbLogRawFormat);
+  REGISTER_SYMBOL(SbMediaCanPlayMimeAndKeySystem);
+  REGISTER_SYMBOL(SbMemoryAllocateAlignedUnchecked);
+  REGISTER_SYMBOL(SbMemoryAllocateUnchecked);
+  REGISTER_SYMBOL(SbMemoryCompare);
+  REGISTER_SYMBOL(SbMemoryCopy);
+  REGISTER_SYMBOL(SbMemoryFindByte);
+  REGISTER_SYMBOL(SbMemoryFree);
+  REGISTER_SYMBOL(SbMemoryFreeAligned);
+  REGISTER_SYMBOL(SbMemoryGetStackBounds);
+  REGISTER_SYMBOL(SbMemoryMove);
+  REGISTER_SYMBOL(SbMemoryReallocateUnchecked);
+  REGISTER_SYMBOL(SbMemorySet);
+  REGISTER_SYMBOL(SbMutexAcquire);
+  REGISTER_SYMBOL(SbMutexAcquireTry);
+  REGISTER_SYMBOL(SbMutexCreate);
+  REGISTER_SYMBOL(SbMutexDestroy);
+  REGISTER_SYMBOL(SbMutexRelease);
+  REGISTER_SYMBOL(SbOnce);
+  REGISTER_SYMBOL(SbPlayerCreate);
+  REGISTER_SYMBOL(SbPlayerDestroy);
+  REGISTER_SYMBOL(SbPlayerGetCurrentFrame);
+  REGISTER_SYMBOL(SbPlayerOutputModeSupported);
+  REGISTER_SYMBOL(SbPlayerSetBounds);
+  REGISTER_SYMBOL(SbPlayerSetPlaybackRate);
+  REGISTER_SYMBOL(SbPlayerSetVolume);
+  REGISTER_SYMBOL(SbPlayerWriteEndOfStream);
+  REGISTER_SYMBOL(SbSocketAccept);
+  REGISTER_SYMBOL(SbSocketBind);
+  REGISTER_SYMBOL(SbSocketClearLastError);
+  REGISTER_SYMBOL(SbSocketConnect);
+  REGISTER_SYMBOL(SbSocketCreate);
+  REGISTER_SYMBOL(SbSocketDestroy);
+  REGISTER_SYMBOL(SbSocketFreeResolution);
+  REGISTER_SYMBOL(SbSocketGetInterfaceAddress);
+  REGISTER_SYMBOL(SbSocketGetLastError);
+  REGISTER_SYMBOL(SbSocketGetLocalAddress);
+  REGISTER_SYMBOL(SbSocketIsConnected);
+  REGISTER_SYMBOL(SbSocketIsConnectedAndIdle);
+  REGISTER_SYMBOL(SbSocketJoinMulticastGroup);
+  REGISTER_SYMBOL(SbSocketListen);
+  REGISTER_SYMBOL(SbSocketReceiveFrom);
+  REGISTER_SYMBOL(SbSocketResolve);
+  REGISTER_SYMBOL(SbSocketSendTo);
+  REGISTER_SYMBOL(SbSocketSetBroadcast);
+  REGISTER_SYMBOL(SbSocketSetReceiveBufferSize);
+  REGISTER_SYMBOL(SbSocketSetReuseAddress);
+  REGISTER_SYMBOL(SbSocketSetSendBufferSize);
+  REGISTER_SYMBOL(SbSocketSetTcpKeepAlive);
+  REGISTER_SYMBOL(SbSocketSetTcpNoDelay);
+  REGISTER_SYMBOL(SbSocketSetTcpWindowScaling);
+  REGISTER_SYMBOL(SbSocketWaiterAdd);
+  REGISTER_SYMBOL(SbSocketWaiterCreate);
+  REGISTER_SYMBOL(SbSocketWaiterDestroy);
+  REGISTER_SYMBOL(SbSocketWaiterRemove);
+  REGISTER_SYMBOL(SbSocketWaiterWait);
+  REGISTER_SYMBOL(SbSocketWaiterWaitTimed);
+  REGISTER_SYMBOL(SbSocketWaiterWakeUp);
+  REGISTER_SYMBOL(SbStorageCloseRecord);
+  REGISTER_SYMBOL(SbStorageDeleteRecord);
+  REGISTER_SYMBOL(SbStorageGetRecordSize);
+  REGISTER_SYMBOL(SbStorageOpenRecord);
+  REGISTER_SYMBOL(SbStorageReadRecord);
+  REGISTER_SYMBOL(SbStorageWriteRecord);
+  REGISTER_SYMBOL(SbStringCompare);
+  REGISTER_SYMBOL(SbStringCompareAll);
+  REGISTER_SYMBOL(SbStringCompareNoCase);
+  REGISTER_SYMBOL(SbStringCompareNoCaseN);
+  REGISTER_SYMBOL(SbStringCompareWide);
+  REGISTER_SYMBOL(SbStringConcat);
+  REGISTER_SYMBOL(SbStringConcatWide);
+  REGISTER_SYMBOL(SbStringCopy);
+  REGISTER_SYMBOL(SbStringCopyWide);
+  REGISTER_SYMBOL(SbStringDuplicate);
+  REGISTER_SYMBOL(SbStringFindCharacter);
+  REGISTER_SYMBOL(SbStringFindLastCharacter);
+  REGISTER_SYMBOL(SbStringFindString);
+  REGISTER_SYMBOL(SbStringFormat);
+  REGISTER_SYMBOL(SbStringFormatWide);
+  REGISTER_SYMBOL(SbStringGetLength);
+  REGISTER_SYMBOL(SbStringGetLengthWide);
+  REGISTER_SYMBOL(SbStringParseDouble);
+  REGISTER_SYMBOL(SbStringParseSignedInteger);
+  REGISTER_SYMBOL(SbStringParseUInt64);
+  REGISTER_SYMBOL(SbStringParseUnsignedInteger);
+  REGISTER_SYMBOL(SbStringScan);
+  REGISTER_SYMBOL(SbSystemBinarySearch);
+  REGISTER_SYMBOL(SbSystemBreakIntoDebugger);
+  REGISTER_SYMBOL(SbSystemClearLastError);
+  REGISTER_SYMBOL(SbSystemGetConnectionType);
+  REGISTER_SYMBOL(SbSystemGetDeviceType);
+  REGISTER_SYMBOL(SbSystemGetErrorString);
+  REGISTER_SYMBOL(SbSystemGetLastError);
+  REGISTER_SYMBOL(SbSystemGetLocaleId);
+  REGISTER_SYMBOL(SbSystemGetNumberOfProcessors);
+  REGISTER_SYMBOL(SbSystemGetPath);
+  REGISTER_SYMBOL(SbSystemGetProperty);
+  REGISTER_SYMBOL(SbSystemGetRandomData);
+  REGISTER_SYMBOL(SbSystemGetRandomUInt64);
+  REGISTER_SYMBOL(SbSystemGetStack);
+  REGISTER_SYMBOL(SbSystemGetTotalCPUMemory);
+  REGISTER_SYMBOL(SbSystemGetTotalGPUMemory);
+  REGISTER_SYMBOL(SbSystemGetUsedCPUMemory);
+  REGISTER_SYMBOL(SbSystemGetUsedGPUMemory);
+  REGISTER_SYMBOL(SbSystemHasCapability);
+  REGISTER_SYMBOL(SbSystemHideSplashScreen);
+  REGISTER_SYMBOL(SbSystemIsDebuggerAttached);
+  REGISTER_SYMBOL(SbSystemRaisePlatformError);
+  REGISTER_SYMBOL(SbSystemRequestPause);
+  REGISTER_SYMBOL(SbSystemRequestStop);
+  REGISTER_SYMBOL(SbSystemRequestSuspend);
+  REGISTER_SYMBOL(SbSystemRequestUnpause);
+  REGISTER_SYMBOL(SbSystemSort);
+  REGISTER_SYMBOL(SbSystemSymbolize);
+  REGISTER_SYMBOL(SbThreadCreate);
+  REGISTER_SYMBOL(SbThreadCreateLocalKey);
+  REGISTER_SYMBOL(SbThreadDestroyLocalKey);
+  REGISTER_SYMBOL(SbThreadDetach);
+  REGISTER_SYMBOL(SbThreadGetCurrent);
+  REGISTER_SYMBOL(SbThreadGetId);
+  REGISTER_SYMBOL(SbThreadGetLocalValue);
+  REGISTER_SYMBOL(SbThreadGetName);
+  REGISTER_SYMBOL(SbThreadIsEqual);
+  REGISTER_SYMBOL(SbThreadJoin);
+  REGISTER_SYMBOL(SbThreadSetLocalValue);
+  REGISTER_SYMBOL(SbThreadSetName);
+  REGISTER_SYMBOL(SbThreadSleep);
+  REGISTER_SYMBOL(SbThreadYield);
+  REGISTER_SYMBOL(SbTimeGetMonotonicNow);
+  REGISTER_SYMBOL(SbTimeGetNow);
+  REGISTER_SYMBOL(SbTimeZoneGetCurrent);
+  REGISTER_SYMBOL(SbTimeZoneGetName);
+  REGISTER_SYMBOL(SbUserGetCurrent);
+  REGISTER_SYMBOL(SbUserGetProperty);
+  REGISTER_SYMBOL(SbUserGetPropertySize);
+  REGISTER_SYMBOL(SbUserGetSignedIn);
+  REGISTER_SYMBOL(SbWindowCreate);
+  REGISTER_SYMBOL(SbWindowDestroy);
+  REGISTER_SYMBOL(SbWindowGetPlatformHandle);
+  REGISTER_SYMBOL(SbWindowGetSize);
+  REGISTER_SYMBOL(SbWindowSetDefaultOptions);
 
-#if SB_API_VERSION >= 11
-  map_["SbCPUFeaturesGet"] = reinterpret_cast<const void*>(SbCPUFeaturesGet);
-#endif
-
-  map_["SbDecodeTargetGetInfo"] =
-      reinterpret_cast<const void*>(SbDecodeTargetGetInfo);
-  map_["SbDecodeTargetRelease"] =
-      reinterpret_cast<const void*>(SbDecodeTargetRelease);
-  map_["SbDirectoryCanOpen"] =
-      reinterpret_cast<const void*>(SbDirectoryCanOpen);
-  map_["SbDirectoryClose"] = reinterpret_cast<const void*>(SbDirectoryClose);
-  map_["SbDirectoryCreate"] = reinterpret_cast<const void*>(SbDirectoryCreate);
-  map_["SbDirectoryGetNext"] =
-      reinterpret_cast<const void*>(SbDirectoryGetNext);
-  map_["SbDirectoryOpen"] = reinterpret_cast<const void*>(SbDirectoryOpen);
-  map_["SbDoubleAbsolute"] = reinterpret_cast<const void*>(SbDoubleAbsolute);
-  map_["SbDoubleExponent"] = reinterpret_cast<const void*>(SbDoubleExponent);
-  map_["SbDoubleFloor"] = reinterpret_cast<const void*>(SbDoubleFloor);
-  map_["SbDoubleIsFinite"] = reinterpret_cast<const void*>(SbDoubleIsFinite);
-  map_["SbDoubleIsNan"] = reinterpret_cast<const void*>(SbDoubleIsNan);
-  map_["SbDrmCloseSession"] = reinterpret_cast<const void*>(SbDrmCloseSession);
-  map_["SbDrmCreateSystem"] = reinterpret_cast<const void*>(SbDrmCreateSystem);
-  map_["SbDrmDestroySystem"] =
-      reinterpret_cast<const void*>(SbDrmDestroySystem);
-  map_["SbDrmGenerateSessionUpdateRequest"] =
-      reinterpret_cast<const void*>(SbDrmGenerateSessionUpdateRequest);
-
-#if SB_API_VERSION >= 10
-  map_["SbDrmIsServerCertificateUpdatable"] =
-      reinterpret_cast<const void*>(SbDrmIsServerCertificateUpdatable);
-  map_["SbDrmUpdateServerCertificate"] =
-      reinterpret_cast<const void*>(SbDrmUpdateServerCertificate);
-#endif
-
-  map_["SbDrmUpdateSession"] =
-      reinterpret_cast<const void*>(SbDrmUpdateSession);
-  map_["SbEventCancel"] = reinterpret_cast<const void*>(SbEventCancel);
-  map_["SbEventSchedule"] = reinterpret_cast<const void*>(SbEventSchedule);
-  map_["SbFileCanOpen"] = reinterpret_cast<const void*>(SbFileCanOpen);
-  map_["SbFileClose"] = reinterpret_cast<const void*>(SbFileClose);
-  map_["SbFileDelete"] = reinterpret_cast<const void*>(SbFileDelete);
-  map_["SbFileExists"] = reinterpret_cast<const void*>(SbFileExists);
-  map_["SbFileFlush"] = reinterpret_cast<const void*>(SbFileFlush);
-  map_["SbFileGetInfo"] = reinterpret_cast<const void*>(SbFileGetInfo);
-  map_["SbFileGetPathInfo"] = reinterpret_cast<const void*>(SbFileGetPathInfo);
-  map_["SbFileModeStringToFlags"] =
-      reinterpret_cast<const void*>(SbFileModeStringToFlags);
-  map_["SbFileOpen"] = reinterpret_cast<const void*>(SbFileOpen);
-  map_["SbFileRead"] = reinterpret_cast<const void*>(SbFileRead);
-  map_["SbFileSeek"] = reinterpret_cast<const void*>(SbFileSeek);
-  map_["SbFileTruncate"] = reinterpret_cast<const void*>(SbFileTruncate);
-  map_["SbFileWrite"] = reinterpret_cast<const void*>(SbFileWrite);
-  map_["SbGetEglInterface"] = reinterpret_cast<const void*>(SbGetEglInterface);
-  map_["SbGetGlesInterface"] =
-      reinterpret_cast<const void*>(SbGetGlesInterface);
-  map_["SbImageDecode"] = reinterpret_cast<const void*>(SbImageDecode);
-  map_["SbImageIsDecodeSupported"] =
-      reinterpret_cast<const void*>(SbImageIsDecodeSupported);
-  map_["SbLog"] = reinterpret_cast<const void*>(SbLog);
-  map_["SbLogFlush"] = reinterpret_cast<const void*>(SbLogFlush);
-  map_["SbLogFormat"] = reinterpret_cast<const void*>(SbLogFormat);
-  map_["SbLogIsTty"] = reinterpret_cast<const void*>(SbLogIsTty);
-  map_["SbLogRaw"] = reinterpret_cast<const void*>(SbLogRaw);
-  map_["SbLogRawFormat"] = reinterpret_cast<const void*>(SbLogRawFormat);
-  map_["SbMediaCanPlayMimeAndKeySystem"] =
-      reinterpret_cast<const void*>(SbMediaCanPlayMimeAndKeySystem);
-
-#if SB_API_VERSION >= 10
-  map_["SbMediaGetAudioBufferBudget"] =
-      reinterpret_cast<const void*>(SbMediaGetAudioBufferBudget);
-  map_["SbMediaGetBufferAlignment"] =
-      reinterpret_cast<const void*>(SbMediaGetBufferAlignment);
-  map_["SbMediaGetBufferAllocationUnit"] =
-      reinterpret_cast<const void*>(SbMediaGetBufferAllocationUnit);
-  map_["SbMediaGetBufferGarbageCollectionDurationThreshold"] =
-      reinterpret_cast<const void*>(
-          SbMediaGetBufferGarbageCollectionDurationThreshold);
-  map_["SbMediaGetBufferPadding"] =
-      reinterpret_cast<const void*>(SbMediaGetBufferPadding);
-  map_["SbMediaGetInitialBufferCapacity"] =
-      reinterpret_cast<const void*>(SbMediaGetInitialBufferCapacity);
-  map_["SbMediaGetMaxBufferCapacity"] =
-      reinterpret_cast<const void*>(SbMediaGetMaxBufferCapacity);
-  map_["SbMediaGetProgressiveBufferBudget"] =
-      reinterpret_cast<const void*>(SbMediaGetProgressiveBufferBudget);
-  map_["SbMediaGetVideoBufferBudget"] =
-      reinterpret_cast<const void*>(SbMediaGetVideoBufferBudget);
-  map_["SbMediaIsBufferPoolAllocateOnDemand"] =
-      reinterpret_cast<const void*>(SbMediaIsBufferPoolAllocateOnDemand);
-  map_["SbMediaIsBufferUsingMemoryPool"] =
-      reinterpret_cast<const void*>(SbMediaIsBufferUsingMemoryPool);
-#endif
-
-#if SB_API_VERSION >= 11
-  map_["SbMediaSetAudioWriteDuration"] =
-      reinterpret_cast<const void*>(SbMediaSetAudioWriteDuration);
-#endif
-
-  map_["SbMemoryAllocateAlignedUnchecked"] =
-      reinterpret_cast<const void*>(SbMemoryAllocateAlignedUnchecked);
-  map_["SbMemoryAllocateUnchecked"] =
-      reinterpret_cast<const void*>(SbMemoryAllocateUnchecked);
-  map_["SbMemoryCompare"] = reinterpret_cast<const void*>(SbMemoryCompare);
-  map_["SbMemoryCopy"] = reinterpret_cast<const void*>(SbMemoryCopy);
-  map_["SbMemoryFindByte"] = reinterpret_cast<const void*>(SbMemoryFindByte);
-  map_["SbMemoryFree"] = reinterpret_cast<const void*>(SbMemoryFree);
-  map_["SbMemoryFreeAligned"] =
-      reinterpret_cast<const void*>(SbMemoryFreeAligned);
-
-#if SB_HAS(MMAP)
-  map_["SbMemoryMap"] = reinterpret_cast<const void*>(SbMemoryMap);
-#endif
-  map_["SbMemoryMove"] = reinterpret_cast<const void*>(SbMemoryMove);
-
-#if SB_API_VERSION >= 10 && SB_HAS(MMAP)
-  map_["SbMemoryProtect"] = reinterpret_cast<const void*>(SbMemoryProtect);
-#endif
-
-  map_["SbMemoryReallocateUnchecked"] =
-      reinterpret_cast<const void*>(SbMemoryReallocateUnchecked);
-  map_["SbMemorySet"] = reinterpret_cast<const void*>(SbMemorySet);
-
-#if SB_HAS(MMAP)
-  map_["SbMemoryUnmap"] = reinterpret_cast<const void*>(SbMemoryUnmap);
-#endif
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
+  REGISTER_SYMBOL(SbMemoryFlush);
+#endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
 
 #if SB_HAS(MICROPHONE)
-  map_["SbMicrophoneClose"] = reinterpret_cast<const void*>(SbMicrophoneClose);
-  map_["SbMicrophoneCreate"] =
-      reinterpret_cast<const void*>(SbMicrophoneCreate);
-  map_["SbMicrophoneDestroy"] =
-      reinterpret_cast<const void*>(SbMicrophoneDestroy);
-  map_["SbMicrophoneGetAvailable"] =
-      reinterpret_cast<const void*>(SbMicrophoneGetAvailable);
-  map_["SbMicrophoneIsSampleRateSupported"] =
-      reinterpret_cast<const void*>(SbMicrophoneIsSampleRateSupported);
-  map_["SbMicrophoneOpen"] = reinterpret_cast<const void*>(SbMicrophoneOpen);
-  map_["SbMicrophoneRead"] = reinterpret_cast<const void*>(SbMicrophoneRead);
+  REGISTER_SYMBOL(SbMicrophoneClose);
+  REGISTER_SYMBOL(SbMicrophoneCreate);
+  REGISTER_SYMBOL(SbMicrophoneDestroy);
+  REGISTER_SYMBOL(SbMicrophoneGetAvailable);
+  REGISTER_SYMBOL(SbMicrophoneIsSampleRateSupported);
+  REGISTER_SYMBOL(SbMicrophoneOpen);
+  REGISTER_SYMBOL(SbMicrophoneRead);
 #endif
 
-  map_["SbMutexAcquire"] = reinterpret_cast<const void*>(SbMutexAcquire);
-  map_["SbMutexAcquireTry"] = reinterpret_cast<const void*>(SbMutexAcquireTry);
-  map_["SbMutexCreate"] = reinterpret_cast<const void*>(SbMutexCreate);
-  map_["SbMutexDestroy"] = reinterpret_cast<const void*>(SbMutexDestroy);
-  map_["SbMutexRelease"] = reinterpret_cast<const void*>(SbMutexRelease);
-  map_["SbOnce"] = reinterpret_cast<const void*>(SbOnce);
-
-  map_["SbPlayerCreate"] = reinterpret_cast<const void*>(SbPlayerCreate);
-  map_["SbPlayerDestroy"] = reinterpret_cast<const void*>(SbPlayerDestroy);
-  map_["SbPlayerGetCurrentFrame"] =
-      reinterpret_cast<const void*>(SbPlayerGetCurrentFrame);
-
-#if SB_API_VERSION >= 10
-  map_["SbPlayerGetInfo2"] = reinterpret_cast<const void*>(SbPlayerGetInfo2);
-  map_["SbPlayerGetMaximumNumberOfSamplesPerWrite"] =
-      reinterpret_cast<const void*>(SbPlayerGetMaximumNumberOfSamplesPerWrite);
-
-#endif
-
-  map_["SbPlayerOutputModeSupported"] =
-      reinterpret_cast<const void*>(SbPlayerOutputModeSupported);
-
-#if SB_API_VERSION >= 10
-  map_["SbPlayerSeek2"] = reinterpret_cast<const void*>(SbPlayerSeek2);
-#endif
-
-  map_["SbPlayerSetBounds"] = reinterpret_cast<const void*>(SbPlayerSetBounds);
-  map_["SbPlayerSetPlaybackRate"] =
-      reinterpret_cast<const void*>(SbPlayerSetPlaybackRate);
-  map_["SbPlayerSetVolume"] = reinterpret_cast<const void*>(SbPlayerSetVolume);
-  map_["SbPlayerWriteEndOfStream"] =
-      reinterpret_cast<const void*>(SbPlayerWriteEndOfStream);
-
-#if SB_API_VERSION >= 10
-  map_["SbPlayerWriteSample2"] =
-      reinterpret_cast<const void*>(SbPlayerWriteSample2);
-#endif
-
-  map_["SbSocketAccept"] = reinterpret_cast<const void*>(SbSocketAccept);
-  map_["SbSocketBind"] = reinterpret_cast<const void*>(SbSocketBind);
-  map_["SbSocketClearLastError"] =
-      reinterpret_cast<const void*>(SbSocketClearLastError);
-  map_["SbSocketConnect"] = reinterpret_cast<const void*>(SbSocketConnect);
-  map_["SbSocketCreate"] = reinterpret_cast<const void*>(SbSocketCreate);
-  map_["SbSocketDestroy"] = reinterpret_cast<const void*>(SbSocketDestroy);
-  map_["SbSocketFreeResolution"] =
-      reinterpret_cast<const void*>(SbSocketFreeResolution);
-  map_["SbSocketGetInterfaceAddress"] =
-      reinterpret_cast<const void*>(SbSocketGetInterfaceAddress);
-  map_["SbSocketGetLastError"] =
-      reinterpret_cast<const void*>(SbSocketGetLastError);
-  map_["SbSocketGetLocalAddress"] =
-      reinterpret_cast<const void*>(SbSocketGetLocalAddress);
-  map_["SbSocketIsConnected"] =
-      reinterpret_cast<const void*>(SbSocketIsConnected);
-  map_["SbSocketIsConnectedAndIdle"] =
-      reinterpret_cast<const void*>(SbSocketIsConnectedAndIdle);
-  map_["SbSocketJoinMulticastGroup"] =
-      reinterpret_cast<const void*>(SbSocketJoinMulticastGroup);
-  map_["SbSocketListen"] = reinterpret_cast<const void*>(SbSocketListen);
-  map_["SbSocketReceiveFrom"] =
-      reinterpret_cast<const void*>(SbSocketReceiveFrom);
-  map_["SbSocketResolve"] = reinterpret_cast<const void*>(SbSocketResolve);
-  map_["SbSocketSendTo"] = reinterpret_cast<const void*>(SbSocketSendTo);
-  map_["SbSocketSetBroadcast"] =
-      reinterpret_cast<const void*>(SbSocketSetBroadcast);
-  map_["SbSocketSetReceiveBufferSize"] =
-      reinterpret_cast<const void*>(SbSocketSetReceiveBufferSize);
-  map_["SbSocketSetReuseAddress"] =
-      reinterpret_cast<const void*>(SbSocketSetReuseAddress);
-  map_["SbSocketSetSendBufferSize"] =
-      reinterpret_cast<const void*>(SbSocketSetSendBufferSize);
-  map_["SbSocketSetTcpKeepAlive"] =
-      reinterpret_cast<const void*>(SbSocketSetTcpKeepAlive);
-  map_["SbSocketSetTcpNoDelay"] =
-      reinterpret_cast<const void*>(SbSocketSetTcpNoDelay);
-  map_["SbSocketSetTcpWindowScaling"] =
-      reinterpret_cast<const void*>(SbSocketSetTcpWindowScaling);
-  map_["SbSocketWaiterAdd"] = reinterpret_cast<const void*>(SbSocketWaiterAdd);
-  map_["SbSocketWaiterCreate"] =
-      reinterpret_cast<const void*>(SbSocketWaiterCreate);
-  map_["SbSocketWaiterDestroy"] =
-      reinterpret_cast<const void*>(SbSocketWaiterDestroy);
-  map_["SbSocketWaiterRemove"] =
-      reinterpret_cast<const void*>(SbSocketWaiterRemove);
-  map_["SbSocketWaiterWait"] =
-      reinterpret_cast<const void*>(SbSocketWaiterWait);
-  map_["SbSocketWaiterWaitTimed"] =
-      reinterpret_cast<const void*>(SbSocketWaiterWaitTimed);
-  map_["SbSocketWaiterWakeUp"] =
-      reinterpret_cast<const void*>(SbSocketWaiterWakeUp);
-
-#if SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= 5
-  map_["SbSpeechRecognizerCreate"] =
-      reinterpret_cast<const void*>(SbSpeechRecognizerCreate);
-  map_["SbSpeechRecognizerDestroy"] =
-      reinterpret_cast<const void*>(SbSpeechRecognizerDestroy);
-  map_["SbSpeechRecognizerStart"] =
-      reinterpret_cast<const void*>(SbSpeechRecognizerStart);
-  map_["SbSpeechRecognizerStop"] =
-      reinterpret_cast<const void*>(SbSpeechRecognizerStop);
+#if SB_HAS(MMAP)
+  REGISTER_SYMBOL(SbMemoryMap);
+  REGISTER_SYMBOL(SbMemoryUnmap);
 #endif
 
 #if SB_HAS(SPEECH_SYNTHESIS)
-  map_["SbSpeechSynthesisCancel"] =
-      reinterpret_cast<const void*>(SbSpeechSynthesisCancel);
-  map_["SbSpeechSynthesisSpeak"] =
-      reinterpret_cast<const void*>(SbSpeechSynthesisSpeak);
+  REGISTER_SYMBOL(SbSpeechSynthesisCancel);
+  REGISTER_SYMBOL(SbSpeechSynthesisSpeak);
 #endif
 
-  map_["SbStorageCloseRecord"] =
-      reinterpret_cast<const void*>(SbStorageCloseRecord);
-  map_["SbStorageDeleteRecord"] =
-      reinterpret_cast<const void*>(SbStorageDeleteRecord);
-  map_["SbStorageGetRecordSize"] =
-      reinterpret_cast<const void*>(SbStorageGetRecordSize);
-  map_["SbStorageOpenRecord"] =
-      reinterpret_cast<const void*>(SbStorageOpenRecord);
-  map_["SbStorageReadRecord"] =
-      reinterpret_cast<const void*>(SbStorageReadRecord);
-  map_["SbStorageWriteRecord"] =
-      reinterpret_cast<const void*>(SbStorageWriteRecord);
-  map_["SbStringCompare"] = reinterpret_cast<const void*>(SbStringCompare);
-  map_["SbStringCompareAll"] =
-      reinterpret_cast<const void*>(SbStringCompareAll);
-  map_["SbStringCompareNoCase"] =
-      reinterpret_cast<const void*>(SbStringCompareNoCase);
-  map_["SbStringCompareNoCaseN"] =
-      reinterpret_cast<const void*>(SbStringCompareNoCaseN);
-  map_["SbStringConcat"] = reinterpret_cast<const void*>(SbStringConcat);
-  map_["SbStringCopy"] = reinterpret_cast<const void*>(SbStringCopy);
-  map_["SbStringDuplicate"] = reinterpret_cast<const void*>(SbStringDuplicate);
-  map_["SbStringFindCharacter"] =
-      reinterpret_cast<const void*>(SbStringFindCharacter);
-  map_["SbStringFindLastCharacter"] =
-      reinterpret_cast<const void*>(SbStringFindLastCharacter);
-  map_["SbStringFindString"] =
-      reinterpret_cast<const void*>(SbStringFindString);
-  map_["SbStringFormat"] = reinterpret_cast<const void*>(SbStringFormat);
-  map_["SbStringFormatWide"] =
-      reinterpret_cast<const void*>(SbStringFormatWide);
-  map_["SbStringGetLength"] = reinterpret_cast<const void*>(SbStringGetLength);
-  map_["SbStringParseDouble"] =
-      reinterpret_cast<const void*>(SbStringParseDouble);
-  map_["SbStringParseSignedInteger"] =
-      reinterpret_cast<const void*>(SbStringParseSignedInteger);
-  map_["SbStringParseUInt64"] =
-      reinterpret_cast<const void*>(SbStringParseUInt64);
-  map_["SbStringParseUnsignedInteger"] =
-      reinterpret_cast<const void*>(SbStringParseUnsignedInteger);
-  map_["SbStringScan"] = reinterpret_cast<const void*>(SbStringScan);
-  map_["SbSystemBinarySearch"] =
-      reinterpret_cast<const void*>(SbSystemBinarySearch);
-  map_["SbSystemBreakIntoDebugger"] =
-      reinterpret_cast<const void*>(SbSystemBreakIntoDebugger);
-  map_["SbSystemClearLastError"] =
-      reinterpret_cast<const void*>(SbSystemClearLastError);
-  map_["SbSystemGetConnectionType"] =
-      reinterpret_cast<const void*>(SbSystemGetConnectionType);
-  map_["SbSystemGetDeviceType"] =
-      reinterpret_cast<const void*>(SbSystemGetDeviceType);
-  map_["SbSystemGetErrorString"] =
-      reinterpret_cast<const void*>(SbSystemGetErrorString);
-
-#if SB_API_VERSION >= 11
-  map_["SbSystemGetExtension"] =
-      reinterpret_cast<const void*>(SbSystemGetExtension);
-#endif
-
-  map_["SbSystemGetLastError"] =
-      reinterpret_cast<const void*>(SbSystemGetLastError);
-  map_["SbSystemGetLocaleId"] =
-      reinterpret_cast<const void*>(SbSystemGetLocaleId);
-  map_["SbSystemGetNumberOfProcessors"] =
-      reinterpret_cast<const void*>(SbSystemGetNumberOfProcessors);
-  map_["SbSystemGetPath"] = reinterpret_cast<const void*>(SbSystemGetPath);
-  map_["SbSystemGetProperty"] =
-      reinterpret_cast<const void*>(SbSystemGetProperty);
-  map_["SbSystemGetRandomData"] =
-      reinterpret_cast<const void*>(SbSystemGetRandomData);
-  map_["SbSystemGetRandomUInt64"] =
-      reinterpret_cast<const void*>(SbSystemGetRandomUInt64);
-  map_["SbSystemGetStack"] = reinterpret_cast<const void*>(SbSystemGetStack);
-  map_["SbSystemGetTotalCPUMemory"] =
-      reinterpret_cast<const void*>(SbSystemGetTotalCPUMemory);
-  map_["SbSystemGetTotalGPUMemory"] =
-      reinterpret_cast<const void*>(SbSystemGetTotalGPUMemory);
-  map_["SbSystemGetUsedCPUMemory"] =
-      reinterpret_cast<const void*>(SbSystemGetUsedCPUMemory);
-  map_["SbSystemGetUsedGPUMemory"] =
-      reinterpret_cast<const void*>(SbSystemGetUsedGPUMemory);
-  map_["SbSystemHasCapability"] =
-      reinterpret_cast<const void*>(SbSystemHasCapability);
-  map_["SbSystemHideSplashScreen"] =
-      reinterpret_cast<const void*>(SbSystemHideSplashScreen);
-  map_["SbSystemIsDebuggerAttached"] =
-      reinterpret_cast<const void*>(SbSystemIsDebuggerAttached);
-  map_["SbSystemRaisePlatformError"] =
-      reinterpret_cast<const void*>(SbSystemRaisePlatformError);
-  map_["SbSystemRequestPause"] =
-      reinterpret_cast<const void*>(SbSystemRequestPause);
-  map_["SbSystemRequestStop"] =
-      reinterpret_cast<const void*>(SbSystemRequestStop);
-  map_["SbSystemRequestSuspend"] =
-      reinterpret_cast<const void*>(SbSystemRequestSuspend);
-  map_["SbSystemRequestUnpause"] =
-      reinterpret_cast<const void*>(SbSystemRequestUnpause);
-
-#if SB_API_VERSION >= 11
-  map_["SbSystemSignWithCertificationSecretKey"] =
-      reinterpret_cast<const void*>(SbSystemSignWithCertificationSecretKey);
-#endif
-
-  map_["SbSystemSort"] = reinterpret_cast<const void*>(SbSystemSort);
-
-#if SB_API_VERSION >= 10
-  map_["SbSystemSupportsResume"] =
-      reinterpret_cast<const void*>(SbSystemSupportsResume);
-#endif
-
-  map_["SbSystemSymbolize"] = reinterpret_cast<const void*>(SbSystemSymbolize);
-
-#if SB_API_VERSION >= 11
-  map_["SbThreadContextGetPointer"] =
-      reinterpret_cast<const void*>(SbThreadContextGetPointer);
-#endif
-
-  map_["SbThreadCreate"] = reinterpret_cast<const void*>(SbThreadCreate);
-  map_["SbThreadCreateLocalKey"] =
-      reinterpret_cast<const void*>(SbThreadCreateLocalKey);
-  map_["SbThreadDestroyLocalKey"] =
-      reinterpret_cast<const void*>(SbThreadDestroyLocalKey);
-  map_["SbThreadDetach"] = reinterpret_cast<const void*>(SbThreadDetach);
-  map_["SbThreadGetCurrent"] =
-      reinterpret_cast<const void*>(SbThreadGetCurrent);
-  map_["SbThreadGetId"] = reinterpret_cast<const void*>(SbThreadGetId);
-  map_["SbThreadGetLocalValue"] =
-      reinterpret_cast<const void*>(SbThreadGetLocalValue);
-  map_["SbThreadIsEqual"] = reinterpret_cast<const void*>(SbThreadIsEqual);
-  map_["SbThreadJoin"] = reinterpret_cast<const void*>(SbThreadJoin);
-
-#if SB_API_VERSION >= 11
-  map_["SbThreadSamplerCreate"] =
-      reinterpret_cast<const void*>(SbThreadSamplerCreate);
-
-  map_["SbThreadSamplerDestroy"] =
-      reinterpret_cast<const void*>(SbThreadSamplerDestroy);
-  map_["SbThreadSamplerFreeze"] =
-      reinterpret_cast<const void*>(SbThreadSamplerFreeze);
-  map_["SbThreadSamplerThaw"] =
-      reinterpret_cast<const void*>(SbThreadSamplerThaw);
-#endif
-
-  map_["SbThreadSetLocalValue"] =
-      reinterpret_cast<const void*>(SbThreadSetLocalValue);
-  map_["SbThreadSetName"] = reinterpret_cast<const void*>(SbThreadSetName);
-  map_["SbThreadSleep"] = reinterpret_cast<const void*>(SbThreadSleep);
-  map_["SbThreadYield"] = reinterpret_cast<const void*>(SbThreadYield);
-  map_["SbTimeGetMonotonicNow"] =
-      reinterpret_cast<const void*>(SbTimeGetMonotonicNow);
-
 #if SB_HAS(TIME_THREAD_NOW)
-  map_["SbTimeGetMonotonicThreadNow"] =
-      reinterpret_cast<const void*>(SbTimeGetMonotonicThreadNow);
+  REGISTER_SYMBOL(SbTimeGetMonotonicThreadNow);
 #endif
 
-  map_["SbTimeGetNow"] = reinterpret_cast<const void*>(SbTimeGetNow);
-  map_["SbTimeZoneGetCurrent"] =
-      reinterpret_cast<const void*>(SbTimeZoneGetCurrent);
-  map_["SbTimeZoneGetName"] = reinterpret_cast<const void*>(SbTimeZoneGetName);
-
 #if SB_API_VERSION >= SB_UI_NAVIGATION_VERSION
-  map_["SbUiNavGetInterface"] =
-      reinterpret_cast<const void*>(SbUiNavGetInterface);
+  REGISTER_SYMBOL(SbUiNavGetInterface);
 #endif
 
-  map_["SbUserGetCurrent"] = reinterpret_cast<const void*>(SbUserGetCurrent);
-  map_["SbUserGetProperty"] = reinterpret_cast<const void*>(SbUserGetProperty);
-  map_["SbUserGetPropertySize"] =
-      reinterpret_cast<const void*>(SbUserGetPropertySize);
-  map_["SbWindowCreate"] = reinterpret_cast<const void*>(SbWindowCreate);
-  map_["SbWindowDestroy"] = reinterpret_cast<const void*>(SbWindowDestroy);
+#if SB_API_VERSION >= 5
+#if SB_HAS(SPEECH_RECOGNIZER)
+  REGISTER_SYMBOL(SbSpeechRecognizerCreate);
+  REGISTER_SYMBOL(SbSpeechRecognizerDestroy);
+  REGISTER_SYMBOL(SbSpeechRecognizerStart);
+  REGISTER_SYMBOL(SbSpeechRecognizerStop);
+#endif
+#endif
+
+#if SB_API_VERSION >= 10
+#if SB_HAS(MMAP)
+  REGISTER_SYMBOL(SbMemoryProtect);
+#endif
+  REGISTER_SYMBOL(SbDrmIsServerCertificateUpdatable);
+  REGISTER_SYMBOL(SbDrmUpdateServerCertificate);
+  REGISTER_SYMBOL(SbMediaGetAudioBufferBudget);
+  REGISTER_SYMBOL(SbMediaGetBufferAlignment);
+  REGISTER_SYMBOL(SbMediaGetBufferAllocationUnit);
+  REGISTER_SYMBOL(SbMediaGetBufferGarbageCollectionDurationThreshold);
+  REGISTER_SYMBOL(SbMediaGetBufferPadding);
+  REGISTER_SYMBOL(SbMediaGetBufferStorageType);
+  REGISTER_SYMBOL(SbMediaGetInitialBufferCapacity);
+  REGISTER_SYMBOL(SbMediaGetMaxBufferCapacity);
+  REGISTER_SYMBOL(SbMediaGetProgressiveBufferBudget);
+  REGISTER_SYMBOL(SbMediaGetVideoBufferBudget);
+  REGISTER_SYMBOL(SbMediaIsBufferPoolAllocateOnDemand);
+  REGISTER_SYMBOL(SbMediaIsBufferUsingMemoryPool);
+  REGISTER_SYMBOL(SbPlayerGetInfo2);
+  REGISTER_SYMBOL(SbPlayerGetMaximumNumberOfSamplesPerWrite);
+  REGISTER_SYMBOL(SbPlayerSeek2);
+  REGISTER_SYMBOL(SbPlayerWriteSample2);
+  REGISTER_SYMBOL(SbSystemSupportsResume);
+#endif
 
 #if SB_API_VERSION >= 11
-  map_["SbWindowGetDiagonalSizeInInches"] =
-      reinterpret_cast<const void*>(SbWindowGetDiagonalSizeInInches);
+  REGISTER_SYMBOL(SbAudioSinkGetMinBufferSizeInFrames);
+  REGISTER_SYMBOL(SbCPUFeaturesGet);
+  REGISTER_SYMBOL(SbMediaSetAudioWriteDuration);
+  REGISTER_SYMBOL(SbSystemGetExtension);
+  REGISTER_SYMBOL(SbSystemSignWithCertificationSecretKey);
+  REGISTER_SYMBOL(SbThreadContextGetPointer);
+  REGISTER_SYMBOL(SbThreadSamplerCreate);
+  REGISTER_SYMBOL(SbThreadSamplerDestroy);
+  REGISTER_SYMBOL(SbThreadSamplerFreeze);
+  REGISTER_SYMBOL(SbThreadSamplerIsSupported);
+  REGISTER_SYMBOL(SbThreadSamplerThaw);
+  REGISTER_SYMBOL(SbWindowGetDiagonalSizeInInches);
 #endif
-
-  map_["SbWindowGetPlatformHandle"] =
-      reinterpret_cast<const void*>(SbWindowGetPlatformHandle);
-  map_["SbWindowGetSize"] = reinterpret_cast<const void*>(SbWindowGetSize);
-  map_["SbWindowSetDefaultOptions"] =
-      reinterpret_cast<const void*>(SbWindowSetDefaultOptions);
 }
 
 const void* ExportedSymbols::Lookup(const char* name) {
@@ -536,5 +361,6 @@
   SB_CHECK(ret) << name;
   return ret;
 }
+
 }  // namespace elf_loader
 }  // namespace starboard
diff --git a/src/starboard/examples/glclear/glclear.gyp b/src/starboard/examples/glclear/glclear.gyp
index db49702..bb814f63 100644
--- a/src/starboard/examples/glclear/glclear.gyp
+++ b/src/starboard/examples/glclear/glclear.gyp
@@ -18,16 +18,7 @@
       'target_name': 'starboard_glclear_example',
       'type': '<(final_executable_type)',
       'conditions': [
-        ['sb_evergreen == 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
-            '<(DEPTH)/third_party/llvm-project/compiler-rt/compiler-rt.gyp:compiler_rt',
-            '<(DEPTH)/third_party/llvm-project/libcxx/libcxx.gyp:cxx',
-            '<(DEPTH)/third_party/llvm-project/libcxxabi/libcxxabi.gyp:cxxabi',
-            '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind',
-            '<(DEPTH)/third_party/musl/musl.gyp:c',
-          ],
-        }, {
+        ['sb_evergreen != 1', {
           'dependencies': [
             '<(DEPTH)/starboard/egl_and_gles/egl_and_gles.gyp:egl_and_gles',
           ],
diff --git a/src/starboard/examples/glclear/main.cc b/src/starboard/examples/glclear/main.cc
index a54ef01..2a12c7a 100644
--- a/src/starboard/examples/glclear/main.cc
+++ b/src/starboard/examples/glclear/main.cc
@@ -23,12 +23,25 @@
 #include "starboard/system.h"
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 11
+#if SB_API_VERSION < 11
+
+// This example uses the updated EGL and GLES Starboard interfaces implemented
+// in Staboard API version 11. These interfaces substantially changed how EGL
+// and GLES are used, and are not compatible with previous methodologies. For
+// additional information, please refer to the following files:
+//
+//   //starboard/egl.h
+//   //starboard/gles.h
+//
+//   //cobalt/renderer/egl_and_gles.h
+
+void SbEventHandle(const SbEvent* event) {
+  SB_NOTREACHED() << "SB_API_VERSION must be >= 11.";
+}
+#else  // SB_API_VERSION >= 11
+
 #include "starboard/egl.h"
 #include "starboard/gles.h"
-#else   // SB_API_VERSION >= 11
-#error "This demo requires SB_API_VERSION >= 11."
-#endif  // SB_API_VERSION >= 11
 
 #define EGL_CALL(x)                                                    \
   do {                                                                 \
@@ -253,3 +266,4 @@
     default: {}
   }
 }
+#endif  // SB_API_VERSION < 11
diff --git a/src/starboard/linux/shared/configuration_public.h b/src/starboard/linux/shared/configuration_public.h
index 19df54b..d381ef6 100644
--- a/src/starboard/linux/shared/configuration_public.h
+++ b/src/starboard/linux/shared/configuration_public.h
@@ -50,9 +50,6 @@
 // Whether the current platform provides the standard header sys/types.h.
 #define SB_HAS_SYS_TYPES_H 1
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/starboard/linux/x64x11/configuration_public.h b/src/starboard/linux/x64x11/configuration_public.h
index 748f732..3d99d29 100644
--- a/src/starboard/linux/x64x11/configuration_public.h
+++ b/src/starboard/linux/x64x11/configuration_public.h
@@ -79,22 +79,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
diff --git a/src/starboard/linux/x64x11/mock/configuration_public.h b/src/starboard/linux/x64x11/mock/configuration_public.h
index 76a49ae..d2b5815 100644
--- a/src/starboard/linux/x64x11/mock/configuration_public.h
+++ b/src/starboard/linux/x64x11/mock/configuration_public.h
@@ -69,22 +69,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
@@ -115,9 +99,6 @@
 // Whether the current platform provides the standard header inttypes.h.
 #define SB_HAS_INTTYPES_H 1
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/starboard/nplb/drm_create_system_test.cc b/src/starboard/nplb/drm_create_system_test.cc
index 0b68275..9cd4b7a 100644
--- a/src/starboard/nplb/drm_create_system_test.cc
+++ b/src/starboard/nplb/drm_create_system_test.cc
@@ -44,7 +44,6 @@
 TEST(SbDrmTest, NullCallbacks) {
   for (int i = 0; i < SB_ARRAY_SIZE_INT(kKeySystems); ++i) {
     const char* key_system = kKeySystems[i];
-#if SB_API_VERSION >= 10
     {
       SbDrmSystem drm_system = SbDrmCreateSystem(
           key_system, NULL /* context */,
@@ -86,69 +85,9 @@
       EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
       SbDrmDestroySystem(drm_system);
     }
-#elif SB_HAS(DRM_SESSION_CLOSED)
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */,
-          NULL /* session_update_request_func */, DummySessionUpdatedFunc,
-          DummySessionKeyStatusesChangedFunc, DummySessionClosedFunc);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */, DummySessionUpdateRequestFunc,
-          NULL /*session_updated_func */, DummySessionKeyStatusesChangedFunc,
-          DummySessionClosedFunc);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */, DummySessionUpdateRequestFunc,
-          DummySessionUpdatedFunc, NULL /* session_key_statuses_changed_func */,
-          DummySessionClosedFunc);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */, DummySessionUpdateRequestFunc,
-          DummySessionUpdatedFunc, DummySessionKeyStatusesChangedFunc,
-          NULL /* session_closed_func */);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-#else   // SB_HAS(DRM_SESSION_CLOSED)
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */,
-          NULL /* session_update_request_func */, DummySessionUpdatedFunc,
-          DummySessionKeyStatusesChangedFunc);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */, DummySessionUpdateRequestFunc,
-          NULL /* session_updated_func */, DummySessionKeyStatusesChangedFunc);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-    {
-      SbDrmSystem drm_system = SbDrmCreateSystem(
-          key_system, NULL /* context */, DummySessionUpdateRequestFunc,
-          DummySessionUpdatedFunc,
-          NULL /* session_key_statuses_changed_func */);
-      EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
-      SbDrmDestroySystem(drm_system);
-    }
-#endif  // SB_HAS(DRM_SESSION_CLOSED)
   }
 }
-#endif  // SB_API_VERSION >= 10
 
-#if SB_API_VERSION >= 10
 TEST(SbDrmTest, MultiDrm) {
   const int kMaxPlayersPerKeySystem = 16;
   std::vector<SbDrmSystem> created_drm_systems;
diff --git a/src/starboard/nplb/media_set_audio_write_duration_test.cc b/src/starboard/nplb/media_set_audio_write_duration_test.cc
index bcbe76a..2d3a964 100644
--- a/src/starboard/nplb/media_set_audio_write_duration_test.cc
+++ b/src/starboard/nplb/media_set_audio_write_duration_test.cc
@@ -98,10 +98,8 @@
     sample_info.buffer_size = player_sample_info.buffer_size;
     sample_info.timestamp = player_sample_info.timestamp;
     sample_info.drm_info = NULL;
-#if SB_API_VERSION >= 11
     sample_info.type = kSbMediaTypeAudio;
     sample_info.audio_sample_info = dmp_reader_.audio_sample_info();
-#endif  // SB_API_VERSION >= 11
 
     SbPlayer player = pending_decoder_status_->player;
     SbMediaType type = pending_decoder_status_->type;
@@ -149,9 +147,7 @@
     SbPlayer player = SbPlayerCreate(
         fake_graphics_context_provider_.window(), kSbMediaVideoCodecNone,
         kAudioCodec, kSbDrmSystemInvalid, &audio_sample_info,
-#if SB_API_VERSION >= 11
         NULL /* max_video_capabilities */,
-#endif  // SB_API_VERSION >= 11
         DummyDeallocateSampleFunc, DecoderStatusFunc, PlayerStatusFunc,
         DummyErrorFunc, this /* context */, output_mode,
         fake_graphics_context_provider_.decoder_target_provider());
diff --git a/src/starboard/nplb/nplb.gyp b/src/starboard/nplb/nplb.gyp
index 0dce66d..e80cf3c 100644
--- a/src/starboard/nplb/nplb.gyp
+++ b/src/starboard/nplb/nplb.gyp
@@ -150,7 +150,6 @@
         # TODO: Separate functions tested by media buffer test into multiple
         # files.
         'media_buffer_test.cc',
-        'media_set_audio_write_duration_test.cc',
         'memory_align_to_page_size_test.cc',
         'memory_allocate_aligned_test.cc',
         'memory_allocate_test.cc',
@@ -164,7 +163,6 @@
         'memory_map_test.cc',
         'memory_move_test.cc',
         'memory_reallocate_test.cc',
-        'memory_reporter_test.cc',
         'memory_set_test.cc',
         'microphone_close_test.cc',
         'microphone_create_test.cc',
@@ -311,6 +309,14 @@
         '<(DEPTH)/testing/gtest.gyp:gtest',
       ],
       'conditions': [
+        ['sb_evergreen != 1', {
+          'sources': [
+            # Segfaults for Cobalt Evergreen.
+            'memory_reporter_test.cc',
+            # Segfaults or causes unresolved symbols for Cobalt Evergreen.
+            'media_set_audio_write_duration_test.cc',
+          ],
+        }],
         ['gl_type != "none"', {
           'dependencies': [
              # This is needed because SbPlayerTest depends on
diff --git a/src/starboard/nplb/player_create_test.cc b/src/starboard/nplb/player_create_test.cc
index 0aa6b0e..447e6a8 100644
--- a/src/starboard/nplb/player_create_test.cc
+++ b/src/starboard/nplb/player_create_test.cc
@@ -132,9 +132,6 @@
       SbPlayer player = SbPlayerCreate(
           fake_graphics_context_provider_.window(), kSbMediaVideoCodecH264,
           kSbMediaAudioCodecAac,
-#if SB_API_VERSION < 10
-          SB_PLAYER_NO_DURATION,
-#endif  // SB_API_VERSION < 10
           kSbDrmSystemInvalid, &audio_sample_info,
 #if SB_API_VERSION >= 11
           NULL /* max_video_capabilities */,
@@ -155,9 +152,6 @@
       SbPlayer player = SbPlayerCreate(
           fake_graphics_context_provider_.window(), kSbMediaVideoCodecH264,
           kSbMediaAudioCodecAac,
-#if SB_API_VERSION < 10
-          SB_PLAYER_NO_DURATION,
-#endif  // SB_API_VERSION < 10
           kSbDrmSystemInvalid, &audio_sample_info,
 #if SB_API_VERSION >= 11
           NULL /* max_video_capabilities */,
@@ -178,9 +172,6 @@
       SbPlayer player = SbPlayerCreate(
           fake_graphics_context_provider_.window(), kSbMediaVideoCodecH264,
           kSbMediaAudioCodecAac,
-#if SB_API_VERSION < 10
-          SB_PLAYER_NO_DURATION,
-#endif  // SB_API_VERSION < 10
           kSbDrmSystemInvalid, &audio_sample_info,
 #if SB_API_VERSION >= 11
           NULL /* max_video_capabilities */,
@@ -202,9 +193,6 @@
       SbPlayer player = SbPlayerCreate(
           fake_graphics_context_provider_.window(), kSbMediaVideoCodecH264,
           kSbMediaAudioCodecAac,
-#if SB_API_VERSION < 10
-          SB_PLAYER_NO_DURATION,
-#endif  // SB_API_VERSION < 10
           kSbDrmSystemInvalid, &audio_sample_info,
 #if SB_API_VERSION >= 11
           NULL /* max_video_capabilities */,
@@ -281,9 +269,6 @@
     SbPlayer player = SbPlayerCreate(
         fake_graphics_context_provider_.window(), kSbMediaVideoCodecNone,
         kAudioCodec,
-#if SB_API_VERSION < 10
-        SB_PLAYER_NO_DURATION,
-#endif  // SB_API_VERSION < 10
         kSbDrmSystemInvalid, &audio_sample_info,
 #if SB_API_VERSION >= 11
         NULL /* max_video_capabilities */,
@@ -303,9 +288,7 @@
     SbPlayerDestroy(player);
   }
 }
-#endif  // SB_API_VERSION >= 10
 
-#if SB_API_VERSION >= 10
 TEST_F(SbPlayerTest, MultiPlayer) {
   SbMediaAudioSampleInfo audio_sample_info = GetDefaultAudioSampleInfo();
   SbDrmSystem kDrmSystem = kSbDrmSystemInvalid;
diff --git a/src/starboard/raspi/0/configuration_public.h b/src/starboard/raspi/0/configuration_public.h
index d673a1d..fd38d59 100644
--- a/src/starboard/raspi/0/configuration_public.h
+++ b/src/starboard/raspi/0/configuration_public.h
@@ -69,22 +69,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// wildly varying number of cores.
-#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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
diff --git a/src/starboard/raspi/2/configuration_public.h b/src/starboard/raspi/2/configuration_public.h
index 5055be1..d840214 100644
--- a/src/starboard/raspi/2/configuration_public.h
+++ b/src/starboard/raspi/2/configuration_public.h
@@ -69,22 +69,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// wildly varying number of cores.
-#define SB_HAS_MANY_CORES 0
-
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 1
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
diff --git a/src/starboard/raspi/shared/configuration_public.h b/src/starboard/raspi/shared/configuration_public.h
index 9575b03..f115daf 100644
--- a/src/starboard/raspi/shared/configuration_public.h
+++ b/src/starboard/raspi/shared/configuration_public.h
@@ -43,9 +43,6 @@
 // Whether the current platform provides the standard header sys/types.h.
 #define SB_HAS_SYS_TYPES_H 1
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/starboard/raspi/shared/launcher.py b/src/starboard/raspi/shared/launcher.py
index 75e57c6..965521a 100644
--- a/src/starboard/raspi/shared/launcher.py
+++ b/src/starboard/raspi/shared/launcher.py
@@ -44,7 +44,7 @@
 class Launcher(abstract_launcher.AbstractLauncher):
   """Class for launching Cobalt/tools on Raspi."""
 
-  _STARTUP_TIMEOUT_SECONDS = 900
+  _STARTUP_TIMEOUT_SECONDS = 1200
 
   _RASPI_USERNAME = 'pi'
   _RASPI_PASSWORD = 'raspberry'
diff --git a/src/starboard/shared/linux/cpu_features_get.cc b/src/starboard/shared/linux/cpu_features_get.cc
index 2eeedf1..f1247fc 100644
--- a/src/starboard/shared/linux/cpu_features_get.cc
+++ b/src/starboard/shared/linux/cpu_features_get.cc
@@ -40,6 +40,10 @@
 
 #include <cstdlib>
 
+#if defined(ANDROID) && SB_IS(ARCH_ARM)
+#include <asm/hwcap.h>
+#endif
+
 #include "starboard/common/log.h"
 #include "starboard/shared/starboard/cpu_features.h"
 
@@ -49,7 +53,8 @@
 
 #if SB_IS(ARCH_ARM)
 
-#if SB_IS(32_BIT)
+// Android hwcap.h defines these flags conditionally, depending on target arch
+#if SB_IS(32_BIT) || defined(ANDROID)
 // See <arch/arm/include/uapi/asm/hwcap.h> kernel header.
 #define HWCAP_VFP (1 << 6)
 #define HWCAP_IWMMXT (1 << 9)
diff --git a/src/starboard/shared/starboard/audio_sink/audio_sink_create.cc b/src/starboard/shared/starboard/audio_sink/audio_sink_create.cc
index 00605fc..a9428dc 100644
--- a/src/starboard/shared/starboard/audio_sink/audio_sink_create.cc
+++ b/src/starboard/shared/starboard/audio_sink/audio_sink_create.cc
@@ -15,13 +15,7 @@
 #include "starboard/audio_sink.h"
 
 #include "starboard/common/log.h"
-#include "starboard/shared/starboard/application.h"
 #include "starboard/shared/starboard/audio_sink/audio_sink_internal.h"
-#include "starboard/shared/starboard/command_line.h"
-
-namespace {
-const char kUseStubAudioSinkSwitch[] = "use_stub_audio_sink";
-}  // namespace
 
 SbAudioSink SbAudioSinkCreate(
     int channels,
@@ -76,32 +70,29 @@
     return kSbAudioSinkInvalid;
   }
 
-  auto command_line =
-      starboard::shared::starboard::Application::Get()->GetCommandLine();
-  if (!command_line->HasSwitch(kUseStubAudioSinkSwitch)) {
-    if (auto type = SbAudioSinkPrivate::GetPrimaryType()) {
-      SbAudioSink audio_sink = type->Create(
-          channels, sampling_frequency_hz, audio_sample_type,
-          audio_frame_storage_type, frame_buffers, frame_buffers_size_in_frames,
-          update_source_status_func, consume_frames_func, context);
-      if (type->IsValid(audio_sink)) {
-        return audio_sink;
-      } else {
-        type->Destroy(audio_sink);
-      }
-    }
+  auto audio_sink_type = SbAudioSinkPrivate::GetPreferredType();
+  if (!audio_sink_type) {
+    return kSbAudioSinkInvalid;
   }
-
-  if (auto type = SbAudioSinkPrivate::GetFallbackType()) {
-    SB_LOG(WARNING) << "Primary audio sink failed to create, use fallback.";
-    return type->Create(channels, sampling_frequency_hz, audio_sample_type,
-                        audio_frame_storage_type, frame_buffers,
-                        frame_buffers_size_in_frames, update_source_status_func,
-                        consume_frames_func, context);
-  } else {
-    SB_LOG(WARNING) << "Primary audio sink failed to create,"
-                    << " fallback is not enabled.";
+  SbAudioSink audio_sink = audio_sink_type->Create(
+      channels, sampling_frequency_hz, audio_sample_type,
+      audio_frame_storage_type, frame_buffers, frame_buffers_size_in_frames,
+      update_source_status_func, consume_frames_func, context);
+  if (audio_sink_type->IsValid(audio_sink)) {
+    return audio_sink;
   }
-
+  audio_sink_type->Destroy(audio_sink);
+  auto fallback_audio_sink_type = SbAudioSinkPrivate::GetFallbackType();
+  if (!fallback_audio_sink_type) {
+    return kSbAudioSinkInvalid;
+  }
+  audio_sink = fallback_audio_sink_type->Create(
+      channels, sampling_frequency_hz, audio_sample_type,
+      audio_frame_storage_type, frame_buffers, frame_buffers_size_in_frames,
+      update_source_status_func, consume_frames_func, context);
+  if (fallback_audio_sink_type->IsValid(audio_sink)) {
+    return audio_sink;
+  }
+  fallback_audio_sink_type->Destroy(audio_sink);
   return kSbAudioSinkInvalid;
 }
diff --git a/src/starboard/shared/starboard/audio_sink/audio_sink_internal.cc b/src/starboard/shared/starboard/audio_sink/audio_sink_internal.cc
index ed1bf94..6614fea 100644
--- a/src/starboard/shared/starboard/audio_sink/audio_sink_internal.cc
+++ b/src/starboard/shared/starboard/audio_sink/audio_sink_internal.cc
@@ -13,7 +13,10 @@
 // limitations under the License.
 
 #include "starboard/shared/starboard/audio_sink/audio_sink_internal.h"
+
+#include "starboard/shared/starboard/application.h"
 #include "starboard/shared/starboard/audio_sink/stub_audio_sink_type.h"
+#include "starboard/shared/starboard/command_line.h"
 
 namespace {
 
@@ -21,6 +24,10 @@
 SbAudioSinkPrivate::Type* primary_audio_sink_type;
 SbAudioSinkPrivate::Type* fallback_audio_sink_type;
 
+// Command line switch that controls whether we default to the stub audio sink,
+// even when the primary audio sink may be available.
+const char kUseStubAudioSink[] = "use_stub_audio_sink";
+
 }  // namespace
 
 using starboard::shared::starboard::audio_sink::StubAudioSinkType;
@@ -58,3 +65,22 @@
   }
   return NULL;
 }
+
+// static
+SbAudioSinkPrivate::Type* SbAudioSinkPrivate::GetPreferredType() {
+  SbAudioSinkPrivate::Type* audio_sink_type = NULL;
+  auto command_line =
+      starboard::shared::starboard::Application::Get()->GetCommandLine();
+  if (!command_line->HasSwitch(kUseStubAudioSink)) {
+    audio_sink_type = SbAudioSinkPrivate::GetPrimaryType();
+  }
+  if (!audio_sink_type) {
+    SB_LOG(WARNING) << "Primary audio sink type not selected or missing, "
+                       "opting to use Fallback instead.";
+    audio_sink_type = SbAudioSinkPrivate::GetFallbackType();
+  }
+  if (audio_sink_type == NULL) {
+    SB_LOG(WARNING) << "Fallback audio sink type is not enabled.";
+  }
+  return audio_sink_type;
+}
diff --git a/src/starboard/shared/starboard/audio_sink/audio_sink_internal.h b/src/starboard/shared/starboard/audio_sink/audio_sink_internal.h
index 89eb5ea..1c8e57f 100644
--- a/src/starboard/shared/starboard/audio_sink/audio_sink_internal.h
+++ b/src/starboard/shared/starboard/audio_sink/audio_sink_internal.h
@@ -61,6 +61,10 @@
   // enabled.  Otherwise return NULL.
   static Type* GetFallbackType();
 
+  // Return a valid Type, choosing the Primary type if available, otherwise
+  // Fallback. If Fallback is not enabled, then returns NULL.
+  static Type* GetPreferredType();
+
   // Individual implementation has to provide implementation of the following
   // functions, which will be called inside Initialize() and TearDown().
   static void PlatformInitialize();
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc b/src/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc
index 9c70287..73d0877 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc
@@ -65,14 +65,46 @@
     RenderCallback* render_callback) {
   SB_DCHECK(thread_checker_.CalledOnValidThread());
   SB_DCHECK(!HasStarted());
+  SB_DCHECK(channels > 0 && channels <= SbAudioSinkGetMaxChannels());
+  SB_DCHECK(sampling_frequency_hz > 0);
+  SB_DCHECK(SbAudioSinkIsAudioSampleTypeSupported(audio_sample_type));
+  SB_DCHECK(
+      SbAudioSinkIsAudioFrameStorageTypeSupported(audio_frame_storage_type));
+  SB_DCHECK(frame_buffers);
+  SB_DCHECK(frames_per_channel > 0);
 
   Stop();
   render_callback_ = render_callback;
-  audio_sink_ = SbAudioSinkCreate(
-      channels, sampling_frequency_hz, audio_sample_type,
-      audio_frame_storage_type, frame_buffers, frames_per_channel,
-      &AudioRendererSinkImpl::UpdateSourceStatusFunc,
-      &AudioRendererSinkImpl::ConsumeFramesFunc, this);
+  audio_sink_ = kSbAudioSinkInvalid;
+  SbAudioSinkPrivate::Type* audio_sink_type =
+      SbAudioSinkPrivate::GetPreferredType();
+  if (audio_sink_type) {
+    audio_sink_ = audio_sink_type->Create(
+        channels, sampling_frequency_hz, audio_sample_type,
+        audio_frame_storage_type, frame_buffers, frames_per_channel,
+        &AudioRendererSinkImpl::UpdateSourceStatusFunc,
+        &AudioRendererSinkImpl::ConsumeFramesFunc, this);
+    if (!audio_sink_type->IsValid(audio_sink_)) {
+      SB_LOG(WARNING) << "Created invalid SbAudioSink from "
+                         "SbAudioSinkPrivate::Type. Destroying and "
+                         "resetting.";
+      audio_sink_type->Destroy(audio_sink_);
+      audio_sink_ = kSbAudioSinkInvalid;
+      auto fallback_type = SbAudioSinkPrivate::GetFallbackType();
+      if (fallback_type) {
+        audio_sink_ = fallback_type->Create(
+            channels, sampling_frequency_hz, audio_sample_type,
+            audio_frame_storage_type, frame_buffers, frames_per_channel,
+            &AudioRendererSinkImpl::UpdateSourceStatusFunc,
+            &AudioRendererSinkImpl::ConsumeFramesFunc, this);
+        if (!fallback_type->IsValid(audio_sink_)) {
+          SB_LOG(ERROR) << "Failed to create SbAudioSink from Fallback type.";
+          fallback_type->Destroy(audio_sink_);
+          audio_sink_ = kSbAudioSinkInvalid;
+        }
+      }
+    }
+  }
   if (!SbAudioSinkIsValid(audio_sink_)) {
     return;
   }
diff --git a/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc b/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
index afa527c..86151ff 100644
--- a/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_SHARED_STARBOARD_PLAYER_FILTER_VIDEO_RENDERER_INTERNAL_H_
-#define STARBOARD_SHARED_STARBOARD_PLAYER_FILTER_VIDEO_RENDERER_INTERNAL_H_
-
 #include "starboard/shared/starboard/player/filter/video_render_algorithm_impl.h"
 
 #include "starboard/common/log.h"
@@ -130,5 +127,3 @@
 }  // namespace starboard
 }  // namespace shared
 }  // namespace starboard
-
-#endif  // STARBOARD_SHARED_STARBOARD_PLAYER_FILTER_VIDEO_RENDERER_INTERNAL_H_
diff --git a/src/starboard/shared/starboard/player/filter/video_renderer_internal.cc b/src/starboard/shared/starboard/player/filter/video_renderer_internal.cc
index 8e415fc..cab42b7 100644
--- a/src/starboard/shared/starboard/player/filter/video_renderer_internal.cc
+++ b/src/starboard/shared/starboard/player/filter/video_renderer_internal.cc
@@ -119,6 +119,9 @@
 
   if (!first_input_written_) {
     first_input_written_ = true;
+#if SB_PLAYER_FILTER_ENABLE_STATE_CHECK
+    first_input_written_at_ = SbTimeGetMonotonicNow();
+#endif  // SB_PLAYER_FILTER_ENABLE_STATE_CHECK
     absolute_time_of_first_input_ = SbTimeGetMonotonicNow();
   }
 
@@ -277,6 +280,11 @@
     if (number_of_frames_.load() >=
             static_cast<int32_t>(decoder_->GetPrerollFrameCount()) &&
         seeking_.exchange(false)) {
+#if SB_PLAYER_FILTER_ENABLE_STATE_CHECK
+      SB_LOG(INFO) << "Video preroll takes "
+                   << SbTimeGetMonotonicNow() - first_input_written_at_
+                   << " microseconds.";
+#endif  // SB_PLAYER_FILTER_ENABLE_STATE_CHECK
       Schedule(prerolled_cb_);
     }
   }
diff --git a/src/starboard/shared/starboard/player/filter/video_renderer_internal.h b/src/starboard/shared/starboard/player/filter/video_renderer_internal.h
index d05c50b..0e1c85f 100644
--- a/src/starboard/shared/starboard/player/filter/video_renderer_internal.h
+++ b/src/starboard/shared/starboard/player/filter/video_renderer_internal.h
@@ -143,6 +143,8 @@
   SbTimeMonotonic time_of_last_lag_warning_;
 
   SbTimeMonotonic time_of_last_render_call_ = -1;
+
+  SbTimeMonotonic first_input_written_at_ = 0;
 #endif  // SB_PLAYER_FILTER_ENABLE_STATE_CHECK
 };
 
diff --git a/src/starboard/shared/starboard/player/player_worker.cc b/src/starboard/shared/starboard/player/player_worker.cc
index 47db56b..970c7b4 100644
--- a/src/starboard/shared/starboard/player/player_worker.cc
+++ b/src/starboard/shared/starboard/player/player_worker.cc
@@ -240,7 +240,7 @@
   SB_DCHECK(!error_occurred_);
   SB_DCHECK(ticket_ != ticket);
 
-  SB_DLOG(INFO) << "Try to seek to timestamp " << seek_to_time / kSbTimeSecond;
+  SB_DLOG(INFO) << "Try to seek to " << seek_to_time << " microseconds.";
 
   if (write_pending_sample_job_token_.is_valid()) {
     job_queue_->RemoveJobByToken(write_pending_sample_job_token_);
diff --git a/src/starboard/shared/x11/application_x11.cc b/src/starboard/shared/x11/application_x11.cc
index 630f1cc..514aedf 100644
--- a/src/starboard/shared/x11/application_x11.cc
+++ b/src/starboard/shared/x11/application_x11.cc
@@ -662,6 +662,9 @@
   XCloseDisplay(display);
 }
 
+// Remain compatible with the older glibc found on previous Ubuntu distros.
+__asm__(".symver quick_exit,quick_exit@GLIBC_2.10");
+
 // X IO error handler. Called if we lose our connection to the X server.
 int IOErrorHandler(Display* display) {
   // Not much we can do here except immediately exit.
diff --git a/src/starboard/starboard.gyp b/src/starboard/starboard.gyp
index 5d664c3..1c8f403 100644
--- a/src/starboard/starboard.gyp
+++ b/src/starboard/starboard.gyp
@@ -24,7 +24,13 @@
       'conditions': [
         ['sb_evergreen == 1', {
           'dependencies': [
+            '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
             '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
+            '<(DEPTH)/third_party/llvm-project/compiler-rt/compiler-rt.gyp:compiler_rt',
+            '<(DEPTH)/third_party/llvm-project/libcxx/libcxx.gyp:cxx',
+            '<(DEPTH)/third_party/llvm-project/libcxxabi/libcxxabi.gyp:cxxabi',
+            '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind',
+            '<(DEPTH)/third_party/musl/musl.gyp:c',
           ],
         }, {
           'dependencies': [
diff --git a/src/starboard/starboard_all.gyp b/src/starboard/starboard_all.gyp
index 2dcf397..a5b3291 100644
--- a/src/starboard/starboard_all.gyp
+++ b/src/starboard/starboard_all.gyp
@@ -61,9 +61,6 @@
         '<(DEPTH)/starboard/client_porting/eztime/eztime_test.gyp:*',
         '<(DEPTH)/starboard/client_porting/icu_init/icu_init.gyp:*',
         '<(DEPTH)/starboard/client_porting/poem/poem.gyp:*',
-	# glclear.gyp is not included as a dependency since the change to the
-	# EGL and GLES interfaces are breaking for previous versions of the
-	# Starboard API.
         '<(DEPTH)/starboard/examples/blitter/blitter.gyp:*',
         '<(DEPTH)/starboard/examples/window/window.gyp:*',
         '<(DEPTH)/starboard/nplb/blitter_pixel_tests/blitter_pixel_tests.gyp:*',
@@ -71,6 +68,11 @@
         '<(DEPTH)/starboard/starboard.gyp:*',
       ],
       'conditions': [
+        ['gl_type != "none"', {
+          'dependencies': [
+            '<(DEPTH)/starboard/examples/glclear/glclear.gyp:starboard_glclear_example',
+          ],
+        }],
         ['has_platform_tests=="True"', {
           'dependencies': [
             '<(DEPTH)/<(starboard_path)/starboard_platform_tests.gyp:*',
@@ -80,11 +82,6 @@
             'starboard_platform_tests',
           ],
         }],
-        ['sb_evergreen == 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/examples/glclear/glclear.gyp:starboard_glclear_example',
-          ],
-        }],
         ['sb_filter_based_player==1', {
           'dependencies': [
             '<(DEPTH)/starboard/shared/starboard/player/filter/testing/player_filter_tests.gyp:*',
diff --git a/src/starboard/stub/configuration_public.h b/src/starboard/stub/configuration_public.h
index 308c872..e10a071 100644
--- a/src/starboard/stub/configuration_public.h
+++ b/src/starboard/stub/configuration_public.h
@@ -73,22 +73,6 @@
 // available on this platform. For a definitive measure, the application should
 // still call SbSystemGetNumberOfProcessors at runtime.
 
-// Whether the current platform is expected to have many cores (> 6), or a
-// 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
-
-// Whether the current platform is expected to have exactly 4 cores.
-#define SB_HAS_4_CORES 0
-
-// Whether the current platform is expected to have exactly 6 cores.
-#define SB_HAS_6_CORES 0
-
 // Whether the current platform's thread scheduler will automatically balance
 // threads between cores, as opposed to systems where threads will only ever run
 // on the specifically pinned core.
@@ -129,9 +113,6 @@
 // Whether the current platform provides the standard header sys/types.h.
 #define SB_HAS_SYS_TYPES_H 0
 
-// Whether the current platform provides the standard header wchar.h.
-#define SB_HAS_WCHAR_H 1
-
 // Whether the current platform provides the standard header limits.h.
 #define SB_HAS_LIMITS_H 1
 
diff --git a/src/testing/gtest/src/gtest.cc b/src/testing/gtest/src/gtest.cc
index 6e455a7..7f0193b 100644
--- a/src/testing/gtest/src/gtest.cc
+++ b/src/testing/gtest/src/gtest.cc
@@ -36,6 +36,7 @@
 #include "gtest/gtest-spi.h"
 
 #if GTEST_OS_STARBOARD
+#include "starboard/client_porting/eztime/eztime.h"
 #include "starboard/system.h"
 #else
 #include <ctype.h>
@@ -3592,6 +3593,7 @@
   return ss.str();
 }
 
+#if !GTEST_OS_STARBOARD
 static bool PortableLocaltime(time_t seconds, struct tm* out) {
 #if defined(_MSC_VER)
   return localtime_s(out, &seconds) == 0;
@@ -3607,13 +3609,24 @@
   return localtime_r(&seconds, out) != NULL;
 #endif
 }
+#endif
 
 // Converts the given epoch time in milliseconds to a date string in the ISO
 // 8601 format, without the timezone information.
 std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+// EzTimeExploded has the same members, and member names, as struct tm and can
+// be silently inserted here to provide an even more portable (Starboardized)
+// locale time.
+#if GTEST_OS_STARBOARD
+  EzTimeExploded time_struct;
+  const EzTimeT seconds = static_cast<EzTimeT>(ms / 1000);
+  if (EzTimeTExplodeLocal(&seconds, &time_struct) == NULL) {
+#else
   struct tm time_struct;
-  if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))
+  if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct)) {
+#endif
     return "";
+  }
   // YYYY-MM-DDThh:mm:ss
   return StreamableToString(time_struct.tm_year + 1900) + "-" +
       String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" +
diff --git a/src/third_party/boringssl/boringssl.gyp b/src/third_party/boringssl/boringssl.gyp
index abc2afe..a49f0d4 100644
--- a/src/third_party/boringssl/boringssl.gyp
+++ b/src/third_party/boringssl/boringssl.gyp
@@ -12,8 +12,6 @@
       'PURIFY',
       'TERMIO',
       '_REENTRANT',
-      # We do not use TLS over UDP on Chromium so far.
-      'OPENSSL_NO_DTLS1',
     ],
     'cflags': [
       '-fPIC',
@@ -56,158 +54,33 @@
           '<(boringssl_root)/crypto/rand_extra/windows.c',
         ],
       }],
-      ['OS=="lb_shell"', {
-        'variables': {
-          'openssl_config_path': 'config/lbshell',
-        },
-      }],
-      ['OS=="lb_shell" or OS=="starboard"', {
+      ['OS=="starboard"', {
         'defines': [
-          'GETPID_IS_MEANINGLESS',
           'NO_SYS_PARAM_H',
           'NO_SYS_UN_H',
           'NO_SYSLOG',
-          'NO_WINDOWS_BRAINDEATH',
-          'OPENSSL_NO_BF',
-          'OPENSSL_NO_BUF_FREELISTS',
           'OPENSSL_NO_CAMELLIA',
           'OPENSSL_NO_CAPIENG',
           'OPENSSL_NO_CAST',
           'OPENSSL_NO_CMS',
-          'OPENSSL_NO_COMP',
-          'OPENSSL_NO_DGRAM',  # Added by cobalt to remove unused UDP code.
           'OPENSSL_NO_DYNAMIC_ENGINE',
-          'OPENSSL_NO_EC2M',
           'OPENSSL_NO_EC_NISTP_64_GCC_128',
-          'OPENSSL_NO_ENGINE',
           'OPENSSL_NO_GMP',
-          'OPENSSL_NO_GOST',
-          'OPENSSL_NO_HEARTBEATS', # Workaround for CVE-2014-0160.
-          'OPENSSL_NO_HW',
           'OPENSSL_NO_IDEA',
           'OPENSSL_NO_JPAKE',
           'OPENSSL_NO_KRB5',
-          'OPENSSL_NO_MD2',
-          'OPENSSL_NO_MD4',
           'OPENSSL_NO_MDC2',
-          'OPENSSL_NO_OCB',
           'OPENSSL_NO_OCSP',
-          'OPENSSL_NO_RC2',
-          'OPENSSL_NO_RC4',
           'OPENSSL_NO_RC5',
           'OPENSSL_NO_RFC3779',
-          'OPENSSL_NO_RIPEMD',
-          'OPENSSL_NO_RMD160',
           'OPENSSL_NO_SCTP',
           'OPENSSL_NO_SEED',
-          'OPENSSL_NO_SRP',
-          'OPENSSL_NO_SSL2',
-          'OPENSSL_NO_SSL3', # Address CVE-2014-3566
-          'OPENSSL_NO_STATIC_ENGINE',
           'OPENSSL_NO_STORE',
           'OPENSSL_NO_SOCK',  # Added by Cobalt to remove unused socket code.
-          'OPENSSL_NO_THREADS',  # Added by Cobalt to reduce overall threads count.
-          'OPENSSL_NO_UI',  # Added by Cobalt to remove unused "UI" code.
-          'OPENSSL_NO_UNIT_TEST',
           'OPENSSL_NO_WHIRLPOOL',
-          'OPENSSL_USE_IPV6=0',
-          'B_ENDIAN',
           'OPENSSL_NO_POSIX_IO',
         ],
-        'sources!': [
-          '<(boringssl_root)/crypto/bf/bf_cfb64.c',
-          '<(boringssl_root)/crypto/bf/bf_ecb.c',
-          '<(boringssl_root)/crypto/bf/bf_enc.c',
-          '<(boringssl_root)/crypto/bf/bf_ofb64.c',
-          '<(boringssl_root)/crypto/bf/bf_skey.c',
-          '<(boringssl_root)/crypto/engine/eng_all.c',
-          '<(boringssl_root)/crypto/engine/eng_cnf.c',
-          '<(boringssl_root)/crypto/engine/eng_ctrl.c',
-          '<(boringssl_root)/crypto/engine/eng_dyn.c',
-          '<(boringssl_root)/crypto/engine/eng_err.c',
-          '<(boringssl_root)/crypto/engine/eng_fat.c',
-          '<(boringssl_root)/crypto/engine/eng_init.c',
-          '<(boringssl_root)/crypto/engine/eng_lib.c',
-          '<(boringssl_root)/crypto/engine/eng_list.c',
-          '<(boringssl_root)/crypto/engine/eng_pkey.c',
-          '<(boringssl_root)/crypto/engine/eng_table.c',
-          '<(boringssl_root)/crypto/engine/tb_asnmth.c',
-          '<(boringssl_root)/crypto/engine/tb_cipher.c',
-          '<(boringssl_root)/crypto/engine/tb_dh.c',
-          '<(boringssl_root)/crypto/engine/tb_digest.c',
-          '<(boringssl_root)/crypto/engine/tb_dsa.c',
-          '<(boringssl_root)/crypto/engine/tb_ecdh.c',
-          '<(boringssl_root)/crypto/engine/tb_ecdsa.c',
-          '<(boringssl_root)/crypto/engine/tb_pkmeth.c',
-          '<(boringssl_root)/crypto/engine/tb_rand.c',
-          '<(boringssl_root)/crypto/engine/tb_rsa.c',
-          '<(boringssl_root)/crypto/engine/tb_store.c',
-          '<(boringssl_root)/crypto/rc2/rc2_cbc.c',
-          '<(boringssl_root)/crypto/rc2/rc2_ecb.c',
-          '<(boringssl_root)/crypto/rc2/rc2_skey.c',
-          '<(boringssl_root)/crypto/rc2/rc2cfb64.c',
-          '<(boringssl_root)/crypto/rc2/rc2ofb64.c',
-          '<(boringssl_root)/crypto/rc4/rc4_enc.c',
-          '<(boringssl_root)/crypto/rc4/rc4_skey.c',
-          '<(boringssl_root)/crypto/rc4/rc4_utl.c',
-          '<(boringssl_root)/crypto/ripemd/rmd_dgst.c',
-          '<(boringssl_root)/crypto/ripemd/rmd_one.c',
-          # Removed during Starboard port, found or made to be unneeded at
-          # link time.
-          '<(boringssl_root)/crypto/bio/b_sock.c',
-          '<(boringssl_root)/crypto/bio/bss_acpt.c',
-          '<(boringssl_root)/crypto/bio/bss_conn.c',
-          '<(boringssl_root)/crypto/bio/bss_dgram.c',
-          '<(boringssl_root)/crypto/bio/bss_fd.c',
-          '<(boringssl_root)/crypto/bio/bss_log.c',
-          '<(boringssl_root)/crypto/bio/bss_sock.c',
-          '<(boringssl_root)/crypto/comp/c_rle.c',
-          '<(boringssl_root)/crypto/comp/c_zlib.c',
-          '<(boringssl_root)/crypto/comp/comp_err.c',
-          '<(boringssl_root)/crypto/comp/comp_lib.c',
-          '<(boringssl_root)/crypto/des/read2pwd.c',
-          '<(boringssl_root)/crypto/dso/dso_dl.c',
-          '<(boringssl_root)/crypto/dso/dso_dlfcn.c',
-          '<(boringssl_root)/crypto/dso/dso_err.c',
-          '<(boringssl_root)/crypto/dso/dso_lib.c',
-          '<(boringssl_root)/crypto/dso/dso_null.c',
-          '<(boringssl_root)/crypto/dso/dso_openssl.c',
-          '<(boringssl_root)/crypto/ebcdic.c',
-          '<(boringssl_root)/crypto/evp/e_bf.c',
-          '<(boringssl_root)/crypto/evp/e_old.c',
-          '<(boringssl_root)/crypto/evp/e_rc2.c',
-          '<(boringssl_root)/crypto/evp/e_rc4.c',
-          '<(boringssl_root)/crypto/evp/e_rc4_hmac_md5.c',
-          '<(boringssl_root)/crypto/evp/e_rc5.c',
-          '<(boringssl_root)/crypto/evp/e_rc5.c',
-          '<(boringssl_root)/crypto/evp/m_md4.c',
-          '<(boringssl_root)/crypto/evp/m_mdc2.c',
-          '<(boringssl_root)/crypto/evp/m_ripemd.c',
-          '<(boringssl_root)/crypto/evp/m_wp.c',
-          '<(boringssl_root)/crypto/krb5/krb5_asn.c',
-          '<(boringssl_root)/crypto/md4/md4_dgst.c',
-          '<(boringssl_root)/crypto/md4/md4_one.c',
-          '<(boringssl_root)/crypto/o_str.c',
-          '<(boringssl_root)/crypto/pqueue/pqueue.c',
-          '<(boringssl_root)/crypto/rand/rand_egd.c',
-          '<(boringssl_root)/crypto/rand/randfile.c',
-          '<(boringssl_root)/crypto/srp/srp_lib.c',
-          '<(boringssl_root)/crypto/srp/srp_vfy.c',
-          '<(boringssl_root)/crypto/ui/ui_compat.c',
-          '<(boringssl_root)/crypto/ui/ui_err.c',
-          '<(boringssl_root)/crypto/ui/ui_lib.c',
-          '<(boringssl_root)/crypto/ui/ui_openssl.c',
-          '<(boringssl_root)/crypto/ui/ui_util.c',
-          '<(boringssl_root)/ssl/d1_both.c',
-          '<(boringssl_root)/ssl/d1_clnt.c',
-          '<(boringssl_root)/ssl/d1_enc.c',
-          '<(boringssl_root)/ssl/d1_lib.c',
-          '<(boringssl_root)/ssl/d1_meth.c',
-          '<(boringssl_root)/ssl/d1_pkt.c',
-          '<(boringssl_root)/ssl/kssl.c',
-          '<(boringssl_root)/ssl/d1_srvr.c',
-        ],
-      }],  # OS == "lb_shell" or OS == "starboard"
+      }],  # OS == "starboard"
     ],
     'include_dirs': [
       '.',
diff --git a/src/third_party/boringssl/src/config/lbshell/openssl/opensslconf.h b/src/third_party/boringssl/src/config/lbshell/openssl/opensslconf.h
deleted file mode 100644
index 23dda27..0000000
--- a/src/third_party/boringssl/src/config/lbshell/openssl/opensslconf.h
+++ /dev/null
@@ -1,366 +0,0 @@
-/* opensslconf.h */
-/* WARNING: Edited by hand, based on piii config. Meant for all lbshell platforms. ifdef any platform-specific options. */
-#define OPENSSL_SYS_SHELL
-
-#ifndef OPENSSL_NO_POSIX_IO
-# define OPENSSL_NO_POSIX_IO
-#endif
-
-#ifndef OPENSSL_NO_FP_API
-# define OPENSSL_NO_FP_API
-#endif
-
-#ifndef OPENSSL_NO_DSO
-# define OPENSSL_NO_DSO
-#endif
-
-/* OpenSSL was configured with the following options: */
-#ifndef OPENSSL_DOING_MAKEDEPEND
-
-
-#ifndef OPENSSL_NO_CAMELLIA
-# define OPENSSL_NO_CAMELLIA
-#endif
-#ifndef OPENSSL_NO_CAST
-# define OPENSSL_NO_CAST
-#endif
-#ifndef OPENSSL_NO_CAPIENG
-# define OPENSSL_NO_CAPIENG
-#endif
-#ifndef OPENSSL_NO_CMS
-# define OPENSSL_NO_CMS
-#endif
-#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
-# define OPENSSL_NO_EC_NISTP_64_GCC_128
-#endif
-#ifndef OPENSSL_NO_FIPS
-# define OPENSSL_NO_FIPS
-#endif
-#ifndef OPENSSL_NO_GMP
-# define OPENSSL_NO_GMP
-#endif
-#ifndef OPENSSL_NO_IDEA
-# define OPENSSL_NO_IDEA
-#endif
-#ifndef OPENSSL_NO_JPAKE
-# define OPENSSL_NO_JPAKE
-#endif
-#ifndef OPENSSL_NO_KRB5
-# define OPENSSL_NO_KRB5
-#endif
-#ifndef OPENSSL_NO_MDC2
-# define OPENSSL_NO_MDC2
-#endif
-#ifndef OPENSSL_NO_RC5
-# define OPENSSL_NO_RC5
-#endif
-#ifndef OPENSSL_NO_RFC3779
-# define OPENSSL_NO_RFC3779
-#endif
-#ifndef OPENSSL_NO_SCTP
-# define OPENSSL_NO_SCTP
-#endif
-#ifndef OPENSSL_NO_SEED
-# define OPENSSL_NO_SEED
-#endif
-#ifndef OPENSSL_NO_SHA0
-# define OPENSSL_NO_SHA0
-#endif
-#ifndef OPENSSL_NO_WHIRLPOOL
-# define OPENSSL_NO_WHIRLPOOL
-#endif
-
-#endif /* OPENSSL_DOING_MAKEDEPEND */
-
-#ifndef OPENSSL_THREADS
-# define OPENSSL_THREADS
-#endif
-#ifndef OPENSSL_NO_DYNAMIC_ENGINE
-# define OPENSSL_NO_DYNAMIC_ENGINE
-#endif
-
-/* The OPENSSL_NO_* macros are also defined as NO_* if the application
-   asks for it.  This is a transient feature that is provided for those
-   who haven't had the time to do the appropriate changes in their
-   applications.  */
-#ifdef OPENSSL_ALGORITHM_DEFINES
-# if defined(OPENSSL_NO_CAMELLIA) && !defined(NO_CAMELLIA)
-#  define NO_CAMELLIA
-# endif
-# if defined(OPENSSL_NO_CAPIENG) && !defined(NO_CAPIENG)
-#  define NO_CAPIENG
-# endif
-# if defined(OPENSSL_NO_CMS) && !defined(NO_CMS)
-#  define NO_CMS
-# endif
-# if defined(OPENSSL_NO_FIPS) && !defined(NO_FIPS)
-#  define NO_FIPS
-# endif
-# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP)
-#  define NO_GMP
-# endif
-# if defined(OPENSSL_NO_IDEA) && !defined(NO_IDEA)
-#  define NO_IDEA
-# endif
-# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE)
-#  define NO_JPAKE
-# endif
-# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5)
-#  define NO_KRB5
-# endif
-# if defined(OPENSSL_NO_MDC2) && !defined(NO_MDC2)
-#  define NO_MDC2
-# endif
-# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5)
-#  define NO_RC5
-# endif
-# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779)
-#  define NO_RFC3779
-# endif
-# if defined(OPENSSL_NO_SEED) && !defined(NO_SEED)
-#  define NO_SEED
-# endif
-#endif
-
-/* crypto/opensslconf.h.in */
-
-#ifdef OPENSSL_DOING_MAKEDEPEND
-
-/* Include any symbols here that have to be explicitly set to enable a feature
- * that should be visible to makedepend.
- *
- * [Our "make depend" doesn't actually look at this, we use actual build settings
- * instead; we want to make it easy to remove subdirectories with disabled algorithms.]
- */
-
-#ifndef OPENSSL_FIPS
-#define OPENSSL_FIPS
-#endif
-
-#endif
-
-/* Generate 80386 code? */
-#undef I386_ONLY
-
-#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
-#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
-#define ENGINESDIR "/usr/local/ssl/lib/engines"
-#define OPENSSLDIR "/usr/local/ssl"
-#endif
-#endif
-
-#undef OPENSSL_UNISTD
-#define OPENSSL_UNISTD <unistd.h>
-#if !defined(SWIG)
-#include <unistd.h>
-#endif
-
-#undef OPENSSL_EXPORT_VAR_AS_FUNCTION
-
-#if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
-#define IDEA_INT unsigned int
-#endif
-
-#if defined(HEADER_MD2_H) && !defined(MD2_INT)
-#define MD2_INT unsigned int
-#endif
-
-#if defined(HEADER_RC2_H) && !defined(RC2_INT)
-/* I need to put in a mod for the alpha - eay */
-#define RC2_INT unsigned int
-#endif
-
-#if defined(HEADER_RC4_H)
-#if !defined(RC4_INT)
-/* using int types make the structure larger but make the code faster
- * on most boxes I have tested - up to %20 faster. */
-/*
- * I don't know what does "most" mean, but declaring "int" is a must on:
- * - Intel P6 because partial register stalls are very expensive;
- * - elder Alpha because it lacks byte load/store instructions;
- */
-#define RC4_INT unsigned int
-#endif
-#if !defined(RC4_CHUNK)
-/*
- * This enables code handling data aligned at natural CPU word
- * boundary. See crypto/rc4/rc4_enc.c for further details.
- */
-#define RC4_CHUNK unsigned long
-#endif
-#endif
-
-#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG)
-/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
- * %20 speed up (longs are 8 bytes, int's are 4). */
-#ifndef DES_LONG
-#define DES_LONG unsigned int
-#endif
-#endif
-
-#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
-#define CONFIG_HEADER_BN_H
-#define BN_LLONG
-
-/* Should we define BN_DIV2W here? */
-
-/* Only one for the following should be defined */
-/* The prime number generation stuff may not work when
- * EIGHT_BIT but I don't care since I've only used this mode
- * for debuging the bignum libraries */
-#undef SIXTY_FOUR_BIT_LONG
-#undef SIXTY_FOUR_BIT
-#undef THIRTY_TWO_BIT
-#undef SIXTEEN_BIT
-#undef EIGHT_BIT
-
-#if defined(__x86_64__)
-#undef BN_LLONG
-#define SIXTY_FOUR_BIT_LONG
-#else
-#define THIRTY_TWO_BIT
-#endif
-
-#endif
-
-#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H)
-#define CONFIG_HEADER_RC4_LOCL_H
-/* if this is defined data[i] is used instead of *data, this is a %20
- * speedup on x86 */
-#define RC4_INDEX
-#endif
-
-#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
-#define CONFIG_HEADER_BF_LOCL_H
-#undef BF_PTR
-#endif /* HEADER_BF_LOCL_H */
-
-#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H)
-#define CONFIG_HEADER_DES_LOCL_H
-#ifndef DES_DEFAULT_OPTIONS
-/* the following is tweaked from a config script, that is why it is a
- * protected undef/define */
-#ifndef DES_PTR
-#define DES_PTR
-#endif
-
-/* This helps C compiler generate the correct code for multiple functional
- * units.  It reduces register dependancies at the expense of 2 more
- * registers */
-#ifndef DES_RISC1
-#define DES_RISC1
-#endif
-
-#ifndef DES_RISC2
-#undef DES_RISC2
-#endif
-
-#if defined(DES_RISC1) && defined(DES_RISC2)
-YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
-#endif
-
-/* Unroll the inner loop, this sometimes helps, sometimes hinders.
- * Very mucy CPU dependant */
-#ifndef DES_UNROLL
-#define DES_UNROLL
-#endif
-
-/* These default values were supplied by
- * Peter Gutman <pgut001@cs.auckland.ac.nz>
- * They are only used if nothing else has been defined */
-#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL)
-/* Special defines which change the way the code is built depending on the
-   CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
-   even newer MIPS CPU's, but at the moment one size fits all for
-   optimization options.  Older Sparc's work better with only UNROLL, but
-   there's no way to tell at compile time what it is you're running on */
- 
-#if defined( sun )		/* Newer Sparc's */
-#  define DES_PTR
-#  define DES_RISC1
-#  define DES_UNROLL
-#elif defined( __ultrix )	/* Older MIPS */
-#  define DES_PTR
-#  define DES_RISC2
-#  define DES_UNROLL
-#elif defined( __osf1__ )	/* Alpha */
-#  define DES_PTR
-#  define DES_RISC2
-#elif defined ( _AIX )		/* RS6000 */
-  /* Unknown */
-#elif defined( __hpux )		/* HP-PA */
-  /* Unknown */
-#elif defined( __aux )		/* 68K */
-  /* Unknown */
-#elif defined( __dgux )		/* 88K (but P6 in latest boxes) */
-#  define DES_UNROLL
-#elif defined( __sgi )		/* Newer MIPS */
-#  define DES_PTR
-#  define DES_RISC2
-#  define DES_UNROLL
-#elif defined(i386) || defined(__i386__)	/* x86 boxes, should be gcc */
-#  define DES_PTR
-#  define DES_RISC1
-#  define DES_UNROLL
-#endif /* Systems-specific speed defines */
-#endif
-
-#endif /* DES_DEFAULT_OPTIONS */
-#endif /* HEADER_DES_LOCL_H */
-
-
-#ifndef OPENSSL_OPENSSL_CONFIG_LBSHELL_OPENSSL_OPENSSLCONF_H
-#define OPENSSL_OPENSSL_CONFIG_LBSHELL_OPENSSL_OPENSSLCONF_H
-
-// Types that need to be ported.
-#define OPENSSL_port_tm struct tm
-#define OPENSSL_port_time_t time_t
-#define OPENSSL_port_timeval struct timeval
-
-// Definitions for system calls that may need to be overridden.
-#define OPENSSL_port_abort abort
-#define OPENSSL_port_assert assert
-#define OPENSSL_port_atoi atoi
-#define OPENSSL_port_free free
-// getenv is not supported by Cobalt.
-#define OPENSSL_port_getenv(x) NULL
-#define OPENSSL_port_isalnum isalnum
-#define OPENSSL_port_isdigit isdigit
-#define OPENSSL_port_isspace isspace
-#define OPENSSL_port_isupper isupper
-#define OPENSSL_port_isxdigit isxdigit
-#define OPENSSL_port_malloc malloc
-#define OPENSSL_port_memchr memchr
-#define OPENSSL_port_memcmp memcmp
-#define OPENSSL_port_memcpy memcpy
-#define OPENSSL_port_memmove memmove
-#define OPENSSL_port_memset memset
-#define OPENSSL_port_printf printf
-#define OPENSSL_port_printferr printf
-#define OPENSSL_port_qsort qsort
-#define OPENSSL_port_realloc realloc
-#define OPENSSL_port_sscanf sscanf
-#define OPENSSL_port_strcasecmp strcasecmp
-#define OPENSSL_port_strcat strcat
-#define OPENSSL_port_strchr strchr
-#define OPENSSL_port_strcmp strcmp
-#define OPENSSL_port_strcpy strcpy
-#define OPENSSL_port_strdup strdup
-#define OPENSSL_port_strerror strerror
-#define OPENSSL_port_strlen strlen
-#define OPENSSL_port_strncasecmp strncasecmp
-#define OPENSSL_port_strncmp strncmp
-#define OPENSSL_port_strncpy strncpy
-#define OPENSSL_port_strrchr strrchr
-#define OPENSSL_port_strtoul strtoul
-#define OPENSSL_port_time time
-#define OPENSSL_port_tolower tolower
-#define OPENSSL_port_toupper toupper
-
-// OPENSSL wrapper functions that aren't defined globally.
-#define OPENSSL_strcmp OPENSSL_port_strcmp
-
-// Variables that need to be ported.
-#define OPENSSL_port_errno errno
-
-#endif  // OPENSSL_OPENSSL_CONFIG_LBSHELL_OPENSSL_OPENSSLCONF_H
diff --git a/src/third_party/boringssl/src/config/starboard/openssl/opensslconf.h b/src/third_party/boringssl/src/config/starboard/openssl/opensslconf.h
index 6edf989..7d4fe1a 100644
--- a/src/third_party/boringssl/src/config/starboard/openssl/opensslconf.h
+++ b/src/third_party/boringssl/src/config/starboard/openssl/opensslconf.h
@@ -97,11 +97,6 @@
 #ifndef OPENSSL_NO_WHIRLPOOL
 # define OPENSSL_NO_WHIRLPOOL
 #endif
-// We set OPENSSL_NO_THREADS in boringssl.gyp. Set OPENSSL_THREADS here makes no
-// sense.
-// #ifndef OPENSSL_THREADS
-// # define OPENSSL_THREADS
-// #endif
 
 #ifndef OPENSSL_NO_DYNAMIC_ENGINE
 # define OPENSSL_NO_DYNAMIC_ENGINE
diff --git a/src/third_party/boringssl/src/crypto/cpu-starboard.c b/src/third_party/boringssl/src/crypto/cpu-starboard.c
index 2f7609c..070a8c9 100644
--- a/src/third_party/boringssl/src/crypto/cpu-starboard.c
+++ b/src/third_party/boringssl/src/crypto/cpu-starboard.c
@@ -72,7 +72,7 @@
 static bool starboard_cpuid_setup_x86(void) { return true; }
 #endif // defined(OPENSSL_X86 || OPENSSL_X86_64)
 
-#if defined(OPENSSL_ARM)
+#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
 
 #include <openssl/arm_arch.h>
 
@@ -108,7 +108,7 @@
 
 #else
 static bool starboard_cpuid_setup_arm(void) { return true; }
-#endif // OPENSSL_ARM
+#endif // OPENSSL_ARM || OPENSSL_AARCH64
 
 void OPENSSL_cpuid_setup_starboard(void) {
     if (!starboard_cpuid_setup_arm() ||
diff --git a/src/third_party/boringssl/src/crypto/internal.h b/src/third_party/boringssl/src/crypto/internal.h
index dc9c61b..41bbe33 100644
--- a/src/third_party/boringssl/src/crypto/internal.h
+++ b/src/third_party/boringssl/src/crypto/internal.h
@@ -136,6 +136,7 @@
 #endif
 #endif
 
+#if !defined(STARBOARD)
 #if !defined(OPENSSL_NO_THREADS) && \
     (!defined(OPENSSL_WINDOWS) || defined(__MINGW32__))
 #include <pthread.h>
@@ -149,6 +150,7 @@
 #include <windows.h>
 OPENSSL_MSVC_PRAGMA(warning(pop))
 #endif
+#endif  // !defined(STARBOARD)
 
 #if defined(__cplusplus)
 extern "C" {
diff --git a/src/third_party/boringssl/src/crypto/thread_none.c b/src/third_party/boringssl/src/crypto/thread_none.c
index 8475854..718d960 100644
--- a/src/third_party/boringssl/src/crypto/thread_none.c
+++ b/src/third_party/boringssl/src/crypto/thread_none.c
@@ -14,7 +14,7 @@
 
 #include "internal.h"
 
-#if defined(OPENSSL_NO_THREADS) && !defined(STARBOARD)
+#if defined(OPENSSL_NO_THREADS)
 
 void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock) {}
 
@@ -56,4 +56,4 @@
   return 1;
 }
 
-#endif  // OPENSSL_NO_THREADS && !STARBOARD
+#endif  // OPENSSL_NO_THREADS
diff --git a/src/third_party/boringssl/src/tool/internal.h b/src/third_party/boringssl/src/tool/internal.h
index b626270..b42613f 100644
--- a/src/third_party/boringssl/src/tool/internal.h
+++ b/src/third_party/boringssl/src/tool/internal.h
@@ -28,6 +28,11 @@
 
 #include <map>
 
+#if defined(STARBOARD)
+#define printf(fmt, ...) SbLogFormatF(fmt, ##__VA_ARGS__)
+#define fprintf(discard, fmt, ...) printf(fmt, ##__VA_ARGS__)
+#endif
+
 OPENSSL_MSVC_PRAGMA(warning(pop))
 
 #if defined(OPENSSL_WINDOWS)
diff --git a/src/third_party/llvm-project/compiler-rt/compiler-rt.gyp b/src/third_party/llvm-project/compiler-rt/compiler-rt.gyp
index 20279a1..0fa26a9 100644
--- a/src/third_party/llvm-project/compiler-rt/compiler-rt.gyp
+++ b/src/third_party/llvm-project/compiler-rt/compiler-rt.gyp
@@ -44,6 +44,36 @@
         'lib/builtins/udivmodti4.c',
         'lib/builtins/umodti3.c',
       ],
+      'conditions': [
+        ['sb_evergreen == 1 and target_arch == "arm"', {
+          'sources': [
+            'lib/builtins/divdi3.c',
+            'lib/builtins/divmoddi4.c',
+            'lib/builtins/divmodsi4.c',
+            'lib/builtins/divsi3.c',
+            'lib/builtins/fixdfdi.c',
+            'lib/builtins/fixsfdi.c',
+            'lib/builtins/fixunsdfdi.c',
+            'lib/builtins/fixunssfdi.c',
+            'lib/builtins/floatdidf.c',
+            'lib/builtins/floatdisf.c',
+            'lib/builtins/floatundidf.c',
+            'lib/builtins/floatundisf.c',
+            'lib/builtins/udivmoddi4.c',
+            'lib/builtins/udivmodsi4.c',
+            'lib/builtins/udivsi3.c',
+
+            'lib/builtins/arm/aeabi_idivmod.S',
+            'lib/builtins/arm/aeabi_ldivmod.S',
+            'lib/builtins/arm/aeabi_memcmp.S',
+            'lib/builtins/arm/aeabi_memcpy.S',
+            'lib/builtins/arm/aeabi_memmove.S',
+            'lib/builtins/arm/aeabi_memset.S',
+            'lib/builtins/arm/aeabi_uidivmod.S',
+            'lib/builtins/arm/aeabi_uldivmod.S',
+          ],
+        }],
+      ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/third_party/llvm-project/libcxx/libcxx.gyp b/src/third_party/llvm-project/libcxx/libcxx.gyp
index b2af7d4..b4bf522 100644
--- a/src/third_party/llvm-project/libcxx/libcxx.gyp
+++ b/src/third_party/llvm-project/libcxx/libcxx.gyp
@@ -54,6 +54,7 @@
       'defines': [
         '_LIBCPP_BUILDING_LIBRARY',
         '_LIBCPP_HAS_MUSL_LIBC',
+        '_LIBCPP_HAS_NO_STDIN',
         # This macro is used to build libcxxabi with libunwind.
         'LIBCXX_BUILDING_LIBCXXABI',
       ],
@@ -80,6 +81,7 @@
         'src/future.cpp',
         'src/hash.cpp',
         'src/ios.cpp',
+        'src/iostream.cpp',
         'src/locale.cpp',
         'src/memory.cpp',
         'src/mutex.cpp',
diff --git a/src/third_party/musl/musl.gyp b/src/third_party/musl/musl.gyp
index 2a85789..8c826fb 100644
--- a/src/third_party/musl/musl.gyp
+++ b/src/third_party/musl/musl.gyp
@@ -155,6 +155,7 @@
             'src/errno/strerror.c',
             'src/exit/assert.c',
             'src/exit/atexit.c',
+            'src/exit/exit.c',
             'src/internal/floatscan.c',
             'src/internal/intscan.c',
             'src/internal/shgetc.c',
@@ -180,6 +181,7 @@
             'src/multibyte/wcsrtombs.c',
             'src/multibyte/wcstombs.c',
             'src/multibyte/wctob.c',
+            'src/prng/rand.c',
             'src/stdio/__toread.c',
             'src/stdio/__uflow.c',
             'src/stdio/fprintf.c',
diff --git a/src/third_party/musl/src/exit/exit.c b/src/third_party/musl/src/exit/exit.c
index bf7835a..29a5aac 100644
--- a/src/third_party/musl/src/exit/exit.c
+++ b/src/third_party/musl/src/exit/exit.c
@@ -2,6 +2,11 @@
 #include <stdint.h>
 #include "libc.h"
 
+#if defined(STARBOARD)
+#include "starboard/system.h"
+#endif  // defined(STARBOARD)
+
+#if !defined(STARBOARD)
 static void dummy()
 {
 }
@@ -24,11 +29,16 @@
 }
 
 weak_alias(libc_exit_fini, __libc_exit_fini);
+#endif  // !defined(STARBOARD)
 
 _Noreturn void exit(int code)
 {
+#if defined(STARBOARD)
+	SbSystemBreakIntoDebugger();
+#else   // !defined(STARBOARD)
 	__funcs_on_exit();
 	__libc_exit_fini();
 	__stdio_exit();
 	_Exit(code);
+#endif  // defined(STARBOARD)
 }
diff --git a/src/third_party/musl/src/prng/rand.c b/src/third_party/musl/src/prng/rand.c
index c000cd2..9c0c40a 100644
--- a/src/third_party/musl/src/prng/rand.c
+++ b/src/third_party/musl/src/prng/rand.c
@@ -1,15 +1,25 @@
 #include <stdlib.h>
 #include <stdint.h>
 
+#if defined(STARBOARD)
+#include "starboard/system.h"
+#else   // !defined(STARBOARD)
 static uint64_t seed;
+#endif  // defined(STARBOARD)
 
 void srand(unsigned s)
 {
+#if !defined(STARBOARD)
 	seed = s-1;
+#endif  // !defined(STARBOARD)
 }
 
 int rand(void)
 {
+#if defined(STARBOARD)
+	return SbSystemGetRandomUInt64();
+#else   // !defined(STARBOARD)
 	seed = 6364136223846793005ULL*seed + 1;
 	return seed>>33;
+#endif  // defined(STARBOARD)
 }
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
similarity index 66%
rename from src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
rename to src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
index 450b4b3..bb846a4 100644
--- a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
+++ b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
@@ -1,12 +1,5 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constants</title>
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-prototype-object">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
+'use strict';
+
 test(function() {
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27732
   var constants = [
@@ -47,13 +40,12 @@
         assert_equals(object[name], i + 1, name)
         assert_own_property(object, name)
         var pd = Object.getOwnPropertyDescriptor(object, name)
-        assert_false("get" in pd, "property has getter")
-        assert_false("set" in pd, "property has setter")
-        assert_false(pd.writable, "not writable")
+        assert_false("get" in pd, "get")
+        assert_false("set" in pd, "set")
+        assert_false(pd.writable, "writable")
         assert_true(pd.enumerable, "enumerable")
-        assert_false(pd.configurable, "not configurable")
+        assert_false(pd.configurable, "configurable")
       }, "Constant " + name + " on " + description)
     })
   })
 })
-</script>
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js
new file mode 100644
index 0000000..a015470
--- /dev/null
+++ b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js
@@ -0,0 +1,32 @@
+test(function() {
+    assert_own_property(self, "DOMException", "property of global");
+
+    var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
+    assert_false("get" in desc, "get");
+    assert_false("set" in desc, "set");
+    assert_true(desc.writable, "writable");
+    assert_false(desc.enumerable, "enumerable");
+    assert_true(desc.configurable, "configurable");
+}, "existence and property descriptor of DOMException");
+
+test(function() {
+    assert_own_property(self.DOMException, "prototype", "prototype property");
+
+    var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
+    assert_false("get" in desc, "get");
+    assert_false("set" in desc, "set");
+    assert_false(desc.writable, "writable");
+    assert_false(desc.enumerable, "enumerable");
+    assert_false(desc.configurable, "configurable");
+}, "existence and property descriptor of DOMException.prototype");
+
+test(function() {
+    assert_own_property(self.DOMException.prototype, "constructor", "property of prototype");
+    var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
+    assert_false("get" in desc, "get");
+    assert_false("set" in desc, "set");
+    assert_true(desc.writable, "writable");
+    assert_false(desc.enumerable, "enumerable");
+    assert_true(desc.configurable, "configurable");
+    assert_equals(self.DOMException.prototype.constructor, self.DOMException, "equality with actual constructor");
+}, "existence and property descriptor of DOMException.prototype.constructor");
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
similarity index 75%
rename from src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
rename to src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
index 0e5ffea..d6e1cdd 100644
--- a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
+++ b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
@@ -1,13 +1,5 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constructor</title>
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
-<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.message">
-<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.name">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
+'use strict';
+
 test(function() {
   var ex = new DOMException();
   assert_equals(ex.name, "Error",
@@ -22,7 +14,7 @@
                "The name property should be inherited");
   assert_false(ex.hasOwnProperty("message"),
                "The message property should be inherited");
-}, 'new DOMException(): own-ness');
+}, 'new DOMException(): inherited-ness');
 
 test(function() {
   var ex = new DOMException(null);
@@ -46,7 +38,7 @@
                "The name property should be inherited");
   assert_false(ex.hasOwnProperty("message"),
                "The message property should be inherited");
-}, 'new DOMException(undefined): own-ness');
+}, 'new DOMException(undefined): inherited-ness');
 
 test(function() {
   var ex = new DOMException("foo");
@@ -59,9 +51,9 @@
   var ex = new DOMException("foo");
   assert_false(ex.hasOwnProperty("name"),
                "The name property should be inherited");
-  assert_true(ex.hasOwnProperty("message"),
-              "The message property should be own");
-}, 'new DOMException("foo"): own-ness');
+  assert_false(ex.hasOwnProperty("message"),
+              "The message property should be inherited");
+}, 'new DOMException("foo"): inherited-ness');
 
 test(function() {
   var ex = new DOMException("bar", undefined);
@@ -80,11 +72,11 @@
 
 test(function() {
   var ex = new DOMException("bar", "NotSupportedError");
-  assert_true(ex.hasOwnProperty("name"),
-              "The name property should be own");
-  assert_true(ex.hasOwnProperty("message"),
-              "The message property should be own");
-}, 'new DOMException("bar", "NotSupportedError"): own-ness');
+  assert_false(ex.hasOwnProperty("name"),
+              "The name property should be inherited");
+  assert_false(ex.hasOwnProperty("message"),
+              "The message property should be inherited");
+}, 'new DOMException("bar", "NotSupportedError"): inherited-ness');
 
 test(function() {
   var ex = new DOMException("bar", "foo");
@@ -127,13 +119,3 @@
                   "Should have matching legacy code from error names table");
   },'new DOMexception("msg", "' + test_case.name + '")');
 });
-
-test(function() {
-  var ex = new DOMException("bar", "UnknownError");
-  assert_equals(ex.name, "UnknownError", "Should be using the passed-in name");
-  assert_equals(ex.message, "bar", "Should still be using passed-in message");
-  assert_equals(ex.code, 0,
-                "Should have 0 for code for a name in the exception names table with no legacy code");
-}, 'new DOMException("bar", "UnknownError")');
-
-</script>
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js
new file mode 100644
index 0000000..fbbb8b3
--- /dev/null
+++ b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js
@@ -0,0 +1,129 @@
+"use strict";
+
+// Cobalt mozjs fails this.
+/*
+test(() => {
+  assert_throws(new TypeError(), () => DOMException());
+}, "Cannot construct without new");
+*/
+
+test(() => {
+  assert_equals(Object.getPrototypeOf(DOMException.prototype), Error.prototype);
+}, "inherits from Error: prototype-side");
+
+test(() => {
+  assert_equals(Object.getPrototypeOf(DOMException), Function.prototype);
+}, "does not inherit from Error: class-side");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("message"), "property is not own");
+
+  const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "message");
+  assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+  assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+  assert_true(propDesc.enumerable, "property descriptor enumerable");
+  assert_true(propDesc.configurable, "property descriptor configurable");
+}, "message property descriptor");
+
+test(() => {
+  const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "message").get;
+
+  assert_throws(new TypeError(), () => getter.apply({}));
+}, "message getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("name"), "property is not own");
+
+  const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "name");
+  assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+  assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+  assert_true(propDesc.enumerable, "property descriptor enumerable");
+  assert_true(propDesc.configurable, "property descriptor configurable");
+}, "name property descriptor");
+
+test(() => {
+  const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "name").get;
+
+  assert_throws(new TypeError(), () => getter.apply({}));
+}, "name getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("code"), "property is not own");
+
+  const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "code");
+  assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+  assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+  assert_true(propDesc.enumerable, "property descriptor enumerable");
+  assert_true(propDesc.configurable, "property descriptor configurable");
+}, "code property descriptor");
+
+test(() => {
+  const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "code").get;
+
+  assert_throws(new TypeError(), () => getter.apply({}));
+}, "code getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+  const e = new DOMException("message", "InvalidCharacterError");
+  assert_equals(e.code, 5, "Initially the code is set to 5");
+
+  Object.defineProperty(e, "name", {
+    value: "WrongDocumentError"
+  });
+
+  assert_equals(e.code, 5, "The code is still set to 5");
+}, "code property is not affected by shadowing the name property");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_equals(Object.prototype.toString.call(e), "[object DOMException]");
+}, "Object.prototype.toString behavior is like other interfaces");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("toString"), "toString must not exist on the instance");
+  assert_false(DOMException.prototype.hasOwnProperty("toString"), "toString must not exist on DOMException.prototype");
+  assert_equals(typeof e.toString, "function", "toString must still exist (via Error.prototype)");
+}, "Inherits its toString() from Error.prototype");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_equals(e.toString(), "name: message",
+    "The default Error.prototype.toString() behavior must work on supplied name and message");
+
+  Object.defineProperty(e, "name", { value: "new name" });
+  Object.defineProperty(e, "message", { value: "new message" });
+  assert_equals(e.toString(), "new name: new message",
+    "The default Error.prototype.toString() behavior must work on shadowed names and messages");
+}, "toString() behavior from Error.prototype applies as expected");
+
+// Cobalt mozjs fails this.
+/*
+test(() => {
+  assert_throws(new TypeError(), () => DOMException.prototype.toString());
+}, "DOMException.prototype.toString() applied to DOMException.prototype throws because of name/message brand checks");
+*/
+
+// Cobalt v8 fails this. Even the current Chrome fails this.
+/*
+test(() => {
+  let stackOnNormalErrors;
+  try {
+    throw new Error("normal error");
+  } catch (e) {
+    stackOnNormalErrors = e.stack;
+  }
+
+  let stackOnDOMException;
+  try {
+    throw new DOMException("message", "name");
+  } catch (e) {
+    stackOnDOMException = e.stack;
+  }
+
+  assert_equals(typeof stackOnDOMException, typeof stackOnNormalErrors, "The typeof values must match");
+}, "If the implementation has a stack property on normal errors, it also does on DOMExceptions");
+*/
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
deleted file mode 100644
index ddb40f4..0000000
--- a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constructor and prototype object</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=constructor-object.js></script>
-<div id="log"></div>
-<script>
-setup({ explicit_done: true })
-run_test()
-</script>
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
deleted file mode 100644
index e539d85..0000000
--- a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
+++ /dev/null
@@ -1,111 +0,0 @@
-function run_test() {
-    test(function() {
-        // "There MUST exist a property on the ECMAScript global object whose
-        // name is “DOMException” and value is an object called the
-        // DOMException constructor object, which provides access to legacy
-        // DOMException code constants. The property has the attributes
-        // { [[Writable]]: true, [[Enumerable]]: false,
-        // [[Configurable]]: true }."
-        assert_own_property(self, "DOMException",
-                            "self does not have own property \"DOMException\"");
-        var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
-        assert_false("get" in desc, "self's property \"DOMException\" has getter");
-        assert_false("set" in desc, "self's property \"DOMException\" has setter");
-        assert_true(desc.writable, "self's property \"DOMException\" is not writable");
-        assert_false(desc.enumerable, "self's property \"DOMException\" is enumerable");
-        assert_true(desc.configurable, "self's property \"DOMException\" is not configurable");
-
-        // "The DOMException constructor object MUST be a function object but
-        // with a [[Prototype]] value of %Error% ([ECMA-262], section 6.1.7.4)."
-        assert_equals(Object.getPrototypeOf(self.DOMException), Error,
-                      "prototype of self's property \"DOMException\" is not Error");
-
-        // "Its [[Get]] internal property is set as described in ECMA-262
-        // section 9.1.8."
-        // Not much to test for this.
-        // "Its [[Construct]] internal property is set as described in ECMA-262
-        // section 19.2.2.3."
-        // "Its @@hasInstance property is set as described in ECMA-262 section
-        // 19.2.3.8, unless otherwise specified."
-
-        // String() returns something implementation-dependent, because it
-        // calls Function#toString.
-        assert_class_string(self.DOMException, "Function",
-                            "class string of DOMException");
-
-        // "For every legacy code listed in the error names table, there MUST
-        // be a property on the DOMException constructor object whose name and
-        // value are as indicated in the table. The property has attributes
-        // { [[Writable]]: false, [[Enumerable]]: true,
-        // [[Configurable]]: false }."
-        // See DOMException-constants.html.
-    }, "existence and properties of DOMException");
-
-    test(function() {
-        assert_own_property(self, "DOMException",
-                            "self does not have own property \"DOMException\"");
-
-        // "The DOMException constructor object MUST also have a property named
-        // “prototype” with attributes { [[Writable]]: false,
-        // [[Enumerable]]: false, [[Configurable]]: false } whose value is an
-        // object called the DOMException prototype object. This object also
-        // provides access to the legacy code values."
-        assert_own_property(self.DOMException, "prototype",
-                            'exception "DOMException" does not have own property "prototype"');
-        var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
-        assert_false("get" in desc, "DOMException.prototype has getter");
-        assert_false("set" in desc, "DOMException.prototype has setter");
-        assert_false(desc.writable, "DOMException.prototype is writable");
-        assert_false(desc.enumerable, "DOMException.prototype is enumerable");
-        assert_false(desc.configurable, "DOMException.prototype is configurable");
-
-        // "The DOMException prototype object MUST have an internal
-        // [[Prototype]] property whose value is %ErrorPrototype% ([ECMA-262],
-        // section 6.1.7.4)."
-        assert_own_property(self, "Error",
-                            'should inherit from Error, but self has no such property');
-        assert_own_property(self.Error, "prototype",
-                            'should inherit from Error, but that object has no "prototype" property');
-        assert_equals(Object.getPrototypeOf(self.DOMException.prototype),
-                      self.Error.prototype,
-                      'prototype of DOMException.prototype is not Error.prototype');
-
-        // "The class string of the DOMException prototype object is
-        // “DOMExceptionPrototype”."
-        assert_class_string(self.DOMException.prototype, "DOMExceptionPrototype",
-                            "class string of DOMException.prototype");
-    }, "existence and properties of DOMException.prototype");
-
-    test(function() {
-        assert_false(self.DOMException.prototype.hasOwnProperty("name"),
-                     "DOMException.prototype should not have an own \"name\" " +
-                     "property.");
-        assert_false(self.DOMException.prototype.hasOwnProperty("code"),
-                     "DOMException.prototype should not have an own \"name\" " +
-                     "property.");
-    }, "existence of name and code properties on DOMException.prototype");
-
-    test(function() {
-        assert_own_property(self, "DOMException",
-                            "self does not have own property \"DOMException\"");
-        assert_own_property(self.DOMException, "prototype",
-                            'interface "DOMException" does not have own property "prototype"');
-
-        // "There MUST be a property named “constructor” on the DOMException
-        // prototype object with attributes { [[Writable]]: true,
-        // [[Enumerable]]: false, [[Configurable]]: true } and whose value is
-        // the DOMException constructor object."
-        assert_own_property(self.DOMException.prototype, "constructor",
-                            "DOMException" + '.prototype does not have own property "constructor"');
-        var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
-        assert_false("get" in desc, "DOMException.prototype.constructor has getter");
-        assert_false("set" in desc, "DOMException.prototype.constructor has setter");
-        assert_true(desc.writable, "DOMException.prototype.constructor is not writable");
-        assert_false(desc.enumerable, "DOMException.prototype.constructor is enumerable");
-        assert_true(desc.configurable, "DOMException.prototype.constructor in not configurable");
-        assert_equals(self.DOMException.prototype.constructor, self.DOMException,
-                      "DOMException.prototype.constructor is not the same object as DOMException");
-    }, "existence and properties of exception interface prototype object's \"constructor\" property");
-
-    done();
-}
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
deleted file mode 100644
index 7514924..0000000
--- a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
+++ /dev/null
@@ -1,3 +0,0 @@
-importScripts("/resources/testharness.js")
-importScripts("constructor-object.js")
-run_test();
diff --git a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
index bc1d7fe..396d0a4 100644
--- a/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
+++ b/src/third_party/web_platform_tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
@@ -1,4 +1,5 @@
 <!doctype html>
+<meta charset=utf-8>
 <title>DOMException-throwing tests</title>
 <link rel=author title="Aryeh Gregor" href=ayg@aryeh.name>
 <div id=log></div>
@@ -19,90 +20,31 @@
 setup({explicit_done: true});
 
 function testException(exception, global, desc) {
-  // https://heycam.github.io/webidl/#es-exception-objects
-  // (as of 2015-01-03): "The value of the internal [[Prototype]] property of a
-  // DOMException object MUST be the DOMException prototype object from the
-  // global environment the exception object is associated with."
   test(function() {
     assert_equals(global.Object.getPrototypeOf(exception),
                   global.DOMException.prototype);
   }, desc + "Object.getPrototypeOf(exception) === DOMException.prototype");
 
 
-  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
-  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
-  // passing “name”, Property Descriptor { [[Value]]: /N/, [[Writable]]: true,
-  // [[Enumerable]]: true, [[Configurable]]: true }, and false as arguments."
   test(function() {
-    assert_true(exception.hasOwnProperty("name"));
+    assert_false(exception.hasOwnProperty("name"));
   }, desc + "exception.hasOwnProperty(\"name\")");
+  test(function() {
+    assert_false(exception.hasOwnProperty("message"));
+  }, desc + "exception.hasOwnProperty(\"message\")");
 
   test(function() {
     assert_equals(exception.name, "HierarchyRequestError");
   }, desc + "exception.name === \"HierarchyRequestError\"");
 
   test(function() {
-    var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
-    assert_true(desc.writable, "must be writable");
-    assert_true(desc.enumerable, "must be enumerable");
-    assert_true(desc.configurable, "must be configurable");
-  }, desc + "Object.getOwnPropertyDescriptor(exception, \"name\")");
-
-
-  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
-  // (as of 2015-01-03): "If the optional user agent-defined message /M/ was
-  // specified, then this list has a single element whose value is the result
-  // of converting /M/ to a String value. Otherwise, the list is empty."
-  //
-  // https://heycam.github.io/webidl/#es-DOMException-constructor-object
-  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
-  // passing “message”, Property Descriptor { [[Value]]: /S/,
-  // [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }, and
-  // false as arguments."
-  test(function() {
-    if (exception.hasOwnProperty("message")) {
-      var desc = global.Object.getOwnPropertyDescriptor(exception, "message");
-      assert_true(desc.writable, "must be writable");
-      assert_false(desc.enumerable, "must not be enumerable");
-      assert_true(desc.configurable, "must be configurable");
-    }
-  }, desc + "Object.getOwnPropertyDescriptor(exception, \"message\")");
-
-  test(function() {
-    if (exception.hasOwnProperty("message")) {
-      // Can't test anything more specific, since it's implementation-defined :(
-      assert_equals(typeof exception.message, "string");
-    } else {
-      // Error.prototype.message
-      assert_equals(exception.message, "");
-    }
-  }, desc + "typeof exception.message === \"string\"");
-
-
-  // https://heycam.github.io/webidl/#es-exception-objects
-  // (as of 2015-01-03): "The class string of a DOMException object MUST be
-  // “DOMException”."
-  test(function() {
-    assert_equals(global.Object.prototype.toString.call(exception),
-                  "[object DOMException]");
-  }, desc + "Object.prototype.toString.call(exception) === \"[object DOMException]\"");
-
-
-  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
-  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
-  // passing “code”, Property Descriptor { [[Value]]: /code/,
-  // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }, and
-  // false as arguments."
-  test(function() {
     assert_equals(exception.code, global.DOMException.HIERARCHY_REQUEST_ERR);
   }, desc + "exception.code === DOMException.HIERARCHY_REQUEST_ERR");
 
   test(function() {
-    var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
-    assert_true(desc.writable, "must be writable");
-    assert_true(desc.enumerable, "must be enumerable");
-    assert_true(desc.configurable, "must be configurable");
-  }, desc + "Object.getOwnPropertyDescriptor(exception, \"code\")");
+    assert_equals(global.Object.prototype.toString.call(exception),
+                  "[object DOMException]");
+  }, desc + "Object.prototype.toString.call(exception) === \"[object DOMException]\"");
 }
 
 
diff --git a/src/third_party/web_platform_tests/dom/abort/event.any.js b/src/third_party/web_platform_tests/dom/abort/event.any.js
new file mode 100644
index 0000000..d566bec
--- /dev/null
+++ b/src/third_party/web_platform_tests/dom/abort/event.any.js
@@ -0,0 +1,68 @@
+test(t => {
+  const c = new AbortController(),
+        s = c.signal;
+  let state = "begin";
+
+  assert_false(s.aborted);
+
+  s.addEventListener("abort",
+    t.step_func(e => {
+      assert_equals(state, "begin");
+      state = "aborted";
+    })
+  );
+  c.abort();
+
+  assert_equals(state, "aborted");
+  assert_true(s.aborted);
+
+  c.abort();
+}, "AbortController abort() should fire event synchronously");
+
+test(t => {
+  const controller = new AbortController();
+  const signal = controller.signal;
+  assert_equals(controller.signal, signal,
+                "value of controller.signal should not have changed");
+  controller.abort();
+  assert_equals(controller.signal, signal,
+                "value of controller.signal should still not have changed");
+}, "controller.signal should always return the same object");
+
+test(t => {
+  const controller = new AbortController();
+  const signal = controller.signal;
+  let eventCount = 0;
+  signal.onabort = () => {
+    ++eventCount;
+  };
+  controller.abort();
+  assert_true(signal.aborted);
+  assert_equals(eventCount, 1, "event handler should have been called once");
+  controller.abort();
+  assert_true(signal.aborted);
+  assert_equals(eventCount, 1,
+                "event handler should not have been called again");
+}, "controller.abort() should do nothing the second time it is called");
+
+test(t => {
+  const controller = new AbortController();
+  controller.abort();
+  controller.signal.onabort =
+      t.unreached_func("event handler should not be called");
+}, "event handler should not be called if added after controller.abort()");
+
+test(t => {
+  const controller = new AbortController();
+  const signal = controller.signal;
+  signal.onabort = t.step_func(e => {
+    assert_equals(e.type, "abort", "event type should be abort");
+    assert_equals(e.target, signal, "event target should be signal");
+    assert_false(e.bubbles, "event should not bubble");
+    // Cobalt does not support Event.isTrusted
+    // assert_true(e.isTrusted, "event should be trusted");
+  });
+  controller.abort();
+}, "the abort event should have the right properties");
+
+done();
diff --git a/src/tools/gyp/pylib/gyp/MSVSVersion.py b/src/tools/gyp/pylib/gyp/MSVSVersion.py
index 8f80554..0dacf85 100644
--- a/src/tools/gyp/pylib/gyp/MSVSVersion.py
+++ b/src/tools/gyp/pylib/gyp/MSVSVersion.py
@@ -79,12 +79,18 @@
       return [os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.Cmd')),
               '/' + target_arch]
     else:
-      # We don't use VC/vcvarsall.bat for x86 because vcvarsall calls
+      # For VS2012: We don't use VC/vcvarsall.bat for x86 because vcvarsall calls
       # vcvars32, which it can only find if VS??COMNTOOLS is set, which it
       # isn't always.
+      # Starting from VS2017 the tools layout was changed and we need
+      # to account for that.
       if target_arch == 'x86':
-        return [os.path.normpath(
-          os.path.join(self.path, 'Common7/Tools/vsvars32.bat'))]
+        batCandidate = os.path.normpath(
+          os.path.join(self.path, 'Common7/Tools/vsvars32.bat'))
+        if not os.path.exists(batCandidate):
+          batCandidate = os.path.normpath(
+          os.path.join(self.path, 'VC/Auxiliary/Build/vcvars32.bat'))
+        return [batCandidate]
       else:
         assert target_arch == 'x64'
         arg = 'x86_amd64'
@@ -92,8 +98,12 @@
             os.environ.get('PROCESSOR_ARCHITEW6432') == 'AMD64'):
           # Use the 64-on-64 compiler if we can.
           arg = 'amd64'
-        return [os.path.normpath(
-            os.path.join(self.path, 'VC/vcvarsall.bat')), arg]
+        batCandidate = os.path.normpath(
+            os.path.join(self.path, 'VC/vcvarsall.bat'))
+        if not os.path.exists(batCandidate):
+          batCandidate = os.path.normpath(
+            os.path.join(self.path, 'VC/Auxiliary/Build/vcvarsall.bat'))
+        return [batCandidate, arg]
 
 
 def _RegistryQueryBase(sysdir, key, value):
@@ -311,6 +321,8 @@
         path = os.path.join(vs_install_dir, r'Common7\IDE')
       else:
         path = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE'
+        if not os.path.exists(path):
+          path = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE'
       path = _ConvertToCygpath(path)
       full_path = os.path.join(path, 'devenv.exe')
       if os.path.exists(full_path) and version in version_to_year: