diff --git a/src/BUILD.gn b/src/BUILD.gn
index 6fbe520..6900b8c 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -21,3 +21,13 @@
 
   deps = [ "//starboard:gn_all" ]
 }
+
+group("default") {
+  testonly = true
+
+  if (is_qa || is_gold) {
+    deps = [ "//starboard" ]
+  } else {
+    deps = [ ":gn_all" ]
+  }
+}
diff --git a/src/base/allocator/allocator_shim_default_dispatch_to_winheap.cc b/src/base/allocator/allocator_shim_default_dispatch_to_winheap.cc
index 71a73c7..8c93ae7 100644
--- a/src/base/allocator/allocator_shim_default_dispatch_to_winheap.cc
+++ b/src/base/allocator/allocator_shim_default_dispatch_to_winheap.cc
@@ -29,7 +29,7 @@
 
   void* result = DefaultWinHeapMallocImpl(self, size, context);
   if (result) {
-    SbMemorySet(result, 0, size);
+    memset(result, 0, size);
   }
   return result;
 }
diff --git a/src/base/allocator/allocator_shim_override_mac_symbols.h b/src/base/allocator/allocator_shim_override_mac_symbols.h
index fb009d8..aaa79ea 100644
--- a/src/base/allocator/allocator_shim_override_mac_symbols.h
+++ b/src/base/allocator/allocator_shim_override_mac_symbols.h
@@ -16,7 +16,7 @@
 
 MallocZoneFunctions MallocZoneFunctionsToReplaceDefault() {
   MallocZoneFunctions new_functions;
-  SbMemorySet(&new_functions, 0, sizeof(MallocZoneFunctions));
+  memset(&new_functions, 0, sizeof(MallocZoneFunctions));
   new_functions.size = [](malloc_zone_t* zone, const void* ptr) -> size_t {
     return ShimGetSizeEstimate(ptr, zone);
   };
diff --git a/src/base/allocator/allocator_shim_unittest.cc b/src/base/allocator/allocator_shim_unittest.cc
index f9ec2b0..8b82a0f 100644
--- a/src/base/allocator/allocator_shim_unittest.cc
+++ b/src/base/allocator/allocator_shim_unittest.cc
@@ -188,15 +188,15 @@
 
   void SetUp() override {
     const size_t array_size = kMaxSizeTracked * sizeof(size_t);
-    SbMemorySet(&allocs_intercepted_by_size, 0, array_size);
-    SbMemorySet(&zero_allocs_intercepted_by_size, 0, array_size);
-    SbMemorySet(&aligned_allocs_intercepted_by_size, 0, array_size);
-    SbMemorySet(&aligned_allocs_intercepted_by_alignment, 0, array_size);
-    SbMemorySet(&reallocs_intercepted_by_size, 0, array_size);
-    SbMemorySet(&frees_intercepted_by_addr, 0, array_size);
-    SbMemorySet(&batch_mallocs_intercepted_by_size, 0, array_size);
-    SbMemorySet(&batch_frees_intercepted_by_addr, 0, array_size);
-    SbMemorySet(&free_definite_sizes_intercepted_by_size, 0, array_size);
+    memset(&allocs_intercepted_by_size, 0, array_size);
+    memset(&zero_allocs_intercepted_by_size, 0, array_size);
+    memset(&aligned_allocs_intercepted_by_size, 0, array_size);
+    memset(&aligned_allocs_intercepted_by_alignment, 0, array_size);
+    memset(&reallocs_intercepted_by_size, 0, array_size);
+    memset(&frees_intercepted_by_addr, 0, array_size);
+    memset(&batch_mallocs_intercepted_by_size, 0, array_size);
+    memset(&batch_frees_intercepted_by_addr, 0, array_size);
+    memset(&free_definite_sizes_intercepted_by_size, 0, array_size);
     did_fail_realloc_0xfeed_once.reset(new ThreadLocalBoolean());
     subtle::Release_Store(&num_new_handler_calls, 0);
     instance_ = this;
@@ -315,7 +315,7 @@
 #endif  // !OS_WIN && !OS_MACOSX
 
   char* realloc_ptr = static_cast<char*>(SbMemoryAllocate(10));
-  SbStringCopyUnsafe(realloc_ptr, "foobar");
+  strcpy(realloc_ptr, "foobar");
   void* old_realloc_ptr = realloc_ptr;
   SbMemoryReallocate_ptr =
       static_cast<char*>(SbMemoryReallocate(SbMemoryReallocate_ptr, 73));
diff --git a/src/base/allocator/malloc_zone_functions_mac.cc b/src/base/allocator/malloc_zone_functions_mac.cc
index 83e8268..fb13091 100644
--- a/src/base/allocator/malloc_zone_functions_mac.cc
+++ b/src/base/allocator/malloc_zone_functions_mac.cc
@@ -17,7 +17,7 @@
 
 void StoreZoneFunctions(const ChromeMallocZone* zone,
                         MallocZoneFunctions* functions) {
-  SbMemorySet(functions, 0, sizeof(MallocZoneFunctions));
+  memset(functions, 0, sizeof(MallocZoneFunctions));
   functions->malloc = zone->malloc;
   functions->calloc = zone->calloc;
   functions->valloc = zone->valloc;
@@ -107,7 +107,7 @@
 void ClearAllMallocZonesForTesting() {
   base::AutoLock l(GetLock());
   EnsureMallocZonesInitializedLocked();
-  SbMemorySet(g_malloc_zones, 0, kMaxZoneCount * sizeof(MallocZoneFunctions));
+  memset(g_malloc_zones, 0, kMaxZoneCount * sizeof(MallocZoneFunctions));
   g_zone_count = 0;
 }
 
diff --git a/src/base/allocator/malloc_zone_functions_mac_unittest.cc b/src/base/allocator/malloc_zone_functions_mac_unittest.cc
index e387b80..8bb7348 100644
--- a/src/base/allocator/malloc_zone_functions_mac_unittest.cc
+++ b/src/base/allocator/malloc_zone_functions_mac_unittest.cc
@@ -46,7 +46,7 @@
   zones.resize(kMaxZoneCount * 2);
   for (int i = 0; i < kMaxZoneCount * 2; ++i) {
     ChromeMallocZone& zone = zones[i];
-    SbMemoryCopy(&zone, malloc_default_zone(), sizeof(ChromeMallocZone));
+    memcpy(&zone, malloc_default_zone(), sizeof(ChromeMallocZone));
     StoreMallocZone(&zone);
   }
 
diff --git a/src/base/allocator/partition_allocator/partition_alloc.cc b/src/base/allocator/partition_allocator/partition_alloc.cc
index 288aa92..c7343fc 100644
--- a/src/base/allocator/partition_allocator/partition_alloc.cc
+++ b/src/base/allocator/partition_allocator/partition_alloc.cc
@@ -235,7 +235,7 @@
     root->RecommitSystemPages(char_ptr + current_size, recommit_size);
 
 #if DCHECK_IS_ON()
-    SbMemorySet(char_ptr + current_size, kUninitializedByte, recommit_size);
+    memset(char_ptr + current_size, kUninitializedByte, recommit_size);
 #endif
   } else {
     // We can't perform the realloc in-place.
@@ -326,7 +326,7 @@
   if (new_size < copy_size)
     copy_size = new_size;
 
-  SbMemoryCopy(ret, ptr, copy_size);
+  memcpy(ret, ptr, copy_size);
   root->Free(ptr);
   return ret;
 #endif
@@ -378,7 +378,7 @@
   // DiscardVirtualMemory makes the contents of discarded memory undefined.
   size_t last_slot = static_cast<size_t>(-1);
 #endif
-  SbMemorySet(slot_usage, 1, num_slots);
+  memset(slot_usage, 1, num_slots);
   char* ptr = reinterpret_cast<char*>(internal::PartitionPage::ToPointer(page));
   // First, walk the freelist for this page and make a bitmap of which slots
   // are not in use.
@@ -564,7 +564,7 @@
       !bucket->num_full_pages)
     return;
 
-  SbMemorySet(stats_out, '\0', sizeof(*stats_out));
+  memset(stats_out, '\0', sizeof(*stats_out));
   stats_out->is_valid = true;
   stats_out->is_direct_map = false;
   stats_out->num_full_pages = static_cast<size_t>(bucket->num_full_pages);
diff --git a/src/base/allocator/partition_allocator/partition_alloc.h b/src/base/allocator/partition_allocator/partition_alloc.h
index 79b22f4..af49684 100644
--- a/src/base/allocator/partition_allocator/partition_alloc.h
+++ b/src/base/allocator/partition_allocator/partition_alloc.h
@@ -433,7 +433,7 @@
 class SizeSpecificPartitionAllocator {
  public:
   SizeSpecificPartitionAllocator() {
-    SbMemorySet(
+    memset(
         actual_buckets_, 0,
         sizeof(internal::PartitionBucket) * base::size(actual_buckets_));
   }
diff --git a/src/base/allocator/partition_allocator/partition_alloc_unittest.cc b/src/base/allocator/partition_allocator/partition_alloc_unittest.cc
index 5ba8414..cfc208d 100644
--- a/src/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/src/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -739,7 +739,7 @@
          kExtraAllocSize;
   ptr = generic_allocator.root()->Alloc(size, type_name);
   EXPECT_TRUE(ptr);
-  SbMemorySet(ptr, 'A', size);
+  memset(ptr, 'A', size);
   ptr2 = generic_allocator.root()->Alloc(size, type_name);
   EXPECT_TRUE(ptr2);
   void* ptr3 = generic_allocator.root()->Alloc(size, type_name);
@@ -871,7 +871,7 @@
   // realloc(0, size) should be equivalent to malloc().
   void* ptr =
       generic_allocator.root()->Realloc(nullptr, kTestAllocSize, type_name);
-  SbMemorySet(ptr, 'A', kTestAllocSize);
+  memset(ptr, 'A', kTestAllocSize);
   PartitionPage* page =
       PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
   // realloc(ptr, 0) should be equivalent to free().
@@ -884,7 +884,7 @@
   size_t size = kSystemPageSize - kExtraAllocSize;
   EXPECT_EQ(size, generic_allocator.root()->ActualSize(size));
   ptr = generic_allocator.root()->Alloc(size, type_name);
-  SbMemorySet(ptr, 'A', size);
+  memset(ptr, 'A', size);
   ptr2 = generic_allocator.root()->Realloc(ptr, size + 1, type_name);
   EXPECT_NE(ptr, ptr2);
   char* char_ptr2 = static_cast<char*>(ptr2);
@@ -1927,8 +1927,8 @@
         requested_size - kExtraAllocSize, type_name);
     void* ptr4 = generic_allocator.root()->Alloc(
         requested_size - kExtraAllocSize, type_name);
-    SbMemorySet(ptr1, 'A', requested_size - kExtraAllocSize);
-    SbMemorySet(ptr2, 'A', requested_size - kExtraAllocSize);
+    memset(ptr1, 'A', requested_size - kExtraAllocSize);
+    memset(ptr2, 'A', requested_size - kExtraAllocSize);
     generic_allocator.root()->Free(ptr2);
     generic_allocator.root()->Free(ptr1);
     {
@@ -1973,7 +1973,7 @@
   {
     char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
         (32 * kSystemPageSize) - kExtraAllocSize, type_name));
-    SbMemorySet(ptr1, 'A', (32 * kSystemPageSize) - kExtraAllocSize);
+    memset(ptr1, 'A', (32 * kSystemPageSize) - kExtraAllocSize);
     generic_allocator.root()->Free(ptr1);
     ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
         (31 * kSystemPageSize) - kExtraAllocSize, type_name));
@@ -2005,7 +2005,7 @@
   {
     char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
         (64 * kSystemPageSize) - kExtraAllocSize, type_name));
-    SbMemorySet(ptr1, 'A', (64 * kSystemPageSize) - kExtraAllocSize);
+    memset(ptr1, 'A', (64 * kSystemPageSize) - kExtraAllocSize);
     generic_allocator.root()->Free(ptr1);
     ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
         (61 * kSystemPageSize) - kExtraAllocSize, type_name));
@@ -2170,11 +2170,11 @@
   void* ptr = generic_allocator.root()->Alloc(kSize + 1, type_name);
   EXPECT_TRUE(ptr);
 
-  SbMemorySet(ptr, 0xbd, kSize + 1);
+  memset(ptr, 0xbd, kSize + 1);
   ptr = generic_allocator.root()->Realloc(ptr, kSize + 2, type_name);
   EXPECT_TRUE(ptr);
 
-  SbMemorySet(ptr, 0xbd, kSize + 2);
+  memset(ptr, 0xbd, kSize + 2);
   generic_allocator.root()->Free(ptr);
 }
 
diff --git a/src/base/allocator/partition_allocator/partition_page.h b/src/base/allocator/partition_allocator/partition_page.h
index 675f6e6..5addd74 100644
--- a/src/base/allocator/partition_allocator/partition_page.h
+++ b/src/base/allocator/partition_allocator/partition_page.h
@@ -211,7 +211,7 @@
   PartitionCookieCheckValue(reinterpret_cast<char*>(ptr) + slot_size -
                             kCookieSize);
 
-  SbMemorySet(ptr, kFreedByte, slot_size);
+  memset(ptr, kFreedByte, slot_size);
 #endif
 
   DCHECK(this->num_allocated_slots);
diff --git a/src/base/allocator/partition_allocator/partition_root_base.h b/src/base/allocator/partition_allocator/partition_root_base.h
index 70ae37a..6a444de 100644
--- a/src/base/allocator/partition_allocator/partition_root_base.h
+++ b/src/base/allocator/partition_allocator/partition_root_base.h
@@ -137,14 +137,14 @@
   // Fill the region kUninitializedByte or 0, and surround it with 2 cookies.
   PartitionCookieWriteValue(char_ret);
   if (!zero_fill) {
-    SbMemorySet(ret, kUninitializedByte, no_cookie_size);
+    memset(ret, kUninitializedByte, no_cookie_size);
   } else if (!is_already_zeroed) {
-    SbMemorySet(ret, 0, no_cookie_size);
+    memset(ret, 0, no_cookie_size);
   }
   PartitionCookieWriteValue(char_ret + kCookieSize + no_cookie_size);
 #else
   if (ret && zero_fill && !is_already_zeroed) {
-    SbMemorySet(ret, 0, size);
+    memset(ret, 0, size);
   }
 #endif
 
diff --git a/src/base/android/jni_android.cc b/src/base/android/jni_android.cc
index f202461..3fd2922 100644
--- a/src/base/android/jni_android.cc
+++ b/src/base/android/jni_android.cc
@@ -120,9 +120,9 @@
     // TODO(torne): move to an approach where we always use ClassLoader except
     // for the special case of base::android::GetClassLoader(), and change the
     // JNI generator to generate dot-separated names. http://crbug.com/461773
-    size_t bufsize = SbStringGetLength(class_name) + 1;
+    size_t bufsize = strlen(class_name) + 1;
     char dotted_name[bufsize];
-    SbMemoryMove(dotted_name, class_name, bufsize);
+    memmove(dotted_name, class_name, bufsize);
     for (size_t i = 0; i < bufsize; ++i) {
       if (dotted_name[i] == '/') {
         dotted_name[i] = '.';
diff --git a/src/base/android/jni_array_unittest.cc b/src/base/android/jni_array_unittest.cc
index a715f9f..207ff91 100644
--- a/src/base/android/jni_array_unittest.cc
+++ b/src/base/android/jni_array_unittest.cc
@@ -333,7 +333,7 @@
     snprintf(text, sizeof text, "%d", i);
     ScopedJavaLocalRef<jbyteArray> byte_array =
         ToJavaByteArray(env, reinterpret_cast<uint8_t*>(text),
-                        static_cast<size_t>(SbStringGetLength(text)));
+                        static_cast<size_t>(strlen(text)));
     ASSERT_TRUE(byte_array.obj());
 
     env->SetObjectArrayElement(array.obj(), i, byte_array.obj());
diff --git a/src/base/android/orderfile/orderfile_instrumentation.cc b/src/base/android/orderfile/orderfile_instrumentation.cc
index 1d8b09c..8c2def6 100644
--- a/src/base/android/orderfile/orderfile_instrumentation.cc
+++ b/src/base/android/orderfile/orderfile_instrumentation.cc
@@ -293,9 +293,9 @@
   Disable();
   g_data_index = 0;
   for (int i = 0; i < kPhases; i++) {
-    SbMemorySet(reinterpret_cast<uint32_t*>(g_data[i].offsets), 0,
+    memset(reinterpret_cast<uint32_t*>(g_data[i].offsets), 0,
                 sizeof(uint32_t) * kBitfieldSize);
-    SbMemorySet(reinterpret_cast<uint32_t*>(g_data[i].ordered_offsets), 0,
+    memset(reinterpret_cast<uint32_t*>(g_data[i].ordered_offsets), 0,
                 sizeof(uint32_t) * kMaxElements);
     g_data[i].index.store(0);
   }
diff --git a/src/base/atomicops_unittest.cc b/src/base/atomicops_unittest.cc
index 3b333b7..9c683e5 100644
--- a/src/base/atomicops_unittest.cc
+++ b/src/base/atomicops_unittest.cc
@@ -26,8 +26,8 @@
   } s;
 
   AtomicType prev_word_value, next_word_value;
-  SbMemorySet(&prev_word_value, 0xFF, sizeof(AtomicType));
-  SbMemorySet(&next_word_value, 0xEE, sizeof(AtomicType));
+  memset(&prev_word_value, 0xFF, sizeof(AtomicType));
+  memset(&next_word_value, 0xEE, sizeof(AtomicType));
 
   s.prev_word = prev_word_value;
   s.count = 0;
@@ -164,7 +164,7 @@
 template <class AtomicType>
 static AtomicType TestFillValue() {
   AtomicType val = 0;
-  SbMemorySet(&val, 0xa5, sizeof(AtomicType));
+  memset(&val, 0xa5, sizeof(AtomicType));
   return val;
 }
 
diff --git a/src/base/big_endian.cc b/src/base/big_endian.cc
index 88978d4..a6e197f 100644
--- a/src/base/big_endian.cc
+++ b/src/base/big_endian.cc
@@ -22,7 +22,7 @@
 bool BigEndianReader::ReadBytes(void* out, size_t len) {
   if (ptr_ + len > end_)
     return false;
-  SbMemoryCopy(out, ptr_, len);
+  memcpy(out, ptr_, len);
   ptr_ += len;
   return true;
 }
@@ -73,7 +73,7 @@
 bool BigEndianWriter::WriteBytes(const void* buf, size_t len) {
   if (ptr_ + len > end_)
     return false;
-  SbMemoryCopy(ptr_, buf, len);
+  memcpy(ptr_, buf, len);
   ptr_ += len;
   return true;
 }
diff --git a/src/base/big_endian_unittest.cc b/src/base/big_endian_unittest.cc
index f0e13b8..4ebf12f 100644
--- a/src/base/big_endian_unittest.cc
+++ b/src/base/big_endian_unittest.cc
@@ -75,7 +75,7 @@
                       0xF, 0x1A, 0x2B, 0x3C };
   char data[sizeof(expected)];
   char buf[] = { 0x2, 0x3 };
-  SbMemorySet(data, 0, sizeof(data));
+  memset(data, 0, sizeof(data));
   BigEndianWriter writer(data, sizeof(data));
 
   EXPECT_TRUE(writer.Skip(2));
@@ -84,7 +84,7 @@
   EXPECT_TRUE(writer.WriteU16(0x0506));
   EXPECT_TRUE(writer.WriteU32(0x0708090A));
   EXPECT_TRUE(writer.WriteU64(0x0B0C0D0E0F1A2B3Cllu));
-  EXPECT_EQ(0, SbMemoryCompare(expected, data, sizeof(expected)));
+  EXPECT_EQ(0, memcmp(expected, data, sizeof(expected)));
 }
 
 TEST(BigEndianWriterTest, RespectsLength) {
diff --git a/src/base/bind_internal.h b/src/base/bind_internal.h
index 8f38935..07b9933 100644
--- a/src/base/bind_internal.h
+++ b/src/base/bind_internal.h
@@ -14,7 +14,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/template_util.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 #if defined(OS_MACOSX) && !HAS_FEATURE(objc_arc)
 #include "base/mac/scoped_block.h"
diff --git a/src/base/bit_cast.h b/src/base/bit_cast.h
index 87049ed..1c33e3e 100644
--- a/src/base/bit_cast.h
+++ b/src/base/bit_cast.h
@@ -72,7 +72,7 @@
                 "bit_cast requires the source type to be copyable");
 
   Dest dest;
-  SbMemoryCopy(&dest, &source, sizeof(dest));
+  memcpy(&dest, &source, sizeof(dest));
   return dest;
 }
 
diff --git a/src/base/build_time_unittest.cc b/src/base/build_time_unittest.cc
index c3ebe88..2ca77ad 100644
--- a/src/base/build_time_unittest.cc
+++ b/src/base/build_time_unittest.cc
@@ -12,7 +12,7 @@
 TEST(BuildTime, DateLooksValid) {
   char build_date[] = BUILD_DATE;
 
-  EXPECT_EQ(20u, SbStringGetLength(build_date));
+  EXPECT_EQ(20u, strlen(build_date));
   EXPECT_EQ(' ', build_date[3]);
   EXPECT_EQ(' ', build_date[6]);
   EXPECT_EQ(' ', build_date[11]);
diff --git a/src/base/containers/flat_map.h b/src/base/containers/flat_map.h
index 4f0de16..474a6cb 100644
--- a/src/base/containers/flat_map.h
+++ b/src/base/containers/flat_map.h
@@ -12,7 +12,6 @@
 #include "base/containers/flat_tree.h"
 #include "base/logging.h"
 #include "base/template_util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
diff --git a/src/base/containers/flat_tree.h b/src/base/containers/flat_tree.h
index bca6cbd..8c7e5f0 100644
--- a/src/base/containers/flat_tree.h
+++ b/src/base/containers/flat_tree.h
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "base/template_util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
diff --git a/src/base/containers/span.h b/src/base/containers/span.h
index ddcd8a0..c336d07 100644
--- a/src/base/containers/span.h
+++ b/src/base/containers/span.h
@@ -20,7 +20,6 @@
 
 #include "base/logging.h"
 #include "base/stl_util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
@@ -193,14 +192,14 @@
   }
 
   constexpr span(T* data, size_t size) noexcept : data_(data), size_(size) {
-    CHECK14(Extent == dynamic_extent || Extent == size);
+    CHECK(Extent == dynamic_extent || Extent == size);
   }
 
   // Artificially templatized to break ambiguity for span(ptr, 0).
   template <typename = void>
   constexpr span(T* begin, T* end) noexcept : span(begin, end - begin) {
     // Note: CHECK_LE is not constexpr, hence regular CHECK must be used.
-    CHECK14(begin <= end);
+    CHECK(begin <= end);
   }
 
   template <
@@ -251,7 +250,7 @@
   constexpr span(const span<U, OtherExtent>& other)
       : span(other.data(), other.size()) {}
 
-  CONSTEXPR span& operator=(const span& other) noexcept = default;
+  constexpr span& operator=(const span& other) noexcept = default;
 
   ~span() noexcept = default;
 
@@ -260,7 +259,7 @@
   constexpr span<T, Count> first() const noexcept {
     static_assert(Extent == dynamic_extent || Count <= Extent,
                   "Count must not exceed Extent");
-    CHECK14(Extent != dynamic_extent || Count <= size());
+    CHECK(Extent != dynamic_extent || Count <= size());
     return {data(), Count};
   }
 
@@ -268,7 +267,7 @@
   constexpr span<T, Count> last() const noexcept {
     static_assert(Extent == dynamic_extent || Count <= Extent,
                   "Count must not exceed Extent");
-    CHECK14(Extent != dynamic_extent || Count <= size());
+    CHECK(Extent != dynamic_extent || Count <= size());
     return {data() + (size() - Count), Count};
   }
 
@@ -285,21 +284,21 @@
     static_assert(Extent == dynamic_extent || Count == dynamic_extent ||
                       Count <= Extent - Offset,
                   "Count must not exceed Extent - Offset");
-    CHECK14(Extent != dynamic_extent || Offset <= size());
-    CHECK14(Extent != dynamic_extent || Count == dynamic_extent ||
+    CHECK(Extent != dynamic_extent || Offset <= size());
+    CHECK(Extent != dynamic_extent || Count == dynamic_extent ||
             Count <= size() - Offset);
     return {data() + Offset, Count != dynamic_extent ? Count : size() - Offset};
   }
 
   constexpr span<T, dynamic_extent> first(size_t count) const noexcept {
     // Note: CHECK_LE is not constexpr, hence regular CHECK must be used.
-    CHECK14(count <= size());
+    CHECK(count <= size());
     return {data(), count};
   }
 
   constexpr span<T, dynamic_extent> last(size_t count) const noexcept {
     // Note: CHECK_LE is not constexpr, hence regular CHECK must be used.
-    CHECK14(count <= size());
+    CHECK(count <= size());
     return {data() + (size() - count), count};
   }
 
@@ -307,8 +306,8 @@
                                             size_t count = dynamic_extent) const
       noexcept {
     // Note: CHECK_LE is not constexpr, hence regular CHECK must be used.
-    CHECK14(offset <= size());
-    CHECK14(count == dynamic_extent || count <= size() - offset);
+    CHECK(offset <= size());
+    CHECK(count == dynamic_extent || count <= size() - offset);
     return {data() + offset, count != dynamic_extent ? count : size() - offset};
   }
 
@@ -320,13 +319,13 @@
   // [span.elem], span element access
   constexpr T& operator[](size_t idx) const noexcept {
     // Note: CHECK_LT is not constexpr, hence regular CHECK must be used.
-    CHECK14(idx < size());
+    CHECK(idx < size());
     return *(data() + idx);
   }
 
   constexpr T& operator()(size_t idx) const noexcept {
     // Note: CHECK_LT is not constexpr, hence regular CHECK must be used.
-    CHECK14(idx < size());
+    CHECK(idx < size());
     return *(data() + idx);
   }
 
@@ -368,7 +367,7 @@
 // [span.comparison], span comparison operators
 // Relational operators. Equality is a element-wise comparison.
 template <typename T, size_t X, typename U, size_t Y>
-CONSTEXPR bool operator==(span<T, X> lhs, span<U, Y> rhs) noexcept {
+constexpr bool operator==(span<T, X> lhs, span<U, Y> rhs) noexcept {
 #if __cplusplus < 201402L
   // With GNU at least, there exists an implementation of std::equal that is
   // replaced in C++14.
diff --git a/src/base/containers/span_unittest.cc b/src/base/containers/span_unittest.cc
index 9123743..dcfb9c8 100644
--- a/src/base/containers/span_unittest.cc
+++ b/src/base/containers/span_unittest.cc
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -32,7 +31,7 @@
 }
 
 TEST(SpanTest, ConstructFromDataAndSize) {
-  CONSTEXPR span<int> empty_span(nullptr, 0);
+  constexpr span<int> empty_span(nullptr, 0);
   EXPECT_TRUE(empty_span.empty());
   EXPECT_EQ(nullptr, empty_span.data());
 
@@ -54,7 +53,7 @@
 }
 
 TEST(SpanTest, ConstructFromPointerPair) {
-  CONSTEXPR span<int> empty_span(nullptr, nullptr);
+  constexpr span<int> empty_span(nullptr, nullptr);
   EXPECT_TRUE(empty_span.empty());
   EXPECT_EQ(nullptr, empty_span.data());
 
@@ -78,25 +77,25 @@
 TEST(SpanTest, ConstructFromConstexprArray) {
   static constexpr int kArray[] = {5, 4, 3, 2, 1};
 
-  CONSTEXPR span<const int> dynamic_span(kArray);
-  STATIC_ASSERT(kArray == dynamic_span.data(), "");
-  STATIC_ASSERT(base::size(kArray) == dynamic_span.size(), "");
+  constexpr span<const int> dynamic_span(kArray);
+  static_assert(kArray == dynamic_span.data(), "");
+  static_assert(base::size(kArray) == dynamic_span.size(), "");
 
-  STATIC_ASSERT(kArray[0] == dynamic_span[0], "");
-  STATIC_ASSERT(kArray[1] == dynamic_span[1], "");
-  STATIC_ASSERT(kArray[2] == dynamic_span[2], "");
-  STATIC_ASSERT(kArray[3] == dynamic_span[3], "");
-  STATIC_ASSERT(kArray[4] == dynamic_span[4], "");
+  static_assert(kArray[0] == dynamic_span[0], "");
+  static_assert(kArray[1] == dynamic_span[1], "");
+  static_assert(kArray[2] == dynamic_span[2], "");
+  static_assert(kArray[3] == dynamic_span[3], "");
+  static_assert(kArray[4] == dynamic_span[4], "");
 
-  CONSTEXPR span<const int, base::size(kArray)> static_span(kArray);
-  STATIC_ASSERT(kArray == static_span.data(), "");
-  STATIC_ASSERT(base::size(kArray) == static_span.size(), "");
+  constexpr span<const int, base::size(kArray)> static_span(kArray);
+  static_assert(kArray == static_span.data(), "");
+  static_assert(base::size(kArray) == static_span.size(), "");
 
-  STATIC_ASSERT(kArray[0] == static_span[0], "");
-  STATIC_ASSERT(kArray[1] == static_span[1], "");
-  STATIC_ASSERT(kArray[2] == static_span[2], "");
-  STATIC_ASSERT(kArray[3] == static_span[3], "");
-  STATIC_ASSERT(kArray[4] == static_span[4], "");
+  static_assert(kArray[0] == static_span[0], "");
+  static_assert(kArray[1] == static_span[1], "");
+  static_assert(kArray[2] == static_span[2], "");
+  static_assert(kArray[3] == static_span[3], "");
+  static_assert(kArray[4] == static_span[4], "");
 }
 
 TEST(SpanTest, ConstructFromArray) {
@@ -283,191 +282,191 @@
 
 TEST(SpanTest, TemplatedFirst) {
   static constexpr int array[] = {1, 2, 3};
-  CONSTEXPR span<const int, 3> span(array);
+  constexpr span<const int, 3> span(array);
 
   {
-    CONSTEXPR auto subspan = span.first<0>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(0u == subspan.size(), "");
-    STATIC_ASSERT(0u == decltype(subspan)::extent, "");
+    constexpr auto subspan = span.first<0>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(0u == subspan.size(), "");
+    static_assert(0u == decltype(subspan)::extent, "");
   }
 
   {
-    CONSTEXPR auto subspan = span.first<1>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(1u == subspan.size(), "");
-    STATIC_ASSERT(1u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
+    constexpr auto subspan = span.first<1>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(1u == subspan.size(), "");
+    static_assert(1u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.first<2>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(2u == subspan.size(), "");
-    STATIC_ASSERT(2u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
-    STATIC_ASSERT(2 == subspan[1], "");
+    constexpr auto subspan = span.first<2>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(2u == subspan.size(), "");
+    static_assert(2u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
+    static_assert(2 == subspan[1], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.first<3>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(3u == subspan.size(), "");
-    STATIC_ASSERT(3u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
-    STATIC_ASSERT(2 == subspan[1], "");
-    STATIC_ASSERT(3 == subspan[2], "");
+    constexpr auto subspan = span.first<3>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(3u == subspan.size(), "");
+    static_assert(3u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
+    static_assert(2 == subspan[1], "");
+    static_assert(3 == subspan[2], "");
   }
 }
 
 TEST(SpanTest, TemplatedLast) {
   static constexpr int array[] = {1, 2, 3};
-  CONSTEXPR span<const int, 3> span(array);
+  constexpr span<const int, 3> span(array);
 
   {
-    CONSTEXPR auto subspan = span.last<0>();
-    STATIC_ASSERT(span.data() + 3 == subspan.data(), "");
-    STATIC_ASSERT(0u == subspan.size(), "");
-    STATIC_ASSERT(0u == decltype(subspan)::extent, "");
+    constexpr auto subspan = span.last<0>();
+    static_assert(span.data() + 3 == subspan.data(), "");
+    static_assert(0u == subspan.size(), "");
+    static_assert(0u == decltype(subspan)::extent, "");
   }
 
   {
-    CONSTEXPR auto subspan = span.last<1>();
-    STATIC_ASSERT(span.data() + 2 == subspan.data(), "");
-    STATIC_ASSERT(1u == subspan.size(), "");
-    STATIC_ASSERT(1u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(3 == subspan[0], "");
+    constexpr auto subspan = span.last<1>();
+    static_assert(span.data() + 2 == subspan.data(), "");
+    static_assert(1u == subspan.size(), "");
+    static_assert(1u == decltype(subspan)::extent, "");
+    static_assert(3 == subspan[0], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.last<2>();
-    STATIC_ASSERT(span.data() + 1 == subspan.data(), "");
-    STATIC_ASSERT(2u == subspan.size(), "");
-    STATIC_ASSERT(2u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(2 == subspan[0], "");
-    STATIC_ASSERT(3 == subspan[1], "");
+    constexpr auto subspan = span.last<2>();
+    static_assert(span.data() + 1 == subspan.data(), "");
+    static_assert(2u == subspan.size(), "");
+    static_assert(2u == decltype(subspan)::extent, "");
+    static_assert(2 == subspan[0], "");
+    static_assert(3 == subspan[1], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.last<3>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(3u == subspan.size(), "");
-    STATIC_ASSERT(3u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
-    STATIC_ASSERT(2 == subspan[1], "");
-    STATIC_ASSERT(3 == subspan[2], "");
+    constexpr auto subspan = span.last<3>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(3u == subspan.size(), "");
+    static_assert(3u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
+    static_assert(2 == subspan[1], "");
+    static_assert(3 == subspan[2], "");
   }
 }
 
 TEST(SpanTest, TemplatedSubspan) {
   static constexpr int array[] = {1, 2, 3};
-  CONSTEXPR span<const int, 3> span(array);
+  constexpr span<const int, 3> span(array);
 
   {
-    CONSTEXPR auto subspan = span.subspan<0>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(3u == subspan.size(), "");
-    STATIC_ASSERT(3u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
-    STATIC_ASSERT(2 == subspan[1], "");
-    STATIC_ASSERT(3 == subspan[2], "");
+    constexpr auto subspan = span.subspan<0>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(3u == subspan.size(), "");
+    static_assert(3u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
+    static_assert(2 == subspan[1], "");
+    static_assert(3 == subspan[2], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<1>();
-    STATIC_ASSERT(span.data() + 1 == subspan.data(), "");
-    STATIC_ASSERT(2u == subspan.size(), "");
-    STATIC_ASSERT(2u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(2 == subspan[0], "");
-    STATIC_ASSERT(3 == subspan[1], "");
+    constexpr auto subspan = span.subspan<1>();
+    static_assert(span.data() + 1 == subspan.data(), "");
+    static_assert(2u == subspan.size(), "");
+    static_assert(2u == decltype(subspan)::extent, "");
+    static_assert(2 == subspan[0], "");
+    static_assert(3 == subspan[1], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<2>();
-    STATIC_ASSERT(span.data() + 2 == subspan.data(), "");
-    STATIC_ASSERT(1u == subspan.size(), "");
-    STATIC_ASSERT(1u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(3 == subspan[0], "");
+    constexpr auto subspan = span.subspan<2>();
+    static_assert(span.data() + 2 == subspan.data(), "");
+    static_assert(1u == subspan.size(), "");
+    static_assert(1u == decltype(subspan)::extent, "");
+    static_assert(3 == subspan[0], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<3>();
-    STATIC_ASSERT(span.data() + 3 == subspan.data(), "");
-    STATIC_ASSERT(0u == subspan.size(), "");
-    STATIC_ASSERT(0u == decltype(subspan)::extent, "");
+    constexpr auto subspan = span.subspan<3>();
+    static_assert(span.data() + 3 == subspan.data(), "");
+    static_assert(0u == subspan.size(), "");
+    static_assert(0u == decltype(subspan)::extent, "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<0, 0>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(0u == subspan.size(), "");
-    STATIC_ASSERT(0u == decltype(subspan)::extent, "");
+    constexpr auto subspan = span.subspan<0, 0>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(0u == subspan.size(), "");
+    static_assert(0u == decltype(subspan)::extent, "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<1, 0>();
-    STATIC_ASSERT(span.data() + 1 == subspan.data(), "");
-    STATIC_ASSERT(0u == subspan.size(), "");
-    STATIC_ASSERT(0u == decltype(subspan)::extent, "");
+    constexpr auto subspan = span.subspan<1, 0>();
+    static_assert(span.data() + 1 == subspan.data(), "");
+    static_assert(0u == subspan.size(), "");
+    static_assert(0u == decltype(subspan)::extent, "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<2, 0>();
-    STATIC_ASSERT(span.data() + 2 == subspan.data(), "");
-    STATIC_ASSERT(0u == subspan.size(), "");
-    STATIC_ASSERT(0u == decltype(subspan)::extent, "");
+    constexpr auto subspan = span.subspan<2, 0>();
+    static_assert(span.data() + 2 == subspan.data(), "");
+    static_assert(0u == subspan.size(), "");
+    static_assert(0u == decltype(subspan)::extent, "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<0, 1>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(1u == subspan.size(), "");
-    STATIC_ASSERT(1u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
+    constexpr auto subspan = span.subspan<0, 1>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(1u == subspan.size(), "");
+    static_assert(1u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<1, 1>();
-    STATIC_ASSERT(span.data() + 1 == subspan.data(), "");
-    STATIC_ASSERT(1u == subspan.size(), "");
-    STATIC_ASSERT(1u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(2 == subspan[0], "");
+    constexpr auto subspan = span.subspan<1, 1>();
+    static_assert(span.data() + 1 == subspan.data(), "");
+    static_assert(1u == subspan.size(), "");
+    static_assert(1u == decltype(subspan)::extent, "");
+    static_assert(2 == subspan[0], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<2, 1>();
-    STATIC_ASSERT(span.data() + 2 == subspan.data(), "");
-    STATIC_ASSERT(1u == subspan.size(), "");
-    STATIC_ASSERT(1u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(3 == subspan[0], "");
+    constexpr auto subspan = span.subspan<2, 1>();
+    static_assert(span.data() + 2 == subspan.data(), "");
+    static_assert(1u == subspan.size(), "");
+    static_assert(1u == decltype(subspan)::extent, "");
+    static_assert(3 == subspan[0], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<0, 2>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(2u == subspan.size(), "");
-    STATIC_ASSERT(2u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
-    STATIC_ASSERT(2 == subspan[1], "");
+    constexpr auto subspan = span.subspan<0, 2>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(2u == subspan.size(), "");
+    static_assert(2u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
+    static_assert(2 == subspan[1], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<1, 2>();
-    STATIC_ASSERT(span.data() + 1 == subspan.data(), "");
-    STATIC_ASSERT(2u == subspan.size(), "");
-    STATIC_ASSERT(2u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(2 == subspan[0], "");
-    STATIC_ASSERT(3 == subspan[1], "");
+    constexpr auto subspan = span.subspan<1, 2>();
+    static_assert(span.data() + 1 == subspan.data(), "");
+    static_assert(2u == subspan.size(), "");
+    static_assert(2u == decltype(subspan)::extent, "");
+    static_assert(2 == subspan[0], "");
+    static_assert(3 == subspan[1], "");
   }
 
   {
-    CONSTEXPR auto subspan = span.subspan<0, 3>();
-    STATIC_ASSERT(span.data() == subspan.data(), "");
-    STATIC_ASSERT(3u == subspan.size(), "");
-    STATIC_ASSERT(3u == decltype(subspan)::extent, "");
-    STATIC_ASSERT(1 == subspan[0], "");
-    STATIC_ASSERT(2 == subspan[1], "");
-    STATIC_ASSERT(3 == subspan[2], "");
+    constexpr auto subspan = span.subspan<0, 3>();
+    static_assert(span.data() == subspan.data(), "");
+    static_assert(3u == subspan.size(), "");
+    static_assert(3u == decltype(subspan)::extent, "");
+    static_assert(1 == subspan[0], "");
+    static_assert(2 == subspan[1], "");
+    static_assert(3 == subspan[2], "");
   }
 }
 
@@ -871,24 +870,24 @@
 
 TEST(SpanTest, OperatorAt) {
   static constexpr int kArray[] = {1, 6, 1, 8, 0};
-  CONSTEXPR span<const int> span(kArray);
+  constexpr span<const int> span(kArray);
 
-  STATIC_ASSERT(kArray[0] == span[0], "span[0] does not equal kArray[0]");
-  STATIC_ASSERT(kArray[1] == span[1], "span[1] does not equal kArray[1]");
-  STATIC_ASSERT(kArray[2] == span[2], "span[2] does not equal kArray[2]");
-  STATIC_ASSERT(kArray[3] == span[3], "span[3] does not equal kArray[3]");
-  STATIC_ASSERT(kArray[4] == span[4], "span[4] does not equal kArray[4]");
+  static_assert(kArray[0] == span[0], "span[0] does not equal kArray[0]");
+  static_assert(kArray[1] == span[1], "span[1] does not equal kArray[1]");
+  static_assert(kArray[2] == span[2], "span[2] does not equal kArray[2]");
+  static_assert(kArray[3] == span[3], "span[3] does not equal kArray[3]");
+  static_assert(kArray[4] == span[4], "span[4] does not equal kArray[4]");
 
-  STATIC_ASSERT(kArray[0] == span(0), "span(0) does not equal kArray[0]");
-  STATIC_ASSERT(kArray[1] == span(1), "span(1) does not equal kArray[1]");
-  STATIC_ASSERT(kArray[2] == span(2), "span(2) does not equal kArray[2]");
-  STATIC_ASSERT(kArray[3] == span(3), "span(3) does not equal kArray[3]");
-  STATIC_ASSERT(kArray[4] == span(4), "span(4) does not equal kArray[4]");
+  static_assert(kArray[0] == span(0), "span(0) does not equal kArray[0]");
+  static_assert(kArray[1] == span(1), "span(1) does not equal kArray[1]");
+  static_assert(kArray[2] == span(2), "span(2) does not equal kArray[2]");
+  static_assert(kArray[3] == span(3), "span(3) does not equal kArray[3]");
+  static_assert(kArray[4] == span(4), "span(4) does not equal kArray[4]");
 }
 
 TEST(SpanTest, Iterator) {
   static constexpr int kArray[] = {1, 6, 1, 8, 0};
-  CONSTEXPR span<const int> span(kArray);
+  constexpr span<const int> span(kArray);
 
   std::vector<int> results;
   for (int i : span)
@@ -898,7 +897,7 @@
 
 TEST(SpanTest, ReverseIterator) {
   static constexpr int kArray[] = {1, 6, 1, 8, 0};
-  CONSTEXPR span<const int> span(kArray);
+  constexpr span<const int> span(kArray);
 
 #if __cplusplus < 201402L
   // With GNU at least, there exists an implementation of std::equal that is
@@ -937,13 +936,13 @@
 TEST(SpanTest, Equality) {
   static constexpr int kArray1[] = {3, 1, 4, 1, 5};
   static constexpr int kArray2[] = {3, 1, 4, 1, 5};
-  CONSTEXPR span<const int> span1(kArray1);
-  CONSTEXPR span<const int, 5> span2(kArray2);
+  constexpr span<const int> span1(kArray1);
+  constexpr span<const int, 5> span2(kArray2);
 
   EXPECT_EQ(span1, span2);
 
   static constexpr int kArray3[] = {2, 7, 1, 8, 3};
-  CONSTEXPR span<const int> span3(kArray3);
+  constexpr span<const int> span3(kArray3);
 
   EXPECT_FALSE(span1 == span3);
 
@@ -956,13 +955,13 @@
 TEST(SpanTest, Inequality) {
   static constexpr int kArray1[] = {2, 3, 5, 7, 11};
   static constexpr int kArray2[] = {1, 4, 6, 8, 9};
-  CONSTEXPR span<const int> span1(kArray1);
-  CONSTEXPR span<const int, 5> span2(kArray2);
+  constexpr span<const int> span1(kArray1);
+  constexpr span<const int, 5> span2(kArray2);
 
   EXPECT_NE(span1, span2);
 
   static constexpr int kArray3[] = {2, 3, 5, 7, 11};
-  CONSTEXPR span<const int> span3(kArray3);
+  constexpr span<const int> span3(kArray3);
 
   EXPECT_FALSE(span1 != span3);
 
@@ -975,13 +974,13 @@
 TEST(SpanTest, LessThan) {
   static constexpr int kArray1[] = {2, 3, 5, 7, 11};
   static constexpr int kArray2[] = {2, 3, 5, 7, 11, 13};
-  CONSTEXPR span<const int> span1(kArray1);
-  CONSTEXPR span<const int, 6> span2(kArray2);
+  constexpr span<const int> span1(kArray1);
+  constexpr span<const int, 6> span2(kArray2);
 
   EXPECT_LT(span1, span2);
 
   static constexpr int kArray3[] = {2, 3, 5, 7, 11};
-  CONSTEXPR span<const int> span3(kArray3);
+  constexpr span<const int> span3(kArray3);
 
   EXPECT_FALSE(span1 < span3);
 
@@ -994,14 +993,14 @@
 TEST(SpanTest, LessEqual) {
   static constexpr int kArray1[] = {2, 3, 5, 7, 11};
   static constexpr int kArray2[] = {2, 3, 5, 7, 11, 13};
-  CONSTEXPR span<const int> span1(kArray1);
-  CONSTEXPR span<const int, 6> span2(kArray2);
+  constexpr span<const int> span1(kArray1);
+  constexpr span<const int, 6> span2(kArray2);
 
   EXPECT_LE(span1, span1);
   EXPECT_LE(span1, span2);
 
   static constexpr int kArray3[] = {2, 3, 5, 7, 10};
-  CONSTEXPR span<const int> span3(kArray3);
+  constexpr span<const int> span3(kArray3);
 
   EXPECT_FALSE(span1 <= span3);
 
@@ -1014,13 +1013,13 @@
 TEST(SpanTest, GreaterThan) {
   static constexpr int kArray1[] = {2, 3, 5, 7, 11, 13};
   static constexpr int kArray2[] = {2, 3, 5, 7, 11};
-  CONSTEXPR span<const int> span1(kArray1);
-  CONSTEXPR span<const int, 5> span2(kArray2);
+  constexpr span<const int> span1(kArray1);
+  constexpr span<const int, 5> span2(kArray2);
 
   EXPECT_GT(span1, span2);
 
   static constexpr int kArray3[] = {2, 3, 5, 7, 11, 13};
-  CONSTEXPR span<const int> span3(kArray3);
+  constexpr span<const int> span3(kArray3);
 
   EXPECT_FALSE(span1 > span3);
 
@@ -1033,14 +1032,14 @@
 TEST(SpanTest, GreaterEqual) {
   static constexpr int kArray1[] = {2, 3, 5, 7, 11, 13};
   static constexpr int kArray2[] = {2, 3, 5, 7, 11};
-  CONSTEXPR span<const int> span1(kArray1);
-  CONSTEXPR span<const int, 5> span2(kArray2);
+  constexpr span<const int> span1(kArray1);
+  constexpr span<const int, 5> span2(kArray2);
 
   EXPECT_GE(span1, span1);
   EXPECT_GE(span1, span2);
 
   static constexpr int kArray3[] = {2, 3, 5, 7, 12};
-  CONSTEXPR span<const int> span3(kArray3);
+  constexpr span<const int> span3(kArray3);
 
   EXPECT_FALSE(span1 >= span3);
 
@@ -1112,7 +1111,7 @@
 
 TEST(SpanTest, MakeSpanFromConstexprArray) {
   static constexpr int kArray[] = {1, 2, 3, 4, 5};
-  CONSTEXPR span<const int> span(kArray);
+  constexpr span<const int> span(kArray);
   EXPECT_EQ(span, make_span(kArray));
   static_assert(decltype(make_span(kArray))::extent == 5, "");
 }
@@ -1160,60 +1159,60 @@
 
 TEST(SpanTest, MakeSpanFromDynamicSpan) {
   static constexpr int kArray[] = {1, 2, 3, 4, 5};
-  CONSTEXPR span<const int> span(kArray);
+  constexpr span<const int> span(kArray);
   static_assert(std::is_same<decltype(span)::element_type,
                              decltype(make_span(span))::element_type>::value,
                 "make_span(span) should have the same element_type as span");
 
-  STATIC_ASSERT(span.data() == make_span(span).data(),
+  static_assert(span.data() == make_span(span).data(),
                 "make_span(span) should have the same data() as span");
 
-  STATIC_ASSERT(span.size() == make_span(span).size(),
+  static_assert(span.size() == make_span(span).size(),
                 "make_span(span) should have the same size() as span");
 
-  STATIC_ASSERT(decltype(make_span(span))::extent == decltype(span)::extent,
+  static_assert(decltype(make_span(span))::extent == decltype(span)::extent,
                 "make_span(span) should have the same extent as span");
 }
 
 TEST(SpanTest, MakeSpanFromStaticSpan) {
   static constexpr int kArray[] = {1, 2, 3, 4, 5};
-  CONSTEXPR span<const int, 5> span(kArray);
+  constexpr span<const int, 5> span(kArray);
   static_assert(std::is_same<decltype(span)::element_type,
                              decltype(make_span(span))::element_type>::value,
                 "make_span(span) should have the same element_type as span");
 
-  STATIC_ASSERT(span.data() == make_span(span).data(),
+  static_assert(span.data() == make_span(span).data(),
                 "make_span(span) should have the same data() as span");
 
-  STATIC_ASSERT(span.size() == make_span(span).size(),
+  static_assert(span.size() == make_span(span).size(),
                 "make_span(span) should have the same size() as span");
 
-  STATIC_ASSERT(decltype(make_span(span))::extent == decltype(span)::extent,
+  static_assert(decltype(make_span(span))::extent == decltype(span)::extent,
                 "make_span(span) should have the same extent as span");
 }
 
 TEST(SpanTest, EnsureConstexprGoodness) {
   static constexpr int kArray[] = {5, 4, 3, 2, 1};
-  CONSTEXPR span<const int> constexpr_span(kArray);
+  constexpr span<const int> constexpr_span(kArray);
   const size_t size = 2;
 
   const size_t start = 1;
-  CONSTEXPR span<const int> subspan =
+  constexpr span<const int> subspan =
       constexpr_span.subspan(start, start + size);
   for (size_t i = 0; i < subspan.size(); ++i)
     EXPECT_EQ(kArray[start + i], subspan[i]);
 
-  CONSTEXPR span<const int> firsts = constexpr_span.first(size);
+  constexpr span<const int> firsts = constexpr_span.first(size);
   for (size_t i = 0; i < firsts.size(); ++i)
     EXPECT_EQ(kArray[i], firsts[i]);
 
-  CONSTEXPR span<const int> lasts = constexpr_span.last(size);
+  constexpr span<const int> lasts = constexpr_span.last(size);
   for (size_t i = 0; i < lasts.size(); ++i) {
     const size_t j = (arraysize(kArray) - size) + i;
     EXPECT_EQ(kArray[j], lasts[i]);
   }
 
-  CONSTEXPR int item = constexpr_span[size];
+  constexpr int item = constexpr_span[size];
   EXPECT_EQ(kArray[size], item);
 }
 
diff --git a/src/base/containers/stack_container_unittest.cc b/src/base/containers/stack_container_unittest.cc
index 20c3ccd..56cc42f 100644
--- a/src/base/containers/stack_container_unittest.cc
+++ b/src/base/containers/stack_container_unittest.cc
@@ -105,7 +105,7 @@
 template <size_t alignment>
 class AlignedData {
  public:
-  AlignedData() { SbMemorySet(data_, 0, alignment); }
+  AlignedData() { memset(data_, 0, alignment); }
   ~AlignedData() = default;
   alignas(alignment) char data_[alignment];
 };
diff --git a/src/base/containers/vector_buffer.h b/src/base/containers/vector_buffer.h
index 2a60383..ea1caa3 100644
--- a/src/base/containers/vector_buffer.h
+++ b/src/base/containers/vector_buffer.h
@@ -128,7 +128,7 @@
                                     int>::type = 0>
   static void MoveRange(T* from_begin, T* from_end, T* to) {
     CHECK(!RangesOverlap(from_begin, from_end, to));
-    SbMemoryCopy(
+    memcpy(
         to, from_begin,
         CheckSub(get_uintptr(from_end), get_uintptr(from_begin)).ValueOrDie());
   }
diff --git a/src/base/cpu.cc b/src/base/cpu.cc
index 42ccf16..52fed28 100644
--- a/src/base/cpu.cc
+++ b/src/base/cpu.cc
@@ -115,14 +115,14 @@
     std::istringstream iss(contents);
     std::string line;
     while (std::getline(iss, line)) {
-      if (line.compare(0, SbStringGetLength(kModelNamePrefix),
+      if (line.compare(0, strlen(kModelNamePrefix),
                        kModelNamePrefix) == 0)
         return new std::string(
-            line.substr(SbStringGetLength(kModelNamePrefix)));
-      if (line.compare(0, SbStringGetLength(kProcessorPrefix),
+            line.substr(strlen(kModelNamePrefix)));
+      if (line.compare(0, strlen(kProcessorPrefix),
                        kProcessorPrefix) == 0)
         return new std::string(
-            line.substr(SbStringGetLength(kProcessorPrefix)));
+            line.substr(strlen(kProcessorPrefix)));
     }
 
     return new std::string();
@@ -157,7 +157,7 @@
   static constexpr size_t kVendorNameSize = 3 * sizeof(cpu_info[1]);
   static_assert(kVendorNameSize < arraysize(cpu_string),
                 "cpu_string too small");
-  SbMemoryCopy(cpu_string, &cpu_info[1], kVendorNameSize);
+  memcpy(cpu_string, &cpu_info[1], kVendorNameSize);
   cpu_string[kVendorNameSize] = '\0';
   cpu_vendor_ = cpu_string;
 
@@ -218,7 +218,7 @@
     for (int parameter = kParameterStart; parameter <= kParameterEnd;
          ++parameter) {
       __cpuid(cpu_info, parameter);
-      SbMemoryCopy(&cpu_string[i], cpu_info, sizeof(cpu_info));
+      memcpy(&cpu_string[i], cpu_info, sizeof(cpu_info));
       i += sizeof(cpu_info);
     }
     cpu_string[i] = '\0';
diff --git a/src/base/debug/activity_analyzer_unittest.cc b/src/base/debug/activity_analyzer_unittest.cc
index 3dac24f..2393178 100644
--- a/src/base/debug/activity_analyzer_unittest.cc
+++ b/src/base/debug/activity_analyzer_unittest.cc
@@ -36,7 +36,7 @@
 class TestActivityTracker : public ThreadActivityTracker {
  public:
   TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size)
-      : ThreadActivityTracker(SbMemorySet(memory.get(), 0, mem_size), mem_size),
+      : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size),
         mem_segment_(std::move(memory)) {}
 
   ~TestActivityTracker() override = default;
@@ -318,7 +318,7 @@
       EXPECT_EQ(sizeof(string2a), user_data.at("ref2").GetReference().size());
       ASSERT_TRUE(ContainsKey(user_data, "sref2"));
       EXPECT_EQ(string2b, user_data.at("sref2").GetStringReference().data());
-      EXPECT_EQ(SbStringGetLength(string2b),
+      EXPECT_EQ(strlen(string2b),
                 user_data.at("sref2").GetStringReference().size());
     }
 
@@ -342,7 +342,7 @@
     EXPECT_EQ(string1a, user_data.at("ref1").GetReference().data());
     EXPECT_EQ(sizeof(string1a), user_data.at("ref1").GetReference().size());
     EXPECT_EQ(string1b, user_data.at("sref1").GetStringReference().data());
-    EXPECT_EQ(SbStringGetLength(string1b),
+    EXPECT_EQ(strlen(string1b),
               user_data.at("sref1").GetStringReference().size());
   }
 
@@ -396,7 +396,7 @@
   EXPECT_EQ(sizeof(string1), snapshot.at("ref").GetReference().size());
   ASSERT_TRUE(ContainsKey(snapshot, "sref"));
   EXPECT_EQ(string2, snapshot.at("sref").GetStringReference().data());
-  EXPECT_EQ(SbStringGetLength(string2),
+  EXPECT_EQ(strlen(string2),
             snapshot.at("sref").GetStringReference().size());
 }
 
diff --git a/src/base/debug/activity_tracker.cc b/src/base/debug/activity_tracker.cc
index 91236a7..1476d1a 100644
--- a/src/base/debug/activity_tracker.cc
+++ b/src/base/debug/activity_tracker.cc
@@ -518,7 +518,7 @@
     char* name_memory = reinterpret_cast<char*>(header) + sizeof(FieldHeader);
     void* value_memory =
         reinterpret_cast<char*>(header) + sizeof(FieldHeader) + name_extent;
-    SbMemoryCopy(name_memory, name.data(), name_size);
+    memcpy(name_memory, name.data(), name_size);
     header->type.store(type, std::memory_order_release);
 
     // Create an entry in |values_| so that this field can be found and changed
@@ -541,7 +541,7 @@
   DCHECK_EQ(type, info->type);
   size = std::min(size, info->extent);
   info->size_ptr->store(0, std::memory_order_seq_cst);
-  SbMemoryCopy(info->memory, memory, size);
+  memcpy(info->memory, memory, size);
   info->size_ptr->store(size, std::memory_order_release);
 }
 
@@ -955,12 +955,12 @@
     output_snapshot->activity_stack.resize(count);
     if (count > 0) {
       // Copy the existing contents. Memcpy is used for speed.
-      SbMemoryCopy(&output_snapshot->activity_stack[0], stack_,
+      memcpy(&output_snapshot->activity_stack[0], stack_,
                    count * sizeof(Activity));
     }
 
     // Capture the last exception.
-    SbMemoryCopy(&output_snapshot->last_exception, &header_->last_exception,
+    memcpy(&output_snapshot->last_exception, &header_->last_exception,
                  sizeof(Activity));
 
     // TODO(bcwhite): Snapshot other things here.
@@ -984,7 +984,7 @@
     // if the trailing NUL were missing. Now limit the length if the actual
     // name is shorter.
     output_snapshot->thread_name.resize(
-        SbStringGetLength(output_snapshot->thread_name.c_str()));
+        strlen(output_snapshot->thread_name.c_str()));
 
     // If the data ID has changed then the tracker has exited and the memory
     // reused by a new one. Try again.
@@ -1125,7 +1125,7 @@
   info->size = static_cast<size_t>(size);
   info->timestamp = timestamp;
   info->age = age;
-  SbMemoryCopy(info->identifier, identifier, sizeof(info->identifier));
+  memcpy(info->identifier, identifier, sizeof(info->identifier));
 
   if (offsetof(ModuleInfoRecord, pickle) + pickle_size > record_size)
     return false;
@@ -1151,8 +1151,8 @@
   record->size = info.size;
   record->timestamp = info.timestamp;
   record->age = info.age;
-  SbMemoryCopy(record->identifier, info.identifier, sizeof(identifier));
-  SbMemoryCopy(record->pickle, pickler.data(), pickler.size());
+  memcpy(record->identifier, info.identifier, sizeof(identifier));
+  memcpy(record->pickle, pickler.data(), pickler.size());
   record->pickle_size = pickler.size();
   record->changes.store(0, std::memory_order_relaxed);
 
@@ -1611,7 +1611,7 @@
   char* memory = allocator_->GetAsArray<char>(ref, kTypeIdGlobalLogMessage,
                                               message.size() + 1);
   if (memory) {
-    SbMemoryCopy(memory, message.data(), message.size());
+    memcpy(memory, message.data(), message.size());
     allocator_->MakeIterable(ref);
   }
 }
diff --git a/src/base/debug/activity_tracker_unittest.cc b/src/base/debug/activity_tracker_unittest.cc
index 841354c..4110b5d 100644
--- a/src/base/debug/activity_tracker_unittest.cc
+++ b/src/base/debug/activity_tracker_unittest.cc
@@ -32,7 +32,7 @@
 class TestActivityTracker : public ThreadActivityTracker {
  public:
   TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size)
-      : ThreadActivityTracker(SbMemorySet(memory.get(), 0, mem_size), mem_size),
+      : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size),
         mem_segment_(std::move(memory)) {}
 
   ~TestActivityTracker() override = default;
@@ -110,7 +110,7 @@
 
 TEST_F(ActivityTrackerTest, UserDataTest) {
   char buffer[256];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   ActivityUserData data(buffer, sizeof(buffer));
   size_t space = sizeof(buffer) - sizeof(ActivityUserData::MemoryHeader);
   ASSERT_EQ(space, data.available_);
@@ -519,7 +519,7 @@
   // Make a copy of the thread-tracker state so it can be restored later.
   const size_t tracker_size = global->allocator()->GetAllocSize(tracker_ref);
   std::unique_ptr<char[]> tracker_copy(new char[tracker_size]);
-  SbMemoryCopy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size);
+  memcpy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size);
 
   // Change the objects to appear to be owned by another process. Use a "past"
   // time so that exit-time is always later than create-time.
@@ -569,7 +569,7 @@
 
   // Restore memory contents and types so things don't crash when doing real
   // process clean-up.
-  SbMemoryCopy(const_cast<void*>(thread->GetBaseAddress()), tracker_copy.get(),
+  memcpy(const_cast<void*>(thread->GetBaseAddress()), tracker_copy.get(),
                tracker_size);
   global->allocator()->ChangeType(
       proc_data_ref, GlobalActivityTracker::kTypeIdProcessDataRecord,
diff --git a/src/base/debug/invalid_access_win.cc b/src/base/debug/invalid_access_win.cc
index 4b8ea60..393d8b2 100644
--- a/src/base/debug/invalid_access_win.cc
+++ b/src/base/debug/invalid_access_win.cc
@@ -41,7 +41,7 @@
     CHECK(addr);
     // Corrupt heap header.
     char* addr_mutable = reinterpret_cast<char*>(addr);
-    SbMemorySet(addr_mutable - sizeof(addr), 0xCC, sizeof(addr));
+    memset(addr_mutable - sizeof(addr), 0xCC, sizeof(addr));
 
     HeapFree(heap, 0, addr);
     HeapDestroy(heap);
diff --git a/src/base/debug/stack_trace.cc b/src/base/debug/stack_trace.cc
index d273b99..97cf8fb 100644
--- a/src/base/debug/stack_trace.cc
+++ b/src/base/debug/stack_trace.cc
@@ -209,7 +209,7 @@
 StackTrace::StackTrace(const void* const* trace, size_t count) {
   count = std::min(count, arraysize(trace_));
   if (count)
-    SbMemoryCopy(trace_, trace, count * sizeof(trace_[0]));
+    memcpy(trace_, trace, count * sizeof(trace_[0]));
   count_ = count;
 }
 
diff --git a/src/base/debug/stack_trace_android.cc b/src/base/debug/stack_trace_android.cc
index 80111ab..a9cda92 100644
--- a/src/base/debug/stack_trace_android.cc
+++ b/src/base/debug/stack_trace_android.cc
@@ -64,7 +64,7 @@
   // with SIGPIPE ignored as well.
   // TODO(phajdan.jr): De-duplicate this SIGPIPE code.
   struct sigaction action;
-  SbMemorySet(&action, 0, sizeof(action));
+  memset(&action, 0, sizeof(action));
   action.sa_handler = SIG_IGN;
   sigemptyset(&action.sa_mask);
   return (sigaction(SIGPIPE, &action, NULL) == 0);
diff --git a/src/base/debug/stack_trace_fuchsia.cc b/src/base/debug/stack_trace_fuchsia.cc
index 0cc657a..e57b867 100644
--- a/src/base/debug/stack_trace_fuchsia.cc
+++ b/src/base/debug/stack_trace_fuchsia.cc
@@ -106,7 +106,7 @@
   // if we keep hitting problems with truncation, find a way to plumb argv[0]
   // through to here instead, e.g. using CommandLine::GetProgramName().
   char app_name[arraysize(SymbolMap::Entry::name)];
-  SbStringCopyUnsafe(app_name, kProcessNamePrefix);
+  strcpy(app_name, kProcessNamePrefix);
   zx_status_t status = zx_object_get_property(
       process, ZX_PROP_NAME, app_name + kProcessNamePrefixLen,
       sizeof(app_name) - kProcessNamePrefixLen);
diff --git a/src/base/debug/stack_trace_posix.cc b/src/base/debug/stack_trace_posix.cc
index cac9539..72144e5 100644
--- a/src/base/debug/stack_trace_posix.cc
+++ b/src/base/debug/stack_trace_posix.cc
@@ -116,7 +116,7 @@
       // Insert the demangled symbol.
       text->insert(mangled_start, demangled_symbol.get());
       // Next time, we'll start right after the demangled symbol we inserted.
-      search_from = mangled_start + SbStringGetLength(demangled_symbol.get());
+      search_from = mangled_start + strlen(demangled_symbol.get());
     } else {
       // Failed to demangle.  Retry after the "_Z" we just found.
       search_from = mangled_start + 2;
@@ -223,7 +223,7 @@
   // NOTE: This code MUST be async-signal safe (it's used by in-process
   // stack dumping signal handler). NO malloc or stdio is allowed here.
   ignore_result(
-      HANDLE_EINTR(write(STDERR_FILENO, output, SbStringGetLength(output))));
+      HANDLE_EINTR(write(STDERR_FILENO, output, strlen(output))));
 }
 
 void StackDumpSignalHandler(int signal, siginfo_t* info, void* void_context) {
@@ -242,7 +242,7 @@
     // replaced this signal handler upon entry, but we want to stay
     // installed. Thus, we reinstall ourselves before returning.
     struct sigaction action;
-    SbMemorySet(&action, 0, sizeof(action));
+    memset(&action, 0, sizeof(action));
     action.sa_flags = SA_RESETHAND | SA_SIGINFO;
     action.sa_sigaction = &StackDumpSignalHandler;
     sigemptyset(&action.sa_mask);
@@ -587,7 +587,7 @@
         start_address = region.start;
         base_address = region.base;
         if (file_path && file_path_size > 0) {
-          SbStringCopy(file_path, region.path.c_str(), file_path_size);
+          strncpy(file_path, region.path.c_str(), file_path_size);
           // Ensure null termination.
           file_path[file_path_size - 1] = '\0';
         }
@@ -615,7 +615,7 @@
       static_assert(SELFMAG <= sizeof(ElfW(Ehdr)), "SELFMAG too large");
       if ((r.permissions & MappedMemoryRegion::READ) &&
           safe_memcpy(&ehdr, r.start, sizeof(ElfW(Ehdr))) &&
-          SbMemoryCompare(ehdr.e_ident, ELFMAG, SELFMAG) == 0) {
+          memcmp(ehdr.e_ident, ELFMAG, SELFMAG) == 0) {
         switch (ehdr.e_type) {
           case ET_EXEC:
             cur_base = 0;
@@ -778,7 +778,7 @@
   // to be ignored.  Therefore, when testing that same code, it should run
   // with SIGPIPE ignored as well.
   struct sigaction sigpipe_action;
-  SbMemorySet(&sigpipe_action, 0, sizeof(sigpipe_action));
+  memset(&sigpipe_action, 0, sizeof(sigpipe_action));
   sigpipe_action.sa_handler = SIG_IGN;
   sigemptyset(&sigpipe_action.sa_mask);
   bool success = (sigaction(SIGPIPE, &sigpipe_action, nullptr) == 0);
@@ -787,7 +787,7 @@
   WarmUpBacktrace();
 
   struct sigaction action;
-  SbMemorySet(&action, 0, sizeof(action));
+  memset(&action, 0, sizeof(action));
   action.sa_flags = SA_RESETHAND | SA_SIGINFO;
   action.sa_sigaction = &StackDumpSignalHandler;
   sigemptyset(&action.sa_mask);
diff --git a/src/base/debug/stack_trace_win.cc b/src/base/debug/stack_trace_win.cc
index 2faa624..a24662d 100644
--- a/src/base/debug/stack_trace_win.cc
+++ b/src/base/debug/stack_trace_win.cc
@@ -215,7 +215,7 @@
           kMaxNameLength * sizeof(wchar_t) +
           sizeof(ULONG64) - 1) /
         sizeof(ULONG64)];
-      SbMemorySet(buffer, 0, sizeof(buffer));
+      memset(buffer, 0, sizeof(buffer));
 
       // Initialize symbol information retrieval structures.
       DWORD64 sym_displacement = 0;
@@ -308,14 +308,14 @@
   // context may have had more register state (YMM, etc) than we need to unwind
   // the stack. Typically StackWalk64 only needs integer and control registers.
   CONTEXT context_copy;
-  SbMemoryCopy(&context_copy, context_record, sizeof(context_copy));
+  memcpy(&context_copy, context_record, sizeof(context_copy));
   context_copy.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;
 
   // When walking an exception stack, we need to use StackWalk64().
   count_ = 0;
   // Initialize stack walking.
   STACKFRAME64 stack_frame;
-  SbMemorySet(&stack_frame, 0, sizeof(stack_frame));
+  memset(&stack_frame, 0, sizeof(stack_frame));
 #if defined(_WIN64)
   int machine_type = IMAGE_FILE_MACHINE_AMD64;
   stack_frame.AddrPC.Offset = context_record->Rip;
diff --git a/src/base/debug/thread_heap_usage_tracker.cc b/src/base/debug/thread_heap_usage_tracker.cc
index e2df48a..77fcb2b 100644
--- a/src/base/debug/thread_heap_usage_tracker.cc
+++ b/src/base/debug/thread_heap_usage_tracker.cc
@@ -234,7 +234,7 @@
     allocator_usage = new ThreadHeapUsage();
     static_assert(std::is_pod<ThreadHeapUsage>::value,
                   "AllocatorDispatch must be POD");
-    SbMemorySet(allocator_usage, 0, sizeof(*allocator_usage));
+    memset(allocator_usage, 0, sizeof(*allocator_usage));
     ThreadAllocationUsage().Set(allocator_usage);
   }
 
@@ -268,7 +268,7 @@
   // instance persists the outer scope's usage stats. On destruction, this
   // instance will restore the outer scope's usage stats with this scope's
   // usage added.
-  SbMemorySet(thread_usage_, 0, sizeof(*thread_usage_));
+  memset(thread_usage_, 0, sizeof(*thread_usage_));
 }
 
 void ThreadHeapUsageTracker::Stop(bool usage_is_exclusive) {
diff --git a/src/base/environment.cc b/src/base/environment.cc
index 31954d4..4bfb484 100644
--- a/src/base/environment.cc
+++ b/src/base/environment.cc
@@ -233,7 +233,7 @@
   char* storage_data = reinterpret_cast<char*>(
       &result.get()[result_indices.size() + 1]);
   if (!value_storage.empty())
-    SbMemoryCopy(storage_data, value_storage.data(), value_storage.size());
+    memcpy(storage_data, value_storage.data(), value_storage.size());
 
   // Fill array of pointers at the beginning of the result.
   for (size_t i = 0; i < result_indices.size(); i++)
diff --git a/src/base/feature_list.cc b/src/base/feature_list.cc
index 3472a40..d8e00ac 100644
--- a/src/base/feature_list.cc
+++ b/src/base/feature_list.cc
@@ -185,7 +185,7 @@
     entry->pickle_size = pickle.size();
 
     char* dst = reinterpret_cast<char*>(entry) + sizeof(FeatureEntry);
-    SbMemoryCopy(dst, pickle.data(), pickle.size());
+    memcpy(dst, pickle.data(), pickle.size());
 
     allocator->MakeIterable(entry);
   }
diff --git a/src/base/files/dir_reader_linux.h b/src/base/files/dir_reader_linux.h
index 8fc91f7..acce538 100644
--- a/src/base/files/dir_reader_linux.h
+++ b/src/base/files/dir_reader_linux.h
@@ -34,7 +34,7 @@
       : fd_(open(directory_path, O_RDONLY | O_DIRECTORY)),
         offset_(0),
         size_(0) {
-    SbMemorySet(buf_, 0, sizeof(buf_));
+    memset(buf_, 0, sizeof(buf_));
   }
 
   ~DirReaderLinux() {
diff --git a/src/base/files/file_enumerator_posix.cc b/src/base/files/file_enumerator_posix.cc
index 732964c..cea5e22 100644
--- a/src/base/files/file_enumerator_posix.cc
+++ b/src/base/files/file_enumerator_posix.cc
@@ -27,7 +27,7 @@
     // symlinks.
     if (!(errno == ENOENT && !show_links))
       DPLOG(ERROR) << "Couldn't stat" << path.value();
-    SbMemorySet(st, 0, sizeof(*st));
+    memset(st, 0, sizeof(*st));
   }
 }
 
@@ -36,7 +36,7 @@
 // FileEnumerator::FileInfo ----------------------------------------------------
 
 FileEnumerator::FileInfo::FileInfo() {
-  SbMemorySet(&stat_, 0, sizeof(stat_));
+  memset(&stat_, 0, sizeof(stat_));
 }
 
 bool FileEnumerator::FileInfo::IsDirectory() const {
diff --git a/src/base/files/file_enumerator_starboard.cc b/src/base/files/file_enumerator_starboard.cc
index 23047ca..386b2dd 100644
--- a/src/base/files/file_enumerator_starboard.cc
+++ b/src/base/files/file_enumerator_starboard.cc
@@ -27,7 +27,7 @@
 // FileEnumerator::FileInfo ----------------------------------------------------
 
 FileEnumerator::FileInfo::FileInfo() {
-  SbMemorySet(&sb_info_, 0, sizeof(sb_info_));
+  memset(&sb_info_, 0, sizeof(sb_info_));
 }
 
 bool FileEnumerator::FileInfo::IsDirectory() const {
@@ -102,7 +102,7 @@
     // TODO: Make sure this follows symlinks on relevant platforms.
     if (!SbFileGetPathInfo(full_name.value().c_str(), &info.sb_info_)) {
       DPLOG(ERROR) << "Couldn't SbFileGetInfo on " << full_name.value();
-      SbMemorySet(&info.sb_info_, 0, sizeof(info.sb_info_));
+      memset(&info.sb_info_, 0, sizeof(info.sb_info_));
     }
     return info;
   };
@@ -119,7 +119,7 @@
 
   while (SbDirectoryGetNext(dir, entry.data(), entry.size())) {
     const char dot_dot_str[] = "..";
-    if (!SbStringCompare(entry.data(), dot_dot_str, sizeof(dot_dot_str))) {
+    if (!strncmp(entry.data(), dot_dot_str, sizeof(dot_dot_str))) {
       found_dot_dot = true;
     }
     ret.push_back(GenerateEntry(entry.data()));
@@ -129,7 +129,7 @@
 
   while (SbDirectoryGetNext(dir, &entry)) {
     const char dot_dot_str[] = "..";
-    if (!SbStringCompare(entry.name, dot_dot_str, sizeof(dot_dot_str))) {
+    if (!strncmp(entry.name, dot_dot_str, sizeof(dot_dot_str))) {
       found_dot_dot = true;
     }
     ret.push_back(GenerateEntry(entry.name));
diff --git a/src/base/files/file_enumerator_win.cc b/src/base/files/file_enumerator_win.cc
index 1c0a2d2..b299eb0 100644
--- a/src/base/files/file_enumerator_win.cc
+++ b/src/base/files/file_enumerator_win.cc
@@ -36,7 +36,7 @@
 // FileEnumerator::FileInfo ----------------------------------------------------
 
 FileEnumerator::FileInfo::FileInfo() {
-  SbMemorySet(&find_data_, 0, sizeof(find_data_));
+  memset(&find_data_, 0, sizeof(find_data_));
 }
 
 bool FileEnumerator::FileInfo::IsDirectory() const {
@@ -92,7 +92,7 @@
       folder_search_policy_(folder_search_policy) {
   // INCLUDE_DOT_DOT must not be specified if recursive.
   DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_)));
-  SbMemorySet(&find_data_, 0, sizeof(find_data_));
+  memset(&find_data_, 0, sizeof(find_data_));
   pending_paths_.push(root_path);
 }
 
@@ -107,7 +107,7 @@
     return FileInfo();
   }
   FileInfo ret;
-  SbMemoryCopy(&ret.find_data_, &find_data_, sizeof(find_data_));
+  memcpy(&ret.find_data_, &find_data_, sizeof(find_data_));
   return ret;
 }
 
diff --git a/src/base/files/file_path.cc b/src/base/files/file_path.cc
index 9c224b0..043d144 100644
--- a/src/base/files/file_path.cc
+++ b/src/base/files/file_path.cc
@@ -1238,7 +1238,7 @@
                                                           length);
     if (success) {
       // Reduce result.length() to actual string length.
-      result.resize(SbStringGetLength(result.c_str()));
+      result.resize(strlen(result.c_str()));
     } else {
       // An error occurred -> clear result.
       result.clear();
diff --git a/src/base/files/file_proxy.cc b/src/base/files/file_proxy.cc
index 6e0574f..a6ff4bd 100644
--- a/src/base/files/file_proxy.cc
+++ b/src/base/files/file_proxy.cc
@@ -209,7 +209,7 @@
         buffer_(new char[bytes_to_write]),
         bytes_to_write_(bytes_to_write),
         bytes_written_(0) {
-    SbMemoryCopy(buffer_.get(), buffer, bytes_to_write);
+    memcpy(buffer_.get(), buffer, bytes_to_write);
   }
 
   void RunWork(int64_t offset) {
diff --git a/src/base/files/file_proxy_unittest.cc b/src/base/files/file_proxy_unittest.cc
index 57b6b46..4e4e932 100644
--- a/src/base/files/file_proxy_unittest.cc
+++ b/src/base/files/file_proxy_unittest.cc
@@ -65,7 +65,7 @@
                int bytes_read) {
     error_ = error;
     buffer_.resize(bytes_read);
-    SbMemoryCopy(&buffer_[0], data, bytes_read);
+    memcpy(&buffer_[0], data, bytes_read);
     RunLoop::QuitCurrentWhenIdleDeprecated();
   }
 
diff --git a/src/base/files/file_util.cc b/src/base/files/file_util.cc
index d8e445a..8654654 100644
--- a/src/base/files/file_util.cc
+++ b/src/base/files/file_util.cc
@@ -77,8 +77,8 @@
     return false;
   }
 
-  return SbMemoryCompare(file1_content.get(), file2_content.get(),
-                         file1_length) == 0;
+  return memcmp(file1_content.get(), file2_content.get(),
+                file1_length) == 0;
 #else
   std::ifstream file1(filename1.value().c_str(),
                       std::ios::in | std::ios::binary);
diff --git a/src/base/files/file_util_unittest.cc b/src/base/files/file_util_unittest.cc
index 58828db..44570e2 100644
--- a/src/base/files/file_util_unittest.cc
+++ b/src/base/files/file_util_unittest.cc
@@ -130,7 +130,7 @@
   REPARSE_DATA_BUFFER* data = reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer);
 
   data->ReparseTag = 0xa0000003;
-  SbMemoryCopy(data->MountPointReparseBuffer.PathBuffer, target,
+  memcpy(data->MountPointReparseBuffer.PathBuffer, target,
                size_target + 2);
 
   data->MountPointReparseBuffer.SubstituteNameLength = size_target;
@@ -2843,8 +2843,8 @@
           .Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
 
   // Create test file.
-  ASSERT_EQ(static_cast<int>(SbStringGetLength(kTestData)),
-            WriteFile(file_path, kTestData, SbStringGetLength(kTestData)));
+  ASSERT_EQ(static_cast<int>(strlen(kTestData)),
+            WriteFile(file_path, kTestData, strlen(kTestData)));
 
   EXPECT_TRUE(ReadFileToString(file_path, &data));
   EXPECT_EQ(kTestData, data);
@@ -2926,14 +2926,14 @@
   int fd = open(pipe_path.value().c_str(), O_WRONLY);
   CHECK_NE(-1, fd);
   size_t written = 0;
-  while (written < SbStringGetLength(kTestData)) {
+  while (written < strlen(kTestData)) {
     ssize_t res =
-        write(fd, kTestData + written, SbStringGetLength(kTestData) - written);
+        write(fd, kTestData + written, strlen(kTestData) - written);
     if (res == -1)
       break;
     written += res;
   }
-  CHECK_EQ(SbStringGetLength(kTestData), written);
+  CHECK_EQ(strlen(kTestData), written);
   CHECK_EQ(0, close(fd));
   return 0;
 }
@@ -3091,8 +3091,8 @@
 
   DWORD written;
   EXPECT_TRUE(
-      ::WriteFile(ph, kTestData, SbStringGetLength(kTestData), &written, NULL));
-  EXPECT_EQ(SbStringGetLength(kTestData), written);
+      ::WriteFile(ph, kTestData, strlen(kTestData), &written, NULL));
+  EXPECT_EQ(strlen(kTestData), written);
   CloseHandle(ph);
   return 0;
 }
diff --git a/src/base/files/memory_mapped_file_unittest.cc b/src/base/files/memory_mapped_file_unittest.cc
index 0295994..33a39e4 100644
--- a/src/base/files/memory_mapped_file_unittest.cc
+++ b/src/base/files/memory_mapped_file_unittest.cc
@@ -28,7 +28,7 @@
 // Check that the watermark sequence is consistent with the |offset| provided.
 bool CheckBufferContents(const uint8_t* data, size_t size, size_t offset) {
   std::unique_ptr<uint8_t[]> test_data(CreateTestBuffer(size, offset));
-  return SbMemoryCompare(test_data.get(), data, size) == 0;
+  return memcmp(test_data.get(), data, size) == 0;
 }
 
 class MemoryMappedFileTest : public PlatformTest {
diff --git a/src/base/hash_unittest.cc b/src/base/hash_unittest.cc
index cc8a2ca..cb2897d 100644
--- a/src/base/hash_unittest.cc
+++ b/src/base/hash_unittest.cc
@@ -68,16 +68,16 @@
   const char* str;
   // Empty string (should hash to 0).
   str = "";
-  EXPECT_EQ(0u, Hash(str, SbStringGetLength(str)));
+  EXPECT_EQ(0u, Hash(str, strlen(str)));
 
   // Simple test.
   str = "hello world";
-  EXPECT_EQ(2794219650u, Hash(str, SbStringGetLength(str)));
+  EXPECT_EQ(2794219650u, Hash(str, strlen(str)));
 
   // Ensure that it stops reading after the given length, and does not expect a
   // null byte.
   str = "hello world; don't read this part";
-  EXPECT_EQ(2794219650u, Hash(str, SbStringGetLength("hello world")));
+  EXPECT_EQ(2794219650u, Hash(str, strlen("hello world")));
 }
 
 }  // namespace base
diff --git a/src/base/i18n/streaming_utf8_validator_unittest.cc b/src/base/i18n/streaming_utf8_validator_unittest.cc
index 2c8023d..c115cee 100644
--- a/src/base/i18n/streaming_utf8_validator_unittest.cc
+++ b/src/base/i18n/streaming_utf8_validator_unittest.cc
@@ -77,7 +77,7 @@
   // whether it is valid UTF-8 or not.
   void TestNumber(uint32_t n) const {
     char test[sizeof n];
-    SbMemoryCopy(test, &n, sizeof n);
+    memcpy(test, &n, sizeof n);
     StreamingUtf8Validator validator;
     EXPECT_EQ(IsStringUtf8(test, sizeof n),
               validator.AddBytes(test, sizeof n) == VALID_ENDPOINT)
@@ -214,10 +214,10 @@
 
   void Advance() {
     if (index_ < arraysize(valid) &&
-        prefix_length_ < SbStringGetLength(valid[index_]))
+        prefix_length_ < strlen(valid[index_]))
       ++prefix_length_;
     while (index_ < arraysize(valid) &&
-           prefix_length_ == SbStringGetLength(valid[index_])) {
+           prefix_length_ == strlen(valid[index_])) {
       ++index_;
       prefix_length_ = 1;
     }
@@ -309,7 +309,7 @@
 TEST(StreamingUtf8ValidatorTest, HelloWorld) {
   static const char kHelloWorld[] = "Hello, World!";
   EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes(
-                                kHelloWorld, SbStringGetLength(kHelloWorld)));
+                                kHelloWorld, strlen(kHelloWorld)));
 }
 
 // Check that the Reset() method works.
diff --git a/src/base/json/json_correctness_fuzzer.cc b/src/base/json/json_correctness_fuzzer.cc
index 935dbdf..c7d6d6f 100644
--- a/src/base/json/json_correctness_fuzzer.cc
+++ b/src/base/json/json_correctness_fuzzer.cc
@@ -29,7 +29,7 @@
   // Create a copy of input buffer, as otherwise we don't catch
   // overflow that touches the last byte (which is used in options).
   std::unique_ptr<char[]> input(new char[size - 1]);
-  SbMemoryCopy(input.get(), data, size - 1);
+  memcpy(input.get(), data, size - 1);
 
   base::StringPiece input_string(input.get(), size - 1);
 
diff --git a/src/base/json/json_parser_unittest.cc b/src/base/json/json_parser_unittest.cc
index f0e8573..0e5e10c 100644
--- a/src/base/json/json_parser_unittest.cc
+++ b/src/base/json/json_parser_unittest.cc
@@ -34,9 +34,9 @@
   // owned by |owner|, returning a StringPiece to |owner|.
   StringPiece MakeNotNullTerminatedInput(const char* input,
                                          std::unique_ptr<char[]>* owner) {
-    size_t str_len = SbStringGetLength(input);
+    size_t str_len = strlen(input);
     owner->reset(new char[str_len]);
-    SbMemoryCopy(owner->get(), input, str_len);
+    memcpy(owner->get(), input, str_len);
     return StringPiece(owner->get(), str_len);
   }
 
diff --git a/src/base/json/json_reader_fuzzer.cc b/src/base/json/json_reader_fuzzer.cc
index 1f2d049..2642646 100644
--- a/src/base/json/json_reader_fuzzer.cc
+++ b/src/base/json/json_reader_fuzzer.cc
@@ -14,7 +14,7 @@
   // Create a copy of input buffer, as otherwise we don't catch
   // overflow that touches the last byte (which is used in options).
   std::unique_ptr<char[]> input(new char[size - 1]);
-  SbMemoryCopy(input.get(), data, size - 1);
+  memcpy(input.get(), data, size - 1);
 
   base::StringPiece input_string(input.get(), size - 1);
 
diff --git a/src/base/json/json_value_serializer_unittest.cc b/src/base/json/json_value_serializer_unittest.cc
index 399bbd4..b12e5e7 100644
--- a/src/base/json/json_value_serializer_unittest.cc
+++ b/src/base/json/json_value_serializer_unittest.cc
@@ -151,8 +151,8 @@
   ASSERT_TRUE(tempdir.CreateUniqueTempDir());
   // Write it down in the file.
   FilePath temp_file(tempdir.GetPath().AppendASCII("test.json"));
-  ASSERT_EQ(static_cast<int>(SbStringGetLength(kProperJSON)),
-            WriteFile(temp_file, kProperJSON, SbStringGetLength(kProperJSON)));
+  ASSERT_EQ(static_cast<int>(strlen(kProperJSON)),
+            WriteFile(temp_file, kProperJSON, strlen(kProperJSON)));
 
   // Try to deserialize it through the serializer.
   JSONFileValueDeserializer file_deserializer(temp_file);
@@ -175,9 +175,9 @@
   ASSERT_TRUE(tempdir.CreateUniqueTempDir());
   // Write it down in the file.
   FilePath temp_file(tempdir.GetPath().AppendASCII("test.json"));
-  ASSERT_EQ(static_cast<int>(SbStringGetLength(kProperJSONWithCommas)),
+  ASSERT_EQ(static_cast<int>(strlen(kProperJSONWithCommas)),
             WriteFile(temp_file, kProperJSONWithCommas,
-                      SbStringGetLength(kProperJSONWithCommas)));
+                      strlen(kProperJSONWithCommas)));
 
   // Try to deserialize it through the serializer.
   JSONFileValueDeserializer file_deserializer(temp_file);
diff --git a/src/base/json/string_escape_fuzzer.cc b/src/base/json/string_escape_fuzzer.cc
index 072f5ee..3cd8509 100644
--- a/src/base/json/string_escape_fuzzer.cc
+++ b/src/base/json/string_escape_fuzzer.cc
@@ -19,7 +19,7 @@
   // overflow that touches the last byte (which is used in put_in_quotes).
   size_t actual_size_char8 = size - 1;
   std::unique_ptr<char[]> input(new char[actual_size_char8]);
-  SbMemoryCopy(input.get(), data, actual_size_char8);
+  memcpy(input.get(), data, actual_size_char8);
 
   base::StringPiece input_string(input.get(), actual_size_char8);
   std::string escaped_string;
diff --git a/src/base/linux_util.cc b/src/base/linux_util.cc
index 3b2701e..60a42df 100644
--- a/src/base/linux_util.cc
+++ b/src/base/linux_util.cc
@@ -139,8 +139,8 @@
   if (output.length() > 0) {
     // lsb_release -d should return: Description:<tab>Distro Info
     const char field[] = "Description:\t";
-    if (output.compare(0, SbStringGetLength(field), field) == 0) {
-      SetLinuxDistro(output.substr(SbStringGetLength(field)));
+    if (output.compare(0, strlen(field), field) == 0) {
+      SetLinuxDistro(output.substr(strlen(field)));
     }
   }
   distro_state_singleton->CheckFinished();
diff --git a/src/base/logging.cc b/src/base/logging.cc
index c89ed7f..ee5704a 100644
--- a/src/base/logging.cc
+++ b/src/base/logging.cc
@@ -1203,13 +1203,13 @@
   if (level >= g_min_log_level && message) {
 #if defined(STARBOARD)
     SbLogRaw(message);
-    const size_t message_len = SbStringGetLength(message);
+    const size_t message_len = strlen(message);
     if (message_len > 0 && message[message_len - 1] != '\n') {
       SbLogRaw("\n");
     }
 #else
     size_t bytes_written = 0;
-    const size_t message_len = SbStringGetLength(message);
+    const size_t message_len = strlen(message);
     int rv;
     while (bytes_written < message_len) {
       rv = HANDLE_EINTR(
diff --git a/src/base/logging_win.cc b/src/base/logging_win.cc
index 152713a..1334ac3 100644
--- a/src/base/logging_win.cc
+++ b/src/base/logging_win.cc
@@ -83,7 +83,7 @@
     // The line.
     event.SetField(2, sizeof(line), &line);
     // The file.
-    event.SetField(3, SbStringGetLength(file) + 1, file);
+    event.SetField(3, strlen(file) + 1, file);
     // And finally the message.
     event.SetField(4, message.length() + 1 - message_start,
         message.c_str() + message_start);
diff --git a/src/base/md5.cc b/src/base/md5.cc
index 143a03f..bd91416 100644
--- a/src/base/md5.cc
+++ b/src/base/md5.cc
@@ -190,10 +190,10 @@
 
     t = 64 - t;
     if (len < t) {
-      SbMemoryCopy(p, buf, len);
+      memcpy(p, buf, len);
       return;
     }
-    SbMemoryCopy(p, buf, t);
+    memcpy(p, buf, t);
     byteReverse(ctx->in, 16);
     MD5Transform(ctx->buf, reinterpret_cast<uint32_t*>(ctx->in));
     buf += t;
@@ -203,7 +203,7 @@
   /* Process data in 64-byte chunks */
 
   while (len >= 64) {
-    SbMemoryCopy(ctx->in, buf, 64);
+    memcpy(ctx->in, buf, 64);
     byteReverse(ctx->in, 16);
     MD5Transform(ctx->buf, reinterpret_cast<uint32_t*>(ctx->in));
     buf += 64;
@@ -212,7 +212,7 @@
 
   /* Handle any remaining bytes of data. */
 
-  SbMemoryCopy(ctx->in, buf, len);
+  memcpy(ctx->in, buf, len);
 }
 
 /*
@@ -238,35 +238,35 @@
   /* Pad out to 56 mod 64 */
   if (count < 8) {
     /* Two lots of padding:  Pad the first block to 64 bytes */
-    SbMemorySet(p, 0, count);
+    memset(p, 0, count);
     byteReverse(ctx->in, 16);
     MD5Transform(ctx->buf, reinterpret_cast<uint32_t*>(ctx->in));
 
     /* Now fill the next block with 56 bytes */
-    SbMemorySet(ctx->in, 0, 56);
+    memset(ctx->in, 0, 56);
   } else {
     /* Pad block to 56 bytes */
-    SbMemorySet(p, 0, count - 8);
+    memset(p, 0, count - 8);
   }
   byteReverse(ctx->in, 14);
 
   /* Append length in bits and transform */
-  SbMemoryCopy(&ctx->in[14 * sizeof(ctx->bits[0])], &ctx->bits[0],
+  memcpy(&ctx->in[14 * sizeof(ctx->bits[0])], &ctx->bits[0],
                sizeof(ctx->bits[0]));
-  SbMemoryCopy(&ctx->in[15 * sizeof(ctx->bits[1])], &ctx->bits[1],
+  memcpy(&ctx->in[15 * sizeof(ctx->bits[1])], &ctx->bits[1],
                sizeof(ctx->bits[1]));
 
   MD5Transform(ctx->buf, reinterpret_cast<uint32_t*>(ctx->in));
   byteReverse(reinterpret_cast<uint8_t*>(ctx->buf), 4);
-  SbMemoryCopy(digest->a, ctx->buf, 16);
-  SbMemorySet(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
+  memcpy(digest->a, ctx->buf, 16);
+  memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
 }
 
 void MD5IntermediateFinal(MD5Digest* digest, const MD5Context* context) {
   /* MD5Final mutates the MD5Context*. Make a copy for generating the
      intermediate value. */
   MD5Context context_copy;
-  SbMemoryCopy(&context_copy, context, sizeof(context_copy));
+  memcpy(&context_copy, context, sizeof(context_copy));
   MD5Final(digest, &context_copy);
 }
 
diff --git a/src/base/md5_unittest.cc b/src/base/md5_unittest.cc
index 841d7d6..8df9d65 100644
--- a/src/base/md5_unittest.cc
+++ b/src/base/md5_unittest.cc
@@ -39,7 +39,7 @@
   MD5Digest digest;
   const char data[] = "";
 
-  MD5Sum(data, SbStringGetLength(data), &digest);
+  MD5Sum(data, strlen(data), &digest);
 
   int expected[] = {
     0xd4, 0x1d, 0x8c, 0xd9,
@@ -56,7 +56,7 @@
   MD5Digest digest;
   const char data[] = "a";
 
-  MD5Sum(data, SbStringGetLength(data), &digest);
+  MD5Sum(data, strlen(data), &digest);
 
   int expected[] = {
     0x0c, 0xc1, 0x75, 0xb9,
@@ -247,10 +247,10 @@
 
   // The header and full digest pairs are the same, and they aren't the same as
   // each other.
-  EXPECT_TRUE(!SbMemoryCompare(&header_digest, &check_header_digest,
+  EXPECT_TRUE(!memcmp(&header_digest, &check_header_digest,
                                sizeof(header_digest)));
-  EXPECT_TRUE(!SbMemoryCompare(&digest, &check_full_digest, sizeof(digest)));
-  EXPECT_TRUE(SbMemoryCompare(&digest, &header_digest, sizeof(digest)));
+  EXPECT_TRUE(!memcmp(&digest, &check_full_digest, sizeof(digest)));
+  EXPECT_TRUE(memcmp(&digest, &header_digest, sizeof(digest)));
 }
 
 }  // namespace base
diff --git a/src/base/memory/discardable_shared_memory_unittest.cc b/src/base/memory/discardable_shared_memory_unittest.cc
index 805477e..6320be7 100644
--- a/src/base/memory/discardable_shared_memory_unittest.cc
+++ b/src/base/memory/discardable_shared_memory_unittest.cc
@@ -409,7 +409,7 @@
   ASSERT_TRUE(rv);
 
   // Initialize all memory to '0xaa'.
-  SbMemorySet(memory2.memory(), 0xaa, kDataSize);
+  memset(memory2.memory(), 0xaa, kDataSize);
 
   // Unlock memory.
   memory2.SetNow(Time::FromDoubleT(1));
@@ -425,7 +425,7 @@
   // Check that reading memory after it has been purged is returning
   // zero-filled pages.
   uint8_t expected_data[kDataSize] = {};
-  EXPECT_EQ(SbMemoryCompare(memory2.memory(), expected_data, kDataSize), 0);
+  EXPECT_EQ(memcmp(memory2.memory(), expected_data, kDataSize), 0);
 }
 #endif
 
diff --git a/src/base/memory/ptr_util.h b/src/base/memory/ptr_util.h
index 0f61dd7..42f4f49 100644
--- a/src/base/memory/ptr_util.h
+++ b/src/base/memory/ptr_util.h
@@ -8,8 +8,6 @@
 #include <memory>
 #include <utility>
 
-#include "nb/cpp14oncpp11.h"
-
 namespace base {
 
 // Helper to transfer ownership of a raw pointer to a std::unique_ptr<T>.
diff --git a/src/base/memory/ref_counted.h b/src/base/memory/ref_counted.h
index c19072a..d4d71f8 100644
--- a/src/base/memory/ref_counted.h
+++ b/src/base/memory/ref_counted.h
@@ -153,7 +153,7 @@
 
  protected:
   explicit constexpr RefCountedThreadSafeBase(StartRefCountFromZeroTag) {}
-  explicit CONSTEXPR RefCountedThreadSafeBase(StartRefCountFromOneTag)
+  explicit constexpr RefCountedThreadSafeBase(StartRefCountFromOneTag)
       : ref_count_(1) {
 #if DCHECK_IS_ON()
     needs_adopt_ref_ = true;
diff --git a/src/base/memory/ref_counted_memory.cc b/src/base/memory/ref_counted_memory.cc
index 9239ffc..c3058a1 100644
--- a/src/base/memory/ref_counted_memory.cc
+++ b/src/base/memory/ref_counted_memory.cc
@@ -15,7 +15,7 @@
 bool RefCountedMemory::Equals(
     const scoped_refptr<RefCountedMemory>& other) const {
   return other.get() && size() == other->size() &&
-         (SbMemoryCompare(front(), other->front(), size()) == 0);
+         (memcmp(front(), other->front(), size()) == 0);
 }
 
 RefCountedMemory::RefCountedMemory() = default;
diff --git a/src/base/memory/ref_counted_memory_unittest.cc b/src/base/memory/ref_counted_memory_unittest.cc
index 3f4eb09..62dc44a 100644
--- a/src/base/memory/ref_counted_memory_unittest.cc
+++ b/src/base/memory/ref_counted_memory_unittest.cc
@@ -78,7 +78,7 @@
   static const char kData[] = "shm_dummy_data";
   auto shm = std::make_unique<SharedMemory>();
   ASSERT_TRUE(shm->CreateAndMapAnonymous(sizeof(kData)));
-  SbMemoryCopy(shm->memory(), kData, sizeof(kData));
+  memcpy(shm->memory(), kData, sizeof(kData));
 
   auto mem =
       MakeRefCounted<RefCountedSharedMemory>(std::move(shm), sizeof(kData));
@@ -97,7 +97,7 @@
     ReadOnlySharedMemoryMapping ro_mapping = region.region.Map();
     WritableSharedMemoryMapping rw_mapping = std::move(region.mapping);
     ASSERT_TRUE(rw_mapping.IsValid());
-    SbMemoryCopy(rw_mapping.memory(), kData, sizeof(kData));
+    memcpy(rw_mapping.memory(), kData, sizeof(kData));
     mem = MakeRefCounted<RefCountedSharedMemoryMapping>(std::move(ro_mapping));
   }
 
@@ -111,7 +111,7 @@
         ReadOnlySharedMemoryRegion::Create(sizeof(kData));
     WritableSharedMemoryMapping rw_mapping = std::move(region.mapping);
     ASSERT_TRUE(rw_mapping.IsValid());
-    SbMemoryCopy(rw_mapping.memory(), kData, sizeof(kData));
+    memcpy(rw_mapping.memory(), kData, sizeof(kData));
     mem = RefCountedSharedMemoryMapping::CreateFromWholeRegion(region.region);
   }
 
diff --git a/src/base/memory/scoped_refptr.h b/src/base/memory/scoped_refptr.h
index 1810b74..27b48a1 100644
--- a/src/base/memory/scoped_refptr.h
+++ b/src/base/memory/scoped_refptr.h
@@ -12,7 +12,6 @@
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 template <class T>
@@ -171,7 +170,7 @@
   constexpr scoped_refptr() = default;
 
   // Constructs from raw pointer. constexpr if |p| is null.
-  CONSTEXPR scoped_refptr(T* p) : ptr_(p) {
+  constexpr scoped_refptr(T* p) : ptr_(p) {
     if (ptr_)
       AddRef(ptr_);
   }
diff --git a/src/base/memory/shared_memory_helper.cc b/src/base/memory/shared_memory_helper.cc
index ea1326b..25a3059 100644
--- a/src/base/memory/shared_memory_helper.cc
+++ b/src/base/memory/shared_memory_helper.cc
@@ -131,11 +131,11 @@
 
       // Put a marker at the start of our data so we can confirm where it
       // begins.
-      crash_ptr = SbStringCopy(crash_ptr, kFileDataMarker,
+      crash_ptr = strncpy(crash_ptr, kFileDataMarker,
                                SbStringGetLength(kFileDataMarker));
       for (int i = original_fd_limit; i >= 0; --i) {
-        SbMemorySet(buf, 0, arraysize(buf));
-        SbMemorySet(fd_path, 0, arraysize(fd_path));
+        memset(buf, 0, arraysize(buf));
+        memset(fd_path, 0, arraysize(fd_path));
         snprintf(fd_path, arraysize(fd_path) - 1, "/proc/self/fd/%d", i);
         ssize_t count = readlink(fd_path, buf, arraysize(buf) - 1);
         if (count < 0) {
@@ -144,7 +144,7 @@
         }
 
         if (crash_ptr + count + 1 < crash_buffer + arraysize(crash_buffer)) {
-          crash_ptr = SbStringCopy(crash_ptr, buf, count + 1);
+          crash_ptr = strncpy(crash_ptr, buf, count + 1);
         }
         LOG(ERROR) << i << ": " << buf;
       }
diff --git a/src/base/memory/shared_memory_mac_unittest.cc b/src/base/memory/shared_memory_mac_unittest.cc
index 0b78455..c476368 100644
--- a/src/base/memory/shared_memory_mac_unittest.cc
+++ b/src/base/memory/shared_memory_mac_unittest.cc
@@ -63,7 +63,7 @@
   }
   std::unique_ptr<SharedMemory> shared_memory(new SharedMemory(shm, false));
   shared_memory->Map(size);
-  SbMemorySet(shared_memory->memory(), 'a', size);
+  memset(shared_memory->memory(), 'a', size);
   return shared_memory;
 }
 
@@ -270,9 +270,9 @@
 
   size_t page_size = SysInfo::VMAllocationGranularity();
   char* start = static_cast<char*>(shared_memory.memory());
-  SbMemorySet(start, 'a', page_size);
-  SbMemorySet(start + page_size, 'b', page_size);
-  SbMemorySet(start + 2 * page_size, 'c', page_size);
+  memset(start, 'a', page_size);
+  memset(start + page_size, 'b', page_size);
+  memset(start + 2 * page_size, 'c', page_size);
 
   // Send the underlying memory object to the client process.
   SendMachPort(
@@ -371,7 +371,7 @@
   ASSERT_TRUE(shm2.IsValid());
   SharedMemory shared_memory2(shm2, true);
   shared_memory2.Map(s_memory_size);
-  ASSERT_DEATH(SbMemorySet(shared_memory2.memory(), 'b', s_memory_size), "");
+  ASSERT_DEATH(memset(shared_memory2.memory(), 'b', s_memory_size), "");
 }
 
 // Tests that duplication of the underlying handle works.
@@ -387,8 +387,8 @@
     SharedMemory shared_memory2(shm2, true);
     shared_memory2.Map(s_memory_size);
 
-    ASSERT_EQ(0, SbMemoryCompare(shared_memory->memory(),
-                                 shared_memory2.memory(), s_memory_size));
+    ASSERT_EQ(0, memcmp(shared_memory->memory(),
+                        shared_memory2.memory(), s_memory_size));
   }
 
   EXPECT_EQ(active_name_count, GetActiveNameCount());
@@ -432,7 +432,7 @@
 
   // The memory should still be readonly, since the underlying memory object
   // is readonly.
-  ASSERT_DEATH(SbMemorySet(shared_memory2.memory(), 'b', s_memory_size), "");
+  ASSERT_DEATH(memset(shared_memory2.memory(), 'b', s_memory_size), "");
 }
 
 // Tests that the method GetReadOnlyHandle() doesn't leak.
diff --git a/src/base/memory/shared_memory_region_unittest.cc b/src/base/memory/shared_memory_region_unittest.cc
index d80affe..1098360 100644
--- a/src/base/memory/shared_memory_region_unittest.cc
+++ b/src/base/memory/shared_memory_region_unittest.cc
@@ -38,7 +38,7 @@
         CreateMappedRegion<SharedMemoryRegionType>(kRegionSize);
     ASSERT_TRUE(region_.IsValid());
     ASSERT_TRUE(rw_mapping_.IsValid());
-    SbMemorySet(rw_mapping_.memory(), 'G', kRegionSize);
+    memset(rw_mapping_.memory(), 'G', kRegionSize);
     EXPECT_TRUE(IsMemoryFilledWithByte(rw_mapping_.memory(), kRegionSize, 'G'));
   }
 
@@ -70,14 +70,14 @@
   typename TypeParam::MappingType mapping = moved_region.Map();
   ASSERT_TRUE(mapping.IsValid());
   EXPECT_NE(this->rw_mapping_.memory(), mapping.memory());
-  EXPECT_EQ(SbMemoryCompare(this->rw_mapping_.memory(), mapping.memory(),
-                            kRegionSize),
+  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(),
+                   kRegionSize),
             0);
 
   // Verify that the second mapping reflects changes in the first.
-  SbMemorySet(this->rw_mapping_.memory(), '#', kRegionSize);
-  EXPECT_EQ(SbMemoryCompare(this->rw_mapping_.memory(), mapping.memory(),
-                            kRegionSize),
+  memset(this->rw_mapping_.memory(), '#', kRegionSize);
+  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(),
+                   kRegionSize),
             0);
 }
 
@@ -95,14 +95,14 @@
   typename TypeParam::MappingType mapping = this->region_.Map();
   ASSERT_TRUE(mapping.IsValid());
   EXPECT_NE(this->rw_mapping_.memory(), mapping.memory());
-  EXPECT_EQ(SbMemoryCompare(this->rw_mapping_.memory(), mapping.memory(),
-                            kRegionSize),
+  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(),
+                   kRegionSize),
             0);
 
   // Verify that the second mapping reflects changes in the first.
-  SbMemorySet(this->rw_mapping_.memory(), '#', kRegionSize);
-  EXPECT_EQ(SbMemoryCompare(this->rw_mapping_.memory(), mapping.memory(),
-                            kRegionSize),
+  memset(this->rw_mapping_.memory(), '#', kRegionSize);
+  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(),
+                   kRegionSize),
             0);
 
   // Close the region and unmap the first memory segment, verify the second
@@ -132,7 +132,7 @@
   EXPECT_TRUE(IsMemoryFilledWithByte(mapping.memory(), kRegionSize, 'G'));
 
   // Verify that the second mapping reflects changes in the first.
-  SbMemorySet(this->rw_mapping_.memory(), '#', kRegionSize);
+  memset(this->rw_mapping_.memory(), '#', kRegionSize);
   EXPECT_EQ(SbMemoryCompare(this->rw_mapping_.memory(), mapping.memory(),
                             kRegionSize),
             0);
@@ -276,7 +276,7 @@
   ReadOnlySharedMemoryMapping mapping = region.Map();
   ASSERT_TRUE(mapping.IsValid());
   void* memory_ptr = const_cast<void*>(mapping.memory());
-  EXPECT_DEATH_IF_SUPPORTED(SbMemorySet(memory_ptr, 'G', kRegionSize), "");
+  EXPECT_DEATH_IF_SUPPORTED(memset(memory_ptr, 'G', kRegionSize), "");
 }
 
 TEST_F(ReadOnlySharedMemoryRegionTest,
@@ -286,7 +286,7 @@
   ReadOnlySharedMemoryMapping mapping = region.Map();
   ASSERT_TRUE(mapping.IsValid());
   void* memory_ptr = const_cast<void*>(mapping.memory());
-  EXPECT_DEATH_IF_SUPPORTED(SbMemorySet(memory_ptr, 'G', kRegionSize), "");
+  EXPECT_DEATH_IF_SUPPORTED(memset(memory_ptr, 'G', kRegionSize), "");
 }
 
 class UnsafeSharedMemoryRegionTest : public ::testing::Test {};
diff --git a/src/base/memory/shared_memory_unittest.cc b/src/base/memory/shared_memory_unittest.cc
index 1e97c93..676feb6 100644
--- a/src/base/memory/shared_memory_unittest.cc
+++ b/src/base/memory/shared_memory_unittest.cc
@@ -167,8 +167,8 @@
   ASSERT_NE(memory2.memory(), static_cast<void*>(nullptr));
 
   // Write data to the first memory segment, verify contents of second.
-  SbMemorySet(memory1.memory(), '1', kDataSize);
-  EXPECT_EQ(SbMemoryCompare(memory1.memory(), memory2.memory(), kDataSize), 0);
+  memset(memory1.memory(), '1', kDataSize);
+  EXPECT_EQ(memcmp(memory1.memory(), memory2.memory(), kDataSize), 0);
 
   // Close the first memory segment, and verify the second has the right data.
   memory1.Close();
@@ -213,7 +213,7 @@
   EXPECT_LT(memory1.mapped_size(),
             kDataSize + SysInfo::VMAllocationGranularity());
 
-  SbMemorySet(memory1.memory(), 'G', kDataSize);
+  memset(memory1.memory(), 'G', kDataSize);
 
   SharedMemory memory2;
   // Should not be able to create if openExisting is false.
@@ -261,7 +261,7 @@
   ASSERT_TRUE(memory.CreateAndMapAnonymous(kDataSize));
   char* ptr = static_cast<char*>(memory.memory());
   ASSERT_NE(ptr, static_cast<void*>(nullptr));
-  SbMemorySet(ptr, 'G', kDataSize);
+  memset(ptr, 'G', kDataSize);
 
   memory.Close();
 
@@ -374,7 +374,7 @@
 #endif
   ASSERT_TRUE(writable_shmem.Create(options));
   ASSERT_TRUE(writable_shmem.Map(options.size));
-  SbMemoryCopy(writable_shmem.memory(), contents.data(), contents.size());
+  memcpy(writable_shmem.memory(), contents.data(), contents.size());
   EXPECT_TRUE(writable_shmem.Unmap());
 
   SharedMemoryHandle readonly_handle = writable_shmem.GetReadOnlyHandle();
@@ -397,7 +397,7 @@
   // Make sure the writable instance is still writable.
   ASSERT_TRUE(writable_shmem.Map(contents.size()));
   StringPiece new_contents = "Goodbye";
-  SbMemoryCopy(writable_shmem.memory(), new_contents.data(),
+  memcpy(writable_shmem.memory(), new_contents.data(),
                new_contents.size());
   EXPECT_EQ(new_contents,
             StringPiece(static_cast<const char*>(writable_shmem.memory()),
@@ -476,7 +476,7 @@
 
   SharedMemory shmem;
   ASSERT_TRUE(shmem.CreateAndMapAnonymous(contents.size()));
-  SbMemoryCopy(shmem.memory(), contents.data(), contents.size());
+  memcpy(shmem.memory(), contents.data(), contents.size());
   EXPECT_TRUE(shmem.Unmap());
 
   SharedMemoryHandle shared_handle = shmem.handle().Duplicate();
@@ -532,14 +532,14 @@
       shmem.requested_size());
 
   // |shmem| should be able to update the content.
-  SbMemoryCopy(shmem.memory(), kContents.data(), kContents.size());
+  memcpy(shmem.memory(), kContents.data(), kContents.size());
 
   ASSERT_EQ(kContents, shmem_contents);
   ASSERT_EQ(kContents, shared_contents);
   ASSERT_EQ(kContents, readonly_contents);
 
   // |shared| should also be able to update the content.
-  SbMemoryCopy(shared.memory(), ToLowerASCII(kContents).c_str(),
+  memcpy(shared.memory(), ToLowerASCII(kContents).c_str(),
                kContents.size());
 
   ASSERT_EQ(StringPiece(ToLowerASCII(kContents)), shmem_contents);
diff --git a/src/base/memory/shared_memory_win_unittest.cc b/src/base/memory/shared_memory_win_unittest.cc
index 1763013..6c869ac 100644
--- a/src/base/memory/shared_memory_win_unittest.cc
+++ b/src/base/memory/shared_memory_win_unittest.cc
@@ -68,7 +68,7 @@
   // Read from parent pipe.
   const size_t buf_size = 1000;
   char buffer[buf_size];
-  SbMemorySet(buffer, 0, buf_size);
+  memset(buffer, 0, buf_size);
   DWORD bytes_read;
   BOOL success = ReadFile(pipe, buffer, buf_size, &bytes_read, NULL);
 
diff --git a/src/base/message_loop/message_loop_unittest.cc b/src/base/message_loop/message_loop_unittest.cc
index e9e68ac..f0e7709 100644
--- a/src/base/message_loop/message_loop_unittest.cc
+++ b/src/base/message_loop/message_loop_unittest.cc
@@ -460,7 +460,7 @@
 
 TestIOHandler::TestIOHandler(const wchar_t* name, HANDLE signal, bool wait)
     : signal_(signal), wait_(wait) {
-  SbMemorySet(buffer_, 0, sizeof(buffer_));
+  memset(buffer_, 0, sizeof(buffer_));
 
   file_.Set(CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING,
                        FILE_FLAG_OVERLAPPED, NULL));
diff --git a/src/base/message_loop/message_pump_win.cc b/src/base/message_loop/message_pump_win.cc
index 32413d6..5e60b30 100644
--- a/src/base/message_loop/message_pump_win.cc
+++ b/src/base/message_loop/message_pump_win.cc
@@ -443,7 +443,7 @@
 // MessagePumpForIO public:
 
 MessagePumpForIO::IOContext::IOContext() {
-  SbMemorySet(&overlapped, 0, sizeof(overlapped));
+  memset(&overlapped, 0, sizeof(overlapped));
 }
 
 MessagePumpForIO::MessagePumpForIO() {
@@ -576,7 +576,7 @@
 
 // Asks the OS for another IO completion result.
 bool MessagePumpForIO::GetIOItem(DWORD timeout, IOItem* item) {
-  SbMemorySet(item, 0, sizeof(*item));
+  memset(item, 0, sizeof(*item));
   ULONG_PTR key = reinterpret_cast<ULONG_PTR>(nullptr);
   OVERLAPPED* overlapped = nullptr;
   if (!GetQueuedCompletionStatus(port_.Get(), &item->bytes_transfered, &key,
diff --git a/src/base/metrics/field_trial.cc b/src/base/metrics/field_trial.cc
index f659c7b..3130afd 100644
--- a/src/base/metrics/field_trial.cc
+++ b/src/base/metrics/field_trial.cc
@@ -1158,7 +1158,7 @@
     // in memory, so we can avoid this memcpy.
     char* dst = reinterpret_cast<char*>(new_entry) +
                 sizeof(FieldTrial::FieldTrialEntry);
-    SbMemoryCopy(dst, pickle.data(), pickle.size());
+    memcpy(dst, pickle.data(), pickle.size());
 
     // Update the ref on the field trial and add it to the list to be made
     // iterable.
@@ -1458,7 +1458,7 @@
   // memory, so we can avoid this memcpy.
   char* dst =
       reinterpret_cast<char*>(entry) + sizeof(FieldTrial::FieldTrialEntry);
-  SbMemoryCopy(dst, pickle.data(), pickle.size());
+  memcpy(dst, pickle.data(), pickle.size());
 
   allocator->MakeIterable(ref);
   field_trial->ref_ = ref;
diff --git a/src/base/metrics/histogram_samples.cc b/src/base/metrics/histogram_samples.cc
index b8527c4..dffd703 100644
--- a/src/base/metrics/histogram_samples.cc
+++ b/src/base/metrics/histogram_samples.cc
@@ -173,7 +173,7 @@
 HistogramSamples::LocalMetadata::LocalMetadata() {
   // This is the same way it's done for persistent metadata since no ctor
   // is called for the data members in that case.
-  SbMemorySet(this, 0, sizeof(*this));
+  memset(this, 0, sizeof(*this));
 }
 
 HistogramSamples::HistogramSamples(uint64_t id, Metadata* meta)
diff --git a/src/base/metrics/metrics_hashes.cc b/src/base/metrics/metrics_hashes.cc
index 261f558..3f72311 100644
--- a/src/base/metrics/metrics_hashes.cc
+++ b/src/base/metrics/metrics_hashes.cc
@@ -17,7 +17,7 @@
 inline uint64_t DigestToUInt64(const base::MD5Digest& digest) {
   uint64_t value;
   DCHECK_GE(sizeof(digest.a), sizeof(value));
-  SbMemoryCopy(&value, digest.a, sizeof(value));
+  memcpy(&value, digest.a, sizeof(value));
   return base::NetToHost64(value);
 }
 
diff --git a/src/base/metrics/persistent_histogram_allocator.cc b/src/base/metrics/persistent_histogram_allocator.cc
index 478f3cd..669ca89 100644
--- a/src/base/metrics/persistent_histogram_allocator.cc
+++ b/src/base/metrics/persistent_histogram_allocator.cc
@@ -332,7 +332,7 @@
       memory_allocator_->New<PersistentHistogramData>(
           offsetof(PersistentHistogramData, name) + name.length() + 1);
   if (histogram_data) {
-    SbMemoryCopy(histogram_data->name, name.c_str(), name.size() + 1);
+    memcpy(histogram_data->name, name.c_str(), name.size() + 1);
     histogram_data->histogram_type = histogram_type;
     histogram_data->flags = flags | HistogramBase::kIsPersistent;
   }
diff --git a/src/base/metrics/persistent_histogram_allocator_unittest.cc b/src/base/metrics/persistent_histogram_allocator_unittest.cc
index c387eff..f8de3d5 100644
--- a/src/base/metrics/persistent_histogram_allocator_unittest.cc
+++ b/src/base/metrics/persistent_histogram_allocator_unittest.cc
@@ -34,7 +34,7 @@
     allocator_memory_.reset(new char[kAllocatorMemorySize]);
 
     GlobalHistogramAllocator::ReleaseForTesting();
-    SbMemorySet(allocator_memory_.get(), 0, kAllocatorMemorySize);
+    memset(allocator_memory_.get(), 0, kAllocatorMemorySize);
     GlobalHistogramAllocator::CreateWithPersistentMemory(
         allocator_memory_.get(), kAllocatorMemorySize, 0, 0,
         "PersistentHistogramAllocatorTest");
diff --git a/src/base/metrics/persistent_memory_allocator.cc b/src/base/metrics/persistent_memory_allocator.cc
index 52fd280..e30e10e 100644
--- a/src/base/metrics/persistent_memory_allocator.cc
+++ b/src/base/metrics/persistent_memory_allocator.cc
@@ -414,7 +414,7 @@
       shared_meta()->name = Allocate(name_length, 0);
       char* name_cstr = GetAsArray<char>(shared_meta()->name, 0, name_length);
       if (name_cstr)
-        SbMemoryCopy(name_cstr, name.data(), name.length());
+        memcpy(name_cstr, name.data(), name.length());
     }
 
     shared_meta()->memory_state.store(MEMORY_INITIALIZED,
@@ -997,7 +997,7 @@
   // added to the process now istead of only when first accessed).
   address = SbMemoryAllocate(size);
   DPCHECK(address);
-  SbMemorySet(address, 0, size);
+  memset(address, 0, size);
   return Memory(address, MEM_MALLOC);
 }
 
diff --git a/src/base/metrics/sample_vector_unittest.cc b/src/base/metrics/sample_vector_unittest.cc
index cf54e0c..1b1f51d 100644
--- a/src/base/metrics/sample_vector_unittest.cc
+++ b/src/base/metrics/sample_vector_unittest.cc
@@ -375,7 +375,7 @@
   std::atomic<PersistentMemoryAllocator::Reference> samples_ref;
   samples_ref.store(0, std::memory_order_relaxed);
   HistogramSamples::Metadata samples_meta;
-  SbMemorySet(&samples_meta, 0, sizeof(samples_meta));
+  memset(&samples_meta, 0, sizeof(samples_meta));
 
   // Custom buckets: [1, 5) [5, 10)
   BucketRanges ranges(3);
@@ -468,7 +468,7 @@
   std::atomic<PersistentMemoryAllocator::Reference> samples_ref;
   samples_ref.store(0, std::memory_order_relaxed);
   HistogramSamples::Metadata samples_meta;
-  SbMemorySet(&samples_meta, 0, sizeof(samples_meta));
+  memset(&samples_meta, 0, sizeof(samples_meta));
 
   // Custom buckets: [1, 5) [5, 10)
   BucketRanges ranges(3);
diff --git a/src/base/numerics/checked_math.h b/src/base/numerics/checked_math.h
index 28b49b8..8b8e642 100644
--- a/src/base/numerics/checked_math.h
+++ b/src/base/numerics/checked_math.h
@@ -116,25 +116,25 @@
 
   // Prototypes for the supported arithmetic operator overloads.
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator+=(const Src rhs);
+  constexpr CheckedNumeric& operator+=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator-=(const Src rhs);
+  constexpr CheckedNumeric& operator-=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator*=(const Src rhs);
+  constexpr CheckedNumeric& operator*=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator/=(const Src rhs);
+  constexpr CheckedNumeric& operator/=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator%=(const Src rhs);
+  constexpr CheckedNumeric& operator%=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator<<=(const Src rhs);
+  constexpr CheckedNumeric& operator<<=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator>>=(const Src rhs);
+  constexpr CheckedNumeric& operator>>=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator&=(const Src rhs);
+  constexpr CheckedNumeric& operator&=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator|=(const Src rhs);
+  constexpr CheckedNumeric& operator|=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator^=(const Src rhs);
+  constexpr CheckedNumeric& operator^=(const Src rhs);
 
   constexpr CheckedNumeric operator-() const {
     // The negation of two's complement int min is int min, so we simply
@@ -199,23 +199,23 @@
         SafeUnsignedAbs(state_.value()), state_.is_valid());
   }
 
-  CONSTEXPR CheckedNumeric& operator++() const {
+  constexpr CheckedNumeric& operator++() const {
     *this += 1;
     return *this;
   }
 
-  CONSTEXPR CheckedNumeric operator++(int) const {
+  constexpr CheckedNumeric operator++(int) const {
     CheckedNumeric value = *this;
     *this += 1;
     return value;
   }
 
-  CONSTEXPR CheckedNumeric& operator--() const {
+  constexpr CheckedNumeric& operator--() const {
     *this -= 1;
     return *this;
   }
 
-  CONSTEXPR CheckedNumeric operator--(int) const {
+  constexpr CheckedNumeric operator--(int) const {
     CheckedNumeric value = *this;
     *this -= 1;
     return value;
@@ -226,7 +226,7 @@
   template <template <typename, typename, typename> class M,
             typename L,
             typename R>
-  static CONSTEXPR CheckedNumeric MathOp(const L lhs, const R rhs) {
+  static constexpr CheckedNumeric MathOp(const L lhs, const R rhs) {
     using Math = typename MathWrapper<M, L, R>::math;
     T result = 0;
     bool is_valid =
@@ -237,7 +237,7 @@
 
   // Assignment arithmetic operations.
   template <template <typename, typename, typename> class M, typename R>
-  CONSTEXPR CheckedNumeric& MathOp(const R rhs) {
+  constexpr CheckedNumeric& MathOp(const R rhs) {
     using Math = typename MathWrapper<M, T, R>::math;
     T result = 0;  // Using T as the destination saves a range check.
     bool is_valid = state_.is_valid() && Wrapper<R>::is_valid(rhs) &&
diff --git a/src/base/numerics/checked_math_impl.h b/src/base/numerics/checked_math_impl.h
index a4562bd..47c5492 100644
--- a/src/base/numerics/checked_math_impl.h
+++ b/src/base/numerics/checked_math_impl.h
@@ -13,14 +13,13 @@
 
 #include "base/numerics/safe_conversions.h"
 #include "base/numerics/safe_math_shared_impl.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 namespace base {
 namespace internal {
 
 template <typename T>
-CONSTEXPR bool CheckedAddImpl(T x, T y, T* result) {
+constexpr bool CheckedAddImpl(T x, T y, T* result) {
   static_assert(std::is_integral<T>::value, "Type must be integral");
   // Since the value of x+y is undefined if we have a signed type, we compute
   // it using the unsigned type of the same size.
@@ -47,7 +46,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (CheckedAddFastOp<T, U>::is_supported)
       return CheckedAddFastOp<T, U>::Do(x, y, result);
@@ -80,7 +79,7 @@
 };
 
 template <typename T>
-CONSTEXPR bool CheckedSubImpl(T x, T y, T* result) {
+constexpr bool CheckedSubImpl(T x, T y, T* result) {
   static_assert(std::is_integral<T>::value, "Type must be integral");
   // Since the value of x+y is undefined if we have a signed type, we compute
   // it using the unsigned type of the same size.
@@ -107,7 +106,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (CheckedSubFastOp<T, U>::is_supported)
       return CheckedSubFastOp<T, U>::Do(x, y, result);
@@ -140,7 +139,7 @@
 };
 
 template <typename T>
-CONSTEXPR bool CheckedMulImpl(T x, T y, T* result) {
+constexpr bool CheckedMulImpl(T x, T y, T* result) {
   static_assert(std::is_integral<T>::value, "Type must be integral");
   // Since the value of x*y is potentially undefined if we have a signed type,
   // we compute it using the unsigned type of the same size.
@@ -169,7 +168,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (CheckedMulFastOp<T, U>::is_supported)
       return CheckedMulFastOp<T, U>::Do(x, y, result);
@@ -210,7 +209,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     if (BASE_NUMERICS_UNLIKELY(!y))
       return false;
 
@@ -249,7 +248,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     using Promotion = typename BigEnoughPromotion<T, U>::type;
     if (BASE_NUMERICS_LIKELY(y)) {
       Promotion presult = static_cast<Promotion>(x) % static_cast<Promotion>(y);
@@ -273,7 +272,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = T;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U shift, V* result) {
+  static constexpr bool Do(T x, U shift, V* result) {
     // Disallow negative numbers and verify the shift is in bounds.
     if (BASE_NUMERICS_LIKELY(!IsValueNegative(x) &&
                              as_unsigned(shift) <
@@ -327,7 +326,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = static_cast<result_type>(x) & static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
     return IsValueInRangeForNumericType<V>(tmp);
@@ -346,7 +345,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = static_cast<result_type>(x) | static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
     return IsValueInRangeForNumericType<V>(tmp);
@@ -365,7 +364,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = static_cast<result_type>(x) ^ static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
     return IsValueInRangeForNumericType<V>(tmp);
@@ -385,7 +384,7 @@
                             std::is_arithmetic<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = IsGreater<T, U>::Test(x, y) ? static_cast<result_type>(x)
                                                   : static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
@@ -406,7 +405,7 @@
                             std::is_arithmetic<U>::value>::type> {
   using result_type = typename LowestValuePromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = IsLess<T, U>::Test(x, y) ? static_cast<result_type>(x)
                                                : static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
@@ -424,7 +423,7 @@
                               std::is_floating_point<U>::value>::type> { \
     using result_type = typename MaxExponentPromotion<T, U>::type;       \
     template <typename V>                                                \
-    static CONSTEXPR bool Do(T x, U y, V* result) {                      \
+    static constexpr bool Do(T x, U y, V* result) {                      \
       using Promotion = typename MaxExponentPromotion<T, U>::type;       \
       Promotion presult = x OP y;                                        \
       *result = static_cast<V>(presult);                                 \
@@ -517,7 +516,7 @@
 
   // Ensures that a type conversion does not trigger undefined behavior.
   template <typename Src>
-  static CONSTEXPR T WellDefinedConversionOrNaN(const Src value,
+  static constexpr T WellDefinedConversionOrNaN(const Src value,
                                                 const bool is_valid) {
     using SrcType = typename internal::UnderlyingType<Src>::type;
     return (StaticDstRangeRelationToSrcRange<T, SrcType>::value ==
diff --git a/src/base/numerics/clamped_math.h b/src/base/numerics/clamped_math.h
index a1fc738..2c692a4 100644
--- a/src/base/numerics/clamped_math.h
+++ b/src/base/numerics/clamped_math.h
@@ -56,25 +56,25 @@
 
   // Prototypes for the supported arithmetic operator overloads.
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator+=(const Src rhs);
+  constexpr ClampedNumeric& operator+=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator-=(const Src rhs);
+  constexpr ClampedNumeric& operator-=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator*=(const Src rhs);
+  constexpr ClampedNumeric& operator*=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator/=(const Src rhs);
+  constexpr ClampedNumeric& operator/=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator%=(const Src rhs);
+  constexpr ClampedNumeric& operator%=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator<<=(const Src rhs);
+  constexpr ClampedNumeric& operator<<=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator>>=(const Src rhs);
+  constexpr ClampedNumeric& operator>>=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator&=(const Src rhs);
+  constexpr ClampedNumeric& operator&=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator|=(const Src rhs);
+  constexpr ClampedNumeric& operator|=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator^=(const Src rhs);
+  constexpr ClampedNumeric& operator^=(const Src rhs);
 
   constexpr ClampedNumeric operator-() const {
     // The negation of two's complement int min is int min, so that's the
@@ -117,23 +117,23 @@
         SafeUnsignedAbs(value_));
   }
 
-  CONSTEXPR ClampedNumeric& operator++() const {
+  constexpr ClampedNumeric& operator++() const {
     *this += 1;
     return *this;
   }
 
-  CONSTEXPR ClampedNumeric operator++(int) const {
+  constexpr ClampedNumeric operator++(int) const {
     ClampedNumeric value = *this;
     *this += 1;
     return value;
   }
 
-  CONSTEXPR ClampedNumeric& operator--() const {
+  constexpr ClampedNumeric& operator--() const {
     *this -= 1;
     return *this;
   }
 
-  CONSTEXPR ClampedNumeric operator--(int) const {
+  constexpr ClampedNumeric operator--(int) const {
     ClampedNumeric value = *this;
     *this -= 1;
     return value;
@@ -152,7 +152,7 @@
 
   // Assignment arithmetic operations.
   template <template <typename, typename, typename> class M, typename R>
-  CONSTEXPR ClampedNumeric& MathOp(const R rhs) {
+  constexpr ClampedNumeric& MathOp(const R rhs) {
     using Math = typename MathWrapper<M, T, R>::math;
     *this =
         ClampedNumeric<T>(Math::template Do<T>(value_, Wrapper<R>::value(rhs)));
diff --git a/src/base/numerics/clamped_math_impl.h b/src/base/numerics/clamped_math_impl.h
index 271bc6e..1a7e234 100644
--- a/src/base/numerics/clamped_math_impl.h
+++ b/src/base/numerics/clamped_math_impl.h
@@ -76,7 +76,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     if (ClampedAddFastOp<T, U>::is_supported)
       return ClampedAddFastOp<T, U>::template Do<V>(x, y);
 
@@ -102,7 +102,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (ClampedSubFastOp<T, U>::is_supported)
       return ClampedSubFastOp<T, U>::template Do<V>(x, y);
@@ -129,7 +129,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (ClampedMulFastOp<T, U>::is_supported)
       return ClampedMulFastOp<T, U>::template Do<V>(x, y);
@@ -153,7 +153,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     V result = {};
     if (BASE_NUMERICS_LIKELY((CheckedDivOp<T, U>::Do(x, y, &result))))
       return result;
@@ -173,7 +173,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     V result = {};
     return BASE_NUMERICS_LIKELY((CheckedModOp<T, U>::Do(x, y, &result)))
                ? result
@@ -193,7 +193,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = T;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U shift) {
+  static constexpr V Do(T x, U shift) {
     static_assert(!std::is_signed<U>::value, "Shift value must be unsigned.");
     if (BASE_NUMERICS_LIKELY(shift < std::numeric_limits<T>::digits)) {
       // Shift as unsigned to avoid undefined behavior.
@@ -217,7 +217,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = T;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U shift) {
+  static constexpr V Do(T x, U shift) {
     static_assert(!std::is_signed<U>::value, "Shift value must be unsigned.");
     // Signed right shift is odd, because it saturates to -1 or 0.
     const V saturated = as_unsigned(V(0)) - IsValueNegative(x);
diff --git a/src/base/numerics/safe_math_shared_impl.h b/src/base/numerics/safe_math_shared_impl.h
index 02d04ba..f7b1a94 100644
--- a/src/base/numerics/safe_math_shared_impl.h
+++ b/src/base/numerics/safe_math_shared_impl.h
@@ -13,7 +13,6 @@
 #include <type_traits>
 
 #include "base/numerics/safe_conversions.h"
-#include "nb/cpp14oncpp11.h"
 
 // Where available use builtin math overflow support on Clang and GCC.
 #if !defined(__native_client__) &&                         \
@@ -225,7 +224,7 @@
   /* Assignment arithmetic operator implementation from CLASS##Numeric. */     \
   template <typename L>                                                        \
   template <typename R>                                                        \
-  CONSTEXPR CLASS##Numeric<L>& CLASS##Numeric<L>::operator CMP_OP(             \
+  constexpr CLASS##Numeric<L>& CLASS##Numeric<L>::operator CMP_OP(             \
       const R rhs) {                                                           \
     return MathOp<CLASS##OP_NAME##Op>(rhs);                                    \
   }                                                                            \
diff --git a/src/base/optional.h b/src/base/optional.h
index 005810a..f2f9233 100644
--- a/src/base/optional.h
+++ b/src/base/optional.h
@@ -14,7 +14,6 @@
 #include "base/logging.h"
 #include "base/template_util.h"
 #include "base/thread_annotations.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
@@ -252,7 +251,7 @@
  protected:
   constexpr OptionalBase() = default;
 #if defined(STARBOARD)
-  CONSTEXPR OptionalBase(const OptionalBase& other) {
+  constexpr OptionalBase(const OptionalBase& other) {
     if (other.storage_.is_populated_)
       storage_.Init(other.storage_.value_);
   }
@@ -626,32 +625,32 @@
     return *this;
   }
 
-  CONSTEXPR const T* operator->() const {
+  constexpr const T* operator->() const {
     DCHECK(storage_.is_populated_);
     return &storage_.value_;
   }
 
-  CONSTEXPR T* operator->() {
+  constexpr T* operator->() {
     DCHECK(storage_.is_populated_);
     return &storage_.value_;
   }
 
-  CONSTEXPR const T& operator*() const & {
+  constexpr const T& operator*() const & {
     DCHECK(storage_.is_populated_);
     return storage_.value_;
   }
 
-  CONSTEXPR T& operator*() & {
+  constexpr T& operator*() & {
     DCHECK(storage_.is_populated_);
     return storage_.value_;
   }
 
-  CONSTEXPR const T&& operator*() const && {
+  constexpr const T&& operator*() const && {
     DCHECK(storage_.is_populated_);
     return std::move(storage_.value_);
   }
 
-  CONSTEXPR T&& operator*() && {
+  constexpr T&& operator*() && {
     DCHECK(storage_.is_populated_);
     return std::move(storage_.value_);
   }
@@ -660,22 +659,22 @@
 
   constexpr bool has_value() const { return storage_.is_populated_; }
 
-  CONSTEXPR T& value() & {
+  constexpr T& value() & {
     CHECK(storage_.is_populated_);
     return storage_.value_;
   }
 
-  CONSTEXPR const T& value() const & {
+  constexpr const T& value() const & {
     CHECK(storage_.is_populated_);
     return storage_.value_;
   }
 
-  CONSTEXPR T&& value() && {
+  constexpr T&& value() && {
     CHECK(storage_.is_populated_);
     return std::move(storage_.value_);
   }
 
-  CONSTEXPR const T&& value() const && {
+  constexpr const T&& value() const && {
     CHECK(storage_.is_populated_);
     return std::move(storage_.value_);
   }
@@ -693,7 +692,7 @@
   }
 
   template <class U>
-  CONSTEXPR T value_or(U&& default_value) && {
+  constexpr T value_or(U&& default_value) && {
     // TODO(mlamouri): add the following assert when possible:
     // static_assert(std::is_move_constructible<T>::value,
     //               "T must be move constructible");
@@ -758,7 +757,7 @@
 // while bool() casting is replaced by has_value() to meet the chromium
 // style guide.
 template <class T, class U>
-CONSTEXPR bool operator==(const Optional<T>& lhs, const Optional<U>& rhs) {
+constexpr bool operator==(const Optional<T>& lhs, const Optional<U>& rhs) {
   if (lhs.has_value() != rhs.has_value())
     return false;
   if (!lhs.has_value())
@@ -767,7 +766,7 @@
 }
 
 template <class T, class U>
-CONSTEXPR bool operator!=(const Optional<T>& lhs, const Optional<U>& rhs) {
+constexpr bool operator!=(const Optional<T>& lhs, const Optional<U>& rhs) {
   if (lhs.has_value() != rhs.has_value())
     return true;
   if (!lhs.has_value())
@@ -776,7 +775,7 @@
 }
 
 template <class T, class U>
-CONSTEXPR bool operator<(const Optional<T>& lhs, const Optional<U>& rhs) {
+constexpr bool operator<(const Optional<T>& lhs, const Optional<U>& rhs) {
   if (!rhs.has_value())
     return false;
   if (!lhs.has_value())
@@ -785,7 +784,7 @@
 }
 
 template <class T, class U>
-CONSTEXPR bool operator<=(const Optional<T>& lhs, const Optional<U>& rhs) {
+constexpr bool operator<=(const Optional<T>& lhs, const Optional<U>& rhs) {
   if (!lhs.has_value())
     return true;
   if (!rhs.has_value())
@@ -794,7 +793,7 @@
 }
 
 template <class T, class U>
-CONSTEXPR bool operator>(const Optional<T>& lhs, const Optional<U>& rhs) {
+constexpr bool operator>(const Optional<T>& lhs, const Optional<U>& rhs) {
   if (!lhs.has_value())
     return false;
   if (!rhs.has_value())
@@ -803,7 +802,7 @@
 }
 
 template <class T, class U>
-CONSTEXPR bool operator>=(const Optional<T>& lhs, const Optional<U>& rhs) {
+constexpr bool operator>=(const Optional<T>& lhs, const Optional<U>& rhs) {
   if (!rhs.has_value())
     return true;
   if (!lhs.has_value())
diff --git a/src/base/optional_unittest.cc b/src/base/optional_unittest.cc
index 4e56b96..d504d2b 100644
--- a/src/base/optional_unittest.cc
+++ b/src/base/optional_unittest.cc
@@ -9,7 +9,6 @@
 #include <string>
 #include <vector>
 
-#include "nb/cpp14oncpp11.h"
 #include "starboard/configuration.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -189,7 +188,7 @@
 
 TEST(OptionalTest, DefaultConstructor) {
   {
-    CONSTEXPR Optional<float> o;
+    constexpr Optional<float> o;
     EXPECT_FALSE(o);
   }
 
@@ -206,7 +205,7 @@
 
 TEST(OptionalTest, CopyConstructor) {
   {
-    CONSTEXPR Optional<float> first(0.1f);
+    constexpr Optional<float> first(0.1f);
 #ifdef STARBOARD
     Optional<float> other(first);
 #else
@@ -248,8 +247,8 @@
 
 TEST(OptionalTest, ValueConstructor) {
   {
-    CONSTEXPR float value = 0.1f;
-    CONSTEXPR Optional<float> o(value);
+    constexpr float value = 0.1f;
+    constexpr Optional<float> o(value);
 
     EXPECT_TRUE(o);
     EXPECT_EQ(value, o.value());
@@ -275,7 +274,7 @@
 
 TEST(OptionalTest, MoveConstructor) {
   {
-    CONSTEXPR Optional<float> first(0.1f);
+    constexpr Optional<float> first(0.1f);
 #ifdef STARBOARD
     Optional<float> second(std::move(first));
 #else
@@ -347,8 +346,8 @@
 
 TEST(OptionalTest, MoveValueConstructor) {
   {
-    CONSTEXPR float value = 0.1f;
-    CONSTEXPR Optional<float> o(std::move(value));
+    constexpr float value = 0.1f;
+    constexpr Optional<float> o(std::move(value));
 
     EXPECT_TRUE(o);
     EXPECT_EQ(0.1f, o.value());
@@ -441,7 +440,7 @@
 
 TEST(OptionalTest, ConstructorForwardArguments) {
   {
-    CONSTEXPR Optional<float> a(base::in_place, 0.1f);
+    constexpr Optional<float> a(base::in_place, 0.1f);
     EXPECT_TRUE(a);
     EXPECT_EQ(0.1f, a.value());
   }
@@ -559,7 +558,7 @@
 }
 
 TEST(OptionalTest, NulloptConstructor) {
-  CONSTEXPR Optional<int> a(base::nullopt);
+  constexpr Optional<int> a(base::nullopt);
   EXPECT_FALSE(a);
 }
 
@@ -1053,15 +1052,15 @@
     EXPECT_EQ(0.0f, a.value_or(0.0f));
   }
 
-  // value_or() can be CONSTEXPR.
+  // value_or() can be constexpr.
   {
-    CONSTEXPR Optional<int> a(in_place, 1);
-    CONSTEXPR int value = a.value_or(10);
+    constexpr Optional<int> a(in_place, 1);
+    constexpr int value = a.value_or(10);
     EXPECT_EQ(1, value);
   }
   {
-    CONSTEXPR Optional<int> a;
-    CONSTEXPR int value = a.value_or(10);
+    constexpr Optional<int> a;
+    constexpr int value = a.value_or(10);
     EXPECT_EQ(10, value);
   }
 
diff --git a/src/base/os_compat_android.cc b/src/base/os_compat_android.cc
index 6c533a5..2a4ecca 100644
--- a/src/base/os_compat_android.cc
+++ b/src/base/os_compat_android.cc
@@ -121,7 +121,7 @@
     return NULL;
   }
 
-  const int path_len = SbStringGetLength(path);
+  const int path_len = strlen(path);
 
   // The last six characters of 'path' must be XXXXXX.
   const base::StringPiece kSuffix("XXXXXX");
diff --git a/src/base/pickle.cc b/src/base/pickle.cc
index 2149e7e..5f01ea8 100644
--- a/src/base/pickle.cc
+++ b/src/base/pickle.cc
@@ -36,7 +36,7 @@
   if (!read_from)
     return false;
   if (sizeof(Type) > sizeof(uint32_t))
-    SbMemoryCopy(result, read_from, sizeof(*result));
+    memcpy(result, read_from, sizeof(*result));
   else
     *result = *reinterpret_cast<const Type*>(read_from);
   return true;
@@ -127,7 +127,7 @@
   const char* read_from = GetReadPointerAndAdvance<float>();
   if (!read_from)
     return false;
-  SbMemoryCopy(result, read_from, sizeof(*result));
+  memcpy(result, read_from, sizeof(*result));
   return true;
 }
 
@@ -139,7 +139,7 @@
   const char* read_from = GetReadPointerAndAdvance<double>();
   if (!read_from)
     return false;
-  SbMemoryCopy(result, read_from, sizeof(*result));
+  memcpy(result, read_from, sizeof(*result));
   return true;
 }
 
@@ -262,7 +262,7 @@
       capacity_after_header_(0),
       write_offset_(other.write_offset_) {
   Resize(other.header_->payload_size);
-  SbMemoryCopy(header_, other.header_,
+  memcpy(header_, other.header_,
                header_size_ + other.header_->payload_size);
 }
 
@@ -285,7 +285,7 @@
     header_size_ = other.header_size_;
   }
   Resize(other.header_->payload_size);
-  SbMemoryCopy(header_, other.header_,
+  memcpy(header_, other.header_,
                other.header_size_ + other.header_->payload_size);
   write_offset_ = other.write_offset_;
   return *this;
@@ -347,7 +347,7 @@
 void* Pickle::ClaimBytes(size_t num_bytes) {
   void* p = ClaimUninitializedBytesInternal(num_bytes);
   CHECK(p);
-  SbMemorySet(p, 0, num_bytes);
+  memset(p, 0, num_bytes);
   return p;
 }
 
@@ -421,7 +421,7 @@
   }
 
   char* write = mutable_payload() + write_offset_;
-  SbMemorySet(write + length, 0,
+  memset(write + length, 0,
               data_len - length);  // Always initialize padding
   header_->payload_size = static_cast<uint32_t>(new_size);
   write_offset_ = new_size;
@@ -433,7 +433,7 @@
       << "oops: pickle is readonly";
   MSAN_CHECK_MEM_IS_INITIALIZED(data, length);
   void* write = ClaimUninitializedBytesInternal(length);
-  SbMemoryCopy(write, data, length);
+  memcpy(write, data, length);
 }
 
 }  // namespace base
diff --git a/src/base/pickle_unittest.cc b/src/base/pickle_unittest.cc
index f5cddbc..7dc9bda 100644
--- a/src/base/pickle_unittest.cc
+++ b/src/base/pickle_unittest.cc
@@ -101,7 +101,7 @@
   int outdatalen;
   EXPECT_TRUE(iter.ReadData(&outdata, &outdatalen));
   EXPECT_EQ(testdatalen, outdatalen);
-  EXPECT_EQ(SbMemoryCompare(testdata, outdata, outdatalen), 0);
+  EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0);
 
   // reads past the end should fail
   EXPECT_FALSE(iter.ReadInt(&outint));
@@ -331,7 +331,7 @@
 TEST(PickleTest, FindNextWithIncompleteHeader) {
   size_t header_size = sizeof(Pickle::Header);
   std::unique_ptr<char[]> buffer(new char[header_size - 1]);
-  SbMemorySet(buffer.get(), 0x1, header_size - 1);
+  memset(buffer.get(), 0x1, header_size - 1);
 
   const char* start = buffer.get();
   const char* end = start + header_size - 1;
@@ -506,7 +506,7 @@
   EXPECT_TRUE(iter.ReadBytes(&outdata_char, sizeof(data)));
 
   int outdata;
-  SbMemoryCopy(&outdata, outdata_char, sizeof(outdata));
+  memcpy(&outdata, outdata_char, sizeof(outdata));
   EXPECT_EQ(data, outdata);
 }
 
@@ -554,7 +554,7 @@
   pickle.WriteUInt32(data.size());
   void* bytes = pickle.ClaimBytes(data.size());
   pickle.WriteInt(42);
-  SbMemoryCopy(bytes, data.data(), data.size());
+  memcpy(bytes, data.data(), data.size());
 
   PickleIterator iter(pickle);
   uint32_t out_data_length;
diff --git a/src/base/posix/unix_domain_socket.cc b/src/base/posix/unix_domain_socket.cc
index a7226a1..56a5815 100644
--- a/src/base/posix/unix_domain_socket.cc
+++ b/src/base/posix/unix_domain_socket.cc
@@ -92,7 +92,7 @@
     cmsg->cmsg_level = SOL_SOCKET;
     cmsg->cmsg_type = SCM_RIGHTS;
     cmsg->cmsg_len = CMSG_LEN(sizeof(int) * fds.size());
-    SbMemoryCopy(CMSG_DATA(cmsg), &fds[0], sizeof(int) * fds.size());
+    memcpy(CMSG_DATA(cmsg), &fds[0], sizeof(int) * fds.size());
     msg.msg_controllen = cmsg->cmsg_len;
   }
 
diff --git a/src/base/posix/unix_domain_socket_unittest.cc b/src/base/posix/unix_domain_socket_unittest.cc
index 25a5907..0466648 100644
--- a/src/base/posix/unix_domain_socket_unittest.cc
+++ b/src/base/posix/unix_domain_socket_unittest.cc
@@ -121,7 +121,7 @@
   const ssize_t nread = UnixDomainSocket::RecvMsgWithPid(
       recv_sock.get(), buf, sizeof(buf), &fd_vec, &sender_pid);
   ASSERT_EQ(sizeof(kHello), static_cast<size_t>(nread));
-  ASSERT_EQ(0, SbMemoryCompare(buf, kHello, sizeof(kHello)));
+  ASSERT_EQ(0, memcmp(buf, kHello, sizeof(kHello)));
   ASSERT_EQ(0U, fd_vec.size());
 
   ASSERT_EQ(getpid(), sender_pid);
@@ -150,7 +150,7 @@
   const ssize_t nread = UnixDomainSocket::RecvMsgWithPid(
       recv_sock.get(), buf, sizeof(buf), &recv_fds, &sender_pid);
   ASSERT_EQ(sizeof(kHello), static_cast<size_t>(nread));
-  ASSERT_EQ(0, SbMemoryCompare(buf, kHello, sizeof(kHello)));
+  ASSERT_EQ(0, memcmp(buf, kHello, sizeof(kHello)));
   ASSERT_EQ(UnixDomainSocket::kMaxFileDescriptors, recv_fds.size());
 
   ASSERT_EQ(getpid(), sender_pid);
diff --git a/src/base/process/launch_posix.cc b/src/base/process/launch_posix.cc
index b4aeebc..e7fe2d6 100644
--- a/src/base/process/launch_posix.cc
+++ b/src/base/process/launch_posix.cc
@@ -443,7 +443,7 @@
     void *malloc_thunk =
         reinterpret_cast<void*>(reinterpret_cast<intptr_t>(malloc) & ~4095);
     mprotect(malloc_thunk, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);
-    SbMemorySet(reinterpret_cast<void*>(malloc), 0xff, 8);
+    memset(reinterpret_cast<void*>(malloc), 0xff, 8);
 #endif  // 0
 
 #if defined(OS_CHROMEOS)
diff --git a/src/base/process/memory.cc b/src/base/process/memory.cc
index 9e40143..6c7a782 100644
--- a/src/base/process/memory.cc
+++ b/src/base/process/memory.cc
@@ -49,11 +49,7 @@
   if (!UncheckedMalloc(alloc_size, result))
     return false;
 
-#if defined(STARBOARD)
-  SbMemorySet(*result, 0, alloc_size);
-#else
-  SbMemorySet(*result, 0, alloc_size);
-#endif
+  memset(*result, 0, alloc_size);
   return true;
 }
 
diff --git a/src/base/process/process_iterator_win.cc b/src/base/process/process_iterator_win.cc
index 1937c5e..b334218 100644
--- a/src/base/process/process_iterator_win.cc
+++ b/src/base/process/process_iterator_win.cc
@@ -29,7 +29,7 @@
 }
 
 void ProcessIterator::InitProcessEntry(ProcessEntry* entry) {
-  SbMemorySet(entry, 0, sizeof(*entry));
+  memset(entry, 0, sizeof(*entry));
   entry->dwSize = sizeof(*entry);
 }
 
diff --git a/src/base/process/process_metrics_linux.cc b/src/base/process/process_metrics_linux.cc
index 4eceda6..cbb24bb 100644
--- a/src/base/process/process_metrics_linux.cc
+++ b/src/base/process/process_metrics_linux.cc
@@ -713,7 +713,7 @@
     return false;
 
   // mmcblk[0-9]+ case
-  for (size_t i = SbStringGetLength(kMMCName); i < candidate.length(); ++i) {
+  for (size_t i = strlen(kMMCName); i < candidate.length(); ++i) {
     if (!isdigit(candidate[i]))
       return false;
   }
diff --git a/src/base/process/process_metrics_unittest.cc b/src/base/process/process_metrics_unittest.cc
index 3848d2b..1910e02 100644
--- a/src/base/process/process_metrics_unittest.cc
+++ b/src/base/process/process_metrics_unittest.cc
@@ -619,7 +619,7 @@
     const size_t kMappedSize = 4 * (1 << 20);
     SharedMemory memory;
     ASSERT_TRUE(memory.CreateAndMapAnonymous(kMappedSize));
-    SbMemorySet(memory.memory(), 42, kMappedSize);
+    memset(memory.memory(), 42, kMappedSize);
     memory.Unmap();
   }
 
diff --git a/src/base/profiler/native_stack_sampler_mac.cc b/src/base/profiler/native_stack_sampler_mac.cc
index 9d0ecd6..3012ec4 100644
--- a/src/base/profiler/native_stack_sampler_mac.cc
+++ b/src/base/profiler/native_stack_sampler_mac.cc
@@ -479,7 +479,7 @@
   // exactly those registers in exactly the same order, so just bulk copy them
   // over.
   unw_context_t unwind_context;
-  SbMemoryCopy(&unwind_context, &thread_state, sizeof(uintptr_t) * 17);
+  memcpy(&unwind_context, &thread_state, sizeof(uintptr_t) * 17);
   bool result = WalkStackFromContext(&unwind_context, &frame_count, callback,
                                      continue_unwind);
 
diff --git a/src/base/rand_util_unittest.cc b/src/base/rand_util_unittest.cc
index 9906746..4c9e808 100644
--- a/src/base/rand_util_unittest.cc
+++ b/src/base/rand_util_unittest.cc
@@ -43,7 +43,7 @@
 TEST(RandUtilTest, RandBytes) {
   const size_t buffer_size = 50;
   char buffer[buffer_size];
-  SbMemorySet(buffer, 0, buffer_size);
+  memset(buffer, 0, buffer_size);
   base::RandBytes(buffer, buffer_size);
   std::sort(buffer, buffer + buffer_size);
   // Probability of occurrence of less than 25 unique bytes in 50 random bytes
diff --git a/src/base/sha1.cc b/src/base/sha1.cc
index a7d73e7..1594815 100644
--- a/src/base/sha1.cc
+++ b/src/base/sha1.cc
@@ -204,7 +204,7 @@
   sha.Update(data, len);
   sha.Final();
 
-  SbMemoryCopy(hash, sha.Digest(), SecureHashAlgorithm::kDigestSizeBytes);
+  memcpy(hash, sha.Digest(), SecureHashAlgorithm::kDigestSizeBytes);
 }
 
 }  // namespace base
diff --git a/src/base/stl_util_unittest.cc b/src/base/stl_util_unittest.cc
index 2865b8e..786c44e 100644
--- a/src/base/stl_util_unittest.cc
+++ b/src/base/stl_util_unittest.cc
@@ -24,7 +24,6 @@
 #include "base/containers/queue.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
-#include "nb/cpp14oncpp11.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -167,16 +166,10 @@
   }
 
   {
-    CONSTEXPR std::initializer_list<int> il;
-#ifdef STARBOARD
-    // Added extra parentheses as well.
-    STATIC_ASSERT((std::is_same<bool, decltype(base::empty(il))>::value),
-                  "base::empty(il) should be of type bool");
-#else
+    constexpr std::initializer_list<int> il;
     static_assert(std::is_same<bool, decltype(base::empty(il))>::value,
                   "base::empty(il) should be of type bool");
-#endif
-    STATIC_ASSERT(base::empty(il), "base::empty(il) should be true");
+    static_assert(base::empty(il), "base::empty(il) should be true");
   }
 }
 
@@ -236,18 +229,11 @@
   }
 
   {
-    CONSTEXPR std::initializer_list<int> il;
-#ifdef STARBOARD
-    // Added extra parentheses as well.
-    STATIC_ASSERT(
-        (std::is_same<decltype(il.begin()), decltype(base::data(il))>::value),
-        "base::data(il) should have the same type as il.begin()");
-#else
+    constexpr std::initializer_list<int> il;
     static_assert(
         std::is_same<decltype(il.begin()), decltype(base::data(il))>::value,
         "base::data(il) should have the same type as il.begin()");
-#endif
-    STATIC_ASSERT(il.begin() == base::data(il),
+    static_assert(il.begin() == base::data(il),
                   "base::data(il) should be equal to il.begin()");
   }
 }
diff --git a/src/base/strings/char_traits.h b/src/base/strings/char_traits.h
index 5a5d0a4..0a3840c 100644
--- a/src/base/strings/char_traits.h
+++ b/src/base/strings/char_traits.h
@@ -6,7 +6,6 @@
 #define BASE_STRINGS_CHAR_TRAITS_H_
 
 #include "base/compiler_specific.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 namespace base {
@@ -22,14 +21,14 @@
   // Performs a lexographical comparison of the first N characters of |s1| and
   // |s2|. Returns 0 if equal, -1 if |s1| is less than |s2|, and 1 if |s1| is
   // greater than |s2|.
-  static CONSTEXPR int compare(const T* s1, const T* s2, size_t n) noexcept;
+  static constexpr int compare(const T* s1, const T* s2, size_t n) noexcept;
   // Returns the length of |s|, assuming null termination (and not including the
   // terminating null).
-  static CONSTEXPR size_t length(const T* s) noexcept;
+  static constexpr size_t length(const T* s) noexcept;
 };
 
 template <typename T>
-CONSTEXPR int CharTraits<T>::compare(const T* s1,
+constexpr int CharTraits<T>::compare(const T* s1,
                                      const T* s2,
                                      size_t n) noexcept {
   for (; n; --n, ++s1, ++s2) {
@@ -42,7 +41,7 @@
 }
 
 template <typename T>
-CONSTEXPR size_t CharTraits<T>::length(const T* s) noexcept {
+constexpr size_t CharTraits<T>::length(const T* s) noexcept {
   size_t i = 0;
   for (; *s; ++s)
     ++i;
@@ -54,7 +53,7 @@
 #if defined(STARBOARD)
 template <>
 struct CharTraits<char> {
-  CONSTEXPR static int compare(const char* s1,
+  constexpr static int compare(const char* s1,
                                const char* s2,
                                size_t n) noexcept {
     for (; n; --n, ++s1, ++s2) {
@@ -66,7 +65,7 @@
     return 0;
   }
 
-  CONSTEXPR static size_t length(const char* s) noexcept {
+  constexpr static size_t length(const char* s) noexcept {
     size_t i = 0;
     for (; *s; ++s)
       ++i;
diff --git a/src/base/strings/char_traits_unittest.cc b/src/base/strings/char_traits_unittest.cc
index 805044c..9a87b7f 100644
--- a/src/base/strings/char_traits_unittest.cc
+++ b/src/base/strings/char_traits_unittest.cc
@@ -6,29 +6,28 @@
 #include "base/strings/string16.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
 TEST(CharTraitsTest, CharCompare) {
-  STATIC_ASSERT(CharTraits<char>::compare("abc", "def", 3) == -1, "");
-  STATIC_ASSERT(CharTraits<char>::compare("def", "def", 3) == 0, "");
-  STATIC_ASSERT(CharTraits<char>::compare("ghi", "def", 3) == 1, "");
+  static_assert(CharTraits<char>::compare("abc", "def", 3) == -1, "");
+  static_assert(CharTraits<char>::compare("def", "def", 3) == 0, "");
+  static_assert(CharTraits<char>::compare("ghi", "def", 3) == 1, "");
 }
 
 TEST(CharTraitsTest, CharLength) {
-  STATIC_ASSERT(CharTraits<char>::length("") == 0, "");
-  STATIC_ASSERT(CharTraits<char>::length("abc") == 3, "");
+  static_assert(CharTraits<char>::length("") == 0, "");
+  static_assert(CharTraits<char>::length("abc") == 3, "");
 }
 
 TEST(CharTraitsTest, Char16TCompare) {
-  STATIC_ASSERT(CharTraits<char16_t>::compare(u"abc", u"def", 3) == -1, "");
-  STATIC_ASSERT(CharTraits<char16_t>::compare(u"def", u"def", 3) == 0, "");
-  STATIC_ASSERT(CharTraits<char16_t>::compare(u"ghi", u"def", 3) == 1, "");
+  static_assert(CharTraits<char16_t>::compare(u"abc", u"def", 3) == -1, "");
+  static_assert(CharTraits<char16_t>::compare(u"def", u"def", 3) == 0, "");
+  static_assert(CharTraits<char16_t>::compare(u"ghi", u"def", 3) == 1, "");
 }
 
 TEST(CharTraitsTest, Char16TLength) {
-  STATIC_ASSERT(CharTraits<char16_t>::length(u"abc") == 3, "");
+  static_assert(CharTraits<char16_t>::length(u"abc") == 3, "");
 }
 
 }  // namespace base
diff --git a/src/base/strings/pattern.cc b/src/base/strings/pattern.cc
index d71f7dc..f3de0af 100644
--- a/src/base/strings/pattern.cc
+++ b/src/base/strings/pattern.cc
@@ -5,7 +5,6 @@
 #include "base/strings/pattern.h"
 
 #include "base/third_party/icu/icu_utf.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
@@ -20,7 +19,7 @@
 // the first wildcard character (or the end of the string). If the value of
 // |maximum_distance| is negative, the maximum distance is considered infinite.
 template <typename CHAR, typename NEXT>
-CONSTEXPR bool SearchForChars(const CHAR** pattern,
+constexpr bool SearchForChars(const CHAR** pattern,
                               const CHAR* pattern_end,
                               const CHAR** string,
                               const CHAR* string_end,
@@ -88,7 +87,7 @@
 // match an arbitrary number of characters (which is the case if it contains at
 // least one *).
 template <typename CHAR, typename NEXT>
-CONSTEXPR int EatWildcards(const CHAR** pattern, const CHAR* end, NEXT next) {
+constexpr int EatWildcards(const CHAR** pattern, const CHAR* end, NEXT next) {
   int num_question_marks = 0;
   bool has_asterisk = false;
   while (*pattern != end) {
@@ -106,7 +105,7 @@
 }
 
 template <typename CHAR, typename NEXT>
-CONSTEXPR bool MatchPatternT(const CHAR* eval,
+constexpr bool MatchPatternT(const CHAR* eval,
                              const CHAR* eval_end,
                              const CHAR* pattern,
                              const CHAR* pattern_end,
diff --git a/src/base/strings/safe_sprintf_unittest.cc b/src/base/strings/safe_sprintf_unittest.cc
index 29de95a..912db4c 100644
--- a/src/base/strings/safe_sprintf_unittest.cc
+++ b/src/base/strings/safe_sprintf_unittest.cc
@@ -70,46 +70,46 @@
   // always add a trailing NUL; it always deduplicates '%' characters).
   static const char text[] = "hello world";
   char ref[20], buf[20];
-  SbMemorySet(ref, 'X', sizeof(ref));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  memset(ref, 'X', sizeof(ref));
+  memcpy(buf, ref, sizeof(buf));
 
   // A negative buffer size should always result in an error.
   EXPECT_EQ(-1, SafeSNPrintf(buf, static_cast<size_t>(-1), text));
-  EXPECT_TRUE(!SbMemoryCompare(buf, ref, sizeof(buf)));
+  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
 
   // Zero buffer size should always result in an error.
   EXPECT_EQ(-1, SafeSNPrintf(buf, 0, text));
-  EXPECT_TRUE(!SbMemoryCompare(buf, ref, sizeof(buf)));
+  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
 
   // A one-byte buffer should always print a single NUL byte.
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSNPrintf(buf, 1, text));
   EXPECT_EQ(0, buf[0]);
-  EXPECT_TRUE(!SbMemoryCompare(buf + 1, ref + 1, sizeof(buf) - 1));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  EXPECT_TRUE(!memcmp(buf + 1, ref + 1, sizeof(buf) - 1));
+  memcpy(buf, ref, sizeof(buf));
 
   // A larger (but limited) buffer should always leave the trailing bytes
   // unchanged.
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSNPrintf(buf, 2, text));
   EXPECT_EQ(text[0], buf[0]);
   EXPECT_EQ(0, buf[1]);
-  EXPECT_TRUE(!SbMemoryCompare(buf + 2, ref + 2, sizeof(buf) - 2));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  EXPECT_TRUE(!memcmp(buf + 2, ref + 2, sizeof(buf) - 2));
+  memcpy(buf, ref, sizeof(buf));
 
   // A unrestricted buffer length should always leave the trailing bytes
   // unchanged.
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
             SafeSNPrintf(buf, sizeof(buf), text));
   EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!SbMemoryCompare(buf + sizeof(text), ref + sizeof(text),
+  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
                                sizeof(buf) - sizeof(text)));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  memcpy(buf, ref, sizeof(buf));
 
   // The same test using SafeSPrintf() instead of SafeSNPrintf().
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSPrintf(buf, text));
   EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!SbMemoryCompare(buf + sizeof(text), ref + sizeof(text),
+  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
                                sizeof(buf) - sizeof(text)));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  memcpy(buf, ref, sizeof(buf));
 
   // Check for deduplication of '%' percent characters.
   EXPECT_EQ(1, SafeSPrintf(buf, "%%"));
@@ -134,23 +134,23 @@
   const char text[] = "hello world";
   const char fmt[]  = "hello%cworld";
   char ref[20], buf[20];
-  SbMemorySet(ref, 'X', sizeof(buf));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  memset(ref, 'X', sizeof(buf));
+  memcpy(buf, ref, sizeof(buf));
 
   // A negative buffer size should always result in an error.
   EXPECT_EQ(-1, SafeSNPrintf(buf, static_cast<size_t>(-1), fmt, ' '));
-  EXPECT_TRUE(!SbMemoryCompare(buf, ref, sizeof(buf)));
+  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
 
   // Zero buffer size should always result in an error.
   EXPECT_EQ(-1, SafeSNPrintf(buf, 0, fmt, ' '));
-  EXPECT_TRUE(!SbMemoryCompare(buf, ref, sizeof(buf)));
+  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
 
   // A one-byte buffer should always print a single NUL byte.
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
             SafeSNPrintf(buf, 1, fmt, ' '));
   EXPECT_EQ(0, buf[0]);
-  EXPECT_TRUE(!SbMemoryCompare(buf + 1, ref + 1, sizeof(buf) - 1));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  EXPECT_TRUE(!memcmp(buf + 1, ref + 1, sizeof(buf) - 1));
+  memcpy(buf, ref, sizeof(buf));
 
   // A larger (but limited) buffer should always leave the trailing bytes
   // unchanged.
@@ -158,24 +158,24 @@
             SafeSNPrintf(buf, 2, fmt, ' '));
   EXPECT_EQ(text[0], buf[0]);
   EXPECT_EQ(0, buf[1]);
-  EXPECT_TRUE(!SbMemoryCompare(buf + 2, ref + 2, sizeof(buf) - 2));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  EXPECT_TRUE(!memcmp(buf + 2, ref + 2, sizeof(buf) - 2));
+  memcpy(buf, ref, sizeof(buf));
 
   // A unrestricted buffer length should always leave the trailing bytes
   // unchanged.
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
             SafeSNPrintf(buf, sizeof(buf), fmt, ' '));
   EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!SbMemoryCompare(buf + sizeof(text), ref + sizeof(text),
+  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
                                sizeof(buf) - sizeof(text)));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  memcpy(buf, ref, sizeof(buf));
 
   // The same test using SafeSPrintf() instead of SafeSNPrintf().
   EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSPrintf(buf, fmt, ' '));
   EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!SbMemoryCompare(buf + sizeof(text), ref + sizeof(text),
+  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
                                sizeof(buf) - sizeof(text)));
-  SbMemoryCopy(buf, ref, sizeof(buf));
+  memcpy(buf, ref, sizeof(buf));
 
   // Check for deduplication of '%' percent characters.
   EXPECT_EQ(1, SafeSPrintf(buf, "%%", 0));
@@ -359,10 +359,10 @@
   SafeSPrintf(buf, "%019p", buf);
   EXPECT_EQ(std::string(addr), std::string(buf));
   sprintf(addr, "0x%llX", (unsigned long long)(uintptr_t)buf);
-  SbMemorySet(
+  memset(
       addr, ' ',
-      (char*)SbMemoryMove(addr + sizeof(addr) - SbStringGetLength(addr) - 1,
-                          addr, SbStringGetLength(addr) + 1) -
+      (char*)memmove(addr + sizeof(addr) - strlen(addr) - 1,
+                          addr, strlen(addr) + 1) -
           addr);
   SafeSPrintf(buf, "%19p", buf);
   EXPECT_EQ(std::string(addr), std::string(buf));
@@ -377,7 +377,7 @@
   // Allocate slightly more space, so that we can verify that SafeSPrintf()
   // never writes past the end of the buffer.
   std::unique_ptr<char[]> tmp(new char[sz + 2]);
-  SbMemorySet(tmp.get(), 'X', sz + 2);
+  memset(tmp.get(), 'X', sz + 2);
 
   // Use SafeSPrintf() to output a complex list of arguments:
   // - test padding and truncating %c single characters.
@@ -405,7 +405,7 @@
     // Various sanity checks:
     // The numbered of characters needed to print the full string should always
     // be bigger or equal to the bytes that have actually been output.
-    len = SbStringGetLength(tmp.get());
+    len = strlen(tmp.get());
     CHECK_GE(needed, len+1);
 
     // The number of characters output should always fit into the buffer that
@@ -462,7 +462,7 @@
   // We allocated a slightly larger buffer, so that we could perform some
   // extra sanity checks. Now that the tests have all passed, we copy the
   // data to the output buffer that the caller provided.
-  SbMemoryCopy(buf, tmp.get(), len + 1);
+  memcpy(buf, tmp.get(), len + 1);
 }
 
 #if !defined(NDEBUG)
@@ -493,7 +493,7 @@
   // happen in a lot of different states.
   char ref[256];
   PrintLongString(ref, sizeof(ref));
-  for (size_t i = SbStringGetLength(ref) + 1; i; --i) {
+  for (size_t i = strlen(ref) + 1; i; --i) {
     char buf[sizeof(ref)];
     PrintLongString(buf, i);
     EXPECT_EQ(std::string(ref, i - 1), std::string(buf));
@@ -506,7 +506,7 @@
   // Repeat the truncation test and verify that this other code path in
   // SafeSPrintf() works correctly, too.
 #if !defined(NDEBUG)
-  for (size_t i = SbStringGetLength(ref) + 1; i > 1; --i) {
+  for (size_t i = strlen(ref) + 1; i > 1; --i) {
     ScopedSafeSPrintfSSizeMaxSetter ssize_max_setter(i);
     char buf[sizeof(ref)];
     PrintLongString(buf, sizeof(buf));
diff --git a/src/base/strings/string16.cc b/src/base/strings/string16.cc
index af5e014..091d8ee 100644
--- a/src/base/strings/string16.cc
+++ b/src/base/strings/string16.cc
@@ -58,11 +58,11 @@
 }
 
 char16* c16SbMemoryMove(char16* s1, const char16* s2, size_t n) {
-  return static_cast<char16*>(SbMemoryMove(s1, s2, n * sizeof(char16)));
+  return static_cast<char16*>(memmove(s1, s2, n * sizeof(char16)));
 }
 
 char16* c16SbMemoryCopy(char16* s1, const char16* s2, size_t n) {
-  return static_cast<char16*>(SbMemoryCopy(s1, s2, n * sizeof(char16)));
+  return static_cast<char16*>(memcpy(s1, s2, n * sizeof(char16)));
 }
 
 char16* c16SbMemorySet(char16* s, char16 c, size_t n) {
diff --git a/src/base/strings/string_number_conversions.cc b/src/base/strings/string_number_conversions.cc
index 8a57e5e..9995ac8 100644
--- a/src/base/strings/string_number_conversions.cc
+++ b/src/base/strings/string_number_conversions.cc
@@ -377,7 +377,7 @@
 
   // The number will be ASCII. This creates the string using the "input
   // iterator" variant which promotes from 8-bit to 16-bit via "=".
-  return base::string16(&buffer[0], &buffer[SbStringGetLength(buffer)]);
+  return base::string16(&buffer[0], &buffer[strlen(buffer)]);
 }
 
 bool StringToInt(StringPiece input, int* output) {
diff --git a/src/base/strings/string_number_conversions_unittest.cc b/src/base/strings/string_number_conversions_unittest.cc
index 4cd2d3a..c2c4804 100644
--- a/src/base/strings/string_number_conversions_unittest.cc
+++ b/src/base/strings/string_number_conversions_unittest.cc
@@ -863,12 +863,12 @@
   // The following two values were seen in crashes in the wild.
   const char input_bytes[8] = {0, 0, 0, 0, '\xee', '\x6d', '\x73', '\x42'};
   double input = 0;
-  SbMemoryCopy(&input, input_bytes, arraysize(input_bytes));
+  memcpy(&input, input_bytes, arraysize(input_bytes));
   EXPECT_EQ("1335179083776", NumberToString(input));
   const char input_bytes2[8] =
       {0, 0, 0, '\xa0', '\xda', '\x6c', '\x73', '\x42'};
   input = 0;
-  SbMemoryCopy(&input, input_bytes2, arraysize(input_bytes2));
+  memcpy(&input, input_bytes2, arraysize(input_bytes2));
   EXPECT_EQ("1334890332160", NumberToString(input));
 }
 
diff --git a/src/base/strings/string_piece.cc b/src/base/strings/string_piece.cc
index 50e48a0..70e6a29 100644
--- a/src/base/strings/string_piece.cc
+++ b/src/base/strings/string_piece.cc
@@ -93,7 +93,7 @@
              size_t n,
              size_t pos) {
   size_t ret = std::min(self.size() - pos, n);
-  SbMemoryCopy(buf, self.data() + pos, ret * sizeof(typename STR::value_type));
+  memcpy(buf, self.data() + pos, ret * sizeof(typename STR::value_type));
   return ret;
 }
 
diff --git a/src/base/strings/string_piece.h b/src/base/strings/string_piece.h
index 5c151ce..4062bc9 100644
--- a/src/base/strings/string_piece.h
+++ b/src/base/strings/string_piece.h
@@ -30,7 +30,6 @@
 #include "base/strings/char_traits.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_piece_forward.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 namespace base {
@@ -205,9 +204,9 @@
   // returned buffer may or may not be null terminated.  Therefore it is
   // typically a mistake to pass data() to a routine that expects a NUL
   // terminated string.
-  CONSTEXPR const value_type* data() const { return ptr_; }
-  CONSTEXPR size_type size() const { return length_; }
-  CONSTEXPR size_type length() const { return length_; }
+  constexpr const value_type* data() const { return ptr_; }
+  constexpr size_type size() const { return length_; }
+  constexpr size_type length() const { return length_; }
   bool empty() const { return length_ == 0; }
 
   void clear() {
@@ -223,7 +222,7 @@
     length_ = str ? STRING_TYPE::traits_type::length(str) : 0;
   }
 
-  CONSTEXPR value_type operator[](size_type i) const {
+  constexpr value_type operator[](size_type i) const {
     CHECK(i < length_);
     return ptr_[i];
   }
@@ -238,18 +237,18 @@
     return ptr_[length_ - 1];
   }
 
-  CONSTEXPR void remove_prefix(size_type n) {
+  constexpr void remove_prefix(size_type n) {
     CHECK(n <= length_);
     ptr_ += n;
     length_ -= n;
   }
 
-  CONSTEXPR void remove_suffix(size_type n) {
+  constexpr void remove_suffix(size_type n) {
     CHECK(n <= length_);
     length_ -= n;
   }
 
-  CONSTEXPR int compare(BasicStringPiece x) const noexcept {
+  constexpr int compare(BasicStringPiece x) const noexcept {
     int r = CharTraits<value_type>::compare(
         ptr_, x.ptr_, (length_ < x.length_ ? length_ : x.length_));
     if (r == 0) {
diff --git a/src/base/strings/string_piece_unittest.cc b/src/base/strings/string_piece_unittest.cc
index 498cbd9..a65ecb7 100644
--- a/src/base/strings/string_piece_unittest.cc
+++ b/src/base/strings/string_piece_unittest.cc
@@ -7,7 +7,6 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -708,98 +707,98 @@
 
 TEST(StringPieceTest, CONSTEXPRCtor) {
   {
-    CONSTEXPR StringPiece piece;
+    constexpr StringPiece piece;
     std::ignore = piece;
   }
 
   {
-    CONSTEXPR StringPiece piece("abc");
+    constexpr StringPiece piece("abc");
     std::ignore = piece;
   }
 
   {
-    CONSTEXPR StringPiece piece("abc", 2);
+    constexpr StringPiece piece("abc", 2);
     std::ignore = piece;
   }
 }
 
 TEST(StringPieceTest, CONSTEXPRData) {
   {
-    CONSTEXPR StringPiece piece;
-    STATIC_ASSERT(piece.data() == nullptr, "");
+    constexpr StringPiece piece;
+    static_assert(piece.data() == nullptr, "");
   }
 
   {
-    CONSTEXPR StringPiece piece("abc");
-    STATIC_ASSERT(piece.data()[0] == 'a', "");
-    STATIC_ASSERT(piece.data()[1] == 'b', "");
-    STATIC_ASSERT(piece.data()[2] == 'c', "");
+    constexpr StringPiece piece("abc");
+    static_assert(piece.data()[0] == 'a', "");
+    static_assert(piece.data()[1] == 'b', "");
+    static_assert(piece.data()[2] == 'c', "");
   }
 
   {
-    CONSTEXPR StringPiece piece("def", 2);
-    STATIC_ASSERT(piece.data()[0] == 'd', "");
-    STATIC_ASSERT(piece.data()[1] == 'e', "");
+    constexpr StringPiece piece("def", 2);
+    static_assert(piece.data()[0] == 'd', "");
+    static_assert(piece.data()[1] == 'e', "");
   }
 }
 
 TEST(StringPieceTest, CONSTEXPRSize) {
   {
-    CONSTEXPR StringPiece piece;
-    STATIC_ASSERT(piece.size() == 0, "");
+    constexpr StringPiece piece;
+    static_assert(piece.size() == 0, "");
   }
 
   {
-    CONSTEXPR StringPiece piece("abc");
-    STATIC_ASSERT(piece.size() == 3, "");
+    constexpr StringPiece piece("abc");
+    static_assert(piece.size() == 3, "");
   }
 
   {
-    CONSTEXPR StringPiece piece("def", 2);
-    STATIC_ASSERT(piece.size() == 2, "");
+    constexpr StringPiece piece("def", 2);
+    static_assert(piece.size() == 2, "");
   }
 }
 
 TEST(StringPieceTest, Compare) {
-  CONSTEXPR StringPiece piece = "def";
+  constexpr StringPiece piece = "def";
 
-  STATIC_ASSERT(piece.compare("ab") == 1, "");
-  STATIC_ASSERT(piece.compare("abc") == 1, "");
-  STATIC_ASSERT(piece.compare("abcd") == 1, "");
-  STATIC_ASSERT(piece.compare("de") == 1, "");
-  STATIC_ASSERT(piece.compare("def") == 0, "");
-  STATIC_ASSERT(piece.compare("defg") == -1, "");
-  STATIC_ASSERT(piece.compare("gh") == -1, "");
-  STATIC_ASSERT(piece.compare("ghi") == -1, "");
-  STATIC_ASSERT(piece.compare("ghij") == -1, "");
+  static_assert(piece.compare("ab") == 1, "");
+  static_assert(piece.compare("abc") == 1, "");
+  static_assert(piece.compare("abcd") == 1, "");
+  static_assert(piece.compare("de") == 1, "");
+  static_assert(piece.compare("def") == 0, "");
+  static_assert(piece.compare("defg") == -1, "");
+  static_assert(piece.compare("gh") == -1, "");
+  static_assert(piece.compare("ghi") == -1, "");
+  static_assert(piece.compare("ghij") == -1, "");
 }
 
 TEST(StringPieceTest, StartsWith) {
-  CONSTEXPR StringPiece piece("abc");
+  constexpr StringPiece piece("abc");
 
-  STATIC_ASSERT(piece.starts_with(""), "");
-  STATIC_ASSERT(piece.starts_with("a"), "");
-  STATIC_ASSERT(piece.starts_with("ab"), "");
-  STATIC_ASSERT(piece.starts_with("abc"), "");
+  static_assert(piece.starts_with(""), "");
+  static_assert(piece.starts_with("a"), "");
+  static_assert(piece.starts_with("ab"), "");
+  static_assert(piece.starts_with("abc"), "");
 
-  STATIC_ASSERT(!piece.starts_with("b"), "");
-  STATIC_ASSERT(!piece.starts_with("bc"), "");
+  static_assert(!piece.starts_with("b"), "");
+  static_assert(!piece.starts_with("bc"), "");
 
-  STATIC_ASSERT(!piece.starts_with("abcd"), "");
+  static_assert(!piece.starts_with("abcd"), "");
 }
 
 TEST(StringPieceTest, EndsWith) {
-  CONSTEXPR StringPiece piece("abc");
+  constexpr StringPiece piece("abc");
 
-  STATIC_ASSERT(piece.ends_with(""), "");
-  STATIC_ASSERT(piece.ends_with("c"), "");
-  STATIC_ASSERT(piece.ends_with("bc"), "");
-  STATIC_ASSERT(piece.ends_with("abc"), "");
+  static_assert(piece.ends_with(""), "");
+  static_assert(piece.ends_with("c"), "");
+  static_assert(piece.ends_with("bc"), "");
+  static_assert(piece.ends_with("abc"), "");
 
-  STATIC_ASSERT(!piece.ends_with("a"), "");
-  STATIC_ASSERT(!piece.ends_with("ab"), "");
+  static_assert(!piece.ends_with("a"), "");
+  static_assert(!piece.ends_with("ab"), "");
 
-  STATIC_ASSERT(!piece.ends_with("abcd"), "");
+  static_assert(!piece.ends_with("abcd"), "");
 }
 
 }  // namespace base
diff --git a/src/base/strings/string_util_starboard.h b/src/base/strings/string_util_starboard.h
index 65cbc77..9de5572 100644
--- a/src/base/strings/string_util_starboard.h
+++ b/src/base/strings/string_util_starboard.h
@@ -48,7 +48,7 @@
 
 inline int strncmp16(const char16* s1, const char16* s2, size_t count) {
 #if defined(WCHAR_T_IS_UTF16)
-  return SbStringCompareWide(s1, s2, count);
+  return wcsncmp(s1, s2, count);
 #elif defined(WCHAR_T_IS_UTF32)
   return c16SbMemoryCompare(s1, s2, count);
 #endif
diff --git a/src/base/strings/string_util_unittest.cc b/src/base/strings/string_util_unittest.cc
index e9105ea..474358a 100644
--- a/src/base/strings/string_util_unittest.cc
+++ b/src/base/strings/string_util_unittest.cc
@@ -1108,9 +1108,9 @@
     char dst[10];
     wchar_t wdst[10];
     EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, SbMemoryCompare(dst, "abcdefg", 8));
+    EXPECT_EQ(0, memcmp(dst, "abcdefg", 8));
     EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, SbMemoryCompare(wdst, L"abcdefg", sizeof(wchar_t) * 8));
+    EXPECT_EQ(0, memcmp(wdst, L"abcdefg", sizeof(wchar_t) * 8));
   }
 
   // Test dst_size == 0, nothing should be written to |dst| and we should
@@ -1131,9 +1131,9 @@
     char dst[8];
     wchar_t wdst[8];
     EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, SbMemoryCompare(dst, "abcdefg", 8));
+    EXPECT_EQ(0, memcmp(dst, "abcdefg", 8));
     EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, SbMemoryCompare(wdst, L"abcdefg", sizeof(wchar_t) * 8));
+    EXPECT_EQ(0, memcmp(wdst, L"abcdefg", sizeof(wchar_t) * 8));
   }
 
   // Test the case were we we are one smaller, so we can't fit the null.
@@ -1141,9 +1141,9 @@
     char dst[7];
     wchar_t wdst[7];
     EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, SbMemoryCompare(dst, "abcdef", 7));
+    EXPECT_EQ(0, memcmp(dst, "abcdef", 7));
     EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, SbMemoryCompare(wdst, L"abcdef", sizeof(wchar_t) * 7));
+    EXPECT_EQ(0, memcmp(wdst, L"abcdef", sizeof(wchar_t) * 7));
   }
 
   // Test the case were we are just too small.
@@ -1151,9 +1151,9 @@
     char dst[3];
     wchar_t wdst[3];
     EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, SbMemoryCompare(dst, "ab", 3));
+    EXPECT_EQ(0, memcmp(dst, "ab", 3));
     EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, SbMemoryCompare(wdst, L"ab", sizeof(wchar_t) * 3));
+    EXPECT_EQ(0, memcmp(wdst, L"ab", sizeof(wchar_t) * 3));
   }
 }
 
@@ -1265,7 +1265,7 @@
     // Test with an input/output var of ample capacity; should
     // not realloc.
     std::string input_output = scenario.input;
-    input_output.reserve(SbStringGetLength(scenario.output) * 2);
+    input_output.reserve(strlen(scenario.output) * 2);
     const void* original_buffer = input_output.data();
     bool result = ReplaceChars(input_output, scenario.replace_chars,
                                scenario.replace_with, &input_output);
@@ -1348,7 +1348,7 @@
   static void WritesCorrectly(size_t num_chars) {
     std::string buffer;
     char kOriginal[] = "supercali";
-    PoemStringCopyN(WriteInto(&buffer, num_chars + 1), kOriginal, num_chars);
+    starboard::strlcpy(WriteInto(&buffer, num_chars + 1), kOriginal, num_chars + 1);
     // Using std::string(buffer.c_str()) instead of |buffer| truncates the
     // string at the first \0.
     EXPECT_EQ(std::string(kOriginal,
@@ -1371,7 +1371,7 @@
   const char kDead[] = "dead";
   const std::string live = kLive;
   std::string dead = live;
-  PoemStringCopyN(WriteInto(&dead, 5), kDead, 4);
+  starboard::strlcpy(WriteInto(&dead, 5), kDead, 5);
   EXPECT_EQ(kDead, dead);
   EXPECT_EQ(4u, dead.size());
   EXPECT_EQ(kLive, live);
diff --git a/src/base/strings/sys_string_conversions_posix.cc b/src/base/strings/sys_string_conversions_posix.cc
index e5fb69f..b9ff1dc 100644
--- a/src/base/strings/sys_string_conversions_posix.cc
+++ b/src/base/strings/sys_string_conversions_posix.cc
@@ -47,7 +47,7 @@
   // Calculate the number of multi-byte characters.  We walk through the string
   // without writing the output, counting the number of multi-byte characters.
   size_t num_out_chars = 0;
-  SbMemorySet(&ps, 0, sizeof(ps));
+  memset(&ps, 0, sizeof(ps));
   for (size_t i = 0; i < wide.size(); ++i) {
     const wchar_t src = wide[i];
     // Use a temp buffer since calling wcrtomb with an output of NULL does not
@@ -78,7 +78,7 @@
 
   // We walk the input string again, with |i| tracking the index of the
   // wide input, and |j| tracking the multi-byte output.
-  SbMemorySet(&ps, 0, sizeof(ps));
+  memset(&ps, 0, sizeof(ps));
   for (size_t i = 0, j = 0; i < wide.size(); ++i) {
     const wchar_t src = wide[i];
     // We don't want wcrtomb to do its funkiness for embedded NULLs.
@@ -107,7 +107,7 @@
   // Calculate the number of wide characters.  We walk through the string
   // without writing the output, counting the number of wide characters.
   size_t num_out_chars = 0;
-  SbMemorySet(&ps, 0, sizeof(ps));
+  memset(&ps, 0, sizeof(ps));
   for (size_t i = 0; i < native_mb.size(); ) {
     const char* src = native_mb.data() + i;
     size_t res = mbrtowc(nullptr, src, native_mb.size() - i, &ps);
@@ -134,7 +134,7 @@
   std::wstring out;
   out.resize(num_out_chars);
 
-  SbMemorySet(&ps, 0, sizeof(ps));  // Clear the shift state.
+  memset(&ps, 0, sizeof(ps));  // Clear the shift state.
   // We walk the input string again, with |i| tracking the index of the
   // multi-byte input, and |j| tracking the wide output.
   for (size_t i = 0, j = 0; i < native_mb.size(); ++j) {
diff --git a/src/base/strings/utf_string_conversions.cc b/src/base/strings/utf_string_conversions.cc
index 1f77ffb..a83d106 100644
--- a/src/base/strings/utf_string_conversions.cc
+++ b/src/base/strings/utf_string_conversions.cc
@@ -9,7 +9,6 @@
 #include "base/strings/utf_string_conversion_utils.h"
 #include "base/third_party/icu/icu_utf.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 namespace base {
diff --git a/src/base/strings/utf_string_conversions_unittest.cc b/src/base/strings/utf_string_conversions_unittest.cc
index 0dfd72f..941e489 100644
--- a/src/base/strings/utf_string_conversions_unittest.cc
+++ b/src/base/strings/utf_string_conversions_unittest.cc
@@ -102,7 +102,7 @@
     std::wstring converted;
     EXPECT_EQ(convert_cases[i].success,
               UTF8ToWide(convert_cases[i].utf8,
-                         SbStringGetLength(convert_cases[i].utf8), &converted));
+                         strlen(convert_cases[i].utf8), &converted));
     std::wstring expected(convert_cases[i].wide);
     EXPECT_EQ(expected, converted);
   }
@@ -197,11 +197,11 @@
     '\0'
   };
   string16 multistring16;
-  SbMemoryCopy(WriteInto(&multistring16, arraysize(multi16)), multi16,
+  memcpy(WriteInto(&multistring16, arraysize(multi16)), multi16,
                sizeof(multi16));
   EXPECT_EQ(arraysize(multi16) - 1, multistring16.length());
   std::string expected;
-  SbMemoryCopy(WriteInto(&expected, arraysize(multi)), multi, sizeof(multi));
+  memcpy(WriteInto(&expected, arraysize(multi)), multi, sizeof(multi));
   EXPECT_EQ(arraysize(multi) - 1, expected.length());
   const std::string& converted = UTF16ToUTF8(multistring16);
   EXPECT_EQ(arraysize(multi) - 1, converted.length());
diff --git a/src/base/sys_info_linux.cc b/src/base/sys_info_linux.cc
index 55cffc3..09a8d5a 100644
--- a/src/base/sys_info_linux.cc
+++ b/src/base/sys_info_linux.cc
@@ -82,7 +82,7 @@
     std::istringstream iss(contents);
     std::string line;
     while (std::getline(iss, line)) {
-      if (line.compare(0, SbStringGetLength(kCpuModelPrefix),
+      if (line.compare(0, strlen(kCpuModelPrefix),
                        kCpuModelPrefix) == 0) {
         size_t pos = line.find(": ");
         return line.substr(pos + 2);
diff --git a/src/base/task/lazy_task_runner.h b/src/base/task/lazy_task_runner.h
index 237c0d1..03bdf6a 100644
--- a/src/base/task/lazy_task_runner.h
+++ b/src/base/task/lazy_task_runner.h
@@ -17,7 +17,6 @@
 #include "base/task/task_scheduler/scheduler_lock.h"
 #include "base/task/task_traits.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 // Lazy(Sequenced|SingleThread|COMSTA)TaskRunner lazily creates a TaskRunner.
 //
@@ -96,7 +95,7 @@
 // |traits| are TaskTraits used when creating the SequencedTaskRunner.
 #define LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER(traits)        \
   base::LazySequencedTaskRunner::CreateInternal(traits);      \
-  ALLOW_UNUSED_TYPE CONSTEXPR                                 \
+  ALLOW_UNUSED_TYPE constexpr                                 \
       base::TaskTraits LAZY_TASK_RUNNER_CONCATENATE_INTERNAL( \
           kVerifyTraitsAreConstexpr, __LINE__) = traits
 
@@ -105,10 +104,10 @@
 // thread with other SingleThreadTaskRunners.
 #define LAZY_SINGLE_THREAD_TASK_RUNNER_INITIALIZER(traits, thread_mode)   \
   base::LazySingleThreadTaskRunner::CreateInternal(traits, thread_mode);  \
-  ALLOW_UNUSED_TYPE CONSTEXPR                                             \
+  ALLOW_UNUSED_TYPE constexpr                                             \
       base::TaskTraits LAZY_TASK_RUNNER_CONCATENATE_INTERNAL(             \
           kVerifyTraitsAreConstexpr, __LINE__) = traits;                  \
-  ALLOW_UNUSED_TYPE CONSTEXPR base::SingleThreadTaskRunnerThreadMode      \
+  ALLOW_UNUSED_TYPE constexpr base::SingleThreadTaskRunnerThreadMode      \
       LAZY_TASK_RUNNER_CONCATENATE_INTERNAL(kVerifyThreadModeIsConstexpr, \
                                             __LINE__) = thread_mode
 
diff --git a/src/base/task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/src/base/task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
index 8d4e0b0..0f412fb 100644
--- a/src/base/task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
+++ b/src/base/task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
@@ -24,7 +24,6 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if defined(OS_WIN)
@@ -303,7 +302,7 @@
 }
 
 TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, ThreadNamesSet) {
-  CONSTEXPR TaskTraits foo_traits = {TaskPriority::BEST_EFFORT,
+  constexpr TaskTraits foo_traits = {TaskPriority::BEST_EFFORT,
                                      TaskShutdownBehavior::BLOCK_SHUTDOWN};
   scoped_refptr<SingleThreadTaskRunner> foo_task_runner =
       single_thread_task_runner_manager_
@@ -312,7 +311,7 @@
   foo_task_runner->PostTask(FROM_HERE,
                             BindOnce(&CaptureThreadName, &foo_captured_name));
 
-  CONSTEXPR TaskTraits user_blocking_traits = {
+  constexpr TaskTraits user_blocking_traits = {
       TaskPriority::USER_BLOCKING, MayBlock(),
       TaskShutdownBehavior::BLOCK_SHUTDOWN};
   scoped_refptr<SingleThreadTaskRunner> user_blocking_task_runner =
diff --git a/src/base/task/task_scheduler/service_thread.cc b/src/base/task/task_scheduler/service_thread.cc
index c2bea34..be315c1 100644
--- a/src/base/task/task_scheduler/service_thread.cc
+++ b/src/base/task/task_scheduler/service_thread.cc
@@ -71,7 +71,7 @@
   if (!task_tracker_)
     return;
 
-  static CONSTEXPR TaskTraits kReportedTraits[] = {
+  static constexpr TaskTraits kReportedTraits[] = {
       {TaskPriority::BEST_EFFORT},   {TaskPriority::BEST_EFFORT, MayBlock()},
       {TaskPriority::USER_VISIBLE},  {TaskPriority::USER_VISIBLE, MayBlock()},
       {TaskPriority::USER_BLOCKING}, {TaskPriority::USER_BLOCKING, MayBlock()}};
diff --git a/src/base/task/task_scheduler/task_scheduler_impl.cc b/src/base/task/task_scheduler/task_scheduler_impl.cc
index 9a6c76d..89b5853 100644
--- a/src/base/task/task_scheduler/task_scheduler_impl.cc
+++ b/src/base/task/task_scheduler/task_scheduler_impl.cc
@@ -24,7 +24,6 @@
 #include "base/task/task_scheduler/task.h"
 #include "base/task/task_scheduler/task_tracker.h"
 #include "base/time/time.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 namespace internal {
diff --git a/src/base/task/task_scheduler/task_tracker_unittest.cc b/src/base/task/task_scheduler/task_tracker_unittest.cc
index f0fbfc2..392ea8b 100644
--- a/src/base/task/task_scheduler/task_tracker_unittest.cc
+++ b/src/base/task/task_scheduler/task_tracker_unittest.cc
@@ -1487,7 +1487,7 @@
   struct {
     const TaskTraits traits;
     const char* const expected_histogram;
-  } static CONSTEXPR kTests[] = {
+  } static constexpr kTests[] = {
       {{TaskPriority::BEST_EFFORT},
        "TaskScheduler.TaskLatencyMicroseconds.Test."
        "BackgroundTaskPriority"},
diff --git a/src/base/task/task_traits.h b/src/base/task/task_traits.h
index baa8366..97a87ad 100644
--- a/src/base/task/task_traits.h
+++ b/src/base/task/task_traits.h
@@ -169,7 +169,7 @@
                 trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value ||
                 trait_helpers::AreValidTraitsForExtension<ArgTypes...>::value>>
 #endif
-  CONSTEXPR TaskTraits(ArgTypes... args)
+  constexpr TaskTraits(ArgTypes... args)
 #if __cplusplus < 201402L
       :
 #else
@@ -212,34 +212,34 @@
   // the value from |right|. Note that extension traits are not merged: any
   // extension traits in |left| are discarded if extension traits are present in
   // |right|.
-  static CONSTEXPR TaskTraits Override(const TaskTraits& left,
+  static constexpr TaskTraits Override(const TaskTraits& left,
                                        const TaskTraits& right) {
     return TaskTraits(left, right);
   }
 
   // Returns true if the priority was set explicitly.
-  CONSTEXPR bool priority_set_explicitly() const {
+  constexpr bool priority_set_explicitly() const {
     return priority_set_explicitly_;
   }
 
   // Returns the priority of tasks with these traits.
-  CONSTEXPR TaskPriority priority() const { return priority_; }
+  constexpr TaskPriority priority() const { return priority_; }
 
   // Returns true if the shutdown behavior was set explicitly.
-  CONSTEXPR bool shutdown_behavior_set_explicitly() const {
+  constexpr bool shutdown_behavior_set_explicitly() const {
     return shutdown_behavior_set_explicitly_;
   }
 
   // Returns the shutdown behavior of tasks with these traits.
-  CONSTEXPR TaskShutdownBehavior shutdown_behavior() const {
+  constexpr TaskShutdownBehavior shutdown_behavior() const {
     return shutdown_behavior_;
   }
 
   // Returns true if tasks with these traits may block.
-  CONSTEXPR bool may_block() const { return may_block_; }
+  constexpr bool may_block() const { return may_block_; }
 
   // Returns true if tasks with these traits may use base/ sync primitives.
-  CONSTEXPR bool with_base_sync_primitives() const {
+  constexpr bool with_base_sync_primitives() const {
     return with_base_sync_primitives_;
   }
 
@@ -254,7 +254,7 @@
   }
 
  private:
-  CONSTEXPR TaskTraits(const TaskTraits& left, const TaskTraits& right)
+  constexpr TaskTraits(const TaskTraits& left, const TaskTraits& right)
       : extension_(right.extension_.extension_id !=
                            TaskTraitsExtensionStorage::kInvalidExtensionId
                        ? right.extension_
diff --git a/src/base/task/task_traits_details.h b/src/base/task/task_traits_details.h
index 6ed0d58..4d02c28 100644
--- a/src/base/task/task_traits_details.h
+++ b/src/base/task/task_traits_details.h
@@ -10,7 +10,6 @@
 #include <type_traits>
 #include <utility>
 
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 namespace trait_helpers {
@@ -183,21 +182,21 @@
 
 template <typename ArgType>
 struct BooleanTraitFilter : public BasicTraitFilter<bool> {
-  CONSTEXPR BooleanTraitFilter() { this->value = false; }
-  CONSTEXPR BooleanTraitFilter(ArgType) { this->value = true; }
+  constexpr BooleanTraitFilter() { this->value = false; }
+  constexpr BooleanTraitFilter(ArgType) { this->value = true; }
 };
 
 template <typename ArgType, ArgType DefaultValue>
 struct EnumTraitFilter : public BasicTraitFilter<ArgType> {
-  CONSTEXPR EnumTraitFilter() { this->value = DefaultValue; }
-  CONSTEXPR EnumTraitFilter(ArgType arg) { this->value = arg; }
+  constexpr EnumTraitFilter() { this->value = DefaultValue; }
+  constexpr EnumTraitFilter(ArgType arg) { this->value = arg; }
 };
 
 // Tests whether multiple given argtument types are all valid traits according
 // to the provided ValidTraits. To use, define a ValidTraits
 template <typename ArgType>
 struct RequiredEnumTraitFilter : public BasicTraitFilter<ArgType> {
-  CONSTEXPR RequiredEnumTraitFilter(ArgType arg) { this->value = arg; }
+  constexpr RequiredEnumTraitFilter(ArgType arg) { this->value = arg; }
 };
 
 #ifdef STARBOARD
diff --git a/src/base/task/task_traits_extension.h b/src/base/task/task_traits_extension.h
index d03d5b0..044a637 100644
--- a/src/base/task/task_traits_extension.h
+++ b/src/base/task/task_traits_extension.h
@@ -11,7 +11,6 @@
 
 #include "base/base_export.h"
 #include "base/task/task_traits_details.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 namespace base {
@@ -134,7 +133,7 @@
   inline constexpr TaskTraitsExtensionStorage(
       uint8_t extension_id_in,
       const std::array<uint8_t, kStorageSize>& data_in);
-  inline CONSTEXPR TaskTraitsExtensionStorage(
+  inline constexpr TaskTraitsExtensionStorage(
       uint8_t extension_id_in,
       std::array<uint8_t, kStorageSize>&& data_in);
 
@@ -172,7 +171,7 @@
     const std::array<uint8_t, kStorageSize>& data_in)
     : extension_id(extension_id_in), data(data_in) {}
 
-inline CONSTEXPR TaskTraitsExtensionStorage::TaskTraitsExtensionStorage(
+inline constexpr TaskTraitsExtensionStorage::TaskTraitsExtensionStorage(
     uint8_t extension_id_in,
     std::array<uint8_t, kStorageSize>&& data_in)
     : extension_id(extension_id_in), data(std::move(data_in)) {}
diff --git a/src/base/task/task_traits_extension_unittest.cc b/src/base/task/task_traits_extension_unittest.cc
index 394cdbe..59d295e 100644
--- a/src/base/task/task_traits_extension_unittest.cc
+++ b/src/base/task/task_traits_extension_unittest.cc
@@ -5,13 +5,12 @@
 #include "base/task/task_traits.h"
 
 #include "base/task/test_task_traits_extension.h"
-#include "nb/cpp14oncpp11.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
 
 TEST(TaskTraitsExtensionTest, NoExtension) {
-  CONSTEXPR TaskTraits traits = {};
+  constexpr TaskTraits traits = {};
 
   EXPECT_EQ(traits.extension_id(),
             TaskTraitsExtensionStorage::kInvalidExtensionId);
@@ -20,7 +19,7 @@
 #if !defined(STARBOARD)
 // Cobalt does not support task traits with extension yet.
 TEST(TaskTraitsExtensionTest, CreateWithOneExtensionTrait) {
-  CONSTEXPR TaskTraits traits = {TestExtensionEnumTrait::kB};
+  constexpr TaskTraits traits = {TestExtensionEnumTrait::kB};
 
   EXPECT_EQ(traits.GetExtension<TestTaskTraitsExtension>().enum_trait(),
             TestExtensionEnumTrait::kB);
@@ -28,7 +27,7 @@
 }
 
 TEST(TaskTraitsExtensionTest, CreateWithMultipleExtensionTraits) {
-  CONSTEXPR TaskTraits traits = {TestExtensionEnumTrait::kB,
+  constexpr TaskTraits traits = {TestExtensionEnumTrait::kB,
                                  TestExtensionBoolTrait()};
 
   EXPECT_EQ(traits.GetExtension<TestTaskTraitsExtension>().enum_trait(),
@@ -37,7 +36,7 @@
 }
 
 TEST(TaskTraitsExtensionTest, CreateWithBaseAndExtensionTraits) {
-  CONSTEXPR TaskTraits traits = {TaskPriority::USER_BLOCKING,
+  constexpr TaskTraits traits = {TaskPriority::USER_BLOCKING,
                                  TestExtensionEnumTrait::kC,
                                  TestExtensionBoolTrait()};
 
diff --git a/src/base/task/task_traits_unittest.cc b/src/base/task/task_traits_unittest.cc
index 41e76e8..95d24e4 100644
--- a/src/base/task/task_traits_unittest.cc
+++ b/src/base/task/task_traits_unittest.cc
@@ -3,14 +3,13 @@
 // found in the LICENSE file.
 
 #include "base/task/task_traits.h"
-#include "nb/cpp14oncpp11.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
 
 TEST(TaskTraitsTest, Default) {
-  CONSTEXPR TaskTraits traits = {};
+  constexpr TaskTraits traits = {};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
@@ -19,7 +18,7 @@
 }
 
 TEST(TaskTraitsTest, TaskPriority) {
-  CONSTEXPR TaskTraits traits = {TaskPriority::BEST_EFFORT};
+  constexpr TaskTraits traits = {TaskPriority::BEST_EFFORT};
   EXPECT_TRUE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::BEST_EFFORT, traits.priority());
   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
@@ -28,7 +27,7 @@
 }
 
 TEST(TaskTraitsTest, TaskShutdownBehavior) {
-  CONSTEXPR TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
+  constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
   EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN, traits.shutdown_behavior());
@@ -37,7 +36,7 @@
 }
 
 TEST(TaskTraitsTest, MayBlock) {
-  CONSTEXPR TaskTraits traits = {MayBlock()};
+  constexpr TaskTraits traits = {MayBlock()};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
@@ -46,7 +45,7 @@
 }
 
 TEST(TaskTraitsTest, WithBaseSyncPrimitives) {
-  CONSTEXPR TaskTraits traits = {WithBaseSyncPrimitives()};
+  constexpr TaskTraits traits = {WithBaseSyncPrimitives()};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
@@ -55,7 +54,7 @@
 }
 
 TEST(TaskTraitsTest, MultipleTraits) {
-  CONSTEXPR TaskTraits traits = {TaskPriority::BEST_EFFORT,
+  constexpr TaskTraits traits = {TaskPriority::BEST_EFFORT,
                                  TaskShutdownBehavior::BLOCK_SHUTDOWN,
                                  MayBlock(), WithBaseSyncPrimitives()};
   EXPECT_TRUE(traits.priority_set_explicitly());
@@ -66,10 +65,10 @@
 }
 
 TEST(TaskTraitsTest, Copy) {
-  CONSTEXPR TaskTraits traits = {TaskPriority::BEST_EFFORT,
+  constexpr TaskTraits traits = {TaskPriority::BEST_EFFORT,
                                  TaskShutdownBehavior::BLOCK_SHUTDOWN,
                                  MayBlock(), WithBaseSyncPrimitives()};
-  CONSTEXPR TaskTraits traits_copy(traits);
+  constexpr TaskTraits traits_copy(traits);
   EXPECT_EQ(traits.priority_set_explicitly(),
             traits_copy.priority_set_explicitly());
   EXPECT_EQ(traits.priority(), traits_copy.priority());
@@ -80,9 +79,9 @@
 }
 
 TEST(TaskTraitsTest, OverridePriority) {
-  CONSTEXPR TaskTraits left = {TaskPriority::BEST_EFFORT};
-  CONSTEXPR TaskTraits right = {TaskPriority::USER_BLOCKING};
-  CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+  constexpr TaskTraits left = {TaskPriority::BEST_EFFORT};
+  constexpr TaskTraits right = {TaskPriority::USER_BLOCKING};
+  constexpr TaskTraits overridden = TaskTraits::Override(left, right);
   EXPECT_TRUE(overridden.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_BLOCKING, overridden.priority());
   EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
@@ -93,9 +92,9 @@
 }
 
 TEST(TaskTraitsTest, OverrideShutdownBehavior) {
-  CONSTEXPR TaskTraits left = {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
-  CONSTEXPR TaskTraits right = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
-  CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+  constexpr TaskTraits left = {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
+  constexpr TaskTraits right = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
+  constexpr TaskTraits overridden = TaskTraits::Override(left, right);
   EXPECT_FALSE(overridden.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
   EXPECT_TRUE(overridden.shutdown_behavior_set_explicitly());
@@ -107,9 +106,9 @@
 
 TEST(TaskTraitsTest, OverrideMayBlock) {
   {
-    CONSTEXPR TaskTraits left = {MayBlock()};
-    CONSTEXPR TaskTraits right = {};
-    CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+    constexpr TaskTraits left = {MayBlock()};
+    constexpr TaskTraits right = {};
+    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
     EXPECT_FALSE(overridden.priority_set_explicitly());
     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
@@ -119,9 +118,9 @@
     EXPECT_FALSE(overridden.with_base_sync_primitives());
   }
   {
-    CONSTEXPR TaskTraits left = {};
-    CONSTEXPR TaskTraits right = {MayBlock()};
-    CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+    constexpr TaskTraits left = {};
+    constexpr TaskTraits right = {MayBlock()};
+    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
     EXPECT_FALSE(overridden.priority_set_explicitly());
     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
@@ -134,9 +133,9 @@
 
 TEST(TaskTraitsTest, OverrideWithBaseSyncPrimitives) {
   {
-    CONSTEXPR TaskTraits left = {WithBaseSyncPrimitives()};
-    CONSTEXPR TaskTraits right = {};
-    CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+    constexpr TaskTraits left = {WithBaseSyncPrimitives()};
+    constexpr TaskTraits right = {};
+    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
     EXPECT_FALSE(overridden.priority_set_explicitly());
     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
@@ -146,9 +145,9 @@
     EXPECT_TRUE(overridden.with_base_sync_primitives());
   }
   {
-    CONSTEXPR TaskTraits left = {};
-    CONSTEXPR TaskTraits right = {WithBaseSyncPrimitives()};
-    CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+    constexpr TaskTraits left = {};
+    constexpr TaskTraits right = {WithBaseSyncPrimitives()};
+    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
     EXPECT_FALSE(overridden.priority_set_explicitly());
     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
@@ -160,11 +159,11 @@
 }
 
 TEST(TaskTraitsTest, OverrideMultipleTraits) {
-  CONSTEXPR TaskTraits left = {MayBlock(), TaskPriority::BEST_EFFORT,
+  constexpr TaskTraits left = {MayBlock(), TaskPriority::BEST_EFFORT,
                                TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
-  CONSTEXPR TaskTraits right = {WithBaseSyncPrimitives(),
+  constexpr TaskTraits right = {WithBaseSyncPrimitives(),
                                 TaskPriority::USER_BLOCKING};
-  CONSTEXPR TaskTraits overridden = TaskTraits::Override(left, right);
+  constexpr TaskTraits overridden = TaskTraits::Override(left, right);
   EXPECT_TRUE(overridden.priority_set_explicitly());
   EXPECT_EQ(right.priority(), overridden.priority());
   EXPECT_TRUE(overridden.shutdown_behavior_set_explicitly());
diff --git a/src/base/task/test_task_traits_extension.h b/src/base/task/test_task_traits_extension.h
index c5b6a99..738846c 100644
--- a/src/base/task/test_task_traits_extension.h
+++ b/src/base/task/test_task_traits_extension.h
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/task/task_traits.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 
@@ -43,7 +42,7 @@
         bool_trait_(trait_helpers::GetTraitFromArgList<TestExtensionBoolFilter>(
             args...)) {}
 
-  CONSTEXPR TaskTraitsExtensionStorage Serialize() const {
+  constexpr TaskTraitsExtensionStorage Serialize() const {
     return {kExtensionId, {{static_cast<uint8_t>(enum_trait_), bool_trait_}}};
   }
 
diff --git a/src/base/template_util.h b/src/base/template_util.h
index 8fea7be..b62396a 100644
--- a/src/base/template_util.h
+++ b/src/base/template_util.h
@@ -13,7 +13,6 @@
 #include <vector>
 
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 // Some versions of libstdc++ have partial support for type_traits, but misses
 // a smaller subset while removing some of the older non-standard stuff. Assume
diff --git a/src/base/test/generate_fontconfig_caches.cc b/src/base/test/generate_fontconfig_caches.cc
index 2a4a2ec..f4acab2 100644
--- a/src/base/test/generate_fontconfig_caches.cc
+++ b/src/base/test/generate_fontconfig_caches.cc
@@ -34,7 +34,7 @@
   base::FilePath uuid_file_path =
       dir_module.Append("test_fonts").Append(".uuid");
   const char uuid[] = "df1acc8c-39d5-4a8b-8507-b1a7396ac3ac";
-  WriteFile(uuid_file_path, uuid, SbStringGetLength(uuid));
+  WriteFile(uuid_file_path, uuid, strlen(uuid));
 
   // fontconfig writes the mtime of the test_fonts directory into the cache. It
   // presumably checks this later to ensure that the cache is still up to date.
diff --git a/src/base/test/launcher/test_launcher.cc b/src/base/test/launcher/test_launcher.cc
index 0309580..244239b 100644
--- a/src/base/test/launcher/test_launcher.cc
+++ b/src/base/test/launcher/test_launcher.cc
@@ -631,7 +631,7 @@
   CHECK_EQ(0, pipe(g_shutdown_pipe));
 
   struct sigaction action;
-  SbMemorySet(&action, 0, sizeof(action));
+  memset(&action, 0, sizeof(action));
   sigemptyset(&action.sa_mask);
   action.sa_handler = &ShutdownPipeSignalHandler;
 
diff --git a/src/base/test/test_discardable_memory_allocator.cc b/src/base/test/test_discardable_memory_allocator.cc
index 6ab854f..57f3661 100644
--- a/src/base/test/test_discardable_memory_allocator.cc
+++ b/src/base/test/test_discardable_memory_allocator.cc
@@ -32,7 +32,7 @@
     is_locked_ = false;
     // Force eviction to catch clients not correctly checking the return value
     // of Lock().
-    SbMemorySet(data_.get(), 0, size_);
+    memset(data_.get(), 0, size_);
   }
 
   void* data() const override {
diff --git a/src/base/test/test_file_util_win.cc b/src/base/test/test_file_util_win.cc
index b1be605..557f062 100644
--- a/src/base/test/test_file_util_win.cc
+++ b/src/base/test/test_file_util_win.cc
@@ -50,7 +50,7 @@
   *length = sizeof(PSECURITY_DESCRIPTOR) + dacl->AclSize;
   PermissionInfo* info = reinterpret_cast<PermissionInfo*>(new char[*length]);
   info->security_descriptor = security_descriptor;
-  SbMemoryCopy(&info->dacl, dacl, dacl->AclSize);
+  memcpy(&info->dacl, dacl, dacl->AclSize);
 
   return info;
 }
diff --git a/src/base/test/trace_to_file.cc b/src/base/test/trace_to_file.cc
index 7f66784..673f187 100644
--- a/src/base/test/trace_to_file.cc
+++ b/src/base/test/trace_to_file.cc
@@ -61,12 +61,12 @@
 
 void TraceToFile::WriteFileHeader() {
   const char str[] = "{\"traceEvents\": [";
-  WriteFile(path_, str, static_cast<int>(SbStringGetLength(str)));
+  WriteFile(path_, str, static_cast<int>(strlen(str)));
 }
 
 void TraceToFile::AppendFileFooter() {
   const char str[] = "]}";
-  AppendToFile(path_, str, static_cast<int>(SbStringGetLength(str)));
+  AppendToFile(path_, str, static_cast<int>(strlen(str)));
 }
 
 void TraceToFile::TraceOutputCallback(const std::string& data) {
diff --git a/src/base/third_party/dmg_fp/dtoa.cc b/src/base/third_party/dmg_fp/dtoa.cc
index e7d697c..a32694d 100644
--- a/src/base/third_party/dmg_fp/dtoa.cc
+++ b/src/base/third_party/dmg_fp/dtoa.cc
@@ -622,7 +622,7 @@
 	}
 
 #define Bcopy(x, y)                              \
-  SbMemoryCopy((char*)&x->sign, (char*)&y->sign, \
+  memcpy((char*)&x->sign, (char*)&y->sign, \
                y->wds * sizeof(Long) + 2 * sizeof(int))
 
         static Bigint* multadd
@@ -1824,8 +1824,8 @@
 	if (!(s0 = decimalpoint_cache)) {
 		s0 = (unsigned char*)localeconv()->decimal_point;
                 if ((decimalpoint_cache = (unsigned char*)MALLOC(
-                         SbStringGetLength((CONST char*)s0) + 1))) {
-                  SbStringCopyUnsafe((char*)decimalpoint_cache,
+                         strlen((CONST char*)s0) + 1))) {
+                  strcpy((char*)decimalpoint_cache,
                                      (CONST char*)s0);
                   s0 = decimalpoint_cache;
 			}
diff --git a/src/base/third_party/libevent/evrpc.h b/src/base/third_party/libevent/evrpc.h
index c88da3a..64e6d35 100644
--- a/src/base/third_party/libevent/evrpc.h
+++ b/src/base/third_party/libevent/evrpc.h
@@ -208,7 +208,7 @@
         (int (*)(void*, struct evbuffer*))rplystruct##_unmarshal;             \
     return (evrpc_make_request(ctx));                                         \
   error:                                                                      \
-    SbMemorySet(&status, 0, sizeof(status));                                  \
+    memset(&status, 0, sizeof(status));                                  \
     status.error = EVRPC_STATUS_ERR_UNSTARTED;                                \
     (*(cb))(&status, request, reply, cbarg);                                  \
     return (-1);                                                              \
diff --git a/src/base/third_party/nspr/prtime.cc b/src/base/third_party/nspr/prtime.cc
index 0a4da71..982fcad 100644
--- a/src/base/third_party/nspr/prtime.cc
+++ b/src/base/third_party/nspr/prtime.cc
@@ -1112,7 +1112,7 @@
   if (month == TT_UNKNOWN || date == -1 || year == -1 || year > PR_INT16_MAX)
       return PR_FAILURE;
 
-  SbMemorySet(result, 0, sizeof(*result));
+  memset(result, 0, sizeof(*result));
   if (usec != -1)
         result->tm_usec = usec;
   if (sec != -1)
diff --git a/src/base/threading/scoped_blocking_call_unittest.cc b/src/base/threading/scoped_blocking_call_unittest.cc
index 3ea9950..5e030f3 100644
--- a/src/base/threading/scoped_blocking_call_unittest.cc
+++ b/src/base/threading/scoped_blocking_call_unittest.cc
@@ -8,7 +8,6 @@
 
 #include "base/macros.h"
 #include "base/test/gtest_util.h"
-#include "nb/cpp14oncpp11.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/src/base/threading/thread_local_storage.cc b/src/base/threading/thread_local_storage.cc
index b2cf345..f1d5324 100644
--- a/src/base/threading/thread_local_storage.cc
+++ b/src/base/threading/thread_local_storage.cc
@@ -200,13 +200,13 @@
   // our service is in place. (i.e., don't even call new until after we're
   // setup)
   TlsVectorEntry stack_allocated_tls_data[kThreadLocalStorageSize];
-  SbMemorySet(stack_allocated_tls_data, 0, sizeof(stack_allocated_tls_data));
+  memset(stack_allocated_tls_data, 0, sizeof(stack_allocated_tls_data));
   // Ensure that any rentrant calls change the temp version.
   PlatformThreadLocalStorage::SetTLSValue(key, stack_allocated_tls_data);
 
   // Allocate an array to store our data.
   TlsVectorEntry* tls_data = new TlsVectorEntry[kThreadLocalStorageSize];
-  SbMemoryCopy(tls_data, stack_allocated_tls_data,
+  memcpy(tls_data, stack_allocated_tls_data,
                sizeof(stack_allocated_tls_data));
   PlatformThreadLocalStorage::SetTLSValue(key, tls_data);
   return tls_data;
@@ -235,7 +235,7 @@
   // we have called all g_tls_metadata destructors. (i.e., don't even call
   // delete[] after we're done with destructors.)
   TlsVectorEntry stack_allocated_tls_data[kThreadLocalStorageSize];
-  SbMemoryCopy(stack_allocated_tls_data, tls_data,
+  memcpy(stack_allocated_tls_data, tls_data,
                sizeof(stack_allocated_tls_data));
   // Ensure that any re-entrant calls change the temp version.
   PlatformThreadLocalStorage::TLSKey key =
@@ -248,7 +248,7 @@
   TlsMetadata tls_metadata[kThreadLocalStorageSize];
   {
     base::AutoLock auto_lock(*GetTLSMetadataLock());
-    SbMemoryCopy(tls_metadata, g_tls_metadata, sizeof(g_tls_metadata));
+    memcpy(tls_metadata, g_tls_metadata, sizeof(g_tls_metadata));
   }
 
   int remaining_attempts = kMaxDestructorIterations;
diff --git a/src/base/time/time.h b/src/base/time/time.h
index 88d1238..7cc797e 100644
--- a/src/base/time/time.h
+++ b/src/base/time/time.h
@@ -61,7 +61,6 @@
 #include "base/logging.h"
 #include "base/numerics/safe_math.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 #if defined(STARBOARD)
 #include "starboard/time.h"
@@ -163,7 +162,7 @@
   constexpr int64_t ToInternalValue() const { return delta_; }
 
   // Returns the magnitude (absolute value) of this TimeDelta.
-  CONSTEXPR TimeDelta magnitude() const {
+  constexpr TimeDelta magnitude() const {
     // Some toolchains provide an incomplete C++11 implementation and lack an
     // int64_t overload for std::abs().  The following is a simple branchless
     // implementation:
@@ -242,7 +241,7 @@
     return TimeDelta(std::numeric_limits<int64_t>::max());
   }
   template <typename T>
-  CONSTEXPR TimeDelta operator/(T a) const {
+  constexpr TimeDelta operator/(T a) const {
     CheckedNumeric<int64_t> rv(delta_);
     rv /= a;
     if (rv.IsValid())
@@ -258,7 +257,7 @@
     return *this = (*this * a);
   }
   template <typename T>
-  CONSTEXPR TimeDelta& operator/=(T a) {
+  constexpr TimeDelta& operator/=(T a) {
     return *this = (*this / a);
   }
 
diff --git a/src/base/time/time_unittest.cc b/src/base/time/time_unittest.cc
index b29019e..eb0dcd1 100644
--- a/src/base/time/time_unittest.cc
+++ b/src/base/time/time_unittest.cc
@@ -18,7 +18,6 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/stringprintf.h"
-#include "nb/cpp14oncpp11.h"
 #if defined(STARBOARD)
 #include "base/test/time_helpers.h"
 #endif  // defined(STARBOARD)
@@ -1288,16 +1287,16 @@
 
 TEST(TimeDelta, Magnitude) {
   constexpr int64_t zero = 0;
-  STATIC_ASSERT(TimeDelta::FromMicroseconds(zero) ==
+  static_assert(TimeDelta::FromMicroseconds(zero) ==
                     TimeDelta::FromMicroseconds(zero).magnitude(),
                 "");
 
   constexpr int64_t one = 1;
   constexpr int64_t negative_one = -1;
-  STATIC_ASSERT(TimeDelta::FromMicroseconds(one) ==
+  static_assert(TimeDelta::FromMicroseconds(one) ==
                     TimeDelta::FromMicroseconds(one).magnitude(),
                 "");
-  STATIC_ASSERT(TimeDelta::FromMicroseconds(one) ==
+  static_assert(TimeDelta::FromMicroseconds(one) ==
                     TimeDelta::FromMicroseconds(negative_one).magnitude(),
                 "");
 
@@ -1305,11 +1304,11 @@
       std::numeric_limits<int64_t>::max() - 1;
   constexpr int64_t min_int64_plus_two =
       std::numeric_limits<int64_t>::min() + 2;
-  STATIC_ASSERT(
+  static_assert(
       TimeDelta::FromMicroseconds(max_int64_minus_one) ==
           TimeDelta::FromMicroseconds(max_int64_minus_one).magnitude(),
       "");
-  STATIC_ASSERT(TimeDelta::FromMicroseconds(max_int64_minus_one) ==
+  static_assert(TimeDelta::FromMicroseconds(max_int64_minus_one) ==
                     TimeDelta::FromMicroseconds(min_int64_plus_two).magnitude(),
                 "");
 }
@@ -1424,12 +1423,12 @@
   constexpr double d = 0.5;
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
             (TimeDelta::FromMilliseconds(1000) * d));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(2000) ==
+  static_assert(TimeDelta::FromMilliseconds(2000) ==
                     (TimeDelta::FromMilliseconds(1000) / d),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
             (TimeDelta::FromMilliseconds(1000) *= d));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(2000) ==
+  static_assert(TimeDelta::FromMilliseconds(2000) ==
                     (TimeDelta::FromMilliseconds(1000) /= d),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
@@ -1438,12 +1437,12 @@
   constexpr float f = 0.5;
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
             (TimeDelta::FromMilliseconds(1000) * f));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(2000) ==
+  static_assert(TimeDelta::FromMilliseconds(2000) ==
                     (TimeDelta::FromMilliseconds(1000) / f),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
             (TimeDelta::FromMilliseconds(1000) *= f));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(2000) ==
+  static_assert(TimeDelta::FromMilliseconds(2000) ==
                     (TimeDelta::FromMilliseconds(1000) /= f),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
@@ -1452,12 +1451,12 @@
   constexpr int i = 2;
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
             (TimeDelta::FromMilliseconds(1000) * i));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(500) ==
+  static_assert(TimeDelta::FromMilliseconds(500) ==
                     (TimeDelta::FromMilliseconds(1000) / i),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
             (TimeDelta::FromMilliseconds(1000) *= i));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(500) ==
+  static_assert(TimeDelta::FromMilliseconds(500) ==
                     (TimeDelta::FromMilliseconds(1000) /= i),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
@@ -1466,12 +1465,12 @@
   constexpr int64_t i64 = 2;
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
             (TimeDelta::FromMilliseconds(1000) * i64));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(500) ==
+  static_assert(TimeDelta::FromMilliseconds(500) ==
                     (TimeDelta::FromMilliseconds(1000) / i64),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
             (TimeDelta::FromMilliseconds(1000) *= i64));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(500) ==
+  static_assert(TimeDelta::FromMilliseconds(500) ==
                     (TimeDelta::FromMilliseconds(1000) /= i64),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
@@ -1479,12 +1478,12 @@
 
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
             (TimeDelta::FromMilliseconds(1000) * 0.5));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(2000) ==
+  static_assert(TimeDelta::FromMilliseconds(2000) ==
                     (TimeDelta::FromMilliseconds(1000) / 0.5),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
             (TimeDelta::FromMilliseconds(1000) *= 0.5));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(2000) ==
+  static_assert(TimeDelta::FromMilliseconds(2000) ==
                     (TimeDelta::FromMilliseconds(1000) /= 0.5),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
@@ -1492,12 +1491,12 @@
 
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
             (TimeDelta::FromMilliseconds(1000) * 2));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(500) ==
+  static_assert(TimeDelta::FromMilliseconds(500) ==
                     (TimeDelta::FromMilliseconds(1000) / 2),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
             (TimeDelta::FromMilliseconds(1000) *= 2));
-  STATIC_ASSERT(TimeDelta::FromMilliseconds(500) ==
+  static_assert(TimeDelta::FromMilliseconds(500) ==
                     (TimeDelta::FromMilliseconds(1000) /= 2),
                 "");
   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
@@ -1597,7 +1596,7 @@
   EXPECT_EQ(kOneSecond, (ticks_now + kOneSecond) - ticks_now);
 }
 
-CONSTEXPR TimeTicks TestTimeTicksConstexprCopyAssignment() {
+constexpr TimeTicks TestTimeTicksConstexprCopyAssignment() {
   TimeTicks a = TimeTicks::FromInternalValue(12345);
   TimeTicks b;
   b = a;
@@ -1618,12 +1617,12 @@
   static_assert(a.ToInternalValue() == b.ToInternalValue(), "");
 
   // Copy assignment.
-  STATIC_ASSERT(a.ToInternalValue() ==
+  static_assert(a.ToInternalValue() ==
                     TestTimeTicksConstexprCopyAssignment().ToInternalValue(),
                 "");
 }
 
-CONSTEXPR ThreadTicks TestThreadTicksConstexprCopyAssignment() {
+constexpr ThreadTicks TestThreadTicksConstexprCopyAssignment() {
   ThreadTicks a = ThreadTicks::FromInternalValue(12345);
   ThreadTicks b;
   b = a;
@@ -1644,12 +1643,12 @@
   static_assert(a.ToInternalValue() == b.ToInternalValue(), "");
 
   // Copy assignment.
-  STATIC_ASSERT(a.ToInternalValue() ==
+  static_assert(a.ToInternalValue() ==
                     TestThreadTicksConstexprCopyAssignment().ToInternalValue(),
                 "");
 }
 
-CONSTEXPR TimeDelta TestTimeDeltaConstexprCopyAssignment() {
+constexpr TimeDelta TestTimeDeltaConstexprCopyAssignment() {
   TimeDelta a = TimeDelta::FromSeconds(1);
   TimeDelta b;
   b = a;
@@ -1670,7 +1669,7 @@
   static_assert(a == b, "");
 
   // Copy assignment.
-  STATIC_ASSERT(a == TestTimeDeltaConstexprCopyAssignment(), "");
+  static_assert(a == TestTimeDeltaConstexprCopyAssignment(), "");
 }
 
 TEST(TimeDeltaLogging, DCheckEqCompiles) {
diff --git a/src/base/trace_event/blame_context.cc b/src/base/trace_event/blame_context.cc
index fdde1ac..cc9a6fe 100644
--- a/src/base/trace_event/blame_context.cc
+++ b/src/base/trace_event/blame_context.cc
@@ -28,7 +28,7 @@
       parent_id_(parent_context ? parent_context->id() : 0),
       category_group_enabled_(nullptr),
       weak_factory_(this) {
-  DCHECK(!parent_context || !SbStringCompareAll(name_, parent_context->name()))
+  DCHECK(!parent_context || !strcmp(name_, parent_context->name()))
       << "Parent blame context must have the same name";
 }
 
diff --git a/src/base/trace_event/cfi_backtrace_android.cc b/src/base/trace_event/cfi_backtrace_android.cc
index d128573..eb6e190 100644
--- a/src/base/trace_event/cfi_backtrace_android.cc
+++ b/src/base/trace_event/cfi_backtrace_android.cc
@@ -168,7 +168,7 @@
   static constexpr size_t kUnwIndexRowSize =
       sizeof(*unw_index_function_col_) + sizeof(*unw_index_indices_col_);
   size_t unw_index_size = 0;
-  SbMemoryCopy(&unw_index_size, cfi_mmap_->data(), sizeof(unw_index_size));
+  memcpy(&unw_index_size, cfi_mmap_->data(), sizeof(unw_index_size));
   DCHECK_EQ(0u, unw_index_size % kUnwIndexRowSize);
   // UNW_INDEX table starts after 4 bytes.
   unw_index_function_col_ =
@@ -223,7 +223,7 @@
     // SP_prev = SP_cur + cfa_offset and
     // PC_prev = * (SP_prev - ra_offset).
     sp = sp + cfi.cfa_offset;
-    SbMemoryCopy(&pc, reinterpret_cast<uintptr_t*>(sp - cfi.ra_offset),
+    memcpy(&pc, reinterpret_cast<uintptr_t*>(sp - cfi.ra_offset),
                  sizeof(uintptr_t));
   }
   return depth;
@@ -275,7 +275,7 @@
   const uint16_t* unwind_data = unw_data_start_addr_ + index;
   // The value of first 2 bytes is the CFI data row count for the function.
   uint16_t row_count = 0;
-  SbMemoryCopy(&row_count, unwind_data, sizeof(row_count));
+  memcpy(&row_count, unwind_data, sizeof(row_count));
   // And the actual CFI rows start after 2 bytes from the |unwind_data|. Cast
   // the data into an array of CFIUnwindDataRow since the struct is designed to
   // represent each row. We should be careful to read only |row_count| number of
@@ -289,7 +289,7 @@
   uint16_t ra_offset = 0;
   for (uint16_t i = 0; i < row_count; ++i) {
     CFIUnwindDataRow row;
-    SbMemoryCopy(&row, function_data + i, sizeof(CFIUnwindDataRow));
+    memcpy(&row, function_data + i, sizeof(CFIUnwindDataRow));
     // The return address of the function is the instruction that is not yet
     // been executed. The cfi row specifies the unwind info before executing the
     // given instruction. If the given address is equal to the instruction
diff --git a/src/base/trace_event/memory_dump_manager.cc b/src/base/trace_event/memory_dump_manager.cc
index 6e317a3..8437654 100644
--- a/src/base/trace_event/memory_dump_manager.cc
+++ b/src/base/trace_event/memory_dump_manager.cc
@@ -448,7 +448,7 @@
   // crashes while invoking dump after a |dump_provider| is not unregistered
   // in safe way.
   char provider_name_for_debugging[16];
-  SbStringCopy(provider_name_for_debugging, mdpinfo->name,
+  strncpy(provider_name_for_debugging, mdpinfo->name,
                sizeof(provider_name_for_debugging) - 1);
   provider_name_for_debugging[sizeof(provider_name_for_debugging) - 1] = '\0';
   base::debug::Alias(provider_name_for_debugging);
diff --git a/src/base/trace_event/memory_infra_background_whitelist.cc b/src/base/trace_event/memory_infra_background_whitelist.cc
index 19bfe83..435eef6 100644
--- a/src/base/trace_event/memory_infra_background_whitelist.cc
+++ b/src/base/trace_event/memory_infra_background_whitelist.cc
@@ -380,14 +380,14 @@
 bool IsMemoryAllocatorDumpNameWhitelisted(const std::string& name) {
   // Global dumps are explicitly whitelisted for background use.
   if (base::StartsWith(name, "global/", CompareCase::SENSITIVE)) {
-    for (size_t i = SbStringGetLength("global/"); i < name.size(); i++)
+    for (size_t i = strlen("global/"); i < name.size(); i++)
       if (!base::IsHexDigit(name[i]))
         return false;
     return true;
   }
 
   if (base::StartsWith(name, "shared_memory/", CompareCase::SENSITIVE)) {
-    for (size_t i = SbStringGetLength("shared_memory/"); i < name.size(); i++)
+    for (size_t i = strlen("shared_memory/"); i < name.size(); i++)
       if (!base::IsHexDigit(name[i]))
         return false;
     return true;
diff --git a/src/base/trace_event/memory_usage_estimator.h b/src/base/trace_event/memory_usage_estimator.h
index 8692b91..5a47521 100644
--- a/src/base/trace_event/memory_usage_estimator.h
+++ b/src/base/trace_event/memory_usage_estimator.h
@@ -29,7 +29,6 @@
 #include "base/stl_util.h"
 #include "base/strings/string16.h"
 #include "base/template_util.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 // Composable memory usage estimators.
@@ -276,7 +275,7 @@
 #endif
 
 template <class I, template <class...> class... Containers>
-CONSTEXPR bool OneOfContainersComplexIterators() {
+constexpr bool OneOfContainersComplexIterators() {
   // We are forced to create a temporary variable to workaround a compilation
   // error in msvs.
   const bool all_tests[] = {
diff --git a/src/base/trace_event/memory_usage_estimator_unittest.cc b/src/base/trace_event/memory_usage_estimator_unittest.cc
index 0f3451b..36911e8 100644
--- a/src/base/trace_event/memory_usage_estimator_unittest.cc
+++ b/src/base/trace_event/memory_usage_estimator_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/string16.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -247,23 +246,23 @@
     virtual void method() = 0;
   };
 
-  STATIC_ASSERT(
+  static_assert(
       internal::IsStandardContainerComplexIterator<std::list<int>::iterator>(),
       "");
-  STATIC_ASSERT(internal::IsStandardContainerComplexIterator<
+  static_assert(internal::IsStandardContainerComplexIterator<
                     std::list<int>::const_iterator>(),
                 "");
-  STATIC_ASSERT(internal::IsStandardContainerComplexIterator<
+  static_assert(internal::IsStandardContainerComplexIterator<
                     std::list<int>::reverse_iterator>(),
                 "");
-  STATIC_ASSERT(internal::IsStandardContainerComplexIterator<
+  static_assert(internal::IsStandardContainerComplexIterator<
                     std::list<int>::const_reverse_iterator>(),
                 "");
 #ifndef STARBOARD
   // TODO: Non-conforming compilers do not compile with int as iterator.
-  STATIC_ASSERT(!internal::IsStandardContainerComplexIterator<int>(), "");
+  static_assert(!internal::IsStandardContainerComplexIterator<int>(), "");
 #endif
-  STATIC_ASSERT(!internal::IsStandardContainerComplexIterator<abstract*>(), "");
+  static_assert(!internal::IsStandardContainerComplexIterator<abstract*>(), "");
 }
 
 }  // namespace trace_event
diff --git a/src/base/trace_event/process_memory_dump_unittest.cc b/src/base/trace_event/process_memory_dump_unittest.cc
index b47a509..5ce7590 100644
--- a/src/base/trace_event/process_memory_dump_unittest.cc
+++ b/src/base/trace_event/process_memory_dump_unittest.cc
@@ -488,7 +488,7 @@
   // Allocate few page of dirty memory and check if it is resident.
   const size_t size1 = 5 * page_size;
   void* memory1 = Map(size1);
-  SbMemorySet(memory1, 0, size1);
+  memset(memory1, 0, size1);
   size_t res1 = ProcessMemoryDump::CountResidentBytes(memory1, size1);
   ASSERT_EQ(res1, size1);
   Unmap(memory1, size1);
@@ -496,7 +496,7 @@
   // Allocate a large memory segment (> 8Mib).
   const size_t kVeryLargeMemorySize = 15 * 1024 * 1024;
   void* memory2 = Map(kVeryLargeMemorySize);
-  SbMemorySet(memory2, 0, kVeryLargeMemorySize);
+  memset(memory2, 0, kVeryLargeMemorySize);
   size_t res2 =
       ProcessMemoryDump::CountResidentBytes(memory2, kVeryLargeMemorySize);
   ASSERT_EQ(res2, kVeryLargeMemorySize);
@@ -524,7 +524,7 @@
   const size_t size1 = 5 * page_size;
   SharedMemory shared_memory1;
   shared_memory1.CreateAndMapAnonymous(size1);
-  SbMemorySet(shared_memory1.memory(), 0, size1);
+  memset(shared_memory1.memory(), 0, size1);
   base::Optional<size_t> res1 =
       ProcessMemoryDump::CountResidentBytesInSharedMemory(
           shared_memory1.memory(), shared_memory1.mapped_size());
@@ -537,7 +537,7 @@
   const size_t kVeryLargeMemorySize = 15 * 1024 * 1024;
   SharedMemory shared_memory2;
   shared_memory2.CreateAndMapAnonymous(kVeryLargeMemorySize);
-  SbMemorySet(shared_memory2.memory(), 0, kVeryLargeMemorySize);
+  memset(shared_memory2.memory(), 0, kVeryLargeMemorySize);
   base::Optional<size_t> res2 =
       ProcessMemoryDump::CountResidentBytesInSharedMemory(
           shared_memory2.memory(), shared_memory2.mapped_size());
@@ -550,7 +550,7 @@
   const size_t kTouchedMemorySize = 7 * 1024 * 1024;
   SharedMemory shared_memory3;
   shared_memory3.CreateAndMapAnonymous(kVeryLargeMemorySize);
-  SbMemorySet(shared_memory3.memory(), 0, kTouchedMemorySize);
+  memset(shared_memory3.memory(), 0, kTouchedMemorySize);
   base::Optional<size_t> res3 =
       ProcessMemoryDump::CountResidentBytesInSharedMemory(
           shared_memory3.memory(), shared_memory3.mapped_size());
diff --git a/src/base/trace_event/trace_config_category_filter.cc b/src/base/trace_event/trace_config_category_filter.cc
index 16c3da5..849191c 100644
--- a/src/base/trace_event/trace_config_category_filter.cc
+++ b/src/base/trace_event/trace_config_category_filter.cc
@@ -181,7 +181,7 @@
     std::string category;
     if (!included_list.GetString(i, &category))
       continue;
-    if (category.compare(0, SbStringGetLength(TRACE_DISABLED_BY_DEFAULT("")),
+    if (category.compare(0, strlen(TRACE_DISABLED_BY_DEFAULT("")),
                          TRACE_DISABLED_BY_DEFAULT("")) == 0) {
       disabled_categories_.push_back(category);
     } else {
diff --git a/src/base/trace_event/trace_event_impl.cc b/src/base/trace_event/trace_event_impl.cc
index 3fb61b8..48eef34 100644
--- a/src/base/trace_event/trace_event_impl.cc
+++ b/src/base/trace_event/trace_event_impl.cc
@@ -26,7 +26,7 @@
 namespace {
 
 size_t GetAllocLength(const char* str) {
-  return str ? SbStringGetLength(str) + 1 : 0;
+  return str ? strlen(str) + 1 : 0;
 }
 
 // Copies |*member| into |*buffer|, sets |*member| to point to this new
@@ -55,7 +55,7 @@
       phase_(TRACE_EVENT_PHASE_BEGIN) {
   for (int i = 0; i < kTraceMaxNumArgs; ++i)
     arg_names_[i] = nullptr;
-  SbMemorySet(arg_values_, 0, sizeof(arg_values_));
+  memset(arg_values_, 0, sizeof(arg_values_));
 }
 
 TraceEvent::~TraceEvent() = default;
diff --git a/src/base/tuple.h b/src/base/tuple.h
index fc95737..3d7ee4e 100644
--- a/src/base/tuple.h
+++ b/src/base/tuple.h
@@ -29,7 +29,6 @@
 #include <utility>
 
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/types.h"
 
 namespace base {
diff --git a/src/base/values_unittest.cc b/src/base/values_unittest.cc
index bc9701d..784dd02 100644
--- a/src/base/values_unittest.cc
+++ b/src/base/values_unittest.cc
@@ -824,15 +824,15 @@
   ASSERT_EQ(15U, binary->GetBlob().size());
 
   char stack_buffer[42];
-  SbMemorySet(stack_buffer, '!', 42);
+  memset(stack_buffer, '!', 42);
   binary = Value::CreateWithCopiedBuffer(stack_buffer, 42);
   ASSERT_TRUE(binary.get());
   ASSERT_TRUE(binary->GetBlob().data());
   ASSERT_NE(stack_buffer,
             reinterpret_cast<const char*>(binary->GetBlob().data()));
   ASSERT_EQ(42U, binary->GetBlob().size());
-  ASSERT_EQ(0, SbMemoryCompare(stack_buffer, binary->GetBlob().data(),
-                               binary->GetBlob().size()));
+  ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBlob().data(),
+                      binary->GetBlob().size()));
 }
 
 TEST(ValuesTest, StringValue) {
diff --git a/src/build_gyp/common.gypi b/src/build_gyp/common.gypi
index 7665e74..a721f26 100644
--- a/src/build_gyp/common.gypi
+++ b/src/build_gyp/common.gypi
@@ -290,7 +290,6 @@
         # build.
         '-Wno-unused-function',
         '-Wno-char-subscripts',
-        '-Wno-c++11-extensions',
         '-Wno-unnamed-type-template-args',
       ],
 
diff --git a/src/build_overrides/build.gni b/src/build_overrides/build.gni
index 560cb57..c69e1f6 100644
--- a/src/build_overrides/build.gni
+++ b/src/build_overrides/build.gni
@@ -20,3 +20,5 @@
   # Set this flag to true to skip the assertion.
   ignore_elf32_limitations = false
 }
+
+enable_java_templates = false
diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index ce818d5..015db28 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -4,15 +4,24 @@
 
 ## Version 22
  - **C++14 is required to compile Cobalt 22.**
+
    Cobalt code now requires C++14-compatible toolchains to compile. This
    requirement helps us stay updated with C++ standards and integrate
    third-party libraries much easier.
+   C++17 support is recommended, but not yet required to compile Cobalt.
+
+ - **Updated lifecycle handling to support concealed mode.**
+
+   Cobalt now supports a "concealed" state when used with Starboard 13 or later.
+   See (doc/lifecycle.md)[doc/lifecycle.md] for more information.
 
  - **SpiderMonkey(mozjs-45) JavaScript Engine library is removed.**
+
    As stated last year, V8 should be the choice of JavaScript engine on
    every platform. SpiderMonkey is now completely removed.
 
  - **V8 JavaScript Engine is rebased to version v8.8**
+
    We rebased V8 from v7.7 in Cobalt 21 to v8.8 in Cobalt 22. V8 8.8 provides a
    new feature, pointer compression, that reduces JavaScript heap memory usage by
    60% on 64-bit platforms(arm64 and x64), saving about 5MB on startup and more
@@ -20,6 +29,7 @@
    platform uses 64-bit CPU architecture.
 
  - **window.navigator.onLine property and its change events are added.**
+
    To improve user experience during network connect/disconnect situations
    and enable auto-reconnect, Cobalt added web APIs including Navigator.onLine
    property and its change events. To enable using the property and events
@@ -29,15 +39,87 @@
    kSbEventTypeOsNetworkDisconnected Starboard event,
    kSbEventTypeOsNetworkConnected Starboard event.
 
+ - **Added support for User Agent Client Hints.**
+
+   User agent client hints (https://wicg.github.io/ua-client-hints/#interface)
+   is now supported. This does not impact the existing User Agent string.
+
+ - **Added support for Performance Timeline Web API.**
+
+   To facilitate metrics for Cobalt performance, the following web APIs are now
+   supported:
+    - https://www.w3.org/TR/performance-timeline/#the-performanceentry-interface
+    - https://www.w3.org/TR/performance-timeline/#extensions-to-the-performance-interface
+    - https://www.w3.org/TR/performance-timeline/#the-performanceobserver-interface
+    - https://www.w3.org/TR/performance-timeline/#performanceobserverinit-dictionary
+    - https://www.w3.org/TR/performance-timeline/#performanceobserverentrylist-interface
+
+   Additionally, a subset of the following web API is also supported:
+    - https://w3c.github.io/resource-timing/#resources-included-in-the-performanceresourcetiming-interface
+
+ - **Added support for TextEncoder and TextDecoder Web APIs.**
+
+   The following Web APIs are now supported:
+    - https://encoding.spec.whatwg.org/#interface-textencoder
+    - https://encoding.spec.whatwg.org/#interface-textdecoder
+
+ - **Added support for rendering HTML elements with different border styles.**
+
+   Previously, Cobalt only supported borders on elements which used the same
+   border style (e.g. solid) for all sides. This is now fixed.
+
+ - **ICU rebased to version 68.**
+
+   Additionally, ICU data is now packaged as a single file instead of individual
+   files for each locale; this saves about 2MB of storage space compared to the
+   previous version.
+
+ - **Fixed instances where system ICU headers were included.**
+
+   To maintain consistency, only ICU headers from the included version of ICU
+   are used.
+
+ - **Added support for multiple splash screens.**
+
+   See [doc/splash_screen.md](doc/splash_screen.md).
+
+ - **Added Cobalt extension to handle Media Session Web API.**
+
+   This new Cobalt extension allows platform-specific support for Media Session
+   controls.
+
+ - **Deprecated CobaltExtensionConfigurationApi::CobaltJsGarbageCollectionThresholdInBytes.**
+
+   This configuration was only relevant for SpiderMonkey, which has been
+   removed.
+
+ - **Removed Cobalt's custom window.console object.**
+
+   This was only used with SpiderMonkey. V8 has its own handling of the console
+   object so the Cobalt version is no longer needed.
+
+ - **Deprecated depot_tools.**
+
+   Cobalt now uses only built-in git commands for development, and the
+   [setup guide](https://cobalt.dev/development/setup-linux.html) has been changed to reflect that.
+
+ - **Started migration from GYP to GN.**
+
+   The starboard layer can now be built using GN.
+   See `starboard/build/doc/migrating_gyp_to_gn.md`.
+
+
 ## Version 21
 
  - **SpiderMonkey(mozjs-45) JavaScript Engine is no longer supported.**
+
    We will only support V8 from now on. For platforms without Just-In-Time
    compilation ability, please use JIT-less V8 instead. Overriding
    `cobalt_enable_jit` environment variable in `gyp_configuration.py` will
    switch V8 to use JIT-less mode. V8 requires at least Starboard version 10.
 
  - **Runtime V8 snapshot is no longer supported**
+
    V8 has deprecated runtime snapshot and mandated build-time snapshot, Cobalt
    adopts this change as well. Build-time snapshot greatly improves first
    startup speed after install and is required for JIT-less mode.
@@ -146,6 +228,10 @@
    the comment of `SbMediaCanPlayMimeAndKeySystem()` in `media.h` for more
    details.
 
+ - **Added custom web APIs to query memory used by media source extensions.**
+
+   See `cobalt/dom/memory_info.idl` for details.
+
  - **Added support for controlling shutdown behavior of graphics system.**
 
    Cobalt normally clears the framebuffer to opaque black on suspend or exit.
@@ -169,7 +255,6 @@
    Platforms can provide javascript code caching by implementing
    CobaltExtensionJavaScriptCacheApi.
 
-
  - **Added support for UrlFetcher observer.**
 
    Platforms can implement UrlFetcher observer for performance tracing by
@@ -180,6 +265,13 @@
    Platforms can implement CobaltExtensionUpdaterNotificationApi to
    receive notifications from the Cobalt Evergreen Updater.
 
+ - **Improvements and Bugfixes**
+
+   - Fixed rare crash in mouse/pointer event dispatch.
+   - Fixed threading bug with webdriver screenshot handling.
+   - Improved extraction of optional element ID in webdriver moveto handling.
+   - Fixed getClientBoundingRect to factor in scrollLeft / scrollTop.
+
 
 ## Version 20
 
diff --git a/src/cobalt/audio/audio_file_reader_wav.cc b/src/cobalt/audio/audio_file_reader_wav.cc
index 4000dfe..882a496 100644
--- a/src/cobalt/audio/audio_file_reader_wav.cc
+++ b/src/cobalt/audio/audio_file_reader_wav.cc
@@ -200,7 +200,7 @@
   if ((!is_src_sample_in_float && sample_type_ == kSampleTypeInt16) ||
       (is_src_sample_in_float && sample_type_ == kSampleTypeFloat32)) {
     SB_LOG(INFO) << "Copying " << size << " bytes of wav data.";
-    SbMemoryCopy(audio_bus_->interleaved_data(), data + offset, size);
+    memcpy(audio_bus_->interleaved_data(), data + offset, size);
   } else if (!is_src_sample_in_float && sample_type_ == kSampleTypeFloat32) {
     // Convert from int16 to float32
     SB_LOG(INFO) << "Converting " << number_of_frames_ * number_of_channels_
diff --git a/src/cobalt/base/circular_buffer_shell.cc b/src/cobalt/base/circular_buffer_shell.cc
index ece9817..84988bb 100644
--- a/src/cobalt/base/circular_buffer_shell.cc
+++ b/src/cobalt/base/circular_buffer_shell.cc
@@ -101,7 +101,7 @@
     // Copy this segment and do the accounting.
     void* destination = GetWritePointer_Locked();
     const void* src = add_to_pointer(source, produced);
-    SbMemoryCopy(destination, src, to_write);
+    memcpy(destination, src, to_write);
     length_ += to_write;
     produced += to_write;
   }
@@ -150,7 +150,7 @@
     const void* source = add_to_pointer(buffer_, read_position);
     if (destination) {
       void* dest = add_to_pointer(destination, consumed);
-      SbMemoryCopy(dest, source, to_read);
+      memcpy(dest, source, to_read);
     }
     source_length -= to_read;
     read_position = (read_position + to_read) % capacity_;
diff --git a/src/cobalt/base/language.cc b/src/cobalt/base/language.cc
index 819e56a..ed98739 100644
--- a/src/cobalt/base/language.cc
+++ b/src/cobalt/base/language.cc
@@ -62,6 +62,11 @@
   if (U_SUCCESS(icu_result) && buffer[0]) {
     language += "-";
     language += buffer;
+  } else {
+    uloc_addLikelySubtags(NULL, buffer, arraysize(buffer), &icu_result);
+    if (U_SUCCESS(icu_result) && buffer[0]) {
+      return buffer;
+    }
   }
 
   // We should end up with something like "en" or "en-Latn".
diff --git a/src/cobalt/base/token.h b/src/cobalt/base/token.h
index 1ff90c7..1473160 100644
--- a/src/cobalt/base/token.h
+++ b/src/cobalt/base/token.h
@@ -76,11 +76,11 @@
 };
 
 inline bool operator==(const Token& lhs, const std::string& rhs) {
-  return SbStringCompareAll(lhs.c_str(), rhs.c_str()) == 0;
+  return strcmp(lhs.c_str(), rhs.c_str()) == 0;
 }
 
 inline bool operator==(const std::string& lhs, const Token& rhs) {
-  return SbStringCompareAll(lhs.c_str(), rhs.c_str()) == 0;
+  return strcmp(lhs.c_str(), rhs.c_str()) == 0;
 }
 
 inline bool operator!=(const Token& lhs, const Token& rhs) {
@@ -98,7 +98,7 @@
 inline bool operator<(const Token& lhs, const Token& rhs) {
 #ifdef ENABLE_TOKEN_ALPHABETICAL_SORTING
   if (Token::sort_alphabetically()) {
-    return SbStringCompareAll(lhs.c_str(), rhs.c_str()) < 0;
+    return strcmp(lhs.c_str(), rhs.c_str()) < 0;
   }
 #endif  // ENABLE_TOKEN_ALPHABETICAL_SORTING
   return lhs.c_str() < rhs.c_str();
@@ -107,7 +107,7 @@
 inline bool operator>(const Token& lhs, const Token& rhs) {
 #ifdef ENABLE_TOKEN_ALPHABETICAL_SORTING
   if (Token::sort_alphabetically()) {
-    return SbStringCompareAll(lhs.c_str(), rhs.c_str()) > 0;
+    return strcmp(lhs.c_str(), rhs.c_str()) > 0;
   }
 #endif  // ENABLE_TOKEN_ALPHABETICAL_SORTING
   return lhs.c_str() > rhs.c_str();
diff --git a/src/cobalt/base/token_test.cc b/src/cobalt/base/token_test.cc
index 647dc34..4dcb597 100644
--- a/src/cobalt/base/token_test.cc
+++ b/src/cobalt/base/token_test.cc
@@ -71,7 +71,7 @@
   // Sort the vector so we iterate it alphabetically.
   std::sort(tokens.begin(), tokens.end(),
             [](const Token& l, const Token& r) -> bool {
-              return SbStringCompareAll(l.c_str(), r.c_str()) < 0;
+              return strcmp(l.c_str(), r.c_str()) < 0;
             });
 
   // The natural order of the tokens is not alphabetical.
diff --git a/src/cobalt/bindings/README.md b/src/cobalt/bindings/README.md
index 5d3b6a3..18269ee 100644
--- a/src/cobalt/bindings/README.md
+++ b/src/cobalt/bindings/README.md
@@ -45,7 +45,7 @@
 ```
 
 
-In the above example, we first create an `ObjectTemplate`.  This is a structure that can later be fed into V8 that lets it know the "native shape" of the point object.  In particular, the `SetAccessor` lines are the ones that tell it to call into our `GetPointX` function when the property "x" is accessed on a point object.  After V8 calls into the `GetPointX` function, we find the associated native `Point` object, get its x field, convert that value to a JavaScript integer, and then pass that back to JavaScript as the return value.  Note that in SpiderMonkey this process is conceptually identical to V8, however with slightly different APIs.
+In the above example, we first create an `ObjectTemplate`.  This is a structure that can later be fed into V8 that lets it know the "native shape" of the point object.  In particular, the `SetAccessor` lines are the ones that tell it to call into our `GetPointX` function when the property "x" is accessed on a point object.  After V8 calls into the `GetPointX` function, we find the associated native `Point` object, get its x field, convert that value to a JavaScript integer, and then pass that back to JavaScript as the return value.
 
 That pattern, of intercept, convert from JavaScript to native, perform native operations, and then convert the native result back to JavaScript, is the essence of bindings.  Of course, it is far more complicated, in that there are many different types, and more operations that must be performed.  It is important however, to keep this general pattern in mind.
 
@@ -159,7 +159,7 @@
 
 Another important area in this module are utility functions that exist solely for bindings.  In particular, in the [conversion helpers](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/conversion_helpers.h?q=conversion_helpers&sq=package:%5Ecobalt$&dr=CSs) are implemented here, which is a giant file that implements functions to convert back and forth between native Cobalt types and JavaScript values.  These conversion helper functions get called in the native callback implementation for the getters, setters, and functions that we saw at the beginning of this doc (so the stuff that would go inside of GetPointX).  Because these conversion helpers primarily exist for parts of bindings defined by Web IDL, they're on the more complex side (because Web IDL allows for many conversion details to be configurable, such as whether null objects are accepted, or whether integral types should be clamped or not), however they are also used throughout common script/ when it makes sense.
 
-Finally, another critical thing that takes place in script/$engine is what we call [WrapperPrivate](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/wrapper_private.h?type=cs&q=WrapperPrivate&sq=package:%5Ecobalt$&g=0#31) (in both SpiderMonkey and V8).  This is the special type that goes inside of the native only internal object field that was discussed in the beginning of this doc.  WrapperPrivate is a bit more complicated however, as it has to both bridge between Cobalt DOM garbage collection and the JavaScript engine's garbage collection for more details on this), and allow for Cobalt to possibly manipulate garbage collection from the JavaScript side as well (as in add JavaScript objects to the root set of reachable objects).
+Finally, another critical thing that takes place in script/$engine is what we call [WrapperPrivate](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/wrapper_private.h?type=cs&q=WrapperPrivate&sq=package:%5Ecobalt$&g=0#31).  This is the special type that goes inside of the native only internal object field that was discussed in the beginning of this doc.  WrapperPrivate is a bit more complicated however, as it has to both bridge between Cobalt DOM garbage collection and the JavaScript engine's garbage collection for more details on this), and allow for Cobalt to possibly manipulate garbage collection from the JavaScript side as well (as in add JavaScript objects to the root set of reachable objects).
 
 # Testing
 
diff --git a/src/cobalt/bindings/testing/promise_test.cc b/src/cobalt/bindings/testing/promise_test.cc
index c5c7943..c85bc31 100644
--- a/src/cobalt/bindings/testing/promise_test.cc
+++ b/src/cobalt/bindings/testing/promise_test.cc
@@ -38,16 +38,6 @@
 template <typename T>
 using Promise = script::Promise<T>;
 
-// Simple implementation of window.setTimeout. window.setTimeout is needed for
-// the Promise polyfill used in SpiderMonkey 24.
-int32_t SetTimeoutFunction(const Window::TimerCallbackArg& timer_callback,
-                           int32_t timeout) {
-  // Just execute immediately. This is sufficient for the tests below.
-  Handle<Window::TimerCallback> handle(timer_callback);
-  handle->Run();
-  return 1;
-}
-
 class PromiseTest : public InterfaceBindingsTest<PromiseInterface> {
  public:
   ~PromiseTest() {
@@ -57,9 +47,7 @@
   }
 
  protected:
-  void SetUp() {
-    window()->SetSetTimeoutHandler(base::Bind(&SetTimeoutFunction));
-  }
+  void SetUp() {}
 };
 
 }  // namespace
diff --git a/src/cobalt/bindings/testing/window.h b/src/cobalt/bindings/testing/window.h
index 8f29138..9ac16ed 100644
--- a/src/cobalt/bindings/testing/window.h
+++ b/src/cobalt/bindings/testing/window.h
@@ -49,22 +49,6 @@
   void set_on_event(const TestEventHandler&) {}
   const TestEventHandler* on_event() { return NULL; }
 
-  // Stub implementation of window.setTimeout, which is needed for some tests.
-  int SetTimeout(const TimerCallbackArg& handler) {
-    return SetTimeout(handler, 0);
-  }
-
-  int32_t SetTimeout(const TimerCallbackArg& handler, int32_t timeout) {
-    if (!set_timeout_handler_.is_null()) {
-      return set_timeout_handler_.Run(handler, timeout);
-    }
-    return 0;
-  }
-
-  void SetSetTimeoutHandler(const SetTimeoutHandler& handler) {
-    set_timeout_handler_ = handler;
-  }
-
   DEFINE_WRAPPABLE_TYPE(Window);
 
  private:
diff --git a/src/cobalt/bindings/testing/window.idl b/src/cobalt/bindings/testing/window.idl
index dc627f6..3109cf5 100644
--- a/src/cobalt/bindings/testing/window.idl
+++ b/src/cobalt/bindings/testing/window.idl
@@ -21,9 +21,6 @@
 
   // Exercise a similar setup to EventHandler.
   attribute TestEventHandler onEvent;
-
-  // This is needed for the Promise polyfill.
-  long setTimeout(TimerCallback handler, optional long timeout);
 };
 
 // Exercise a similar setup to EventHandler.
diff --git a/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py b/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py
index 4ff30b0..c14dea7 100644
--- a/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py
+++ b/src/cobalt/bindings/v8c/generate_conversion_header_v8c.py
@@ -11,7 +11,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-"""Generate a conversion header for SpiderMonkey."""
+"""Generate a conversion header for V8."""
 
 import sys
 
diff --git a/src/cobalt/black_box_tests/black_box_tests.py b/src/cobalt/black_box_tests/black_box_tests.py
index 43cf1a7..271b2cc 100644
--- a/src/cobalt/black_box_tests/black_box_tests.py
+++ b/src/cobalt/black_box_tests/black_box_tests.py
@@ -34,6 +34,7 @@
 
 _DISABLED_BLACKBOXTEST_CONFIGS = [
     'android-arm/devel',
+    'android-arm64/devel',
     'android-x86/devel',
     'raspi-0/devel',
 ]
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 91b5874..e186214 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -64,6 +64,7 @@
 #include "cobalt/browser/memory_tracker/tool.h"
 #include "cobalt/browser/storage_upgrade_handler.h"
 #include "cobalt/browser/switches.h"
+#include "cobalt/browser/user_agent_platform_info.h"
 #include "cobalt/browser/user_agent_string.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/extension/crash_handler.h"
@@ -77,6 +78,8 @@
 #include "cobalt/system_window/input_event.h"
 #include "cobalt/trace_event/scoped_trace_to_file.h"
 #include "starboard/configuration.h"
+#include "starboard/event.h"
+#include "starboard/time.h"
 #include "starboard/system.h"
 #include "url/gurl.h"
 
@@ -553,9 +556,9 @@
 #endif
   if (version.empty()) {
     base::StringAppendF(&version, "%s.%s-%s",
-                        platform_info.cobalt_version.c_str(),
-                        platform_info.cobalt_build_version_number.c_str(),
-                        platform_info.build_configuration.c_str());
+                        platform_info.cobalt_version().c_str(),
+                        platform_info.cobalt_build_version_number().c_str(),
+                        platform_info.build_configuration().c_str());
   }
 
   user_agent.push_back('\0');
@@ -563,13 +566,13 @@
   version.push_back('\0');
 
   CrashpadAnnotations crashpad_annotations;
-  SbMemorySet(&crashpad_annotations, sizeof(CrashpadAnnotations), 0);
-  SbStringCopy(crashpad_annotations.user_agent_string, user_agent.c_str(),
-               USER_AGENT_STRING_MAX_SIZE);
-  SbStringCopy(crashpad_annotations.product, product.c_str(),
-               CRASHPAD_ANNOTATION_DEFAULT_LENGTH);
-  SbStringCopy(crashpad_annotations.version, version.c_str(),
-               CRASHPAD_ANNOTATION_DEFAULT_LENGTH);
+  memset(&crashpad_annotations, 0, sizeof(CrashpadAnnotations));
+  strncpy(crashpad_annotations.user_agent_string, user_agent.c_str(),
+          USER_AGENT_STRING_MAX_SIZE);
+  strncpy(crashpad_annotations.product, product.c_str(),
+          CRASHPAD_ANNOTATION_DEFAULT_LENGTH);
+  strncpy(crashpad_annotations.version, version.c_str(),
+          CRASHPAD_ANNOTATION_DEFAULT_LENGTH);
   bool result = static_cast<const CobaltExtensionCrashHandlerApi*>(
                     crash_handler_extension)
                     ->OverrideCrashpadAnnotations(&crashpad_annotations);
@@ -831,7 +834,7 @@
       storage_manager_options));
 
   network_module_.reset(new network::NetworkModule(
-      CreateUserAgentString(GetUserAgentPlatformInfoFromSystem()),
+      CreateUserAgentString(browser::GetUserAgentPlatformInfoFromSystem()),
       storage_manager_.get(), &event_dispatcher_, network_module_options));
 
   AddCrashHandlerAnnotations();
@@ -1010,7 +1013,7 @@
     return;
   }
 
-  OnApplicationEvent(kSbEventTypeStart);
+  OnApplicationEvent(kSbEventTypeStart, SbTimeGetMonotonicNow());
 }
 
 void Application::Quit() {
@@ -1043,7 +1046,8 @@
     case kSbEventTypeFreeze:
     case kSbEventTypeUnfreeze:
     case kSbEventTypeLowMemory:
-      OnApplicationEvent(starboard_event->type);
+      OnApplicationEvent(starboard_event->type,
+                         starboard_event->timestamp);
       break;
 #else
     case kSbEventTypePause:
@@ -1051,7 +1055,7 @@
     case kSbEventTypeSuspend:
     case kSbEventTypeResume:
     case kSbEventTypeLowMemory:
-      OnApplicationEvent(starboard_event->type);
+      OnApplicationEvent(starboard_event->type, SbTimeGetMonotonicNow());
       break;
 #endif  // SB_API_VERSION >= 13
     case kSbEventTypeWindowSizeChanged:
@@ -1147,9 +1151,11 @@
   }
 }
 
-void Application::OnApplicationEvent(SbEventType event_type) {
+void Application::OnApplicationEvent(SbEventType event_type,
+                                     SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "Application::OnApplicationEvent()");
   DCHECK_CALLED_ON_VALID_THREAD(application_event_thread_checker_);
+
   switch (event_type) {
     case kSbEventTypeStop:
       DLOG(INFO) << "Got quit event.";
@@ -1158,35 +1164,35 @@
       break;
     case kSbEventTypeStart:
       DLOG(INFO) << "Got start event.";
-      browser_module_->Reveal();
-      browser_module_->Focus();
+      browser_module_->Reveal(timestamp);
+      browser_module_->Focus(timestamp);
       DLOG(INFO) << "Finished starting.";
       break;
 #if SB_API_VERSION >= 13
     case kSbEventTypeBlur:
       DLOG(INFO) << "Got blur event.";
-      browser_module_->Blur();
+      browser_module_->Blur(timestamp);
       DLOG(INFO) << "Finished blurring.";
       break;
     case kSbEventTypeFocus:
       DLOG(INFO) << "Got focus event.";
-      browser_module_->Focus();
+      browser_module_->Focus(timestamp);
       DLOG(INFO) << "Finished focusing.";
       break;
     case kSbEventTypeConceal:
       DLOG(INFO) << "Got conceal event.";
-      browser_module_->Conceal();
+      browser_module_->Conceal(timestamp);
       DLOG(INFO) << "Finished concealing.";
       break;
     case kSbEventTypeReveal:
       DCHECK(SbSystemSupportsResume());
       DLOG(INFO) << "Got reveal event.";
-      browser_module_->Reveal();
+      browser_module_->Reveal(timestamp);
       DLOG(INFO) << "Finished revealing.";
       break;
     case kSbEventTypeFreeze:
       DLOG(INFO) << "Got freeze event.";
-      browser_module_->Freeze();
+      browser_module_->Freeze(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Suspend();
 #endif
@@ -1194,7 +1200,7 @@
       break;
     case kSbEventTypeUnfreeze:
       DLOG(INFO) << "Got unfreeze event.";
-      browser_module_->Unfreeze();
+      browser_module_->Unfreeze(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Resume();
 #endif
@@ -1203,18 +1209,18 @@
 #else
     case kSbEventTypePause:
       DLOG(INFO) << "Got pause event.";
-      browser_module_->Blur();
+      browser_module_->Blur(timestamp);
       DLOG(INFO) << "Finished pausing.";
       break;
     case kSbEventTypeUnpause:
       DLOG(INFO) << "Got unpause event.";
-      browser_module_->Focus();
+      browser_module_->Focus(timestamp);
       DLOG(INFO) << "Finished unpausing.";
       break;
     case kSbEventTypeSuspend:
       DLOG(INFO) << "Got suspend event.";
-      browser_module_->Conceal();
-      browser_module_->Freeze();
+      browser_module_->Conceal(timestamp);
+      browser_module_->Freeze(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Suspend();
 #endif
@@ -1223,8 +1229,8 @@
     case kSbEventTypeResume:
       DCHECK(SbSystemSupportsResume());
       DLOG(INFO) << "Got resume event.";
-      browser_module_->Unfreeze();
-      browser_module_->Reveal();
+      browser_module_->Unfreeze(timestamp);
+      browser_module_->Reveal(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Resume();
 #endif
diff --git a/src/cobalt/browser/application.h b/src/cobalt/browser/application.h
index 94e9edd..620d376 100644
--- a/src/cobalt/browser/application.h
+++ b/src/cobalt/browser/application.h
@@ -67,7 +67,8 @@
   void OnNetworkEvent(const base::Event* event);
 
   // Called to handle an application event.
-  void OnApplicationEvent(SbEventType event_type);
+  void OnApplicationEvent(SbEventType event_type,
+                          SbTimeMonotonic timestamp);
 
   // Called to handle a window size change event.
   void OnWindowSizeChangedEvent(const base::Event* event);
diff --git a/src/cobalt/browser/browser.gyp b/src/cobalt/browser/browser.gyp
index 1422e02..65444e2 100644
--- a/src/cobalt/browser/browser.gyp
+++ b/src/cobalt/browser/browser.gyp
@@ -99,6 +99,8 @@
         'system_platform_error_handler.h',
         'url_handler.cc',
         'url_handler.h',
+        'user_agent_platform_info.cc',
+        'user_agent_platform_info.h',
         'user_agent_string.cc',
         'user_agent_string.h',
         'web_module.cc',
diff --git a/src/cobalt/browser/browser_bindings_gen.gyp b/src/cobalt/browser/browser_bindings_gen.gyp
index 2fdb5b3..9941d47 100644
--- a/src/cobalt/browser/browser_bindings_gen.gyp
+++ b/src/cobalt/browser/browser_bindings_gen.gyp
@@ -59,6 +59,7 @@
         '../dom/captions/system_caption_settings.idl',
         '../dom/cdata_section.idl',
         '../dom/character_data.idl',
+        '../dom/cobalt_ua_data_values_interface.idl',
         '../dom/comment.idl',
         '../dom/crypto.idl',
         '../dom/custom_event.idl',
@@ -133,6 +134,9 @@
         '../dom/on_screen_keyboard.idl',
         '../dom/performance.idl',
         '../dom/performance_entry.idl',
+        '../dom/performance_lifecycle_timing.idl',
+        '../dom/performance_mark.idl',
+        '../dom/performance_measure.idl',
         '../dom/performance_observer.idl',
         '../dom/performance_observer_entry_list.idl',
         '../dom/performance_resource_timing.idl',
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 5c5dc7a..18249fa 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -38,7 +38,6 @@
 #include "cobalt/browser/on_screen_keyboard_starboard_bridge.h"
 #include "cobalt/browser/screen_shot_writer.h"
 #include "cobalt/browser/switches.h"
-#include "cobalt/browser/user_agent_string.h"
 #include "cobalt/browser/webapi_extension.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/cssom/viewport_size.h"
@@ -47,9 +46,13 @@
 #include "cobalt/dom/keyboard_event_init.h"
 #include "cobalt/dom/keycode.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
+#include "cobalt/dom/navigator.h"
+#include "cobalt/dom/navigator_ua_data.h"
 #include "cobalt/dom/window.h"
+#include "cobalt/extension/graphics.h"
 #include "cobalt/h5vcc/h5vcc.h"
 #include "cobalt/input/input_device_manager_fuzzer.h"
+#include "cobalt/math/matrix3_f.h"
 #include "cobalt/overlay_info/overlay_info_registry.h"
 #include "nb/memory_scope.h"
 #include "starboard/atomic.h"
@@ -194,13 +197,6 @@
 
 #endif  // defined(ENABLE_DEBUGGER)
 
-scoped_refptr<script::Wrappable> CreateH5VCC(
-    const h5vcc::H5vcc::Settings& settings,
-    const scoped_refptr<dom::Window>& window,
-    script::GlobalEnvironment* global_environment) {
-  return scoped_refptr<script::Wrappable>(new h5vcc::H5vcc(settings));
-}
-
 #if SB_API_VERSION < 12
 scoped_refptr<script::Wrappable> CreateExtensionInterface(
     const scoped_refptr<dom::Window>& window,
@@ -245,6 +241,7 @@
       options_(options),
       self_message_loop_(base::MessageLoop::current()),
       event_dispatcher_(event_dispatcher),
+      account_manager_(account_manager),
       is_rendered_(false),
       can_play_type_handler_(media::MediaModule::CreateCanPlayTypeHandler()),
       network_module_(network_module),
@@ -365,16 +362,8 @@
   // Setup our main web module to have the H5VCC API injected into it.
   DCHECK(!ContainsKey(options_.web_module_options.injected_window_attributes,
                       "h5vcc"));
-  h5vcc::H5vcc::Settings h5vcc_settings;
-  h5vcc_settings.media_module = media_module_.get();
-  h5vcc_settings.network_module = network_module_;
-#if SB_IS(EVERGREEN)
-  h5vcc_settings.updater_module = updater_module_;
-#endif
-  h5vcc_settings.account_manager = account_manager;
-  h5vcc_settings.event_dispatcher = event_dispatcher_;
   options_.web_module_options.injected_window_attributes["h5vcc"] =
-      base::Bind(&CreateH5VCC, h5vcc_settings);
+      base::Bind(&BrowserModule::CreateH5vcc, base::Unretained(this));
 
   if (command_line->HasSwitch(switches::kDisableTimerResolutionLimit)) {
     options_.web_module_options.limit_performance_timer_resolution = false;
@@ -471,12 +460,12 @@
   // currently be in, to prepare for shutdown.
   switch (application_state_) {
     case base::kApplicationStateStarted:
-      Blur();
+      Blur(0);
     // Intentional fall-through.
     case base::kApplicationStateBlurred:
-      Conceal();
+      Conceal(0);
     case base::kApplicationStateConcealed:
-      Freeze();
+      Freeze(0);
       break;
     case base::kApplicationStateStopped:
       NOTREACHED() << "BrowserModule does not support the stopped state.";
@@ -1467,53 +1456,55 @@
   network_module_->SetProxy(proxy_rules);
 }
 
-void BrowserModule::Blur() {
+void BrowserModule::Blur(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Blur()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(application_state_ == base::kApplicationStateStarted);
   application_state_ = base::kApplicationStateBlurred;
-  FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_, Blur());
+  FOR_EACH_OBSERVER(LifecycleObserver,
+                    lifecycle_observers_, Blur(timestamp));
 }
 
-void BrowserModule::Conceal() {
+void BrowserModule::Conceal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Conceal()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(application_state_ == base::kApplicationStateBlurred);
   application_state_ = base::kApplicationStateConcealed;
-  ConcealInternal();
+  ConcealInternal(timestamp);
   OnMaybeFreeze();
 }
 
-void BrowserModule::Focus() {
+void BrowserModule::Focus(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Focus()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(application_state_ == base::kApplicationStateBlurred);
-  FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_, Focus());
+  FOR_EACH_OBSERVER(LifecycleObserver,
+                    lifecycle_observers_, Focus(timestamp));
   application_state_ = base::kApplicationStateStarted;
 }
 
-void BrowserModule::Freeze() {
+void BrowserModule::Freeze(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Freeze()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(application_state_ == base::kApplicationStateConcealed);
   application_state_ = base::kApplicationStateFrozen;
-  FreezeInternal();
+  FreezeInternal(timestamp);
 }
 
-void BrowserModule::Reveal() {
+void BrowserModule::Reveal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Reveal()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(application_state_ == base::kApplicationStateConcealed);
   application_state_ = base::kApplicationStateBlurred;
-  RevealInternal();
+  RevealInternal(timestamp);
 }
 
-void BrowserModule::Unfreeze() {
+void BrowserModule::Unfreeze(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Unfreeze()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(application_state_ == base::kApplicationStateFrozen);
   application_state_ = base::kApplicationStateConcealed;
-  UnfreezeInternal();
+  UnfreezeInternal(timestamp);
   NavigatePendingURL();
 }
 
@@ -1762,10 +1753,10 @@
   }
 }
 
-void BrowserModule::ConcealInternal() {
+void BrowserModule::ConcealInternal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::ConcealInternal()");
   FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_,
-                    Conceal(GetResourceProvider()));
+                    Conceal(GetResourceProvider(), timestamp));
 
   ResetResources();
 
@@ -1787,15 +1778,16 @@
   }
 }
 
-void BrowserModule::FreezeInternal() {
+void BrowserModule::FreezeInternal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::FreezeInternal()");
   FreezeMediaModule();
   // First freeze all our web modules which implies that they will release
   // their resource provider and all resources created through it.
-  FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_, Freeze());
+  FOR_EACH_OBSERVER(LifecycleObserver,
+                    lifecycle_observers_, Freeze(timestamp));
 }
 
-void BrowserModule::RevealInternal() {
+void BrowserModule::RevealInternal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::RevealInternal()");
   DCHECK(!renderer_module_);
   if (!system_window_) {
@@ -1812,14 +1804,14 @@
 
   // Set resource provider right after render module initialized.
   FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_,
-                    Reveal(GetResourceProvider()));
+                    Reveal(GetResourceProvider(), timestamp));
 
   if (qr_code_overlay_) {
     qr_code_overlay_->SetResourceProvider(GetResourceProvider());
   }
 }
 
-void BrowserModule::UnfreezeInternal() {
+void BrowserModule::UnfreezeInternal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::UnfreezeInternal()");
 // Set the Stub resource provider to media module and to web module
 // at Concealed state.
@@ -1828,7 +1820,7 @@
 #endif  // SB_API_VERSION >= 13
 
   FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_,
-                    Unfreeze(GetResourceProvider()));
+                    Unfreeze(GetResourceProvider(), timestamp));
 }
 
 void BrowserModule::OnMaybeFreeze() {
@@ -1860,6 +1852,22 @@
 }
 
 ViewportSize BrowserModule::GetViewportSize() {
+  // If a custom render root transform is used, report the size of the
+  // transformed viewport.
+  math::Matrix3F viewport_transform = math::Matrix3F::Identity();
+  static const CobaltExtensionGraphicsApi* s_graphics_extension =
+      static_cast<const CobaltExtensionGraphicsApi*>(
+          SbSystemGetExtension(kCobaltExtensionGraphicsName));
+  float m00, m01, m02, m10, m11, m12, m20, m21, m22;
+  if (s_graphics_extension &&
+      strcmp(s_graphics_extension->name, kCobaltExtensionGraphicsName) == 0 &&
+      s_graphics_extension->version >= 5 &&
+      s_graphics_extension->GetRenderRootTransform(&m00, &m01, &m02, &m10, &m11,
+                                                   &m12, &m20, &m21, &m22)) {
+    viewport_transform =
+        math::Matrix3F::FromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22);
+  }
+
   // We trust the renderer module for width and height the most, if it exists.
   if (renderer_module_) {
     math::Size target_size = renderer_module_->render_target_size();
@@ -1884,6 +1892,9 @@
           options_.requested_viewport_size->device_pixel_ratio();
     }
 
+    target_size =
+        math::RoundOut(viewport_transform.MapRect(math::RectF(target_size)))
+            .size();
     ViewportSize v(target_size.width(), target_size.height(), diagonal_inches,
                    device_pixel_ratio);
     return v;
@@ -1892,6 +1903,7 @@
   // If the system window exists, that's almost just as good.
   if (system_window_) {
     math::Size size = system_window_->GetWindowSize();
+    size = math::RoundOut(viewport_transform.MapRect(math::RectF(size))).size();
     ViewportSize v(size.width(), size.height(),
                    system_window_->GetDiagonalSizeInches(),
                    system_window_->GetDevicePixelRatio());
@@ -1900,7 +1912,14 @@
 
   // Otherwise, we assume we'll get the viewport size that was requested.
   if (options_.requested_viewport_size) {
-    return *options_.requested_viewport_size;
+    math::Size requested_size =
+        math::RoundOut(viewport_transform.MapRect(math::RectF(
+                           options_.requested_viewport_size->width(),
+                           options_.requested_viewport_size->height())))
+            .size();
+    return ViewportSize(requested_size.width(), requested_size.height(),
+                        options_.requested_viewport_size->diagonal_inches(),
+                        options_.requested_viewport_size->device_pixel_ratio());
   }
 
   // TODO: Allow platforms to define the default window size and return that
@@ -1908,7 +1927,11 @@
 
   // No window and no viewport size was requested, so we return a conservative
   // default.
-  ViewportSize view_size(1280, 720);
+  math::Size default_size(1280, 720);
+  default_size =
+      math::RoundOut(viewport_transform.MapRect(math::RectF(default_size)))
+          .size();
+  ViewportSize view_size(default_size.width(), default_size.height());
   return view_size;
 }
 
@@ -1920,14 +1943,6 @@
 
   LOG(INFO) << auto_mem_->ToPrettyPrintString(SbLogIsTty());
 
-  if (javascript_gc_threshold_in_bytes_) {
-    DCHECK_EQ(*javascript_gc_threshold_in_bytes_,
-              auto_mem_->javascript_gc_threshold_in_bytes()->value());
-  } else {
-    javascript_gc_threshold_in_bytes_ =
-        auto_mem_->javascript_gc_threshold_in_bytes()->value();
-  }
-
   // Web Module options.
   options_.web_module_options.encoded_image_cache_capacity =
       static_cast<int>(auto_mem_->encoded_image_cache_size_in_bytes()->value());
@@ -1935,9 +1950,6 @@
       static_cast<int>(auto_mem_->image_cache_size_in_bytes()->value());
   options_.web_module_options.remote_typeface_cache_capacity = static_cast<int>(
       auto_mem_->remote_typeface_cache_size_in_bytes()->value());
-  options_.web_module_options.javascript_engine_options.gc_threshold_bytes =
-      static_cast<size_t>(
-          auto_mem_->javascript_gc_threshold_in_bytes()->value());
   if (web_module_) {
     web_module_->SetImageCacheCapacity(
         auto_mem_->image_cache_size_in_bytes()->value());
@@ -2007,7 +2019,11 @@
   std::map<std::string, std::string> url_param_map;
   // If this is the initial startup, use topic within deeplink, if specified.
   if (main_web_module_generation_ == 1) {
-    GetParamMap(GetInitialDeepLink(), url_param_map);
+    std::string deeplink = GetInitialDeepLink();
+    size_t query_pos = deeplink.find('?');
+    if (query_pos != std::string::npos) {
+      GetParamMap(deeplink.substr(query_pos + 1), url_param_map);
+    }
   }
   // If this is not the initial startup, there was no deeplink specified, or
   // the deeplink did not have a topic, check the current url for a topic.
@@ -2061,5 +2077,22 @@
   }
 }
 
+scoped_refptr<script::Wrappable> BrowserModule::CreateH5vcc(
+    const scoped_refptr<dom::Window>& window,
+    script::GlobalEnvironment* global_environment) {
+  h5vcc::H5vcc::Settings h5vcc_settings;
+  h5vcc_settings.media_module = media_module_.get();
+  h5vcc_settings.network_module = network_module_;
+#if SB_IS(EVERGREEN)
+  h5vcc_settings.updater_module = updater_module_;
+#endif
+  h5vcc_settings.account_manager = account_manager_;
+  h5vcc_settings.event_dispatcher = event_dispatcher_;
+  h5vcc_settings.user_agent_data = window->navigator()->user_agent_data();
+  h5vcc_settings.global_environment = global_environment;
+
+  return scoped_refptr<script::Wrappable>(new h5vcc::H5vcc(h5vcc_settings));
+}
+
 }  // namespace browser
 }  // namespace cobalt
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index 026e593..62bedea 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -66,6 +66,7 @@
 #include "cobalt/system_window/system_window.h"
 #include "cobalt/webdriver/session_driver.h"
 #include "starboard/configuration.h"
+#include "starboard/time.h"
 #include "starboard/window.h"
 #include "url/gurl.h"
 
@@ -175,12 +176,12 @@
   void SetProxy(const std::string& proxy_rules);
 
   // LifecycleObserver-similar interface.
-  void Blur();
-  void Conceal();
-  void Freeze();
-  void Unfreeze();
-  void Reveal();
-  void Focus();
+  void Blur(SbTimeMonotonic timestamp);
+  void Conceal(SbTimeMonotonic timestamp);
+  void Freeze(SbTimeMonotonic timestamp);
+  void Unfreeze(SbTimeMonotonic timestamp);
+  void Reveal(SbTimeMonotonic timestamp);
+  void Focus(SbTimeMonotonic timestamp);
 
   // Attempt to reduce overall memory consumption. Called in response to a
   // system indication that memory usage is nearing a critical level.
@@ -423,23 +424,19 @@
 
   // Does all the steps for half of a Conceal that happen prior to
   // the app state update.
-  void ConcealInternal();
+  void ConcealInternal(SbTimeMonotonic timestamp);
 
   // Does all the steps for half of a Freeze that happen prior to
   // the app state update.
-  void FreezeInternal();
+  void FreezeInternal(SbTimeMonotonic timestamp);
 
   // Does all the steps for half of a Reveal that happen prior to
   // the app state update.
-  void RevealInternal();
-
-  // Does all the steps for half of a Start that happen prior to
-  // the app state update.
-  void StartInternal();
+  void RevealInternal(SbTimeMonotonic timestamp);
 
   // Does all the steps for half of a Unfreeze that happen prior to
   // the app state update.
-  void UnfreezeInternal();
+  void UnfreezeInternal(SbTimeMonotonic timestamp);
 
   // Check debug console, splash screen and web module if they are
   // ready to freeze at Concealed state. If so, call SystemRequestFreeze
@@ -472,6 +469,11 @@
   // Returns the topic used, or an empty Optional if a topic isn't found.
   base::Optional<std::string> SetSplashScreenTopicFallback(const GURL& url);
 
+  // Function that creates the H5vcc object that will be injected into WebModule
+  scoped_refptr<script::Wrappable> CreateH5vcc(
+      const scoped_refptr<dom::Window>& window,
+      script::GlobalEnvironment* global_environment);
+
   // TODO:
   //     WeakPtr usage here can be avoided if BrowserModule has a thread to
   //     own where it can ensure that its tasks are all resolved when it is
@@ -508,6 +510,8 @@
 
   base::EventDispatcher* event_dispatcher_;
 
+  account::AccountManager* account_manager_;
+
   // Whether the browser module has yet rendered anything. On the very first
   // render, we hide the system splash screen.
   bool is_rendered_;
@@ -709,11 +713,6 @@
   int current_splash_screen_timeline_id_;
   int current_main_web_module_timeline_id_;
 
-  // Remember the first set value for JavaScript's GC threshold setting computed
-  // by automem.  We want this so that we can check that it never changes, since
-  // we do not have the ability to modify it after startup.
-  base::Optional<int64_t> javascript_gc_threshold_in_bytes_;
-
   // Save the current window size before transitioning to Concealed state,
   // and reuse this value to recreate the window.
   math::Size window_size_;
diff --git a/src/cobalt/browser/debug_console.h b/src/cobalt/browser/debug_console.h
index 7983443..798154d 100644
--- a/src/cobalt/browser/debug_console.h
+++ b/src/cobalt/browser/debug_console.h
@@ -95,18 +95,27 @@
   }
 
   // LifecycleObserver implementation.
-  void Blur() override { web_module_->Blur(); }
-  void Conceal(render_tree::ResourceProvider* resource_provider) override {
-    web_module_->Conceal(resource_provider);
+  void Blur(SbTimeMonotonic timestamp) override {
+    web_module_->Blur(timestamp);
   }
-  void Freeze() override { web_module_->Freeze(); }
-  void Unfreeze(render_tree::ResourceProvider* resource_provider) override {
-    web_module_->Unfreeze(resource_provider);
+  void Conceal(render_tree::ResourceProvider* resource_provider,
+               SbTimeMonotonic timestamp) override {
+    web_module_->Conceal(resource_provider, timestamp);
   }
-  void Reveal(render_tree::ResourceProvider* resource_provider) override {
-    web_module_->Reveal(resource_provider);
+  void Freeze(SbTimeMonotonic timestamp) override {
+    web_module_->Freeze(timestamp);
   }
-  void Focus() override { web_module_->Focus(); }
+  void Unfreeze(render_tree::ResourceProvider* resource_provider,
+                SbTimeMonotonic timestamp) override {
+    web_module_->Unfreeze(resource_provider, timestamp);
+  }
+  void Reveal(render_tree::ResourceProvider* resource_provider,
+              SbTimeMonotonic timestamp) override {
+    web_module_->Reveal(resource_provider, timestamp);
+  }
+  void Focus(SbTimeMonotonic timestamp) override {
+     web_module_->Focus(timestamp);
+  }
 
   void ReduceMemory() { web_module_->ReduceMemory(); }
 
diff --git a/src/cobalt/browser/lifecycle_observer.h b/src/cobalt/browser/lifecycle_observer.h
index 96241c8..499bb10 100644
--- a/src/cobalt/browser/lifecycle_observer.h
+++ b/src/cobalt/browser/lifecycle_observer.h
@@ -26,29 +26,32 @@
 class LifecycleObserver : public base::CheckedObserver {
  public:
   // Blurs from Started, staying visible and retaining graphics resources.
-  virtual void Blur() = 0;
+  virtual void Blur(SbTimeMonotonic timestamp) = 0;
 
   // Conceals from Blurred, transitioning to invisible but background tasks can
   // still be running.
-  virtual void Conceal(render_tree::ResourceProvider* resource_provider) = 0;
+  virtual void Conceal(render_tree::ResourceProvider* resource_provider,
+                       SbTimeMonotonic timestamp) = 0;
 
   // Freezes from Concealed, and releases its reference to the ResourceProvider,
   // additionally releasing all references to any resources created from
   // it. This method must only be called if the object has previously been
   // Concealed.
-  virtual void Freeze() = 0;
+  virtual void Freeze(SbTimeMonotonic timestamp) = 0;
 
   // Unfreezes from Frozen, with a new ResourceProvider. This method must only
   // be called if the object has previously been Frozen.
-  virtual void Unfreeze(render_tree::ResourceProvider* resource_provider) = 0;
+  virtual void Unfreeze(render_tree::ResourceProvider* resource_provider,
+                        SbTimeMonotonic timestamp) = 0;
 
   // Reveals from Concealed, going back into partially-obscured state. This
   // method must only be called if the object has previously been Concealed.
-  virtual void Reveal(render_tree::ResourceProvider* resource_provider) = 0;
+  virtual void Reveal(render_tree::ResourceProvider* resource_provider,
+                      SbTimeMonotonic timestamp) = 0;
 
   // Focuses, going back to the Started state, and continuing to use the same
   // ResourceProvider and graphics resources.
-  virtual void Focus() = 0;
+  virtual void Focus(SbTimeMonotonic timestamp) = 0;
 
  protected:
   virtual ~LifecycleObserver() {}
diff --git a/src/cobalt/browser/memory_settings/auto_mem.cc b/src/cobalt/browser/memory_settings/auto_mem.cc
index 07d4c08..30a040f 100644
--- a/src/cobalt/browser/memory_settings/auto_mem.cc
+++ b/src/cobalt/browser/memory_settings/auto_mem.cc
@@ -278,7 +278,7 @@
 
   const int64_t target_cpu_memory = GenerateTargetMemoryBytes(
       max_cpu_bytes_->value(), SumAllMemoryOfType(MemorySetting::kCPU),
-      reduced_cpu_bytes_->optional_value());
+      base::Optional<int64_t>(0));
   const int64_t target_gpu_memory = GenerateTargetMemoryBytes(
       max_gpu_bytes_->value(), SumAllMemoryOfType(MemorySetting::kGPU),
       reduced_gpu_bytes_->optional_value());
@@ -310,10 +310,6 @@
   return image_cache_size_in_bytes_.get();
 }
 
-const IntSetting* AutoMem::javascript_gc_threshold_in_bytes() const {
-  return javascript_gc_threshold_in_bytes_.get();
-}
-
 const DimensionSetting* AutoMem::skia_atlas_texture_dimensions() const {
   return skia_atlas_texture_dimensions_.get();
 }
@@ -354,7 +350,6 @@
   // Keep these in alphabetical order.
   all_settings.push_back(encoded_image_cache_size_in_bytes_.get());
   all_settings.push_back(image_cache_size_in_bytes_.get());
-  all_settings.push_back(javascript_gc_threshold_in_bytes_.get());
   all_settings.push_back(misc_cobalt_cpu_size_in_bytes_.get());
   all_settings.push_back(misc_cobalt_gpu_size_in_bytes_.get());
   all_settings.push_back(offscreen_target_cache_size_in_bytes_.get());
@@ -426,20 +421,11 @@
   max_cpu_bytes_ = CreateCpuSetting(command_line_settings, build_settings);
   max_gpu_bytes_ = CreateGpuSetting(command_line_settings, build_settings);
 
-  reduced_cpu_bytes_ = CreateSystemMemorySetting(
-      switches::kReduceCpuMemoryBy, MemorySetting::kCPU,
-      command_line_settings.reduce_cpu_memory_by,
-      build_settings.reduce_cpu_memory_by, -1);
-  if (reduced_cpu_bytes_->value() == -1) {
-    // This effectively disables the value from being used in the constrainer.
-    reduced_cpu_bytes_->set_value(MemorySetting::kUnset, 0);
-  }
-
   reduced_gpu_bytes_ = CreateSystemMemorySetting(
       switches::kReduceGpuMemoryBy, MemorySetting::kGPU,
       command_line_settings.reduce_gpu_memory_by,
       build_settings.reduce_gpu_memory_by, -1);
-  if (reduced_cpu_bytes_->value() == -1) {
+  if (reduced_gpu_bytes_->value() == -1) {
     // This effectively disables the value from being used in the constrainer.
     reduced_gpu_bytes_->set_value(MemorySetting::kUnset, 0);
   }
@@ -468,16 +454,6 @@
   image_cache_size_in_bytes_->set_memory_scaling_function(
       MakeLinearMemoryScaler(.75, 1.0));
 
-  // Set javascript gc threshold
-  JavaScriptGcThresholdSetting* js_setting = new JavaScriptGcThresholdSetting;
-  SetMemorySetting<IntSetting, int64_t>(
-      command_line_settings.javascript_garbage_collection_threshold_in_bytes,
-      build_settings.javascript_garbage_collection_threshold_in_bytes,
-      kDefaultJsGarbageCollectionThresholdSize, js_setting);
-  EnsureValuePositive(js_setting);
-  js_setting->PostInit();
-  javascript_gc_threshold_in_bytes_.reset(js_setting);
-
   // Set the misc cobalt size to a specific size.
   misc_cobalt_cpu_size_in_bytes_.reset(
       new IntSetting("misc_cobalt_cpu_size_in_bytes"));
diff --git a/src/cobalt/browser/memory_settings/auto_mem_settings.cc b/src/cobalt/browser/memory_settings/auto_mem_settings.cc
index a29a0fd..98ef408 100644
--- a/src/cobalt/browser/memory_settings/auto_mem_settings.cc
+++ b/src/cobalt/browser/memory_settings/auto_mem_settings.cc
@@ -209,9 +209,6 @@
   settings.cobalt_image_cache_size_in_bytes =
       MakeValidIfGreaterThanOrEqualToZero(
           config->CobaltImageCacheSizeInBytes());
-  settings.javascript_garbage_collection_threshold_in_bytes =
-      MakeValidIfGreaterThanOrEqualToZero(
-          config->CobaltJsGarbageCollectionThresholdInBytes());
   settings.remote_typeface_cache_capacity_in_bytes =
       MakeValidIfGreaterThanOrEqualToZero(
           config->CobaltRemoteTypefaceCacheSizeInBytes());
@@ -241,8 +238,6 @@
 #endif  // defined(COBALT_MAX_GPU_USAGE_IN_BYTES)
 #endif  // SB_API_VERSION < 12
 
-  settings.reduce_cpu_memory_by =
-      MakeValidIfGreaterThanOrEqualToZero(config->CobaltReduceCpuMemoryBy());
   settings.reduce_gpu_memory_by =
       MakeValidIfGreaterThanOrEqualToZero(config->CobaltReduceGpuMemoryBy());
 
@@ -257,8 +252,6 @@
       switches::kEncodedImageCacheSizeInBytes);
   Set(command_line, &settings.cobalt_image_cache_size_in_bytes,
       switches::kImageCacheSizeInBytes);
-  Set(command_line, &settings.javascript_garbage_collection_threshold_in_bytes,
-      switches::kJavaScriptGcThresholdInBytes);
   Set(command_line, &settings.remote_typeface_cache_capacity_in_bytes,
       switches::kRemoteTypefaceCacheSizeInBytes);
   Set(command_line, &settings.skia_cache_size_in_bytes,
@@ -271,8 +264,6 @@
       switches::kOffscreenTargetCacheSizeInBytes);
   Set(command_line, &settings.max_cpu_in_bytes, switches::kMaxCobaltCpuUsage);
   Set(command_line, &settings.max_gpu_in_bytes, switches::kMaxCobaltGpuUsage);
-  Set(command_line, &settings.reduce_cpu_memory_by,
-      switches::kReduceCpuMemoryBy);
   Set(command_line, &settings.reduce_gpu_memory_by,
       switches::kReduceGpuMemoryBy);
 
diff --git a/src/cobalt/browser/memory_settings/auto_mem_settings.h b/src/cobalt/browser/memory_settings/auto_mem_settings.h
index ae3f172..8e1c7bd 100644
--- a/src/cobalt/browser/memory_settings/auto_mem_settings.h
+++ b/src/cobalt/browser/memory_settings/auto_mem_settings.h
@@ -39,7 +39,6 @@
   bool has_blitter;
   base::Optional<int64_t> cobalt_encoded_image_cache_size_in_bytes;
   base::Optional<int64_t> cobalt_image_cache_size_in_bytes;
-  base::Optional<int64_t> javascript_garbage_collection_threshold_in_bytes;
   base::Optional<int64_t> remote_typeface_cache_capacity_in_bytes;
   base::Optional<int64_t> skia_cache_size_in_bytes;
   base::Optional<TextureDimensions> skia_texture_atlas_dimensions;
diff --git a/src/cobalt/browser/memory_settings/auto_mem_settings_test.cc b/src/cobalt/browser/memory_settings/auto_mem_settings_test.cc
index 171235a..5f2a555 100644
--- a/src/cobalt/browser/memory_settings/auto_mem_settings_test.cc
+++ b/src/cobalt/browser/memory_settings/auto_mem_settings_test.cc
@@ -69,8 +69,6 @@
 
   TEST_PARSE_INT(expected, value, switches::kImageCacheSizeInBytes,
                  cobalt_image_cache_size_in_bytes);
-  TEST_PARSE_INT(expected, value, switches::kJavaScriptGcThresholdInBytes,
-                 javascript_garbage_collection_threshold_in_bytes);
   TEST_PARSE_INT(expected, value, switches::kRemoteTypefaceCacheSizeInBytes,
                  remote_typeface_cache_capacity_in_bytes);
   TEST_PARSE_INT(expected, value, switches::kSkiaCacheSizeInBytes,
@@ -83,8 +81,6 @@
                  max_cpu_in_bytes);
   TEST_PARSE_INT(expected, value, switches::kMaxCobaltGpuUsage,
                  max_gpu_in_bytes);
-  TEST_PARSE_INT(expected, value, switches::kReduceCpuMemoryBy,
-                 reduce_cpu_memory_by);
   TEST_PARSE_INT(expected, value, switches::kReduceGpuMemoryBy,
                  reduce_gpu_memory_by);
 #undef TEST_PARSE_INT
@@ -119,7 +115,6 @@
   AutoMemSettings settings(AutoMemSettings::kTypeCommandLine);
   EXPECT_EQ(AutoMemSettings::kTypeCommandLine, settings.type);
   EXPECT_FALSE(settings.cobalt_image_cache_size_in_bytes);
-  EXPECT_FALSE(settings.javascript_garbage_collection_threshold_in_bytes);
   EXPECT_FALSE(settings.remote_typeface_cache_capacity_in_bytes);
   EXPECT_FALSE(settings.skia_cache_size_in_bytes);
   EXPECT_FALSE(settings.skia_texture_atlas_dimensions);
@@ -127,7 +122,6 @@
   EXPECT_FALSE(settings.offscreen_target_cache_size_in_bytes);
   EXPECT_FALSE(settings.max_cpu_in_bytes);
   EXPECT_FALSE(settings.max_gpu_in_bytes);
-  EXPECT_FALSE(settings.reduce_cpu_memory_by);
   EXPECT_FALSE(settings.reduce_gpu_memory_by);
 
   AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
diff --git a/src/cobalt/browser/memory_settings/auto_mem_test.cc b/src/cobalt/browser/memory_settings/auto_mem_test.cc
index 5a2ee57..0891d87 100644
--- a/src/cobalt/browser/memory_settings/auto_mem_test.cc
+++ b/src/cobalt/browser/memory_settings/auto_mem_test.cc
@@ -70,7 +70,6 @@
   // Load up command line settings of command lines.
   AutoMemSettings command_line_settings(AutoMemSettings::kTypeCommandLine);
   command_line_settings.cobalt_image_cache_size_in_bytes = 1234;
-  command_line_settings.javascript_garbage_collection_threshold_in_bytes = 2345;
   command_line_settings.skia_cache_size_in_bytes = 3456;
   command_line_settings.skia_texture_atlas_dimensions =
       TextureDimensions(1234, 5678, 2);
@@ -83,14 +82,10 @@
 
     AutoMem auto_mem(kResolution1080p, command_line_settings, build_settings);
 
-    // image_cache_size_in_bytes and javascript_gc_threshold_in_bytes settings
-    // ignore the blitter type.
+    // image_cache_size_in_bytes settings ignore the blitter type.
     EXPECT_MEMORY_SETTING(auto_mem.image_cache_size_in_bytes(),
                           MemorySetting::kCmdLine, MemorySetting::kGPU, 1234);
 
-    EXPECT_MEMORY_SETTING(auto_mem.javascript_gc_threshold_in_bytes(),
-                          MemorySetting::kCmdLine, MemorySetting::kCPU, 2345);
-
     if (auto_mem.offscreen_target_cache_size_in_bytes()->valid()) {
       EXPECT_MEMORY_SETTING(auto_mem.offscreen_target_cache_size_in_bytes(),
                             MemorySetting::kCmdLine, MemorySetting::kGPU, 5678);
@@ -263,31 +258,6 @@
 
 // Tests the expectation that constraining the CPU memory to 40MB will result
 // in AutoMem reducing the the memory footprint.
-TEST(AutoMem, ExplicitReducedCPUMemoryConsumption) {
-  // STEP ONE: Get the "natural" size of the engine at the default test
-  // settings.
-  std::unique_ptr<AutoMem> default_auto_mem = CreateDefaultAutoMem();
-
-  AutoMemSettings command_line_settings(AutoMemSettings::kTypeCommandLine);
-  command_line_settings.reduce_cpu_memory_by = 5 * 1024 * 1024;
-  AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
-  AutoMem reduced_cpu_memory_auto_mem(kResolution1080p, command_line_settings,
-                                      build_settings);
-
-  EXPECT_EQ(5 * 1024 * 1024,
-            reduced_cpu_memory_auto_mem.reduced_cpu_bytes_->value());
-
-  const int64_t original_memory_consumption =
-      default_auto_mem->SumAllMemoryOfType(MemorySetting::kCPU);
-  const int64_t reduced_memory_consumption =
-      reduced_cpu_memory_auto_mem.SumAllMemoryOfType(MemorySetting::kCPU);
-
-  EXPECT_LE(5 * 1024 * 1024,
-            original_memory_consumption - reduced_memory_consumption);
-}
-
-// Tests the expectation that constraining the CPU memory to 40MB will result
-// in AutoMem reducing the the memory footprint.
 TEST(AutoMem, ExplicitReducedGPUMemoryConsumption) {
   // STEP ONE: Get the "natural" size of the engine at the default test
   // settings.
@@ -296,48 +266,20 @@
   AutoMemSettings command_line_settings(AutoMemSettings::kTypeCommandLine);
   command_line_settings.reduce_gpu_memory_by = 5 * 1024 * 1024;
   AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
-  AutoMem reduced_cpu_memory_auto_mem(kResolution1080p, command_line_settings,
+  AutoMem reduced_gpu_memory_auto_mem(kResolution1080p, command_line_settings,
                                       build_settings);
   EXPECT_EQ(5 * 1024 * 1024,
-            reduced_cpu_memory_auto_mem.reduced_gpu_bytes_->value());
+            reduced_gpu_memory_auto_mem.reduced_gpu_bytes_->value());
 
   const int64_t original_memory_consumption =
       default_auto_mem->SumAllMemoryOfType(MemorySetting::kGPU);
   const int64_t reduced_memory_consumption =
-      reduced_cpu_memory_auto_mem.SumAllMemoryOfType(MemorySetting::kGPU);
+      reduced_gpu_memory_auto_mem.SumAllMemoryOfType(MemorySetting::kGPU);
 
   EXPECT_LE(5 * 1024 * 1024,
             original_memory_consumption - reduced_memory_consumption);
 }
 
-// Tests the expectation that the max cpu value is ignored when reducing
-// memory.
-TEST(AutoMem, MaxCpuIsIgnoredDuringExplicitMemoryReduction) {
-  // STEP ONE: Get the "natural" size of the engine at the default test
-  // settings.
-  std::unique_ptr<AutoMem> default_auto_mem = CreateDefaultAutoMem();
-
-  AutoMemSettings command_line_settings(AutoMemSettings::kTypeCommandLine);
-  command_line_settings.reduce_cpu_memory_by = 5 * 1024 * 1024;
-  AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
-  build_settings.max_cpu_in_bytes = 1;
-  AutoMem reduced_cpu_memory_auto_mem(kResolution1080p, command_line_settings,
-                                      build_settings);
-
-  EXPECT_EQ(5 * 1024 * 1024,
-            reduced_cpu_memory_auto_mem.reduced_cpu_bytes_->value());
-
-  const int64_t original_memory_consumption =
-      default_auto_mem->SumAllMemoryOfType(MemorySetting::kCPU);
-  const int64_t reduced_memory_consumption =
-      reduced_cpu_memory_auto_mem.SumAllMemoryOfType(MemorySetting::kCPU);
-
-  // Max_cpu_in_bytes specifies one byte of memory, but reduce must override
-  // this for this test to pass.
-  EXPECT_LE(5 * 1024 * 1024,
-            original_memory_consumption - reduced_memory_consumption);
-}
-
 // Tests the expectation that the constrainer will not run on cpu memory if
 // --reduce_cpu_memory_by is set to 0.
 TEST(AutoMem, MaxCpuIsIgnoredWithZeroValueReduceCPUCommand) {
diff --git a/src/cobalt/browser/memory_settings/memory_settings.cc b/src/cobalt/browser/memory_settings/memory_settings.cc
index 7b51884..b854265 100644
--- a/src/cobalt/browser/memory_settings/memory_settings.cc
+++ b/src/cobalt/browser/memory_settings/memory_settings.cc
@@ -131,19 +131,6 @@
   return num_of_reductions;
 }
 
-JavaScriptGcThresholdSetting::JavaScriptGcThresholdSetting()
-    : IntSetting(switches::kJavaScriptGcThresholdInBytes) {}
-
-void JavaScriptGcThresholdSetting::PostInit() {
-  const int64_t normal_memory_consumption = MemoryConsumption();
-  const int64_t min_memory_consumption =
-      std::min<int64_t>(normal_memory_consumption, 1 * 1024 * 1024);
-
-  ScalingFunction function =
-      MakeJavaScriptGCScaler(min_memory_consumption, normal_memory_consumption);
-  set_memory_scaling_function(function);
-}
-
 int64_t SumMemoryConsumption(
     base::Optional<MemorySetting::MemoryType> memory_type_filter,
     const std::vector<const MemorySetting*>& memory_settings) {
diff --git a/src/cobalt/browser/memory_settings/memory_settings.h b/src/cobalt/browser/memory_settings/memory_settings.h
index afaeef6..6b3a0b1 100644
--- a/src/cobalt/browser/memory_settings/memory_settings.h
+++ b/src/cobalt/browser/memory_settings/memory_settings.h
@@ -181,12 +181,6 @@
   static size_t NumberOfReductions(double reduction_factor);
 };
 
-class JavaScriptGcThresholdSetting : public IntSetting {
- public:
-  JavaScriptGcThresholdSetting();
-  void PostInit();
-};
-
 int64_t SumMemoryConsumption(
     base::Optional<MemorySetting::MemoryType> memory_type_filter,
     const std::vector<const MemorySetting*>& memory_settings);
diff --git a/src/cobalt/browser/memory_settings/pretty_print_test.cc b/src/cobalt/browser/memory_settings/pretty_print_test.cc
index 9f4ffe5..98c1323 100644
--- a/src/cobalt/browser/memory_settings/pretty_print_test.cc
+++ b/src/cobalt/browser/memory_settings/pretty_print_test.cc
@@ -50,7 +50,7 @@
       SB_DLOG(INFO) << "Token \"" << token << "\" not found in order.";
       return false;
     }
-    current_position = position + SbStringGetLength(token);
+    current_position = position + strlen(token);
   }
   return true;
 }
@@ -67,7 +67,6 @@
       actual_string,
       {"SETTING NAME", "VALUE", "TYPE", "SOURCE", "\n",
        "image_cache_size_in_bytes", "1234", "0.0 MB", "GPU", "CmdLine", "\n",
-       "javascript_gc_threshold_in_bytes", "1112", "0.0 MB", "CPU", "AutoSet", "\n",  // NOLINT(whitespace/line_length)
        "skia_atlas_texture_dimensions", "1234x4567x2", "10.7 MB", "GPU", "CmdLine", "\n",  // NOLINT(whitespace/line_length)
        "skia_cache_size_in_bytes", "12345678", "11.8 MB", "GPU", "CmdLine", "\n",  // NOLINT(whitespace/line_length)
        "software_surface_cache_size_in_bytes", "N/A", "N/A", "N/A", "N/A", "\n"
diff --git a/src/cobalt/browser/memory_settings/scaling_function.cc b/src/cobalt/browser/memory_settings/scaling_function.cc
index a9d879f..e88eb66 100644
--- a/src/cobalt/browser/memory_settings/scaling_function.cc
+++ b/src/cobalt/browser/memory_settings/scaling_function.cc
@@ -29,33 +29,6 @@
 namespace memory_settings {
 namespace {
 
-class JavaScriptGCMemoryScaler {
- public:
-  JavaScriptGCMemoryScaler(int64_t min_memory, int64_t max_memory) {
-    DCHECK_LE(min_memory, max_memory);
-    min_memory = std::min(min_memory, max_memory);
-    const double min_factor =
-        static_cast<double>(min_memory) / static_cast<double>(max_memory);
-    // From 95% -> 0%, the memory will stay the same. This effectively
-    // clamps the minimum value.
-    interp_table_.Add(0.0, min_factor);
-
-    // At 95% memory, the memory falls to the min_factor. The rationale here
-    // is that most of the memory for JavaScript can be eliminated without
-    // a large performance penalty, so it's quickly reduced.
-    interp_table_.Add(.95, min_factor);
-
-    // At 100% we have 100% of memory.
-    interp_table_.Add(1.0, 1.0);
-  }
-  double Factor(double requested_memory_scale) const {
-    return interp_table_.Map(requested_memory_scale);
-  }
-
- private:
-  math::LinearInterpolator<double, double> interp_table_;
-};
-
 double LinearFunctionWithClampValue(double min_clamp_value,
                                     double max_clamp_value,
                                     double requested_memory_scale) {
@@ -79,15 +52,6 @@
   return function;
 }
 
-ScalingFunction MakeJavaScriptGCScaler(int64_t min_consumption,
-                                       int64_t max_consumption) {
-  JavaScriptGCMemoryScaler* constrainer =
-      new JavaScriptGCMemoryScaler(min_consumption, max_consumption);
-  // Note that Bind() will implicitly ref-count the constrainer pointer.
-  return base::Bind(&JavaScriptGCMemoryScaler::Factor,
-                    base::Owned(constrainer));
-}
-
 ScalingFunction MakeSkiaGlyphAtlasMemoryScaler() {
   ScalingFunction function = base::Bind(&SkiaAtlasGlyphTextureConstrainer);
   return function;
diff --git a/src/cobalt/browser/memory_settings/scaling_function.h b/src/cobalt/browser/memory_settings/scaling_function.h
index 4206037..33a4498 100644
--- a/src/cobalt/browser/memory_settings/scaling_function.h
+++ b/src/cobalt/browser/memory_settings/scaling_function.h
@@ -160,11 +160,6 @@
 ScalingFunction MakeLinearMemoryScaler(double min_clamp_value,
                                        double max_clamp_value);
 
-// Generates a functor that will shed most of the memory of the JavaScriptGC
-// very quickly.
-ScalingFunction MakeJavaScriptGCScaler(int64_t min_consumption,
-                                       int64_t max_consumption);
-
 // Generates a functor that will shed 50% of memory when the requested
 // memory scale is .5 or less, otherwise no memory is reduced.
 ScalingFunction MakeSkiaGlyphAtlasMemoryScaler();
diff --git a/src/cobalt/browser/memory_settings/table_printer_test.cc b/src/cobalt/browser/memory_settings/table_printer_test.cc
index d29c9a7..8c01b4d 100644
--- a/src/cobalt/browser/memory_settings/table_printer_test.cc
+++ b/src/cobalt/browser/memory_settings/table_printer_test.cc
@@ -49,7 +49,7 @@
       SB_DLOG(INFO) << "Token \"" << token << "\" not found in order.";
       return false;
     }
-    current_position = position + SbStringGetLength(token);
+    current_position = position + strlen(token);
   }
   return true;
 }
diff --git a/src/cobalt/browser/memory_settings/test_common.h b/src/cobalt/browser/memory_settings/test_common.h
index 6aa7b75..56cfafe 100644
--- a/src/cobalt/browser/memory_settings/test_common.h
+++ b/src/cobalt/browser/memory_settings/test_common.h
@@ -72,9 +72,6 @@
     MakeSetting(MemorySetting::kCmdLine, MemorySetting::kGPU,
                 switches::kImageCacheSizeInBytes, 1234);
 
-    MakeSetting(MemorySetting::kAutoSet, MemorySetting::kCPU,
-                switches::kJavaScriptGcThresholdInBytes, 1112);
-
     MakeSetting(MemorySetting::kCmdLine, MemorySetting::kGPU,
                 switches::kSkiaTextureAtlasDimensions,
                 TextureDimensions(1234, 4567, 2));
diff --git a/src/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc b/src/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc
index 9993d56..73d3b47 100644
--- a/src/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc
+++ b/src/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc
@@ -36,7 +36,7 @@
       diskwrite_cond_(diskwrite_mutex_),
       quit_thread_(false),
       file_path_(file_path) {
-  SbMemorySet(log_buffers_, 0, sizeof(log_buffers_));
+  memset(log_buffers_, 0, sizeof(log_buffers_));
   StartThread();
 }
 
@@ -95,7 +95,7 @@
   }
 
   LogBuffer& current_buffer = log_buffers_[current_log_buffer_];
-  SbMemoryCopy(current_buffer.buffer + current_buffer.num_bytes, data,
+  memcpy(current_buffer.buffer + current_buffer.num_bytes, data,
                num_bytes);
   current_buffer.num_bytes += num_bytes;
   return;
diff --git a/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc b/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
index d5a158a..31a89a3 100644
--- a/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
+++ b/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
@@ -55,7 +55,7 @@
        it != callstack.end(); ++it) {
     const NbMemoryScopeInfo* memory_scope = *it;
     const bool is_javascript_scope =
-        SbStringFindString(memory_scope->memory_scope_name_, "Javascript");
+        strstr(memory_scope->memory_scope_name_, "Javascript");
     if (is_javascript_scope) {
       return true;
     }
@@ -259,9 +259,9 @@
     const NbMemoryScopeInfo* memory_scope = callstack.back();
 
     const bool skip =
-        SbStringFindString(memory_scope->function_name_, "js_malloc") ||
-        SbStringFindString(memory_scope->function_name_, "js_realloc") ||
-        SbStringFindString(memory_scope->function_name_, "new_");
+        strstr(memory_scope->function_name_, "js_malloc") ||
+        strstr(memory_scope->function_name_, "js_realloc") ||
+        strstr(memory_scope->function_name_, "new_");
 
     // Skip up one callstack because we don't want to track calls to
     // allocation functions.
diff --git a/src/cobalt/browser/memory_tracker/tool/log_writer_tool.cc b/src/cobalt/browser/memory_tracker/tool/log_writer_tool.cc
index c41b1a1..b8dd168 100644
--- a/src/cobalt/browser/memory_tracker/tool/log_writer_tool.cc
+++ b/src/cobalt/browser/memory_tracker/tool/log_writer_tool.cc
@@ -91,7 +91,7 @@
     buff_pos += static_cast<size_t>(bytes_written);
   }
   // Adds a "\n" at the end.
-  SbStringConcat(buff + buff_pos, "\n", static_cast<int>(n - buff_pos));
+  starboard::strlcat(buff + buff_pos, "\n", static_cast<int>(n - buff_pos));
   buffered_file_writer_->Append(buff, strlen(buff));
 }
 
diff --git a/src/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc b/src/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc
index 9455c7f..ddaca24 100644
--- a/src/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc
+++ b/src/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc
@@ -141,8 +141,8 @@
   }
 
   // Adds a "\n" at the end.
-  bytes_written = SbStringConcat(buff + buff_pos, "\"\n",
-                                 static_cast<int>(kRecordLimit - buff_pos));
+  bytes_written = starboard::strlcat(buff + buff_pos, "\"\n",
+                                     static_cast<int>(kRecordLimit - buff_pos));
   buff_pos += bytes_written;
   buffered_file_writer_->Append(buff, buff_pos);
 }
diff --git a/src/cobalt/browser/memory_tracker/tool/util.cc b/src/cobalt/browser/memory_tracker/tool/util.cc
index fd57c06..e865670 100644
--- a/src/cobalt/browser/memory_tracker/tool/util.cc
+++ b/src/cobalt/browser/memory_tracker/tool/util.cc
@@ -39,7 +39,7 @@
   if (pos == kNotFound) {
     return haystack;
   }
-  const size_t n = SbStringGetLength(needle);
+  const size_t n = strlen(needle);
   std::string output;
   output.reserve(haystack.size());
 
@@ -196,8 +196,8 @@
 
 const char* BaseNameFast(const char* file_name) {
   // Case: Linux.
-  const char* end_pos = file_name + SbStringGetLength(file_name);
-  const char* last_forward_slash = SbStringFindLastCharacter(file_name, '/');
+  const char* end_pos = file_name + strlen(file_name);
+  const char* last_forward_slash = strrchr(file_name, '/');
   if (last_forward_slash) {
     if (end_pos != last_forward_slash) {
       ++last_forward_slash;
@@ -206,7 +206,7 @@
   }
 
   // Case: Windows.
-  const char* last_backward_slash = SbStringFindLastCharacter(file_name, '\\');
+  const char* last_backward_slash = strrchr(file_name, '\\');
   if (last_backward_slash) {
     if (end_pos != last_backward_slash) {
       ++last_backward_slash;
diff --git a/src/cobalt/browser/splash_screen.h b/src/cobalt/browser/splash_screen.h
index 381280f..3f0595d 100644
--- a/src/cobalt/browser/splash_screen.h
+++ b/src/cobalt/browser/splash_screen.h
@@ -53,18 +53,27 @@
   }
 
   // LifecycleObserver implementation.
-  void Blur() override { web_module_->Blur(); }
-  void Conceal(render_tree::ResourceProvider* resource_provider) override {
-    web_module_->Conceal(resource_provider);
+  void Blur(SbTimeMonotonic timestamp) override {
+    web_module_->Blur(timestamp);
   }
-  void Freeze() override { web_module_->Freeze(); }
-  void Unfreeze(render_tree::ResourceProvider* resource_provider) override {
-    web_module_->Unfreeze(resource_provider);
+  void Conceal(render_tree::ResourceProvider* resource_provider,
+               SbTimeMonotonic timestamp) override {
+    web_module_->Conceal(resource_provider, timestamp);
   }
-  void Reveal(render_tree::ResourceProvider* resource_provider) override {
-    web_module_->Reveal(resource_provider);
+  void Freeze(SbTimeMonotonic timestamp) override {
+    web_module_->Freeze(timestamp);
   }
-  void Focus() override { web_module_->Focus(); }
+  void Unfreeze(render_tree::ResourceProvider* resource_provider,
+                SbTimeMonotonic timestamp) override {
+    web_module_->Unfreeze(resource_provider, timestamp);
+  }
+  void Reveal(render_tree::ResourceProvider* resource_provider,
+              SbTimeMonotonic timestamp) override {
+    web_module_->Reveal(resource_provider, timestamp);
+  }
+  void Focus(SbTimeMonotonic timestamp) override {
+    web_module_->Focus(timestamp);
+  }
 
   void ReduceMemory() { web_module_->ReduceMemory(); }
 
diff --git a/src/cobalt/browser/splash_screen_cache.cc b/src/cobalt/browser/splash_screen_cache.cc
index 58b9caf..a139f6f 100644
--- a/src/cobalt/browser/splash_screen_cache.cc
+++ b/src/cobalt/browser/splash_screen_cache.cc
@@ -40,11 +40,11 @@
   }
   std::size_t prev_found = 0;
   std::size_t found = key.find(kSbFileSepString);
-  SbStringConcat(path.data(), kSbFileSepString, kSbFileMaxPath);
+  starboard::strlcat(path.data(), kSbFileSepString, kSbFileMaxPath);
   while (found != std::string::npos) {
-    SbStringConcat(path.data(),
-                   key.substr(prev_found, found - prev_found).c_str(),
-                   kSbFileMaxPath);
+    starboard::strlcat(path.data(),
+                       key.substr(prev_found, found - prev_found).c_str(),
+                       kSbFileMaxPath);
     if (!SbDirectoryCreate(path.data())) {
       return false;
     }
@@ -175,7 +175,7 @@
                                          std::vector<char>& path,
                                          std::string& subpath) const {
   std::string subcomponent = kSbFileSepString + directory;
-  if (SbStringConcat(path.data(), subcomponent.c_str(), kSbFileMaxPath) >=
+  if (starboard::strlcat(path.data(), subcomponent.c_str(), kSbFileMaxPath) >=
       static_cast<int>(kSbFileMaxPath)) {
     return false;
   }
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 249e0b3..1411c37 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -273,11 +273,6 @@
     "Setting this switch defines the startup URL that Cobalt will use.  If no "
     "value is set, a default URL will be used.";
 
-const char kJavaScriptGcThresholdInBytes[] = "javascript_gc_threshold_in_bytes";
-const char kJavaScriptGcThresholdInBytesHelp[] =
-    "Specifies the javascript gc threshold. When this amount of garbage has "
-    "collected then the garbage collector will begin running.";
-
 const char kLocalStoragePartitionUrl[] = "local_storage_partition_url";
 const char kLocalStoragePartitionUrlHelp[] =
     "Overrides the default storage partition with a custom partition URL to "
@@ -324,11 +319,6 @@
     " and the number of locations can be overwritten by specifying it as the "
     " value of the command line parameter, like '--qr_code_overlay=6'.";
 
-const char kReduceCpuMemoryBy[] = "reduce_cpu_memory_by";
-const char kReduceCpuMemoryByHelp[] =
-    "Reduces the cpu-memory of the system by this amount. This causes AutoMem "
-    "to reduce the runtime size of the CPU-Memory caches.";
-
 const char kReduceGpuMemoryBy[] = "reduce_gpu_memory_by";
 const char kReduceGpuMemoryByHelp[] =
     "Reduces the gpu-memory of the system by this amount. This causes AutoMem "
@@ -470,7 +460,6 @@
         {kHelp, kHelpHelp},
         {kImageCacheSizeInBytes, kImageCacheSizeInBytesHelp},
         {kInitialURL, kInitialURLHelp},
-        {kJavaScriptGcThresholdInBytes, kJavaScriptGcThresholdInBytesHelp},
         {kLocalStoragePartitionUrl, kLocalStoragePartitionUrlHelp},
         {kMaxCobaltCpuUsage, kMaxCobaltCpuUsageHelp},
         {kMaxCobaltGpuUsage, kMaxCobaltGpuUsageHelp},
@@ -480,7 +469,6 @@
         {kOmitDeviceAuthenticationQueryParameters,
          kOmitDeviceAuthenticationQueryParametersHelp},
         {kProxy, kProxyHelp}, {kQrCodeOverlay, kQrCodeOverlayHelp},
-        {kReduceCpuMemoryBy, kReduceCpuMemoryByHelp},
         {kReduceGpuMemoryBy, kReduceGpuMemoryByHelp},
         {kRemoteTypefaceCacheSizeInBytes, kRemoteTypefaceCacheSizeInBytesHelp},
         {kRetainRemoteTypefaceCacheDuringSuspend,
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 94f052b..53fe622 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -115,8 +115,6 @@
 extern const char kImageCacheSizeInBytesHelp[];
 extern const char kInitialURL[];
 extern const char kInitialURLHelp[];
-extern const char kJavaScriptGcThresholdInBytes[];
-extern const char kJavaScriptGcThresholdInBytesHelp[];
 extern const char kLocalStoragePartitionUrl[];
 extern const char kLocalStoragePartitionUrlHelp[];
 extern const char kMaxCobaltCpuUsage[];
@@ -133,8 +131,6 @@
 extern const char kProxyHelp[];
 extern const char kQrCodeOverlay[];
 extern const char kQrCodeOverlayHelp[];
-extern const char kReduceCpuMemoryBy[];
-extern const char kReduceCpuMemoryByHelp[];
 extern const char kReduceGpuMemoryBy[];
 extern const char kReduceGpuMemoryByHelp[];
 extern const char kRemoteTypefaceCacheSizeInBytes[];
diff --git a/src/cobalt/browser/user_agent_platform_info.cc b/src/cobalt/browser/user_agent_platform_info.cc
new file mode 100644
index 0000000..50a703f
--- /dev/null
+++ b/src/cobalt/browser/user_agent_platform_info.cc
@@ -0,0 +1,205 @@
+// Copyright 2021 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/browser/user_agent_platform_info.h"
+
+#include <memory>
+
+#include "base/command_line.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "cobalt/browser/switches.h"
+#include "cobalt/renderer/get_default_rasterizer_for_platform.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/version.h"
+#include "cobalt_build_id.h"  // NOLINT(build/include)
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/system.h"
+#if SB_IS(EVERGREEN)
+#include "cobalt/updater/utils.h"
+#endif
+
+namespace cobalt {
+namespace browser {
+
+namespace {
+
+std::string CreateDeviceTypeString(SbSystemDeviceType device_type) {
+  switch (device_type) {
+    case kSbSystemDeviceTypeBlueRayDiskPlayer:
+      return "BDP";
+    case kSbSystemDeviceTypeGameConsole:
+      return "GAME";
+    case kSbSystemDeviceTypeOverTheTopBox:
+      return "OTT";
+    case kSbSystemDeviceTypeSetTopBox:
+      return "STB";
+    case kSbSystemDeviceTypeTV:
+      return "TV";
+    case kSbSystemDeviceTypeAndroidTV:
+      return "ATV";
+    case kSbSystemDeviceTypeDesktopPC:
+      return "DESKTOP";
+    case kSbSystemDeviceTypeUnknown:
+      return "UNKNOWN";
+    default:
+      NOTREACHED();
+      return "";
+  }
+}
+
+std::string CreateConnectionTypeString(
+    const base::Optional<SbSystemConnectionType>& connection_type) {
+  if (connection_type) {
+    switch (*connection_type) {
+      case kSbSystemConnectionTypeWired:
+        return "Wired";
+      case kSbSystemConnectionTypeWireless:
+        return "Wireless";
+      default:
+        NOTREACHED();
+    }
+  }
+
+  return "";
+}
+
+}  // namespace
+
+UserAgentPlatformInfo::UserAgentPlatformInfo() { InitializeFields(); }
+
+void UserAgentPlatformInfo::set_device_type(SbSystemDeviceType device_type) {
+  device_type_ = device_type;
+  device_type_string_ = CreateDeviceTypeString(device_type_);
+}
+
+void UserAgentPlatformInfo::set_connection_type(
+    base::Optional<SbSystemConnectionType> connection_type) {
+  if (connection_type) {
+    connection_type_ = connection_type;
+    connection_type_string_ = CreateConnectionTypeString(connection_type_);
+  } else {
+    connection_type_string_ = "";
+  }
+}
+
+void UserAgentPlatformInfo::InitializeFields() {
+  starboard_version_ = base::StringPrintf("Starboard/%d", SB_API_VERSION);
+
+  const size_t kSystemPropertyMaxLength = 1024;
+  char value[kSystemPropertyMaxLength];
+  bool result;
+
+  result = SbSystemGetProperty(kSbSystemPropertyPlatformName, value,
+                               kSystemPropertyMaxLength);
+  SB_DCHECK(result);
+  os_name_and_version_ = value;
+
+  // Fill platform info if it is a hardware TV device.
+  SbSystemDeviceType device_type = SbSystemGetDeviceType();
+
+#if SB_API_VERSION >= 12
+  // System Integrator
+  result = SbSystemGetProperty(kSbSystemPropertySystemIntegratorName, value,
+                               kSystemPropertyMaxLength);
+#else
+  // Original Design Manufacturer (ODM)
+  result = SbSystemGetProperty(kSbSystemPropertyOriginalDesignManufacturerName,
+                               value, kSystemPropertyMaxLength);
+#endif
+  if (result) {
+    original_design_manufacturer_ = value;
+  }
+
+  javascript_engine_version_ = script::GetJavaScriptEngineNameAndVersion();
+
+  rasterizer_type_ =
+      renderer::GetDefaultRasterizerForPlatform().rasterizer_name;
+
+// Evergreen version
+#if SB_IS(EVERGREEN)
+  evergreen_version_ = updater::GetCurrentEvergreenVersion();
+#endif
+
+  cobalt_version_ = COBALT_VERSION;
+  cobalt_build_version_number_ = COBALT_BUILD_VERSION_NUMBER;
+
+#if defined(COBALT_BUILD_TYPE_DEBUG)
+  build_configuration_ = "debug";
+#elif defined(COBALT_BUILD_TYPE_DEVEL)
+  build_configuration_ = "devel";
+#elif defined(COBALT_BUILD_TYPE_QA)
+  build_configuration_ = "qa";
+#elif defined(COBALT_BUILD_TYPE_GOLD)
+  build_configuration_ = "gold";
+#else
+#error Unknown build configuration.
+#endif
+
+  result = SbSystemGetProperty(kSbSystemPropertyUserAgentAuxField, value,
+                               kSystemPropertyMaxLength);
+  if (result) {
+    aux_field_ = value;
+  }
+
+  // Device Type
+  device_type_ = device_type;
+  device_type_string_ = CreateDeviceTypeString(device_type_);
+
+  // Chipset model number
+  result = SbSystemGetProperty(kSbSystemPropertyChipsetModelNumber, value,
+                               kSystemPropertyMaxLength);
+  if (result) {
+    chipset_model_number_ = value;
+  }
+
+  // Model year
+  result = SbSystemGetProperty(kSbSystemPropertyModelYear, value,
+                               kSystemPropertyMaxLength);
+  if (result) {
+    model_year_ = value;
+  }
+
+  // Firmware version
+  result = SbSystemGetProperty(kSbSystemPropertyFirmwareVersion, value,
+                               kSystemPropertyMaxLength);
+  if (result) {
+    firmware_version_ = value;
+  }
+
+  // Brand
+  result = SbSystemGetProperty(kSbSystemPropertyBrandName, value,
+                               kSystemPropertyMaxLength);
+  if (result) {
+    brand_ = value;
+  }
+
+  // Model name
+  result = SbSystemGetProperty(kSbSystemPropertyModelName, value,
+                               kSystemPropertyMaxLength);
+  if (result) {
+    model_ = value;
+  }
+
+  // Connection type
+  SbSystemConnectionType connection_type = SbSystemGetConnectionType();
+  if (connection_type != kSbSystemConnectionTypeUnknown) {
+    connection_type_ = connection_type;
+  }
+  connection_type_string_ = CreateConnectionTypeString(connection_type_);
+}
+
+}  // namespace browser
+}  // namespace cobalt
diff --git a/src/cobalt/browser/user_agent_platform_info.h b/src/cobalt/browser/user_agent_platform_info.h
new file mode 100644
index 0000000..80d9798
--- /dev/null
+++ b/src/cobalt/browser/user_agent_platform_info.h
@@ -0,0 +1,177 @@
+// Copyright 2021 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_BROWSER_USER_AGENT_PLATFORM_INFO_H_
+#define COBALT_BROWSER_USER_AGENT_PLATFORM_INFO_H_
+
+#include <string>
+
+#include "cobalt/dom/user_agent_platform_info.h"
+
+namespace cobalt {
+namespace browser {
+
+class UserAgentPlatformInfo : public dom::UserAgentPlatformInfo {
+ public:
+  UserAgentPlatformInfo();
+  ~UserAgentPlatformInfo() override{};
+
+  // From: dom:UserAgentPlatformInfo
+  //
+  const std::string& starboard_version() const override {
+    return starboard_version_;
+  }
+  const std::string& os_name_and_version() const override {
+    return os_name_and_version_;
+  }
+  base::Optional<std::string> original_design_manufacturer() const override {
+    return original_design_manufacturer_;
+  }
+  SbSystemDeviceType device_type() const override { return device_type_; }
+  const std::string& device_type_string() const override {
+    return device_type_string_;
+  }
+  base::Optional<std::string> chipset_model_number() const override {
+    return chipset_model_number_;
+  }
+  base::Optional<std::string> model_year() const override {
+    return model_year_;
+  }
+  base::Optional<std::string> firmware_version() const override {
+    return firmware_version_;
+  }
+  base::Optional<std::string> brand() const override { return brand_; }
+  base::Optional<std::string> model() const override { return model_; }
+  const std::string& aux_field() const override { return aux_field_; }
+  base::Optional<SbSystemConnectionType> connection_type() const override {
+    return connection_type_;
+  }
+  const std::string& connection_type_string() const override {
+    return connection_type_string_;
+  }
+  const std::string& javascript_engine_version() const override {
+    return javascript_engine_version_;
+  }
+  const std::string& rasterizer_type() const override {
+    return rasterizer_type_;
+  }
+  const std::string& evergreen_version() const override {
+    return evergreen_version_;
+  }
+  const std::string& cobalt_version() const override { return cobalt_version_; }
+  const std::string& cobalt_build_version_number() const override {
+    return cobalt_build_version_number_;
+  }
+  const std::string& build_configuration() const override {
+    return build_configuration_;
+  }
+
+  // Other: For unit testing cobalt::browser::CreateUserAgentString()
+  //
+  void set_starboard_version(const std::string& starboard_version) {
+    starboard_version_ = starboard_version;
+  }
+  void set_os_name_and_version(const std::string& os_name_and_version) {
+    os_name_and_version_ = os_name_and_version;
+  }
+  void set_original_design_manufacturer(
+      base::Optional<std::string> original_design_manufacturer) {
+    if (original_design_manufacturer) {
+      original_design_manufacturer_ = original_design_manufacturer;
+    }
+  }
+  void set_device_type(SbSystemDeviceType device_type);
+  void set_chipset_model_number(
+      base::Optional<std::string> chipset_model_number) {
+    if (chipset_model_number) {
+      chipset_model_number_ = chipset_model_number;
+    }
+  }
+  void set_model_year(base::Optional<std::string> model_year) {
+    if (model_year) {
+      model_year_ = model_year;
+    }
+  }
+  void set_firmware_version(base::Optional<std::string> firmware_version) {
+    if (firmware_version) {
+      firmware_version_ = firmware_version;
+    }
+  }
+  void set_brand(base::Optional<std::string> brand) {
+    if (brand) {
+      brand_ = brand;
+    }
+  }
+  void set_model(base::Optional<std::string> model) {
+    if (model) {
+      model_ = model;
+    }
+  }
+  void set_aux_field(const std::string& aux_field) { aux_field_ = aux_field; }
+  void set_connection_type(
+      base::Optional<SbSystemConnectionType> connection_type);
+  void set_javascript_engine_version(
+      const std::string& javascript_engine_version) {
+    javascript_engine_version_ = javascript_engine_version;
+  }
+  void set_rasterizer_type(const std::string& rasterizer_type) {
+    rasterizer_type_ = rasterizer_type;
+  }
+  void set_evergreen_version(const std::string& evergreen_version) {
+    evergreen_version_ = evergreen_version;
+  }
+  void set_cobalt_version(const std::string& cobalt_version) {
+    cobalt_version_ = cobalt_version;
+  }
+  void set_cobalt_build_version_number(
+      const std::string& cobalt_build_version_number) {
+    cobalt_build_version_number_ = cobalt_build_version_number;
+  }
+  void set_build_configuration(const std::string& build_configuration) {
+    build_configuration_ = build_configuration;
+  }
+
+ private:
+  // Function that will query Starboard and populate a UserAgentPlatformInfo
+  // object based on those results.  This is de-coupled from
+  // CreateUserAgentString() so that the common logic in CreateUserAgentString()
+  // can be easily unit tested.
+  void InitializeFields();
+
+  std::string starboard_version_;
+  std::string os_name_and_version_;
+  base::Optional<std::string> original_design_manufacturer_;
+  SbSystemDeviceType device_type_ = kSbSystemDeviceTypeUnknown;
+  std::string device_type_string_;
+  base::Optional<std::string> chipset_model_number_;
+  base::Optional<std::string> model_year_;
+  base::Optional<std::string> firmware_version_;
+  base::Optional<std::string> brand_;
+  base::Optional<std::string> model_;
+  std::string aux_field_;
+  base::Optional<SbSystemConnectionType> connection_type_;
+  std::string connection_type_string_;
+  std::string javascript_engine_version_;
+  std::string rasterizer_type_;
+  std::string evergreen_version_;
+
+  std::string cobalt_version_;
+  std::string cobalt_build_version_number_;
+  std::string build_configuration_;
+};
+
+}  // namespace browser
+}  // namespace cobalt
+
+#endif  // COBALT_BROWSER_USER_AGENT_PLATFORM_INFO_H_
diff --git a/src/cobalt/browser/user_agent_string.cc b/src/cobalt/browser/user_agent_string.cc
index c016789..fde8edb 100644
--- a/src/cobalt/browser/user_agent_string.cc
+++ b/src/cobalt/browser/user_agent_string.cc
@@ -20,16 +20,12 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "cobalt/browser/switches.h"
-#include "cobalt/renderer/get_default_rasterizer_for_platform.h"
-#include "cobalt/script/javascript_engine.h"
-#include "cobalt/version.h"
-#include "cobalt_build_id.h"  // NOLINT(build/include)
+#if SB_IS(EVERGREEN)
+#include "cobalt/extension/installation_manager.h"
+#endif  // SB_IS(EVERGREEN)
 #include "starboard/common/log.h"
 #include "starboard/common/string.h"
 #include "starboard/system.h"
-#if SB_IS(EVERGREEN)
-#include "cobalt/updater/utils.h"
-#endif
 
 namespace cobalt {
 namespace browser {
@@ -58,150 +54,10 @@
   return clean;
 }
 
-std::string CreateDeviceTypeString(SbSystemDeviceType device_type) {
-  switch (device_type) {
-    case kSbSystemDeviceTypeBlueRayDiskPlayer:
-      return "BDP";
-    case kSbSystemDeviceTypeGameConsole:
-      return "GAME";
-    case kSbSystemDeviceTypeOverTheTopBox:
-      return "OTT";
-    case kSbSystemDeviceTypeSetTopBox:
-      return "STB";
-    case kSbSystemDeviceTypeTV:
-      return "TV";
-    case kSbSystemDeviceTypeAndroidTV:
-      return "ATV";
-    case kSbSystemDeviceTypeDesktopPC:
-      return "DESKTOP";
-    case kSbSystemDeviceTypeUnknown:
-      return "UNKNOWN";
-    default:
-      NOTREACHED();
-      return "";
-  }
-}
-
-std::string CreateConnectionTypeString(
-    const base::Optional<SbSystemConnectionType>& connection_type) {
-  if (connection_type) {
-    switch (*connection_type) {
-      case kSbSystemConnectionTypeWired:
-        return "Wired";
-      case kSbSystemConnectionTypeWireless:
-        return "Wireless";
-      default:
-        NOTREACHED();
-    }
-  }
-
-  return "";
-}
-
 }  // namespace
 
 UserAgentPlatformInfo GetUserAgentPlatformInfoFromSystem() {
   UserAgentPlatformInfo platform_info;
-
-  platform_info.starboard_version =
-      base::StringPrintf("Starboard/%d", SB_API_VERSION);
-
-  const size_t kSystemPropertyMaxLength = 1024;
-  char value[kSystemPropertyMaxLength];
-  bool result;
-
-  result = SbSystemGetProperty(kSbSystemPropertyPlatformName, value,
-                               kSystemPropertyMaxLength);
-  SB_DCHECK(result);
-  platform_info.os_name_and_version = value;
-
-  // Fill platform info if it is a hardware TV device.
-  SbSystemDeviceType device_type = SbSystemGetDeviceType();
-
-#if SB_API_VERSION >= 12
-  // System Integrator
-  result = SbSystemGetProperty(kSbSystemPropertySystemIntegratorName, value,
-                               kSystemPropertyMaxLength);
-#else
-  // Original Design Manufacturer (ODM)
-  result = SbSystemGetProperty(kSbSystemPropertyOriginalDesignManufacturerName,
-                               value, kSystemPropertyMaxLength);
-#endif
-  if (result) {
-    platform_info.original_design_manufacturer = value;
-  }
-
-  platform_info.javascript_engine_version =
-      script::GetJavaScriptEngineNameAndVersion();
-
-  platform_info.rasterizer_type =
-      renderer::GetDefaultRasterizerForPlatform().rasterizer_name;
-
-  platform_info.cobalt_version = COBALT_VERSION;
-  platform_info.cobalt_build_version_number = COBALT_BUILD_VERSION_NUMBER;
-
-#if defined(COBALT_BUILD_TYPE_DEBUG)
-  platform_info.build_configuration = "debug";
-#elif defined(COBALT_BUILD_TYPE_DEVEL)
-  platform_info.build_configuration = "devel";
-#elif defined(COBALT_BUILD_TYPE_QA)
-  platform_info.build_configuration = "qa";
-#elif defined(COBALT_BUILD_TYPE_GOLD)
-  platform_info.build_configuration = "gold";
-#else
-#error Unknown build configuration.
-#endif
-
-  result = SbSystemGetProperty(kSbSystemPropertyUserAgentAuxField, value,
-                               kSystemPropertyMaxLength);
-  if (result) {
-    platform_info.aux_field = value;
-  }
-
-  // Device Type
-  platform_info.device_type = device_type;
-
-  // Chipset model number
-  result = SbSystemGetProperty(kSbSystemPropertyChipsetModelNumber, value,
-                               kSystemPropertyMaxLength);
-  if (result) {
-    platform_info.chipset_model_number = value;
-  }
-
-  // Model year
-  result = SbSystemGetProperty(kSbSystemPropertyModelYear, value,
-                               kSystemPropertyMaxLength);
-  if (result) {
-    platform_info.model_year = value;
-  }
-
-  // Firmware version
-  result = SbSystemGetProperty(kSbSystemPropertyFirmwareVersion, value,
-                               kSystemPropertyMaxLength);
-  if (result) {
-    platform_info.firmware_version = value;
-  }
-
-  // Brand
-  result = SbSystemGetProperty(kSbSystemPropertyBrandName, value,
-                               kSystemPropertyMaxLength);
-  if (result) {
-    platform_info.brand = value;
-  }
-
-  // Model name
-  result = SbSystemGetProperty(kSbSystemPropertyModelName, value,
-                               kSystemPropertyMaxLength);
-  if (result) {
-    platform_info.model = value;
-  }
-
-  // Connection type
-  SbSystemConnectionType connection_type = SbSystemGetConnectionType();
-  if (connection_type != kSbSystemConnectionTypeUnknown) {
-    platform_info.connection_type = connection_type;
-  }
-
   return platform_info;
 }
 
@@ -216,7 +72,7 @@
   //   Starboard/APIVersion,
   //   Device/FirmwareVersion (Brand, Model, ConnectionType)
 
-  std::string os_name_and_version = platform_info.os_name_and_version;
+  std::string os_name_and_version = platform_info.os_name_and_version();
 
 #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   // Because we add Cobalt's user agent string to Crashpad before we actually
@@ -237,52 +93,59 @@
 
   //   Cobalt/Version.BuildNumber-BuildConfiguration (unlike Gecko)
   base::StringAppendF(&user_agent, " Cobalt/%s.%s-%s (unlike Gecko)",
-                      platform_info.cobalt_version.c_str(),
-                      platform_info.cobalt_build_version_number.c_str(),
-                      platform_info.build_configuration.c_str());
+                      platform_info.cobalt_version().c_str(),
+                      platform_info.cobalt_build_version_number().c_str(),
+                      platform_info.build_configuration().c_str());
 
   // JavaScript Engine Name/Version
-  if (!platform_info.javascript_engine_version.empty()) {
+  if (!platform_info.javascript_engine_version().empty()) {
     base::StringAppendF(&user_agent, " %s",
-                        platform_info.javascript_engine_version.c_str());
+                        platform_info.javascript_engine_version().c_str());
   }
 
   // Rasterizer Type
-  if (!platform_info.rasterizer_type.empty()) {
+  if (!platform_info.rasterizer_type().empty()) {
     base::StringAppendF(&user_agent, " %s",
-                        platform_info.rasterizer_type.c_str());
+                        platform_info.rasterizer_type().c_str());
   }
 
-// Evergreen version
-#if SB_IS(EVERGREEN)
-  const std::string evergreen_version = updater::GetCurrentEvergreenVersion();
-  if (!evergreen_version.empty()) {
+  // Evergreen version
+  if (!platform_info.evergreen_version().empty()) {
     base::StringAppendF(&user_agent, " Evergreen/%s",
-                        evergreen_version.c_str());
+                        platform_info.evergreen_version().c_str());
+#if SB_IS(EVERGREEN)
+    if (!SbSystemGetExtension(kCobaltExtensionInstallationManagerName)) {
+      // If the installation manager is not initialized, the "evergreen_lite"
+      // command line parameter is specified and the system image is loaded.
+      base::StringAppendF(&user_agent, " Evergreen-Lite");
+    } else {
+      base::StringAppendF(&user_agent, " Evergreen-Full");
+    }
+#endif  // SB_IS(EVERGREEN)
   }
-#endif
 
   // Starboard/APIVersion,
-  if (!platform_info.starboard_version.empty()) {
+  if (!platform_info.starboard_version().empty()) {
     base::StringAppendF(&user_agent, " %s",
-                        platform_info.starboard_version.c_str());
+                        platform_info.starboard_version().c_str());
   }
 
   // Device/FirmwareVersion (Brand, Model, ConnectionType)
   base::StringAppendF(
       &user_agent, ", %s_%s_%s_%s/%s (%s, %s, %s)",
-      Sanitize(platform_info.original_design_manufacturer.value_or("")).c_str(),
-      CreateDeviceTypeString(platform_info.device_type).c_str(),
-      Sanitize(platform_info.chipset_model_number.value_or("")).c_str(),
-      Sanitize(platform_info.model_year.value_or("")).c_str(),
-      Sanitize(platform_info.firmware_version.value_or("")).c_str(),
-      Sanitize(platform_info.brand.value_or("")).c_str(),
-      Sanitize(platform_info.model.value_or("")).c_str(),
-      CreateConnectionTypeString(platform_info.connection_type).c_str());
+      Sanitize(platform_info.original_design_manufacturer().value_or(""))
+          .c_str(),
+      platform_info.device_type_string().c_str(),
+      Sanitize(platform_info.chipset_model_number().value_or("")).c_str(),
+      Sanitize(platform_info.model_year().value_or("")).c_str(),
+      Sanitize(platform_info.firmware_version().value_or("")).c_str(),
+      Sanitize(platform_info.brand().value_or("")).c_str(),
+      Sanitize(platform_info.model().value_or("")).c_str(),
+      platform_info.connection_type_string().c_str());
 
-  if (!platform_info.aux_field.empty()) {
+  if (!platform_info.aux_field().empty()) {
     user_agent.append(" ");
-    user_agent.append(platform_info.aux_field);
+    user_agent.append(platform_info.aux_field());
   }
   return user_agent;
 }
diff --git a/src/cobalt/browser/user_agent_string.h b/src/cobalt/browser/user_agent_string.h
index 432ccdf..a3326b9 100644
--- a/src/cobalt/browser/user_agent_string.h
+++ b/src/cobalt/browser/user_agent_string.h
@@ -18,32 +18,11 @@
 #include <string>
 
 #include "base/optional.h"
+#include "cobalt/browser/user_agent_platform_info.h"
 
 namespace cobalt {
 namespace browser {
 
-struct UserAgentPlatformInfo {
-  UserAgentPlatformInfo() : device_type(kSbSystemDeviceTypeUnknown) {}
-
-  std::string starboard_version;
-  std::string os_name_and_version;
-  base::Optional<std::string> original_design_manufacturer;
-  SbSystemDeviceType device_type;
-  base::Optional<std::string> chipset_model_number;
-  base::Optional<std::string> model_year;
-  base::Optional<std::string> firmware_version;
-  base::Optional<std::string> brand;
-  base::Optional<std::string> model;
-  std::string aux_field;
-  base::Optional<SbSystemConnectionType> connection_type;
-  std::string javascript_engine_version;
-  std::string rasterizer_type;
-
-  std::string cobalt_version;
-  std::string cobalt_build_version_number;
-  std::string build_configuration;
-};
-
 // Function that will query Starboard and populate a UserAgentPlatformInfo
 // structure based on those results.  This is de-coupled from
 // CreateUserAgentString() so that the common logic in CreateUserAgentString()
diff --git a/src/cobalt/browser/user_agent_string_test.cc b/src/cobalt/browser/user_agent_string_test.cc
index 194513b..042d180 100644
--- a/src/cobalt/browser/user_agent_string_test.cc
+++ b/src/cobalt/browser/user_agent_string_test.cc
@@ -21,9 +21,31 @@
 
 namespace {
 
-UserAgentPlatformInfo CreateOnlyOSNameAndVersionPlatformInfo() {
+UserAgentPlatformInfo CreateEmptyPlatformInfo() {
   UserAgentPlatformInfo platform_info;
-  platform_info.os_name_and_version = "GLaDOS 3.11";
+  platform_info.set_starboard_version("");
+  platform_info.set_os_name_and_version("");
+  platform_info.set_original_design_manufacturer("");
+  platform_info.set_device_type(kSbSystemDeviceTypeUnknown);
+  platform_info.set_chipset_model_number("");
+  platform_info.set_model_year("");
+  platform_info.set_firmware_version("");
+  platform_info.set_brand("");
+  platform_info.set_model("");
+  platform_info.set_aux_field("");
+  platform_info.set_connection_type(base::nullopt);
+  platform_info.set_javascript_engine_version("");
+  platform_info.set_rasterizer_type("");
+  platform_info.set_evergreen_version("");
+  platform_info.set_cobalt_version("");
+  platform_info.set_cobalt_build_version_number("");
+  platform_info.set_build_configuration("");
+  return platform_info;
+}
+
+UserAgentPlatformInfo CreateOnlyOSNameAndVersionPlatformInfo() {
+  UserAgentPlatformInfo platform_info = CreateEmptyPlatformInfo();
+  platform_info.set_os_name_and_version("GLaDOS 3.11");
   return platform_info;
 }
 
@@ -46,11 +68,11 @@
 }
 
 TEST(UserAgentStringFactoryTest, WithCobaltVersionAndConfiguration) {
-  UserAgentPlatformInfo platform_info;
-  platform_info.os_name_and_version = "GLaDOS 3.11";
-  platform_info.cobalt_version = "16";
-  platform_info.cobalt_build_version_number = "123456";
-  platform_info.build_configuration = "gold";
+  UserAgentPlatformInfo platform_info =
+      CreateOnlyOSNameAndVersionPlatformInfo();
+  platform_info.set_cobalt_version("16");
+  platform_info.set_cobalt_build_version_number("123456");
+  platform_info.set_build_configuration("gold");
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   const char* tv_info_str = "Cobalt/16.123456-gold (unlike Gecko)";
@@ -67,15 +89,15 @@
 TEST(UserAgentStringFactoryTest, WithPlatformInfo) {
   // There are deliberately a variety of underscores, commas, slashes, and
   // parentheses in the strings below to ensure they get sanitized.
-  UserAgentPlatformInfo platform_info;
-  platform_info.os_name_and_version = "GLaDOS 3.11";
-  platform_info.original_design_manufacturer = "Aperture_Science_Innovators";
-  platform_info.device_type = kSbSystemDeviceTypeOverTheTopBox;
-  platform_info.chipset_model_number = "P-body/Orange_Atlas/Blue";
-  platform_info.model_year = "2013";
-  platform_info.firmware_version = "0,01";
-  platform_info.brand = "Aperture Science (Labs)";
-  platform_info.model = "GLaDOS";
+  UserAgentPlatformInfo platform_info =
+      CreateOnlyOSNameAndVersionPlatformInfo();
+  platform_info.set_original_design_manufacturer("Aperture_Science_Innovators");
+  platform_info.set_device_type(kSbSystemDeviceTypeOverTheTopBox);
+  platform_info.set_chipset_model_number("P-body/Orange_Atlas/Blue");
+  platform_info.set_model_year("2013");
+  platform_info.set_firmware_version("0,01");
+  platform_info.set_brand("Aperture Science (Labs)");
+  platform_info.set_model("GLaDOS");
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   const char* tv_info_str =
@@ -90,31 +112,31 @@
 }
 
 TEST(UserAgentStringFactoryTest, WithWiredConnection) {
-  UserAgentPlatformInfo platform_info;
-  platform_info.os_name_and_version = "GLaDOS 3.11";
-  platform_info.connection_type = kSbSystemConnectionTypeWired;
-  platform_info.device_type = kSbSystemDeviceTypeOverTheTopBox;
+  UserAgentPlatformInfo platform_info =
+      CreateOnlyOSNameAndVersionPlatformInfo();
+  platform_info.set_connection_type(kSbSystemConnectionTypeWired);
+  platform_info.set_device_type(kSbSystemDeviceTypeOverTheTopBox);
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   EXPECT_NE(std::string::npos, user_agent_string.find("Wired"));
 }
 
 TEST(UserAgentStringFactoryTest, WithWirelessConnection) {
-  UserAgentPlatformInfo platform_info;
-  platform_info.os_name_and_version = "GLaDOS 3.11";
-  platform_info.connection_type = kSbSystemConnectionTypeWireless;
-  platform_info.device_type = kSbSystemDeviceTypeOverTheTopBox;
+  UserAgentPlatformInfo platform_info =
+      CreateOnlyOSNameAndVersionPlatformInfo();
+  platform_info.set_connection_type(kSbSystemConnectionTypeWireless);
+  platform_info.set_device_type(kSbSystemDeviceTypeOverTheTopBox);
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   EXPECT_NE(std::string::npos, user_agent_string.find("Wireless"));
 }
 
 TEST(UserAgentStringFactoryTest, WithOnlyBrandModelAndDeviceType) {
-  UserAgentPlatformInfo platform_info;
-  platform_info.os_name_and_version = "GLaDOS 3.11";
-  platform_info.device_type = kSbSystemDeviceTypeOverTheTopBox;
-  platform_info.brand = "Aperture Science";
-  platform_info.model = "GLaDOS";
+  UserAgentPlatformInfo platform_info =
+      CreateOnlyOSNameAndVersionPlatformInfo();
+  platform_info.set_device_type(kSbSystemDeviceTypeOverTheTopBox);
+  platform_info.set_brand("Aperture Science");
+  platform_info.set_model("GLaDOS");
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   const char* tv_info_str = ", _OTT__/ (Aperture Science, GLaDOS, )";
@@ -122,9 +144,9 @@
 }
 
 TEST(UserAgentStringFactoryTest, WithStarboardVersion) {
-  UserAgentPlatformInfo platform_info;
-  platform_info.starboard_version = "Starboard/6";
-  platform_info.device_type = kSbSystemDeviceTypeOverTheTopBox;
+  UserAgentPlatformInfo platform_info = CreateEmptyPlatformInfo();
+  platform_info.set_starboard_version("Starboard/6");
+  platform_info.set_device_type(kSbSystemDeviceTypeOverTheTopBox);
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   const char* tv_info_str = "Starboard/6, _OTT__/ (, , )";
@@ -132,8 +154,8 @@
 }
 
 TEST(UserAgentStringFactoryTest, WithJavaScriptVersion) {
-  UserAgentPlatformInfo platform_info;
-  platform_info.javascript_engine_version = "V8/6.5.254.28";
+  UserAgentPlatformInfo platform_info = CreateEmptyPlatformInfo();
+  platform_info.set_javascript_engine_version("V8/6.5.254.28");
   std::string user_agent_string = CreateUserAgentString(platform_info);
 
   EXPECT_NE(std::string::npos, user_agent_string.find("V8/6.5.254.28"));
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 1468005..764516e 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -228,12 +228,15 @@
 
   // See LifecycleObserver. These functions do not implement the interface, but
   // have the same basic function.
-  void Blur();
-  void Conceal(render_tree::ResourceProvider* resource_provider);
-  void Freeze();
-  void Unfreeze(render_tree::ResourceProvider* resource_provider);
-  void Reveal(render_tree::ResourceProvider* resource_provider);
-  void Focus();
+  void Blur(SbTimeMonotonic timestamp);
+  void Conceal(render_tree::ResourceProvider* resource_provider,
+               SbTimeMonotonic timestamp);
+  void Freeze(SbTimeMonotonic timestamp);
+  void Unfreeze(render_tree::ResourceProvider* resource_provider,
+                SbTimeMonotonic timestamp);
+  void Reveal(render_tree::ResourceProvider* resource_provider,
+              SbTimeMonotonic timestamp);
+  void Focus(SbTimeMonotonic timestamp);
 
   void ReduceMemory();
   void GetJavaScriptHeapStatistics(
@@ -379,6 +382,8 @@
   // tracker are contained within it.
   std::unique_ptr<browser::WebModuleStatTracker> web_module_stat_tracker_;
 
+  std::unique_ptr<browser::UserAgentPlatformInfo> platform_info_;
+
   // Post and run tasks to notify MutationObservers.
   dom::MutationObserverTaskManager mutation_observer_task_manager_;
 
@@ -577,6 +582,9 @@
       new browser::WebModuleStatTracker(name_, data.options.track_event_stats));
   DCHECK(web_module_stat_tracker_);
 
+  platform_info_.reset(new browser::UserAgentPlatformInfo());
+  DCHECK(platform_info_);
+
   javascript_engine_ = script::JavaScriptEngine::CreateEngine(
       data.options.javascript_engine_options);
   DCHECK(javascript_engine_);
@@ -649,6 +657,8 @@
       base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseTTS);
 #endif
 
+  std::unique_ptr<UserAgentPlatformInfo> platform_info(
+      new UserAgentPlatformInfo());
   window_ = new dom::Window(
       environment_settings_.get(), data.window_dimensions,
       data.initial_application_state, css_parser_.get(), dom_parser_.get(),
@@ -660,12 +670,9 @@
       script_runner_.get(), global_environment_->script_value_factory(),
       media_source_registry_.get(),
       web_module_stat_tracker_->dom_stat_tracker(), data.initial_url,
-      data.network_module->GetUserAgent(),
+      data.network_module->GetUserAgent(), platform_info_.get(),
       data.network_module->preferred_language(),
-      data.options.font_language_script_override.empty()
-          ? base::GetSystemLanguageScript()
-          : data.options.font_language_script_override,
-      data.options.navigation_callback,
+      base::GetSystemLanguageScript(), data.options.navigation_callback,
       base::Bind(&WebModule::Impl::OnLoadComplete, base::Unretained(this)),
       data.network_module->cookie_jar(), data.network_module->GetPostSender(),
       data.options.require_csp, data.options.csp_enforcement_mode,
@@ -798,6 +805,7 @@
   global_environment_ = NULL;
   javascript_engine_.reset();
   web_module_stat_tracker_.reset();
+  platform_info_.reset();
   local_storage_database_.reset();
   mesh_cache_.reset();
   remote_typeface_cache_.reset();
@@ -1140,13 +1148,14 @@
       layout_manager_->IsRenderTreePending());
 }
 
-void WebModule::Impl::Blur() {
+void WebModule::Impl::Blur(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Blur()");
   SetApplicationState(base::kApplicationStateBlurred);
 }
 
 void WebModule::Impl::Conceal(
-    render_tree::ResourceProvider* resource_provider) {
+    render_tree::ResourceProvider* resource_provider,
+    SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Conceal()");
   SetResourceProvider(resource_provider);
 
@@ -1177,7 +1186,7 @@
   SetApplicationState(base::kApplicationStateConcealed);
 }
 
-void WebModule::Impl::Freeze() {
+void WebModule::Impl::Freeze(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Freeze()");
 
   // Clear out the loader factory's resource provider, possibly aborting any
@@ -1187,7 +1196,8 @@
 }
 
 void WebModule::Impl::Unfreeze(
-    render_tree::ResourceProvider* resource_provider) {
+    render_tree::ResourceProvider* resource_provider,
+    SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Unfreeze()");
   synchronous_loader_interrupt_.Reset();
   DCHECK(resource_provider);
@@ -1196,7 +1206,9 @@
   SetApplicationState(base::kApplicationStateConcealed);
 }
 
-void WebModule::Impl::Reveal(render_tree::ResourceProvider* resource_provider) {
+void WebModule::Impl::Reveal(
+  render_tree::ResourceProvider* resource_provider,
+  SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Reveal()");
   synchronous_loader_interrupt_.Reset();
   DCHECK(resource_provider);
@@ -1211,7 +1223,7 @@
   SetApplicationState(base::kApplicationStateBlurred);
 }
 
-void WebModule::Impl::Focus() {
+void WebModule::Impl::Focus(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Focus()");
   synchronous_loader_interrupt_.Reset();
   SetApplicationState(base::kApplicationStateStarted);
@@ -1657,14 +1669,15 @@
                             base::Unretained(impl_.get()), bytes));
 }
 
-void WebModule::Blur() {
+void WebModule::Blur(SbTimeMonotonic timestamp) {
   // Must only be called by a thread external from the WebModule thread.
   DCHECK_NE(base::MessageLoop::current(), message_loop());
 
   impl_->CancelSynchronousLoads();
 
   auto impl_blur =
-      base::Bind(&WebModule::Impl::Blur, base::Unretained(impl_.get()));
+      base::Bind(&WebModule::Impl::Blur,
+                 base::Unretained(impl_.get()), timestamp);
 
 #if defined(ENABLE_DEBUGGER)
   // We normally need to block here so that the call doesn't return until the
@@ -1684,7 +1697,8 @@
   message_loop()->task_runner()->PostBlockingTask(FROM_HERE, impl_blur);
 }
 
-void WebModule::Conceal(render_tree::ResourceProvider* resource_provider) {
+void WebModule::Conceal(render_tree::ResourceProvider* resource_provider,
+                        SbTimeMonotonic timestamp) {
   // Must only be called by a thread external from the WebModule thread.
   DCHECK_NE(base::MessageLoop::current(), message_loop());
 
@@ -1694,10 +1708,11 @@
   // application has had a chance to process the whole event.
   message_loop()->task_runner()->PostBlockingTask(
       FROM_HERE, base::Bind(&WebModule::Impl::Conceal,
-                            base::Unretained(impl_.get()), resource_provider));
+                            base::Unretained(impl_.get()),
+                            resource_provider, timestamp));
 }
 
-void WebModule::Freeze() {
+void WebModule::Freeze(SbTimeMonotonic timestamp) {
   // Must only be called by a thread external from the WebModule thread.
   DCHECK_NE(base::MessageLoop::current(), message_loop());
 
@@ -1705,34 +1720,40 @@
   // application has had a chance to process the whole event.
   message_loop()->task_runner()->PostBlockingTask(
       FROM_HERE,
-      base::Bind(&WebModule::Impl::Freeze, base::Unretained(impl_.get())));
+      base::Bind(&WebModule::Impl::Freeze,
+                 base::Unretained(impl_.get()), timestamp));
 }
 
-void WebModule::Unfreeze(render_tree::ResourceProvider* resource_provider) {
+void WebModule::Unfreeze(render_tree::ResourceProvider* resource_provider,
+                         SbTimeMonotonic timestamp) {
   // Must only be called by a thread external from the WebModule thread.
   DCHECK_NE(base::MessageLoop::current(), message_loop());
 
   message_loop()->task_runner()->PostTask(
       FROM_HERE, base::Bind(&WebModule::Impl::Unfreeze,
-                            base::Unretained(impl_.get()), resource_provider));
+                            base::Unretained(impl_.get()),
+                            resource_provider, timestamp));
 }
 
-void WebModule::Reveal(render_tree::ResourceProvider* resource_provider) {
+void WebModule::Reveal(render_tree::ResourceProvider* resource_provider,
+                       SbTimeMonotonic timestamp) {
   // Must only be called by a thread external from the WebModule thread.
   DCHECK_NE(base::MessageLoop::current(), message_loop());
 
   message_loop()->task_runner()->PostTask(
       FROM_HERE, base::Bind(&WebModule::Impl::Reveal,
-                            base::Unretained(impl_.get()), resource_provider));
+                            base::Unretained(impl_.get()),
+                            resource_provider, timestamp));
 }
 
-void WebModule::Focus() {
+void WebModule::Focus(SbTimeMonotonic timestamp) {
   // Must only be called by a thread external from the WebModule thread.
   DCHECK_NE(base::MessageLoop::current(), message_loop());
 
   message_loop()->task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&WebModule::Impl::Focus, base::Unretained(impl_.get())));
+      base::Bind(&WebModule::Impl::Focus,
+                 base::Unretained(impl_.get()), timestamp));
 }
 
 void WebModule::ReduceMemory() {
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index af0b166..d2ebec1 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -31,6 +31,7 @@
 #include "cobalt/browser/lifecycle_observer.h"
 #include "cobalt/browser/screen_shot_writer.h"
 #include "cobalt/browser/splash_screen_cache.h"
+#include "cobalt/browser/user_agent_platform_info.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/blob.h"
@@ -210,11 +211,6 @@
     // the frozen state.
     bool should_retain_remote_typeface_cache_on_freeze = false;
 
-    // The language and script to use with fonts. If left empty, then the
-    // language-script combination provided by base::GetSystemLanguageScript()
-    // is used.
-    std::string font_language_script_override;
-
     // The splash screen cache object, owned by the BrowserModule.
     SplashScreenCache* splash_screen_cache;
 
@@ -386,12 +382,15 @@
   }
 
   // LifecycleObserver implementation
-  void Blur() override;
-  void Conceal(render_tree::ResourceProvider* resource_provider) override;
-  void Freeze() override;
-  void Unfreeze(render_tree::ResourceProvider* resource_provider) override;
-  void Reveal(render_tree::ResourceProvider* resource_provider) override;
-  void Focus() override;
+  void Blur(SbTimeMonotonic timestamp) override;
+  void Conceal(render_tree::ResourceProvider* resource_provider,
+               SbTimeMonotonic timestamp) override;
+  void Freeze(SbTimeMonotonic timestamp) override;
+  void Unfreeze(render_tree::ResourceProvider* resource_provider,
+                SbTimeMonotonic timestamp) override;
+  void Reveal(render_tree::ResourceProvider* resource_provider,
+              SbTimeMonotonic timestamp) override;
+  void Focus(SbTimeMonotonic timestamp) override;
 
   // Attempt to reduce overall memory consumption. Called in response to a
   // system indication that memory usage is nearing a critical level.
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 258e9df..6655f86 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-302142
\ No newline at end of file
+303007
\ No newline at end of file
diff --git a/src/cobalt/configuration/configuration.cc b/src/cobalt/configuration/configuration.cc
index 7cde16b..d130c87 100644
--- a/src/cobalt/configuration/configuration.cc
+++ b/src/cobalt/configuration/configuration.cc
@@ -34,7 +34,7 @@
       SbSystemGetExtension(kCobaltExtensionConfigurationName));
   if (configuration_api_) {
     // Verify it's the extension needed.
-    if (SbStringCompareAll(configuration_api_->name,
+    if (strcmp(configuration_api_->name,
                            kCobaltExtensionConfigurationName) != 0 ||
         configuration_api_->version < 1) {
       LOG(WARNING) << "Not using supplied cobalt configuration extension: "
@@ -439,24 +439,6 @@
 #endif
 }
 
-int Configuration::CobaltJsGarbageCollectionThresholdInBytes() {
-  if (configuration_api_) {
-    return configuration_api_->CobaltJsGarbageCollectionThresholdInBytes();
-  }
-#if SB_API_VERSION >= 12
-#if defined(COBALT_JS_GARBAGE_COLLECTION_THRESHOLD_IN_BYTES)
-// NOLINTNEXTLINE(whitespace/line_length)
-#error "COBALT_JS_GARBAGE_COLLECTION_THRESHOLD_IN_BYTES is deprecated after Starboard version 12."
-// NOLINTNEXTLINE(whitespace/line_length)
-#error "Implement CobaltExtensionConfigurationApi::CobaltJsGarbageCollectionThresholdInBytes()"
-#error "instead."
-#endif
-  return 8 * 1024 * 1024;
-#else
-  return 8 * 1024 * 1024;
-#endif
-}
-
 int Configuration::CobaltSkiaGlyphAtlasWidth() {
   if (configuration_api_) {
 #if defined(COBALT_SKIA_GLYPH_ATLAS_WIDTH)
diff --git a/src/cobalt/content/fonts/config/common/fonts.xml b/src/cobalt/content/fonts/config/common/fonts.xml
index 8f84727..abba022 100644
--- a/src/cobalt/content/fonts/config/common/fonts.xml
+++ b/src/cobalt/content/fonts/config/common/fonts.xml
@@ -164,337 +164,337 @@
         <!-- "Noto Naskh Arabic UI" is given a fallback priority so that, in spite
              of having a name, it will still be included as a fallback font.
         -->
-        <family fallback_priority="0" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254">
+        <family lang="und-Arab" fallback_priority="0" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254">
             <font weight="400" style="normal">NotoNaskhArabicUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoNaskhArabicUI-Bold.woff2</font>
         </family>
-        <family pages="0,18-19,45,171,254">
+        <family lang="und-Ethi" pages="0,18-19,45,171,254">
             <font weight="400" style="normal">NotoSansEthiopic-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansEthiopic-Bold.woff2</font>
         </family>
-        <family pages="0,5,32,37,251,254">
+        <family lang="und-Hebr" pages="0,5,32,37,251,254">
             <font weight="400" style="normal">NotoSansHebrew-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansHebrew-Bold.woff2</font>
         </family>
-        <family pages="0,2-3,14,32,37,254">
+        <family lang="und-Thai" pages="0,2-3,14,32,37,254">
             <font weight="400" style="normal">NotoSansThaiUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansThaiUI-Bold.woff2</font>
         </family>
-        <family pages="0,5,32,251">
+        <family lang="und-Armn" pages="0,5,32,251">
             <font weight="400" style="normal">NotoSansArmenian-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansArmenian-Bold.woff2</font>
         </family>
-        <family pages="0,5,16,45,254">
+        <family lang="und-Geor,und-Geok" pages="0,5,16,45,254">
             <font weight="400" style="normal">NotoSansGeorgian-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansGeorgian-Bold.woff2</font>
         </family>
-        <family pages="0,2,9,28,32,34,37,168,254">
+        <family lang="und-Deva" pages="0,2,9,28,32,34,37,168,254">
             <font weight="400" style="normal">NotoSansDevanagariUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansDevanagariUI-Bold.woff2</font>
         </family>
         <!-- Gujarati should come after Devanagari -->
-        <family pages="0,9-10,32,34,37,168,254">
+        <family lang="und-Gujr" pages="0,9-10,32,34,37,168,254">
             <font weight="400" style="normal">NotoSansGujaratiUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansGujaratiUI-Bold.woff2</font>
         </family>
         <!-- Gurmukhi should come after Devanagari -->
-        <family pages="0,9-10,32,34,37-38,168,254">
+        <family lang="und-Guru" pages="0,9-10,32,34,37-38,168,254">
             <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,11,32,34,37,254">
+        <family lang="und-Taml" pages="0,9,11,32,34,37,254">
             <font weight="400" style="normal">NotoSansTamilUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansTamilUI-Bold.woff2</font>
         </family>
-        <family pages="0,3,9,13,32,34,37,254">
+        <family lang="und-Mlym" pages="0,3,9,13,32,34,37,254">
             <font weight="400" style="normal">NotoSansMalayalamUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansMalayalamUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,32,34,37,254">
+        <family lang="und-Beng" pages="0,9,32,34,37,254">
             <font weight="400" style="normal">NotoSansBengaliUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansBengaliUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,12,32,34,37,254">
+        <family lang="und-Telu" pages="0,9,12,32,34,37,254">
             <font weight="400" style="normal">NotoSansTeluguUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansTeluguUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,12,32,34,37,254">
+        <family lang="und-Knda" pages="0,9,12,32,34,37,254">
             <font weight="400" style="normal">NotoSansKannadaUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansKannadaUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,11,32,34,37,254">
+        <family lang="und-Orya" pages="0,9,11,32,34,37,254">
             <font weight="400" style="normal">NotoSansOriyaUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansOriyaUI-Bold.woff2</font>
         </family>
-        <family pages="0,9,13,32,34,37,254">
+        <family lang="und-Sinh" pages="0,9,13,32,34,37,254">
             <font weight="400" style="normal">NotoSansSinhala-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansSinhala-Bold.woff2</font>
         </family>
-        <family pages="0,23,25,32,37">
+        <family lang="und-Khmr" pages="0,23,25,32,37">
             <font weight="400" style="normal">NotoSansKhmerUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansKhmerUI-Bold.woff2</font>
         </family>
-        <family pages="0,3,14,32,37">
+        <family lang="und-Laoo" pages="0,3,14,32,37">
             <font weight="400" style="normal">NotoSansLaoUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansLaoUI-Bold.woff2</font>
         </family>
-        <family pages="0,16,32,37,169-170,254">
+        <family lang="und-Mymr" pages="0,16,32,37,169-170,254">
             <font weight="400" style="normal">NotoSansMyanmarUI-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansMyanmarUI-Bold.woff2</font>
         </family>
-        <family pages="0,6-7,32,37,253-254">
+        <family lang="und-Thaa" pages="0,6-7,32,37,253-254">
             <font weight="400" style="normal">NotoSansThaana-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansThaana-Bold.woff2</font>
         </family>
-        <family pages="0,3,170">
+        <family lang="und-Cham" pages="0,3,170">
             <font weight="400" style="normal">NotoSansCham-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansCham-Bold.woff2</font>
         </family>
-        <family pages="0,6,32,46,489">
+        <family lang="und-Adlm" pages="0,6,32,46,489">
             <font weight="400" style="normal">NotoSansAdlam-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,32,46,254,267">
+        <family lang="und-Avst" pages="0,32,46,254,267">
             <font weight="400" style="normal">NotoSansAvestan-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,27,32,37,254">
+        <family lang="und-Bali" pages="0,27,32,37,254">
             <font weight="400" style="normal">NotoSansBalinese-Regular.woff2</font>
         </family>
-        <family pages="0,166,254,360-362">
+        <family lang="und-Bamu" pages="0,166,254,360-362">
             <font weight="400" style="normal">NotoSansBamum-Regular.woff2</font>
         </family>
-        <family pages="0,27,254">
+        <family lang="und-Batk" pages="0,27,254">
             <font weight="400" style="normal">NotoSansBatak-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,272">
+        <family lang="und-Brah" pages="0,254,272">
             <font weight="400" style="normal">NotoSansBrahmi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,26,32,37,169,254">
+        <family lang="und-Bugi" pages="0,26,32,37,169,254">
             <font weight="400" style="normal">NotoSansBuginese-Regular.woff2</font>
         </family>
-        <family pages="0,23,254">
+        <family lang="und-Buhd" pages="0,23,254">
             <font weight="400" style="normal">NotoSansBuhid-Regular.woff2</font>
         </family>
-        <family pages="0-3,20-22,24,254">
+        <family lang="und-Cans" pages="0-3,20-22,24,254">
             <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,258">
+        <family lang="und-Cari" pages="0,254,258">
             <font weight="400" style="normal">NotoSansCarian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,3,19,171">
+        <family lang="und-Cher" pages="0,3,19,171">
             <font weight="400" style="normal">NotoSansCherokee-Regular.woff2</font>
         </family>
-        <family pages="0,3,29,37,44,254">
+        <family lang="und-Copt" pages="0,3,29,37,44,254">
             <font weight="400" style="normal">NotoSansCoptic-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,288-292">
+        <family lang="und-Xsux" pages="0,254,288-292">
             <font weight="400" style="normal">NotoSansCuneiform-Regular.woff2</font>
         </family>
-        <family pages="0,254,264">
+        <family lang="und-Cprt" pages="0,254,264">
             <font weight="400" style="normal">NotoSansCypriot-Regular.woff2</font>
         </family>
-        <family pages="0,254,260">
+        <family lang="und-Dsrt" pages="0,254,260">
             <font weight="400" style="normal">NotoSansDeseret-Regular.woff2</font>
         </family>
-        <family pages="0,254,304-308">
+        <family lang="und-Egyp" pages="0,254,304-308">
             <font weight="400" style="normal">NotoSansEgyptianHieroglyphs-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,44,254">
+        <family lang="und-Glag" pages="0,44,254">
             <font weight="400" style="normal">NotoSansGlagolitic-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,3,254,259">
+        <family lang="und-Goth" pages="0,3,254,259">
             <font weight="400" style="normal">NotoSansGothic-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,23,254">
+        <family lang="und-Hano" pages="0,23,254">
             <font weight="400" style="normal">NotoSansHanunoo-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,264">
+        <family lang="und-Armi" pages="0,254,264">
             <font weight="400" style="normal">NotoSansImperialAramaic-Regular.woff2</font>
         </family>
-        <family pages="0,254,267">
+        <family lang="und-Phli" pages="0,254,267">
             <font weight="400" style="normal">NotoSansInscriptionalPahlavi-Regular.woff2</font>
         </family>
-        <family pages="0,254,267">
+        <family lang="und-Prti" pages="0,254,267">
             <font weight="400" style="normal">NotoSansInscriptionalParthian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,32,37,169,254">
+        <family lang="und-Java" pages="0,32,37,169,254">
             <font weight="400" style="normal">NotoSansJavanese-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,9,168,254,272">
+        <family lang="und-Kthi" pages="0,9,168,254,272">
             <font weight="400" style="normal">NotoSansKaithi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,169,254">
+        <family lang="und-Kali" pages="0,169,254">
             <font weight="400" style="normal">NotoSansKayahLi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,266">
+        <family lang="und-Khar" pages="0,254,266">
             <font weight="400" style="normal">NotoSansKharoshthi-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,28,37,254">
+        <family lang="und-Lepc" pages="0,28,37,254">
             <font weight="400" style="normal">NotoSansLepcha-Regular.woff2</font>
         </family>
-        <family pages="0,9,25,254">
+        <family lang="und-Limb" pages="0,9,25,254">
             <font weight="400" style="normal">NotoSansLimbu-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,256-257">
+        <family lang="und-Linb" pages="0,254,256-257">
             <font weight="400" style="normal">NotoSansLinearB-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,2,164,254">
+        <family lang="und-Lisu" pages="0,2,164,254">
             <font weight="400" style="normal">NotoSansLisu-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,258">
+        <family lang="und-Lyci" pages="0,254,258">
             <font weight="400" style="normal">NotoSansLycian-Regular.woff2</font>
         </family>
-        <family pages="0,254,265">
+        <family lang="und-Lydi" pages="0,254,265">
             <font weight="400" style="normal">NotoSansLydian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,6,8,254">
+        <family lang="und-Mand" pages="0,6,8,254">
             <font weight="400" style="normal">NotoSansMandaic-Regular.woff2</font>
         </family>
-        <family pages="0,170-171,254">
+        <family lang="und-Mtei" pages="0,170-171,254">
             <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.woff2</font>
         </family>
-        <family pages="0,25,254">
+        <family lang="und-Talu" pages="0,25,254">
             <font weight="400" style="normal">NotoSansNewTaiLue-Regular.woff2</font>
         </family>
-        <family pages="0,6-7,32,46,253-254">
+        <family lang="und-Nkoo" pages="0,6-7,32,46,253-254">
             <font weight="400" style="normal">NotoSansNKo-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,22,254">
+        <family lang="und-Ogam" pages="0,22,254">
             <font weight="400" style="normal">NotoSansOgham-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,28,254">
+        <family lang="und-Olck" pages="0,28,254">
             <font weight="400" style="normal">NotoSansOlChiki-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,259">
+        <family lang="und-Ital" pages="0,254,259">
             <font weight="400" style="normal">NotoSansOldItalic-Regular.woff2</font>
         </family>
-        <family pages="0,254,259">
+        <family lang="und-Xpeo" pages="0,254,259">
             <font weight="400" style="normal">NotoSansOldPersian-Regular.woff2</font>
         </family>
-        <family pages="0,254,266">
+        <family lang="und-Sarb" pages="0,254,266">
             <font weight="400" style="normal">NotoSansOldSouthArabian-Regular.woff2</font>
         </family>
-        <family pages="0,254,268">
+        <family lang="und-Orkh" pages="0,254,268">
             <font weight="400" style="normal">NotoSansOldTurkic-Regular.woff2</font>
         </family>
-        <family pages="0,254,260">
+        <family lang="und-Osma" pages="0,254,260">
             <font weight="400" style="normal">NotoSansOsmanya-Regular.woff2</font>
         </family>
-        <family pages="0,254,265">
+        <family lang="und-Phnx" pages="0,254,265">
             <font weight="400" style="normal">NotoSansPhoenician-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,169,254">
+        <family lang="und-Rjng" pages="0,169,254">
             <font weight="400" style="normal">NotoSansRejang-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,22,254">
+        <family lang="und-Runr" pages="0,22,254">
             <font weight="400" style="normal">NotoSansRunic-Regular.woff2</font>
         </family>
-        <family pages="0,8,46,254">
+        <family lang="und-Samr" pages="0,8,46,254">
             <font weight="400" style="normal">NotoSansSamaritan-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,32,37,168,254">
+        <family lang="und-Saur" pages="0,32,37,168,254">
             <font weight="400" style="normal">NotoSansSaurashtra-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,254,260">
+        <family lang="und-Shaw" pages="0,254,260">
             <font weight="400" style="normal">NotoSansShavian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-lang-non-cjk">
-        <family pages="0,27-28,254">
+        <family lang="und-Sund" pages="0,27-28,254">
             <font weight="400" style="normal">NotoSansSundanese-Regular.woff2</font>
         </family>
-        <family pages="0,9,32,37,168,254">
+        <family lang="und-Sylo" pages="0,9,32,37,168,254">
             <font weight="400" style="normal">NotoSansSylotiNagri-Regular.woff2</font>
         </family>
         <!-- Estrangela should precede Eastern and Western Syriac, since it's our default form. -->
-        <family pages="0,3,6-7,32,34,37-38,254">
+        <family lang="und-Syre" pages="0,3,6-7,32,34,37-38,254">
             <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.woff2</font>
         </family>
-        <family pages="0,3,6-7,32,34,37-38,254">
+        <family lang="und-Syrn" pages="0,3,6-7,32,34,37-38,254">
             <font weight="400" style="normal">NotoSansSyriacEastern-Regular.woff2</font>
         </family>
-        <family pages="0,3,6-7,32,34,37-38,254">
+        <family lang="und-Syrj" pages="0,3,6-7,32,34,37-38,254">
             <font weight="400" style="normal">NotoSansSyriacWestern-Regular.woff2</font>
         </family>
-        <family pages="0,23,254">
+        <family lang="und-Tglg" pages="0,23,254">
             <font weight="400" style="normal">NotoSansTagalog-Regular.woff2</font>
         </family>
-        <family pages="0,23,254">
+        <family lang="und-Tagb" pages="0,23,254">
             <font weight="400" style="normal">NotoSansTagbanwa-Regular.woff2</font>
         </family>
-        <family pages="0,26,32,34,37,254">
+        <family lang="und-Lana" pages="0,26,32,34,37,254">
             <font weight="400" style="normal">NotoSansTaiTham-Regular.woff2</font>
         </family>
-        <family pages="0,32,37,167,170,254">
+        <family lang="und-Tavt" pages="0,32,37,167,170,254">
             <font weight="400" style="normal">NotoSansTaiViet-Regular.woff2</font>
         </family>
-        <family pages="0,15,32,37,254">
+        <family lang="und-Tibt" pages="0,15,32,37,254">
             <font weight="400" style="normal">NotoSansTibetan-Regular.woff2</font>
             <font weight="700" style="normal">NotoSansTibetan-Bold.woff2</font>
         </family>
-        <family pages="0,3,32,45,254">
+        <family lang="und-Tfng" pages="0,3,32,45,254">
             <font weight="400" style="normal">NotoSansTifinagh-Regular.woff2</font>
         </family>
     </package>
-    <package name="fallback-historic">
+    <package lang="und-Ugar" name="fallback-historic">
         <family pages="0,254,259">
             <font weight="400" style="normal">NotoSansUgaritic-Regular.woff2</font>
         </family>
     </package>
-    <package name="fallback-lang-non-cjk">
+    <package lang="und-Vaii" name="fallback-lang-non-cjk">
         <family pages="0,165-166,254">
             <font weight="400" style="normal">NotoSansVai-Regular.woff2</font>
         </family>
@@ -519,7 +519,7 @@
         </family>
     </package>
     <package name="fallback-color-emoji">
-        <family pages="0,32-33,35-39,41,43,48,50,496-502,505,3584,4068,4072">
+        <family lang="und-Zsye" pages="0,32-33,35-39,41,43,48,50,496-502,505,3584,4068,4072">
             <font weight="400" style="normal" disable_synthetic_bolding="true">NotoColorEmoji.woff2</font>
         </family>
     </package>
@@ -529,7 +529,7 @@
         </family>
     </package>
     <package name="fallback-symbols">
-        <family pages="35,37-39,43,496-498">
+        <family lang="und-Zsym" pages="35,37-39,43,496-498">
             <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.woff2</font>
         </family>
     </package>
@@ -548,18 +548,18 @@
             Tai Le, Yi, Mongolian, and Phags-pa are intentionally kept last, to make sure they don't
             override the East Asian punctuation for Chinese.
         -->
-        <family pages="0,3,16,25,48,254">
+        <family lang="und-Tale" pages="0,3,16,25,48,254">
             <font weight="400" style="normal">NotoSansTaiLe-Regular.woff2</font>
         </family>
-        <family pages="0,48,160-164,254-255">
+        <family lang="und-Yiii" pages="0,48,160-164,254-255">
             <font weight="400" style="normal">NotoSansYi-Regular.woff2</font>
         </family>
-        <family pages="0,24,32,36-37,48,254">
+        <family lang="und-Mong" pages="0,24,32,36-37,48,254">
             <font weight="400" style="normal">NotoSansMongolian-Regular.woff2</font>
         </family>
     </package>
     <package name="fallback-historic">
-        <family pages="0,24,32,37,48,168,254">
+        <family lang="und-Phag" pages="0,24,32,37,48,168,254">
             <font weight="400" style="normal">NotoSansPhagsPa-Regular.woff2</font>
         </family>
     </package>
diff --git a/src/cobalt/css_parser/trivial_string_piece.h b/src/cobalt/css_parser/trivial_string_piece.h
index 1f91641..4c5be8f 100644
--- a/src/cobalt/css_parser/trivial_string_piece.h
+++ b/src/cobalt/css_parser/trivial_string_piece.h
@@ -48,13 +48,13 @@
     const char* c_string) {
   TrivialStringPiece string_piece;
   string_piece.begin = c_string;
-  string_piece.end = c_string + SbStringGetLength(c_string);
+  string_piece.end = c_string + strlen(c_string);
   return string_piece;
 }
 
 // Used by tests.
 inline bool operator==(const TrivialStringPiece& lhs, const char* rhs) {
-  return SbStringCompare(lhs.begin, rhs, lhs.size()) == 0 &&
+  return strncmp(lhs.begin, rhs, lhs.size()) == 0 &&
          rhs[lhs.size()] == '\0';
 }
 
diff --git a/src/cobalt/debug/backend/content/runtime_agent.js b/src/cobalt/debug/backend/content/runtime_agent.js
deleted file mode 100644
index f426e65..0000000
--- a/src/cobalt/debug/backend/content/runtime_agent.js
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2016 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.
-
-// This implementation of the "Runtime" Devtools protocol domain is only used
-// for mozjs. When using V8, we use the built-in inspector backend which
-// implements this for us.
-
-(function(debugBackend) {
-
-// Attach methods to handle commands in the 'Runtime' devtools domain.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime
-var commands = debugBackend.Runtime = {};
-
-// Calls a function on a previously accessed RemoteObject with an argument list
-// and returns a new RemoteObject. Used extensively by devtools for
-// auto-completion. The new RemoteObject uses the same |objectGroup| as the
-// original object.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-callFunctionOn
-commands.callFunctionOn = function(params) {
-  var result = {};
-  var value = null;
-  try {
-    eval('var f = ' + params.functionDeclaration);
-    var objectEntry = _objectStore[params.objectId];
-    var thisArg = objectEntry.object;
-    var objectGroup = objectEntry.objectGroup;
-    value = f.apply(thisArg, params.arguments);
-    result.wasThrown = false;
-  } catch(e) {
-    value = e;
-    result.exceptionDetails = e;
-    result.wasThrown = true;
-  }
-
-  result.result =
-      new devtools.RemoteObject(value, objectGroup, params.returnByValue);
-  return JSON.stringify(result);
-}
-
-// Evaluates a string and returns a RemoteObject.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-evaluate
-commands.evaluate = function(params) {
-  var result = {};
-  var value = null;
-  try {
-    if (params.includeCommandLineAPI) {
-      _addCommandLineAPI();
-    }
-
-    // Use |eval| indirectly, to cause evaluation at global scope.
-    // This is so subsequent calls can access variables declared here, etc.
-    var geval = eval;
-    value = geval(params.expression);
-
-    // Store the last result if we're doing a "real" evaluation, not an
-    // auto-complete. Seems a little special case-y, but this is taken from
-    // Chrome's implementation, and looks like the only way to differentiate.
-    if (params.objectGroup == 'console') {
-      _lastResult = value;
-    }
-
-    result.wasThrown = false;
-  } catch(e) {
-    value = e;
-    result.exceptionDetails = e;
-    result.wasThrown = true;
-  }
-
-  // Create the RemoteObject corresponding to the result.
-  result.result =
-      new devtools.RemoteObject(value, params.objectGroup, params.returnByValue);
-
-  // Add the preview, if requested.
-  if (params.generatePreview) {
-    var preview = _generatePreview(value);
-    if (preview) {
-      result.result.preview = preview;
-    }
-  }
-
-  if (params.includeCommandLineAPI) {
-    _removeCommandLineAPI();
-  }
-
-  return JSON.stringify(result);
-}
-
-// Returns all let, const and class variables from global scope.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-globalLexicalScopeNames
-commands.globalLexicalScopeNames = function(params) {
-  var result = [];
-  // TODO: Get the globals.
-  return JSON.stringify(result);
-}
-
-// Returns the properties of a previously accessed object as an array of
-// PropertyDescriptor objects.
-// The parameters specifify several options:
-// * ownProperties - only include immediate properties, not the prototype chain.
-// * accessorPropertiesOnly - only include accessor properties.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-getProperties
-commands.getProperties = function(params) {
-  var result = {};
-  var properties = [];
-  try {
-    var objectEntry = _objectStore[params.objectId];
-    var object = objectEntry.object;
-    var objectGroup = objectEntry.objectGroup;
-    _addProperties(object, objectGroup, !params.ownProperties, properties);
-
-    if (params.accessorPropertiesOnly) {
-      properties = properties.filter(function(element, index, array) {
-          return (element.get || element.set);
-        });
-    }
-    result.wasThrown = false;
-  } catch(e) {
-    value = e;
-    result.exceptionDetails = e;
-    result.wasThrown = true;
-  }
-
-  result.result = properties;
-  return JSON.stringify(result);
-}
-
-// Releases our reference to a previously accessed object.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-releaseObject
-commands.releaseObject = function(params) {
-  delete _objectStore[params.objectId];
-}
-
-// Releases our references to a group of previously accessed objects.
-// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-releaseObjectGroup
-commands.releaseObjectGroup = function(params) {
-  for (var objectId in _objectStore) {
-    var objectEntry = _objectStore[objectId];
-    if (objectEntry && objectEntry.objectGroup == params.objectGroup) {
-      delete _objectStore[objectId];
-    }
-  }
-}
-
-// Adds the properties of |object| to the |result| array as new
-// PropertyDescriptor objects. Some properties may be objects themselves,
-// in which case new RemoteObjects are created using the specified
-// |objectGroup|, which should be that of |object|.
-// If |includePrototype| is set, the function will be called recursively on
-// the prototype chain of the object.
-var _addProperties = function(object, objectGroup, includePrototype, result) {
-  var properties = Object.getOwnPropertyNames(object);
-  var foundProto = false;
-  for (var i = 0; i < properties.length; i++) {
-    var key = properties[i];
-    foundProto = foundProto || (key == '__proto__');
-
-    // If we can't find the property, and its name corresponds to a number,
-    // try it as an array index (integer instead of string).
-    if (object[key] == null) {
-      if (!isNaN(key)) {
-        key = parseInt(key);
-      } else {
-        continue;
-      }
-    }
-
-    var propertyDescriptor =
-        new devtools.PropertyDescriptor(object, objectGroup, key);
-    result.push(propertyDescriptor);
-  }
-
-  var proto = null;
-  try {
-    proto = Object.getPrototypeOf(object);
-  } catch (e) {}
-
-  if (includePrototype) {
-    // Recursively add the properties from the prototype chain.
-    if (proto) {
-      _addProperties(proto, objectGroup, includePrototype, result);
-    }
-  } else if (proto && !foundProto) {
-    // |getOwnPropertyNames| may not include the object prototype,
-    // so if that's the case, add it now. It's a deprecated name, but devtools
-    // still uses it.
-    var propertyDescriptor =
-        new devtools.PropertyDescriptor(object, objectGroup, '__proto__');
-    result.push(propertyDescriptor);
-  }
-}
-
-// Gets an object from the internal object store.
-var _getObject = function(objectId) {
-  return _objectStore[objectId].object;
-}
-
-// Adds an object to the internal object store and returns a unique id that can
-// be used to access it again.
-var _addObject = function(object, objectGroup) {
-  // If we've already added this object, then use the same objectId.
-  for (var objectId in _objectStore) {
-    var objectEntry = _objectStore[objectId];
-    if (objectEntry.object === object &&
-        objectEntry.objectGroup == objectGroup) {
-      return objectId;
-    }
-  }
-
-  var objectId = _nextObjectId.toString();
-  _nextObjectId += 1;
-  _objectStore[objectId] = {};
-  _objectStore[objectId].object = object;
-  _objectStore[objectId].objectGroup = objectGroup;
-  return objectId;
-}
-
-// Generates an object preview, which may be requested for the evaluate
-// command.
-var _generatePreview = function(object) {
-  if (!object || (typeof object != 'object')) {
-    return null;
-  } else {
-    return new devtools.ObjectPreview(object);
-  }
-}
-
-// Returns the subtype of an object, or null if the specified value is not an
-// object.
-var _getSubtype = function(object) {
-  if (typeof object == 'object') {
-    if (object instanceof Array) {
-      return 'array';
-    } else if (object instanceof Date) {
-      return 'date';
-    } else if (object instanceof Error) {
-      return 'error';
-    } else if (object instanceof Node) {
-      return 'node';
-    } else if (object instanceof RegExp) {
-      return 'regexp';
-    }
-  }
-  return null;
-}
-
-// Tries to get the classname of an object by following the prototype chain
-// and looking for a constructor.
-var _getClassName = function(object) {
-  try {
-    for (var obj = object; obj && !this.className;
-         obj = Object.getPrototypeOf(obj)) {
-      if (obj.constructor) {
-        return obj.constructor.name;
-      }
-    }
-  } catch(e) {}
-
-  return null;
-}
-
-// Namespace for constructors of types defined in the Devtools protocol.
-var devtools = {};
-
-// Creates a RemoteObject, which is the type used to return many values to
-// devtools. If |value| is an object, then is it inserted into |_objectStore|
-// and the |objectId| key used to access it is included in the RemoteObject. If
-// |value| is not an object, or |returnByValue| is true, then |value| is
-// directly included in the RemoteObject.
-devtools.RemoteObject = function(value, objectGroup, returnByValue) {
-  this.type = typeof value;
-
-  if (value == null) {
-    this.subtype == 'null';
-    this.value = null;
-    return;
-  }
-
-  if (this.type == 'object') {
-    this.objectId = _addObject(value, objectGroup);
-    this.subtype = _getSubtype(value);
-    this.className = _getClassName(value);
-  }
-
-  // Fill in the description field. Devtools will only display arrays correctly
-  // if their description follows a particular format. For other values, try to
-  // use the generic string conversion, and fall back to the className if that
-  // fails.
-  if (this.subtype == 'array') {
-    this.description = 'Array[' + value.length + ']';
-  } else {
-    try {
-      this.description = value.toString();
-    } catch(e) {
-      this.description = this.className;
-    }
-  }
-
-  if (returnByValue || this.type != 'object') {
-    this.value = value;
-  }
-}
-
-// Creates a PropertyDescriptor for |property| of |object|, which is the type
-// used to return object properties to devtools. Some properties may be objects,
-// in which case new RemoteObjects are created and inserted into |_objectStore|
-// using the specified |objectGroup|, which should be that of |object|.
-devtools.PropertyDescriptor = function(object, objectGroup, property) {
-  this.name = property.toString();
-  var descriptor = Object.getOwnPropertyDescriptor(object, property);
-  // Some Cobalt objects don't seem to support |getOwnPropertyDescriptor|,
-  // so we handle that case in the else clause below.
-  if (descriptor) {
-    this.configurable = descriptor.configurable;
-    this.enumerable = descriptor.enumerable;
-    if (descriptor.get) {
-      this.get = new devtools.RemoteObject(descriptor.get, objectGroup, false);
-    }
-    if (descriptor.set) {
-      this.set = new devtools.RemoteObject(descriptor.set, objectGroup, false);
-    }
-    if (descriptor.value != null) {
-      this.value =
-          new devtools.RemoteObject(descriptor.value, objectGroup, false);
-    }
-    this.writable = descriptor.writable;
-  } else if (object[property] != null) {
-    this.configurable = false;
-    this.enumerable = object.propertyIsEnumerable(property);
-    if (object.__lookupGetter__(property)) {
-      this.get = object.__lookupGetter__(property);
-    }
-    if (object.__lookupSetter__(property)) {
-      this.set = object.__lookupSetter__(property);
-    }
-    this.value =
-        new devtools.RemoteObject(object[property], objectGroup, false);
-  }
-}
-
-// Creates an ObjectPreview, the type to represent a preview of an object,
-// which may be requested by devtools in the evaluate command.
-devtools.ObjectPreview = function(value) {
-  this.type = typeof value;
-  this.subtype = _getSubtype(value);
-  this.lossless = true;
-  this.overflow = false;
-  this.properties = [];
-
-  // Use the className as the preview description. This matches Chrome.
-  this.description = _getClassName(value);
-
-  // If we have an array-like object, add the array items, or append the
-  // length to the description if there's too many.
-  if (value.length != null) {
-    var MAX_ARRAY_ITEMS = 99;
-    if (value.length <= MAX_ARRAY_ITEMS) {
-      for (var i = 0; i < value.length; i++) {
-        var property = new devtools.PropertyPreview(i, value[i]);
-        this.properties.push(property);
-        if (typeof value[i] == 'object') {
-          this.lossless = false;
-        }
-      }
-    } else {
-      this.description += '[' + value.length + ']';
-      this.lossless = false;
-      this.overflow = true;
-    }
-    return;
-  }
-
-  // Add object properties, up to a maximum.
-  var MAX_PROPERTIES = 5;
-  var numProperties = 0;
-  for (var name in value) {
-    if (value[name] != null) {
-      if (++numProperties > MAX_PROPERTIES) {
-        this.lossless = false;
-        this.overflow = true;
-        break;
-      }
-      if (typeof property == 'object') {
-        this.lossless = false;
-      }
-      var property = new devtools.PropertyPreview(name, value[name]);
-      this.properties.push(property);
-    }
-  }
-}
-
-// Creates a PropertyPreview, the type to represent a preview of a single
-// object property.
-devtools.PropertyPreview = function(name, value) {
-  this.name = name.toString();
-  this.type = typeof value;
-
-  try {
-    this.value = value.toString();
-  } catch(e) {}
-
-  if (this.type == 'object') {
-    this.subtype = _getSubtype(value);
-  }
-}
-
-// The object store used to reference objects by internally generated id.
-var _objectStore = {};
-var _nextObjectId = 0;
-
-// The last evaluated result.
-var _lastResult = null;
-
-// Values in the global scope that have been overridden by corresponding
-// members of the Command Line API for the duration of an evaluation. We use
-// this to restore the original values after the evaluation.
-var _globalOverrides = {};
-
-// Command Line API implementation.
-// This is a set of convenience variables/functions that are not present in
-// the global scope by default, but can be specified as available to the
-// Runtime.evaluate function by the includeCommandLineAPI parameter.
-// https://developers.google.com/web/tools/chrome-devtools/console/utilities
-var _commandLineAPI = {};
-
-_commandLineAPI.$_ = _lastResult;
-
-_commandLineAPI.$ = document.querySelector.bind(document);
-
-_commandLineAPI.$$ = document.querySelectorAll.bind(document);
-
-_commandLineAPI.keys = Object.keys;
-
-_commandLineAPI.values = function(object) {
-  var keys = Object.keys(object);
-  var result = [];
-  for (var i = 0; i < keys.length; i++) {
-    result.push(object[keys[i]]);
-  }
-  return result;
-}
-
-var _addCommandLineAPI = function() {
-  _commandLineAPI.$_ = _lastResult;
-  for (var property in _commandLineAPI) {
-    if (_commandLineAPI.hasOwnProperty(property)) {
-      _globalOverrides[property] = window[property];
-      window[property] = _commandLineAPI[property];
-    }
-  }
-}
-
-var _removeCommandLineAPI = function() {
-  for (var property in _globalOverrides) {
-    if (_globalOverrides.hasOwnProperty(property)) {
-      window[property] = _globalOverrides[property];
-      delete _globalOverrides[property];
-    }
-  }
-}
-
-// TODO: Pass debugBackend from C++ instead of getting it from the window.
-})(window.debugBackend);
diff --git a/src/cobalt/debug/backend/debug_module.cc b/src/cobalt/debug/backend/debug_module.cc
index 1c64b86..a7fe6ab 100644
--- a/src/cobalt/debug/backend/debug_module.cc
+++ b/src/cobalt/debug/backend/debug_module.cc
@@ -24,7 +24,6 @@
 
 namespace {
 constexpr char kScriptDebuggerAgent[] = "ScriptDebuggerAgent";
-constexpr char kRuntimeAgent[] = "RuntimeAgent";
 constexpr char kLogAgent[] = "LogAgent";
 constexpr char kDomAgent[] = "DomAgent";
 constexpr char kCssAgent[] = "CssAgent";
@@ -158,10 +157,6 @@
   // directly handle one or more protocol domains.
   script_debugger_agent_.reset(
       new ScriptDebuggerAgent(debug_dispatcher_.get(), script_debugger_.get()));
-  if (!script_debugger_agent_->IsSupportedDomain("Runtime")) {
-    runtime_agent_.reset(
-        new RuntimeAgent(debug_dispatcher_.get(), data.window));
-  }
   log_agent_.reset(new LogAgent(debug_dispatcher_.get()));
   dom_agent_.reset(new DOMAgent(debug_dispatcher_.get()));
   css_agent_ = WrapRefCounted(new CSSAgent(debug_dispatcher_.get()));
@@ -191,9 +186,6 @@
                                      : data.debugger_state->agents_state.get();
   script_debugger_agent_->Thaw(
       RemoveAgentState(kScriptDebuggerAgent, agents_state));
-  if (runtime_agent_) {
-    runtime_agent_->Thaw(RemoveAgentState(kRuntimeAgent, agents_state));
-  }
   log_agent_->Thaw(RemoveAgentState(kLogAgent, agents_state));
   dom_agent_->Thaw(RemoveAgentState(kDomAgent, agents_state));
   css_agent_->Thaw(RemoveAgentState(kCssAgent, agents_state));
@@ -218,9 +210,6 @@
   base::DictionaryValue* agents_state = debugger_state->agents_state.get();
   StoreAgentState(agents_state, kScriptDebuggerAgent,
                   script_debugger_agent_->Freeze());
-  if (runtime_agent_) {
-    StoreAgentState(agents_state, kRuntimeAgent, runtime_agent_->Freeze());
-  }
   StoreAgentState(agents_state, kLogAgent, log_agent_->Freeze());
   StoreAgentState(agents_state, kDomAgent, dom_agent_->Freeze());
   StoreAgentState(agents_state, kCssAgent, css_agent_->Freeze());
diff --git a/src/cobalt/debug/backend/debug_module.h b/src/cobalt/debug/backend/debug_module.h
index 44af6b7..2e3aa91 100644
--- a/src/cobalt/debug/backend/debug_module.h
+++ b/src/cobalt/debug/backend/debug_module.h
@@ -31,7 +31,6 @@
 #include "cobalt/debug/backend/overlay_agent.h"
 #include "cobalt/debug/backend/page_agent.h"
 #include "cobalt/debug/backend/render_overlay.h"
-#include "cobalt/debug/backend/runtime_agent.h"
 #include "cobalt/debug/backend/script_debugger_agent.h"
 #include "cobalt/debug/backend/tracing_agent.h"
 #include "cobalt/debug/json_object.h"
@@ -141,7 +140,6 @@
   scoped_refptr<CSSAgent> css_agent_;
   std::unique_ptr<OverlayAgent> overlay_agent_;
   std::unique_ptr<PageAgent> page_agent_;
-  std::unique_ptr<RuntimeAgent> runtime_agent_;
   std::unique_ptr<ScriptDebuggerAgent> script_debugger_agent_;
   std::unique_ptr<TracingAgent> tracing_agent_;
 };
diff --git a/src/cobalt/debug/backend/runtime_agent.cc b/src/cobalt/debug/backend/runtime_agent.cc
deleted file mode 100644
index 84f8c1a..0000000
--- a/src/cobalt/debug/backend/runtime_agent.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 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/runtime_agent.h"
-
-#include <string>
-
-#include "base/bind.h"
-
-namespace cobalt {
-namespace debug {
-namespace backend {
-
-RuntimeAgent::RuntimeAgent(DebugDispatcher* dispatcher, dom::Window* window)
-    : AgentBase("Runtime", "runtime_agent.js", dispatcher), window_(window) {
-  commands_["compileScript"] =
-      base::Bind(&RuntimeAgent::CompileScript, base::Unretained(this));
-}
-
-bool RuntimeAgent::DoEnable(Command* command) {
-  if (!AgentBase::DoEnable(command)) return false;
-
-  // Send an executionContextCreated event.
-  // https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#event-executionContextCreated
-  JSONObject params(new base::DictionaryValue());
-  params->SetInteger("context.id", 1);
-  params->SetString("context.origin", window_->location()->origin());
-  params->SetString("context.name", "Cobalt");
-  params->SetBoolean("context.auxData.isDefault", true);
-  dispatcher_->SendEvent(domain_ + ".executionContextCreated", params);
-  return true;
-}
-
-void RuntimeAgent::CompileScript(Command command) {
-  if (!EnsureEnabled(&command)) return;
-
-  // TODO: Parse the JS without eval-ing it... This is to support:
-  // a) Multi-line input from the devtools console
-  // b) https://developers.google.com/web/tools/chrome-devtools/snippets
-  command.SendResponse();
-}
-
-}  // namespace backend
-}  // namespace debug
-}  // namespace cobalt
diff --git a/src/cobalt/debug/backend/runtime_agent.h b/src/cobalt/debug/backend/runtime_agent.h
deleted file mode 100644
index 1e5b5be..0000000
--- a/src/cobalt/debug/backend/runtime_agent.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 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_RUNTIME_AGENT_H_
-#define COBALT_DEBUG_BACKEND_RUNTIME_AGENT_H_
-
-#include "cobalt/debug/backend/agent_base.h"
-#include "cobalt/debug/backend/debug_dispatcher.h"
-#include "cobalt/debug/command.h"
-#include "cobalt/debug/json_object.h"
-#include "cobalt/dom/window.h"
-
-namespace cobalt {
-namespace debug {
-namespace backend {
-
-// Implements a small part of the the "Runtime" inspector protocol domain with
-// just enough to support console input. When using the V8 JavaScript engine,
-// this class is not needed since the V8 inspector implements the Runtime domain
-// for us.
-//
-// https://chromedevtools.github.io/devtools-protocol/tot/Runtime
-class RuntimeAgent : public AgentBase {
- public:
-  RuntimeAgent(DebugDispatcher* dispatcher, dom::Window* window);
-
- private:
-  void CompileScript(Command command);
-
-  bool DoEnable(Command* command) override;
-
-  dom::Window* window_;
-};
-
-}  // namespace backend
-}  // namespace debug
-}  // namespace cobalt
-
-#endif  // COBALT_DEBUG_BACKEND_RUNTIME_AGENT_H_
diff --git a/src/cobalt/debug/debug.gyp b/src/cobalt/debug/debug.gyp
index a0b5407..75b9bec 100644
--- a/src/cobalt/debug/debug.gyp
+++ b/src/cobalt/debug/debug.gyp
@@ -48,8 +48,6 @@
         'backend/render_layer.h',
         'backend/render_overlay.cc',
         'backend/render_overlay.h',
-        'backend/runtime_agent.cc',
-        'backend/runtime_agent.h',
         'backend/script_debugger_agent.cc',
         'backend/script_debugger_agent.h',
         'backend/tracing_agent.cc',
diff --git a/src/cobalt/debug/remote/devtools/copy_devtools_modules.rsp b/src/cobalt/debug/remote/devtools/copy_devtools_modules.rsp
deleted file mode 100644
index 39ad8b2..0000000
--- a/src/cobalt/debug/remote/devtools/copy_devtools_modules.rsp
+++ /dev/null
@@ -1,476 +0,0 @@
-front_end/network/network.js
-front_end/network/SignedExchangeInfoView.js
-front_end/network/ResourceWebSocketFrameView.js
-front_end/network/RequestTimingView.js
-front_end/network/RequestResponseView.js
-front_end/network/RequestPreviewView.js
-front_end/network/RequestInitiatorView.js
-front_end/network/RequestHeadersView.js
-front_end/network/RequestHTMLView.js
-front_end/network/RequestCookiesView.js
-front_end/network/NetworkWaterfallColumn.js
-front_end/network/NetworkTimeCalculator.js
-front_end/network/NetworkSearchScope.js
-front_end/network/NetworkPanel.js
-front_end/network/NetworkOverview.js
-front_end/network/NetworkManageCustomHeadersView.js
-front_end/network/NetworkLogViewColumns.js
-front_end/network/NetworkLogView.js
-front_end/network/NetworkItemView.js
-front_end/network/NetworkFrameGrouper.js
-front_end/network/NetworkDataGridNode.js
-front_end/network/NetworkConfigView.js
-front_end/network/HARWriter.js
-front_end/network/EventSourceMessagesView.js
-front_end/network/BlockedURLsPane.js
-front_end/network/BinaryResourceView.js
-front_end/test_runner/test_runner.js
-front_end/test_runner/TestRunner.js
-front_end/emulation/emulation.js
-front_end/emulation/SensorsView.js
-front_end/emulation/MediaQueryInspector.js
-front_end/emulation/InspectedPagePlaceholder.js
-front_end/emulation/GeolocationsSettingsTab.js
-front_end/emulation/EmulatedDevices.js
-front_end/emulation/DevicesSettingsTab.js
-front_end/emulation/DeviceModeWrapper.js
-front_end/emulation/DeviceModeView.js
-front_end/emulation/DeviceModeToolbar.js
-front_end/emulation/DeviceModeModel.js
-front_end/emulation/AdvancedApp.js
-front_end/inspector_main/inspector_main.js
-front_end/inspector_main/RenderingOptions.js
-front_end/inspector_main/InspectorMain.js
-front_end/js_main/js_main.js
-front_end/js_main/JsMain.js
-front_end/search/search.js
-front_end/search/SearchView.js
-front_end/search/SearchResultsPane.js
-front_end/search/SearchConfig.js
-front_end/screencast/screencast.js
-front_end/screencast/ScreencastView.js
-front_end/screencast/ScreencastApp.js
-front_end/screencast/InputModel.js
-front_end/performance_monitor/performance_monitor.js
-front_end/performance_monitor/PerformanceMonitor.js
-front_end/main/main.js
-front_end/main/SimpleApp.js
-front_end/main/MainImpl.js
-front_end/main/ExecutionContextSelector.js
-front_end/snippets/snippets.js
-front_end/snippets/SnippetsQuickOpen.js
-front_end/snippets/ScriptSnippetFileSystem.js
-front_end/settings/settings.js
-front_end/settings/SettingsScreen.js
-front_end/settings/FrameworkBlackboxSettingsTab.js
-front_end/security/security.js
-front_end/security/SecurityPanel.js
-front_end/security/SecurityModel.js
-front_end/javascript_metadata/javascript_metadata.js
-front_end/javascript_metadata/NativeFunctions.js
-front_end/javascript_metadata/JavaScriptMetadata.js
-front_end/har_importer/har_importer.js
-front_end/har_importer/HARImporter.js
-front_end/har_importer/HARFormat.js
-front_end/browser_debugger/browser_debugger.js
-front_end/browser_debugger/XHRBreakpointsSidebarPane.js
-front_end/browser_debugger/ObjectEventListenersSidebarPane.js
-front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js
-front_end/browser_debugger/DOMBreakpointsSidebarPane.js
-front_end/layer_viewer/layer_viewer.js
-front_end/layer_viewer/TransformController.js
-front_end/layer_viewer/PaintProfilerView.js
-front_end/layer_viewer/Layers3DView.js
-front_end/layer_viewer/LayerViewHost.js
-front_end/layer_viewer/LayerTreeOutline.js
-front_end/layer_viewer/LayerDetailsView.js
-front_end/cm_web_modes/cm_web_modes.js
-front_end/cm_web_modes/cm_web_modes_cm.js
-front_end/cm_web_modes/cm_web_modes_headless.js
-front_end/cm_web_modes/css.js
-front_end/cm_web_modes/javascript.js
-front_end/cm_web_modes/xml.js
-front_end/cm_web_modes/htmlmixed.js
-front_end/cm_web_modes/htmlembedded.js
-front_end/text_editor/text_editor.js
-front_end/text_editor/TextEditorAutocompleteController.js
-front_end/text_editor/CodeMirrorUtils.js
-front_end/text_editor/CodeMirrorTextEditor.js
-front_end/quick_open/quick_open.js
-front_end/quick_open/QuickOpen.js
-front_end/quick_open/HelpQuickOpen.js
-front_end/quick_open/FilteredListWidget.js
-front_end/quick_open/CommandMenu.js
-front_end/elements/elements.js
-front_end/elements/elements-legacy.js
-front_end/elements/StylesSidebarPane.js
-front_end/elements/StylePropertyTreeElement.js
-front_end/elements/StylePropertyHighlighter.js
-front_end/elements/PropertiesWidget.js
-front_end/elements/PlatformFontsWidget.js
-front_end/elements/NodeStackTraceWidget.js
-front_end/elements/MetricsSidebarPane.js
-front_end/elements/MarkerDecorator.js
-front_end/elements/InspectElementModeController.js
-front_end/elements/EventListenersWidget.js
-front_end/elements/ElementsTreeOutline.js
-front_end/elements/ElementsTreeElement.js
-front_end/elements/ElementsTreeElementHighlighter.js
-front_end/elements/ElementStatePaneWidget.js
-front_end/elements/ElementsSidebarPane.js
-front_end/elements/ElementsPanel.js
-front_end/elements/ElementsBreadcrumbs.js
-front_end/elements/DOMPath.js
-front_end/elements/DOMLinkifier.js
-front_end/elements/ComputedStyleWidget.js
-front_end/elements/ComputedStyleModel.js
-front_end/elements/ColorSwatchPopoverIcon.js
-front_end/elements/ClassesPaneWidget.js
-front_end/timeline_model/timeline_model.js
-front_end/timeline_model/TracingLayerTree.js
-front_end/timeline_model/TimelineProfileTree.js
-front_end/timeline_model/TimelineModel.js
-front_end/timeline_model/TimelineModelFilter.js
-front_end/timeline_model/TimelineJSProfile.js
-front_end/timeline_model/TimelineIRModel.js
-front_end/timeline_model/TimelineFrameModel.js
-front_end/help/help.js
-front_end/help/ReleaseNoteView.js
-front_end/help/ReleaseNoteText.js
-front_end/help/HelpImpl.js
-front_end/workspace_diff/workspace_diff.js
-front_end/workspace_diff/WorkspaceDiff.js
-front_end/mobile_throttling/mobile_throttling.js
-front_end/mobile_throttling/ThrottlingSettingsTab.js
-front_end/mobile_throttling/ThrottlingPresets.js
-front_end/mobile_throttling/ThrottlingManager.js
-front_end/mobile_throttling/NetworkThrottlingSelector.js
-front_end/mobile_throttling/NetworkPanelIndicator.js
-front_end/mobile_throttling/MobileThrottlingSelector.js
-front_end/event_listeners/event_listeners.js
-front_end/event_listeners/EventListenersView.js
-front_end/event_listeners/EventListenersUtils.js
-front_end/object_ui/object_ui.js
-front_end/object_ui/RemoteObjectPreviewFormatter.js
-front_end/object_ui/ObjectPropertiesSection.js
-front_end/object_ui/ObjectPopoverHelper.js
-front_end/object_ui/JavaScriptREPL.js
-front_end/object_ui/JavaScriptAutocomplete.js
-front_end/object_ui/CustomPreviewComponent.js
-front_end/cookie_table/cookie_table.js
-front_end/cookie_table/CookiesTable.js
-front_end/cm_modes/cm_modes.js
-front_end/cm_modes/DefaultCodeMirrorMimeMode.js
-front_end/cm_modes/clike.js
-front_end/cm_modes/coffeescript.js
-front_end/cm_modes/php.js
-front_end/cm_modes/python.js
-front_end/cm_modes/shell.js
-front_end/cm_modes/livescript.js
-front_end/cm_modes/markdown.js
-front_end/cm_modes/clojure.js
-front_end/cm_modes/jsx.js
-front_end/css_overview/css_overview.js
-front_end/css_overview/CSSOverviewUnusedDeclarations.js
-front_end/css_overview/CSSOverviewStartView.js
-front_end/css_overview/CSSOverviewSidebarPanel.js
-front_end/css_overview/CSSOverviewProcessingView.js
-front_end/css_overview/CSSOverviewPanel.js
-front_end/css_overview/CSSOverviewModel.js
-front_end/css_overview/CSSOverviewController.js
-front_end/css_overview/CSSOverviewCompletedView.js
-front_end/console/console.js
-front_end/console/ConsoleContextSelector.js
-front_end/console/ConsoleFilter.js
-front_end/console/ConsoleSidebar.js
-front_end/console/ConsolePanel.js
-front_end/console/ConsolePinPane.js
-front_end/console/ConsolePrompt.js
-front_end/console/ConsoleView.js
-front_end/console/ConsoleViewMessage.js
-front_end/console/ConsoleViewport.js
-front_end/source_frame/source_frame.js
-front_end/source_frame/XMLView.js
-front_end/source_frame/SourcesTextEditor.js
-front_end/source_frame/SourceFrame.js
-front_end/source_frame/source_frame.js
-front_end/source_frame/SourceCodeDiff.js
-front_end/source_frame/ResourceSourceFrame.js
-front_end/source_frame/PreviewFactory.js
-front_end/source_frame/JSONView.js
-front_end/source_frame/ImageView.js
-front_end/source_frame/FontView.js
-front_end/source_frame/BinaryResourceViewFactory.js
-front_end/inline_editor/inline_editor.js
-front_end/inline_editor/SwatchPopoverHelper.js
-front_end/inline_editor/CSSShadowModel.js
-front_end/inline_editor/CSSShadowEditor.js
-front_end/inline_editor/ColorSwatch.js
-front_end/inline_editor/BezierUI.js
-front_end/inline_editor/BezierEditor.js
-front_end/diff/diff.js
-front_end/diff/diff_match_patch.js
-front_end/diff/DiffWrapper.js
-front_end/formatter/formatter.js
-front_end/formatter/ScriptFormatter.js
-front_end/formatter/FormatterWorkerPool.js
-front_end/color_picker/color_picker.js
-front_end/color_picker/Spectrum.js
-front_end/color_picker/ContrastOverlay.js
-front_end/color_picker/ContrastInfo.js
-front_end/color_picker/ContrastDetails.js
-front_end/cm/cm.js
-front_end/cm/active-line.js
-front_end/cm/brace-fold.js
-front_end/cm/closebrackets.js
-front_end/cm/codemirror.js
-front_end/cm/comment.js
-front_end/cm/foldcode.js
-front_end/cm/foldgutter.js
-front_end/cm/mark-selection.js
-front_end/cm/matchbrackets.js
-front_end/cm/multiplex.js
-front_end/cm/overlay.js
-front_end/formatter_worker.unbundled.js
-front_end/heap_snapshot_worker.unbundled.js
-front_end/heap_snapshot_model/heap_snapshot_model.js
-front_end/heap_snapshot_model/HeapSnapshotModel.js
-front_end/heap_snapshot_worker/heap_snapshot_worker.js
-front_end/heap_snapshot_worker/AllocationProfile.js
-front_end/heap_snapshot_worker/HeapSnapshot.js
-front_end/heap_snapshot_worker/HeapSnapshotLoader.js
-front_end/heap_snapshot_worker/HeapSnapshotWorker.js
-front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js
-front_end/text_utils/text_utils.js
-front_end/text_utils/TextUtils.js
-front_end/text_utils/TextRange.js
-front_end/text_utils/Text.js
-front_end/formatter_worker/formatter_worker.js
-front_end/formatter_worker/RelaxedJSONParser.js
-front_end/formatter_worker/JavaScriptOutline.js
-front_end/formatter_worker/JavaScriptFormatter.js
-front_end/formatter_worker/IdentityFormatter.js
-front_end/formatter_worker/HTMLFormatter.js
-front_end/formatter_worker/FormatterWorker.js
-front_end/formatter_worker/FormattedContentBuilder.js
-front_end/formatter_worker/ESTreeWalker.js
-front_end/formatter_worker/CSSRuleParser.js
-front_end/formatter_worker/CSSFormatter.js
-front_end/formatter_worker/AcornTokenizer.js
-front_end/cm_headless/cm_headless.js
-front_end/cm_headless/headlesscodemirror.js
-front_end/data_grid/data_grid.js
-front_end/data_grid/ViewportDataGrid.js
-front_end/data_grid/SortableDataGrid.js
-front_end/data_grid/ShowMoreDataGridNode.js
-front_end/data_grid/DataGrid.js
-front_end/protocol_monitor/protocol_monitor.js
-front_end/protocol_monitor/ProtocolMonitor.js
-front_end/console_counters/console_counters.js
-front_end/console_counters/WarningErrorCounter.js
-front_end/extensions/extensions.js
-front_end/extensions/ExtensionAPI.js
-front_end/extensions/ExtensionPanel.js
-front_end/extensions/ExtensionServer.js
-front_end/extensions/ExtensionTraceProvider.js
-front_end/extensions/ExtensionView.js
-front_end/browser_sdk/browser_sdk.js
-front_end/browser_sdk/LogManager.js
-front_end/persistence/persistence.js
-front_end/persistence/WorkspaceSettingsTab.js
-front_end/persistence/PlatformFileSystem.js
-front_end/persistence/PersistenceUtils.js
-front_end/persistence/PersistenceImpl.js
-front_end/persistence/PersistenceActions.js
-front_end/persistence/NetworkPersistenceManager.js
-front_end/persistence/IsolatedFileSystemManager.js
-front_end/persistence/IsolatedFileSystem.js
-front_end/persistence/FileSystemWorkspaceBinding.js
-front_end/persistence/EditFileSystemView.js
-front_end/persistence/Automapping.js
-front_end/components/components.js
-front_end/components/TargetDetachedDialog.js
-front_end/components/Reload.js
-front_end/components/Linkifier.js
-front_end/components/JSPresentationUtils.js
-front_end/components/ImagePreview.js
-front_end/components/DockController.js
-front_end/bindings/bindings.js
-front_end/bindings/TempFile.js
-front_end/bindings/StylesSourceMapping.js
-front_end/bindings/SASSSourceMapping.js
-front_end/bindings/ResourceUtils.js
-front_end/bindings/ResourceScriptMapping.js
-front_end/bindings/ResourceMapping.js
-front_end/bindings/PresentationConsoleMessageHelper.js
-front_end/bindings/NetworkProject.js
-front_end/bindings/LiveLocation.js
-front_end/bindings/FileUtils.js
-front_end/bindings/DefaultScriptMapping.js
-front_end/bindings/DebuggerWorkspaceBinding.js
-front_end/bindings/CSSWorkspaceBinding.js
-front_end/bindings/ContentProviderBasedProject.js
-front_end/bindings/CompilerScriptMapping.js
-front_end/bindings/BreakpointManager.js
-front_end/bindings/BlackboxManager.js
-front_end/workspace/workspace.js
-front_end/workspace/WorkspaceImpl.js
-front_end/workspace/UISourceCode.js
-front_end/workspace/FileManager.js
-front_end/services/services.js
-front_end/services/ServiceManager.js
-front_end/sdk/sdk.js
-front_end/sdk/TracingModel.js
-front_end/sdk/TracingManager.js
-front_end/sdk/TargetManager.js
-front_end/sdk/Target.js
-front_end/sdk/SourceMapManager.js
-front_end/sdk/SourceMap.js
-front_end/sdk/ServiceWorkerManager.js
-front_end/sdk/ServiceWorkerCacheModel.js
-front_end/sdk/ServerTiming.js
-front_end/sdk/SecurityOriginManager.js
-front_end/sdk/SDKModel.js
-front_end/sdk/Script.js
-front_end/sdk/ScreenCaptureModel.js
-front_end/sdk/RuntimeModel.js
-front_end/sdk/ResourceTreeModel.js
-front_end/sdk/Resource.js
-front_end/sdk/RemoteObject.js
-front_end/sdk/ProfileTreeModel.js
-front_end/sdk/IssuesModel.js
-front_end/sdk/PerformanceMetricsModel.js
-front_end/sdk/PaintProfiler.js
-front_end/sdk/OverlayModel.js
-front_end/sdk/NetworkRequest.js
-front_end/sdk/NetworkManager.js
-front_end/sdk/NetworkLog.js
-front_end/sdk/LogModel.js
-front_end/sdk/LayerTreeBase.js
-front_end/sdk/IsolateManager.js
-front_end/sdk/HeapProfilerModel.js
-front_end/sdk/HARLog.js
-front_end/sdk/FilmStripModel.js
-front_end/sdk/EmulationModel.js
-front_end/sdk/DOMModel.js
-front_end/sdk/DOMDebuggerModel.js
-front_end/sdk/DebuggerModel.js
-front_end/sdk/CSSStyleSheetHeader.js
-front_end/sdk/CSSStyleDeclaration.js
-front_end/sdk/CSSRule.js
-front_end/sdk/CSSProperty.js
-front_end/sdk/CSSModel.js
-front_end/sdk/CSSMetadata.js
-front_end/sdk/CSSMedia.js
-front_end/sdk/CSSMatchedStyles.js
-front_end/sdk/CPUProfilerModel.js
-front_end/sdk/CPUProfileDataModel.js
-front_end/sdk/CookieParser.js
-front_end/sdk/CookieModel.js
-front_end/sdk/CompilerSourceMappingContentProvider.js
-front_end/sdk/ConsoleModel.js
-front_end/sdk/Connections.js
-front_end/sdk/ChildTargetManager.js
-front_end/protocol/protocol.js
-front_end/protocol/NodeURL.js
-front_end/protocol/InspectorBackend.js
-front_end/host/host.js
-front_end/host/UserMetrics.js
-front_end/host/ResourceLoader.js
-front_end/host/Platform.js
-front_end/host/InspectorFrontendHost.js
-front_end/host/InspectorFrontendHostAPI.js
-front_end/dom_extension/DOMExtension.js
-front_end/dom_extension/dom_extension.js
-front_end/root.js
-front_end/Runtime.js
-front_end/platform/utilities.js
-front_end/platform/platform.js
-front_end/ui/ARIAUtils.js
-front_end/ui/ZoomManager.js
-front_end/ui/XWidget.js
-front_end/ui/XLink.js
-front_end/ui/XElement.js
-front_end/ui/Widget.js
-front_end/ui/View.js
-front_end/ui/ViewManager.js
-front_end/ui/UIUtils.js
-front_end/ui/ui.js
-front_end/ui/Treeoutline.js
-front_end/ui/Tooltip.js
-front_end/ui/Toolbar.js
-front_end/ui/ThrottledWidget.js
-front_end/ui/TextPrompt.js
-front_end/ui/TextEditor.js
-front_end/ui/TargetCrashedScreen.js
-front_end/ui/TabbedPane.js
-front_end/ui/SyntaxHighlighter.js
-front_end/ui/SuggestBox.js
-front_end/ui/SplitWidget.js
-front_end/ui/SoftDropDown.js
-front_end/ui/SoftContextMenu.js
-front_end/ui/ShortcutsScreen.js
-front_end/ui/ShortcutRegistry.js
-front_end/ui/SettingsUI.js
-front_end/ui/SegmentedButton.js
-front_end/ui/SearchableView.js
-front_end/ui/RootView.js
-front_end/ui/ResizerWidget.js
-front_end/ui/ReportView.js
-front_end/ui/RemoteDebuggingTerminatedScreen.js
-front_end/ui/ProgressIndicator.js
-front_end/ui/PopoverHelper.js
-front_end/ui/Panel.js
-front_end/ui/ListWidget.js
-front_end/ui/ListModel.js
-front_end/ui/ListControl.js
-front_end/ui/KeyboardShortcut.js
-front_end/ui/InspectorView.js
-front_end/ui/InplaceEditor.js
-front_end/ui/Infobar.js
-front_end/ui/Icon.js
-front_end/ui/HistoryInput.js
-front_end/ui/GlassPane.js
-front_end/ui/Geometry.js
-front_end/ui/Fragment.js
-front_end/ui/ForwardedInputEventHandler.js
-front_end/ui/FilterSuggestionBuilder.js
-front_end/ui/FilterBar.js
-front_end/ui/EmptyWidget.js
-front_end/ui/DropTarget.js
-front_end/ui/Dialog.js
-front_end/ui/ContextMenu.js
-front_end/ui/Context.js
-front_end/ui/ARIAUtils.js
-front_end/ui/ActionRegistry.js
-front_end/ui/Action.js
-front_end/ui/ActionDelegate.js
-front_end/ui/ContextFlavorListener.js
-front_end/root.js
-front_end/common/common.js
-front_end/common/common-legacy.js
-front_end/common/App.js
-front_end/common/AppProvider.js
-front_end/common/CharacterIdMap.js
-front_end/common/Color.js
-front_end/common/ContentProvider.js
-front_end/common/EventTarget.js
-front_end/common/JavaScriptMetaData.js
-front_end/common/Linkifier.js
-front_end/common/Object.js
-front_end/common/Console.js
-front_end/common/ParsedURL.js
-front_end/common/Progress.js
-front_end/common/QueryParamHandler.js
-front_end/common/ResourceType.js
-front_end/common/Revealer.js
-front_end/common/Runnable.js
-front_end/common/SegmentedRange.js
-front_end/common/Settings.js
-front_end/common/StaticContentProvider.js
-front_end/common/StringOutputStream.js
-front_end/common/TextDictionary.js
-front_end/common/Throttler.js
-front_end/common/Trie.js
-front_end/common/UIString.js
-front_end/common/Worker.js
diff --git a/src/cobalt/demos/content/transparent-animated-webp-demo/index.html b/src/cobalt/demos/content/transparent-animated-webp-demo/index.html
index 62d21d9..e3fda4a 100644
--- a/src/cobalt/demos/content/transparent-animated-webp-demo/index.html
+++ b/src/cobalt/demos/content/transparent-animated-webp-demo/index.html
@@ -7,43 +7,45 @@
  | frames.
  -->
 <html>
+
 <head>
-<style>
-body {
-  background-color: white;
-}
+  <style>
+    body {
+      background-color: white;
+    }
 
-.layer {
-  position: absolute;
-  left: 0px;
-  top: 0px;
-}
+    .layer {
+      position: absolute;
+      left: 0px;
+      top: 0px;
+    }
 
-@keyframes background-anim {
-  from {
-    background-color: green;
-  }
-  to {
-    background-color: blue;
-  }
-}
+    @keyframes background-anim {
+      from {
+        background-color: green;
+      }
 
-.background {
-  position: absolute;
-  left: 0px;
-  top: 0px;
-  width:100%;
-  height:100%;
-  background-color: green;
-  animation: background-anim 5s alternate-reverse infinite ease-in-out;
-}
+      to {
+        background-color: blue;
+      }
+    }
 
-.image {
-  width: 300px;
-  height: 300px;
-  background-size: contain;
-}
-</style>
+    .background {
+      position: absolute;
+      left: 0px;
+      top: 0px;
+      width: 100%;
+      height: 100%;
+      background-color: green;
+      animation: background-anim 5s alternate-reverse infinite ease-in-out;
+    }
+
+    .image {
+      width: 300px;
+      height: 300px;
+      background-size: contain;
+    }
+  </style>
 </head>
 
 <body>
@@ -52,15 +54,17 @@
   <div class="layer">
     <!-- Image that clears each frame by overwriting the entire frame with a
          new image that has blending disabled -->
-    <div class="image"
-         style="background-image: url(bottleflip_loader.webp);">
+    <div class="image" style="background-image: url(bottleflip_loader.webp)">
     </div>
     <!-- Image that disposes the previous frame's rectangle to the background
          color (which contains alpha) after it finishes, requiring that the
          background color fill be done with no blending. -->
-    <div class="image"
-         style="background-image: url(webp-animated-semitransparent4.webp);">
+    <div class="image" style="background-image: url(webp-animated-semitransparent4.webp);">
+    </div>
+    <!-- Background color of image should be ignored, use canvas color instead-->
+    <div class="image" style="background-image: url(loading-spinner-opaque.webp)">
     </div>
   </div>
 </body>
-</html>
+
+</html>
\ No newline at end of file
diff --git a/src/cobalt/demos/content/transparent-animated-webp-demo/loading-spinner-opaque.webp b/src/cobalt/demos/content/transparent-animated-webp-demo/loading-spinner-opaque.webp
new file mode 100644
index 0000000..6cee3dd
--- /dev/null
+++ b/src/cobalt/demos/content/transparent-animated-webp-demo/loading-spinner-opaque.webp
Binary files differ
diff --git a/src/cobalt/demos/content/user-agent-client-hints-demo/user-agent-client-hints-demo.html b/src/cobalt/demos/content/user-agent-client-hints-demo/user-agent-client-hints-demo.html
new file mode 100644
index 0000000..d8cf908
--- /dev/null
+++ b/src/cobalt/demos/content/user-agent-client-hints-demo/user-agent-client-hints-demo.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      body {
+        color: white;
+      }
+      .title {
+        font-size: 24px;
+      }
+      .subtitle {
+        font-size: 20px;
+      }
+    </style>
+  </head>
+  <body>
+    <div class="title">User-Agent Client Hints Demo</div>
+    <div id="brands" class="subtitle">Brands</div>
+    <div id="mobile" class="subtitle">Mobile indicator</div>
+    <div id="full" class="subtitle">Full User-Agent Data</div>
+
+    <script type="text/javascript">
+      // Enable User-Agent Client Hints API
+      h5vcc.settings.set("NavigatorUAData", 1);
+
+      if (navigator.userAgentData) {
+        var brands_result = document.createElement("div");
+        brands_result.innerHTML = JSON.stringify(navigator.userAgentData.brands, null, " ");
+        brands_result.style.fontSize = "16px";
+        var brands_element = document.getElementById("brands");
+        brands_element.appendChild(brands_result);
+
+        var mobile_result = document.createElement("div");
+        mobile_result.innerHTML = navigator.userAgentData.mobile;
+        mobile_result.style.fontSize = "16px";
+        var mobile_element = document.getElementById("mobile");
+        mobile_element.appendChild(mobile_result);
+
+        navigator.userAgentData.getHighEntropyValues(
+          ["architecture", "bitness", "model", "platformVersion",
+           "uaFullVersion", "cobaltBuildNumber", "cobaltBuildConfiguration",
+           "jsEngineVersion", "rasterizer", "evergreenVersion",
+           "starboardVersion", "originalDesignManufacturer",
+           "deviceType", "chipset", "modelYear", "deviceBrand",
+           "connectionType", "aux"])
+          .then(ua => {
+            // Cobalt returns a CobaltUADataValuesInterface object instead of a
+            // dictionary as dictionary promises are currently not supported.
+            // Thus we must reconstruct the dictionary from the interface object
+            // returned from getHighEntropyValues().
+            var full_JSON = new Object();
+            full_JSON.architecture = ua.architecture;
+            full_JSON.bitness = ua.bitness;
+            full_JSON.model = ua.model;
+            full_JSON.platformVersion = ua.platformVersion;
+            full_JSON.uaFullVersion = ua.uaFullVersion;
+            full_JSON.cobaltBuildNumber = ua.cobaltBuildNumber;
+            full_JSON.cobaltBuildConfiguration = ua.cobaltBuildConfiguration;
+            full_JSON.jsEngineVersion = ua.jsEngineVersion;
+            full_JSON.rasterizer = ua.rasterizer;
+            full_JSON.evergreenVersion = ua.evergreenVersion;
+            full_JSON.starboardVersion = ua.starboardVersion;
+            full_JSON.originalDesignManufacturer = ua.originalDesignManufacturer;
+            full_JSON.deviceType = ua.deviceType;
+            full_JSON.chipset = ua.chipset;
+            full_JSON.modelYear = ua.modelYear;
+            full_JSON.deviceBrand = ua.deviceBrand;
+            full_JSON.connectionType = ua.connectionType;
+            full_JSON.aux = ua.aux;
+
+            var full_result = document.createElement("div");
+            full_result.innerHTML = JSON.stringify(full_JSON, null, " ");
+            full_result.style.fontSize = "16px";
+            var full_element = document.getElementById("full");
+            full_element.appendChild(full_result);
+          });
+      } else {
+        console.log("User-Agent Client Hints API not enabled");
+      }
+    </script>
+  </body>
+</html>
diff --git a/src/cobalt/doc/performance_tuning.md b/src/cobalt/doc/performance_tuning.md
index 728ab56..f0a91ad 100644
--- a/src/cobalt/doc/performance_tuning.md
+++ b/src/cobalt/doc/performance_tuning.md
@@ -30,34 +30,6 @@
 **Tags:** *framerate, startup, browse-to-watch, cpu memory, input latency.*
 
 
-### Switch JavaScript Engine to V8
-
-Cobalt supports both SpiderMonkey and V8 as JavaScript engines.  SpiderMonkey
-is the default JavaScript engine since it is the most compatible in that it
-does not require your platform to support Just-In-Time (JIT) compiling.
-However, if your platform supports it, we strongly recommend that you use
-V8, as it has been shown to provide 20-50% speed improvements on JavaScript
-execution across the board.  Note however that V8 has also been found to
-consume around 10MB more memory than SpiderMonkey.
-
-To enable V8, you must modify the `GetVariables()` method in your
-`gyp_configuration.py` file and ensure that the variables dictionary that is
-returned contains the following key/value pair:
-
-```
-{
-  'javascript_engine': 'v8',
-}
-```
-
-Additionally, you must implement the `CobaltExtensionConfigurationApi` such
-that the `CobaltEnableJit()` method returns `true`.
-
-Note also that use of V8 requires Starboard version 10 or higher.
-
-**Tags:** *startup, browse-to-watch, cpu memory, input latency.*
-
-
 ### Framerate throttling
 
 If you're willing to accept a lower framerate, there is potential that
diff --git a/src/cobalt/dom/audio_track.h b/src/cobalt/dom/audio_track.h
index 361cd19..b3869e6 100644
--- a/src/cobalt/dom/audio_track.h
+++ b/src/cobalt/dom/audio_track.h
@@ -60,13 +60,13 @@
   //
   static bool IsValidKind(const char* kind) {
     // https://www.w3.org/TR/html51/semantics-embedded-content.html#dom-audiotrack-audiotrackkind
-    return SbStringCompareAll(kind, "alternative") == 0 ||
-           SbStringCompareAll(kind, "descriptions") == 0 ||
-           SbStringCompareAll(kind, "main") == 0 ||
-           SbStringCompareAll(kind, "main-desc") == 0 ||
-           SbStringCompareAll(kind, "translation") == 0 ||
-           SbStringCompareAll(kind, "commentary") == 0 ||
-           SbStringGetLength(kind) == 0;
+    return strcmp(kind, "alternative") == 0 ||
+           strcmp(kind, "descriptions") == 0 ||
+           strcmp(kind, "main") == 0 ||
+           strcmp(kind, "main-desc") == 0 ||
+           strcmp(kind, "translation") == 0 ||
+           strcmp(kind, "commentary") == 0 ||
+           strlen(kind) == 0;
   }
 
   DEFINE_WRAPPABLE_TYPE(AudioTrack);
diff --git a/src/cobalt/dom/blob_test.cc b/src/cobalt/dom/blob_test.cc
index 41f33f9..eabba0b 100644
--- a/src/cobalt/dom/blob_test.cc
+++ b/src/cobalt/dom/blob_test.cc
@@ -47,7 +47,7 @@
   script::Handle<script::DataView> data_view = script::DataView::New(
       global_environment, array_buffer, 0, array_buffer->ByteLength());
   uint8 test_data[] = {0x06, 0x07, 0x00, 0x7B, 0xCD};
-  SbMemoryCopy(data_view->RawData(), test_data, 5);
+  memcpy(data_view->RawData(), test_data, 5);
   scoped_refptr<Blob> blob_with_buffer =
       new Blob(environment_settings, array_buffer);
 
@@ -101,7 +101,7 @@
       global_environment, array_buffer, 0, array_buffer->ByteLength());
 
   uint8 test_data[2] = {0x06, 0x07};
-  SbMemoryCopy(data_view->RawData(), test_data, 2);
+  memcpy(data_view->RawData(), test_data, 2);
 
   scoped_refptr<Blob> blob_with_buffer =
       new Blob(environment_settings, array_buffer);
diff --git a/src/cobalt/dom/captions/system_caption_settings.cc b/src/cobalt/dom/captions/system_caption_settings.cc
index 3fcc8d0..3a447f7 100644
--- a/src/cobalt/dom/captions/system_caption_settings.cc
+++ b/src/cobalt/dom/captions/system_caption_settings.cc
@@ -184,7 +184,7 @@
 base::Optional<std::string> SystemCaptionSettings::background_color() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -208,7 +208,7 @@
 CaptionState SystemCaptionSettings::background_color_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.background_color_state);
@@ -223,7 +223,7 @@
 base::Optional<std::string> SystemCaptionSettings::background_opacity() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -247,7 +247,7 @@
 CaptionState SystemCaptionSettings::background_opacity_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.background_opacity_state);
@@ -262,7 +262,7 @@
 base::Optional<std::string> SystemCaptionSettings::character_edge_style() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -288,7 +288,7 @@
 CaptionState SystemCaptionSettings::character_edge_style_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.character_edge_style_state);
@@ -303,7 +303,7 @@
 base::Optional<std::string> SystemCaptionSettings::font_color() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -327,7 +327,7 @@
 CaptionState SystemCaptionSettings::font_color_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.font_color_state);
@@ -342,7 +342,7 @@
 base::Optional<std::string> SystemCaptionSettings::font_family() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -366,7 +366,7 @@
 CaptionState SystemCaptionSettings::font_family_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.font_family_state);
@@ -381,7 +381,7 @@
 base::Optional<std::string> SystemCaptionSettings::font_opacity() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -405,7 +405,7 @@
 CaptionState SystemCaptionSettings::font_opacity_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.font_opacity_state);
@@ -420,7 +420,7 @@
 base::Optional<std::string> SystemCaptionSettings::font_size() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -445,7 +445,7 @@
 CaptionState SystemCaptionSettings::font_size_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.font_size_state);
@@ -460,7 +460,7 @@
 base::Optional<std::string> SystemCaptionSettings::window_color() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -484,7 +484,7 @@
 CaptionState SystemCaptionSettings::window_color_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.window_color_state);
@@ -499,7 +499,7 @@
 base::Optional<std::string> SystemCaptionSettings::window_opacity() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   if (!success) {
@@ -523,7 +523,7 @@
 CaptionState SystemCaptionSettings::window_opacity_state() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   if (success) {
     return ToCobaltCaptionState(caption_settings.window_opacity_state);
@@ -538,7 +538,7 @@
 bool SystemCaptionSettings::is_enabled() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   DCHECK(supports_is_enabled());
 
@@ -561,7 +561,7 @@
 bool SystemCaptionSettings::supports_is_enabled() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   return (success) ? caption_settings.supports_is_enabled : false;
@@ -574,7 +574,7 @@
 bool SystemCaptionSettings::supports_set_enabled() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   return (success) ? caption_settings.supports_set_enabled : false;
@@ -587,7 +587,7 @@
 bool SystemCaptionSettings::supports_override() {
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
-  SbMemorySet(&caption_settings, 0, sizeof(caption_settings));
+  memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   return (success) ? caption_settings.supports_override : false;
diff --git a/src/cobalt/dom/cobalt_ua_data_values.idl b/src/cobalt/dom/cobalt_ua_data_values.idl
index 62c3b30..000b238 100644
--- a/src/cobalt/dom/cobalt_ua_data_values.idl
+++ b/src/cobalt/dom/cobalt_ua_data_values.idl
@@ -21,6 +21,8 @@
   DOMString rasterizer;
   DOMString evergreenVersion;
   DOMString starboardVersion;
+  DOMString originalDesignManufacturer;
+  DOMString deviceType;
   DOMString chipset;
   DOMString modelYear;
   DOMString deviceBrand;
diff --git a/src/cobalt/dom/cobalt_ua_data_values_interface.cc b/src/cobalt/dom/cobalt_ua_data_values_interface.cc
new file mode 100644
index 0000000..a688cf8
--- /dev/null
+++ b/src/cobalt/dom/cobalt_ua_data_values_interface.cc
@@ -0,0 +1,91 @@
+// Copyright 2021 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/cobalt_ua_data_values_interface.h"
+
+namespace cobalt {
+namespace dom {
+
+CobaltUADataValuesInterface::CobaltUADataValuesInterface(
+    const CobaltUADataValues& init_dict) {
+  // In many cases, |init_dict| will not have all its fields initialized, only
+  // the ones specified when calling NavigatorUAData::getHighEntropyValues().
+  // Thus, we first must check whether the fields have been initialized.
+  if (init_dict.has_brands()) {
+    brands_ = init_dict.brands();
+  }
+  if (init_dict.has_mobile()) {
+    mobile_ = init_dict.mobile();
+  }
+  if (init_dict.has_platform()) {
+    platform_ = init_dict.platform();
+  }
+  if (init_dict.has_architecture()) {
+    architecture_ = init_dict.architecture();
+  }
+  if (init_dict.has_bitness()) {
+    bitness_ = init_dict.bitness();
+  }
+  if (init_dict.has_model()) {
+    model_ = init_dict.model();
+  }
+  if (init_dict.has_platform()) {
+    platform_ = init_dict.platform();
+  }
+  if (init_dict.has_ua_full_version()) {
+    ua_full_version_ = init_dict.ua_full_version();
+  }
+  if (init_dict.has_cobalt_build_number()) {
+    cobalt_build_number_ = init_dict.cobalt_build_number();
+  }
+  if (init_dict.has_cobalt_build_configuration()) {
+    cobalt_build_configuration_ = init_dict.cobalt_build_configuration();
+  }
+  if (init_dict.has_js_engine_version()) {
+    js_engine_version_ = init_dict.js_engine_version();
+  }
+  if (init_dict.has_rasterizer()) {
+    rasterizer_ = init_dict.rasterizer();
+  }
+  if (init_dict.has_evergreen_version()) {
+    evergreen_version_ = init_dict.evergreen_version();
+  }
+  if (init_dict.has_starboard_version()) {
+    starboard_version_ = init_dict.starboard_version();
+  }
+  if (init_dict.has_original_design_manufacturer()) {
+    original_design_manufacturer_ = init_dict.original_design_manufacturer();
+  }
+  if (init_dict.has_device_type()) {
+    device_type_ = init_dict.device_type();
+  }
+  if (init_dict.has_chipset()) {
+    chipset_ = init_dict.chipset();
+  }
+  if (init_dict.has_model_year()) {
+    model_year_ = init_dict.model_year();
+  }
+  if (init_dict.has_device_brand()) {
+    device_brand_ = init_dict.device_brand();
+  }
+  if (init_dict.has_connection_type()) {
+    connection_type_ = init_dict.connection_type();
+  }
+  if (init_dict.has_aux()) {
+    aux_ = init_dict.aux();
+  }
+}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/cobalt_ua_data_values_interface.h b/src/cobalt/dom/cobalt_ua_data_values_interface.h
new file mode 100644
index 0000000..e3ef570
--- /dev/null
+++ b/src/cobalt/dom/cobalt_ua_data_values_interface.h
@@ -0,0 +1,91 @@
+// Copyright 2021 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_COBALT_UA_DATA_VALUES_INTERFACE_H_
+#define COBALT_DOM_COBALT_UA_DATA_VALUES_INTERFACE_H_
+
+#include <string>
+
+#include "cobalt/dom/cobalt_ua_data_values.h"
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace dom {
+
+class CobaltUADataValuesInterface : public script::Wrappable {
+ public:
+  explicit CobaltUADataValuesInterface(const CobaltUADataValues& init_dict);
+
+  script::Sequence<NavigatorUABrandVersion> brands() const { return brands_; }
+  bool mobile() const { return mobile_; }
+  const std::string& platform() const { return platform_; }
+  const std::string& architecture() const { return architecture_; }
+  const std::string& bitness() const { return bitness_; }
+  const std::string& model() const { return model_; }
+  const std::string& platform_version() const { return platform_version_; }
+  const std::string& ua_full_version() const { return ua_full_version_; }
+  const std::string& cobalt_build_number() const {
+    return cobalt_build_number_;
+  }
+  const std::string& cobalt_build_configuration() const {
+    return cobalt_build_configuration_;
+  }
+  const std::string& js_engine_version() const { return js_engine_version_; }
+  const std::string& rasterizer() const { return rasterizer_; }
+  const std::string& evergreen_version() const { return evergreen_version_; }
+  const std::string& starboard_version() const { return starboard_version_; }
+  const std::string& original_design_manufacturer() const {
+    return original_design_manufacturer_;
+  }
+  const std::string& device_type() const { return device_type_; }
+  const std::string& chipset() const { return chipset_; }
+  const std::string& model_year() const { return model_year_; }
+  const std::string& device_brand() const { return device_brand_; }
+  const std::string& connection_type() const { return connection_type_; }
+  const std::string& aux() const { return aux_; }
+
+  DEFINE_WRAPPABLE_TYPE(CobaltUADataValuesInterface);
+
+ private:
+  ~CobaltUADataValuesInterface() override {}
+
+  script::Sequence<NavigatorUABrandVersion> brands_;
+  bool mobile_;
+  std::string platform_;
+  std::string architecture_;
+  std::string bitness_;
+  std::string model_;
+  std::string platform_version_;
+  std::string ua_full_version_;
+  std::string cobalt_build_number_;
+  std::string cobalt_build_configuration_;
+  std::string js_engine_version_;
+  std::string rasterizer_;
+  std::string evergreen_version_;
+  std::string starboard_version_;
+  std::string original_design_manufacturer_;
+  std::string device_type_;
+  std::string chipset_;
+  std::string model_year_;
+  std::string device_brand_;
+  std::string connection_type_;
+  std::string aux_;
+
+  DISALLOW_COPY_AND_ASSIGN(CobaltUADataValuesInterface);
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_COBALT_UA_DATA_VALUES_INTERFACE_H_
diff --git a/src/cobalt/dom/cobalt_ua_data_values_interface.idl b/src/cobalt/dom/cobalt_ua_data_values_interface.idl
new file mode 100644
index 0000000..179ac91
--- /dev/null
+++ b/src/cobalt/dom/cobalt_ua_data_values_interface.idl
@@ -0,0 +1,41 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Custom, not in spec. Interface wrapper for CobaltUADataValues to make
+// compatible with Promises implementation in Cobalt.
+
+[Constructor(CobaltUADataValues cobaltUADataValues)]
+interface CobaltUADataValuesInterface {
+  readonly attribute sequence<NavigatorUABrandVersion> brands;
+  readonly attribute boolean mobile;
+  readonly attribute DOMString platform;
+  readonly attribute DOMString architecture;
+  readonly attribute DOMString bitness;
+  readonly attribute DOMString model;
+  readonly attribute DOMString platformVersion;
+  readonly attribute DOMString uaFullVersion;
+  readonly attribute DOMString cobaltBuildNumber;
+  readonly attribute DOMString cobaltBuildConfiguration;
+  readonly attribute DOMString jsEngineVersion;
+  readonly attribute DOMString rasterizer;
+  readonly attribute DOMString evergreenVersion;
+  readonly attribute DOMString starboardVersion;
+  readonly attribute DOMString originalDesignManufacturer;
+  readonly attribute DOMString deviceType;
+  readonly attribute DOMString chipset;
+  readonly attribute DOMString modelYear;
+  readonly attribute DOMString deviceBrand;
+  readonly attribute DOMString connectionType;
+  readonly attribute DOMString aux;
+};
diff --git a/src/cobalt/dom/custom_event_test.cc b/src/cobalt/dom/custom_event_test.cc
index 083c08f..4a3c1e7 100644
--- a/src/cobalt/dom/custom_event_test.cc
+++ b/src/cobalt/dom/custom_event_test.cc
@@ -75,7 +75,7 @@
         base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(),
         fetcher_factory_.get(), loader_factory_.get(), NULL, NULL, NULL, NULL,
         NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL,
-        global_environment_->script_value_factory(), NULL, NULL, url_, "",
+        global_environment_->script_value_factory(), NULL, NULL, url_, "", NULL,
         "en-US", "en", base::Callback<void(const GURL&)>(),
         base::Bind(&MockErrorCallback::Run,
                    base::Unretained(&mock_error_callback_)),
diff --git a/src/cobalt/dom/dom.gyp b/src/cobalt/dom/dom.gyp
index 93b5c44..4039e2c 100644
--- a/src/cobalt/dom/dom.gyp
+++ b/src/cobalt/dom/dom.gyp
@@ -53,6 +53,8 @@
         'cdata_section.h',
         'character_data.cc',
         'character_data.h',
+        'cobalt_ua_data_values_interface.cc',
+        'cobalt_ua_data_values_interface.h',
         'comment.cc',
         'comment.h',
         'crypto.cc',
@@ -236,6 +238,7 @@
         'named_node_map.h',
         'navigator.cc',
         'navigator.h',
+        'navigator_ua_data.cc',
         'navigator_ua_data.h',
         'node.cc',
         'node.h',
@@ -259,6 +262,12 @@
         'performance_entry.h',
         'performance_entry_list_impl.cc',
         'performance_entry_list_impl.h',
+        'performance_lifecycle_timing.cc',
+        'performance_lifecycle_timing.h',
+        'performance_mark.cc',
+        'performance_mark.h',
+        'performance_measure.cc',
+        'performance_measure.h',
         'performance_observer.cc',
         'performance_observer.h',
         'performance_observer_entry_list.cc',
@@ -324,6 +333,7 @@
         'url_registry.h',
         'url_utils.cc',
         'url_utils.h',
+        'user_agent_platform_info.h',
         'video_track.h',
         'video_track_list.h',
         'wheel_event.cc',
diff --git a/src/cobalt/dom/eme/media_key_session.h b/src/cobalt/dom/eme/media_key_session.h
index e95c7de..f9886b5 100644
--- a/src/cobalt/dom/eme/media_key_session.h
+++ b/src/cobalt/dom/eme/media_key_session.h
@@ -102,9 +102,6 @@
   bool callable_;
   scoped_refptr<MediaKeyStatusMap> key_status_map_;
 
-  // TODO: Remove |closed_callback_| and change call sites to use closed()
-  //       promise instead, once Cobalt switches to native SpiderMonkey
-  //       promises.
   const ClosedCallback closed_callback_;
   const VoidPromiseValue::Reference closed_promise_reference_;
 
diff --git a/src/cobalt/dom/error_event_test.cc b/src/cobalt/dom/error_event_test.cc
index 7f431a7..8cbfdec 100644
--- a/src/cobalt/dom/error_event_test.cc
+++ b/src/cobalt/dom/error_event_test.cc
@@ -77,7 +77,7 @@
         css_parser_.get(), dom_parser_.get(), fetcher_factory_.get(),
         loader_factory_.get(), NULL, NULL, NULL, NULL, NULL, NULL,
         &local_storage_database_, NULL, NULL, NULL, NULL,
-        global_environment_->script_value_factory(), NULL, NULL, url_, "",
+        global_environment_->script_value_factory(), NULL, NULL, url_, "", NULL,
         "en-US", "en", base::Callback<void(const GURL&)>(),
         base::Bind(&MockLoadCompleteCallback::Run,
                    base::Unretained(&mock_load_complete_callback_)),
diff --git a/src/cobalt/dom/html_element_factory.cc b/src/cobalt/dom/html_element_factory.cc
index a753273..ad47e8d 100644
--- a/src/cobalt/dom/html_element_factory.cc
+++ b/src/cobalt/dom/html_element_factory.cc
@@ -67,26 +67,26 @@
 bool IsBlacklistedTag(const char* tag, int length) {
   switch (length) {
     case 9:
-      if (SbStringCompareAll(tag, "font-face") == 0) {
+      if (strcmp(tag, "font-face") == 0) {
         return true;
       }
       break;
     case 13:
-      if (SbStringCompareAll(tag, "font-face-src") == 0 ||
-          SbStringCompareAll(tag, "missing-glyph") == 0 ||
-          SbStringCompareAll(tag, "color-profile") == 0 ||
-          SbStringCompareAll(tag, "font-face-uri") == 0) {
+      if (strcmp(tag, "font-face-src") == 0 ||
+          strcmp(tag, "missing-glyph") == 0 ||
+          strcmp(tag, "color-profile") == 0 ||
+          strcmp(tag, "font-face-uri") == 0) {
         return true;
       }
       break;
     case 14:
-      if (SbStringCompareAll(tag, "font-face-name") == 0 ||
-          SbStringCompareAll(tag, "annotation-xml") == 0) {
+      if (strcmp(tag, "font-face-name") == 0 ||
+          strcmp(tag, "annotation-xml") == 0) {
         return true;
       }
       break;
     case 16:
-      if (SbStringCompareAll(tag, "font-face-format") == 0) {
+      if (strcmp(tag, "font-face-format") == 0) {
         return true;
       }
       break;
diff --git a/src/cobalt/dom/html_link_element.cc b/src/cobalt/dom/html_link_element.cc
index 7181f4d..3e398c7 100644
--- a/src/cobalt/dom/html_link_element.cc
+++ b/src/cobalt/dom/html_link_element.cc
@@ -45,7 +45,7 @@
   bool is_valid_format = true;
   while (tokenizer.GetNext()) {
     std::string token = tokenizer.token();
-    if (SbStringCompareAll(token.c_str(), "splashscreen") == 0) {
+    if (strcmp(token.c_str(), "splashscreen") == 0) {
       is_valid_format = true;
     } else {
       for (char const& c : token) {
@@ -279,6 +279,9 @@
     // complete.
     node_document()->DecreaseLoadingCounterAndMaybeDispatchLoadEvent();
   }
+
+  // GetLoadTimingInfo and create resource timing before loader released.
+  GetLoadTimingInfoAndCreateResourceTiming();
 }
 
 void HTMLLinkElement::OnSplashscreenLoaded(Document* document,
@@ -313,8 +316,6 @@
 void HTMLLinkElement::ReleaseLoader() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(loader_);
-  // GetLoadTimingInfo from loader before reset.
-  GetLoadTimingInfoAndCreateResourceTiming();
   loader_.reset();
 }
 
@@ -327,8 +328,10 @@
 
 void HTMLLinkElement::GetLoadTimingInfoAndCreateResourceTiming() {
   if (html_element_context()->performance() == nullptr) return;
-  html_element_context()->performance()->CreatePerformanceResourceTiming(
-      loader_->get_load_timing_info(), kTagName, absolute_url_.spec());
+  if (loader_) {
+    html_element_context()->performance()->CreatePerformanceResourceTiming(
+        loader_->get_load_timing_info(), kTagName, absolute_url_.spec());
+  }
 }
 
 }  // namespace dom
diff --git a/src/cobalt/dom/html_script_element.cc b/src/cobalt/dom/html_script_element.cc
index 7a536f7..ad9386e 100644
--- a/src/cobalt/dom/html_script_element.cc
+++ b/src/cobalt/dom/html_script_element.cc
@@ -596,6 +596,9 @@
   // once the resource has been fetched (defined above) has been run.
   document_->DecreaseLoadingCounterAndMaybeDispatchLoadEvent();
 
+  // GetLoadTimingInfo and create resource timing before loader released.
+  GetLoadTimingInfoAndCreateResourceTiming();
+
   // Post a task to release the loader.
   base::MessageLoop::current()->task_runner()->PostTask(
       FROM_HERE, base::Bind(&HTMLScriptElement::ReleaseLoader, this));
@@ -720,15 +723,15 @@
 void HTMLScriptElement::ReleaseLoader() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(loader_);
-  // GetLoadTimingInfo from loader before reset.
-  GetLoadTimingInfoAndCreateResourceTiming();
   loader_.reset();
 }
 
 void HTMLScriptElement::GetLoadTimingInfoAndCreateResourceTiming() {
   if (html_element_context()->performance() == nullptr) return;
-  html_element_context()->performance()->CreatePerformanceResourceTiming(
+  if (loader_) {
+    html_element_context()->performance()->CreatePerformanceResourceTiming(
       loader_->get_load_timing_info(), kTagName, url_.spec());
+  }
 }
 
 }  // namespace dom
diff --git a/src/cobalt/dom/message_event.cc b/src/cobalt/dom/message_event.cc
index f7843aa..fa4359c 100644
--- a/src/cobalt/dom/message_event.cc
+++ b/src/cobalt/dom/message_event.cc
@@ -46,7 +46,7 @@
 MessageEvent::ResponseTypeCode MessageEvent::GetResponseTypeCode(
     base::StringPiece to_match) {
   for (std::size_t i = 0; i != arraysize(kResponseTypes); ++i) {
-    if (SbStringCompare(kResponseTypes[i], to_match.data(), to_match.size()) ==
+    if (strncmp(kResponseTypes[i], to_match.data(), to_match.size()) ==
         0) {
       return MessageEvent::ResponseTypeCode(i);
     }
diff --git a/src/cobalt/dom/navigator.cc b/src/cobalt/dom/navigator.cc
index f02ade8..55fbf20 100644
--- a/src/cobalt/dom/navigator.cc
+++ b/src/cobalt/dom/navigator.cc
@@ -145,10 +145,12 @@
 
 Navigator::Navigator(
     script::EnvironmentSettings* settings, const std::string& user_agent,
-    const std::string& language,
+    UserAgentPlatformInfo* platform_info, const std::string& language,
     scoped_refptr<cobalt::dom::captions::SystemCaptionSettings> captions,
     script::ScriptValueFactory* script_value_factory)
     : user_agent_(user_agent),
+      user_agent_data_(
+          new NavigatorUAData(platform_info, script_value_factory)),
       language_(language),
       mime_types_(new MimeTypeArray()),
       plugins_(new PluginArray()),
diff --git a/src/cobalt/dom/navigator.h b/src/cobalt/dom/navigator.h
index b679176..29e68cd 100644
--- a/src/cobalt/dom/navigator.h
+++ b/src/cobalt/dom/navigator.h
@@ -43,7 +43,7 @@
  public:
   Navigator(
       script::EnvironmentSettings* settings, const std::string& user_agent,
-      const std::string& language,
+      UserAgentPlatformInfo* platform_info, const std::string& language,
       scoped_refptr<cobalt::dom::captions::SystemCaptionSettings> captions,
       script::ScriptValueFactory* script_value_factory);
 
diff --git a/src/cobalt/dom/navigator.idl b/src/cobalt/dom/navigator.idl
index acbf4b8..6a21520 100644
--- a/src/cobalt/dom/navigator.idl
+++ b/src/cobalt/dom/navigator.idl
@@ -17,7 +17,6 @@
 interface Navigator {};
 
 Navigator implements NavigatorID;
-Navigator implements NavigatorUA;
 Navigator implements NavigatorLanguage;
 Navigator implements NavigatorPlugins;
 Navigator implements NavigatorStorageUtils;
diff --git a/src/cobalt/dom/navigator_licenses_test.cc b/src/cobalt/dom/navigator_licenses_test.cc
index cc55b6b..69030d1 100644
--- a/src/cobalt/dom/navigator_licenses_test.cc
+++ b/src/cobalt/dom/navigator_licenses_test.cc
@@ -23,7 +23,7 @@
 TEST(NavigatorLicensesTest, NonEmpty) {
   testing::StubEnvironmentSettings environment_settings;
   scoped_refptr<cobalt::dom::Navigator> navigator =
-      new cobalt::dom::Navigator(&environment_settings, std::string(),
+      new cobalt::dom::Navigator(&environment_settings, std::string(), NULL,
                                  std::string(), nullptr, nullptr);
 
   ASSERT_TRUE(navigator != nullptr);
diff --git a/src/cobalt/dom/navigator_ua.idl b/src/cobalt/dom/navigator_ua.idl
index 3f10c9d..74780fa 100644
--- a/src/cobalt/dom/navigator_ua.idl
+++ b/src/cobalt/dom/navigator_ua.idl
@@ -13,6 +13,11 @@
 // limitations under the License.
 
 // https://wicg.github.io/ua-client-hints/#navigatorua
+// Accessing this interface through JavaScript via "navigator.userAgentData" is
+// currently disabled by default; we inject the interface via H5vccSettings
+// per user request.
+// In the future, we can enable this interface by default by adding "Navigator
+// implements NavigatorUA" to navigator.idl
 
 [NoInterfaceObject]
 interface NavigatorUA {
diff --git a/src/cobalt/dom/navigator_ua_data.cc b/src/cobalt/dom/navigator_ua_data.cc
new file mode 100644
index 0000000..2d19869
--- /dev/null
+++ b/src/cobalt/dom/navigator_ua_data.cc
@@ -0,0 +1,160 @@
+// Copyright 2021 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/navigator_ua_data.h"
+
+#include "base/strings/stringprintf.h"
+
+namespace cobalt {
+namespace dom {
+
+NavigatorUAData::NavigatorUAData(
+    UserAgentPlatformInfo* platform_info,
+    script::ScriptValueFactory* script_value_factory)
+    : script_value_factory_(script_value_factory) {
+  if (platform_info == nullptr) {
+    SB_DLOG(WARNING)
+        << "No UserAgentPlatformInfo object passed to NavigatorUAData";
+    return;
+  }
+  NavigatorUABrandVersion cobalt_brand;
+  cobalt_brand.set_brand("Cobalt");
+  cobalt_brand.set_version(platform_info->cobalt_version());
+  brands_.push_back(cobalt_brand);
+
+  mobile_ = false;
+  platform_ = platform_info->os_name_and_version();
+
+  all_high_entropy_values_.set_brands(brands_);
+  all_high_entropy_values_.set_mobile(mobile_);
+  all_high_entropy_values_.set_platform(platform_);
+#if SB_API_VERSION >= 12
+  all_high_entropy_values_.set_architecture(SB_SABI_TARGET_ARCH);
+  all_high_entropy_values_.set_bitness(SB_SABI_WORD_SIZE);
+#endif
+  all_high_entropy_values_.set_model(platform_info->model().value_or(""));
+  all_high_entropy_values_.set_platform_version(
+      platform_info->firmware_version().value_or(""));
+  all_high_entropy_values_.set_ua_full_version(
+      base::StringPrintf("%s.%s-%s", platform_info->cobalt_version().c_str(),
+                         platform_info->cobalt_build_version_number().c_str(),
+                         platform_info->build_configuration().c_str()));
+  all_high_entropy_values_.set_cobalt_build_number(
+      platform_info->cobalt_build_version_number());
+  all_high_entropy_values_.set_cobalt_build_configuration(
+      platform_info->build_configuration());
+  all_high_entropy_values_.set_js_engine_version(
+      platform_info->javascript_engine_version());
+  all_high_entropy_values_.set_rasterizer(platform_info->rasterizer_type());
+  all_high_entropy_values_.set_evergreen_version(
+      platform_info->evergreen_version());
+  all_high_entropy_values_.set_starboard_version(
+      platform_info->starboard_version());
+  all_high_entropy_values_.set_original_design_manufacturer(
+      platform_info->original_design_manufacturer().value_or(""));
+  all_high_entropy_values_.set_device_type(platform_info->device_type_string());
+  all_high_entropy_values_.set_chipset(
+      platform_info->chipset_model_number().value_or(""));
+  all_high_entropy_values_.set_model_year(
+      platform_info->model_year().value_or(""));
+  all_high_entropy_values_.set_device_brand(
+      platform_info->brand().value_or(""));
+  all_high_entropy_values_.set_connection_type(
+      platform_info->connection_type_string());
+  all_high_entropy_values_.set_aux(platform_info->aux_field());
+
+  low_entropy_json_.set_brands(brands_);
+  low_entropy_json_.set_mobile(mobile_);
+  low_entropy_json_.set_platform(platform_);
+}
+
+script::Handle<NavigatorUAData::InterfacePromise>
+NavigatorUAData::GetHighEntropyValues(script::Sequence<std::string> hints) {
+  // https://wicg.github.io/ua-client-hints/#getHighEntropyValues
+  CobaltUADataValues select_high_entropy_values_;
+
+  // Set brands, mobile, and platform
+  select_high_entropy_values_.set_brands(all_high_entropy_values_.brands());
+  select_high_entropy_values_.set_mobile(all_high_entropy_values_.mobile());
+  select_high_entropy_values_.set_platform(all_high_entropy_values_.platform());
+
+  // Set other hints if specified
+  for (script::Sequence<std::string>::iterator it = hints.begin();
+       it != hints.end(); ++it) {
+    if ((*it).compare("architecture") == 0) {
+      select_high_entropy_values_.set_architecture(
+          all_high_entropy_values_.architecture());
+    } else if ((*it).compare("bitness") == 0) {
+      select_high_entropy_values_.set_bitness(
+          all_high_entropy_values_.bitness());
+    } else if ((*it).compare("model") == 0) {
+      select_high_entropy_values_.set_model(all_high_entropy_values_.model());
+    } else if ((*it).compare("platformVersion") == 0) {
+      select_high_entropy_values_.set_platform_version(
+          all_high_entropy_values_.platform_version());
+    } else if ((*it).compare("uaFullVersion") == 0) {
+      select_high_entropy_values_.set_ua_full_version(
+          all_high_entropy_values_.ua_full_version());
+    } else if ((*it).compare("cobaltBuildNumber") == 0) {
+      select_high_entropy_values_.set_cobalt_build_number(
+          all_high_entropy_values_.cobalt_build_number());
+    } else if ((*it).compare("cobaltBuildConfiguration") == 0) {
+      select_high_entropy_values_.set_cobalt_build_configuration(
+          all_high_entropy_values_.cobalt_build_configuration());
+    } else if ((*it).compare("jsEngineVersion") == 0) {
+      select_high_entropy_values_.set_js_engine_version(
+          all_high_entropy_values_.js_engine_version());
+    } else if ((*it).compare("rasterizer") == 0) {
+      select_high_entropy_values_.set_rasterizer(
+          all_high_entropy_values_.rasterizer());
+    } else if ((*it).compare("evergreenVersion") == 0) {
+      select_high_entropy_values_.set_evergreen_version(
+          all_high_entropy_values_.evergreen_version());
+    } else if ((*it).compare("starboardVersion") == 0) {
+      select_high_entropy_values_.set_starboard_version(
+          all_high_entropy_values_.starboard_version());
+    } else if ((*it).compare("originalDesignManufacturer") == 0) {
+      select_high_entropy_values_.set_original_design_manufacturer(
+          all_high_entropy_values_.original_design_manufacturer());
+    } else if ((*it).compare("deviceType") == 0) {
+      select_high_entropy_values_.set_device_type(
+          all_high_entropy_values_.device_type());
+    } else if ((*it).compare("chipset") == 0) {
+      select_high_entropy_values_.set_chipset(
+          all_high_entropy_values_.chipset());
+    } else if ((*it).compare("modelYear") == 0) {
+      select_high_entropy_values_.set_model_year(
+          all_high_entropy_values_.model_year());
+    } else if ((*it).compare("deviceBrand") == 0) {
+      select_high_entropy_values_.set_device_brand(
+          all_high_entropy_values_.device_brand());
+    } else if ((*it).compare("connectionType") == 0) {
+      select_high_entropy_values_.set_connection_type(
+          all_high_entropy_values_.connection_type());
+    } else if ((*it).compare("aux") == 0) {
+      select_high_entropy_values_.set_aux(all_high_entropy_values_.aux());
+    }
+  }
+
+  script::Handle<InterfacePromise> promise =
+      script_value_factory_->CreateInterfacePromise<
+          scoped_refptr<CobaltUADataValuesInterface>>();
+  scoped_refptr<CobaltUADataValuesInterface> promise_result(
+      new CobaltUADataValuesInterface(select_high_entropy_values_));
+  promise->Resolve(promise_result);
+  return promise;
+}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/navigator_ua_data.h b/src/cobalt/dom/navigator_ua_data.h
index 1878093..8b2a7b5 100644
--- a/src/cobalt/dom/navigator_ua_data.h
+++ b/src/cobalt/dom/navigator_ua_data.h
@@ -17,10 +17,13 @@
 
 #include <string>
 
-#include "cobalt/dom/cobalt_ua_data_values.h"
+#include "cobalt/dom/cobalt_ua_data_values_interface.h"
 #include "cobalt/dom/navigator_ua_brand_version.h"
 #include "cobalt/dom/ua_low_entropy_json.h"
+#include "cobalt/dom/user_agent_platform_info.h"
 #include "cobalt/script/promise.h"
+#include "cobalt/script/script_value.h"
+#include "cobalt/script/script_value_factory.h"
 #include "cobalt/script/sequence.h"
 #include "cobalt/script/wrappable.h"
 
@@ -31,7 +34,10 @@
 // https://wicg.github.io/ua-client-hints/#navigatoruadata
 class NavigatorUAData : public script::Wrappable {
  public:
-  NavigatorUAData() {}
+  using InterfacePromise = script::Promise<scoped_refptr<script::Wrappable>>;
+
+  NavigatorUAData(UserAgentPlatformInfo* platform_info,
+                  script::ScriptValueFactory* script_value_factory);
 
   script::Sequence<NavigatorUABrandVersion> brands() const { return brands_; }
 
@@ -39,10 +45,8 @@
 
   std::string platform() const { return platform_; }
 
-  script::Handle<script::Promise<CobaltUADataValues>> GetHighEntropyValues(
-      script::Sequence<std::string> hints) {
-    return high_entropy_values_;
-  }
+  script::Handle<InterfacePromise> GetHighEntropyValues(
+      script::Sequence<std::string> hints);
 
   UALowEntropyJSON ToJSON() { return low_entropy_json_; }
 
@@ -54,8 +58,9 @@
   script::Sequence<NavigatorUABrandVersion> brands_;
   bool mobile_;
   std::string platform_;
-  script::Handle<script::Promise<CobaltUADataValues>> high_entropy_values_;
+  CobaltUADataValues all_high_entropy_values_;
   UALowEntropyJSON low_entropy_json_;
+  script::ScriptValueFactory* script_value_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(NavigatorUAData);
 };
diff --git a/src/cobalt/dom/navigator_ua_data.idl b/src/cobalt/dom/navigator_ua_data.idl
index 5d1bf3e..3eacfb5 100644
--- a/src/cobalt/dom/navigator_ua_data.idl
+++ b/src/cobalt/dom/navigator_ua_data.idl
@@ -20,6 +20,8 @@
   readonly attribute sequence<NavigatorUABrandVersion> brands;
   readonly attribute boolean mobile;
   readonly attribute DOMString platform;
-  Promise<CobaltUADataValues> getHighEntropyValues(sequence<DOMString> hints);
+  // TODO make this a Promise<CobaltUADataValues> when support for dictionary
+  // Promises becomes available in Cobalt
+  Promise<CobaltUADataValuesInterface> getHighEntropyValues(sequence<DOMString> hints);
   UALowEntropyJSON toJSON();
 };
diff --git a/src/cobalt/dom/on_screen_keyboard_test.cc b/src/cobalt/dom/on_screen_keyboard_test.cc
index 701c842..08760bb 100644
--- a/src/cobalt/dom/on_screen_keyboard_test.cc
+++ b/src/cobalt/dom/on_screen_keyboard_test.cc
@@ -212,7 +212,7 @@
             NULL, NULL, NULL,
             global_environment_
                 ->script_value_factory() /* script_value_factory */,
-            NULL, NULL, url_, "", "en-US", "en",
+            NULL, NULL, url_, "", NULL, "en-US", "en",
             base::Callback<void(const GURL&)>(),
             base::Bind(&MockErrorCallback::Run,
                        base::Unretained(&mock_error_callback_)),
diff --git a/src/cobalt/dom/performance.cc b/src/cobalt/dom/performance.cc
index 94a50bc..2428bc5 100644
--- a/src/cobalt/dom/performance.cc
+++ b/src/cobalt/dom/performance.cc
@@ -14,33 +14,109 @@
 
 #include "cobalt/dom/performance.h"
 
+#include <string>
+
 #include "base/time/time.h"
+#include "base/time/default_clock.h"
 #include "cobalt/browser/stack_size_constants.h"
+#include "cobalt/dom/dom_exception.h"
 #include "cobalt/dom/memory_info.h"
 #include "cobalt/dom/performance_entry.h"
+#include "cobalt/dom/performance_mark.h"
+#include "cobalt/dom/performance_measure.h"
 
 namespace cobalt {
 namespace dom {
 
+namespace {
+
+base::TimeDelta GetUnixAtZeroMonotonic(const base::Clock* clock,
+                                         const base::TickClock* tick_clock) {
+  base::TimeDelta unix_time_now = clock->Now() - base::Time::UnixEpoch();
+  base::TimeDelta time_since_origin = tick_clock->NowTicks().since_origin();
+  return unix_time_now - time_since_origin;
+}
+
+bool IsNamePerformanceTimingAttribute(const std::string& name) {
+  return name == "navigationStart";
+}
+
+DOMHighResTimeStamp ConvertNameToTimestamp(
+    const std::string& name, script::ExceptionState* exception_state) {
+  // The algorithm of ConvertNameToTimestamp() follows these steps:
+  //   https://www.w3.org/TR/user-timing/#convert-a-name-to-a-timestamp
+  // 1. If the global object is not a Window object, throw a SyntaxError.
+  // 2. If name is navigationStart, return 0.
+  if (name == "navigationStart") {
+    return 0.0;
+  }
+
+  // 3. Let startTime be the value of navigationStart in the PerformanceTiming
+  // interface.
+  // 4. Let endTime be the value of name in the PerformanceTiming interface.
+  // 5. If endTime is 0, throw an InvalidAccessError.
+  // 6. Return result of subtracting startTime from endTime.
+
+  // Note that we only support navigationStart in the PerformanceTiming
+  // interface. We return 0.0 instead of the result of subtracting
+  // startTime from endTime.
+  dom::DOMException::Raise(dom::DOMException::kSyntaxErr,
+                           "Cannot convert a name that is not a public "
+                           "attribute of PerformanceTiming to a timestamp",
+                           exception_state);
+  return 0.0;
+}
+
+}  //namespace
+
 Performance::Performance(script::EnvironmentSettings* settings,
                          const scoped_refptr<base::BasicClock>& clock)
     : EventTarget(settings),
-      timing_(new PerformanceTiming(clock)),
+      time_origin_(base::TimeTicks::Now()),
+      tick_clock_(base::DefaultTickClock::GetInstance()),
+      timing_(new PerformanceTiming(clock, time_origin_)),
       memory_(new MemoryInfo()),
-      time_origin_(base::Time::Now() - base::Time::UnixEpoch()),
+      lifecycle_timing_(
+          new PerformanceLifecycleTiming("lifecycle timing", 0.0, 0.0)),
       resource_timing_buffer_size_limit_(
           Performance::kMaxResourceTimingBufferSize),
       resource_timing_buffer_current_size_(0),
       resource_timing_buffer_full_event_pending_flag_(false),
       resource_timing_secondary_buffer_current_size_(0),
       performance_observer_task_queued_flag_(false),
-      add_to_performance_entry_buffer_flag_(false) {}
+      add_to_performance_entry_buffer_flag_(false) {
+  unix_at_zero_monotonic_ = GetUnixAtZeroMonotonic(
+      base::DefaultClock::GetInstance(), tick_clock_);
+  QueuePerformanceEntry(lifecycle_timing_);
+}
+
+// static
+DOMHighResTimeStamp Performance::MonotonicTimeToDOMHighResTimeStamp(
+      base::TimeTicks time_origin,
+      base::TimeTicks monotonic_time) {
+  if (monotonic_time.is_null() || time_origin.is_null())
+    return 0.0;
+  DOMHighResTimeStamp clamped_time =
+      ClampTimeStampMinimumResolution(monotonic_time,
+      Performance::kPerformanceTimerMinResolutionInMicroseconds) -
+      ClampTimeStampMinimumResolution(time_origin,
+      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+
+  if (clamped_time < 0)
+    return 0.0;
+  return clamped_time;
+}
+
+DOMHighResTimeStamp Performance::MonotonicTimeToDOMHighResTimeStamp(
+    base::TimeTicks monotonic_time) const {
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+                                                         monotonic_time);
+}
 
 DOMHighResTimeStamp Performance::Now() const {
-  base::TimeDelta now = base::Time::Now() - base::Time::UnixEpoch();
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      now - time_origin_,
-      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  // Now stores the current high resolution time.
+  //   https://www.w3.org/TR/2019/REC-hr-time-2-20191121/#dfn-current-high-resolution-time
+  return MonotonicTimeToDOMHighResTimeStamp(tick_clock_->NowTicks());
 }
 
 scoped_refptr<PerformanceTiming> Performance::timing() const { return timing_; }
@@ -51,19 +127,177 @@
   // The algorithm for calculating time origin timestamp.
   //   https://www.w3.org/TR/2019/REC-hr-time-2-20191121/#dfn-time-origin-timestamp
   // Assert that global's time origin is not undefined.
-  DCHECK(!time_origin_.is_zero());
+  DCHECK(!time_origin_.is_null());
 
   // Let t1 be the DOMHighResTimeStamp representing the high resolution
   // time at which the global monotonic clock is zero.
-  base::TimeDelta t1 = base::Time::UnixEpoch().ToDeltaSinceWindowsEpoch();
+  base::TimeDelta t1 = unix_at_zero_monotonic_;
 
   // Let t2 be the DOMHighResTimeStamp representing the high resolution
   // time value of the global monotonic clock at global's time origin.
-  base::TimeDelta t2 = time_origin_;
+  base::TimeDelta t2 = time_origin_ - base::TimeTicks();
 
   // Return the sum of t1 and t2.
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      t1 + t2, Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  return ClampTimeStampMinimumResolution(
+      t1 + t2,
+      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+}
+
+void Performance::Mark(const std::string& mark_name,
+                       script::ExceptionState* exception_state) {
+  // The algorithm for mark() follows these steps:
+  //   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#mark-method
+  // 1. If the global object is a Window object and markName uses the same name
+  // as a read only attribute in the PerformanceTiming interface, throw a
+  // SyntaxError.
+  if (IsNamePerformanceTimingAttribute(mark_name)) {
+    dom::DOMException::Raise(
+        dom::DOMException::kSyntaxErr,
+        "Cannot create a mark with the same name as a read-only attribute in "
+        "the PerformanceTiming interface",
+        exception_state);
+  }
+
+  // 2. Create a new PerformanceMark object (entry).
+  // 3. Set entry's name attribute to markName.
+  // 4. Set entry's entryType attribute to DOMString "mark".
+  // 5. Set entry's startTime attribute to the value that would be returned by
+  // the Performance object's now() method.
+  // 6. Set entry's duration attribute to 0.
+  scoped_refptr<PerformanceMark> entry =
+      base::MakeRefCounted<PerformanceMark>(mark_name, Now());
+
+  // 7. Queue entry.
+  QueuePerformanceEntry(entry);
+
+  // 8. Add entry to the performance entry buffer.
+  performance_entry_buffer_.push_back(entry);
+
+  // 9. Return undefined
+}
+
+void Performance::ClearMarks(const std::string& mark_name) {
+  // The algorithm for clearMarks follows these steps:
+  //   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#clearmarks-method
+  // 1. If markName is omitted, remove all PerformanceMark objects from the
+  // performance entry buffer.
+  // 2. Otherwise, remove all PerformanceMark objects listed in the performance
+  // entry buffer whose name matches markName.
+  PerformanceEntryList retained_performance_entry_buffer;
+  for (const auto& entry : performance_entry_buffer_) {
+    bool should_remove_entry =
+        PerformanceEntry::ToEntryTypeEnum(entry->entry_type()) ==
+            PerformanceEntry::kMark &&
+        (mark_name.empty() || entry->name() == mark_name);
+    if (!should_remove_entry) {
+      retained_performance_entry_buffer.push_back(entry);
+    }
+  }
+  performance_entry_buffer_.swap(retained_performance_entry_buffer);
+
+  // 3. Return undefined.
+}
+
+void Performance::Measure(const std::string& measure_name,
+                          const std::string& start_mark,
+                          const std::string& end_mark,
+                          script::ExceptionState* exception_state) {
+  // The algorithm for measure() follows these steps:
+  //   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#measure-method
+  // 1. Let end time be 0.
+  DOMHighResTimeStamp end_time = 0.0;
+
+  // 2. If endMark is omitted, let end time be the value that would be returned
+  // by the Performance object's now() method.
+  if (end_mark.empty()) {
+    end_time = Now();
+  } else if (IsNamePerformanceTimingAttribute(end_mark)) {
+    // 2.1. Otherwise, if endMark has the same name as a read only attribute in
+    // the PerformanceTiming interface, let end time be the value returned by
+    // running the convert a name to a timestamp algorithm with name set to the
+    // value of endMark.
+    end_time = ConvertNameToTimestamp(end_mark, exception_state);
+  } else {
+    // 2.2. Otherwise let end time be the value of the startTime attribute from
+    // the most recent occurrence of a PerformanceMark object in the performance
+    // entry buffer whose name matches the value of endMark. If no matching
+    // entry is found, throw a SyntaxError.
+    PerformanceEntryList list = GetEntriesByName(end_mark, "mark");
+    if (list.empty()) {
+      dom::DOMException::Raise(
+          dom::DOMException::kSyntaxErr,
+          "Cannot create measure; no mark found with name: " + end_mark + ".",
+          exception_state);
+      return;
+    }
+    end_time = list.at(list.size() - 1)->start_time();
+  }
+
+  DOMHighResTimeStamp start_time;
+  // 3. If startMark is omitted, let start time be 0.
+  if (start_mark.empty()) {
+    start_time = 0.0;
+  } else if (IsNamePerformanceTimingAttribute(start_mark)) {
+    // 3.1. If startMark has the same name as a read only attribute in the
+    // PerformanceTiming interface, let start time be the value returned by
+    // running the convert a name to a timestamp algorithm with name set to
+    // startMark.
+    start_time = ConvertNameToTimestamp(start_mark, exception_state);
+  } else {
+    // 3.2. Otherwise let start time be the value of the startTime attribute
+    // from the most recent occurrence of a PerformanceMark object in the
+    // performance entry buffer whose name matches the value of startMark. If no
+    // matching entry is found, throw a SyntaxError.
+    PerformanceEntryList list = GetEntriesByName(start_mark, "mark");
+    if (list.empty()) {
+      dom::DOMException::Raise(
+          dom::DOMException::kSyntaxErr,
+          "Cannot create measure; no mark found with name: " + start_mark + ".",
+          exception_state);
+      return;
+    }
+    start_time = list.at(list.size() - 1)->start_time();
+  }
+
+  // 4. Create a new PerformanceMeasure object (entry).
+  // 5. Set entry's name attribute to measureName.
+  // 6. Set entry's entryType attribute to DOMString "measure".
+  // 7. Set entry's startTime attribute to start time.
+  // 8. Set entry's duration attribute to the duration from start time to end
+  // time. The resulting duration value MAY be negative.
+  scoped_refptr<PerformanceMeasure> entry =
+      base::MakeRefCounted<PerformanceMeasure>(measure_name, start_time,
+                                               end_time);
+
+  // 9. Queue entry.
+  QueuePerformanceEntry(entry);
+
+  // 10. Add entry to the performance entry buffer.
+  performance_entry_buffer_.push_back(entry);
+
+  // 11. Return undefined.
+}
+
+void Performance::ClearMeasures(const std::string& measure_name) {
+  // The algorithm for clearMeasures follows these steps:
+  //   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#clearmeasures-method
+  // 1. If measureName is omitted, remove all PerformanceMeasure objects in the
+  // performance entry buffer.
+  // 2. Otherwise remove all PerformanceMeasure objects listed in the
+  // performance entry buffer whose name matches measureName.
+  PerformanceEntryList performance_entry_buffer;
+  for (const auto& entry : performance_entry_buffer_) {
+    bool shouldRemoveEntry =
+        PerformanceEntry::ToEntryTypeEnum(entry->entry_type()) ==
+            PerformanceEntry::kMeasure &&
+        (measure_name.empty() || entry->name() == measure_name);
+    if (!shouldRemoveEntry) {
+      performance_entry_buffer.push_back(entry);
+    }
+  }
+  performance_entry_buffer_.swap(performance_entry_buffer);
+
+  // 3. Return undefined.
 }
 
 void Performance::UnregisterPerformanceObserver(
@@ -83,8 +317,7 @@
     const PerformanceObserverInit& options) {
   std::list<PerformanceObserverInit> options_list;
   options_list.push_back(options);
-  registered_performance_observers_.emplace_back(observer,
-                                                 options_list);
+  registered_performance_observers_.emplace_back(observer, options_list);
 }
 
 void Performance::ReplaceRegisteredPerformanceObserverOptionsList(
@@ -122,6 +355,7 @@
 void Performance::TraceMembers(script::Tracer* tracer) {
   tracer->Trace(timing_);
   tracer->Trace(memory_);
+  tracer->Trace(lifecycle_timing_);
 }
 
 PerformanceEntryList Performance::GetEntries() {
@@ -131,13 +365,13 @@
 PerformanceEntryList Performance::GetEntriesByType(
     const std::string& entry_type) {
   return PerformanceEntryListImpl::GetEntriesByType(performance_entry_buffer_,
-                                                      entry_type);
+                                                    entry_type);
 }
 
 PerformanceEntryList Performance::GetEntriesByName(
     const std::string& name, const base::StringPiece& type) {
   return PerformanceEntryListImpl::GetEntriesByName(performance_entry_buffer_,
-                                                      name, type);
+                                                    name, type);
 }
 
 void Performance::ClearResourceTimings() {
@@ -147,7 +381,9 @@
   // entry buffer.
   PerformanceEntryList performance_entry_buffer;
   for (const auto& entry : performance_entry_buffer_) {
-    if (!base::polymorphic_downcast<PerformanceResourceTiming*>(entry.get())) {
+    bool should_be_removed = PerformanceEntry::ToEntryTypeEnum(
+        entry->entry_type()) == PerformanceEntry::kResource;
+    if (!should_be_removed) {
       performance_entry_buffer.push_back(entry);
     }
   }
@@ -157,7 +393,8 @@
   resource_timing_buffer_current_size_ = 0;
 }
 
-void Performance::SetResourceTimingBufferSize(unsigned long max_size) {
+void Performance::SetResourceTimingBufferSize(
+    unsigned long max_size) {  // NOLINT(runtime/int)
   // The method runs the following steps:
   //   https://www.w3.org/TR/2021/WD-resource-timing-2-20210414/#dom-performance-setresourcetimingbuffersize
   // 1. Set resource timing buffer size limit to the maxSize parameter.
@@ -218,7 +455,7 @@
   while (!resource_timing_secondary_buffer_.empty()) {
     // 1.1 Let number of excess entries before be resource timing secondary
     // buffer current size.
-    unsigned long excess_entries_before =
+    unsigned long excess_entries_before =  // NOLINT(runtime/int)
         resource_timing_secondary_buffer_current_size_;
     // 1.2 If can add resource timing entry returns false, then fire an event
     // named resourcetimingbufferfull at the Performance object.
@@ -229,7 +466,7 @@
     CopySecondaryBuffer();
     // 1.4 Let number of excess entries after be resource timing secondary
     // buffer current size.
-    unsigned long excess_entries_after =
+    unsigned long excess_entries_after =  // NOLINT(runtime/int)
         resource_timing_secondary_buffer_current_size_;
     // 1.5 If number of excess entries before is lower than or equals number of
     // excess entries after, then remove all entries from resource timing
@@ -369,7 +606,7 @@
   // requestedURL, timingInfo, and cacheMode.
   scoped_refptr<PerformanceResourceTiming> resource_timing(
       new PerformanceResourceTiming(timing_info, initiator_type,
-                                    requested_url, this));
+                                    requested_url, this, time_origin_));
   // 2. Queue entry.
   QueuePerformanceEntry(resource_timing);
   // 3. Add entry to global's performance entry buffer.
diff --git a/src/cobalt/dom/performance.h b/src/cobalt/dom/performance.h
index 878271c..e69d9a8 100644
--- a/src/cobalt/dom/performance.h
+++ b/src/cobalt/dom/performance.h
@@ -21,18 +21,21 @@
 #include <string>
 
 #include "cobalt/base/clock.h"
+#include "base/time/default_tick_clock.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
+#include "cobalt/base/clock.h"
 #include "cobalt/dom/event_target.h"
 #include "cobalt/dom/performance_entry_list_impl.h"
 #include "cobalt/dom/performance_high_resolution_time.h"
+#include "cobalt/dom/performance_lifecycle_timing.h"
 #include "cobalt/dom/performance_observer.h"
 #include "cobalt/dom/performance_observer_callback_options.h"
 #include "cobalt/dom/performance_observer_init.h"
 #include "cobalt/dom/performance_resource_timing.h"
 #include "cobalt/dom/performance_timing.h"
 #include "cobalt/script/environment_settings.h"
-
+#include "cobalt/script/exception_state.h"
 #include "net/base/load_timing_info.h"
 
 namespace cobalt {
@@ -49,9 +52,11 @@
   // order to mitigate potential Spectre-related attacks.  This is following
   // Mozilla's lead as described here:
   //   https://www.mozilla.org/en-US/security/advisories/mfsa2018-01/
+  // NOLINT(runtime/int)
   static constexpr int64_t kPerformanceTimerMinResolutionInMicroseconds = 20;
   //   https://www.w3.org/TR/2021/WD-resource-timing-2-20210414/#sec-extensions-performance-interface
-  static constexpr unsigned long kMaxResourceTimingBufferSize = 250;
+  static constexpr unsigned long  // NOLINT(runtime/int)
+      kMaxResourceTimingBufferSize = 250;
 
   Performance(script::EnvironmentSettings* settings,
               const scoped_refptr<base::BasicClock>& clock);
@@ -62,6 +67,12 @@
   scoped_refptr<MemoryInfo> memory() const;
   DOMHighResTimeStamp Now() const;
   DOMHighResTimeStamp time_origin() const;
+  DOMHighResTimeStamp MonotonicTimeToDOMHighResTimeStamp(
+      base::TimeTicks monotonic_time) const;
+
+  static DOMHighResTimeStamp MonotonicTimeToDOMHighResTimeStamp(
+      base::TimeTicks time_origin,
+      base::TimeTicks monotonic_time);
 
   // Web API: Performance Timeline extensions to the Performance.
   //   https://www.w3.org/TR/performance-timeline-2/#extensions-to-the-performance-interface
@@ -70,10 +81,22 @@
   PerformanceEntryList GetEntriesByName(const std::string& name,
                                         const base::StringPiece& type);
 
+  // Web API: User Timing extensions to Performance
+  //   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#extensions-performance-interface
+  void Mark(const std::string& mark_name,
+            script::ExceptionState* exception_state);
+  void ClearMarks(const std::string& mark_name);
+  void Measure(const std::string& measure_name, const std::string& start_mark,
+               const std::string& end_mark,
+               script::ExceptionState* exception_state);
+  void ClearMeasures(const std::string& measure_name);
+
   // Web API: Performance Resource Timing extensions to Performance.
   //   https://w3c.github.io/resource-timing/#sec-extensions-performance-interface
   void ClearResourceTimings();
-  void SetResourceTimingBufferSize(unsigned long max_size);
+  // NOLINT(runtime/int)
+  void SetResourceTimingBufferSize(
+      unsigned long max_size);  // NOLINT(runtime/int)
   bool CanAddResourceTimingEntry();
   void CopySecondaryBuffer();
   void set_onresourcetimingbufferfull(
@@ -88,9 +111,12 @@
   void CreatePerformanceResourceTiming(const net::LoadTimingInfo& timing_info,
                                        const std::string& initiator_type,
                                        const std::string& requested_url);
+  void CreatePerformanceLifecycleTiming();
   // Custom, not in any spec.
-  base::TimeDelta get_time_origin() const { return time_origin_; }
-
+  // Internal getter method for the time origin value.
+  base::TimeTicks GetTimeOrigin() const {
+      return time_origin_;
+  }
   // Register and unregisterthe performance observer.
   void UnregisterPerformanceObserver(
       const scoped_refptr<PerformanceObserver>& observer);
@@ -112,9 +138,12 @@
  private:
   unsigned long GetDroppedEntriesCount(const std::string& entry_type);
 
+  base::TimeTicks time_origin_;
+  const base::TickClock* tick_clock_;
   scoped_refptr<PerformanceTiming> timing_;
   scoped_refptr<MemoryInfo> memory_;
-  base::TimeDelta time_origin_;
+  scoped_refptr<PerformanceLifecycleTiming> lifecycle_timing_;
+  base::TimeDelta unix_at_zero_monotonic_;
 
   PerformanceEntryList performance_entry_buffer_;
   struct RegisteredPerformanceObserver : public script::Traceable {
@@ -138,7 +167,8 @@
   unsigned long resource_timing_buffer_size_limit_;
   unsigned long resource_timing_buffer_current_size_;
   bool resource_timing_buffer_full_event_pending_flag_;
-  unsigned long resource_timing_secondary_buffer_current_size_;
+  unsigned long
+      resource_timing_secondary_buffer_current_size_;
   std::deque<scoped_refptr<PerformanceResourceTiming>>
       resource_timing_secondary_buffer_;
 
diff --git a/src/cobalt/dom/performance.idl b/src/cobalt/dom/performance.idl
index fd42dd3..91d2e8e 100644
--- a/src/cobalt/dom/performance.idl
+++ b/src/cobalt/dom/performance.idl
@@ -25,4 +25,14 @@
   void clearResourceTimings ();
   void setResourceTimingBufferSize (unsigned long maxSize);
   attribute EventHandler onresourcetimingbufferfull;
+
+  // Web API: User Timing extensions to Performance
+  //   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#extensions-performance-interface
+  [RaisesException] void mark(DOMString name);
+  [RaisesException] void measure(
+      DOMString measureName,
+      optional DOMString startMark = "",
+      optional DOMString endMark = "");
+  void clearMarks(optional DOMString name = "");
+  void clearMeasures(optional DOMString measureName = "");
 };
diff --git a/src/cobalt/dom/performance_entry.h b/src/cobalt/dom/performance_entry.h
index 8e3a3b7..7617b36 100644
--- a/src/cobalt/dom/performance_entry.h
+++ b/src/cobalt/dom/performance_entry.h
@@ -29,18 +29,20 @@
 //   https://w3c.github.io/performance-timeline/#the-performanceentry-interface
 class PerformanceEntry : public script::Wrappable {
  public:
-  PerformanceEntry(const std::string& name,
-                   DOMHighResTimeStamp start_time,
+  PerformanceEntry(const std::string& name, DOMHighResTimeStamp start_time,
                    DOMHighResTimeStamp finish_time);
 
   enum EntryType : PerformanceEntryType {
     kResource = 0,
     kNavigation = 1,
-    kInvalid = 2,
+    kLifecycle = 2,
+    kMark = 3,
+    kMeasure = 4,
+    kInvalid = 5,
   };
 
-  static constexpr const char* kEntryTypeString[] =
-      {"resource", "navigation", "invalid"};
+  static constexpr const char* kEntryTypeString[] = {
+      "resource", "navigation", "lifecycle", "mark", "measure", "invalid"};
 
   std::string name() const { return name_; }
   DOMHighResTimeStamp start_time() const;
@@ -53,8 +55,9 @@
   static PerformanceEntry::EntryType ToEntryTypeEnum(
       const std::string& entry_type);
 
-  static bool StartTimeCompareLessThan(const scoped_refptr<PerformanceEntry>& a,
-                                       const scoped_refptr<PerformanceEntry>& b);
+  static bool StartTimeCompareLessThan(
+      const scoped_refptr<PerformanceEntry>& a,
+      const scoped_refptr<PerformanceEntry>& b);
 
   DEFINE_WRAPPABLE_TYPE(PerformanceEntry);
 
diff --git a/src/cobalt/dom/performance_high_resolution_time.h b/src/cobalt/dom/performance_high_resolution_time.h
index 3246964..5033e5b 100644
--- a/src/cobalt/dom/performance_high_resolution_time.h
+++ b/src/cobalt/dom/performance_high_resolution_time.h
@@ -41,20 +41,21 @@
 
 // Clamp customized minimum clock resolution.
 //   https://w3c.github.io/hr-time/#clock-resolution
-inline base::TimeDelta ClampTimeStampMinimumResolution(base::TimeDelta delta,
+inline DOMHighResTimeStamp ClampTimeStampMinimumResolution(
+    base::TimeTicks ticks,
+    int64_t min_resolution_in_microseconds) {
+    int64_t microseconds = ticks.ToInternalValue();
+    return base::TimeDelta::FromMicroseconds(microseconds -
+        (microseconds % min_resolution_in_microseconds)).InMillisecondsF();
+}
+
+// Clamp customized minimum clock resolution.
+//   https://w3c.github.io/hr-time/#clock-resolution
+inline DOMHighResTimeStamp ClampTimeStampMinimumResolution(base::TimeDelta delta,
     int64_t min_resolution_in_microseconds) {
     int64_t microseconds = delta.InMicroseconds();
     return base::TimeDelta::FromMicroseconds(microseconds -
-        (microseconds % min_resolution_in_microseconds));
-}
-
-// Clamp customized minimum clock resolution and convet TimeDelta
-// to DOMHighResTimeStamp.
-inline DOMHighResTimeStamp ConvertTimeDeltaToDOMHighResTimeStamp(
-    base::TimeDelta delta, int64_t min_resolution_in_microseconds) {
-  base::TimeDelta clamp_delta =
-      ClampTimeStampMinimumResolution(delta, min_resolution_in_microseconds);
-  return clamp_delta.InMillisecondsF();
+        (microseconds % min_resolution_in_microseconds)).InMicrosecondsF();
 }
 
 }  // namespace dom
diff --git a/src/cobalt/dom/performance_lifecycle_timing.cc b/src/cobalt/dom/performance_lifecycle_timing.cc
new file mode 100644
index 0000000..6b64ff4
--- /dev/null
+++ b/src/cobalt/dom/performance_lifecycle_timing.cc
@@ -0,0 +1,70 @@
+// Copyright 2021 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/performance_lifecycle_timing.h"
+#include "cobalt/dom/performance.h"
+
+namespace cobalt {
+namespace dom {
+
+PerformanceLifecycleTiming::PerformanceLifecycleTiming(
+    const std::string& name, DOMHighResTimeStamp start_time,
+    DOMHighResTimeStamp end_time)
+    : PerformanceEntry(name, start_time, end_time),
+    current_state_("unstarted"),
+    last_state_("unstarted") {}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_start() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_blur() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_focus() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_conceal() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_reveal() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_freeze() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_unfreeze() const {
+  return PerformanceEntry::start_time();
+}
+
+DOMHighResTimeStamp PerformanceLifecycleTiming::app_stop() const {
+  return PerformanceEntry::start_time();
+}
+
+std::string PerformanceLifecycleTiming::current_state() const {
+  return current_state_;
+}
+
+std::string PerformanceLifecycleTiming::last_state() const {
+  return last_state_;
+}
+
+}  // namespace dom
+}  // namespace cobalt
\ No newline at end of file
diff --git a/src/cobalt/dom/performance_lifecycle_timing.h b/src/cobalt/dom/performance_lifecycle_timing.h
new file mode 100644
index 0000000..08a3415
--- /dev/null
+++ b/src/cobalt/dom/performance_lifecycle_timing.h
@@ -0,0 +1,65 @@
+// Copyright 2021 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_PERFORMANCE_LIFECYCLE_TIMING_H_
+#define COBALT_DOM_PERFORMANCE_LIFECYCLE_TIMING_H_
+
+#include <string>
+
+#include "cobalt/dom/performance_entry.h"
+#include "cobalt/dom/performance_high_resolution_time.h"
+
+#include "cobalt/script/wrappable.h"
+#include "net/base/load_timing_info.h"
+
+namespace cobalt {
+namespace dom {
+
+class Performance;
+
+class PerformanceLifecycleTiming : public PerformanceEntry {
+ public:
+  PerformanceLifecycleTiming(const std::string& name,
+                            DOMHighResTimeStamp start_time,
+                            DOMHighResTimeStamp end_time);
+
+  // Web API.
+  DOMHighResTimeStamp app_start() const;
+  DOMHighResTimeStamp app_blur() const;
+  DOMHighResTimeStamp app_focus() const;
+  DOMHighResTimeStamp app_conceal() const;
+  DOMHighResTimeStamp app_reveal() const;
+  DOMHighResTimeStamp app_freeze() const;
+  DOMHighResTimeStamp app_unfreeze() const;
+  DOMHighResTimeStamp app_stop() const;
+  std::string current_state() const;
+  std::string last_state() const;
+
+  std::string entry_type() const override { return "lifecycle"; }
+  PerformanceEntryType EntryTypeEnum() const override {
+    return PerformanceEntry::kLifecycle;
+  }
+
+  DEFINE_WRAPPABLE_TYPE(PerformanceLifecycleTiming);
+
+ private:
+  std::string current_state_;
+  std::string last_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(PerformanceLifecycleTiming);
+};
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_PERFORMANCE_LIFECYCLE_TIMING_H_
\ No newline at end of file
diff --git a/src/cobalt/dom/performance_lifecycle_timing.idl b/src/cobalt/dom/performance_lifecycle_timing.idl
new file mode 100644
index 0000000..602331d
--- /dev/null
+++ b/src/cobalt/dom/performance_lifecycle_timing.idl
@@ -0,0 +1,27 @@
+// Copyright 2021 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.
+
+[Exposed=Window]
+interface PerformanceLifecycleTiming : PerformanceEntry {
+  readonly  attribute DOMHighResTimeStamp appStart;
+  readonly  attribute DOMHighResTimeStamp appBlur;
+  readonly  attribute DOMHighResTimeStamp appFocus;
+  readonly  attribute DOMHighResTimeStamp appConceal;
+  readonly  attribute DOMHighResTimeStamp appReveal;
+  readonly  attribute DOMHighResTimeStamp appFreeze;
+  readonly  attribute DOMHighResTimeStamp appUnfreeze;
+  readonly  attribute DOMHighResTimeStamp appStop;
+  readonly  attribute DOMString  currentState;
+  readonly  attribute DOMString  lastState;
+};
diff --git a/src/cobalt/dom/performance_mark.cc b/src/cobalt/dom/performance_mark.cc
new file mode 100644
index 0000000..0efdf5b
--- /dev/null
+++ b/src/cobalt/dom/performance_mark.cc
@@ -0,0 +1,28 @@
+// Copyright 2021 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/performance_mark.h"
+
+#include "cobalt/dom/performance.h"
+#include "cobalt/dom/performance_entry.h"
+
+namespace cobalt {
+namespace dom {
+
+PerformanceMark::PerformanceMark(const std::string& name,
+                                 DOMHighResTimeStamp start_time)
+    : PerformanceEntry(name, start_time, start_time) {}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/performance_mark.h b/src/cobalt/dom/performance_mark.h
new file mode 100644
index 0000000..7d477b6
--- /dev/null
+++ b/src/cobalt/dom/performance_mark.h
@@ -0,0 +1,45 @@
+// Copyright 2021 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_PERFORMANCE_MARK_H_
+#define COBALT_DOM_PERFORMANCE_MARK_H_
+
+#include <string>
+
+#include "cobalt/dom/performance_entry.h"
+#include "cobalt/dom/performance_high_resolution_time.h"
+#include "cobalt/script/wrappable.h"
+#include "net/base/load_timing_info.h"
+
+namespace cobalt {
+namespace dom {
+class Performance;
+
+// Implements the PerformanceMart interface.
+//   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#performancemark
+class PerformanceMark : public PerformanceEntry {
+ public:
+  PerformanceMark(const std::string& name, DOMHighResTimeStamp start_time);
+
+  std::string entry_type() const override { return "mark"; }
+  PerformanceEntryType EntryTypeEnum() const override {
+    return PerformanceEntry::kMark;
+  }
+
+  DEFINE_WRAPPABLE_TYPE(PerformanceMark);
+};
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_PERFORMANCE_MARK_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/cobalt/dom/performance_mark.idl
similarity index 65%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/cobalt/dom/performance_mark.idl
index 9031c7b..834479b 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/cobalt/dom/performance_mark.idl
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,5 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-
-#include "starboard/linux/x64x11/atomic_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+[Exposed=Window]
+interface PerformanceMark : PerformanceEntry {};
diff --git a/src/cobalt/dom/performance_measure.cc b/src/cobalt/dom/performance_measure.cc
new file mode 100644
index 0000000..1a7edfb
--- /dev/null
+++ b/src/cobalt/dom/performance_measure.cc
@@ -0,0 +1,29 @@
+// Copyright 2021 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/performance_measure.h"
+
+#include "cobalt/dom/performance.h"
+#include "cobalt/dom/performance_entry.h"
+
+namespace cobalt {
+namespace dom {
+
+PerformanceMeasure::PerformanceMeasure(const std::string& name,
+                                       DOMHighResTimeStamp start_time,
+                                       DOMHighResTimeStamp end_time)
+    : PerformanceEntry(name, start_time, end_time) {}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/src/cobalt/dom/performance_measure.h b/src/cobalt/dom/performance_measure.h
new file mode 100644
index 0000000..41107c3
--- /dev/null
+++ b/src/cobalt/dom/performance_measure.h
@@ -0,0 +1,46 @@
+// Copyright 2021 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_PERFORMANCE_MEASURE_H_
+#define COBALT_DOM_PERFORMANCE_MEASURE_H_
+
+#include <string>
+
+#include "cobalt/dom/performance_entry.h"
+#include "cobalt/dom/performance_high_resolution_time.h"
+#include "cobalt/script/wrappable.h"
+#include "net/base/load_timing_info.h"
+
+namespace cobalt {
+namespace dom {
+class Performance;
+
+// Implements the PerformanceMeasure interface.
+//   https://www.w3.org/TR/2019/REC-user-timing-2-20190226/#performancemeasure
+class PerformanceMeasure : public PerformanceEntry {
+ public:
+  PerformanceMeasure(const std::string& name, DOMHighResTimeStamp start_time,
+                     DOMHighResTimeStamp end_time);
+
+  std::string entry_type() const override { return "measure"; }
+  PerformanceEntryType EntryTypeEnum() const override {
+    return PerformanceEntry::kMeasure;
+  }
+
+  DEFINE_WRAPPABLE_TYPE(PerformanceMeasure);
+};
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_PERFORMANCE_MEASURE_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/cobalt/dom/performance_measure.idl
similarity index 65%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/cobalt/dom/performance_measure.idl
index 9031c7b..b6cb447 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/cobalt/dom/performance_measure.idl
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,5 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-
-#include "starboard/linux/x64x11/atomic_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+[Exposed=Window]
+interface PerformanceMeasure : PerformanceEntry {};
diff --git a/src/cobalt/dom/performance_resource_timing.cc b/src/cobalt/dom/performance_resource_timing.cc
index eb48afe..11dac39 100644
--- a/src/cobalt/dom/performance_resource_timing.cc
+++ b/src/cobalt/dom/performance_resource_timing.cc
@@ -29,70 +29,86 @@
 
 PerformanceResourceTiming::PerformanceResourceTiming(
     const net::LoadTimingInfo& timing_info, const std::string& initiator_type,
-    const std::string& requested_url, Performance* performance)
+    const std::string& requested_url, Performance* performance,
+    base::TimeTicks time_origin)
     : PerformanceEntry(
-          requested_url, performance->Now(),
-          ConvertTimeDeltaToDOMHighResTimeStamp(
-              timing_info.receive_headers_end.since_origin(),
-              Performance::kPerformanceTimerMinResolutionInMicroseconds)),
+          requested_url,
+          Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin,
+              timing_info.request_start),
+          Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin,
+              timing_info.receive_headers_end)),
       initiator_type_(initiator_type),
       cache_mode_(kPerformanceResourceTimingCacheMode),
       transfer_size_(0),
-      timing_info_(timing_info) {}
+      timing_info_(timing_info),
+      time_origin_(time_origin) {}
 
 std::string PerformanceResourceTiming::initiator_type() const {
   return initiator_type_;
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::fetch_start() const {
-  // There is no worker in Cobalt, thus we need to return start_time()
-  // instead of worker ready time.
-  return PerformanceEntry::start_time();
+  if (timing_info_.request_start.is_null()) {
+    return PerformanceEntry::start_time();
+  }
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.request_start);
+}
+
+DOMHighResTimeStamp PerformanceResourceTiming::domain_lookup_start() const {
+  if (timing_info_.connect_timing.dns_start.is_null()) {
+    return PerformanceEntry::start_time();
+  }
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.connect_timing.dns_start);
+}
+
+DOMHighResTimeStamp PerformanceResourceTiming::domain_lookup_end() const {
+  if (timing_info_.connect_timing.dns_end.is_null()) {
+    return PerformanceEntry::start_time();
+  }
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.connect_timing.dns_end);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::connect_start() const {
   if (timing_info_.connect_timing.connect_start.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      timing_info_.connect_timing.connect_start.since_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.connect_timing.connect_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::connect_end() const {
   if (timing_info_.connect_timing.connect_end.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      timing_info_.connect_timing.connect_end.since_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.connect_timing.connect_end);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::secure_connection_start() const {
   if (timing_info_.connect_timing.ssl_start.is_null()) {
     return 0.0;
   }
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      timing_info_.connect_timing.ssl_start.since_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.connect_timing.ssl_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::request_start() const {
   if (timing_info_.send_start.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      timing_info_.send_start.since_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.send_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::response_start() const {
   if (timing_info_.receive_headers_end.is_null()) {
     PerformanceEntry::start_time();
   }
-  return ConvertTimeDeltaToDOMHighResTimeStamp(
-      timing_info_.receive_headers_end.since_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+      timing_info_.receive_headers_end);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::response_end() const {
diff --git a/src/cobalt/dom/performance_resource_timing.h b/src/cobalt/dom/performance_resource_timing.h
index a0eaa0a..cab3c48 100644
--- a/src/cobalt/dom/performance_resource_timing.h
+++ b/src/cobalt/dom/performance_resource_timing.h
@@ -39,11 +39,14 @@
   PerformanceResourceTiming(const net::LoadTimingInfo& timing_info,
                             const std::string& initiator_type,
                             const std::string& requested_url,
-                            Performance* performance);
+                            Performance* performance,
+                            base::TimeTicks time_origin);
 
   // Web API.
   std::string initiator_type() const;
   DOMHighResTimeStamp fetch_start() const;
+  DOMHighResTimeStamp domain_lookup_start() const;
+  DOMHighResTimeStamp domain_lookup_end() const;
   DOMHighResTimeStamp connect_start() const;
   DOMHighResTimeStamp connect_end() const;
   DOMHighResTimeStamp secure_connection_start() const;
@@ -73,6 +76,7 @@
   uint64_t transfer_size_;
   std::string requested_url_;
   net::LoadTimingInfo timing_info_;
+  base::TimeTicks time_origin_;
 
   DISALLOW_COPY_AND_ASSIGN(PerformanceResourceTiming);
 };
diff --git a/src/cobalt/dom/performance_resource_timing.idl b/src/cobalt/dom/performance_resource_timing.idl
index 95dc923..c1c0bd3 100644
--- a/src/cobalt/dom/performance_resource_timing.idl
+++ b/src/cobalt/dom/performance_resource_timing.idl
@@ -18,6 +18,8 @@
 interface PerformanceResourceTiming : PerformanceEntry {
   readonly  attribute DOMString           initiatorType;
   readonly  attribute DOMHighResTimeStamp fetchStart;
+  readonly  attribute DOMHighResTimeStamp domainLookupStart;
+  readonly  attribute DOMHighResTimeStamp domainLookupEnd;
   readonly  attribute DOMHighResTimeStamp connectStart;
   readonly  attribute DOMHighResTimeStamp connectEnd;
   readonly  attribute DOMHighResTimeStamp secureConnectionStart;
diff --git a/src/cobalt/dom/performance_test.cc b/src/cobalt/dom/performance_test.cc
index 6f5e55c..be1e776 100644
--- a/src/cobalt/dom/performance_test.cc
+++ b/src/cobalt/dom/performance_test.cc
@@ -29,48 +29,36 @@
 
   // Test that now returns a result that is within a correct range for the
   // current time.
-  base::TimeDelta lower_limit = base::Time::Now() - base::Time::UnixEpoch();
+  DOMHighResTimeStamp lower_limit =
+      performance->MonotonicTimeToDOMHighResTimeStamp(base::TimeTicks::Now());
 
   DOMHighResTimeStamp current_time_in_milliseconds = performance->Now();
 
-  base::TimeDelta upper_limit = base::Time::Now() - base::Time::UnixEpoch();
+  DOMHighResTimeStamp upper_limit =
+      performance->MonotonicTimeToDOMHighResTimeStamp(base::TimeTicks::Now());
 
-  DCHECK_GE(current_time_in_milliseconds, ConvertTimeDeltaToDOMHighResTimeStamp(
-      lower_limit - performance->get_time_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds));
-  DCHECK_LE(current_time_in_milliseconds, ConvertTimeDeltaToDOMHighResTimeStamp(
-      upper_limit - performance->get_time_origin(),
-      Performance::kPerformanceTimerMinResolutionInMicroseconds));
+  DCHECK_GE(current_time_in_milliseconds, lower_limit);
+  DCHECK_LE(current_time_in_milliseconds, upper_limit);
 }
 
-TEST(PerformanceTest, TimeOrigin) {
+TEST(PerformanceTest, MonotonicTimeToDOMHighResTimeStamp) {
   scoped_refptr<base::SystemMonotonicClock> clock(
       new base::SystemMonotonicClock());
-  // Test that time_origin returns a result that is within a correct range for
-  // the current time.
-  base::Time lower_limit = base::Time::Now();
 
   testing::StubEnvironmentSettings environment_settings;
   scoped_refptr<Performance> performance(new Performance(&environment_settings, clock));
 
-  base::Time upper_limit = base::Time::Now();
+  base::TimeTicks current_time_ticks = base::TimeTicks::Now();
+  DOMHighResTimeStamp  current_time = ClampTimeStampMinimumResolution(
+      current_time_ticks,
+      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+  DOMHighResTimeStamp current_time_respect_to_time_origin =
+      performance->MonotonicTimeToDOMHighResTimeStamp(current_time_ticks);
+  DOMHighResTimeStamp time_origin = ClampTimeStampMinimumResolution(
+      performance->GetTimeOrigin(),
+      Performance::kPerformanceTimerMinResolutionInMicroseconds);
 
-  base::TimeDelta lower_limit_delta = lower_limit - base::Time::UnixEpoch();
-  base::TimeDelta upper_limit_delta = upper_limit - base::Time::UnixEpoch();
-
-  base::TimeDelta time_zero =
-      base::Time::UnixEpoch().ToDeltaSinceWindowsEpoch();
-
-  DOMHighResTimeStamp lower_limit_milliseconds =
-        ConvertTimeDeltaToDOMHighResTimeStamp(lower_limit_delta + time_zero,
-            Performance::kPerformanceTimerMinResolutionInMicroseconds);
-
-  DOMHighResTimeStamp upper_limit_milliseconds =
-        ConvertTimeDeltaToDOMHighResTimeStamp(upper_limit_delta + time_zero,
-            Performance::kPerformanceTimerMinResolutionInMicroseconds);
-
-  DCHECK_GE(performance->time_origin(), lower_limit_milliseconds);
-  DCHECK_LE(performance->time_origin(), upper_limit_milliseconds);
+  DCHECK_EQ(current_time_respect_to_time_origin, current_time - time_origin);
 }
 
 TEST(PerformanceTest, NavigationStart) {
@@ -82,19 +70,17 @@
   // the object will be created at the beginning of a new navigation.
   scoped_refptr<base::SystemMonotonicClock> clock(
       new base::SystemMonotonicClock());
-  base::Time lower_limit = base::Time::Now();
+  base::TimeTicks lower_limit = base::TimeTicks::Now();
 
   scoped_refptr<PerformanceTiming> performance_timing(
-      new PerformanceTiming(clock));
+      new PerformanceTiming(clock, base::TimeTicks::Now()));
 
-  base::Time upper_limit = base::Time::Now();
+  base::TimeTicks upper_limit = base::TimeTicks::Now();
 
   DCHECK_GE(performance_timing->navigation_start(),
-            static_cast<uint64>(
-                (lower_limit - base::Time::UnixEpoch()).InMilliseconds()));
+            static_cast<uint64>((lower_limit.ToInternalValue())));
   DCHECK_LE(performance_timing->navigation_start(),
-            static_cast<uint64>(
-                (upper_limit - base::Time::UnixEpoch()).InMilliseconds()));
+            static_cast<uint64>((upper_limit.ToInternalValue())));
 }
 
 }  // namespace dom
diff --git a/src/cobalt/dom/performance_timing.cc b/src/cobalt/dom/performance_timing.cc
index 6f5783c..910eb03 100644
--- a/src/cobalt/dom/performance_timing.cc
+++ b/src/cobalt/dom/performance_timing.cc
@@ -18,14 +18,15 @@
 namespace dom {
 
 PerformanceTiming::PerformanceTiming(
-    const scoped_refptr<base::BasicClock>& clock)
-    : navigation_start_(base::Time::Now() - base::Time::UnixEpoch()),
+    const scoped_refptr<base::BasicClock>& clock,
+    base::TimeTicks time_origin)
+    : navigation_start_(time_origin),
       navigation_start_clock_(new base::OffsetClock(clock, clock->Now())) {}
 
 PerformanceTiming::~PerformanceTiming() {}
 
 uint64 PerformanceTiming::navigation_start() const {
-  return static_cast<uint64>(navigation_start_.InMilliseconds());
+  return static_cast<uint64>(navigation_start_.ToInternalValue());
 }
 
 scoped_refptr<base::OffsetClock> PerformanceTiming::GetNavigationStartClock() {
diff --git a/src/cobalt/dom/performance_timing.h b/src/cobalt/dom/performance_timing.h
index 71e936d..184d92d 100644
--- a/src/cobalt/dom/performance_timing.h
+++ b/src/cobalt/dom/performance_timing.h
@@ -15,10 +15,9 @@
 #ifndef COBALT_DOM_PERFORMANCE_TIMING_H_
 #define COBALT_DOM_PERFORMANCE_TIMING_H_
 
-#include "cobalt/script/wrappable.h"
-
 #include "base/time/time.h"
 #include "cobalt/base/clock.h"
+#include "cobalt/script/wrappable.h"
 
 namespace cobalt {
 namespace dom {
@@ -26,8 +25,11 @@
 // Implements the PerformanceTiming IDL interface, as described here:
 //   https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html#sec-navigation-timing-interface
 class PerformanceTiming : public script::Wrappable {
+  // If any new public fields are added here, handling logic must be added to
+  // Performance::Mark and Performance::Measure.
  public:
-  explicit PerformanceTiming(const scoped_refptr<base::BasicClock>& clock);
+  explicit PerformanceTiming(const scoped_refptr<base::BasicClock>& clock,
+                             base::TimeTicks time_origin);
 
   // This attribute must return the time immediately after the user agent
   // finishes prompting to unload the previous document. If there is no previous
@@ -48,7 +50,7 @@
   ~PerformanceTiming();
 
   // The navigation start time relative to January 1, 1970.
-  base::TimeDelta navigation_start_;
+  base::TimeTicks navigation_start_;
   scoped_refptr<base::OffsetClock> navigation_start_clock_;
 
   DISALLOW_COPY_AND_ASSIGN(PerformanceTiming);
diff --git a/src/cobalt/dom/source_buffer.cc b/src/cobalt/dom/source_buffer.cc
index a217666..de6fd76 100644
--- a/src/cobalt/dom/source_buffer.cc
+++ b/src/cobalt/dom/source_buffer.cc
@@ -413,7 +413,7 @@
       pending_append_data_.reset(new uint8_t[size]);
       pending_append_data_capacity_ = size;
     }
-    SbMemoryCopy(pending_append_data_.get(), data, size);
+    memcpy(pending_append_data_.get(), data, size);
   }
   pending_append_data_size_ = size;
   pending_append_data_offset_ = 0;
diff --git a/src/cobalt/dom/testing/stub_window.h b/src/cobalt/dom/testing/stub_window.h
index 3107483..56def70 100644
--- a/src/cobalt/dom/testing/stub_window.h
+++ b/src/cobalt/dom/testing/stub_window.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/callback.h"
@@ -72,7 +73,7 @@
         fetcher_factory_.get(), loader_factory_.get(), NULL, NULL, NULL, NULL,
         NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL,
         global_environment_->script_value_factory(), NULL,
-        dom_stat_tracker_.get(), url_, "", "en-US", "en",
+        dom_stat_tracker_.get(), url_, "", NULL, "en-US", "en",
         base::Callback<void(const GURL&)>(),
         base::Bind(&StubLoadCompleteCallback), NULL,
         network_bridge::PostSender(), csp::kCSPRequired,
diff --git a/src/cobalt/dom/user_agent_platform_info.h b/src/cobalt/dom/user_agent_platform_info.h
new file mode 100644
index 0000000..a63c8a5
--- /dev/null
+++ b/src/cobalt/dom/user_agent_platform_info.h
@@ -0,0 +1,60 @@
+// Copyright 2021 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_USER_AGENT_PLATFORM_INFO_H_
+#define COBALT_DOM_USER_AGENT_PLATFORM_INFO_H_
+
+#include <string>
+
+#include "base/optional.h"
+#include "starboard/system.h"
+
+namespace cobalt {
+namespace dom {
+
+// This class gives the DOM an interface to the user agent platform info. This
+// allows NavigatorUAData to access user agent string info.
+class UserAgentPlatformInfo {
+ public:
+  virtual ~UserAgentPlatformInfo() {}
+
+  virtual const std::string& starboard_version() const = 0;
+  virtual const std::string& os_name_and_version() const = 0;
+  virtual base::Optional<std::string> original_design_manufacturer() const = 0;
+  virtual SbSystemDeviceType device_type() const = 0;
+  virtual const std::string& device_type_string() const = 0;
+  virtual base::Optional<std::string> chipset_model_number() const = 0;
+  virtual base::Optional<std::string> model_year() const = 0;
+  virtual base::Optional<std::string> firmware_version() const = 0;
+  virtual base::Optional<std::string> brand() const = 0;
+  virtual base::Optional<std::string> model() const = 0;
+  virtual const std::string& aux_field() const = 0;
+  virtual base::Optional<SbSystemConnectionType> connection_type() const = 0;
+  virtual const std::string& connection_type_string() const = 0;
+  virtual const std::string& javascript_engine_version() const = 0;
+  virtual const std::string& rasterizer_type() const = 0;
+  virtual const std::string& evergreen_version() const = 0;
+
+  virtual const std::string& cobalt_version() const = 0;
+  virtual const std::string& cobalt_build_version_number() const = 0;
+  virtual const std::string& build_configuration() const = 0;
+
+ protected:
+  UserAgentPlatformInfo() {}
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_USER_AGENT_PLATFORM_INFO_H_
diff --git a/src/cobalt/dom/video_track.h b/src/cobalt/dom/video_track.h
index c3078a3..00235da 100644
--- a/src/cobalt/dom/video_track.h
+++ b/src/cobalt/dom/video_track.h
@@ -60,13 +60,13 @@
   //
   static bool IsValidKind(const char* kind) {
     // https://www.w3.org/TR/html51/semantics-embedded-content.html#dom-videotrack-videotrackkind
-    return SbStringCompareAll(kind, "alternative") == 0 ||
-           SbStringCompareAll(kind, "captions") == 0 ||
-           SbStringCompareAll(kind, "main") == 0 ||
-           SbStringCompareAll(kind, "sign") == 0 ||
-           SbStringCompareAll(kind, "subtitles") == 0 ||
-           SbStringCompareAll(kind, "commentary") == 0 ||
-           SbStringGetLength(kind) == 0;
+    return strcmp(kind, "alternative") == 0 ||
+           strcmp(kind, "captions") == 0 ||
+           strcmp(kind, "main") == 0 ||
+           strcmp(kind, "sign") == 0 ||
+           strcmp(kind, "subtitles") == 0 ||
+           strcmp(kind, "commentary") == 0 ||
+           strlen(kind) == 0;
   }
 
   // Reset selected flag without notifying the media element.  This is used by
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index c10512c..c95ed07 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -15,6 +15,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -102,8 +103,8 @@
     script::ScriptValueFactory* script_value_factory,
     MediaSource::Registry* media_source_registry,
     DomStatTracker* dom_stat_tracker, const GURL& url,
-    const std::string& user_agent, const std::string& language,
-    const std::string& font_language_script,
+    const std::string& user_agent, UserAgentPlatformInfo* platform_info,
+    const std::string& language, const std::string& font_language_script,
     const base::Callback<void(const GURL&)> navigation_callback,
     const loader::Decoder::OnCompleteFunction& load_complete_callback,
     network_bridge::CookieJar* cookie_jar,
@@ -159,7 +160,7 @@
               csp_insecure_allowed_token, dom_max_element_depth)))),
       document_loader_(nullptr),
       history_(new History()),
-      navigator_(new Navigator(settings, user_agent, language,
+      navigator_(new Navigator(settings, user_agent, platform_info, language,
                                captions, script_value_factory)),
       ALLOW_THIS_IN_INITIALIZER_LIST(
           relay_on_load_event_(new RelayLoadEvent(this))),
@@ -700,8 +701,7 @@
   tracer->Trace(on_screen_keyboard_);
 }
 
-const scoped_refptr<media_session::MediaSession>
-    Window::media_session() const {
+const scoped_refptr<media_session::MediaSession> Window::media_session() const {
   return navigator_->media_session();
 }
 
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h
index 5998432..dce79c2 100644
--- a/src/cobalt/dom/window.h
+++ b/src/cobalt/dom/window.h
@@ -48,6 +48,7 @@
 #include "cobalt/dom/test_runner.h"
 #endif  // ENABLE_TEST_RUNNER
 #include "cobalt/dom/url_registry.h"
+#include "cobalt/dom/user_agent_platform_info.h"
 #include "cobalt/dom/window_timers.h"
 #include "cobalt/input/camera_3d.h"
 #include "cobalt/loader/cors_preflight_cache.h"
@@ -152,8 +153,8 @@
       script::ScriptValueFactory* script_value_factory,
       MediaSourceRegistry* media_source_registry,
       DomStatTracker* dom_stat_tracker, const GURL& url,
-      const std::string& user_agent, const std::string& language,
-      const std::string& font_language_script,
+      const std::string& user_agent, UserAgentPlatformInfo* platform_info,
+      const std::string& language, const std::string& font_language_script,
       const base::Callback<void(const GURL&)> navigation_callback,
       const loader::Decoder::OnCompleteFunction& load_complete_callback,
       network_bridge::CookieJar* cookie_jar,
@@ -349,9 +350,9 @@
   void SetCamera3D(const scoped_refptr<input::Camera3D>& camera_3d);
 
   void set_web_media_player_factory(
-    media::WebMediaPlayerFactory* web_media_player_factory) {
-  html_element_context_->set_web_media_player_factory(
-      web_media_player_factory);
+      media::WebMediaPlayerFactory* web_media_player_factory) {
+    html_element_context_->set_web_media_player_factory(
+        web_media_player_factory);
   }
 
   // Sets the current application state, forwarding on to the
@@ -405,8 +406,7 @@
 
   bool enable_map_to_mesh() { return enable_map_to_mesh_; }
 
-  const scoped_refptr<media_session::MediaSession>
-      media_session() const;
+  const scoped_refptr<media_session::MediaSession> media_session() const;
 
   DEFINE_WRAPPABLE_TYPE(Window);
 
diff --git a/src/cobalt/dom/window_test.cc b/src/cobalt/dom/window_test.cc
index 6c39af9..b7df5f7 100644
--- a/src/cobalt/dom/window_test.cc
+++ b/src/cobalt/dom/window_test.cc
@@ -72,7 +72,8 @@
         css_parser_.get(), dom_parser_.get(), fetcher_factory_.get(), NULL,
         NULL, NULL, NULL, NULL, NULL, NULL, &local_storage_database_, NULL,
         NULL, NULL, NULL, global_environment_->script_value_factory(), NULL,
-        NULL, url_, "", "en-US", "en", base::Callback<void(const GURL &)>(),
+        NULL, url_, "", NULL, "en-US", "en",
+        base::Callback<void(const GURL &)>(),
         base::Bind(&MockErrorCallback::Run,
                    base::Unretained(&mock_error_callback_)),
         NULL, network_bridge::PostSender(), csp::kCSPRequired,
diff --git a/src/cobalt/dom_parser/libxml_parser_wrapper.cc b/src/cobalt/dom_parser/libxml_parser_wrapper.cc
index d1a6ec1..4642ab1 100644
--- a/src/cobalt/dom_parser/libxml_parser_wrapper.cc
+++ b/src/cobalt/dom_parser/libxml_parser_wrapper.cc
@@ -12,10 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "cobalt/dom_parser/libxml_parser_wrapper.h"
 
 #include "base/logging.h"
diff --git a/src/cobalt/dom_parser/parser.cc b/src/cobalt/dom_parser/parser.cc
index ab8b400..060886a 100644
--- a/src/cobalt/dom_parser/parser.cc
+++ b/src/cobalt/dom_parser/parser.cc
@@ -14,10 +14,6 @@
 
 #include <memory>
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "cobalt/dom_parser/parser.h"
 
 #include "base/logging.h"
diff --git a/src/cobalt/extension/configuration.h b/src/cobalt/extension/configuration.h
index 7c12817..4dc64d3 100644
--- a/src/cobalt/extension/configuration.h
+++ b/src/cobalt/extension/configuration.h
@@ -178,12 +178,8 @@
   int (*CobaltSkiaGlyphAtlasWidth)();
   int (*CobaltSkiaGlyphAtlasHeight)();
 
-  // Determines the size of garbage collection threshold. After this many
-  // bytes have been allocated, the SpiderMonkey garbage collector will run.
-  // Lowering this has been found to reduce performance and decrease
-  // JavaScript memory usage. For example, we have measured on at least one
-  // platform that performance becomes 7% worse on average in certain cases
-  // when adjusting this number from 8MB to 1MB.
+  // This configuration has been deprecated and is only kept for
+  // backward-compatibility. It has no effect on V8.
   int (*CobaltJsGarbageCollectionThresholdInBytes)();
 
   // When specified this value will reduce the cpu memory consumption by
diff --git a/src/cobalt/extension/updater_notification.h b/src/cobalt/extension/updater_notification.h
index 151437f..ce301dc 100644
--- a/src/cobalt/extension/updater_notification.h
+++ b/src/cobalt/extension/updater_notification.h
@@ -51,7 +51,8 @@
   // and prompt the user to free some storage. The implementation
   // should keep track of the frequency of showing the prompt to the
   // user and try to minimize the number of user notifications.
-  void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state);
+  void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state,
+                       const char* current_evergreen_version);
 } CobaltExtensionUpdaterNotificationApi;
 
 #ifdef __cplusplus
diff --git a/src/cobalt/h5vcc/h5vcc.cc b/src/cobalt/h5vcc/h5vcc.cc
index 2942546..196c708 100644
--- a/src/cobalt/h5vcc/h5vcc.cc
+++ b/src/cobalt/h5vcc/h5vcc.cc
@@ -26,7 +26,9 @@
   c_val_ = new dom::CValView();
   crash_log_ = new H5vccCrashLog();
   runtime_ = new H5vccRuntime(settings.event_dispatcher);
-  settings_ = new H5vccSettings(settings.media_module, settings.network_module);
+  settings_ =
+      new H5vccSettings(settings.media_module, settings.network_module,
+                        settings.user_agent_data, settings.global_environment);
 #if defined(COBALT_ENABLE_SSO)
   sso_ = new H5vccSso();
 #endif
diff --git a/src/cobalt/h5vcc/h5vcc.h b/src/cobalt/h5vcc/h5vcc.h
index 5a98b72..ea37396 100644
--- a/src/cobalt/h5vcc/h5vcc.h
+++ b/src/cobalt/h5vcc/h5vcc.h
@@ -20,7 +20,6 @@
 #include "cobalt/base/event_dispatcher.h"
 #include "cobalt/dom/c_val_view.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
-#include "cobalt/dom/window.h"
 #include "cobalt/h5vcc/h5vcc_accessibility.h"
 #include "cobalt/h5vcc/h5vcc_account_info.h"
 #include "cobalt/h5vcc/h5vcc_audio_config_array.h"
@@ -51,7 +50,10 @@
           updater_module(NULL),
 #endif
           account_manager(NULL),
-          event_dispatcher(NULL) {}
+          event_dispatcher(NULL),
+          user_agent_data(NULL),
+          global_environment(NULL) {
+    }
     media::MediaModule* media_module;
     network::NetworkModule* network_module;
 #if SB_IS(EVERGREEN)
@@ -59,6 +61,8 @@
 #endif
     account::AccountManager* account_manager;
     base::EventDispatcher* event_dispatcher;
+    dom::NavigatorUAData* user_agent_data;
+    script::GlobalEnvironment* global_environment;
   };
 
   explicit H5vcc(const Settings& config);
diff --git a/src/cobalt/h5vcc/h5vcc_accessibility.cc b/src/cobalt/h5vcc/h5vcc_accessibility.cc
index 0a800c2..2463943 100644
--- a/src/cobalt/h5vcc/h5vcc_accessibility.cc
+++ b/src/cobalt/h5vcc/h5vcc_accessibility.cc
@@ -72,7 +72,7 @@
 
 bool H5vccAccessibility::high_contrast_text() const {
   SbAccessibilityDisplaySettings settings;
-  SbMemorySet(&settings, 0, sizeof(settings));
+  memset(&settings, 0, sizeof(settings));
 
   if (!SbAccessibilityGetDisplaySettings(&settings)) {
     return false;
@@ -87,7 +87,7 @@
     return true;
   }
   SbAccessibilityTextToSpeechSettings settings;
-  SbMemorySet(&settings, 0, sizeof(settings));
+  memset(&settings, 0, sizeof(settings));
 
   if (!SbAccessibilityGetTextToSpeechSettings(&settings)) {
     return false;
diff --git a/src/cobalt/h5vcc/h5vcc_platform_service.cc b/src/cobalt/h5vcc/h5vcc_platform_service.cc
index 6688899..f744176 100644
--- a/src/cobalt/h5vcc/h5vcc_platform_service.cc
+++ b/src/cobalt/h5vcc/h5vcc_platform_service.cc
@@ -42,7 +42,8 @@
   scoped_refptr<H5vccPlatformService> service = new H5vccPlatformService(
       global_environment, platform_service_api, receive_callback);
   char* service_name_c_str = new char[kMaxNameLength];
-  SbStringCopy(service_name_c_str, service_name.c_str(), kMaxNameLength);
+  memset(service_name_c_str, 0, kMaxNameLength);
+  strncpy(service_name_c_str, service_name.c_str(), kMaxNameLength);
 
   ExtPlatformService platform_service = platform_service_api->Open(
       service, service_name_c_str, &H5vccPlatformService::Receive);
diff --git a/src/cobalt/h5vcc/h5vcc_settings.cc b/src/cobalt/h5vcc/h5vcc_settings.cc
index a0fdce7..e53ba06 100644
--- a/src/cobalt/h5vcc/h5vcc_settings.cc
+++ b/src/cobalt/h5vcc/h5vcc_settings.cc
@@ -20,19 +20,28 @@
 namespace h5vcc {
 
 H5vccSettings::H5vccSettings(media::MediaModule* media_module,
-                             cobalt::network::NetworkModule* network_module)
-    : media_module_(media_module), network_module_(network_module) {}
+                             cobalt::network::NetworkModule* network_module,
+                             dom::NavigatorUAData* user_agent_data,
+                             script::GlobalEnvironment* global_environment)
+    : media_module_(media_module),
+      network_module_(network_module),
+      user_agent_data_(user_agent_data),
+      global_environment_(global_environment) {}
 
 bool H5vccSettings::Set(const std::string& name, int32 value) const {
   const char kMediaPrefix[] = "Media.";
+  const char kNavigatorUAData[] = "NavigatorUAData";
   const char kQUIC[] = "QUIC";
 
-  if (SbStringCompare(name.c_str(), kMediaPrefix, sizeof(kMediaPrefix) - 1) ==
-      0) {
+  if (name.compare(kMediaPrefix) == 0) {
     return media_module_ ? media_module_->SetConfiguration(name, value) : false;
   }
 
-  if (SbStringCompare(name.c_str(), kQUIC, sizeof(kQUIC) - 1) == 0) {
+  if (name.compare(kNavigatorUAData) == 0 && value == 1) {
+    global_environment_->BindTo("userAgentData", user_agent_data_, "navigator");
+  }
+
+  if (name.compare(kQUIC) == 0) {
     if (!network_module_) {
       return false;
     } else {
@@ -40,6 +49,7 @@
       return true;
     }
   }
+
   return false;
 }
 
diff --git a/src/cobalt/h5vcc/h5vcc_settings.h b/src/cobalt/h5vcc/h5vcc_settings.h
index f0b2502..ec4d4c1 100644
--- a/src/cobalt/h5vcc/h5vcc_settings.h
+++ b/src/cobalt/h5vcc/h5vcc_settings.h
@@ -17,8 +17,10 @@
 
 #include <string>
 
+#include "cobalt/dom/navigator_ua_data.h"
 #include "cobalt/media/media_module.h"
 #include "cobalt/network/network_module.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/wrappable.h"
 
 namespace cobalt {
@@ -30,7 +32,9 @@
 class H5vccSettings : public script::Wrappable {
  public:
   explicit H5vccSettings(media::MediaModule* media_module,
-                         cobalt::network::NetworkModule* network_module);
+                         cobalt::network::NetworkModule* network_module,
+                         dom::NavigatorUAData* user_agent_data,
+                         script::GlobalEnvironment* global_environment);
 
   // Returns true when the setting is set successfully or if the setting has
   // already been set to the expected value.  Returns false when the setting is
@@ -42,6 +46,8 @@
  private:
   media::MediaModule* media_module_;
   cobalt::network::NetworkModule* network_module_ = nullptr;
+  dom::NavigatorUAData* user_agent_data_;
+  script::GlobalEnvironment* global_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(H5vccSettings);
 };
diff --git a/src/cobalt/layout_tests/layout_snapshot.cc b/src/cobalt/layout_tests/layout_snapshot.cc
index 196247d..703a6ad 100644
--- a/src/cobalt/layout_tests/layout_snapshot.cc
+++ b/src/cobalt/layout_tests/layout_snapshot.cc
@@ -14,6 +14,7 @@
 
 #include "cobalt/layout_tests/layout_snapshot.h"
 
+#include <memory>
 #include <string>
 
 #include "base/path_service.h"
diff --git a/src/cobalt/loader/image/animated_webp_image.cc b/src/cobalt/loader/image/animated_webp_image.cc
index 0d604ab..7b8dffd 100644
--- a/src/cobalt/loader/image/animated_webp_image.cc
+++ b/src/cobalt/loader/image/animated_webp_image.cc
@@ -118,14 +118,9 @@
     received_first_frame_ = true;
     loop_count_ = WebPDemuxGetI(demux_, WEBP_FF_LOOP_COUNT);
 
-    // The default background color of the canvas in [Blue, Green, Red, Alpha],
-    // from most significant byte to least significant byte.
-    uint32_t background_color = WebPDemuxGetI(demux_, WEBP_FF_BACKGROUND_COLOR);
-    background_color_ =
-        render_tree::ColorRGBA((background_color >> 8 & 0xff) / 255.0f,
-                               (background_color >> 16 & 0xff) / 255.0f,
-                               (background_color >> 24 & 0xff) / 255.0f,
-                               (background_color >> 0 & 0xff) / 255.0f);
+    // The background color for webp is treated as transparent white,
+    // thus pulling in whatever color the document uses.
+    background_color_ = render_tree::ColorRGBA(0, 0, 0, 0);
 
     if (is_playing_) {
       StartDecoding();
diff --git a/src/cobalt/math/matrix3_f.cc b/src/cobalt/math/matrix3_f.cc
index 54fdbc8..2d39b63 100644
--- a/src/cobalt/math/matrix3_f.cc
+++ b/src/cobalt/math/matrix3_f.cc
@@ -71,7 +71,7 @@
 // static
 Matrix3F Matrix3F::FromArray(const float data[9]) {
   Matrix3F matrix;
-  SbMemoryCopy(matrix.data_, data, sizeof(float) * 9);
+  memcpy(matrix.data_, data, sizeof(float) * 9);
   return matrix;
 }
 
@@ -97,7 +97,7 @@
 }
 
 bool Matrix3F::IsEqual(const Matrix3F& rhs) const {
-  return 0 == SbMemoryCompare(data_, rhs.data_, sizeof(data_));
+  return 0 == memcmp(data_, rhs.data_, sizeof(data_));
 }
 
 bool Matrix3F::IsNear(const Matrix3F& rhs, float precision) const {
diff --git a/src/cobalt/media/base/audio_bus.cc b/src/cobalt/media/base/audio_bus.cc
index ea63e7a..4aaf9c7 100644
--- a/src/cobalt/media/base/audio_bus.cc
+++ b/src/cobalt/media/base/audio_bus.cc
@@ -32,7 +32,7 @@
 inline void ConvertSample(AudioBus::SampleType src_type, const uint8* src_ptr,
                           AudioBus::SampleType dest_type, uint8* dest_ptr) {
   if (src_type == dest_type) {
-    SbMemoryCopy(dest_ptr, src_ptr,
+    memcpy(dest_ptr, src_ptr,
                  src_type == AudioBus::kInt16 ? sizeof(int16) : sizeof(float));
   } else if (src_type == AudioBus::kFloat32) {
     float sample_in_float = *reinterpret_cast<const float*>(src_ptr);
@@ -188,11 +188,11 @@
     return;
   }
   if (storage_type_ == kInterleaved) {
-    SbMemorySet(GetSamplePtr(0, start_frame), 0,
+    memset(GetSamplePtr(0, start_frame), 0,
                 GetSampleSizeInBytes() * (end_frame - start_frame) * channels_);
   } else {
     for (size_t channel = 0; channel < channels_; ++channel) {
-      SbMemorySet(GetSamplePtr(channel, start_frame), 0,
+      memset(GetSamplePtr(channel, start_frame), 0,
                   GetSampleSizeInBytes() * (end_frame - start_frame));
     }
   }
@@ -209,11 +209,11 @@
       storage_type_ == source.storage_type_) {
     size_t frames = std::min(frames_, source.frames_);
     if (storage_type_ == kInterleaved) {
-      SbMemoryCopy(GetSamplePtr(0, 0), source.GetSamplePtr(0, 0),
+      memcpy(GetSamplePtr(0, 0), source.GetSamplePtr(0, 0),
                    GetSampleSizeInBytes() * frames * channels_);
     } else {
       for (size_t channel = 0; channel < channels_; ++channel) {
-        SbMemoryCopy(GetSamplePtr(channel, 0), source.GetSamplePtr(channel, 0),
+        memcpy(GetSamplePtr(channel, 0), source.GetSamplePtr(channel, 0),
                      GetSampleSizeInBytes() * frames);
       }
     }
diff --git a/src/cobalt/media/base/bit_reader_core.cc b/src/cobalt/media/base/bit_reader_core.cc
index 5b046ee..13e5bbc 100644
--- a/src/cobalt/media/base/bit_reader_core.cc
+++ b/src/cobalt/media/base/bit_reader_core.cc
@@ -148,7 +148,7 @@
   if (window_size == 0) return false;
 
   reg_next_ = 0;
-  SbMemoryCopy(&reg_next_, byte_stream_window, window_size);
+  memcpy(&reg_next_, byte_stream_window, window_size);
   reg_next_ = base::NetToHost64(reg_next_);
   nbits_next_ = window_size * 8;
 
diff --git a/src/cobalt/media/base/byte_queue.cc b/src/cobalt/media/base/byte_queue.cc
index 882d6bf..49ad85c 100644
--- a/src/cobalt/media/base/byte_queue.cc
+++ b/src/cobalt/media/base/byte_queue.cc
@@ -45,18 +45,18 @@
     std::unique_ptr<uint8_t[]> new_buffer(new uint8_t[new_size]);
 
     // Copy the data from the old buffer to the start of the new one.
-    if (used_ > 0) SbMemoryCopy(new_buffer.get(), front(), used_);
+    if (used_ > 0) memcpy(new_buffer.get(), front(), used_);
 
     buffer_ = std::move(new_buffer);
     size_ = new_size;
     offset_ = 0;
   } else if ((offset_ + used_ + size) > size_) {
     // The buffer is big enough, but we need to move the data in the queue.
-    SbMemoryMove(buffer_.get(), front(), used_);
+    memmove(buffer_.get(), front(), used_);
     offset_ = 0;
   }
 
-  SbMemoryCopy(front() + used_, data, size);
+  memcpy(front() + used_, data, size);
   used_ += size;
 }
 
diff --git a/src/cobalt/media/base/color_space.cc b/src/cobalt/media/base/color_space.cc
index 2fea08b..7daabb1 100644
--- a/src/cobalt/media/base/color_space.cc
+++ b/src/cobalt/media/base/color_space.cc
@@ -50,7 +50,7 @@
       transfer_(kTransferIdUnspecified),
       matrix_(kMatrixIdUnspecified),
       range_(kRangeIdLimited) {
-  SbMemorySet(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
+  memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
 }
 
 ColorSpace::ColorSpace(PrimaryID primaries, TransferID transfer,
@@ -59,7 +59,7 @@
       transfer_(transfer),
       matrix_(matrix),
       range_(range) {
-  SbMemorySet(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
+  memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
 }
 
 ColorSpace::ColorSpace(int primaries, int transfer, int matrix, RangeID range)
@@ -67,7 +67,7 @@
       transfer_(TransferIDFromInt(transfer)),
       matrix_(MatrixIDFromInt(matrix)),
       range_(range) {
-  SbMemorySet(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
+  memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
 }
 
 ColorSpace::ColorSpace(const ColorSpace& other)
@@ -75,7 +75,7 @@
       transfer_(other.transfer_),
       matrix_(other.matrix_),
       range_(other.range_) {
-  SbMemoryCopy(custom_primary_matrix_, other.custom_primary_matrix_,
+  memcpy(custom_primary_matrix_, other.custom_primary_matrix_,
                sizeof(custom_primary_matrix_));
 }
 
@@ -110,8 +110,8 @@
       matrix_ != other.matrix_ || range_ != other.range_)
     return false;
   if (primaries_ == kPrimaryIdCustom &&
-      SbMemoryCompare(custom_primary_matrix_, other.custom_primary_matrix_,
-                      sizeof(custom_primary_matrix_)))
+      memcmp(custom_primary_matrix_, other.custom_primary_matrix_,
+             sizeof(custom_primary_matrix_)))
     return false;
   return true;
 }
@@ -131,7 +131,7 @@
   if (range_ > other.range_) return false;
   if (primaries_ == kPrimaryIdCustom) {
     int primary_result =
-        SbMemoryCompare(custom_primary_matrix_, other.custom_primary_matrix_,
+        memcmp(custom_primary_matrix_, other.custom_primary_matrix_,
                         sizeof(custom_primary_matrix_));
     if (primary_result < 0) return true;
     if (primary_result > 0) return false;
diff --git a/src/cobalt/media/base/container_names.cc b/src/cobalt/media/base/container_names.cc
index 4134db4..3ba334b 100644
--- a/src/cobalt/media/base/container_names.cc
+++ b/src/cobalt/media/base/container_names.cc
@@ -55,9 +55,9 @@
 // end of the buffer.
 static bool StartsWith(const uint8_t* buffer, size_t buffer_size,
                        const char* prefix) {
-  size_t prefix_size = SbStringGetLength(prefix);
+  size_t prefix_size = strlen(prefix);
   return (prefix_size <= buffer_size &&
-          SbMemoryCompare(buffer, prefix, prefix_size) == 0);
+          memcmp(buffer, prefix, prefix_size) == 0);
 }
 
 // Helper function to do buffer comparisons with another buffer (to allow for
@@ -65,7 +65,7 @@
 static bool StartsWith(const uint8_t* buffer, size_t buffer_size,
                        const uint8_t* prefix, size_t prefix_size) {
   return (prefix_size <= buffer_size &&
-          SbMemoryCompare(buffer, prefix, prefix_size) == 0);
+          memcmp(buffer, prefix, prefix_size) == 0);
 }
 
 // Helper function to read up to 64 bits from a bit stream.
@@ -606,7 +606,7 @@
     // "#EXT-X-MEDIA-SEQUENCE:" somewhere in the buffer. Other playlists (like
     // WinAmp) only have additional lines with #EXTINF
     // (http://en.wikipedia.org/wiki/M3U).
-    int offset = SbStringGetLength(kHlsSignature);
+    int offset = strlen(kHlsSignature);
     while (offset < buffer_size) {
       if (buffer[offset] == '#') {
         if (StartsWith(buffer + offset, buffer_size - offset, kHls1) ||
diff --git a/src/cobalt/media/base/container_names_unittest.cc b/src/cobalt/media/base/container_names_unittest.cc
index 66b9d5c..1783260 100644
--- a/src/cobalt/media/base/container_names_unittest.cc
+++ b/src/cobalt/media/base/container_names_unittest.cc
@@ -48,11 +48,11 @@
 
   // Try a large buffer all zeros.
   char buffer3[4096];
-  SbMemorySet(buffer3, 0, sizeof(buffer3));
+  memset(buffer3, 0, sizeof(buffer3));
   VERIFY(buffer3, CONTAINER_UNKNOWN);
 
   // Reuse buffer, but all \n this time.
-  SbMemorySet(buffer3, '\n', sizeof(buffer3));
+  memset(buffer3, '\n', sizeof(buffer3));
   VERIFY(buffer3, CONTAINER_UNKNOWN);
 }
 
diff --git a/src/cobalt/media/base/data_buffer.cc b/src/cobalt/media/base/data_buffer.cc
index c9f59bd..9f5f11b 100644
--- a/src/cobalt/media/base/data_buffer.cc
+++ b/src/cobalt/media/base/data_buffer.cc
@@ -35,7 +35,7 @@
 
   CHECK_GE(data_size, 0);
   data_.reset(new uint8_t[buffer_size_]);
-  SbMemoryCopy(data_.get(), data, data_size_);
+  memcpy(data_.get(), data, data_size_);
 }
 
 DataBuffer::~DataBuffer() {}
diff --git a/src/cobalt/media/base/data_buffer_unittest.cc b/src/cobalt/media/base/data_buffer_unittest.cc
index ddf2218..9eafcfa 100644
--- a/src/cobalt/media/base/data_buffer_unittest.cc
+++ b/src/cobalt/media/base/data_buffer_unittest.cc
@@ -59,9 +59,9 @@
   EXPECT_FALSE(buffer->end_of_stream());
 
   // Ensure we are copying the data, not just pointing to the original data.
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), kTestData, kTestDataSize));
+  EXPECT_EQ(0, memcmp(buffer->data(), kTestData, kTestDataSize));
   buffer->writable_data()[0] = 0xFF;
-  EXPECT_NE(0, SbMemoryCompare(buffer->data(), kTestData, kTestDataSize));
+  EXPECT_NE(0, memcmp(buffer->data(), kTestData, kTestDataSize));
 }
 
 TEST(DataBufferTest, CreateEOSBuffer) {
@@ -111,22 +111,22 @@
 
   uint8_t* data = buffer->writable_data();
   ASSERT_TRUE(data);
-  SbMemoryCopy(data, kData, kDataSize);
+  memcpy(data, kData, kDataSize);
   buffer->set_data_size(kDataSize);
   const uint8_t* read_only_data = buffer->data();
   ASSERT_EQ(data, read_only_data);
-  ASSERT_EQ(0, SbMemoryCompare(read_only_data, kData, kDataSize));
+  ASSERT_EQ(0, memcmp(read_only_data, kData, kDataSize));
   EXPECT_FALSE(buffer->end_of_stream());
 
   scoped_refptr<DataBuffer> buffer2(new DataBuffer(kNewDataSize + 10));
   data = buffer2->writable_data();
   ASSERT_TRUE(data);
-  SbMemoryCopy(data, kNewData, kNewDataSize);
+  memcpy(data, kNewData, kNewDataSize);
   buffer2->set_data_size(kNewDataSize);
   read_only_data = buffer2->data();
   EXPECT_EQ(kNewDataSize, buffer2->data_size());
   ASSERT_EQ(data, read_only_data);
-  EXPECT_EQ(0, SbMemoryCompare(read_only_data, kNewData, kNewDataSize));
+  EXPECT_EQ(0, memcmp(read_only_data, kNewData, kNewDataSize));
 }
 
 }  // namespace media
diff --git a/src/cobalt/media/base/decoder_buffer.cc b/src/cobalt/media/base/decoder_buffer.cc
index 34bb460..bbdddb0 100644
--- a/src/cobalt/media/base/decoder_buffer.cc
+++ b/src/cobalt/media/base/decoder_buffer.cc
@@ -87,7 +87,7 @@
   if (side_data_size_ > 0) {
     DCHECK(side_data);
     side_data_.reset(new uint8_t[side_data_size_]);
-    SbMemoryCopy(side_data_.get(), side_data, side_data_size_);
+    memcpy(side_data_.get(), side_data, side_data_size_);
   }
 }
 
@@ -104,7 +104,7 @@
   }
   if (side_data_size_ > 0) {
     side_data_.reset(new uint8_t[side_data_size_]);
-    SbMemoryCopy(side_data_.get(), side_data, side_data_size_);
+    memcpy(side_data_.get(), side_data, side_data_size_);
   }
 }
 
diff --git a/src/cobalt/media/base/decoder_buffer_unittest.cc b/src/cobalt/media/base/decoder_buffer_unittest.cc
index 26a5de9..f539c78 100644
--- a/src/cobalt/media/base/decoder_buffer_unittest.cc
+++ b/src/cobalt/media/base/decoder_buffer_unittest.cc
@@ -44,7 +44,7 @@
   ASSERT_TRUE(buffer2.get());
   EXPECT_NE(kData, buffer2->data());
   EXPECT_EQ(buffer2->data_size(), kDataSize);
-  EXPECT_EQ(0, SbMemoryCompare(buffer2->data(), kData, kDataSize));
+  EXPECT_EQ(0, memcmp(buffer2->data(), kData, kDataSize));
   EXPECT_FALSE(buffer2->end_of_stream());
   EXPECT_FALSE(buffer2->is_key_frame());
 
@@ -54,10 +54,10 @@
   ASSERT_TRUE(buffer3.get());
   EXPECT_NE(kData, buffer3->data());
   EXPECT_EQ(buffer3->data_size(), kDataSize);
-  EXPECT_EQ(0, SbMemoryCompare(buffer3->data(), kData, kDataSize));
+  EXPECT_EQ(0, memcmp(buffer3->data(), kData, kDataSize));
   EXPECT_NE(kData, buffer3->side_data());
   EXPECT_EQ(buffer3->side_data_size(), kDataSize);
-  EXPECT_EQ(0, SbMemoryCompare(buffer3->side_data(), kData, kDataSize));
+  EXPECT_EQ(0, memcmp(buffer3->side_data(), kData, kDataSize));
   EXPECT_FALSE(buffer3->end_of_stream());
   EXPECT_FALSE(buffer3->is_key_frame());
 }
@@ -78,7 +78,7 @@
   // the end of the data by DecoderBuffer::kPaddingSize bytes without crashing
   // or Valgrind/ASAN throwing errors.
   const uint8_t kFillChar = 0xFF;
-  SbMemorySet(buffer2->writable_data() + kDataSize, kFillChar,
+  memset(buffer2->writable_data() + kDataSize, kFillChar,
               DecoderBuffer::kPaddingSize);
   for (int i = 0; i < DecoderBuffer::kPaddingSize; i++)
     EXPECT_EQ((buffer2->data() + kDataSize)[i], kFillChar);
@@ -100,10 +100,10 @@
   uint8_t* data = buffer->writable_data();
   ASSERT_TRUE(data);
   ASSERT_EQ(kDataSize, buffer->data_size());
-  SbMemoryCopy(data, kData, kDataSize);
+  memcpy(data, kData, kDataSize);
   const uint8_t* read_only_data = buffer->data();
   ASSERT_EQ(data, read_only_data);
-  ASSERT_EQ(0, SbMemoryCompare(read_only_data, kData, kDataSize));
+  ASSERT_EQ(0, memcmp(read_only_data, kData, kDataSize));
   EXPECT_FALSE(buffer->end_of_stream());
 }
 
diff --git a/src/cobalt/media/base/drm_system.cc b/src/cobalt/media/base/drm_system.cc
index 43bafed..11bbbd1 100644
--- a/src/cobalt/media/base/drm_system.cc
+++ b/src/cobalt/media/base/drm_system.cc
@@ -423,7 +423,7 @@
                     static_cast<const char*>(session_id) + session_id_size);
 
     content_copy.reset(new uint8[content_size]);
-    SbMemoryCopy(content_copy.get(), content, content_size);
+    memcpy(content_copy.get(), content, content_size);
   }
 
   drm_system->message_loop_->PostTask(
diff --git a/src/cobalt/media/base/endian_util.h b/src/cobalt/media/base/endian_util.h
index a568f0a..cafb4a0 100644
--- a/src/cobalt/media/base/endian_util.h
+++ b/src/cobalt/media/base/endian_util.h
@@ -30,42 +30,42 @@
 // Load 2 little-endian bytes at |p| and return as a host-endian uint16_t.
 inline uint16_t load_uint16_little_endian(const uint8_t* p) {
   uint16_t aligned_p;
-  SbMemoryCopy(&aligned_p, p, sizeof(aligned_p));
+  memcpy(&aligned_p, p, sizeof(aligned_p));
   return base::ByteSwapToLE16(aligned_p);
 }
 
 // Load 4 little-endian bytes at |p| and return as a host-endian uint32_t.
 inline uint32_t load_uint32_little_endian(const uint8_t* p) {
   uint32_t aligned_p;
-  SbMemoryCopy(&aligned_p, p, sizeof(aligned_p));
+  memcpy(&aligned_p, p, sizeof(aligned_p));
   return base::ByteSwapToLE32(aligned_p);
 }
 
 // Load 8 little-endian bytes at |p| and return as a host-endian uint64_t.
 inline uint64_t load_uint64_little_endian(const uint8_t* p) {
   uint64_t aligned_p;
-  SbMemoryCopy(&aligned_p, p, sizeof(aligned_p));
+  memcpy(&aligned_p, p, sizeof(aligned_p));
   return base::ByteSwapToLE64(aligned_p);
 }
 
 // Load 2 big-endian bytes at |p| and return as a host-endian uint16_t.
 inline uint16_t load_uint16_big_endian(const uint8_t* p) {
   uint16_t aligned_p;
-  SbMemoryCopy(&aligned_p, p, sizeof(aligned_p));
+  memcpy(&aligned_p, p, sizeof(aligned_p));
   return base::NetToHost16(aligned_p);
 }
 
 // Load 4 big-endian bytes at |p| and return as a host-endian uint32_t.
 inline uint32_t load_uint32_big_endian(const uint8_t* p) {
   uint32_t aligned_p;
-  SbMemoryCopy(&aligned_p, p, sizeof(aligned_p));
+  memcpy(&aligned_p, p, sizeof(aligned_p));
   return base::NetToHost32(aligned_p);
 }
 
 // Load 8 big-endian bytes at |p| and return as a host-endian uint64_t.
 inline uint64_t load_uint64_big_endian(const uint8_t* p) {
   uint64_t aligned_p;
-  SbMemoryCopy(&aligned_p, p, sizeof(aligned_p));
+  memcpy(&aligned_p, p, sizeof(aligned_p));
   return base::NetToHost64(aligned_p);
 }
 
@@ -102,37 +102,37 @@
 // Store 2 host-endian bytes as big-endian at |p|.
 inline void store_uint16_big_endian(uint16_t d, uint8_t* p) {
   uint16_t big_d = base::HostToNet16(d);
-  SbMemoryCopy(p, &big_d, sizeof(big_d));
+  memcpy(p, &big_d, sizeof(big_d));
 }
 
 // Store 4 host-endian bytes as big-endian at |p|.
 inline void store_uint32_big_endian(uint32_t d, uint8_t* p) {
   uint32_t big_d = base::HostToNet32(d);
-  SbMemoryCopy(p, &big_d, sizeof(big_d));
+  memcpy(p, &big_d, sizeof(big_d));
 }
 
 // Store 8 host-endian bytes as big-endian at |p|.
 inline void store_uint64_big_endian(uint64_t d, uint8_t* p) {
   uint64_t big_d = base::HostToNet64(d);
-  SbMemoryCopy(p, &big_d, sizeof(big_d));
+  memcpy(p, &big_d, sizeof(big_d));
 }
 
 // Store 2 host-endian bytes as little-endian at |p|.
 inline void store_uint16_little_endian(uint16_t d, uint8_t* p) {
   uint16_t little_d = base::ByteSwapToLE16(d);
-  SbMemoryCopy(p, &little_d, sizeof(little_d));
+  memcpy(p, &little_d, sizeof(little_d));
 }
 
 // Store 4 host-endian bytes as little-endian at |p|.
 inline void store_uint32_little_endian(uint32_t d, uint8_t* p) {
   uint32_t little_d = base::ByteSwapToLE32(d);
-  SbMemoryCopy(p, &little_d, sizeof(little_d));
+  memcpy(p, &little_d, sizeof(little_d));
 }
 
 // Store 8 host-endian bytes as little-endian at |p|.
 inline void store_uint64_little_endian(uint64_t d, uint8_t* p) {
   uint64_t little_d = base::ByteSwapToLE64(d);
-  SbMemoryCopy(p, &little_d, sizeof(little_d));
+  memcpy(p, &little_d, sizeof(little_d));
 }
 
 }  // namespace endian_util
diff --git a/src/cobalt/media/base/interleaved_sinc_resampler.cc b/src/cobalt/media/base/interleaved_sinc_resampler.cc
index 316ec42..5756cb8 100644
--- a/src/cobalt/media/base/interleaved_sinc_resampler.cc
+++ b/src/cobalt/media/base/interleaved_sinc_resampler.cc
@@ -87,7 +87,7 @@
   Buffer() : frames_(0) {}
   Buffer(const float* data, int frames, int channel_count) : frames_(frames) {
     data_.reset(new float[frames * channel_count]);
-    SbMemoryCopy(data_.get(), data, frames * channel_count * sizeof(float));
+    memcpy(data_.get(), data, frames * channel_count * sizeof(float));
   }
   Buffer(std::unique_ptr<float[]> data, int frames)
       : data_(std::move(data)), frames_(frames) {}
@@ -148,9 +148,9 @@
   DCHECK_EQ(r5_ + kBlockSize * channel_count_,
             r1_ + kBufferSize * channel_count_);
 
-  SbMemorySet(kernel_storage_.get(), 0,
+  memset(kernel_storage_.get(), 0,
               sizeof(*kernel_storage_.get()) * kKernelStorageSize);
-  SbMemorySet(input_buffer_.get(), 0, frame_size_in_bytes_ * kBufferSize);
+  memset(input_buffer_.get(), 0, frame_size_in_bytes_ * kBufferSize);
 
   InitializeKernel();
 }
@@ -286,8 +286,8 @@
 
     // Step (3) Copy r3_ to r1_ and r4_ to r2_.
     // This wraps the last input frames back to the start of the buffer.
-    SbMemoryCopy(r1_, r3_, frame_size_in_bytes_ * (kKernelSize / 2));
-    SbMemoryCopy(r2_, r4_, frame_size_in_bytes_ * (kKernelSize / 2));
+    memcpy(r1_, r3_, frame_size_in_bytes_ * (kKernelSize / 2));
+    memcpy(r2_, r4_, frame_size_in_bytes_ * (kKernelSize / 2));
 
     // Step (4)
     // Refresh the buffer with more input.
@@ -300,7 +300,7 @@
 void InterleavedSincResampler::Flush() {
   virtual_source_idx_ = 0;
   buffer_primed_ = false;
-  SbMemorySet(input_buffer_.get(), 0, frame_size_in_bytes_ * kBufferSize);
+  memset(input_buffer_.get(), 0, frame_size_in_bytes_ * kBufferSize);
   while (!pending_buffers_.empty()) {
     pending_buffers_.pop();
   }
@@ -344,7 +344,7 @@
     scoped_refptr<Buffer> buffer = pending_buffers_.front();
     if (buffer->IsEndOfStream()) {
       // Zero fill the buffer after EOS has reached.
-      SbMemorySet(destination, 0, frame_size_in_bytes_ * frames);
+      memset(destination, 0, frame_size_in_bytes_ * frames);
       return;
     }
     // Copy the data over.
@@ -352,7 +352,7 @@
     int frames_to_copy = std::min(frames_in_buffer - offset_in_frames_, frames);
     const float* source = buffer->GetData();
     source += offset_in_frames_ * channel_count_;
-    SbMemoryCopy(destination, source, frame_size_in_bytes_ * frames_to_copy);
+    memcpy(destination, source, frame_size_in_bytes_ * frames_to_copy);
     offset_in_frames_ += frames_to_copy;
     // Pop the first buffer if all its content has been read.
     if (offset_in_frames_ == frames_in_buffer) {
diff --git a/src/cobalt/media/base/sbplayer_pipeline.cc b/src/cobalt/media/base/sbplayer_pipeline.cc
index 275e020..aefa84b 100644
--- a/src/cobalt/media/base/sbplayer_pipeline.cc
+++ b/src/cobalt/media/base/sbplayer_pipeline.cc
@@ -406,13 +406,13 @@
     const char* init_data_type, const unsigned char* init_data,
     unsigned int init_data_length) {
   media::EmeInitDataType init_data_type_enum;
-  if (!SbStringCompareAll(init_data_type, "cenc")) {
+  if (!strcmp(init_data_type, "cenc")) {
     init_data_type_enum = media::kEmeInitDataTypeCenc;
-  } else if (!SbStringCompareAll(init_data_type, "fairplay")) {
+  } else if (!strcmp(init_data_type, "fairplay")) {
     init_data_type_enum = media::kEmeInitDataTypeFairplay;
-  } else if (!SbStringCompareAll(init_data_type, "keyids")) {
+  } else if (!strcmp(init_data_type, "keyids")) {
     init_data_type_enum = media::kEmeInitDataTypeKeyIds;
-  } else if (!SbStringCompareAll(init_data_type, "webm")) {
+  } else if (!strcmp(init_data_type, "webm")) {
     init_data_type_enum = media::kEmeInitDataTypeWebM;
   } else {
     LOG(WARNING) << "Unknown EME initialization data type.";
diff --git a/src/cobalt/media/base/seekable_buffer.cc b/src/cobalt/media/base/seekable_buffer.cc
index 90df123..a0a649b 100644
--- a/src/cobalt/media/base/seekable_buffer.cc
+++ b/src/cobalt/media/base/seekable_buffer.cc
@@ -201,7 +201,7 @@
 
       // |data| is NULL if we are seeking forward, so there's no need to copy.
       if (data)
-        SbMemoryCopy(data + taken, buffer->data() + current_buffer_offset,
+        memcpy(data + taken, buffer->data() + current_buffer_offset,
                      copied);
 
       // Increase total number of bytes copied, which regulates when to end this
diff --git a/src/cobalt/media/base/seekable_buffer_unittest.cc b/src/cobalt/media/base/seekable_buffer_unittest.cc
index 595fc9e..fde513c 100644
--- a/src/cobalt/media/base/seekable_buffer_unittest.cc
+++ b/src/cobalt/media/base/seekable_buffer_unittest.cc
@@ -65,14 +65,14 @@
     int bytes_copied = buffer_.Peek(write_buffer_, copy_size);
     EXPECT_GE(copy_size, bytes_copied);
     EXPECT_EQ(
-        0, SbMemoryCompare(write_buffer_, data_ + read_position, bytes_copied));
+        0, memcmp(write_buffer_, data_ + read_position, bytes_copied));
 
     // Read a random amount of data.
     int read_size = GetRandomInt(kBufferSize);
     int bytes_read = buffer_.Read(write_buffer_, read_size);
     EXPECT_GE(read_size, bytes_read);
     EXPECT_EQ(
-        0, SbMemoryCompare(write_buffer_, data_ + read_position, bytes_read));
+        0, memcmp(write_buffer_, data_ + read_position, bytes_read));
     read_position += bytes_read;
     EXPECT_GE(write_position, read_position);
     EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
@@ -101,7 +101,7 @@
       forward_bytes -= kReadSize;
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
       read_position += kReadSize;
 
       // Seek forward.
@@ -114,14 +114,14 @@
       EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize));
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
 
       // Read.
       EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
       forward_bytes -= kReadSize;
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
       read_position += kReadSize;
 
       // Seek backward.
@@ -134,28 +134,28 @@
       EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize));
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
 
       // Read.
       EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
       forward_bytes -= kReadSize;
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
       read_position += kReadSize;
 
       // Copy.
       EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize));
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
 
       // Read.
       EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
       forward_bytes -= kReadSize;
       EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
       EXPECT_EQ(
-          0, SbMemoryCompare(write_buffer_, data_ + read_position, kReadSize));
+          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
       read_position += kReadSize;
 
       // Seek forward.
@@ -191,7 +191,7 @@
     int forward_bytes = buffer_.forward_bytes();
     int bytes_read = buffer_.Read(write_buffer_, read_size);
     EXPECT_EQ(
-        0, SbMemoryCompare(write_buffer_, data_ + read_position, bytes_read));
+        0, memcmp(write_buffer_, data_ + read_position, bytes_read));
     if (read_size > forward_bytes)
       EXPECT_EQ(forward_bytes, bytes_read);
     else
@@ -223,7 +223,7 @@
   // Read until buffer is empty.
   for (int i = 0; i < kBufferSize; i += kReadSize) {
     EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-    EXPECT_EQ(0, SbMemoryCompare(write_buffer_, data_ + i, kReadSize));
+    EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize));
   }
 
   // Seek backward.
@@ -233,7 +233,7 @@
   // Read again.
   for (int i = 0; i < kBufferSize; i += kReadSize) {
     EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-    EXPECT_EQ(0, SbMemoryCompare(write_buffer_, data_ + i, kReadSize));
+    EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize));
   }
 }
 
@@ -286,7 +286,7 @@
     int bytes_read = buffer_.Read(write_buffer_, read_size);
     EXPECT_GE(read_size, bytes_read);
     EXPECT_EQ(
-        0, SbMemoryCompare(write_buffer_, data_ + read_position, bytes_read));
+        0, memcmp(write_buffer_, data_ + read_position, bytes_read));
     read_position += bytes_read;
     EXPECT_GE(write_position, read_position);
     EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
diff --git a/src/cobalt/media/base/starboard_utils.cc b/src/cobalt/media/base/starboard_utils.cc
index d56c2ee..d875717 100644
--- a/src/cobalt/media/base/starboard_utils.cc
+++ b/src/cobalt/media/base/starboard_utils.cc
@@ -182,10 +182,10 @@
     return;
   }
 
-  SbMemoryCopy(drm_info->initialization_vector, &config->iv()[0],
+  memcpy(drm_info->initialization_vector, &config->iv()[0],
                config->iv().size());
   drm_info->initialization_vector_size = config->iv().size();
-  SbMemoryCopy(drm_info->identifier, &config->key_id()[0],
+  memcpy(drm_info->identifier, &config->key_id()[0],
                config->key_id().size());
   drm_info->identifier_size = config->key_id().size();
   drm_info->subsample_count = config->subsamples().size();
@@ -362,8 +362,9 @@
       static_cast<SbMediaRangeId>(color_space.range());
   if (sb_media_color_metadata.primaries == kSbMediaPrimaryIdCustom) {
     const float* custom_primary_matrix = color_space.custom_primary_matrix();
-    SbMemoryCopy(sb_media_color_metadata.custom_primary_matrix,
-                 custom_primary_matrix, sizeof(custom_primary_matrix));
+    memcpy(sb_media_color_metadata.custom_primary_matrix,
+           custom_primary_matrix,
+           sizeof(sb_media_color_metadata.custom_primary_matrix));
   }
 
   return sb_media_color_metadata;
diff --git a/src/cobalt/media/base/text_renderer.cc b/src/cobalt/media/base/text_renderer.cc
index 0c08ae1..74a4869 100644
--- a/src/cobalt/media/base/text_renderer.cc
+++ b/src/cobalt/media/base/text_renderer.cc
@@ -184,11 +184,11 @@
   // The side data contains both the cue id and cue settings,
   // each terminated with a NUL.
   const char* id_ptr = reinterpret_cast<const char*>(input->side_data());
-  size_t id_len = SbStringGetLength(id_ptr);
+  size_t id_len = strlen(id_ptr);
   std::string id(id_ptr, id_len);
 
   const char* settings_ptr = id_ptr + id_len + 1;
-  size_t settings_len = SbStringGetLength(settings_ptr);
+  size_t settings_len = strlen(settings_ptr);
   std::string settings(settings_ptr, settings_len);
 
   // The cue payload is stored in the data-part of the input buffer.
diff --git a/src/cobalt/media/base/vector_math_unittest.cc b/src/cobalt/media/base/vector_math_unittest.cc
index abe87d5..405a7e3 100644
--- a/src/cobalt/media/base/vector_math_unittest.cc
+++ b/src/cobalt/media/base/vector_math_unittest.cc
@@ -163,7 +163,7 @@
         smoothing_factor_(smoothing_factor),
         expected_final_avg_(initial_value),
         expected_max_(0.0f) {
-    if (data_len_ > 0) SbMemoryCopy(data_.get(), src, len * sizeof(float));
+    if (data_len_ > 0) memcpy(data_.get(), src, len * sizeof(float));
   }
 
   // Copy constructor and assignment operator for ::testing::Values(...).
@@ -176,7 +176,7 @@
     } else {
       this->data_.reset(static_cast<float*>(base::AlignedAlloc(
           other.data_len_ * sizeof(float), vector_math::kRequiredAlignment)));
-      SbMemoryCopy(this->data_.get(), other.data_.get(),
+      memcpy(this->data_.get(), other.data_.get(),
                    other.data_len_ * sizeof(float));
     }
     this->data_len_ = other.data_len_;
diff --git a/src/cobalt/media/base/video_codecs.cc b/src/cobalt/media/base/video_codecs.cc
index 230c302..07d88c8 100644
--- a/src/cobalt/media/base/video_codecs.cc
+++ b/src/cobalt/media/base/video_codecs.cc
@@ -207,10 +207,10 @@
   //         std::vector<std::string> fields = base::SplitString(
   //             codec_id, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
   //       once Chromium base rebase is finished.
-  if (SbStringFindCharacter(codec_id.c_str(), ' ') != nullptr) {
+  if (strchr(codec_id.c_str(), ' ') != nullptr) {
     return false;
   }
-  if (SbStringFindString(codec_id.c_str(), "..") != nullptr) {
+  if (strstr(codec_id.c_str(), "..") != nullptr) {
     return false;
   }
   std::vector<std::string> fields = base::SplitString(
@@ -570,7 +570,7 @@
   if (level_idc) *level_idc = static_cast<uint8_t>(general_level_idc);
 
   uint8_t constraint_flags[6];
-  SbMemorySet(constraint_flags, 0, sizeof(constraint_flags));
+  memset(constraint_flags, 0, sizeof(constraint_flags));
 
   if (elem.size() > 10) {
     DVLOG(4) << __func__ << ": unexpected number of trailing bytes in HEVC "
diff --git a/src/cobalt/media/base/video_frame.cc b/src/cobalt/media/base/video_frame.cc
index 5d739ab..212622f 100644
--- a/src/cobalt/media/base/video_frame.cc
+++ b/src/cobalt/media/base/video_frame.cc
@@ -815,9 +815,9 @@
       unique_id_(g_unique_id_generator.GetNext()) {
   DCHECK(IsValidConfig(format_, storage_type, coded_size_, visible_rect_,
                        natural_size_));
-  SbMemorySet(&mailbox_holders_, 0, sizeof(mailbox_holders_));
-  SbMemorySet(&strides_, 0, sizeof(strides_));
-  SbMemorySet(&data_, 0, sizeof(data_));
+  memset(&mailbox_holders_, 0, sizeof(mailbox_holders_));
+  memset(&strides_, 0, sizeof(strides_));
+  memset(&data_, 0, sizeof(data_));
 }
 
 VideoFrame::~VideoFrame() {
@@ -901,7 +901,7 @@
                        base::TimeDelta timestamp)
     : VideoFrame(format, storage_type, coded_size, visible_rect, natural_size,
                  timestamp) {
-  SbMemoryCopy(&mailbox_holders_, mailbox_holders, sizeof(mailbox_holders_));
+  memcpy(&mailbox_holders_, mailbox_holders, sizeof(mailbox_holders_));
   mailbox_holders_release_cb_ = mailbox_holder_release_cb;
 }
 
@@ -1071,7 +1071,7 @@
 
   uint8_t* data = reinterpret_cast<uint8_t*>(
       base::AlignedAlloc(data_size, kFrameAddressAlignment));
-  if (zero_initialize_memory) SbMemorySet(data, 0, data_size);
+  if (zero_initialize_memory) memset(data, 0, data_size);
 
   for (size_t plane = 0; plane < NumPlanes(format_); ++plane)
     data_[plane] = data + offset[plane];
diff --git a/src/cobalt/media/base/video_frame_metadata.cc b/src/cobalt/media/base/video_frame_metadata.cc
index 8345a51..f277666 100644
--- a/src/cobalt/media/base/video_frame_metadata.cc
+++ b/src/cobalt/media/base/video_frame_metadata.cc
@@ -122,7 +122,7 @@
   DCHECK(value);
   int64_t internal_value;
   if (binary_value.GetSize() != sizeof(internal_value)) return false;
-  SbMemoryCopy(&internal_value, binary_value.GetBuffer(),
+  memcpy(&internal_value, binary_value.GetBuffer(),
                sizeof(internal_value));
   *value = TimeType::FromInternalValue(internal_value);
   return true;
diff --git a/src/cobalt/media/base/video_util.cc b/src/cobalt/media/base/video_util.cc
index 1877645..ef11801 100644
--- a/src/cobalt/media/base/video_util.cc
+++ b/src/cobalt/media/base/video_util.cc
@@ -69,12 +69,12 @@
         // Fast copy by rows.
         dest += width * (height - 1);
         for (int row = 0; row < height; ++row) {
-          SbMemoryCopy(dest, src, width);
+          memcpy(dest, src, width);
           src += width;
           dest -= width;
         }
       } else {
-        SbMemoryCopy(dest, src, width * height);
+        memcpy(dest, src, width * height);
       }
       return;
     }
diff --git a/src/cobalt/media/base/video_util_unittest.cc b/src/cobalt/media/base/video_util_unittest.cc
index 44cd554..1ba349d 100644
--- a/src/cobalt/media/base/video_util_unittest.cc
+++ b/src/cobalt/media/base/video_util_unittest.cc
@@ -75,14 +75,14 @@
   const uint8_t *src_ptr = src, *dst_ptr = dst;
   for (size_t i = 0; i < src_height;
        ++i, src_ptr += src_stride, dst_ptr += dst_stride) {
-    if (SbMemoryCompare(src_ptr, dst_ptr, src_width)) return false;
+    if (memcmp(src_ptr, dst_ptr, src_width)) return false;
     for (size_t j = src_width; j < dst_width; ++j) {
       if (src_ptr[src_width - 1] != dst_ptr[j]) return false;
     }
   }
   if (src_height < dst_height) {
     src_ptr = dst + (src_height - 1) * dst_stride;
-    if (SbMemoryCompare(src_ptr, dst_ptr, dst_width)) return false;
+    if (memcmp(src_ptr, dst_ptr, dst_width)) return false;
   }
   return true;
 }
@@ -360,12 +360,12 @@
 
   int size = GetParam().width * GetParam().height;
   uint8_t* dest = dest_plane();
-  SbMemorySet(dest, 255, size);
+  memset(dest, 255, size);
 
   RotatePlaneByPixels(GetParam().src, dest, GetParam().width, GetParam().height,
                       rotation, GetParam().flip_vert, GetParam().flip_horiz);
 
-  EXPECT_EQ(SbMemoryCompare(dest, GetParam().target, size), 0);
+  EXPECT_EQ(memcmp(dest, GetParam().target, size), 0);
 }
 
 INSTANTIATE_TEST_CASE_P(, VideoUtilRotationTest,
diff --git a/src/cobalt/media/base/yuv_convert.cc b/src/cobalt/media/base/yuv_convert.cc
index 6fe6d99..19cf9f4 100644
--- a/src/cobalt/media/base/yuv_convert.cc
+++ b/src/cobalt/media/base/yuv_convert.cc
@@ -407,7 +407,7 @@
         g_filter_yuv_rows_proc_(ybuf, y_ptr, y_ptr + y_pitch, source_width,
                                 source_y_fraction);
       } else {
-        SbMemoryCopy(ybuf, y_ptr, source_width);
+        memcpy(ybuf, y_ptr, source_width);
       }
       y_ptr = ybuf;
       ybuf[source_width] = ybuf[source_width - 1];
@@ -429,8 +429,8 @@
         g_filter_yuv_rows_proc_(vbuf, v_ptr, v_ptr + uv_pitch, uv_source_width,
                                 source_uv_fraction);
       } else {
-        SbMemoryCopy(ubuf, u_ptr, uv_source_width);
-        SbMemoryCopy(vbuf, v_ptr, uv_source_width);
+        memcpy(ubuf, u_ptr, uv_source_width);
+        memcpy(vbuf, v_ptr, uv_source_width);
       }
       u_ptr = ubuf;
       v_ptr = vbuf;
@@ -531,7 +531,7 @@
   const bool kAvoidUsingOptimizedFilter = source_width > kFilterBufferSize;
   uint8_t yuv_temp[16 + kFilterBufferSize * 3 + 16];
   // memset() yuv_temp to 0 to avoid bogus warnings when running on Valgrind.
-  if (RunningOnValgrind()) SbMemorySet(yuv_temp, 0, sizeof(yuv_temp));
+  if (RunningOnValgrind()) memset(yuv_temp, 0, sizeof(yuv_temp));
   uint8_t* y_temp = reinterpret_cast<uint8_t*>(
       reinterpret_cast<uintptr_t>(yuv_temp + 15) & ~15);
   uint8_t* u_temp = y_temp + kFilterBufferSize;
diff --git a/src/cobalt/media/base/yuv_convert_unittest.cc b/src/cobalt/media/base/yuv_convert_unittest.cc
index 5b7cb31..daf2af3 100644
--- a/src/cobalt/media/base/yuv_convert_unittest.cc
+++ b/src/cobalt/media/base/yuv_convert_unittest.cc
@@ -341,7 +341,7 @@
   SwapRedAndBlueChannels(rgb, kBpp);
 #endif
 
-  int expected_test = SbMemoryCompare(rgb, expected, sizeof(expected));
+  int expected_test = memcmp(rgb, expected, sizeof(expected));
   EXPECT_EQ(0, expected_test);
 }
 
@@ -522,7 +522,7 @@
       kSourceWidth / 2, kSourceWidth, kSourceWidth * kBpp, media::YV12);
 
   EXPECT_EQ(0,
-            SbMemoryCompare(rgb_converted_bytes.get(),
+            memcmp(rgb_converted_bytes.get(),
                             rgb_converted_bytes_ref.get(), kRGBSizeConverted));
 }
 #endif  // !defined(OS_ANDROID)
@@ -626,7 +626,7 @@
                            rgb_bytes_converted.get(), kWidth,
                            GetLookupTable(YV12));
   media::EmptyRegisterState();
-  EXPECT_EQ(0, SbMemoryCompare(rgb_bytes_reference.get(),
+  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
                                rgb_bytes_converted.get(), kWidth * kBpp));
 }
 
@@ -656,7 +656,7 @@
                          rgb_bytes_converted.get(), kWidth, kSourceDx,
                          GetLookupTable(YV12));
   media::EmptyRegisterState();
-  EXPECT_EQ(0, SbMemoryCompare(rgb_bytes_reference.get(),
+  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
                                rgb_bytes_converted.get(), kWidth * kBpp));
 }
 
@@ -683,7 +683,7 @@
       yuv_bytes.get() + kSourceVOffset, rgb_bytes_converted.get(), kWidth,
       kSourceDx, GetLookupTable(YV12));
   media::EmptyRegisterState();
-  EXPECT_EQ(0, SbMemoryCompare(rgb_bytes_reference.get(),
+  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
                                rgb_bytes_converted.get(), kWidth * kBpp));
 }
 #endif  // defined(OS_WIN) && (ARCH_CPU_X86 || COMPONENT_BUILD)
@@ -692,8 +692,8 @@
   std::unique_ptr<uint8_t[]> src(new uint8_t[16]);
   std::unique_ptr<uint8_t[]> dst(new uint8_t[16]);
 
-  SbMemorySet(src.get(), 0xff, 16);
-  SbMemorySet(dst.get(), 0, 16);
+  memset(src.get(), 0xff, 16);
+  memset(dst.get(), 0, 16);
 
   media::FilterYUVRows_C(dst.get(), src.get(), src.get(), 1, 255);
 
@@ -713,8 +713,8 @@
   std::unique_ptr<uint8_t[]> src(new uint8_t[16]);
   std::unique_ptr<uint8_t[]> dst(new uint8_t[16]);
 
-  SbMemorySet(src.get(), 0xff, 16);
-  SbMemorySet(dst.get(), 0, 16);
+  memset(src.get(), 0xff, 16);
+  memset(dst.get(), 0, 16);
 
   media::FilterYUVRows_SSE2(dst.get(), src.get(), src.get(), 1, 255);
 
@@ -736,8 +736,8 @@
   std::unique_ptr<uint8_t[]> dst_sample(new uint8_t[kSize]);
   std::unique_ptr<uint8_t[]> dst(new uint8_t[kSize]);
 
-  SbMemorySet(dst_sample.get(), 0, kSize);
-  SbMemorySet(dst.get(), 0, kSize);
+  memset(dst_sample.get(), 0, kSize);
+  memset(dst.get(), 0, kSize);
   for (int i = 0; i < kSize; ++i) src[i] = 100 + i;
 
   media::FilterYUVRows_C(dst_sample.get(), src.get(), src.get(), 37, 128);
@@ -748,7 +748,7 @@
   media::FilterYUVRows_SSE2(dst_ptr, src.get(), src.get(), 37, 128);
   media::EmptyRegisterState();
 
-  EXPECT_EQ(0, SbMemoryCompare(dst_sample.get(), dst_ptr, 37));
+  EXPECT_EQ(0, memcmp(dst_sample.get(), dst_ptr, 37));
 }
 
 #if defined(ARCH_CPU_X86_64)
@@ -770,7 +770,7 @@
                               rgb_bytes_converted.get(), kWidth, kSourceDx,
                               GetLookupTable(YV12));
   media::EmptyRegisterState();
-  EXPECT_EQ(0, SbMemoryCompare(rgb_bytes_reference.get(),
+  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
                                rgb_bytes_converted.get(), kWidth * kBpp));
 }
 
@@ -791,7 +791,7 @@
       yuv_bytes.get() + kSourceVOffset, rgb_bytes_converted.get(), kWidth,
       kSourceDx, GetLookupTable(YV12));
   media::EmptyRegisterState();
-  EXPECT_EQ(0, SbMemoryCompare(rgb_bytes_reference.get(),
+  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
                                rgb_bytes_converted.get(), kWidth * kBpp));
 }
 
diff --git a/src/cobalt/media/filters/chunk_demuxer_unittest.cc b/src/cobalt/media/filters/chunk_demuxer_unittest.cc
index 09066a8..3fc5b67 100644
--- a/src/cobalt/media/filters/chunk_demuxer_unittest.cc
+++ b/src/cobalt/media/filters/chunk_demuxer_unittest.cc
@@ -267,7 +267,7 @@
       if (stream_flags & USE_ALTERNATE_TEXT_TRACK_ID)
         str[4] = kAlternateTextTrackNum;
 
-      const int len = SbStringGetLength(str);
+      const int len = strlen(str);
       DCHECK_EQ(len, 32);
       const uint8_t* const buf = reinterpret_cast<const uint8_t*>(str);
       text_track_entry = DecoderBuffer::CopyFrom(buf, len);
@@ -281,23 +281,23 @@
     buffer->reset(new uint8_t[*size]);
 
     uint8_t* buf = buffer->get();
-    SbMemoryCopy(buf, ebml_header->data(), ebml_header->data_size());
+    memcpy(buf, ebml_header->data(), ebml_header->data_size());
     buf += ebml_header->data_size();
 
-    SbMemoryCopy(buf, info->data(), info->data_size());
+    memcpy(buf, info->data(), info->data_size());
     buf += info->data_size();
 
-    SbMemoryCopy(buf, kTracksHeader, kTracksHeaderSize);
+    memcpy(buf, kTracksHeader, kTracksHeaderSize);
     WriteInt64(buf + kTracksSizeOffset, tracks_element_size);
     buf += kTracksHeaderSize;
 
     // TODO(xhwang): Simplify this! Probably have test data files that contain
     // ContentEncodings directly instead of trying to create one at run-time.
     if (has_video) {
-      SbMemoryCopy(buf, video_track_entry->data(),
+      memcpy(buf, video_track_entry->data(),
                    video_track_entry->data_size());
       if (is_video_encrypted) {
-        SbMemoryCopy(buf + video_track_entry->data_size(),
+        memcpy(buf + video_track_entry->data_size(),
                      video_content_encodings->data(),
                      video_content_encodings->data_size());
         WriteInt64(buf + kVideoTrackSizeOffset,
@@ -310,10 +310,10 @@
     }
 
     if (has_audio) {
-      SbMemoryCopy(buf, audio_track_entry->data(),
+      memcpy(buf, audio_track_entry->data(),
                    audio_track_entry->data_size());
       if (is_audio_encrypted) {
-        SbMemoryCopy(buf + audio_track_entry->data_size(),
+        memcpy(buf + audio_track_entry->data_size(),
                      audio_content_encodings->data(),
                      audio_content_encodings->data_size());
         WriteInt64(buf + kAudioTrackSizeOffset,
@@ -326,7 +326,7 @@
     }
 
     if (has_text) {
-      SbMemoryCopy(buf, text_track_entry->data(),
+      memcpy(buf, text_track_entry->data(),
                    text_track_entry->data_size());
       buf += text_track_entry->data_size();
     }
@@ -2046,13 +2046,13 @@
   size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size();
   std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
   uint8_t* dst = buffer.get();
-  SbMemoryCopy(dst, info_tracks.get(), info_tracks_size);
+  memcpy(dst, info_tracks.get(), info_tracks_size);
   dst += info_tracks_size;
 
-  SbMemoryCopy(dst, cluster_a->data(), cluster_a->size());
+  memcpy(dst, cluster_a->data(), cluster_a->size());
   dst += cluster_a->size();
 
-  SbMemoryCopy(dst, cluster_b->data(), cluster_b->size());
+  memcpy(dst, cluster_b->data(), cluster_b->size());
   dst += cluster_b->size();
 
   ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
diff --git a/src/cobalt/media/filters/h264_bitstream_buffer.cc b/src/cobalt/media/filters/h264_bitstream_buffer.cc
index 9aa7b18..083d668 100644
--- a/src/cobalt/media/filters/h264_bitstream_buffer.cc
+++ b/src/cobalt/media/filters/h264_bitstream_buffer.cc
@@ -52,7 +52,7 @@
   // Make sure we have enough space. Grow() will CHECK() on allocation failure.
   if (pos_ + bytes_in_reg < capacity_) Grow();
 
-  SbMemoryCopy(data_ + pos_, &reg_, bytes_in_reg);
+  memcpy(data_ + pos_, &reg_, bytes_in_reg);
   pos_ += bytes_in_reg;
 
   reg_ = 0;
diff --git a/src/cobalt/media/filters/h264_parser.cc b/src/cobalt/media/filters/h264_parser.cc
index 29284b9..6ce658c 100644
--- a/src/cobalt/media/filters/h264_parser.cc
+++ b/src/cobalt/media/filters/h264_parser.cc
@@ -28,9 +28,9 @@
 
 bool H264SliceHeader::IsSISlice() const { return (slice_type % 5 == kSISlice); }
 
-H264NALU::H264NALU() { SbMemorySet(this, 0, sizeof(*this)); }
+H264NALU::H264NALU() { memset(this, 0, sizeof(*this)); }
 
-H264SPS::H264SPS() { SbMemorySet(this, 0, sizeof(*this)); }
+H264SPS::H264SPS() { memset(this, 0, sizeof(*this)); }
 
 // Based on T-REC-H.264 7.4.2.1.1, "Sequence parameter set data semantics",
 // available from http://www.itu.int/rec/T-REC-H.264.
@@ -107,11 +107,11 @@
                     coded_size->height() - crop_top - crop_bottom);
 }
 
-H264PPS::H264PPS() { SbMemorySet(this, 0, sizeof(*this)); }
+H264PPS::H264PPS() { memset(this, 0, sizeof(*this)); }
 
-H264SliceHeader::H264SliceHeader() { SbMemorySet(this, 0, sizeof(*this)); }
+H264SliceHeader::H264SliceHeader() { memset(this, 0, sizeof(*this)); }
 
-H264SEIMessage::H264SEIMessage() { SbMemorySet(this, 0, sizeof(*this)); }
+H264SEIMessage::H264SEIMessage() { memset(this, 0, sizeof(*this)); }
 
 #define READ_BITS_OR_RETURN(num_bits, out)                                 \
   do {                                                                     \
@@ -492,10 +492,10 @@
   DCHECK_LT(i, 6);
 
   if (i < 3)
-    SbMemoryCopy(scaling_list4x4[i], kDefault4x4Intra,
+    memcpy(scaling_list4x4[i], kDefault4x4Intra,
                  sizeof(kDefault4x4Intra));
   else if (i < 6)
-    SbMemoryCopy(scaling_list4x4[i], kDefault4x4Inter,
+    memcpy(scaling_list4x4[i], kDefault4x4Inter,
                  sizeof(kDefault4x4Inter));
 }
 
@@ -504,10 +504,10 @@
   DCHECK_LT(i, 6);
 
   if (i % 2 == 0)
-    SbMemoryCopy(scaling_list8x8[i], kDefault8x8Intra,
+    memcpy(scaling_list8x8[i], kDefault8x8Intra,
                  sizeof(kDefault8x8Intra));
   else
-    SbMemoryCopy(scaling_list8x8[i], kDefault8x8Inter,
+    memcpy(scaling_list8x8[i], kDefault8x8Inter,
                  sizeof(kDefault8x8Inter));
 }
 
@@ -520,32 +520,32 @@
 
   switch (i) {
     case 0:
-      SbMemoryCopy(scaling_list4x4[i], default_scaling_list_intra,
+      memcpy(scaling_list4x4[i], default_scaling_list_intra,
                    kScalingList4x4ByteSize);
       break;
 
     case 1:
-      SbMemoryCopy(scaling_list4x4[i], scaling_list4x4[0],
+      memcpy(scaling_list4x4[i], scaling_list4x4[0],
                    kScalingList4x4ByteSize);
       break;
 
     case 2:
-      SbMemoryCopy(scaling_list4x4[i], scaling_list4x4[1],
+      memcpy(scaling_list4x4[i], scaling_list4x4[1],
                    kScalingList4x4ByteSize);
       break;
 
     case 3:
-      SbMemoryCopy(scaling_list4x4[i], default_scaling_list_inter,
+      memcpy(scaling_list4x4[i], default_scaling_list_inter,
                    kScalingList4x4ByteSize);
       break;
 
     case 4:
-      SbMemoryCopy(scaling_list4x4[i], scaling_list4x4[3],
+      memcpy(scaling_list4x4[i], scaling_list4x4[3],
                    kScalingList4x4ByteSize);
       break;
 
     case 5:
-      SbMemoryCopy(scaling_list4x4[i], scaling_list4x4[4],
+      memcpy(scaling_list4x4[i], scaling_list4x4[4],
                    kScalingList4x4ByteSize);
       break;
 
@@ -564,32 +564,32 @@
 
   switch (i) {
     case 0:
-      SbMemoryCopy(scaling_list8x8[i], default_scaling_list_intra,
+      memcpy(scaling_list8x8[i], default_scaling_list_intra,
                    kScalingList8x8ByteSize);
       break;
 
     case 1:
-      SbMemoryCopy(scaling_list8x8[i], default_scaling_list_inter,
+      memcpy(scaling_list8x8[i], default_scaling_list_inter,
                    kScalingList8x8ByteSize);
       break;
 
     case 2:
-      SbMemoryCopy(scaling_list8x8[i], scaling_list8x8[0],
+      memcpy(scaling_list8x8[i], scaling_list8x8[0],
                    kScalingList8x8ByteSize);
       break;
 
     case 3:
-      SbMemoryCopy(scaling_list8x8[i], scaling_list8x8[1],
+      memcpy(scaling_list8x8[i], scaling_list8x8[1],
                    kScalingList8x8ByteSize);
       break;
 
     case 4:
-      SbMemoryCopy(scaling_list8x8[i], scaling_list8x8[2],
+      memcpy(scaling_list8x8[i], scaling_list8x8[2],
                    kScalingList8x8ByteSize);
       break;
 
     case 5:
-      SbMemoryCopy(scaling_list8x8[i], scaling_list8x8[3],
+      memcpy(scaling_list8x8[i], scaling_list8x8[3],
                    kScalingList8x8ByteSize);
       break;
 
@@ -1216,7 +1216,7 @@
   const H264PPS* pps;
   Result res;
 
-  SbMemorySet(shdr, 0, sizeof(*shdr));
+  memset(shdr, 0, sizeof(*shdr));
 
   shdr->idr_pic_flag = (nalu.nal_unit_type == 5);
   shdr->nal_ref_idc = nalu.nal_ref_idc;
@@ -1358,7 +1358,7 @@
 H264Parser::Result H264Parser::ParseSEI(H264SEIMessage* sei_msg) {
   int byte;
 
-  SbMemorySet(sei_msg, 0, sizeof(*sei_msg));
+  memset(sei_msg, 0, sizeof(*sei_msg));
 
   READ_BITS_OR_RETURN(8, &byte);
   while (byte == 0xff) {
diff --git a/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc b/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc
index 6e207ab..0d98421 100644
--- a/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc
+++ b/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc
@@ -232,10 +232,10 @@
 
     // No need to write leading zero bits.
     // Write start-code prefix.
-    SbMemoryCopy(outscan, kStartCodePrefix, sizeof(kStartCodePrefix));
+    memcpy(outscan, kStartCodePrefix, sizeof(kStartCodePrefix));
     outscan += sizeof(kStartCodePrefix);
     // Then write the actual NAL unit from the input buffer.
-    SbMemoryCopy(outscan, inscan, nal_unit_length);
+    memcpy(outscan, inscan, nal_unit_length);
     inscan += nal_unit_length;
     data_left -= nal_unit_length;
     outscan += nal_unit_length;
@@ -266,11 +266,11 @@
 
   // Write the 4 byte Annex B start code.
   *buf++ = 0;  // zero byte
-  SbMemoryCopy(buf, kStartCodePrefix, sizeof(kStartCodePrefix));
+  memcpy(buf, kStartCodePrefix, sizeof(kStartCodePrefix));
   buf += sizeof(kStartCodePrefix);
 
   // Copy the data.
-  SbMemoryCopy(buf, &param_set[0], size);
+  memcpy(buf, &param_set[0], size);
   buf += size;
 
   *out = buf;
diff --git a/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc b/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc
index db74160..f678d74 100644
--- a/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc
+++ b/src/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc
@@ -330,7 +330,7 @@
   // Simulate 10 sps AVCDecoderConfigurationRecord,
   // which would extend beyond the buffer.
   uint8_t corrupted_header[sizeof(kHeaderDataOkWithFieldLen4)];
-  SbMemoryCopy(corrupted_header, kHeaderDataOkWithFieldLen4,
+  memcpy(corrupted_header, kHeaderDataOkWithFieldLen4,
                sizeof(kHeaderDataOkWithFieldLen4));
   // 6th byte, 5 LSBs contain the number of sps's.
   corrupted_header[5] = corrupted_header[5] | 0xA;
@@ -360,7 +360,7 @@
 
   // Simulate NAL unit broken in middle by writing only some of the data.
   uint8_t corrupted_nal_unit[sizeof(kPacketDataOkWithFieldLen4) - 100];
-  SbMemoryCopy(corrupted_nal_unit, kPacketDataOkWithFieldLen4,
+  memcpy(corrupted_nal_unit, kPacketDataOkWithFieldLen4,
                sizeof(kPacketDataOkWithFieldLen4) - 100);
 
   // Calculate buffer size for actual NAL unit, should return 0 because of
diff --git a/src/cobalt/media/filters/h265_parser.cc b/src/cobalt/media/filters/h265_parser.cc
index e755b5e..18b5e5f 100644
--- a/src/cobalt/media/filters/h265_parser.cc
+++ b/src/cobalt/media/filters/h265_parser.cc
@@ -34,7 +34,7 @@
     }                                                                \
   } while (0)
 
-H265NALU::H265NALU() { SbMemorySet(this, 0, sizeof(*this)); }
+H265NALU::H265NALU() { memset(this, 0, sizeof(*this)); }
 
 H265Parser::H265Parser() { Reset(); }
 
diff --git a/src/cobalt/media/filters/ivf_parser.cc b/src/cobalt/media/filters/ivf_parser.cc
index fddaad9..6744688 100644
--- a/src/cobalt/media/filters/ivf_parser.cc
+++ b/src/cobalt/media/filters/ivf_parser.cc
@@ -42,11 +42,11 @@
     return false;
   }
 
-  SbMemoryCopy(file_header, ptr_, sizeof(IvfFileHeader));
+  memcpy(file_header, ptr_, sizeof(IvfFileHeader));
   file_header->ByteSwap();
 
-  if (SbMemoryCompare(file_header->signature, kIvfHeaderSignature,
-                      sizeof(file_header->signature)) != 0) {
+  if (memcmp(file_header->signature, kIvfHeaderSignature,
+             sizeof(file_header->signature)) != 0) {
     DLOG(ERROR) << "IVF signature mismatch";
     return false;
   }
@@ -73,7 +73,7 @@
     return false;
   }
 
-  SbMemoryCopy(frame_header, ptr_, sizeof(IvfFrameHeader));
+  memcpy(frame_header, ptr_, sizeof(IvfFrameHeader));
   frame_header->ByteSwap();
   ptr_ += sizeof(IvfFrameHeader);
 
diff --git a/src/cobalt/media/filters/ivf_parser_unittest.cc b/src/cobalt/media/filters/ivf_parser_unittest.cc
index 085d9c7..0dab9bb 100644
--- a/src/cobalt/media/filters/ivf_parser_unittest.cc
+++ b/src/cobalt/media/filters/ivf_parser_unittest.cc
@@ -26,8 +26,8 @@
   EXPECT_TRUE(parser.Initialize(stream.data(), stream.length(), &file_header));
 
   // Check file header fields.
-  EXPECT_EQ(0, SbMemoryCompare(file_header.signature, kIvfHeaderSignature,
-                               sizeof(file_header.signature)));
+  EXPECT_EQ(0, memcmp(file_header.signature, kIvfHeaderSignature,
+                      sizeof(file_header.signature)));
   EXPECT_EQ(0, file_header.version);
   EXPECT_EQ(sizeof(IvfFileHeader), file_header.header_size);
   EXPECT_EQ(0x30385056u, file_header.fourcc);  // VP80
diff --git a/src/cobalt/media/filters/vp8_parser.cc b/src/cobalt/media/filters/vp8_parser.cc
index af0ce27..7477e05 100644
--- a/src/cobalt/media/filters/vp8_parser.cc
+++ b/src/cobalt/media/filters/vp8_parser.cc
@@ -43,7 +43,7 @@
     *out = _out;                                                      \
   } while (0)
 
-Vp8FrameHeader::Vp8FrameHeader() { SbMemorySet(this, 0, sizeof(*this)); }
+Vp8FrameHeader::Vp8FrameHeader() { memset(this, 0, sizeof(*this)); }
 
 Vp8Parser::Vp8Parser() : stream_(NULL), bytes_left_(0) {}
 
@@ -54,7 +54,7 @@
   stream_ = ptr;
   bytes_left_ = frame_size;
 
-  SbMemorySet(fhdr, 0, sizeof(*fhdr));
+  memset(fhdr, 0, sizeof(*fhdr));
   fhdr->data = stream_;
   fhdr->frame_size = bytes_left_;
 
@@ -98,7 +98,7 @@
     if (bytes_left_ < kKeyframeTagSize) return false;
 
     static const uint8_t kVp8StartCode[] = {0x9d, 0x01, 0x2a};
-    if (SbMemoryCompare(stream_, kVp8StartCode, sizeof(kVp8StartCode)) != 0)
+    if (memcmp(stream_, kVp8StartCode, sizeof(kVp8StartCode)) != 0)
       return false;
 
     stream_ += sizeof(kVp8StartCode);
@@ -206,7 +206,7 @@
 bool Vp8Parser::ParseSegmentationHeader(bool keyframe) {
   Vp8SegmentationHeader* shdr = &curr_segmentation_hdr_;
 
-  if (keyframe) SbMemorySet(shdr, 0, sizeof(*shdr));
+  if (keyframe) memset(shdr, 0, sizeof(*shdr));
 
   BD_READ_BOOL_OR_RETURN(&shdr->segmentation_enabled);
   if (!shdr->segmentation_enabled) return true;
@@ -255,7 +255,7 @@
 bool Vp8Parser::ParseLoopFilterHeader(bool keyframe) {
   Vp8LoopFilterHeader* lfhdr = &curr_loopfilter_hdr_;
 
-  if (keyframe) SbMemorySet(lfhdr, 0, sizeof(*lfhdr));
+  if (keyframe) memset(lfhdr, 0, sizeof(*lfhdr));
 
   int type;
   BD_READ_UNSIGNED_OR_RETURN(1, &type);
@@ -288,7 +288,7 @@
 
 bool Vp8Parser::ParseQuantizationHeader(Vp8QuantizationHeader* qhdr) {
   // If any of the delta values is not present, the delta should be zero.
-  SbMemorySet(qhdr, 0, sizeof(*qhdr));
+  memset(qhdr, 0, sizeof(*qhdr));
 
   BD_READ_UNSIGNED_OR_RETURN(7, &qhdr->y_ac_qi);
 
@@ -683,24 +683,24 @@
   static_assert(
       sizeof(curr_entropy_hdr_.coeff_probs) == sizeof(kDefaultCoeffProbs),
       "coeff_probs_arrays_must_be_of_correct_size");
-  SbMemoryCopy(curr_entropy_hdr_.coeff_probs, kDefaultCoeffProbs,
+  memcpy(curr_entropy_hdr_.coeff_probs, kDefaultCoeffProbs,
                sizeof(curr_entropy_hdr_.coeff_probs));
 
   static_assert(sizeof(curr_entropy_hdr_.mv_probs) == sizeof(kDefaultMVProbs),
                 "mv_probs_arrays_must_be_of_correct_size");
-  SbMemoryCopy(curr_entropy_hdr_.mv_probs, kDefaultMVProbs,
+  memcpy(curr_entropy_hdr_.mv_probs, kDefaultMVProbs,
                sizeof(curr_entropy_hdr_.mv_probs));
 
   static_assert(
       sizeof(curr_entropy_hdr_.y_mode_probs) == sizeof(kDefaultYModeProbs),
       "y_probs_arrays_must_be_of_correct_size");
-  SbMemoryCopy(curr_entropy_hdr_.y_mode_probs, kDefaultYModeProbs,
+  memcpy(curr_entropy_hdr_.y_mode_probs, kDefaultYModeProbs,
                sizeof(curr_entropy_hdr_.y_mode_probs));
 
   static_assert(
       sizeof(curr_entropy_hdr_.uv_mode_probs) == sizeof(kDefaultUVModeProbs),
       "uv_probs_arrays_must_be_of_correct_size");
-  SbMemoryCopy(curr_entropy_hdr_.uv_mode_probs, kDefaultUVModeProbs,
+  memcpy(curr_entropy_hdr_.uv_mode_probs, kDefaultUVModeProbs,
                sizeof(curr_entropy_hdr_.uv_mode_probs));
 }
 
@@ -721,7 +721,7 @@
   }
 
   if (update_curr_probs) {
-    SbMemoryCopy(curr_entropy_hdr_.coeff_probs, ehdr->coeff_probs,
+    memcpy(curr_entropy_hdr_.coeff_probs, ehdr->coeff_probs,
                  sizeof(curr_entropy_hdr_.coeff_probs));
   }
 
@@ -733,12 +733,12 @@
   if (keyframe) {
     static_assert(sizeof(ehdr->y_mode_probs) == sizeof(kKeyframeYModeProbs),
                   "y_probs_arrays_must_be_of_correct_size");
-    SbMemoryCopy(ehdr->y_mode_probs, kKeyframeYModeProbs,
+    memcpy(ehdr->y_mode_probs, kKeyframeYModeProbs,
                  sizeof(ehdr->y_mode_probs));
 
     static_assert(sizeof(ehdr->uv_mode_probs) == sizeof(kKeyframeUVModeProbs),
                   "uv_probs_arrays_must_be_of_correct_size");
-    SbMemoryCopy(ehdr->uv_mode_probs, kKeyframeUVModeProbs,
+    memcpy(ehdr->uv_mode_probs, kKeyframeUVModeProbs,
                  sizeof(ehdr->uv_mode_probs));
   } else {
     bool intra_16x16_prob_update_flag;
@@ -748,7 +748,7 @@
         BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->y_mode_probs[i]);
 
       if (update_curr_probs) {
-        SbMemoryCopy(curr_entropy_hdr_.y_mode_probs, ehdr->y_mode_probs,
+        memcpy(curr_entropy_hdr_.y_mode_probs, ehdr->y_mode_probs,
                      sizeof(curr_entropy_hdr_.y_mode_probs));
       }
     }
@@ -760,7 +760,7 @@
         BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->uv_mode_probs[i]);
 
       if (update_curr_probs) {
-        SbMemoryCopy(curr_entropy_hdr_.uv_mode_probs, ehdr->uv_mode_probs,
+        memcpy(curr_entropy_hdr_.uv_mode_probs, ehdr->uv_mode_probs,
                      sizeof(curr_entropy_hdr_.uv_mode_probs));
       }
     }
@@ -784,7 +784,7 @@
   }
 
   if (update_curr_probs) {
-    SbMemoryCopy(curr_entropy_hdr_.mv_probs, ehdr->mv_probs,
+    memcpy(curr_entropy_hdr_.mv_probs, ehdr->mv_probs,
                  sizeof(curr_entropy_hdr_.mv_probs));
   }
 
diff --git a/src/cobalt/media/filters/vp9_parser.cc b/src/cobalt/media/filters/vp9_parser.cc
index b49c909..42d35d9 100644
--- a/src/cobalt/media/filters/vp9_parser.cc
+++ b/src/cobalt/media/filters/vp9_parser.cc
@@ -149,9 +149,9 @@
 }
 
 void Vp9Parser::Context::Reset() {
-  SbMemorySet(&segmentation_, 0, sizeof(segmentation_));
-  SbMemorySet(&loop_filter_, 0, sizeof(loop_filter_));
-  SbMemorySet(&ref_slots_, 0, sizeof(ref_slots_));
+  memset(&segmentation_, 0, sizeof(segmentation_));
+  memset(&loop_filter_, 0, sizeof(loop_filter_));
+  memset(&ref_slots_, 0, sizeof(ref_slots_));
   for (auto& manager : frame_context_managers_) manager.Reset();
 }
 
@@ -224,7 +224,7 @@
     curr_frame_info_ = frames_.front();
     frames_.pop_front();
 
-    SbMemorySet(&curr_frame_header_, 0, sizeof(curr_frame_header_));
+    memset(&curr_frame_header_, 0, sizeof(curr_frame_header_));
 
     Vp9UncompressedHeaderParser uncompressed_parser(&context_);
     if (!uncompressed_parser.Parse(curr_frame_info_.ptr, curr_frame_info_.size,
@@ -504,7 +504,7 @@
     }
 
     if (!loop_filter.delta_enabled) {
-      SbMemorySet(loop_filter.lvl[i], level, sizeof(loop_filter.lvl[i]));
+      memset(loop_filter.lvl[i], level, sizeof(loop_filter.lvl[i]));
     } else {
       loop_filter.lvl[i][Vp9RefType::VP9_FRAME_INTRA][0] = ClampLf(
           level + loop_filter.ref_deltas[Vp9RefType::VP9_FRAME_INTRA] * scale);
diff --git a/src/cobalt/media/filters/vp9_parser_unittest.cc b/src/cobalt/media/filters/vp9_parser_unittest.cc
index 46b1437..3df5f61 100644
--- a/src/cobalt/media/filters/vp9_parser_unittest.cc
+++ b/src/cobalt/media/filters/vp9_parser_unittest.cc
@@ -151,11 +151,11 @@
 
     Vp9FrameContext frame_context;
     ReadContext(&frame_context);
-    EXPECT_TRUE(SbMemoryCompare(&frame_context, &fhdr.initial_frame_context,
+    EXPECT_TRUE(memcmp(&frame_context, &fhdr.initial_frame_context,
                                 sizeof(frame_context)) == 0);
     ReadContext(&frame_context);
-    EXPECT_TRUE(SbMemoryCompare(&frame_context, &fhdr.frame_context,
-                                sizeof(frame_context)) == 0);
+    EXPECT_TRUE(memcmp(&frame_context, &fhdr.frame_context,
+                       sizeof(frame_context)) == 0);
 
     // test-25fps.vp9 doesn't need frame update from driver.
     auto context_refresh_cb = GetContextRefreshCb(fhdr);
@@ -186,11 +186,11 @@
 
     Vp9FrameContext frame_context;
     ReadContext(&frame_context);
-    EXPECT_TRUE(SbMemoryCompare(&frame_context, &fhdr.initial_frame_context,
+    EXPECT_TRUE(memcmp(&frame_context, &fhdr.initial_frame_context,
                                 sizeof(frame_context)) == 0);
     ReadContext(&frame_context);
-    EXPECT_TRUE(SbMemoryCompare(&frame_context, &fhdr.frame_context,
-                                sizeof(frame_context)) == 0);
+    EXPECT_TRUE(memcmp(&frame_context, &fhdr.frame_context,
+                       sizeof(frame_context)) == 0);
 
     bool should_update = ReadShouldContextUpdate();
     auto context_refresh_cb = GetContextRefreshCb(fhdr);
diff --git a/src/cobalt/media/filters/vp9_uncompressed_header_parser.cc b/src/cobalt/media/filters/vp9_uncompressed_header_parser.cc
index 516bf29..cac65ed 100644
--- a/src/cobalt/media/filters/vp9_uncompressed_header_parser.cc
+++ b/src/cobalt/media/filters/vp9_uncompressed_header_parser.cc
@@ -757,7 +757,7 @@
 }
 
 void Vp9UncompressedHeaderParser::SetupPastIndependence(Vp9FrameHeader* fhdr) {
-  SbMemorySet(&context_->segmentation_, 0, sizeof(context_->segmentation_));
+  memset(&context_->segmentation_, 0, sizeof(context_->segmentation_));
   ResetLoopfilter();
   fhdr->frame_context = kVp9DefaultFrameContext;
   DCHECK(fhdr->frame_context.IsValid());
@@ -898,7 +898,7 @@
   loop_filter.ref_deltas[VP9_FRAME_GOLDEN] = -1;
   loop_filter.ref_deltas[VP9_FRAME_ALTREF] = -1;
 
-  SbMemorySet(loop_filter.mode_deltas, 0, sizeof(loop_filter.mode_deltas));
+  memset(loop_filter.mode_deltas, 0, sizeof(loop_filter.mode_deltas));
 }
 
 // 6.2 Uncompressed header syntax
diff --git a/src/cobalt/media/filters/wsola_internals.cc b/src/cobalt/media/filters/wsola_internals.cc
index 507893e..9e372e7 100644
--- a/src/cobalt/media/filters/wsola_internals.cc
+++ b/src/cobalt/media/filters/wsola_internals.cc
@@ -44,7 +44,7 @@
   DCHECK_LE(frame_offset_a + num_frames, a->frames());
   DCHECK_LE(frame_offset_b + num_frames, b->frames());
 
-  SbMemorySet(dot_product, 0, sizeof(*dot_product) * a->channels());
+  memset(dot_product, 0, sizeof(*dot_product) * a->channels());
   for (int k = 0; k < a->channels(); ++k) {
     const float* ch_a = a->channel(k) + frame_offset_a;
     const float* ch_b = b->channel(k) + frame_offset_b;
@@ -173,7 +173,7 @@
       optimal_index = n;
       best_similarity = similarity[2];
     }
-    SbMemoryMove(similarity, &similarity[1], 2 * sizeof(*similarity));
+    memmove(similarity, &similarity[1], 2 * sizeof(*similarity));
   }
   return optimal_index;
 }
diff --git a/src/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc b/src/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc
index a191fdc..c1149d0 100644
--- a/src/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc
+++ b/src/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc
@@ -118,10 +118,10 @@
     access_units_with_aud[k].offset = offset;
     access_units_with_aud[k].size = access_units_[k].size + sizeof(aud);
 
-    SbMemoryCopy(&stream_with_aud[offset], aud, sizeof(aud));
+    memcpy(&stream_with_aud[offset], aud, sizeof(aud));
     offset += sizeof(aud);
 
-    SbMemoryCopy(&stream_with_aud[offset], &stream_[access_units_[k].offset],
+    memcpy(&stream_with_aud[offset], &stream_[access_units_[k].offset],
                  access_units_[k].size);
     offset += access_units_[k].size;
   }
diff --git a/src/cobalt/media/formats/mp2t/es_parser_test_base.cc b/src/cobalt/media/formats/mp2t/es_parser_test_base.cc
index 2ea6049..7315320 100644
--- a/src/cobalt/media/formats/mp2t/es_parser_test_base.cc
+++ b/src/cobalt/media/formats/mp2t/es_parser_test_base.cc
@@ -33,7 +33,7 @@
       << "Couldn't open stream file: " << file_path.MaybeAsASCII();
 
   stream_.resize(stream.length());
-  SbMemoryCopy(&stream_[0], stream.data(), stream_.size());
+  memcpy(&stream_[0], stream.data(), stream_.size());
 }
 
 std::vector<EsParserTestBase::Packet> EsParserTestBase::LoadPacketsFromFiles(
diff --git a/src/cobalt/media/formats/mp4/avc_unittest.cc b/src/cobalt/media/formats/mp4/avc_unittest.cc
index cedae77..3e37c68 100644
--- a/src/cobalt/media/formats/mp4/avc_unittest.cc
+++ b/src/cobalt/media/formats/mp4/avc_unittest.cc
@@ -221,7 +221,7 @@
   EXPECT_TRUE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, &subsamples));
   EXPECT_TRUE(AVC::IsValidAnnexB(buf, subsamples));
   EXPECT_EQ(buf.size(), sizeof(kExpected));
-  EXPECT_EQ(0, SbMemoryCompare(kExpected, &buf[0], sizeof(kExpected)));
+  EXPECT_EQ(0, memcmp(kExpected, &buf[0], sizeof(kExpected)));
   EXPECT_EQ("P,SDC", AnnexBToString(buf, subsamples));
 }
 
@@ -326,7 +326,7 @@
   std::vector<uint8_t> buf;
   std::vector<SubsampleEntry> subsamples;
   EXPECT_TRUE(AVC::ConvertConfigToAnnexB(avc_config, &buf));
-  EXPECT_EQ(0, SbMemoryCompare(kExpectedParamSets, &buf[0],
+  EXPECT_EQ(0, memcmp(kExpectedParamSets, &buf[0],
                                sizeof(kExpectedParamSets)));
   EXPECT_EQ("SPS,SPS,PPS", AnnexBToString(buf, subsamples));
 }
diff --git a/src/cobalt/media/formats/mp4/box_definitions.cc b/src/cobalt/media/formats/mp4/box_definitions.cc
index b070a72..0fc6975 100644
--- a/src/cobalt/media/formats/mp4/box_definitions.cc
+++ b/src/cobalt/media/formats/mp4/box_definitions.cc
@@ -174,7 +174,7 @@
   // the constant IV must be ensured by the caller.
   RCHECK(iv_size == 0 || iv_size == 8 || iv_size == 16);
 
-  SbMemorySet(initialization_vector, 0, sizeof(initialization_vector));
+  memset(initialization_vector, 0, sizeof(initialization_vector));
   for (uint8_t i = 0; i < iv_size; i++)
     RCHECK(reader->Read1(initialization_vector + i));
 
@@ -265,7 +265,7 @@
     if (default_iv_size == 0) {
       RCHECK(reader->Read1(&default_constant_iv_size));
       RCHECK(default_constant_iv_size == 8 || default_constant_iv_size == 16);
-      SbMemorySet(default_constant_iv, 0, sizeof(default_constant_iv));
+      memset(default_constant_iv, 0, sizeof(default_constant_iv));
       for (uint8_t i = 0; i < default_constant_iv_size; i++)
         RCHECK(reader->Read1(default_constant_iv + i));
     } else {
@@ -1244,7 +1244,7 @@
     if (iv_size == 0) {
       RCHECK(reader->Read1(&constant_iv_size));
       RCHECK(constant_iv_size == 8 || constant_iv_size == 16);
-      SbMemorySet(constant_iv, 0, sizeof(constant_iv));
+      memset(constant_iv, 0, sizeof(constant_iv));
       for (uint8_t i = 0; i < constant_iv_size; i++)
         RCHECK(reader->Read1(constant_iv + i));
     } else {
diff --git a/src/cobalt/media/formats/mp4/mp4_stream_parser.cc b/src/cobalt/media/formats/mp4/mp4_stream_parser.cc
index 71b9b4f..d76ac05 100644
--- a/src/cobalt/media/formats/mp4/mp4_stream_parser.cc
+++ b/src/cobalt/media/formats/mp4/mp4_stream_parser.cc
@@ -572,7 +572,7 @@
   std::vector<uint8_t> init_data(total_size);
   size_t pos = 0;
   for (size_t i = 0; i < headers.size(); i++) {
-    SbMemoryCopy(&init_data[pos], &headers[i].raw_box[0],
+    memcpy(&init_data[pos], &headers[i].raw_box[0],
                  headers[i].raw_box.size());
     pos += headers[i].raw_box.size();
   }
diff --git a/src/cobalt/media/formats/mp4/track_run_iterator.cc b/src/cobalt/media/formats/mp4/track_run_iterator.cc
index 8a787cf..e64f895 100644
--- a/src/cobalt/media/formats/mp4/track_run_iterator.cc
+++ b/src/cobalt/media/formats/mp4/track_run_iterator.cc
@@ -455,7 +455,7 @@
             const uint8_t* constant_iv =
                 index == 0 ? track_encryption->default_constant_iv
                            : info_entry->constant_iv;
-            SbMemoryCopy(entry.initialization_vector, constant_iv,
+            memcpy(entry.initialization_vector, constant_iv,
                          constant_iv_size);
           }
         }
@@ -742,7 +742,7 @@
       index == 0 ? track_encryption().default_constant_iv
                  : GetSampleEncryptionInfoEntry(*run_itr_, index)->constant_iv;
   RCHECK(constant_iv != nullptr);
-  SbMemoryCopy(entry->initialization_vector, constant_iv,
+  memcpy(entry->initialization_vector, constant_iv,
                kInitializationVectorSize);
   return true;
 }
diff --git a/src/cobalt/media/formats/mp4/track_run_iterator_unittest.cc b/src/cobalt/media/formats/mp4/track_run_iterator_unittest.cc
index 09b3908..e6832dd 100644
--- a/src/cobalt/media/formats/mp4/track_run_iterator_unittest.cc
+++ b/src/cobalt/media/formats/mp4/track_run_iterator_unittest.cc
@@ -406,7 +406,7 @@
     sinf->info.track_encryption.default_crypt_byte_block = 1;
     sinf->info.track_encryption.default_skip_byte_block = 9;
     sinf->info.track_encryption.default_constant_iv_size = 16;
-    SbMemoryCopy(sinf->info.track_encryption.default_constant_iv, kIv3, 16);
+    memcpy(sinf->info.track_encryption.default_constant_iv, kIv3, 16);
     sinf->info.track_encryption.default_kid.assign(kKeyId,
                                                    kKeyId + arraysize(kKeyId));
   }
@@ -418,19 +418,19 @@
     track_cenc_group.entries[0].crypt_byte_block = 1;
     track_cenc_group.entries[0].skip_byte_block = 9;
     track_cenc_group.entries[0].constant_iv_size = 16;
-    SbMemoryCopy(track_cenc_group.entries[0].constant_iv, kIv4, 16);
+    memcpy(track_cenc_group.entries[0].constant_iv, kIv4, 16);
 
     frag->sample_group_description.entries[1].iv_size = 0;
     frag->sample_group_description.entries[1].crypt_byte_block = 1;
     frag->sample_group_description.entries[1].skip_byte_block = 9;
     frag->sample_group_description.entries[1].constant_iv_size = 16;
-    SbMemoryCopy(frag->sample_group_description.entries[1].constant_iv, kIv5,
+    memcpy(frag->sample_group_description.entries[1].constant_iv, kIv5,
                  16);
     frag->sample_group_description.entries[2].iv_size = 0;
     frag->sample_group_description.entries[2].crypt_byte_block = 1;
     frag->sample_group_description.entries[2].skip_byte_block = 9;
     frag->sample_group_description.entries[2].constant_iv_size = 16;
-    SbMemoryCopy(frag->sample_group_description.entries[2].constant_iv, kIv5,
+    memcpy(frag->sample_group_description.entries[2].constant_iv, kIv5,
                  16);
   }
 
@@ -884,7 +884,7 @@
   EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
   std::unique_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
   ASSERT_EQ(arraysize(kIv1), config->iv().size());
-  EXPECT_TRUE(!SbMemoryCompare(kIv1, config->iv().data(), config->iv().size()));
+  EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
   iter_->AdvanceSample();
   EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
   iter_->AdvanceRun();
@@ -893,7 +893,7 @@
   EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
   EXPECT_EQ(iter_->GetMaxClearOffset(), 200);
   ASSERT_EQ(arraysize(kIv1), config->iv().size());
-  EXPECT_TRUE(!SbMemoryCompare(kIv1, config->iv().data(), config->iv().size()));
+  EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
   iter_->AdvanceSample();
   EXPECT_EQ(iter_->GetMaxClearOffset(), 201);
 }
diff --git a/src/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc b/src/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
index 64e16f9..940b93b 100644
--- a/src/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
+++ b/src/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
@@ -254,7 +254,7 @@
 
   if (size < 4) return 0;
 
-  if (SbMemoryCompare("ICY ", data, 4)) return -1;
+  if (memcmp("ICY ", data, 4)) return -1;
 
   int locate_size = std::min(size, kMaxIcecastHeaderSize);
   int offset = LocateEndOfHeaders(data, locate_size, 4);
@@ -277,7 +277,7 @@
 
   // TODO(acolwell): Add code to actually validate ID3v1 data and
   // expose it as a metadata text track.
-  return !SbMemoryCompare(data, "TAG+", 4) ? kID3v1ExtendedSize : kID3v1Size;
+  return !memcmp(data, "TAG+", 4) ? kID3v1ExtendedSize : kID3v1Size;
 }
 
 int MPEGAudioStreamParserBase::ParseID3v2(const uint8_t* data, int size) {
diff --git a/src/cobalt/media/formats/webm/cluster_builder.cc b/src/cobalt/media/formats/webm/cluster_builder.cc
index c1538a1..4fe5b9c 100644
--- a/src/cobalt/media/formats/webm/cluster_builder.cc
+++ b/src/cobalt/media/formats/webm/cluster_builder.cc
@@ -92,7 +92,7 @@
 
   uint8_t* buf = buffer_.get() + bytes_used_;
   int block_offset = bytes_used_;
-  SbMemoryCopy(buf, kSimpleBlockHeader, sizeof(kSimpleBlockHeader));
+  memcpy(buf, kSimpleBlockHeader, sizeof(kSimpleBlockHeader));
   UpdateUInt64(block_offset + kSimpleBlockSizeOffset, block_size);
   buf += sizeof(kSimpleBlockHeader);
 
@@ -138,12 +138,12 @@
   uint8_t* buf = buffer_.get() + bytes_used_;
   int block_group_offset = bytes_used_;
   if (include_block_duration) {
-    SbMemoryCopy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader));
+    memcpy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader));
     UpdateUInt64(block_group_offset + kBlockGroupDurationOffset, duration);
     UpdateUInt64(block_group_offset + kBlockGroupBlockSizeOffset, block_size);
     buf += sizeof(kBlockGroupHeader);
   } else {
-    SbMemoryCopy(buf, kBlockGroupHeaderWithoutBlockDuration,
+    memcpy(buf, kBlockGroupHeaderWithoutBlockDuration,
                  sizeof(kBlockGroupHeaderWithoutBlockDuration));
     UpdateUInt64(
         block_group_offset + kBlockGroupWithoutBlockDurationBlockSizeOffset,
@@ -161,7 +161,7 @@
   buf += size + 4;
 
   if (!is_key_frame) {
-    SbMemoryCopy(buf, kBlockGroupReferenceBlock,
+    memcpy(buf, kBlockGroupReferenceBlock,
                  sizeof(kBlockGroupReferenceBlock));
   }
 
@@ -186,7 +186,7 @@
   buf[1] = (timecode_delta >> 8) & 0xff;
   buf[2] = timecode_delta & 0xff;
   buf[3] = flags & 0xff;
-  SbMemoryCopy(buf + 4, data, size);
+  memcpy(buf + 4, data, size);
 }
 
 std::unique_ptr<Cluster> ClusterBuilder::Finish() {
@@ -212,7 +212,7 @@
 void ClusterBuilder::Reset() {
   buffer_size_ = kInitialBufferSize;
   buffer_.reset(new uint8_t[buffer_size_]);
-  SbMemoryCopy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader));
+  memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader));
   bytes_used_ = sizeof(kClusterHeader);
   cluster_timecode_ = -1;
 }
@@ -224,7 +224,7 @@
 
   std::unique_ptr<uint8_t[]> new_buffer(new uint8_t[new_buffer_size]);
 
-  SbMemoryCopy(new_buffer.get(), buffer_.get(), bytes_used_);
+  memcpy(new_buffer.get(), buffer_.get(), bytes_used_);
   buffer_ = std::move(new_buffer);
   buffer_size_ = new_buffer_size;
 }
diff --git a/src/cobalt/media/formats/webm/tracks_builder.cc b/src/cobalt/media/formats/webm/tracks_builder.cc
index 1e91fbc..c27d43a 100644
--- a/src/cobalt/media/formats/webm/tracks_builder.cc
+++ b/src/cobalt/media/formats/webm/tracks_builder.cc
@@ -119,7 +119,7 @@
   const uint64_t size = value.length();
   WriteUInt(&buf, &buf_size, size);
 
-  SbMemoryCopy(buf, value.data(), size);
+  memcpy(buf, value.data(), size);
   buf += size;
   buf_size -= size;
 }
diff --git a/src/cobalt/media/formats/webm/webm_cluster_parser.cc b/src/cobalt/media/formats/webm/webm_cluster_parser.cc
index b48e032..fc75254 100644
--- a/src/cobalt/media/formats/webm/webm_cluster_parser.cc
+++ b/src/cobalt/media/formats/webm/webm_cluster_parser.cc
@@ -385,7 +385,7 @@
         return false;
       }
       block_data_.reset(new uint8_t[size]);
-      SbMemoryCopy(block_data_.get(), data, size);
+      memcpy(block_data_.get(), data, size);
       block_data_size_ = size;
       return true;
 
@@ -405,9 +405,9 @@
       // demuxer's behavior.
       block_additional_data_size_ = size + sizeof(block_add_id);
       block_additional_data_.reset(new uint8_t[block_additional_data_size_]);
-      SbMemoryCopy(block_additional_data_.get(), &block_add_id,
+      memcpy(block_additional_data_.get(), &block_add_id,
                    sizeof(block_add_id));
-      SbMemoryCopy(block_additional_data_.get() + 8, data, size);
+      memcpy(block_additional_data_.get() + 8, data, size);
       return true;
     }
     case kWebMIdDiscardPadding: {
diff --git a/src/cobalt/media/media_module.cc b/src/cobalt/media/media_module.cc
index 9938d41..b70b045 100644
--- a/src/cobalt/media/media_module.cc
+++ b/src/cobalt/media/media_module.cc
@@ -57,8 +57,8 @@
     //   video/webm; codecs="vp9"
     // We do a rough pre-filter to ensure that only video/mp4 is supported as
     // progressive.
-    if (SbStringFindString(mime_type.c_str(), "video/mp4") == 0 &&
-        SbStringFindString(mime_type.c_str(), "application/x-mpegURL") == 0) {
+    if (strstr(mime_type.c_str(), "video/mp4") == 0 &&
+        strstr(mime_type.c_str(), "application/x-mpegURL") == 0) {
       return kSbMediaSupportTypeNotSupported;
     }
 
diff --git a/src/cobalt/media/progressive/avc_parser.cc b/src/cobalt/media/progressive/avc_parser.cc
index e08141a..f781866 100644
--- a/src/cobalt/media/progressive/avc_parser.cc
+++ b/src/cobalt/media/progressive/avc_parser.cc
@@ -425,17 +425,17 @@
     return false;
   }
   // start code for sps comes first
-  SbMemoryCopy(video_prepend_, kAnnexBStartCode, kAnnexBStartCodeSize);
+  memcpy(video_prepend_, kAnnexBStartCode, kAnnexBStartCodeSize);
   // followed by sps body
-  SbMemoryCopy(video_prepend_ + kAnnexBStartCodeSize, sps, sps_size);
+  memcpy(video_prepend_ + kAnnexBStartCodeSize, sps, sps_size);
   int prepend_offset = kAnnexBStartCodeSize + sps_size;
   if (pps_size > 0) {
     // pps start code comes next
-    SbMemoryCopy(video_prepend_ + prepend_offset, kAnnexBStartCode,
+    memcpy(video_prepend_ + prepend_offset, kAnnexBStartCode,
                  kAnnexBStartCodeSize);
     prepend_offset += kAnnexBStartCodeSize;
     // followed by pps
-    SbMemoryCopy(video_prepend_ + prepend_offset, pps, pps_size);
+    memcpy(video_prepend_ + prepend_offset, pps, pps_size);
     prepend_offset += pps_size;
   }
 
diff --git a/src/cobalt/media/progressive/mp4_map_unittest.cc b/src/cobalt/media/progressive/mp4_map_unittest.cc
index 29e2706..14bf993 100644
--- a/src/cobalt/media/progressive/mp4_map_unittest.cc
+++ b/src/cobalt/media/progressive/mp4_map_unittest.cc
@@ -201,7 +201,7 @@
     CHECK_GE(position, file_offset_);
     CHECK_LE(position + size, file_offset_ + combined_.size());
     uint32 offset = position - file_offset_;
-    SbMemoryCopy(data, &combined_[0] + offset, size);
+    memcpy(data, &combined_[0] + offset, size);
     ++read_count_;
     read_bytes_ += size;
     return size;
diff --git a/src/cobalt/media/sandbox/in_memory_data_source.cc b/src/cobalt/media/sandbox/in_memory_data_source.cc
index d8e8086..2534603 100644
--- a/src/cobalt/media/sandbox/in_memory_data_source.cc
+++ b/src/cobalt/media/sandbox/in_memory_data_source.cc
@@ -44,7 +44,7 @@
     return;
   }
 
-  SbMemoryCopy(data, &content_[0] + position, size);
+  memcpy(data, &content_[0] + position, size);
   read_cb.Run(size);
 }
 
diff --git a/src/cobalt/media/sandbox/media2_sandbox.cc b/src/cobalt/media/sandbox/media2_sandbox.cc
index 0228744..8816839 100644
--- a/src/cobalt/media/sandbox/media2_sandbox.cc
+++ b/src/cobalt/media/sandbox/media2_sandbox.cc
@@ -121,9 +121,9 @@
       demuxer->AddId("audio", "audio/mp4; codecs=\"mp4a.40.2\"");
   DCHECK_EQ(status, ChunkDemuxer::kOk);
 
-  int video_url_length = SbStringGetLength(argv[2]);
+  int video_url_length = strlen(argv[2]);
   if (video_url_length > 5 &&
-      SbStringCompare(argv[2] + video_url_length - 5, ".webm", 5) == 0) {
+      strncmp(argv[2] + video_url_length - 5, ".webm", 5) == 0) {
     status = demuxer->AddId("video", "video/webm; codecs=\"vp9\"");
   } else {
     status = demuxer->AddId("video", "video/mp4; codecs=\"avc1.640028\"");
diff --git a/src/cobalt/media/sandbox/media_source_demuxer.cc b/src/cobalt/media/sandbox/media_source_demuxer.cc
index b47a485..f2c4013 100644
--- a/src/cobalt/media/sandbox/media_source_demuxer.cc
+++ b/src/cobalt/media/sandbox/media_source_demuxer.cc
@@ -56,7 +56,7 @@
 }
 
 bool IsMP4(const std::vector<uint8>& content) {
-  return content.size() >= 8 && SbMemoryCompare(&content[4], "ftyp", 4) == 0;
+  return content.size() >= 8 && memcmp(&content[4], "ftyp", 4) == 0;
 }
 
 std::vector<std::string> MakeStringVector(const char* string) {
@@ -219,7 +219,7 @@
   const size_t kIVFFileHeaderSize = 32;
   const size_t kIVFFrameHeaderSize = 12;
   if (content.size() < kIVFFileHeaderSize ||
-      SbMemoryCompare(&content[0], "DKIF", 4) != 0) {
+      memcmp(&content[0], "DKIF", 4) != 0) {
     return false;
   }
   size_t offset = kIVFFileHeaderSize;
diff --git a/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc b/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc
index 8ca9628..1030a81 100644
--- a/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc
+++ b/src/cobalt/media/sandbox/raw_video_decoder_fuzzer.cc
@@ -66,7 +66,7 @@
       current_au_buffer_ =
           ::media::ShellBufferFactory::Instance()->AllocateBufferNow(
               desc.size, desc.is_keyframe);
-      SbMemoryCopy(current_au_buffer_->GetWritableData(),
+      memcpy(current_au_buffer_->GetWritableData(),
                    &au_data_[0] + desc.offset, desc.size);
       ++au_index_;
     } else if (!current_au_buffer_->IsEndOfStream()) {
diff --git a/src/cobalt/media_session/media_session_client.cc b/src/cobalt/media_session/media_session_client.cc
index 1351d7c..1a18649 100644
--- a/src/cobalt/media_session/media_session_client.cc
+++ b/src/cobalt/media_session/media_session_client.cc
@@ -71,7 +71,7 @@
   extension_ = static_cast<const CobaltExtensionMediaSessionApi*>(
       SbSystemGetExtension(kCobaltExtensionMediaSessionName));
   if (extension_) {
-    if (SbStringCompareAll(extension_->name,
+    if (strcmp(extension_->name,
                            kCobaltExtensionMediaSessionName) != 0 ||
         extension_->version < 1) {
       LOG(WARNING) << "Wrong MediaSession extension supplied";
diff --git a/src/cobalt/network/local_network_test.cc b/src/cobalt/network/local_network_test.cc
index 7a775d5..e0f604a 100644
--- a/src/cobalt/network/local_network_test.cc
+++ b/src/cobalt/network/local_network_test.cc
@@ -28,7 +28,7 @@
   const char* spec = address;
   url::Component component = url::MakeRange(0, N - 1);
   SbSocketAddress out_socket_address;
-  SbMemorySet(&out_socket_address, 0, sizeof(SbSocketAddress));
+  memset(&out_socket_address, 0, sizeof(SbSocketAddress));
   CHECK(ParseSocketAddress(spec, component, &out_socket_address));
   return out_socket_address;
 }
diff --git a/src/cobalt/network/socket_address_parser.cc b/src/cobalt/network/socket_address_parser.cc
index ccaad09..09bd538 100644
--- a/src/cobalt/network/socket_address_parser.cc
+++ b/src/cobalt/network/socket_address_parser.cc
@@ -45,11 +45,11 @@
         return false;
       }
 
-      SbMemorySet(out_socket_address, 0, sizeof(SbSocketAddress));
+      memset(out_socket_address, 0, sizeof(SbSocketAddress));
       out_socket_address->type = kSbSocketAddressTypeIpv4;
       DCHECK_GE(sizeof(address_v4),
                 static_cast<std::size_t>(num_ipv4_components));
-      SbMemoryCopy(out_socket_address->address, address_v4,
+      memcpy(out_socket_address->address, address_v4,
                    num_ipv4_components);
 
       return true;
@@ -65,10 +65,10 @@
         break;
       }
 
-      SbMemorySet(out_socket_address, 0, sizeof(SbSocketAddress));
+      memset(out_socket_address, 0, sizeof(SbSocketAddress));
       out_socket_address->type = kSbSocketAddressTypeIpv6;
       static_assert(sizeof(address_v6) == net::IPAddress::kIPv6AddressSize, "");
-      SbMemoryCopy(out_socket_address->address, address_v6, sizeof(address_v6));
+      memcpy(out_socket_address->address, address_v6, sizeof(address_v6));
       return true;
 #else
       return false;
diff --git a/src/cobalt/overlay_info/overlay_info_registry.cc b/src/cobalt/overlay_info/overlay_info_registry.cc
index 863d9b1..59163ca 100644
--- a/src/cobalt/overlay_info/overlay_info_registry.cc
+++ b/src/cobalt/overlay_info/overlay_info_registry.cc
@@ -64,13 +64,12 @@
 }
 
 void OverlayInfoRegistryImpl::Register(const char* category, const char* data) {
-  DCHECK(SbStringFindCharacter(
-             category, static_cast<char>(OverlayInfoRegistry::kDelimiter)) ==
+  DCHECK(strchr(category, static_cast<char>(OverlayInfoRegistry::kDelimiter)) ==
          NULL)
       << "Category " << category
       << " cannot contain the delimiter:" << OverlayInfoRegistry::kDelimiter;
-  DCHECK(SbStringFindCharacter(
-             data, static_cast<char>(OverlayInfoRegistry::kDelimiter)) == NULL)
+  DCHECK(strchr(data, static_cast<char>(OverlayInfoRegistry::kDelimiter)) ==
+         NULL)
       << "Data " << data
       << " cannot contain the delimiter:" << OverlayInfoRegistry::kDelimiter;
   if (!infos_.empty()) {
diff --git a/src/cobalt/render_tree/mock_resource_provider.h b/src/cobalt/render_tree/mock_resource_provider.h
index 244d695..3825a9a 100644
--- a/src/cobalt/render_tree/mock_resource_provider.h
+++ b/src/cobalt/render_tree/mock_resource_provider.h
@@ -59,6 +59,7 @@
   MOCK_CONST_METHOD1(HasLocalFontFamily, bool(const char* font_family_name));
   MOCK_METHOD2(GetLocalTypefaceMock,
                Typeface*(const char* font_family_name, FontStyle font_style));
+  MOCK_METHOD0(LoadAdditionalFonts, void());
   MOCK_METHOD1(GetLocalTypefaceIfAvailableMock,
                Typeface*(const std::string& font_face_name));
   MOCK_METHOD3(GetCharacterFallbackTypefaceMock,
diff --git a/src/cobalt/render_tree/resource_provider.h b/src/cobalt/render_tree/resource_provider.h
index af51209..ad8fd67 100644
--- a/src/cobalt/render_tree/resource_provider.h
+++ b/src/cobalt/render_tree/resource_provider.h
@@ -129,6 +129,9 @@
   virtual scoped_refptr<Typeface> GetLocalTypeface(const char* font_family_name,
                                                    FontStyle font_style) = 0;
 
+  // Loads additional fonts that should be loaded asynchronously at startup.
+  virtual void LoadAdditionalFonts() = 0;
+
   // Given a set of typeface information, this method returns the locally
   // available typeface that best fits the specified parameters. In the case
   // where no typeface is found that matches the font family name, NULL is
diff --git a/src/cobalt/render_tree/resource_provider_stub.h b/src/cobalt/render_tree/resource_provider_stub.h
index 961b59b..43ad4e8 100644
--- a/src/cobalt/render_tree/resource_provider_stub.h
+++ b/src/cobalt/render_tree/resource_provider_stub.h
@@ -329,6 +329,8 @@
     return base::WrapRefCounted(new TypefaceStub(NULL));
   }
 
+  void LoadAdditionalFonts() override {}
+
   scoped_refptr<Typeface> CreateTypefaceFromRawData(
       std::unique_ptr<RawTypefaceDataVector> raw_data,
       std::string* error_string) override {
diff --git a/src/cobalt/renderer/backend/egl/texture_data_cpu.cc b/src/cobalt/renderer/backend/egl/texture_data_cpu.cc
index 4518c23..b25aa12 100644
--- a/src/cobalt/renderer/backend/egl/texture_data_cpu.cc
+++ b/src/cobalt/renderer/backend/egl/texture_data_cpu.cc
@@ -53,7 +53,7 @@
     buffer_for_pitch_adjustment.reset(static_cast<uint8_t*>(
         base::AlignedAlloc(width_in_bytes * size.height(), 8)));
     for (int i = 0; i < size.height(); ++i) {
-      SbMemoryCopy(buffer_for_pitch_adjustment.get() + i * width_in_bytes,
+      memcpy(buffer_for_pitch_adjustment.get() + i * width_in_bytes,
                    data + i * pitch_in_bytes, width_in_bytes);
     }
     data = reinterpret_cast<uint8_t*>(buffer_for_pitch_adjustment.get());
diff --git a/src/cobalt/renderer/backend/graphics_context.cc b/src/cobalt/renderer/backend/graphics_context.cc
index eef775a..1d3d0f6 100644
--- a/src/cobalt/renderer/backend/graphics_context.cc
+++ b/src/cobalt/renderer/backend/graphics_context.cc
@@ -22,14 +22,12 @@
 namespace renderer {
 namespace backend {
 
-GraphicsContext::GraphicsContext(GraphicsSystem* system)
-    : system_(system) {
+GraphicsContext::GraphicsContext(GraphicsSystem* system) : system_(system) {
   graphics_extension_ = static_cast<const CobaltExtensionGraphicsApi*>(
       SbSystemGetExtension(kCobaltExtensionGraphicsName));
   if (graphics_extension_) {
     // Verify it's the extension needed.
-    if (SbStringCompareAll(graphics_extension_->name,
-                           kCobaltExtensionGraphicsName) != 0 ||
+    if (strcmp(graphics_extension_->name, kCobaltExtensionGraphicsName) != 0 ||
         graphics_extension_->version < 1) {
       LOG(WARNING) << "Not using supplied cobalt graphics extension: "
                    << "'" << graphics_extension_->name << "' ("
diff --git a/src/cobalt/renderer/pipeline.cc b/src/cobalt/renderer/pipeline.cc
index d9fb920..bb9954c 100644
--- a/src/cobalt/renderer/pipeline.cc
+++ b/src/cobalt/renderer/pipeline.cc
@@ -601,6 +601,9 @@
   rasterizer_ = create_rasterizer_function.Run();
   rasterizer_created_event_.Signal();
 
+  // Async load additional fonts after rasterizer thread is fully initialized.
+  GetResourceProvider()->LoadAdditionalFonts();
+
   // Note that this is setup as high priority, but lower than the rasterizer
   // thread's priority (ThreadPriority::HIGHEST).  This is to ensure that
   // we never interrupt the rasterizer in order to dispose render trees, but
diff --git a/src/cobalt/renderer/pipeline_test.cc b/src/cobalt/renderer/pipeline_test.cc
index 65e75cb..a5fc24e 100644
--- a/src/cobalt/renderer/pipeline_test.cc
+++ b/src/cobalt/renderer/pipeline_test.cc
@@ -18,6 +18,7 @@
 #include "base/optional.h"
 #include "base/threading/platform_thread.h"
 #include "cobalt/render_tree/composition_node.h"
+#include "cobalt/render_tree/resource_provider_stub.h"
 #include "cobalt/renderer/pipeline.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
 #include "cobalt/renderer/submission.h"
@@ -36,6 +37,14 @@
 const base::TimeDelta kRasterizeDelay =
     base::TimeDelta::FromSecondsD(1.0 / 60.0);
 
+class MockResourceProvider : public cobalt::render_tree::ResourceProviderStub {
+ public:
+  MockResourceProvider() : fonts_loaded_(false){};
+  ~MockResourceProvider() override {}
+  void LoadAdditionalFonts() override { fonts_loaded_ = true; }
+  bool fonts_loaded_;
+};
+
 // Unfortunately, we can't make use of gmock to test the number of submission
 // calls that were made.  This is because we need to test our expectations
 // AFTER all Submit() calls have been made, whereas gmock requires us to
@@ -46,7 +55,9 @@
 class MockRasterizer : public Rasterizer {
  public:
   explicit MockRasterizer(int* submission_count)
-      : submission_count_(submission_count) {}
+      : submission_count_(submission_count),
+        provider_(new MockResourceProvider()) {}
+  ~MockRasterizer() { delete provider_; }
 
   void Submit(const scoped_refptr<cobalt::render_tree::Node>&,
               const scoped_refptr<cobalt::renderer::backend::RenderTarget>&,
@@ -67,7 +78,7 @@
   }
 
   cobalt::render_tree::ResourceProvider* GetResourceProvider() override {
-    return NULL;
+    return provider_;
   }
 
   void MakeCurrent() override {}
@@ -76,6 +87,7 @@
  private:
   int* submission_count_;
   base::Optional<base::TimeTicks> last_submission_time;
+  MockResourceProvider* provider_;
 };
 
 std::unique_ptr<Rasterizer> CreateMockRasterizer(int* submission_count) {
@@ -217,3 +229,16 @@
   EXPECT_LE(expected_submissions.lower_bound, submission_count_);
   EXPECT_GE(expected_submissions.upper_bound, submission_count_);
 }
+
+TEST_F(RendererPipelineTest, LoadDefaultFontsAfterRasterizerCreated) {
+  MockResourceProvider* provider =
+      base::polymorphic_downcast<MockResourceProvider*>(
+          pipeline_->GetResourceProvider());
+
+  // Wait a little bit to give the pipeline some time to initialize rasterizer
+  // thread.
+  const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(400);
+  base::PlatformThread::Sleep(kDelay);
+
+  EXPECT_EQ(true, provider->fonts_loaded_);
+}
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
index 83d2baf..e67ecbc 100644
--- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
@@ -87,7 +87,7 @@
 scoped_refptr<render_tree::Image>
 ResourceProvider::CreateImageFromSbDecodeTarget(SbDecodeTarget decode_target) {
   SbDecodeTargetInfo info;
-  SbMemorySet(&info, 0, sizeof(info));
+  memset(&info, 0, sizeof(info));
   CHECK(SbDecodeTargetGetInfo(decode_target, &info));
 
   SbDecodeTargetFormat format = info.format;
@@ -150,6 +150,10 @@
       utf32_character, font_style, language);
 }
 
+void ResourceProvider::LoadAdditionalFonts() {
+  return skia_resource_provider_->LoadAdditionalFonts();
+}
+
 scoped_refptr<Typeface> ResourceProvider::CreateTypefaceFromRawData(
     std::unique_ptr<RawTypefaceDataVector> raw_data,
     std::string* error_string) {
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.h b/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
index bb7fd0b..6e91345 100644
--- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
@@ -86,6 +86,8 @@
       int32 utf32_character, render_tree::FontStyle font_style,
       const std::string& language) override;
 
+  void LoadAdditionalFonts() override;
+
   scoped_refptr<render_tree::Typeface> CreateTypefaceFromRawData(
       std::unique_ptr<RawTypefaceDataVector> raw_data,
       std::string* error_string) override;
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_poly_color.cc b/src/cobalt/renderer/rasterizer/egl/draw_poly_color.cc
index fb03b51..4678814 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_poly_color.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_poly_color.cc
@@ -93,10 +93,10 @@
   if (attributes_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(attributes_.size() *
                                                         sizeof(attributes_[0]));
-    SbMemoryCopy(vertex_buffer_, &attributes_[0],
+    memcpy(vertex_buffer_, &attributes_[0],
                  attributes_.size() * sizeof(attributes_[0]));
     index_buffer_ = graphics_state->AllocateVertexIndices(indices_.size());
-    SbMemoryCopy(index_buffer_, &indices_[0],
+    memcpy(index_buffer_, &indices_[0],
                  indices_.size() * sizeof(indices_[0]));
   }
 }
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc b/src/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
index 551e947..8714013 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
@@ -75,7 +75,7 @@
       sizeof(color_transform_) == sizeof(color_transform_in_column_major),
       "color_transform_ and color_transform_in_column_major size mismatch");
 
-  SbMemoryCopy(color_transform_, color_transform_in_column_major,
+  memcpy(color_transform_, color_transform_in_column_major,
                sizeof(color_transform_));
   graphics_state->ReserveVertexData(4 * sizeof(VertexAttributes));
 }
@@ -104,7 +104,7 @@
   COMPILE_ASSERT(sizeof(attributes) == 4 * sizeof(VertexAttributes),
                  bad_padding);
   vertex_buffer_ = graphics_state->AllocateVertexData(sizeof(attributes));
-  SbMemoryCopy(vertex_buffer_, attributes, sizeof(attributes));
+  memcpy(vertex_buffer_, attributes, sizeof(attributes));
 
   // Find minimum and maximum texcoord values.
   texcoord_clamps_[0][0] = attributes[0].texcoord[0];
@@ -131,7 +131,7 @@
       texcoord_clamps_[0][2] > 1.0f || texcoord_clamps_[0][3] > 1.0f;
 
   for (int i = 1; i < SB_ARRAY_SIZE_INT(texcoord_clamps_); ++i) {
-    SbMemoryCopy(texcoord_clamps_[i], texcoord_clamps_[0],
+    memcpy(texcoord_clamps_[i], texcoord_clamps_[0],
                  sizeof(texcoord_clamps_[0]));
   }
   if (clamp_texcoords_) {
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc b/src/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc
index 0cbaec9..fbb2cd1 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc
@@ -66,7 +66,7 @@
     GraphicsState* graphics_state, ShaderProgramManager* program_manager) {
   vertex_buffer_ = graphics_state->AllocateVertexData(attributes_.size() *
                                                       sizeof(VertexAttributes));
-  SbMemoryCopy(vertex_buffer_, &attributes_[0],
+  memcpy(vertex_buffer_, &attributes_[0],
                attributes_.size() * sizeof(VertexAttributes));
 }
 
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc b/src/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc
index 1ca8742..5ffd562 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc
@@ -96,7 +96,7 @@
   if (attributes_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_.size() * sizeof(VertexAttributes));
-    SbMemoryCopy(vertex_buffer_, &attributes_[0],
+    memcpy(vertex_buffer_, &attributes_[0],
                  attributes_.size() * sizeof(VertexAttributes));
   }
 }
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc b/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc
index 590c3ea..a069e6a 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc
@@ -155,15 +155,15 @@
   if (attributes_square_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_square_.size() * sizeof(attributes_square_[0]));
-    SbMemoryCopy(vertex_buffer_, &attributes_square_[0],
+    memcpy(vertex_buffer_, &attributes_square_[0],
                  attributes_square_.size() * sizeof(attributes_square_[0]));
   } else if (attributes_round_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_round_.size() * sizeof(attributes_round_[0]));
-    SbMemoryCopy(vertex_buffer_, &attributes_round_[0],
+    memcpy(vertex_buffer_, &attributes_round_[0],
                  attributes_round_.size() * sizeof(attributes_round_[0]));
     index_buffer_ = graphics_state->AllocateVertexIndices(indices_.size());
-    SbMemoryCopy(index_buffer_, &indices_[0],
+    memcpy(index_buffer_, &indices_[0],
                  indices_.size() * sizeof(indices_[0]));
   }
 }
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc b/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc
index f606a3b..52eea1d 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc
@@ -81,15 +81,15 @@
   if (attributes_square_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_square_.size() * sizeof(attributes_square_[0]));
-    SbMemoryCopy(vertex_buffer_, &attributes_square_[0],
+    memcpy(vertex_buffer_, &attributes_square_[0],
                  attributes_square_.size() * sizeof(attributes_square_[0]));
   } else if (attributes_round_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_round_.size() * sizeof(attributes_round_[0]));
-    SbMemoryCopy(vertex_buffer_, &attributes_round_[0],
+    memcpy(vertex_buffer_, &attributes_round_[0],
                  attributes_round_.size() * sizeof(attributes_round_[0]));
     index_buffer_ = graphics_state->AllocateVertexIndices(indices_.size());
-    SbMemoryCopy(index_buffer_, &indices_[0],
+    memcpy(index_buffer_, &indices_[0],
                  indices_.size() * sizeof(indices_[0]));
   }
 }
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc b/src/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
index 2d03e4a..bd530df 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
@@ -68,7 +68,7 @@
       sizeof(color_transform_) == sizeof(color_transform_in_column_major),
       "color_transform_ and color_transform_in_column_major size mismatch");
 
-  SbMemoryCopy(color_transform_, color_transform_in_column_major,
+  memcpy(color_transform_, color_transform_in_column_major,
                sizeof(color_transform_));
   graphics_state->ReserveVertexData(4 * sizeof(VertexAttributes));
 }
@@ -93,7 +93,7 @@
   COMPILE_ASSERT(sizeof(attributes) == 4 * sizeof(VertexAttributes),
                  bad_padding);
   vertex_buffer_ = graphics_state->AllocateVertexData(sizeof(attributes));
-  SbMemoryCopy(vertex_buffer_, attributes, sizeof(attributes));
+  memcpy(vertex_buffer_, attributes, sizeof(attributes));
 
   for (int i = 0; i < arraysize(attributes); ++i) {
     tile_texture_ = tile_texture_ || attributes[i].texcoord[0] < 0.0f ||
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc b/src/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
index 8946cc1..edb8b0a 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
@@ -82,7 +82,7 @@
   }
 
   vertex_buffer_ = graphics_state->AllocateVertexData(sizeof(attributes));
-  SbMemoryCopy(vertex_buffer_, attributes, sizeof(attributes));
+  memcpy(vertex_buffer_, attributes, sizeof(attributes));
 }
 
 void DrawRRectColor::ExecuteRasterize(GraphicsState* graphics_state,
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc b/src/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
index e2c2c86..9161967 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
@@ -81,7 +81,7 @@
       sizeof(color_transform_) == sizeof(color_transform_in_column_major),
       "color_transform_ and color_transform_in_column_major size mismatch");
 
-  SbMemoryCopy(color_transform_, color_transform_in_column_major,
+  memcpy(color_transform_, color_transform_in_column_major,
                sizeof(color_transform_));
   graphics_state->ReserveVertexData(kVertexCount * sizeof(VertexAttributes));
 
@@ -135,7 +135,7 @@
   }
 
   vertex_buffer_ = graphics_state->AllocateVertexData(sizeof(attributes));
-  SbMemoryCopy(vertex_buffer_, attributes, sizeof(attributes));
+  memcpy(vertex_buffer_, attributes, sizeof(attributes));
 
   // Find minimum and maximum texcoord values.
   texcoord_clamps_[0][0] = attributes[0].texcoord[0];
@@ -162,7 +162,7 @@
       texcoord_clamps_[0][2] > 1.0f || texcoord_clamps_[0][3] > 1.0f;
 
   for (int i = 1; i < SB_ARRAY_SIZE_INT(texcoord_clamps_); ++i) {
-    SbMemoryCopy(texcoord_clamps_[i], texcoord_clamps_[0],
+    memcpy(texcoord_clamps_[i], texcoord_clamps_[0],
                  sizeof(texcoord_clamps_[0]));
   }
   if (clamp_texcoords_) {
diff --git a/src/cobalt/renderer/rasterizer/egl/graphics_state.cc b/src/cobalt/renderer/rasterizer/egl/graphics_state.cc
index 20e695d..9d50d54 100644
--- a/src/cobalt/renderer/rasterizer/egl/graphics_state.cc
+++ b/src/cobalt/renderer/rasterizer/egl/graphics_state.cc
@@ -61,7 +61,7 @@
     DCHECK_NE(vertex_data_buffer_handle_[frame], 0);
     DCHECK_NE(vertex_index_buffer_handle_[frame], 0);
   }
-  SbMemorySet(clip_adjustment_, 0, sizeof(clip_adjustment_));
+  memset(clip_adjustment_, 0, sizeof(clip_adjustment_));
   SetDirty();
   blend_enabled_ = false;
   Reset();
@@ -420,8 +420,8 @@
   array_buffer_handle_ = 0;
   index_buffer_handle_ = 0;
   texture_unit_ = 0;
-  SbMemorySet(&texunit_target_, 0, sizeof(texunit_target_));
-  SbMemorySet(&texunit_texture_, 0, sizeof(texunit_texture_));
+  memset(&texunit_target_, 0, sizeof(texunit_target_));
+  memset(&texunit_texture_, 0, sizeof(texunit_texture_));
   clip_adjustment_dirty_ = true;
 
   enabled_vertex_attrib_array_mask_ = 0;
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
index bb8c1c4..f3295a7 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -266,7 +266,7 @@
 HardwareResourceProvider::CreateImageFromSbDecodeTarget(
     SbDecodeTarget decode_target) {
   SbDecodeTargetInfo info;
-  SbMemorySet(&info, 0, sizeof(info));
+  memset(&info, 0, sizeof(info));
   CHECK(SbDecodeTargetGetInfo(decode_target, &info));
   DCHECK_NE(kSbDecodeTargetFormat1PlaneBGRA, info.format);
 
@@ -465,6 +465,13 @@
   return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface));
 }
 
+void HardwareResourceProvider::LoadAdditionalFonts() {
+  sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault());
+  SkFontMgr_Cobalt* cobalt_font_manager =
+      base::polymorphic_downcast<SkFontMgr_Cobalt*>(font_manager.get());
+  cobalt_font_manager->LoadLocaleDefault();
+}
+
 scoped_refptr<render_tree::Typeface>
 HardwareResourceProvider::CreateTypefaceFromRawData(
     std::unique_ptr<render_tree::ResourceProvider::RawTypefaceDataVector>
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
index e6b7252..2a7dc3d 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
@@ -92,6 +92,8 @@
       int32 character, render_tree::FontStyle font_style,
       const std::string& language) override;
 
+  void LoadAdditionalFonts() override;
+
   // This resource provider uses ots (OpenTypeSanitizer) to sanitize the raw
   // typeface data and skia to generate the typeface. It supports TrueType,
   // OpenType, and WOFF data formats.
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
index 3b117b4..8ada3a2 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
@@ -26,11 +26,15 @@
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
+#include "cobalt/base/language.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/extension/font.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
+#include "third_party/icu/source/common/unicode/locid.h"
+
+const char* ROBOTO_SCRIPT = "latn";
 
 SkFontMgr_Cobalt::SkFontMgr_Cobalt(
     const char* cobalt_font_config_directory,
@@ -42,7 +46,8 @@
           "Font.LocalTypefaceCache",
           cobalt::configuration::Configuration::GetInstance()
               ->CobaltLocalTypefaceCacheSizeInBytes()),
-      default_family_(NULL) {
+      default_fonts_loaded_event_(base::WaitableEvent::ResetPolicy::MANUAL,
+                                  base::WaitableEvent::InitialState::SIGNALED) {
   TRACE_EVENT0("cobalt::renderer", "SkFontMgr_Cobalt::SkFontMgr_Cobalt()");
 
   PriorityStyleSetArrayMap priority_fallback_families;
@@ -62,7 +67,7 @@
       *system_font_config_directory != '\0' &&
       system_font_files_directory != NULL &&
       *system_font_files_directory != '\0' &&
-      (0 != SbStringCompareAll(cobalt_font_files_directory,
+      (0 != strcmp(cobalt_font_files_directory,
                                system_font_files_directory))) {
     TRACE_EVENT0("cobalt::renderer", "LoadSystemFontFamilies");
     ParseConfigAndBuildFamilies(system_font_config_directory,
@@ -76,7 +81,7 @@
       static_cast<const CobaltExtensionFontApi*>(
           SbSystemGetExtension(kCobaltExtensionFontName));
   if (font_extension &&
-      SbStringCompareAll(font_extension->name, kCobaltExtensionFontName) == 0 &&
+      strcmp(font_extension->name, kCobaltExtensionFontName) == 0 &&
       font_extension->version >= 1) {
     std::vector<char> fallback_directory(kSbFileMaxPath);
     if (font_extension->GetPathFallbackFontDirectory(fallback_directory.data(),
@@ -196,7 +201,7 @@
   }
 
   if (typeface == NULL) {
-    typeface = default_family_->matchStyle(style);
+    typeface = default_families_[0]->matchStyle(style);
   }
 
   return typeface;
@@ -250,9 +255,10 @@
       font_manager->FindFamilyStyleCharacter(style, SkString(), character);
 
   // If no family was found that supports the character, then just fall back
-  // to the default family.
-  return matching_typeface ? matching_typeface
-                           : default_family_->MatchStyleWithoutLocking(style);
+  // to the first default family.
+  return matching_typeface
+             ? matching_typeface
+             : default_families_[0]->MatchStyleWithoutLocking(style);
 }
 
 sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromData(sk_sp<SkData> data,
@@ -267,12 +273,17 @@
   bool is_fixed_pitch;
   SkFontStyle style;
   SkString name;
+
+  // To pre-fetch glyphs for remote fonts, we could pass character_map here.
   if (!sk_freetype_cobalt::ScanFont(stream.get(), face_index, &name, &style,
-                                    &is_fixed_pitch)) {
+                                    &is_fixed_pitch, nullptr)) {
     return NULL;
   }
-  return sk_sp<SkTypeface>(new SkTypeface_CobaltStream(
-      std::move(stream), face_index, style, is_fixed_pitch, name));
+  scoped_refptr<font_character_map::CharacterMap> character_map =
+      base::MakeRefCounted<font_character_map::CharacterMap>();
+  return sk_sp<SkTypeface>(
+      new SkTypeface_CobaltStream(std::move(stream), face_index, style,
+                                  is_fixed_pitch, name, character_map));
 }
 
 sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromFile(const char path[],
@@ -286,6 +297,25 @@
   return sk_sp<SkTypeface>(matchFamilyStyle(family_name, style));
 }
 
+void SkFontMgr_Cobalt::LoadLocaleDefault() {
+  std::string script =
+      icu::Locale::createCanonical(base::GetSystemLanguageScript().c_str())
+          .getScript();
+  if (SbStringCompareNoCase(script.c_str(), ROBOTO_SCRIPT) == 0) {
+    return;
+  }
+
+  default_fonts_loaded_event_.Reset();
+  for (int i = 0; i < families_.count(); i++) {
+    if (CheckIfFamilyMatchesLocaleScript(families_[i], script.c_str())) {
+      default_fonts_loaded_event_.Signal();
+      return;
+    }
+  }
+
+  default_fonts_loaded_event_.Signal();
+}
+
 void SkFontMgr_Cobalt::ParseConfigAndBuildFamilies(
     const char* font_config_directory, const char* font_files_directory,
     PriorityStyleSetArrayMap* priority_fallback_families) {
@@ -455,20 +485,42 @@
     sk_sp<SkTypeface> check_typeface(
         check_family->MatchStyleWithoutLocking(SkFontStyle()));
     if (check_typeface.get() != NULL) {
-      default_family_ = check_family.get();
+      default_families_.push_back(check_family.get());
       break;
     }
   }
 
-  if (default_family_ == NULL) {
+  if (default_families_.empty()) {
     sk_sp<SkTypeface> check_typeface(
         families_[0]->MatchStyleWithoutLocking(SkFontStyle()));
     if (check_typeface.get() != NULL) {
-      default_family_ = families_[0].get();
+      default_families_.push_back(families_[0].get());
     }
   }
 
-  CHECK(default_family_);
+  CHECK(!default_families_.empty());
+}
+
+bool SkFontMgr_Cobalt::CheckIfFamilyMatchesLocaleScript(
+    sk_sp<SkFontStyleSet_Cobalt> new_family, const char* script) {
+  SkString family_tag = new_family->get_language().GetTag();
+  if (family_tag.isEmpty()) {
+    return false;
+  }
+  std::string family_script =
+      icu::Locale::createCanonical(family_tag.c_str()).getScript();
+  if (SbStringCompareNoCase(script, family_script.c_str()) != 0) {
+    return false;
+  }
+
+  sk_sp<SkTypeface> check_typeface(
+      new_family->MatchStyleWithoutLocking(SkFontStyle()));
+  if (check_typeface.get() == NULL) {
+    return false;
+  }
+
+  default_families_.push_back(new_family.get());
+  return true;
 }
 
 SkTypeface* SkFontMgr_Cobalt::FindFamilyStyleCharacter(
@@ -478,6 +530,20 @@
     return NULL;
   }
 
+  // First attempt any extra default fonts set by locale.
+  default_fonts_loaded_event_.Wait();
+  if (default_families_.size() > 1) {
+    for (int i = 1; i < default_families_.size(); ++i) {
+      SkFontStyleSet_Cobalt* family = default_families_[i];
+      if (family->ContainsCharacter(style, character)) {
+        SkTypeface* matching_typeface = family->MatchStyleWithoutLocking(style);
+        if (matching_typeface) {
+          return matching_typeface;
+        }
+      }
+    }
+  }
+
   StyleSetArray* fallback_families = GetMatchingFallbackFamilies(language_tag);
   for (int i = 0; i < fallback_families->size(); ++i) {
     SkFontStyleSet_Cobalt* family = (*fallback_families)[i];
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
index 8159969..10f6b0c 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
@@ -25,6 +25,7 @@
 #include "SkTypeface.h"
 #include "base/containers/hash_tables.h"
 #include "base/containers/small_map.h"
+#include "base/synchronization/waitable_event.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h"
@@ -65,6 +66,9 @@
   // NOTE: This returns NULL if a match is not found.
   SkTypeface* MatchFaceName(const char face_name[]);
 
+  // Loads the font that matches the suggested script for the device's locale.
+  void LoadLocaleDefault();
+
  protected:
   // From SkFontMgr
   int onCountFamilies() const override;
@@ -125,6 +129,8 @@
   void GeneratePriorityOrderedFallbackFamilies(
       const PriorityStyleSetArrayMap& priority_fallback_families);
   void FindDefaultFamily(const SkTArray<SkString, true>& default_families);
+  bool CheckIfFamilyMatchesLocaleScript(sk_sp<SkFontStyleSet_Cobalt> new_family,
+                                        const char* script);
 
   // Returns the first encountered fallback family that matches the language tag
   // and supports the specified character.
@@ -157,9 +163,12 @@
   std::vector<std::unique_ptr<StyleSetArray>> language_fallback_families_array_;
   NameToStyleSetArrayMap language_fallback_families_map_;
 
-  // The default family that is used when no specific match is found during a
-  // request.
-  SkFontStyleSet_Cobalt* default_family_;
+  // List of default families that are used when no specific match is found
+  // during a request.
+  std::vector<SkFontStyleSet_Cobalt*> default_families_;
+
+  // Used to delay font loading until default fonts are fully loaded.
+  base::WaitableEvent default_fonts_loaded_event_;
 
   // Mutex shared by all families for accessing their modifiable data.
   mutable SkMutex family_mutex_;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
index b9af82e..8d92c16 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
@@ -90,6 +90,8 @@
     return;
   }
 
+  character_map_ = base::MakeRefCounted<font_character_map::CharacterMap>();
+
   family_name_ = family_info.names[0];
   SkTHashMap<SkString, int> styles_index_map;
 
@@ -333,11 +335,8 @@
 }
 
 bool SkFontStyleSet_Cobalt::CharacterMapContainsCharacter(SkUnichar character) {
-  font_character_map::CharacterMap::iterator page_iterator =
-      character_map_.find(font_character_map::GetPage(character));
-  return page_iterator != character_map_.end() &&
-         page_iterator->second.test(
-             font_character_map::GetPageCharacterIndex(character));
+  font_character_map::Character c = character_map_->Find(character);
+  return c.is_set && c.id > 0;
 }
 
 bool SkFontStyleSet_Cobalt::GenerateStyleFaceInfo(
@@ -349,7 +348,7 @@
   // Providing a pointer to the character map will cause it to be generated
   // during ScanFont. Only provide it if it hasn't already been generated.
   font_character_map::CharacterMap* character_map =
-      !is_character_map_generated_ ? &character_map_ : NULL;
+      !is_character_map_generated_ ? character_map_.get() : NULL;
 
   if (!sk_freetype_cobalt::ScanFont(
           stream, style->face_index, &style->face_name, &style->font_style,
@@ -396,7 +395,7 @@
     style_entry->typeface.reset(new SkTypeface_CobaltStreamProvider(
         stream_provider, style_entry->face_index, style_entry->font_style,
         style_entry->face_is_fixed_pitch, family_name_,
-        style_entry->disable_synthetic_bolding));
+        style_entry->disable_synthetic_bolding, character_map_));
   } else {
     LOG(ERROR) << "Failed to scan font: "
                << style_entry->font_file_path.c_str();
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
index 715aee8..33ec970 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
@@ -100,6 +100,8 @@
 
   const SkString& get_family_name() const { return family_name_; }
 
+  const SkLanguage& get_language() const { return language_; }
+
  private:
   // NOTE: It is the responsibility of the caller to lock the mutex before
   // calling any of the non-const private functions.
@@ -135,7 +137,7 @@
 
   // NOTE: The following characters require locking when being accessed.
   bool is_character_map_generated_;
-  font_character_map::CharacterMap character_map_;
+  scoped_refptr<font_character_map::CharacterMap> character_map_;
 
   SkTArray<sk_sp<SkFontStyleSetEntry_Cobalt>, true> styles_;
 
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
index 77023ae..422276c 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
@@ -19,9 +19,11 @@
 #include <map>
 #include <utility>
 
+#include "SkMutex.h"
 #include "SkString.h"
 #include "SkTDArray.h"
 #include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
 
 // The font_character_map namespace contains all of the constants, typedefs, and
 // utility functions used with determining whether or not a font supports a
@@ -54,13 +56,43 @@
 // in non-overlapping ascending order.
 typedef SkTArray<PageRange> PageRanges;
 
-typedef std::bitset<kNumCharactersPerPage> PageCharacters;
-typedef std::map<int16, PageCharacters> CharacterMap;
-
 bool IsCharacterValid(SkUnichar character);
 int16 GetPage(SkUnichar character);
 unsigned char GetPageCharacterIndex(SkUnichar character);
 
+struct Character {
+  SkGlyphID id = 0;
+  bool is_set = false;
+};
+
+using PageCharacters = Character[kNumCharactersPerPage];
+class CharacterMap : public base::RefCountedThreadSafe<CharacterMap> {
+ public:
+  const Character Find(SkUnichar character) {
+    SkAutoMutexExclusive scoped_mutex(mutex_);
+
+    int16 page = GetPage(character);
+    std::map<int16, PageCharacters>::iterator page_iterator = data_.find(page);
+
+    if (page_iterator == data_.end()) return {};
+
+    unsigned char character_index = GetPageCharacterIndex(character);
+    return page_iterator->second[character_index];
+  }
+
+  void Insert(SkUnichar character, SkGlyphID glyph) {
+    SkAutoMutexExclusive scoped_mutex(mutex_);
+
+    int16 page = GetPage(character);
+    unsigned char character_index = GetPageCharacterIndex(character);
+    data_[page][character_index] = {/* id= */ glyph, /* is_set= */ true};
+  }
+
+ private:
+  std::map<int16, PageCharacters> data_;
+  mutable SkMutex mutex_;
+};
+
 }  // namespace font_character_map
 
 // The SkLanguage class represents a human written language, and is used by
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
index 637db3a..cbcc362 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
@@ -106,19 +106,9 @@
   TRACE_EVENT0("cobalt::renderer", "GenerateCharacterMapFromFace");
 
   FT_UInt glyph_index;
-
-  int last_page = -1;
-  font_character_map::PageCharacters* page_characters = NULL;
-
   SkUnichar code_point = FT_Get_First_Char(face, &glyph_index);
   while (glyph_index) {
-    int page = font_character_map::GetPage(code_point);
-    if (page != last_page) {
-      page_characters = &(*character_map)[page];
-      last_page = page;
-    }
-    page_characters->set(font_character_map::GetPageCharacterIndex(code_point));
-
+    character_map->Insert(code_point, SkToU16(glyph_index));
     code_point = FT_Get_Next_Char(face, code_point, &glyph_index);
   }
 }
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
index 8869e40..8f9cce8 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
@@ -20,27 +20,52 @@
 #include "SkFontStyle.h"
 #include "SkTypefaceCache.h"
 
-SkTypeface_Cobalt::SkTypeface_Cobalt(int face_index, SkFontStyle style,
-                                     bool is_fixed_pitch,
-                                     const SkString& family_name)
+SkTypeface_Cobalt::SkTypeface_Cobalt(
+    int face_index, SkFontStyle style, bool is_fixed_pitch,
+    const SkString& family_name,
+    scoped_refptr<font_character_map::CharacterMap> character_map)
     : INHERITED(style, is_fixed_pitch),
       face_index_(face_index),
       family_name_(family_name),
-      synthesizes_bold_(!isBold()) {}
+      synthesizes_bold_(!isBold()),
+      character_map_(character_map) {}
 
 sk_sp<SkTypeface> SkTypeface_Cobalt::onMakeClone(
     const SkFontArguments& args) const {
   return sk_ref_sp(this);
 }
 
+void SkTypeface_Cobalt::onCharsToGlyphs(const SkUnichar uni[], int count,
+                                        SkGlyphID glyphs[]) const {
+  for (int i = 0; i < count; ++i) {
+    glyphs[i] = characterMapGetGlyphIdForCharacter(uni[i]);
+  }
+}
+
+SkGlyphID SkTypeface_Cobalt::characterMapGetGlyphIdForCharacter(
+    SkUnichar character) const {
+  CHECK(character_map_);
+
+  // Check whether the character is cached in the character map.
+  font_character_map::Character c = character_map_->Find(character);
+  if (c.is_set) return c.id;
+
+  // If the character isn't there, look it up with FreeType, then cache it.
+  SkGlyphID glyphs[1] = {0};
+  SkTypeface_FreeType::onCharsToGlyphs(&character, 1, glyphs);
+  character_map_->Insert(character, glyphs[0]);
+  return glyphs[0];
+}
+
 void SkTypeface_Cobalt::onGetFamilyName(SkString* family_name) const {
   *family_name = family_name_;
 }
 
 SkTypeface_CobaltStream::SkTypeface_CobaltStream(
     std::unique_ptr<SkStreamAsset> stream, int face_index, SkFontStyle style,
-    bool is_fixed_pitch, const SkString& family_name)
-    : INHERITED(face_index, style, is_fixed_pitch, family_name),
+    bool is_fixed_pitch, const SkString& family_name,
+    scoped_refptr<font_character_map::CharacterMap> character_map)
+    : INHERITED(face_index, style, is_fixed_pitch, family_name, character_map),
       stream_(std::move(stream)) {
   LOG(INFO) << "Created SkTypeface_CobaltStream: " << family_name.c_str() << "("
             << style.weight() << ", " << style.width() << ", " << style.slant()
@@ -68,8 +93,9 @@
 SkTypeface_CobaltStreamProvider::SkTypeface_CobaltStreamProvider(
     SkFileMemoryChunkStreamProvider* stream_provider, int face_index,
     SkFontStyle style, bool is_fixed_pitch, const SkString& family_name,
-    bool disable_synthetic_bolding)
-    : INHERITED(face_index, style, is_fixed_pitch, family_name),
+    bool disable_synthetic_bolding,
+    scoped_refptr<font_character_map::CharacterMap> character_map)
+    : INHERITED(face_index, style, is_fixed_pitch, family_name, character_map),
       stream_provider_(stream_provider) {
   if (disable_synthetic_bolding) {
     synthesizes_bold_ = false;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
index e5d94d5..291ff2d 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
@@ -20,6 +20,7 @@
 #include "SkStream.h"
 #include "SkString.h"
 #include "base/memory/ref_counted.h"
+#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h"
 #include "third_party/skia/src/ports/SkFontHost_FreeType_common.h"
 
@@ -27,8 +28,10 @@
 
 class SkTypeface_Cobalt : public SkTypeface_FreeType {
  public:
-  SkTypeface_Cobalt(int face_index, SkFontStyle style, bool is_fixed_pitch,
-                    const SkString& family_name);
+  SkTypeface_Cobalt(
+      int face_index, SkFontStyle style, bool is_fixed_pitch,
+      const SkString& family_name,
+      scoped_refptr<font_character_map::CharacterMap> character_map);
 
   virtual size_t GetStreamLength() const = 0;
 
@@ -37,6 +40,9 @@
  protected:
   sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
 
+  void onCharsToGlyphs(const SkUnichar uni[], int count,
+                       SkGlyphID glyphs[]) const override;
+
   void onGetFamilyName(SkString* family_name) const override;
 
   int face_index_;
@@ -45,13 +51,16 @@
 
  private:
   typedef SkTypeface_FreeType INHERITED;
+  SkGlyphID characterMapGetGlyphIdForCharacter(SkUnichar character) const;
+  scoped_refptr<font_character_map::CharacterMap> character_map_;
 };
 
 class SkTypeface_CobaltStream : public SkTypeface_Cobalt {
  public:
-  SkTypeface_CobaltStream(std::unique_ptr<SkStreamAsset> stream, int face_index,
-                          SkFontStyle style, bool is_fixed_pitch,
-                          const SkString& family_name);
+  SkTypeface_CobaltStream(
+      std::unique_ptr<SkStreamAsset> stream, int face_index, SkFontStyle style,
+      bool is_fixed_pitch, const SkString& family_name,
+      scoped_refptr<font_character_map::CharacterMap> character_map);
 
   void onGetFontDescriptor(SkFontDescriptor* descriptor,
                            bool* serialize) const override;
@@ -71,7 +80,8 @@
   SkTypeface_CobaltStreamProvider(
       SkFileMemoryChunkStreamProvider* stream_provider, int face_index,
       SkFontStyle style, bool is_fixed_pitch, const SkString& family_name,
-      bool disable_synthetic_bolding);
+      bool disable_synthetic_bolding,
+      scoped_refptr<font_character_map::CharacterMap> character_map);
 
   void onGetFontDescriptor(SkFontDescriptor* descriptor,
                            bool* serialize) const override;
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
index d6b2a10..25f9813 100644
--- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
@@ -179,6 +179,13 @@
   return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface));
 }
 
+void SoftwareResourceProvider::LoadAdditionalFonts() {
+  sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault());
+  SkFontMgr_Cobalt* cobalt_font_manager =
+      base::polymorphic_downcast<SkFontMgr_Cobalt*>(font_manager.get());
+  cobalt_font_manager->LoadLocaleDefault();
+}
+
 scoped_refptr<render_tree::Typeface>
 SoftwareResourceProvider::CreateTypefaceFromRawData(
     std::unique_ptr<render_tree::ResourceProvider::RawTypefaceDataVector>
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
index 68d06ff..aad9edd 100644
--- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
@@ -84,6 +84,8 @@
       int32 character, render_tree::FontStyle font_style,
       const std::string& language) override;
 
+  void LoadAdditionalFonts() override;
+
   // This resource provider uses ots (OpenTypeSanitizer) to sanitize the raw
   // typeface data and skia to generate the typeface. It supports TrueType,
   // OpenType, and WOFF data formats.
diff --git a/src/cobalt/renderer/rasterizer/skia/typeface.cc b/src/cobalt/renderer/rasterizer/skia/typeface.cc
index 5c9acc0..0a70a6c 100644
--- a/src/cobalt/renderer/rasterizer/skia/typeface.cc
+++ b/src/cobalt/renderer/rasterizer/skia/typeface.cc
@@ -65,26 +65,15 @@
                render_tree::kUnknownGlyphIndex) {
       return primary_page_character_glyphs_[utf32_character];
     }
-    // Otherwise, check for the character's glyph within the map.
-  } else {
-    CharacterToGlyphMap::iterator glyph_iterator =
-        character_to_glyph_map_.find(utf32_character);
-    if (glyph_iterator != character_to_glyph_map_.end()) {
-      return glyph_iterator->second;
-    }
   }
-
-  // If we reach this point, the character's glyph was not previously cached and
-  // needs to be retrieved now.
   render_tree::GlyphIndex glyph = render_tree::kInvalidGlyphIndex;
   typeface_->unicharsToGlyphs(&utf32_character, 1, &glyph);
 
   // Both cache and return the character's glyph.
   if (utf32_character < kPrimaryPageSize) {
     return primary_page_character_glyphs_[utf32_character] = glyph;
-  } else {
-    return character_to_glyph_map_[utf32_character] = glyph;
   }
+  return glyph;
 }
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/typeface.h b/src/cobalt/renderer/rasterizer/skia/typeface.h
index f0efded..26aad50 100644
--- a/src/cobalt/renderer/rasterizer/skia/typeface.h
+++ b/src/cobalt/renderer/rasterizer/skia/typeface.h
@@ -63,7 +63,6 @@
  private:
   // Usually covers Latin-1 in a single page.
   static const int kPrimaryPageSize = 256;
-  typedef base::hash_map<int32, render_tree::GlyphIndex> CharacterToGlyphMap;
 
   // The underlying SkTypeface that was used to create this typeface.
   sk_sp<SkTypeface_Cobalt> typeface_;
@@ -73,7 +72,6 @@
   // Thread checking is used to used to ensure that they are only accessed and
   // modified on a single thread.
   std::unique_ptr<render_tree::GlyphIndex[]> primary_page_character_glyphs_;
-  CharacterToGlyphMap character_to_glyph_map_;
   THREAD_CHECKER(character_glyph_thread_checker_);
 };
 
diff --git a/src/cobalt/script/array_buffer.h b/src/cobalt/script/array_buffer.h
index eb5acce..1bbaf7a 100644
--- a/src/cobalt/script/array_buffer.h
+++ b/src/cobalt/script/array_buffer.h
@@ -43,7 +43,7 @@
   static Handle<ArrayBuffer> New(GlobalEnvironment* global_environment,
                                  const void* data, size_t byte_length) {
     Handle<ArrayBuffer> array_buffer = New(global_environment, byte_length);
-    SbMemoryCopy(array_buffer->Data(), data, byte_length);
+    memcpy(array_buffer->Data(), data, byte_length);
     return array_buffer;
   }
 
diff --git a/src/cobalt/script/fake_global_environment.h b/src/cobalt/script/fake_global_environment.h
index 3773a0d..312cbc8 100644
--- a/src/cobalt/script/fake_global_environment.h
+++ b/src/cobalt/script/fake_global_environment.h
@@ -54,6 +54,9 @@
   }
   void Bind(const std::string& identifier,
             const scoped_refptr<Wrappable>& impl) override {}
+  void BindTo(const std::string& identifier,
+              const scoped_refptr<Wrappable>& impl,
+              const std::string& local_object_name) override {}
   ScriptValueFactory* script_value_factory() { return NULL; }
 };
 
diff --git a/src/cobalt/script/global_environment.h b/src/cobalt/script/global_environment.h
index 946211b..97b7093 100644
--- a/src/cobalt/script/global_environment.h
+++ b/src/cobalt/script/global_environment.h
@@ -119,6 +119,17 @@
   virtual void Bind(const std::string& identifier,
                     const scoped_refptr<Wrappable>& impl) = 0;
 
+  // Dynamically bind a cpp object to a local JavaScript object with the
+  // supplied identifier.
+  // This method is useful for testing and debug purposes, as well as for
+  // dynamically injecting an API into a JavaScript environment.
+  //
+  // This static function must be implemented by the JavaScriptEngine
+  // implementation
+  virtual void BindTo(const std::string& identifier,
+                      const scoped_refptr<Wrappable>& impl,
+                      const std::string& local_object_name) = 0;
+
   // Get the ScriptValueFactory for this global environment. The
   // GlobalEnvironment instance retains ownership of the ScriptValueFactory and
   // should live longer than any ScriptValueFactory pointer.
@@ -128,7 +139,8 @@
    public:
     ScopedPreventGarbageCollection(GlobalEnvironment* global_environment,
                                    Wrappable* wrappable)
-        : global_environment(global_environment->AsWeakPtr()), wrappable(wrappable) {
+        : global_environment(global_environment->AsWeakPtr()),
+          wrappable(wrappable) {
       global_environment->PreventGarbageCollection(
           base::WrapRefCounted(wrappable));
     }
diff --git a/src/cobalt/script/javascript_engine.h b/src/cobalt/script/javascript_engine.h
index e16a112..55124a7 100644
--- a/src/cobalt/script/javascript_engine.h
+++ b/src/cobalt/script/javascript_engine.h
@@ -36,16 +36,11 @@
 class JavaScriptEngine {
  public:
   struct Options {
-    Options() : disable_jit(false), gc_threshold_bytes(1024 * 1024) {}
+    Options() : disable_jit(false) {}
 
     // Default false. When set to true then the JavaScript engine should
     // disable the just-in-time compiler.
     bool disable_jit;
-
-    // Determines the size of garbage collection threshold. After this many
-    // bytes have been allocated, the garbage collector will run.
-    // Default is 1MB (see default constructor).
-    size_t gc_threshold_bytes;
   };
 
   typedef base::Callback<void(const base::SourceLocation& location,
diff --git a/src/cobalt/script/v8c/conversion_helpers.h b/src/cobalt/script/v8c/conversion_helpers.h
index dd9790b..b5673ea 100644
--- a/src/cobalt/script/v8c/conversion_helpers.h
+++ b/src/cobalt/script/v8c/conversion_helpers.h
@@ -309,7 +309,6 @@
   // gets triggered by the conversion.
   if (!success) {
     // TODO: Still need to handle infinite recursion edge case here.
-    // Avoiding infinite exception loops were implemented on old mozjs engine.
     // V8 does not provide APIs to determine if it is throwing exception and
     // neither does v8 provide API to alert that we might enter infinite
     // exception handling.
diff --git a/src/cobalt/script/v8c/helpers.h b/src/cobalt/script/v8c/helpers.h
index 2553fa7..c2bfbef 100644
--- a/src/cobalt/script/v8c/helpers.h
+++ b/src/cobalt/script/v8c/helpers.h
@@ -35,7 +35,7 @@
   }
   return v8::String::NewFromOneByte(
              isolate, reinterpret_cast<const uint8_t*>(string),
-             v8::NewStringType::kInternalized, SbStringGetLength(string))
+             v8::NewStringType::kInternalized, strlen(string))
       .ToLocalChecked();
 }
 
diff --git a/src/cobalt/script/v8c/isolate_fellowship.cc b/src/cobalt/script/v8c/isolate_fellowship.cc
index 9c9e9f6..6496c4c 100644
--- a/src/cobalt/script/v8c/isolate_fellowship.cc
+++ b/src/cobalt/script/v8c/isolate_fellowship.cc
@@ -64,7 +64,7 @@
 
   for (auto flag_str : kV8CommandLineFlags) {
     v8::V8::SetFlagsFromString(flag_str.c_str(),
-                               SbStringGetLength(flag_str.c_str()));
+                               strlen(flag_str.c_str()));
   }
 #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
diff --git a/src/cobalt/script/v8c/v8c_engine.cc b/src/cobalt/script/v8c/v8c_engine.cc
index 03dbccd..a039631 100644
--- a/src/cobalt/script/v8c/v8c_engine.cc
+++ b/src/cobalt/script/v8c/v8c_engine.cc
@@ -12,10 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "cobalt/script/v8c/v8c_engine.h"
 
 #include <algorithm>
diff --git a/src/cobalt/script/v8c/v8c_global_environment.cc b/src/cobalt/script/v8c/v8c_global_environment.cc
index 28ac8a9..51dac48 100644
--- a/src/cobalt/script/v8c/v8c_global_environment.cc
+++ b/src/cobalt/script/v8c/v8c_global_environment.cc
@@ -12,10 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "cobalt/script/v8c/v8c_global_environment.h"
 
 #include <algorithm>
@@ -320,6 +316,35 @@
   DCHECK(set_result.FromJust());
 }
 
+void V8cGlobalEnvironment::BindTo(const std::string& identifier,
+                                  const scoped_refptr<Wrappable>& impl,
+                                  const std::string& local_object_name) {
+  TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::BindTo()");
+  TRACK_MEMORY_SCOPE("Javascript");
+  DCHECK(impl);
+
+  EntryScope entry_scope(isolate_);
+  v8::Local<v8::Context> context = isolate_->GetCurrentContext();
+
+  v8::Local<v8::Object> wrapper = wrapper_factory_->GetWrapper(impl);
+  v8::Local<v8::Object> global_object = context->Global();
+
+  v8::Local<v8::String> local_object_string(
+      v8::String::NewFromUtf8(isolate_, local_object_name.c_str(),
+                              v8::NewStringType::kInternalized)
+          .ToLocalChecked());
+  v8::Local<v8::Object> local_object = v8::Local<v8::Object>::Cast(
+      global_object->Get(context, local_object_string).ToLocalChecked());
+
+  v8::Maybe<bool> set_result = local_object->Set(
+      context,
+      v8::String::NewFromUtf8(isolate_, identifier.c_str(),
+                              v8::NewStringType::kInternalized)
+          .ToLocalChecked(),
+      wrapper);
+  DCHECK(set_result.FromJust());
+}
+
 ScriptValueFactory* V8cGlobalEnvironment::script_value_factory() {
   DCHECK(script_value_factory_);
   return script_value_factory_.get();
@@ -438,8 +463,8 @@
       static_cast<const CobaltExtensionJavaScriptCacheApi*>(
           SbSystemGetExtension(kCobaltExtensionJavaScriptCacheName));
   if (javascript_cache_extension &&
-      SbStringCompareAll(javascript_cache_extension->name,
-                         kCobaltExtensionJavaScriptCacheName) == 0 &&
+      strcmp(javascript_cache_extension->name,
+             kCobaltExtensionJavaScriptCacheName) == 0 &&
       javascript_cache_extension->version >= 1) {
     TRACE_EVENT0("cobalt::script",
                  "V8cGlobalEnvironment::CompileWithCaching()");
diff --git a/src/cobalt/script/v8c/v8c_global_environment.h b/src/cobalt/script/v8c/v8c_global_environment.h
index 6d6c9c5..05c8b3d 100644
--- a/src/cobalt/script/v8c/v8c_global_environment.h
+++ b/src/cobalt/script/v8c/v8c_global_environment.h
@@ -97,6 +97,10 @@
   void Bind(const std::string& identifier,
             const scoped_refptr<Wrappable>& impl) override;
 
+  void BindTo(const std::string& identifier,
+              const scoped_refptr<Wrappable>& impl,
+              const std::string& local_object_name) override;
+
   ScriptValueFactory* script_value_factory() override;
 
   v8::Isolate* isolate() const { return isolate_; }
diff --git a/src/cobalt/site/docs/reference/starboard/configuration-public.md b/src/cobalt/site/docs/reference/starboard/configuration-public.md
index 72102ed..4f281ca 100644
--- a/src/cobalt/site/docs/reference/starboard/configuration-public.md
+++ b/src/cobalt/site/docs/reference/starboard/configuration-public.md
@@ -68,9 +68,10 @@
 
 | Properties |
 | :--- |
-| **`SB_HAS_QUIRK_SEEK_TO_KEYFRAME`**<br><br>After a seek is triggerred, the default behavior is to append video frames from the last key frame before the seek time and append audio frames from the seek time because usually all audio frames are key frames.  On platforms that cannot decode video frames without displaying them, this will cause the video being played without audio for several seconds after seeking.  When the following macro is defined, the app will append audio frames start from the timestamp that is before the timestamp of the video key frame being appended.  This quirk has been deprecated in Starboard version 12 or later.  Please see `configuration_public.md` for more details.<br><br>By default, this property is undefined. |
+| **`SB_HAS_QUIRK_SEEK_TO_KEYFRAME`**<br><br>After a seek is triggered, the default behavior is to append video frames from the last key frame before the seek time and append audio frames from the seek time because usually all audio frames are key frames.  On platforms that cannot decode video frames without displaying them, this will cause the video being played without audio for several seconds after seeking.  When the following macro is defined, the app will append audio frames start from the timestamp that is before the timestamp of the video key frame being appended.  This quirk has been deprecated in Starboard version 12 or later.  Please see `configuration_public.md` for more details.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_SUPPORT_INT16_AUDIO_SAMPLES`**<br><br>The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only when this macro is defined.<br><br>By default, this property is undefined. |
 
+
 ## Memory Configuration
 
 | Properties |
@@ -107,3 +108,5 @@
 | Properties |
 | :--- |
 | **`SB_HAS_TIME_THREAD_NOW`**<br><br>Whether this platform has an API to retrieve how long the current thread has spent in the executing state.<br><br>The default value in the Stub implementation is `1` |
+
+
diff --git a/src/cobalt/site/docs/reference/starboard/gyp-configuration.md b/src/cobalt/site/docs/reference/starboard/gyp-configuration.md
index 771132b..99943c3 100644
--- a/src/cobalt/site/docs/reference/starboard/gyp-configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/gyp-configuration.md
@@ -7,6 +7,7 @@
 | :--- |
 | **`abort_on_allocation_failure`**<br><br> Halt execution on failure to allocate memory.<br><br>The default value is `1`. |
 | **`cobalt`**<br><br> Whether Cobalt is being built.<br><br>The default value is `1`. |
+| **`cobalt_compiled_by_msvc`**<br><br> Some compiler can not compile with raw assembly(.S files) and v8 converts asm to inline assembly for these platforms.<br><br>The default value is `0`. |
 | **`cobalt_config`**<br><br> Contains the current build configuration.<br><br>The default value is `'gold'`. |
 | **`cobalt_egl_swap_interval`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEglSwapInterval instead. Cobalt will call eglSwapInterval() and specify this value before calling eglSwapBuffers() each frame.<br><br>The default value is `-1`. |
 | **`cobalt_enable_jit`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltEnableJit instead.<br><br>The default value is `-1`. |
@@ -24,6 +25,7 @@
 | **`cobalt_font_package_override_named_sans_serif`**<br><br> Font package overrides can be used to modify the files included within the selected package. The following values are available: -1 -- The package value for the specified category is not overridden. 0 -- The package value is overridden and no fonts for the specified category are included. 1 -- The package value is overridden and fonts from the specified category with a weight of 'normal' and a style of 'normal' are included. 2 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or bold' and a style of 'normal' are included. 3 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or 'bold' and a style of either 'normal' or 'italic' are included. 4 -- The package value is overridden and all available fonts from the specified category are included. This may include additional weights beyond 'normal' and 'bold'. See content/fonts/README.md for details on the specific values used by each of the packages use for the various font categories.<br><br>The default value is `-1`. |
 | **`cobalt_font_package_override_named_serif`**<br><br> Font package overrides can be used to modify the files included within the selected package. The following values are available: -1 -- The package value for the specified category is not overridden. 0 -- The package value is overridden and no fonts for the specified category are included. 1 -- The package value is overridden and fonts from the specified category with a weight of 'normal' and a style of 'normal' are included. 2 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or bold' and a style of 'normal' are included. 3 -- The package value is overridden and fonts from the specified category with a weight of either 'normal' or 'bold' and a style of either 'normal' or 'italic' are included. 4 -- The package value is overridden and all available fonts from the specified category are included. This may include additional weights beyond 'normal' and 'bold'. See content/fonts/README.md for details on the specific values used by each of the packages use for the various font categories.<br><br>The default value is `-1`. |
 | **`cobalt_gc_zeal`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltGcZeal instead. Can be set to enable zealous garbage collection, if |javascript_engine| supports it.  Zealous garbage collection will cause garbage collection to occur much more frequently than normal, for the purpose of finding or reproducing bugs.<br><br>The default value is `-1`. |
+| **`cobalt_licenses_platform`**<br><br>The default value is `'default'`. |
 | **`cobalt_media_buffer_alignment`**<br><br> The media buffer will be allocated using the following alignment.  Set this to a larger value may increase the memory consumption of media buffers.<br><br>The default value is `-1`. |
 | **`cobalt_media_buffer_allocation_unit`**<br><br> When the media stack needs more memory to store media buffers, it will allocate extra memory in units of |cobalt_media_buffer_allocation_unit|. This can be set to 0, in which case the media stack will allocate extra memory on demand.  When |cobalt_media_buffer_initial_capacity| and this value are both set to 0, the media stack will allocate individual buffers directly using SbMemory functions.<br><br>The default value is `-1`. |
 | **`cobalt_media_buffer_initial_capacity`**<br><br> The amount of memory that will be used to store media buffers allocated during system startup.  To allocate a large chunk at startup helps with reducing fragmentation and can avoid failures to allocate incrementally. This can be set to 0.<br><br>The default value is `-1`. |
@@ -41,18 +43,18 @@
 | **`cobalt_platform_dependencies`**<br><br> List of platform-specific targets that get compiled into cobalt.<br><br>The default value is `[]`. |
 | **`cobalt_splash_screen_file`**<br><br> The path to a splash screen to copy into content/data/web which can be accessed via a file URL starting with "file:///cobalt/browser/splash_screen/". If '', no file is copied.<br><br>The default value is `''`. |
 | **`cobalt_user_on_exit_strategy`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltUserOnExitStrategy instead. This variable defines what Cobalt's preferred strategy should be for handling internally triggered application exit requests (e.g. the user chooses to back out of the application).<ul><li><code>stop</code> - The application should call SbSystemRequestStop() on exit, resulting in a complete shutdown of the application.<li><code>suspend</code> - The application should call SbSystemRequestSuspend() on exit, resulting in the application being "minimized".<li><code>noexit</code> - The application should never allow the user to trigger an exit, this will be managed by the system.<br><br>The default value is `''`. |
-| **`cobalt_v8_emit_builtins_as_inline_asm`**<br><br> Some compiler can not compile with raw assembly(.S files) and v8 converts asm to inline assembly for these platforms.<br><br>The default value is `1`. |
+| **`cobalt_v8_emit_builtins_as_inline_asm`**<br><br> Some compiler can not compile with raw assembly(.S files) and v8 converts asm to inline assembly for these platforms.<br><br>The default value is `0`. |
 | **`cobalt_version`**<br><br> Build version number.<br><br>The default value is `'<(BUILD_NUMBER)'`. |
 | **`cobalt_webapi_extension_generated_header_idl_files`**<br><br> We need to define some variables inside of an inner 'variables' scope so that they can be referenced by other outer variables here.  Also, it allows for the specification of default values that get referenced by a top level scope.<br><br>The default value is `[]`. |
 | **`cobalt_webapi_extension_source_idl_files`**<br><br> We need to define some variables inside of an inner 'variables' scope so that they can be referenced by other outer variables here.  Also, it allows for the specification of default values that get referenced by a top level scope.<br><br>The default value is `[]`. |
 | **`compiler_flags_<config>`**<br><br>The following configurations are supported: <ul><li><code>[default]</code></li><li><code>c_debug</code></li><li><code>c_devel</code></li><li><code>c_gold</code></li><li><code>c_gold_size</code></li><li><code>c_gold_speed</code></li><li><code>c_host</code></li><li><code>c_qa</code></li><li><code>c_qa_size</code></li><li><code>c_qa_speed</code></li><li><code>cc_debug</code></li><li><code>cc_devel</code></li><li><code>cc_gold</code></li><li><code>cc_gold_size</code></li><li><code>cc_gold_speed</code></li><li><code>cc_host</code></li><li><code>cc_qa</code></li><li><code>cc_qa_size</code></li><li><code>cc_qa_speed</code></li><li><code>debug</code></li><li><code>devel</code></li><li><code>gold</code></li><li><code>gold_size</code></li><li><code>gold_speed</code></li><li><code>host</code></li><li><code>qa</code></li><li><code>qa_size</code></li><li><code>qa_speed</ul> |
-| **`custom_media_session_client`**<br><br> Set to 1 to enable a custom MediaSessionClient.<br><br>The default value is `0`. |
 | **`default_renderer_options_dependency`**<br><br> Override this value to adjust the default rasterizer setting for your platform.<br><br>The default value is `'<(DEPTH)/cobalt/renderer/default_options_starboard.gyp:default_options'`. |
 | **`defines_debug`**<br><br> and linker_executable_flags_(config) to distinguish the flags for SharedLibraryLinker and ExecutableLinker.<br><br>The default value is `[]`. |
 | **`defines_devel`**<br><br>The default value is `[]`. |
 | **`defines_gold`**<br><br>The default value is `[]`. |
 | **`defines_host`**<br><br>The default value is `[]`. |
 | **`defines_qa`**<br><br> For qa and gold configs, different compiler flags may be specified for gyp targets that should be built for size than for speed. Targets which specify 'optimize_target_for_speed == 1', will compile with flags: ['compiler_flags_*<config>', 'compiler_flags_*<config>_speed']. Otherwise, targets will use compiler flags: ['compiler_flags_*<config>', 'compiler_flags_*<config>_size']. Platforms may decide to use the same optimization flags for both target types by leaving the '*_size' and '*_speed' variables empty.<br><br>The default value is `[]`. |
+| **`disable_v8_pointer_compression`**<br><br> In cross-compiling for modules like V8, we need a gyp flag to tell that Cobalt is being compiled by MSVC and certain MSVC options should be specified. This is needed even with 'msvs_settings' since the later is not used by platforms that only uses MSVC for host build.<br><br>The default value is `0`. |
 | **`enable_account_manager`**<br><br> Set to 1 to enable H5vccAccountManager.<br><br>The default value is `0`. |
 | **`enable_configure_request_job_factory`**<br><br> Set to 1 to enable setting Interceptors on the URLRequestJobFactory<br><br>The default value is `0`. |
 | **`enable_crash_log`**<br><br> Set to 1 to enable H5vccCrashLog.<br><br>The default value is `1`. |
@@ -64,8 +66,9 @@
 | **`final_executable_type`**<br><br> The variables allow changing the target type on platforms where the native code may require an additional packaging step (ex. Android).<br><br>The default value is `'executable'`. |
 | **`gl_type`**<br><br> The source of EGL and GLES headers and libraries. Valid values (case and everything sensitive!):<ul><li><code>none</code> - No EGL + GLES implementation is available on this platform.<li><code>system_gles3</code> - Deprecated. Use system_gles2 instead. Use the system implementation of EGL + GLES3. The headers and libraries must be on the system include and link paths.<li><code>system_gles2</code> - Use the system implementation of EGL + GLES2. The headers and libraries must be on the system include and link paths.<li><code>glimp</code> - Cobalt's own EGL + GLES2 implementation. This requires a valid Glimp implementation for the platform.<li><code>angle</code> - A DirectX-to-OpenGL adaptation layer. This requires a valid ANGLE implementation for the platform.</li></ul> Choosing an unsupported value will result in a GYP error: "cobalt/renderer/egl_and_gles/egl_and_gles_<gl_type>.gyp not found"<br><br>The default value is `'system_gles2'`. |
 | **`gtest_target_type`**<br><br> The variables allow changing the target type on platforms where the native code may require an additional packaging step (ex. Android).<br><br>The default value is `'executable'`. |
+| **`host_executable_suffix`**<br><br> In cross-compiling for modules like V8, we need a gyp flag to tell that Cobalt is being compiled by MSVC and certain MSVC options should be specified. This is needed even with 'msvs_settings' since the later is not used by platforms that only uses MSVC for host build.<br><br>The default value is `'<(EXECUTABLE_SUFFIX)'`. |
 | **`host_os`**<br><br> Contains the name of the hosting OS. The value is defined by the gyp wrapper script.<br><br>The default value is `'win'`. |
-| **`image_cache_capacity_multiplier_when_playing_video`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltImageCacheCapacityMultiplierWhenPlayingVideo. Modifying this value to be non-1.0f will result in the image cache capacity being cleared and then temporarily reduced for the duration that a video is playing.  This can be useful for some platforms if they are particularly constrained for (GPU) memory during video playback.  When playing a video, the image cache is reduced to: image_cache_size_in_bytes * image_cache_capacity_multiplier_when_playing_video.<br><br>The default value is `''`. |
+| **`image_cache_capacity_multiplier_when_playing_video`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltImageCacheCapactityMultiplierWhenPlayingVideo. Modifying this value to be non-1.0f will result in the image cache capacity being cleared and then temporarily reduced for the duration that a video is playing.  This can be useful for some platforms if they are particularly constrained for (GPU) memory during video playback.  When playing a video, the image cache is reduced to: image_cache_size_in_bytes * image_cache_capacity_multiplier_when_playing_video.<br><br>The default value is `''`. |
 | **`image_cache_size_in_bytes`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltImageCacheSizeInBytes instead. Determines the capacity of the image cache, which manages image surfaces downloaded from a web page.  While it depends on the platform, often (and ideally) these images are cached within GPU memory. Set to -1 to automatically calculate the value at runtime, based on features like windows dimensions and the value of SbSystemGetTotalGPUMemory().<br><br>The default value is `-1`. |
 | **`in_app_dial`**<br><br> Set to 1 to build with DIAL support.<br><br>The default value is `0`. |
 | **`linker_flags_<config>`**<br><br>The following configurations are supported: <ul><li><code>[default]</code></li><li><code>debug</code></li><li><code>devel</code></li><li><code>gold</code></li><li><code>host</code></li><li><code>qa</ul> |
@@ -84,11 +87,14 @@
 | **`render_dirty_region_only`**<br><br> Deprecated. Implement the CobaltExtensionConfigurationApi function CobaltRenderDirtyRegionOnly instead. If set to 1, will enable support for rendering only the regions of the display that are modified due to animations, instead of re-rendering the entire scene each frame.  This feature can reduce startup time where usually there is a small loading spinner animating on the screen.  On GLES renderers, Cobalt will attempt to implement this support by using eglSurfaceAttrib(..., EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED), otherwise the dirty region will be silently disabled.  On Blitter API platforms, if this is enabled, we explicitly create an extra offscreen full-size intermediate surface to render into.  Note that some GLES driver implementations may internally allocate an extra full screen surface to support this feature, and many have been noticed to not properly support this functionality (but they report that they do), and for these reasons this value is defaulted to 0.<br><br>The default value is `-1`. |
 | **`sb_api_version`**<br><br> The Starboard API version of the current build configuration. The default value is meant to be overridden by a Starboard ABI file.<br><br>The default value is `0`. |
 | **`sb_deploy_output_dir`**<br><br> Top-level directory for staging deploy build output. Platform deploy actions should use <(target_deploy_dir) defined in deploy.gypi to place artifacts for each deploy target in its own subdirectoy.<br><br>The default value is `'<(sb_deploy_output_dir)'`. |
+| **`sb_disable_cpp17_audit`**<br><br> Disables an NPLB audit of C++17 support.<br><br>The default value is `0`. |
 | **`sb_disable_microphone_idl`**<br><br> When this is set to true, the web bindings for the microphone are disabled<br><br>The default value is `0`. |
 | **`sb_enable_benchmark`**<br><br> Used to enable benchmarks.<br><br>The default value is `0`. |
 | **`sb_enable_lib`**<br><br> Enables embedding Cobalt as a shared library within another app. This requires a 'lib' starboard implementation for the corresponding platform.<br><br>The default value is `'<(sb_enable_lib)'`. |
 | **`sb_evergreen`**<br><br> Whether this is an evergreen build.<br><br>The default value is `0`. |
 | **`sb_evergreen_compatible`**<br><br> Whether this is an evergreen compatible platform. A compatible platform can run the elf_loader and launch the evergreen build.<br><br>The default value is `'<(sb_evergreen_compatible)'`. |
+| **`sb_evergreen_compatible_libunwind`**<br><br> Whether to use the libunwind library on evergreen compatible platform.<br><br>The default value is `'<(sb_evergreen_compatible_libunwind)'`. |
+| **`sb_evergreen_compatible_lite`**<br><br> Whether to adopt Evergreen Lite on the evergreen compatible platform.<br><br>The default value is `'<(sb_evergreen_compatible_lite)'`. |
 | **`sb_filter_based_player`**<br><br> Used to indicate that the player is filter based.<br><br>The default value is `1`. |
 | **`sb_libevent_method`**<br><br> The event polling mechanism available on this platform to support libevent. Platforms may redefine to 'poll' if necessary. Other mechanisms, e.g. devpoll, kqueue, select, are not yet supported.<br><br>The default value is `'epoll'`. |
 | **`sb_pedantic_warnings`**<br><br> Enabling this variable enables pedantic levels of warnings for the current toolchain.<br><br>The default value is `0`. |
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md b/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md
deleted file mode 100644
index b35275f..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/blitter.md
+++ /dev/null
@@ -1,300 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: blitter.h"
----
-
-The Blitter API provides support for issuing simple blit-style draw commands to
-either an offscreen surface or to a Starboard `SbWindow` object. Blitter is
-jargon that means "BLock Transfer," which might be abbreviated as BLT and,
-hence, the word "blit."
-
-This API is designed to allow implementations make use of GPU hardware
-acceleration, if it is available. Draw commands exist for solid-color rectangles
-and rasterization/blitting of rectangular images onto rectangular target
-patches.
-Threading Concerns
-
-Note that in general the Blitter API is not thread safe, except for all
-`SbBlitterDevice`-related functions. All functions that are not required to
-internally ensure any thread safety guarantees are prefaced with a comment
-indicating that they are not thread safe.
-
-Functions which claim to not be thread safe can still be used from multiple
-threads, but manual synchronization must be performed in order to ensure their
-parameters are not referenced at the same time on another thread by another
-function.
-Examples
-
-*   Multiple threads should not issue commands to the same `SbBlitterContext`
-    object unless they are manually synchronized.
-
-*   Multiple threads should not issue draw calls to the same render target, even
-    if the draw calls are made within separate contexts. In this case, be sure
-    to manually synchronize through the use of syncrhonization primitives and
-    use of the `SbBlitterFlushContext()` command.
-
-*   Multiple threads can operate on the swap chain, but they must perform manual
-    synchronization.
-
-## Enums ##
-
-### SbBlitterPixelDataFormat ###
-
-Defines the set of pixel formats that can be used with the Blitter API
-`SbBlitterPixelData` objects. Note that not all of these formats are guaranteed
-to be supported by a particular device, so before using these formats in pixel
-data creation commands, it should be checked that they are supported first (e.g.
-via `SbBlitterIsPixelFormatSupportedByPixelData()`). `SbBlitterPixelDataFormat`
-specifies specific orderings of the color channels, and when doing so, byte-
-order is used, e.g. "RGBA" implies that a value for red is stored in the byte
-with the lowest memory address. All pixel values are assumed to be in
-premultiplied alpha format.
-
-#### Values ####
-
-*   `kSbBlitterPixelDataFormatARGB8`
-
-    32-bit pixels with 8-bits per channel, the alpha component in the byte with
-    the lowest address and blue in the byte with the highest address.
-*   `kSbBlitterPixelDataFormatBGRA8`
-
-    32-bit pixels with 8-bits per channel, the blue component in the byte with
-    the lowest address and alpha in the byte with the highest address.
-*   `kSbBlitterPixelDataFormatRGBA8`
-
-    32-bit pixels with 8-bits per channel, the red component in the byte with
-    the lowest address and alpha in the byte with the highest address.
-*   `kSbBlitterPixelDataFormatA8`
-
-    8-bit pixels that contain only a single alpha channel. When rendered,
-    surfaces in this format will have `(R, G, B)` values of `(255, 255, 255)`.
-*   `kSbBlitterNumPixelDataFormats`
-
-    Constant that indicates how many unique pixel formats Starboard supports.
-*   `kSbBlitterInvalidPixelDataFormat`
-
-### SbBlitterSurfaceFormat ###
-
-Enumeration that describes the color format of surfaces. Note that
-`SbBlitterSurfaceFormat` does not differentiate between permutations of the
-color channel ordering (e.g. RGBA vs ARGB) since client code will never be able
-to access surface pixels directly. This is the main difference between
-`SbBlitterPixelDataFormat`, which does explicitly dictate an ordering.
-
-#### Values ####
-
-*   `kSbBlitterSurfaceFormatRGBA8`
-
-    32-bit RGBA color, with 8 bits per channel.
-*   `kSbBlitterSurfaceFormatA8`
-
-    8-bit alpha-only color.
-*   `kSbBlitterNumSurfaceFormats`
-
-    Constant that indicates how many unique surface formats Starboard supports.
-*   `kSbBlitterInvalidSurfaceFormat`
-
-## Typedefs ##
-
-### SbBlitterColor ###
-
-A simple 32-bit color representation that is a parameter to many Blitter
-functions.
-
-#### Definition ####
-
-```
-typedef uint32_t SbBlitterColor
-```
-
-## Structs ##
-
-### SbBlitterRect ###
-
-Defines a rectangle via a point `(x, y)` and a size `(width, height)`. This
-structure is used as a parameter type in various blit calls.
-
-#### Members ####
-
-*   `int x`
-*   `int y`
-*   `int width`
-*   `int height`
-
-### SbBlitterSurfaceInfo ###
-
-`SbBlitterSurfaceInfo` collects information about surfaces that can be queried
-from them at any time.
-
-#### Members ####
-
-*   `int width`
-*   `int height`
-*   `SbBlitterSurfaceFormat format`
-
-## Functions ##
-
-### SB_DEPRECATED ###
-
-This function achieves the same effect as calling `SbBlitterBlitRectToRect()`
-`num_rects` times with each of the `num_rects` values of `src_rects` and
-`dst_rects`. This function allows for greater efficiency than looped calls to
-`SbBlitterBlitRectToRect()`.
-
-This function is not thread-safe.
-
-The return value indicates whether the draw call succeeded.
-
-#### Declaration ####
-
-```
-SB_DEPRECATED(bool SbBlitterBlitRectsToRects(SbBlitterContext context, SbBlitterSurface source_surface, const SbBlitterRect *src_rects, const SbBlitterRect *dst_rects, int num_rects))
-```
-
-### SbBlitterAFromColor ###
-
-Extract alpha from a `SbBlitterColor` object.
-
-#### Declaration ####
-
-```
-static uint8_t SbBlitterAFromColor(SbBlitterColor color)
-```
-
-### SbBlitterBFromColor ###
-
-Extract blue from a `SbBlitterColor` object.
-
-#### Declaration ####
-
-```
-static uint8_t SbBlitterBFromColor(SbBlitterColor color)
-```
-
-### SbBlitterBytesPerPixelForFormat ###
-
-A convenience function to return the number of bytes per pixel for a given pixel
-format.
-
-#### Declaration ####
-
-```
-static int SbBlitterBytesPerPixelForFormat(SbBlitterPixelDataFormat format)
-```
-
-### SbBlitterColorFromRGBA ###
-
-A convenience function to create a `SbBlitterColor` object from separate 8-bit
-RGBA components.
-
-#### Declaration ####
-
-```
-static SbBlitterColor SbBlitterColorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
-```
-
-### SbBlitterGFromColor ###
-
-Extract green from a `SbBlitterColor` object.
-
-#### Declaration ####
-
-```
-static uint8_t SbBlitterGFromColor(SbBlitterColor color)
-```
-
-### SbBlitterIsContextValid ###
-
-Checks whether a blitter context is invalid.
-
-#### Declaration ####
-
-```
-static bool SbBlitterIsContextValid(SbBlitterContext context)
-```
-
-### SbBlitterIsDeviceValid ###
-
-Checks whether a blitter device is invalid.
-
-#### Declaration ####
-
-```
-static bool SbBlitterIsDeviceValid(SbBlitterDevice device)
-```
-
-### SbBlitterIsPixelDataValid ###
-
-Checks whether a pixel data object is invalid.
-
-#### Declaration ####
-
-```
-static bool SbBlitterIsPixelDataValid(SbBlitterPixelData pixel_data)
-```
-
-### SbBlitterIsRenderTargetValid ###
-
-Checks whether a render target is invalid.
-
-#### Declaration ####
-
-```
-static bool SbBlitterIsRenderTargetValid(SbBlitterRenderTarget render_target)
-```
-
-### SbBlitterIsSurfaceValid ###
-
-Checks whether a surface is invalid.
-
-#### Declaration ####
-
-```
-static bool SbBlitterIsSurfaceValid(SbBlitterSurface surface)
-```
-
-### SbBlitterIsSwapChainValid ###
-
-Checks whether a swap chain is invalid.
-
-#### Declaration ####
-
-```
-static bool SbBlitterIsSwapChainValid(SbBlitterSwapChain swap_chain)
-```
-
-### SbBlitterMakeRect ###
-
-Convenience function to setup a rectangle with the specified parameters.
-
-#### Declaration ####
-
-```
-static SbBlitterRect SbBlitterMakeRect(int x, int y, int width, int height)
-```
-
-### SbBlitterPixelDataFormatToSurfaceFormat ###
-
-This function maps SbBlitterPixelDataFormat values to their corresponding
-`SbBlitterSurfaceFormat` value. Note that many `SbBlitterPixelDataFormat`s
-correspond to the same `SbBlitterSurfaceFormat`, so this function is not
-invertible. When creating a `SbBlitterSurface` object from a
-`SbBlitterPixelData` object, the `SbBlitterSurface`'s format will be computed
-from the `SbBlitterPixelData` object by using this function.
-
-#### Declaration ####
-
-```
-static SbBlitterSurfaceFormat SbBlitterPixelDataFormatToSurfaceFormat(SbBlitterPixelDataFormat pixel_format)
-```
-
-### SbBlitterRFromColor ###
-
-Extract red from a `SbBlitterColor` object.
-
-#### Declaration ####
-
-```
-static uint8_t SbBlitterRFromColor(SbBlitterColor color)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/character.md b/src/cobalt/site/docs/reference/starboard/modules/10/character.md
deleted file mode 100644
index 432dcae..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/character.md
+++ /dev/null
@@ -1,104 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: character.h"
----
-
-Provides functions for interacting with characters.
-
-## Functions ##
-
-### SbCharacterIsAlphanumeric ###
-
-Indicates whether the given 8-bit character `c` (as an int) is alphanumeric in
-the current locale.
-
-`c`: The character to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbCharacterIsAlphanumeric(int c)
-```
-
-### SbCharacterIsDigit ###
-
-Indicates whether the given 8-bit character `c` (as an int) is a decimal digit
-in the current locale.
-
-`c`: The character to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbCharacterIsDigit(int c)
-```
-
-### SbCharacterIsHexDigit ###
-
-Indicates whether the given 8-bit character `c` (as an int) is a hexadecimal in
-the current locale.
-
-`c`: The character to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbCharacterIsHexDigit(int c)
-```
-
-### SbCharacterIsSpace ###
-
-Indicates whether the given 8-bit character `c` (as an int) is a space in the
-current locale.
-
-`c`: The character to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbCharacterIsSpace(int c)
-```
-
-### SbCharacterIsUpper ###
-
-Indicates whether the given 8-bit character `c` (as an int) is uppercase in the
-current locale.
-
-`c`: The character to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbCharacterIsUpper(int c)
-```
-
-### SbCharacterToLower ###
-
-Converts the given 8-bit character (as an int) to lowercase in the current
-locale and returns an 8-bit character. If there is no lowercase version of the
-character, or the character is already lowercase, the function just returns the
-character as-is.
-
-`c`: The character to be converted.
-
-#### Declaration ####
-
-```
-int SbCharacterToLower(int c)
-```
-
-### SbCharacterToUpper ###
-
-Converts the given 8-bit character (as an int) to uppercase in the current
-locale and returns an 8-bit character. If there is no uppercase version of the
-character, or the character is already uppercase, the function just returns the
-character as-is.
-
-`c`: The character to be converted.
-
-#### Declaration ####
-
-```
-int SbCharacterToUpper(int c)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md b/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md
deleted file mode 100644
index 0b9442b..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/cryptography.md
+++ /dev/null
@@ -1,234 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: cryptography.h"
----
-
-Hardware-accelerated cryptography. Platforms should **only** only implement this
-when there are **hardware-accelerated** hardware-accelerated cryptography
-facilities. Applications must fall back to platform-independent CPU-based
-algorithms if the cipher algorithm isn't supported in hardware.
-Tips for Porters
-
-You should implement cipher algorithms in this descending order of priority to
-maximize usage for SSL.
-
-1.  GCM - The preferred block cipher mode for OpenSSL, mainly due to speed.
-
-1.  CTR - This can be used internally with GCM, as long as the CTR
-    implementation only uses the last 4 bytes of the IV for the counter. (i.e.
-    96-bit IV, 32-bit counter)
-
-1.  ECB - This can be used (with a null IV) with any of the other cipher block
-    modes to accelerate the core AES algorithm if none of the streaming modes
-    can be accelerated.
-
-1.  CBC - GCM is always preferred if the server and client both support it. If
-    not, they will generally negotiate down to AES-CBC. If this happens, and CBC
-    is supported by SbCryptography, then it will be accelerated appropriately.
-    But, most servers should support GCM, so it is not likely to come up much,
-    which is why it is the lowest priority.
-
-Further reading on block cipher modes:
-
-[https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
-
-[https://crbug.com/442572](https://crbug.com/442572)
-
-[https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption](https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption)
-
-## Macros ##
-
-### kSbCryptographyAlgorithmAes ###
-
-String literal for the AES symmetric block cipher. [https://en.wikipedia.org/wiki/Advanced_Encryption_Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
-
-### kSbCryptographyInvalidTransformer ###
-
-Well-defined value for an invalid transformer.
-
-## Enums ##
-
-### SbCryptographyBlockCipherMode ###
-
-The method of chaining encrypted blocks in a sequence. [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
-
-#### Values ####
-
-*   `kSbCryptographyBlockCipherModeCbc`
-
-    Cipher Block Chaining mode.
-*   `kSbCryptographyBlockCipherModeCfb`
-
-    Cipher Feedback mode.
-*   `kSbCryptographyBlockCipherModeCtr`
-
-    Counter mode: A nonce is combined with an increasing counter.
-*   `kSbCryptographyBlockCipherModeEcb`
-
-    Electronic Code Book mode: No chaining.
-*   `kSbCryptographyBlockCipherModeOfb`
-
-    Output Feedback mode.
-*   `kSbCryptographyBlockCipherModeGcm`
-
-    Galois/Counter Mode.
-
-### SbCryptographyDirection ###
-
-The direction of a cryptographic transformation.
-
-#### Values ####
-
-*   `kSbCryptographyDirectionEncode`
-
-    Cryptographic transformations that encode/encrypt data into a target format.
-*   `kSbCryptographyDirectionDecode`
-
-    Cryptographic transformations that decode/decrypt data into its original
-    form.
-
-## Typedefs ##
-
-### SbCryptographyTransformer ###
-
-A handle to a cryptographic transformer.
-
-#### Definition ####
-
-```
-typedef SbCryptographyTransformerPrivate* SbCryptographyTransformer
-```
-
-## Functions ##
-
-### SbCryptographyCreateTransformer ###
-
-Creates an SbCryptographyTransformer with the given initialization data. It can
-then be used to transform a series of data blocks. Returns
-kSbCryptographyInvalidTransformer if the algorithm isn't supported, or if the
-parameters are not compatible with the algorithm.
-
-An SbCryptographyTransformer contains all state to start decrypting a sequence
-of cipher blocks according to the cipher block mode. It is not thread-safe, but
-implementations must allow different SbCryptographyTransformer instances to
-operate on different threads.
-
-All parameters must not be assumed to live longer than the call to this
-function. They must be copied by the implementation to be retained.
-
-This function determines success mainly based on whether the combination of
-`algorithm`, `direction`, `block_size_bits`, and `mode` is supported and whether
-all the sizes passed in are sufficient for the selected parameters. In
-particular, this function cannot verify that the key and IV used were correct
-for the ciphertext, were it to be used in the decode direction. The caller must
-make that verification.
-
-For example, to decrypt AES-128-CTR:
-SbCryptographyCreateTransformer(kSbCryptographyAlgorithmAes, 128,
-kSbCryptographyDirectionDecode, kSbCryptographyBlockCipherModeCtr, ...);
-
-`algorithm`: A string that represents the cipher algorithm. `block_size_bits`:
-The block size variant of the algorithm to use, in bits. `direction`: The
-direction in which to transform the data. `mode`: The block cipher mode to use.
-`initialization_vector`: The Initialization Vector (IV) to use. May be NULL for
-block cipher modes that don't use it, or don't set it at init time.
-`initialization_vector_size`: The size, in bytes, of the IV. `key`: The key to
-use for this transformation. `key_size`: The size, in bytes, of the key.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-SbCryptographyTransformer SbCryptographyCreateTransformer(const char *algorithm, int block_size_bits, SbCryptographyDirection direction, SbCryptographyBlockCipherMode mode, const void *initialization_vector, int initialization_vector_size, const void *key, int key_size)
-```
-
-### SbCryptographyDestroyTransformer ###
-
-Destroys the given `transformer` instance.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-void SbCryptographyDestroyTransformer(SbCryptographyTransformer transformer)
-```
-
-### SbCryptographyGetTag ###
-
-Calculates the authenticator tag for a transformer and places up to
-`out_tag_size` bytes of it in `out_tag`. Returns whether it was able to get the
-tag, which mainly has to do with whether it is compatible with the current block
-cipher mode.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-bool SbCryptographyGetTag(SbCryptographyTransformer transformer, void *out_tag, int out_tag_size)
-```
-
-### SbCryptographyIsTransformerValid ###
-
-Returns whether the given transformer handle is valid.
-
-#### Declaration ####
-
-```
-static bool SbCryptographyIsTransformerValid(SbCryptographyTransformer transformer)
-```
-
-### SbCryptographySetAuthenticatedData ###
-
-Sets additional authenticated data (AAD) for a transformer, for chaining modes
-that support it (GCM). Returns whether the data was successfully set. This can
-fail if the chaining mode doesn't support AAD, if the parameters are invalid, or
-if the internal state is invalid for setting AAD.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-bool SbCryptographySetAuthenticatedData(SbCryptographyTransformer transformer, const void *data, int data_size)
-```
-
-### SbCryptographySetInitializationVector ###
-
-Sets the initialization vector (IV) for a transformer, replacing the internally-
-set IV. The block cipher mode algorithm will update the IV appropriately after
-every block, so this is not necessary unless the stream is discontiguous in some
-way. This happens with AES-GCM in TLS.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-void SbCryptographySetInitializationVector(SbCryptographyTransformer transformer, const void *initialization_vector, int initialization_vector_size)
-```
-
-### SbCryptographyTransform ###
-
-Transforms one or more `block_size_bits`-sized blocks of `in_data`, with the
-given `transformer`, placing the result in `out_data`. Returns the number of
-bytes that were written to `out_data`, unless there was an error, in which case
-it will return a negative number.
-
-`transformer`: A transformer initialized with an algorithm, IV, cipherkey, and
-so on. `in_data`: The data to be transformed. `in_data_size`: The size of the
-data to be transformed, in bytes. Must be a multiple of the transformer's
-`block-size_bits`, or an error will be returned. `out_data`: A buffer where the
-transformed data should be placed. Must have at least capacity for
-`in_data_size` bytes. May point to the same memory as `in_data`.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-int SbCryptographyTransform(SbCryptographyTransformer transformer, const void *in_data, int in_data_size, void *out_data)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/double.md b/src/cobalt/site/docs/reference/starboard/modules/10/double.md
deleted file mode 100644
index 6667b50..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/double.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: double.h"
----
-
-Provides double-precision floating point helper functions.
-
-## Functions ##
-
-### SbDoubleAbsolute ###
-
-Returns the absolute value of the given double-precision floating-point number
-`d`, preserving `NaN` and infinity.
-
-`d`: The number to be adjusted.
-
-#### Declaration ####
-
-```
-double SbDoubleAbsolute(const double d)
-```
-
-### SbDoubleExponent ###
-
-Returns `base` taken to the power of `exponent`.
-
-`base`: The number to be adjusted. `exponent`: The power to which the `base`
-number should be raised.
-
-#### Declaration ####
-
-```
-double SbDoubleExponent(const double base, const double exponent)
-```
-
-### SbDoubleFloor ###
-
-Floors double-precision floating-point number `d` to the nearest integer.
-
-`d`: The number to be floored.
-
-#### Declaration ####
-
-```
-double SbDoubleFloor(const double d)
-```
-
-### SbDoubleIsFinite ###
-
-Determines whether double-precision floating-point number `d` represents a
-finite number.
-
-`d`: The number to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbDoubleIsFinite(const double d)
-```
-
-### SbDoubleIsNan ###
-
-Determines whether double-precision floating-point number `d` represents "Not a
-Number."
-
-`d`: The number to be evaluated.
-
-#### Declaration ####
-
-```
-bool SbDoubleIsNan(const double d)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/event.md b/src/cobalt/site/docs/reference/starboard/modules/10/event.md
deleted file mode 100644
index d25add0..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/event.md
+++ /dev/null
@@ -1,371 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: event.h"
----
-
-Defines the event system that wraps the Starboard main loop and entry point.
-The Starboard Application Lifecycle
-
-```
-    ---------- *
-   |           |
-   |        Preload
-   |           |
-   |           V
- Start   [ PRELOADING ] ------------
-   |           |                    |
-   |         Start                  |
-   |           |                    |
-   |           V                    |
-    ----> [ STARTED ] <----         |
-               |           |        |
-             Pause       Unpause    |
-               |           |     Suspend
-               V           |        |
-    -----> [ PAUSED ] -----         |
-   |           |                    |
-Resume      Suspend                 |
-   |           |                    |
-   |           V                    |
-    ---- [ SUSPENDED ] <------------
-               |
-              Stop
-               |
-               V
-          [ STOPPED ]
-
-```
-
-The first event that a Starboard application receives is either `Start`
-(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
-application in the `STARTED` state, whereas `Preload` puts the application in
-the `PRELOADING` state.
-
-`PRELOADING` can only happen as the first application state. In this state, the
-application should start and run as normal, but will not receive any input, and
-should not try to initialize graphics resources (via GL or `SbBlitter`). In
-`PRELOADING`, the application can receive `Start` or `Suspend` events. `Start`
-will receive the same data that was passed into `Preload`.
-
-In the `STARTED` state, the application is in the foreground and can expect to
-do all of the normal things it might want to do. Once in the `STARTED` state, it
-may receive a `Pause` event, putting the application into the `PAUSED` state.
-
-In the `PAUSED` state, the application is still visible, but has lost focus, or
-it is partially obscured by a modal dialog, or it is on its way to being shut
-down. The application should pause activity in this state. In this state, it can
-receive `Unpause` to be brought back to the foreground state (`STARTED`), or
-`Suspend` to be pushed further in the background to the `SUSPENDED` state.
-
-In the `SUSPENDED` state, the application is generally not visible. It should
-immediately release all graphics and video resources, and shut down all
-background activity (timers, rendering, etc). Additionally, the application
-should flush storage to ensure that if the application is killed, the storage
-will be up-to-date. The application may be killed at this point, but will
-ideally receive a `Stop` event for a more graceful shutdown.
-
-Note that the application is always expected to transition through `PAUSED` to
-`SUSPENDED` before receiving `Stop` or being killed.
-
-## Enums ##
-
-### SbEventType ###
-
-An enumeration of all possible event types dispatched directly by the system.
-Each event is accompanied by a void* data argument, and each event must define
-the type of the value pointed to by that data argument, if any.
-
-#### Values ####
-
-*   `kSbEventTypePreload`
-
-    Applications should perform initialization and prepare to react to
-    subsequent events, but must not initialize any graphics resources (through
-    GL or SbBlitter). The intent of this event is to allow the application to do
-    as much work as possible ahead of time, so that when the application is
-    first brought to the foreground, it's as fast as a resume.
-
-    The `kSbEventTypeStart` event may be sent at any time, regardless of
-    initialization state. Input events will not be sent in the `PRELOADING`
-    state. This event will only be sent once for a given process launch.
-    SbEventStartData is passed as the data argument.
-
-    The system may send `kSbEventTypeSuspend` in `PRELOADING` if it wants to
-    push the app into a lower resource consumption state. Applications can alo
-    call SbSystemRequestSuspend() when they are done preloading to request this.
-*   `kSbEventTypeStart`
-
-    The first event that an application receives on startup when starting
-    normally (i.e. not being preloaded). Applications should perform
-    initialization, start running, and prepare to react to subsequent events.
-    Applications that wish to run and then exit must call
-    `SbSystemRequestStop()` to terminate. This event will only be sent once for
-    a given process launch. `SbEventStartData` is passed as the data argument.
-    In case of preload, the `SbEventStartData` will be the same as what was
-    passed to `kSbEventTypePreload`.
-*   `kSbEventTypePause`
-
-    A dialog will be raised or the application will otherwise be put into a
-    background-but-visible or partially-obscured state (PAUSED). Graphics and
-    video resources will still be available, but the application should pause
-    foreground activity like animations and video playback. Can only be received
-    after a Start event. The only events that should be dispatched after a Pause
-    event are Unpause or Suspend. No data argument.
-*   `kSbEventTypeUnpause`
-
-    The application is returning to the foreground (STARTED) after having been
-    put in the PAUSED (e.g. partially-obscured) state. The application should
-    unpause foreground activity like animations and video playback. Can only be
-    received after a Pause or Resume event. No data argument.
-*   `kSbEventTypeSuspend`
-
-    The operating system will put the application into a Suspended state after
-    this event is handled. The application is expected to stop periodic
-    background work, release ALL graphics and video resources, and flush any
-    pending SbStorage writes. Some platforms will terminate the application if
-    work is done or resources are retained after suspension. Can only be
-    received after a Pause event. The only events that should be dispatched
-    after a Suspend event are Resume or Stop. On some platforms, the process may
-    also be killed after Suspend without a Stop event. No data argument.
-*   `kSbEventTypeResume`
-
-    The operating system has restored the application to the PAUSED state from
-    the SUSPENDED state. This is the first event the application will receive
-    coming out of SUSPENDED, and it will only be received after a Suspend event.
-    The application will now be in the PAUSED state. No data argument.
-*   `kSbEventTypeStop`
-
-    The operating system will shut the application down entirely after this
-    event is handled. Can only be recieved after a Suspend event, in the
-    SUSPENDED state. No data argument.
-*   `kSbEventTypeInput`
-
-    A user input event, including keyboard, mouse, gesture, or something else.
-    SbInputData (from input.h) is passed as the data argument.
-*   `kSbEventTypeUser`
-
-    A user change event, which means a new user signed-in or signed-out, or the
-    current user changed. No data argument, call SbUserGetSignedIn() and
-    SbUserGetCurrent() to get the latest changes.
-*   `kSbEventTypeLink`
-
-    A navigational link has come from the system, and the application should
-    consider handling it by navigating to the corresponding application
-    location. The data argument is an application-specific, null-terminated
-    string.
-*   `kSbEventTypeVerticalSync`
-
-    The beginning of a vertical sync has been detected. This event is very
-    timing-sensitive, so as little work as possible should be done on the main
-    thread if the application wants to receive this event in a timely manner. No
-    data argument.
-*   `kSbEventTypeNetworkDisconnect`
-
-    The platform has detected a network disconnection. The platform should make
-    a best effort to send an event of this type when the network disconnects,
-    but there are likely to be cases where the platform cannot detect the
-    disconnection (e.g. if the connection is via a powered hub which becomes
-    disconnected), so the current network state cannot always be inferred from
-    the sequence of Connect/Disconnect events.
-*   `kSbEventTypeNetworkConnect`
-
-    The platform has detected a network connection. This event may be sent at
-    application start-up, and should always be sent if the network reconnects
-    since a disconnection event was sent.
-*   `kSbEventTypeScheduled`
-
-    An event type reserved for scheduled callbacks. It will only be sent in
-    response to an application call to SbEventSchedule(), and it will call the
-    callback directly, so SbEventHandle should never receive this event
-    directly. The data type is an internally-defined structure.
-*   `kSbEventTypeAccessiblitySettingsChanged`
-
-    The platform's accessibility settings have changed. The application should
-    query the accessibility settings using the appropriate APIs to get the new
-    settings. Note this excludes captions settings changes, which causes
-    kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
-    version has kSbEventTypeAccessiblityTextToSpeechSettingsChanged, then that
-    event should be used to signal text-to-speech settings changes instead;
-    platforms using older starboard versions should use
-    kSbEventTypeAccessiblitySettingsChanged for text-to-speech settings changes.
-*   `kSbEventTypeLowMemory`
-
-    An optional event that platforms may send to indicate that the application
-    may soon be terminated (or crash) due to low memory availability. The
-    application may respond by reducing memory consumption by running a Garbage
-    Collection, flushing caches, or something similar. There is no requirement
-    to respond to or handle this event, it is only advisory.
-*   `kSbEventTypeWindowSizeChanged`
-
-    The size or position of a SbWindow has changed. The data is
-    SbEventWindowSizeChangedData .
-*   `kSbEventTypeOnScreenKeyboardShown`
-
-    The platform has shown the on screen keyboard. This event is triggered by
-    the system or by the application's OnScreenKeyboard show method. The event
-    has int data representing a ticket. The ticket is used by the application to
-    mark individual calls to the show method as successfully completed. Events
-    triggered by the application have tickets passed in via
-    SbWindowShowOnScreenKeyboard. System-triggered events have ticket value
-    kSbEventOnScreenKeyboardInvalidTicket.
-*   `kSbEventTypeOnScreenKeyboardHidden`
-
-    The platform has hidden the on screen keyboard. This event is triggered by
-    the system or by the application's OnScreenKeyboard hide method. The event
-    has int data representing a ticket. The ticket is used by the application to
-    mark individual calls to the hide method as successfully completed. Events
-    triggered by the application have tickets passed in via
-    SbWindowHideOnScreenKeyboard. System-triggered events have ticket value
-    kSbEventOnScreenKeyboardInvalidTicket.
-*   `kSbEventTypeOnScreenKeyboardFocused`
-
-    The platform has focused the on screen keyboard. This event is triggered by
-    the system or by the application's OnScreenKeyboard focus method. The event
-    has int data representing a ticket. The ticket is used by the application to
-    mark individual calls to the focus method as successfully completed. Events
-    triggered by the application have tickets passed in via
-    SbWindowFocusOnScreenKeyboard. System-triggered events have ticket value
-    kSbEventOnScreenKeyboardInvalidTicket.
-*   `kSbEventTypeOnScreenKeyboardBlurred`
-
-    The platform has blurred the on screen keyboard. This event is triggered by
-    the system or by the application's OnScreenKeyboard blur method. The event
-    has int data representing a ticket. The ticket is used by the application to
-    mark individual calls to the blur method as successfully completed. Events
-    triggered by the application have tickets passed in via
-    SbWindowBlurOnScreenKeyboard. System-triggered events have ticket value
-    kSbEventOnScreenKeyboardInvalidTicket.
-*   `kSbEventTypeAccessibilityCaptionSettingsChanged`
-
-    SB_HAS(ON_SCREEN_KEYBOARD) One or more of the fields returned by
-    SbAccessibilityGetCaptionSettings has changed.
-
-## Typedefs ##
-
-### SbEventCallback ###
-
-A function that can be called back from the main Starboard event pump.
-
-#### Definition ####
-
-```
-typedef void(* SbEventCallback) (void *context)
-```
-
-### SbEventDataDestructor ###
-
-A function that will cleanly destroy an event data instance of a specific type.
-
-#### Definition ####
-
-```
-typedef void(* SbEventDataDestructor) (void *data)
-```
-
-### SbEventId ###
-
-An ID that can be used to refer to a scheduled event.
-
-#### Definition ####
-
-```
-typedef uint32_t SbEventId
-```
-
-## Structs ##
-
-### SbEvent ###
-
-Structure representing a Starboard event and its data.
-
-#### Members ####
-
-*   `SbEventType type`
-*   `void * data`
-
-### SbEventStartData ###
-
-Event data for kSbEventTypeStart events.
-
-#### Members ####
-
-*   `char ** argument_values`
-
-    The command-line argument values (argv).
-*   `int argument_count`
-
-    The command-line argument count (argc).
-*   `const char * link`
-
-    The startup link, if any.
-
-### SbEventWindowSizeChangedData ###
-
-Event data for kSbEventTypeWindowSizeChanged events.
-
-#### Members ####
-
-*   `SbWindow window`
-*   `SbWindowSize size`
-
-## Functions ##
-
-### SbEventCancel ###
-
-Cancels the specified `event_id`. Note that this function is a no-op if the
-event already fired. This function can be safely called from any thread, but the
-only way to guarantee that the event does not run anyway is to call it from the
-main Starboard event loop thread.
-
-#### Declaration ####
-
-```
-void SbEventCancel(SbEventId event_id)
-```
-
-### SbEventHandle ###
-
-The entry point that Starboard applications MUST implement. Any memory pointed
-at by `event` or the `data` field inside `event` is owned by the system, and
-that memory is reclaimed after this function returns, so the implementation must
-copy this data to extend its life. This behavior should also be assumed of all
-fields within the `data` object, unless otherwise explicitly specified.
-
-This function is only called from the main Starboard thread. There is no
-specification about what other work might happen on this thread, so the
-application should generally do as little work as possible on this thread, and
-just dispatch it over to another thread.
-
-#### Declaration ####
-
-```
-SB_IMPORT void SbEventHandle(const SbEvent *event)
-```
-
-### SbEventIsIdValid ###
-
-Returns whether the given event handle is valid.
-
-#### Declaration ####
-
-```
-static bool SbEventIsIdValid(SbEventId handle)
-```
-
-### SbEventSchedule ###
-
-Schedules an event `callback` into the main Starboard event loop. This function
-may be called from any thread, but `callback` is always called from the main
-Starboard thread, queued with other pending events.
-
-`callback`: The callback function to be called. `context`: The context that is
-passed to the `callback` function. `delay`: The minimum number of microseconds
-to wait before calling the `callback` function. Set `delay` to `0` to call the
-callback as soon as possible.
-
-#### Declaration ####
-
-```
-SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/string.md b/src/cobalt/site/docs/reference/starboard/modules/10/string.md
deleted file mode 100644
index eece136..0000000
--- a/src/cobalt/site/docs/reference/starboard/modules/10/string.md
+++ /dev/null
@@ -1,510 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: string.h"
----
-
-Defines functions for interacting with c-style strings.
-
-## Functions ##
-
-### SbStringAToI ###
-
-Parses a string into a base-10 integer. This is a shorthand replacement for
-`atoi`.
-
-`value`: The string to be converted.
-
-#### Declaration ####
-
-```
-static int SbStringAToI(const char *value)
-```
-
-### SbStringAToL ###
-
-Parses a string into a base-10, long integer. This is a shorthand replacement
-for `atol`.
-
-`value`: The string to be converted. NOLINTNEXTLINE(runtime/int)
-
-#### Declaration ####
-
-```
-static long SbStringAToL(const char *value)
-```
-
-### SbStringCompare ###
-
-Compares the first `count` characters of two 8-bit character strings. The return
-value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `strncmp`.
-
-`string1`: The first 8-bit character string to compare. `string2`: The second
-8-bit character string to compare. `count`: The number of characters to compare.
-
-#### Declaration ####
-
-```
-int SbStringCompare(const char *string1, const char *string2, size_t count)
-```
-
-### SbStringCompareAll ###
-
-Compares two entire 8-bit character strings. The return value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `strcmp`.
-
-`string1`: The first 8-bit character string to compare. `string2`: The second
-8-bit character string to compare.
-
-#### Declaration ####
-
-```
-int SbStringCompareAll(const char *string1, const char *string2)
-```
-
-### SbStringCompareNoCase ###
-
-Compares two strings, ignoring differences in case. The return value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `strcasecmp`.
-
-`string1`: The first string to compare. `string2`: The second string to compare.
-
-#### Declaration ####
-
-```
-int SbStringCompareNoCase(const char *string1, const char *string2)
-```
-
-### SbStringCompareNoCaseN ###
-
-Compares the first `count` characters of two strings, ignoring differences in
-case. The return value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `strncasecmp`.
-
-`string1`: The first string to compare. `string2`: The second string to compare.
-`count`: The number of characters to compare.
-
-#### Declaration ####
-
-```
-int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
-```
-
-### SbStringCompareWide ###
-
-Compares the first `count` characters of two 16-bit character strings. The
-return value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `wcsncmp`.
-
-`string1`: The first 16-bit character string to compare.weird `string2`: The
-second 16-bit character string to compare. `count`: The number of characters to
-compare.
-
-#### Declaration ####
-
-```
-int SbStringCompareWide(const wchar_t *string1, const wchar_t *string2, size_t count)
-```
-
-### SbStringConcat ###
-
-Appends `source` to `out_destination` as long as `out_destination` has enough
-storage space to hold the concatenated string.
-
-This function is meant to be a drop-in replacement for `strlcat`. Also note that
-this function's signature is NOT compatible with `strncat`.
-
-`out_destination`: The string to which the `source` string is appended.
-`source`: The string to be appended to the destination string.
-`destination_size`: The amount of storage space available for the concatenated
-string.
-
-#### Declaration ####
-
-```
-int SbStringConcat(char *out_destination, const char *source, int destination_size)
-```
-
-### SbStringConcatUnsafe ###
-
-An inline wrapper for an unsafe SbStringConcat that assumes that the
-`out_destination` provides enough storage space for the concatenated string.
-Note that this function's signature is NOT compatible with `strcat`.
-
-`out_destination`: The string to which the `source` string is appended.
-`source`: The string to be appended to the destination string.
-
-#### Declaration ####
-
-```
-static int SbStringConcatUnsafe(char *out_destination, const char *source)
-```
-
-### SbStringConcatWide ###
-
-Identical to SbStringCat, but for wide characters.
-
-`out_destination`: The string to which the `source` string is appended.
-`source`: The string to be appended to the destination string.
-`destination_size`: The amount of storage space available for the concatenated
-string.
-
-#### Declaration ####
-
-```
-int SbStringConcatWide(wchar_t *out_destination, const wchar_t *source, int destination_size)
-```
-
-### SbStringCopy ###
-
-Copies as much of a `source` string as possible and null-terminates it, given
-that `destination_size` characters of storage are available. This function is
-meant to be a drop-in replacement for `strlcpy`.
-
-The return value specifies the length of `source`.
-
-`out_destination`: The location to which the string is copied. `source`: The
-string to be copied. `destination_size`: The amount of the source string to
-copy.
-
-#### Declaration ####
-
-```
-int SbStringCopy(char *out_destination, const char *source, int destination_size)
-```
-
-### SbStringCopyUnsafe ###
-
-An inline wrapper for an unsafe SbStringCopy that assumes that the destination
-provides enough storage space for the entire string. The return value is a
-pointer to the destination string. This function is meant to be a drop-in
-replacement for `strcpy`.
-
-`out_destination`: The location to which the string is copied. `source`: The
-string to be copied.
-
-#### Declaration ####
-
-```
-static char* SbStringCopyUnsafe(char *out_destination, const char *source)
-```
-
-### SbStringCopyWide ###
-
-Identical to SbStringCopy, but for wide characters.
-
-`out_destination`: The location to which the string is copied. `source`: The
-string to be copied. `destination_size`: The amount of the source string to
-copy.
-
-#### Declaration ####
-
-```
-int SbStringCopyWide(wchar_t *out_destination, const wchar_t *source, int destination_size)
-```
-
-### SbStringDuplicate ###
-
-Copies `source` into a buffer that is allocated by this function and that can be
-freed with SbMemoryDeallocate. This function is meant to be a drop-in
-replacement for `strdup`.
-
-`source`: The string to be copied.
-
-#### Declaration ####
-
-```
-char* SbStringDuplicate(const char *source)
-```
-
-### SbStringFindCharacter ###
-
-Finds the first occurrence of a `character` in `str`. The return value is a
-pointer to the found character in the given string or `NULL` if the character is
-not found. Note that this function's signature does NOT match that of the
-`strchr` function.
-
-`str`: The string to search for the character. `character`: The character to
-find in the string.
-
-#### Declaration ####
-
-```
-const char* SbStringFindCharacter(const char *str, char character)
-```
-
-### SbStringFindLastCharacter ###
-
-Finds the last occurrence of a specified character in a string. The return value
-is a pointer to the found character in the given string or `NULL` if the
-character is not found. Note that this function's signature does NOT match that
-of the `strrchr` function.
-
-`str`: The string to search for the character. `character`: The character to
-find in the string.
-
-#### Declaration ####
-
-```
-const char* SbStringFindLastCharacter(const char *str, char character)
-```
-
-### SbStringFindString ###
-
-Finds the first occurrence of `str2` in `str1`. The return value is a pointer to
-the beginning of the found string or `NULL` if the string is not found. This
-function is meant to be a drop-in replacement for `strstr`.
-
-`str1`: The string in which to search for the presence of `str2`. `str2`: The
-string to locate in `str1`.
-
-#### Declaration ####
-
-```
-const char* SbStringFindString(const char *str1, const char *str2)
-```
-
-### SbStringFormat ###
-
-Produces a string formatted with `format` and `arguments`, placing as much of
-the result that will fit into `out_buffer`. The return value specifies the
-number of characters that the format would produce if `buffer_size` were
-infinite.
-
-This function is meant to be a drop-in replacement for `vsnprintf`.
-
-`out_buffer`: The location where the formatted string is stored. `buffer_size`:
-The size of `out_buffer`. `format`: A string that specifies how the data should
-be formatted. `arguments`: Variable arguments used in the string.
-
-#### Declaration ####
-
-```
-int SbStringFormat(char *out_buffer, size_t buffer_size, const char *format, va_list arguments) SB_PRINTF_FORMAT(3
-```
-
-### SbStringFormatF ###
-
-An inline wrapper of SbStringFormat that converts from ellipsis to va_args. This
-function is meant to be a drop-in replacement for `snprintf`.
-
-`out_buffer`: The location where the formatted string is stored. `buffer_size`:
-The size of `out_buffer`. `format`: A string that specifies how the data should
-be formatted. `...`: Arguments used in the string.
-
-#### Declaration ####
-
-```
-int static int static int SbStringFormatF(char *out_buffer, size_t buffer_size, const char *format,...) SB_PRINTF_FORMAT(3
-```
-
-### SbStringFormatUnsafeF ###
-
-An inline wrapper of SbStringFormat that is meant to be a drop-in replacement
-for the unsafe but commonly used `sprintf`.
-
-`out_buffer`: The location where the formatted string is stored. `format`: A
-string that specifies how the data should be formatted. `...`: Arguments used in
-the string.
-
-#### Declaration ####
-
-```
-static int static int SbStringFormatUnsafeF(char *out_buffer, const char *format,...) SB_PRINTF_FORMAT(2
-```
-
-### SbStringFormatWide ###
-
-This function is identical to SbStringFormat, but is for wide characters. It is
-meant to be a drop-in replacement for `vswprintf`.
-
-`out_buffer`: The location where the formatted string is stored. `buffer_size`:
-The size of `out_buffer`. `format`: A string that specifies how the data should
-be formatted. `arguments`: Variable arguments used in the string.
-
-#### Declaration ####
-
-```
-int SbStringFormatWide(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format, va_list arguments)
-```
-
-### SbStringFormatWideF ###
-
-An inline wrapper of SbStringFormatWide that converts from ellipsis to
-`va_args`.
-
-`out_buffer`: The location where the formatted string is stored. `buffer_size`:
-The size of `out_buffer`. `format`: A string that specifies how the data should
-be formatted. `...`: Arguments used in the string.
-
-#### Declaration ####
-
-```
-static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
-```
-
-### SbStringGetLength ###
-
-Returns the length, in characters, of `str`.
-
-`str`: A zero-terminated ASCII string.
-
-#### Declaration ####
-
-```
-size_t SbStringGetLength(const char *str)
-```
-
-### SbStringGetLengthWide ###
-
-Returns the length of a wide character string. (This function is the same as
-SbStringGetLength, but for a string comprised of wide characters.) This function
-assumes that there are no multi-element characters.
-
-`str`: A zero-terminated ASCII string.
-
-#### Declaration ####
-
-```
-size_t SbStringGetLengthWide(const wchar_t *str)
-```
-
-### SbStringParseDouble ###
-
-Extracts a string that represents an integer from the beginning of `start` into
-a double.
-
-This function is meant to be a drop-in replacement for `strtod`, except that it
-is explicitly declared to return a double.
-
-`start`: The string that begins with the number to be converted. `out_end`: If
-provided, the function places a pointer to the end of the consumed portion of
-the string into `out_end`.
-
-#### Declaration ####
-
-```
-double SbStringParseDouble(const char *start, char **out_end)
-```
-
-### SbStringParseSignedInteger ###
-
-Extracts a string that represents an integer from the beginning of `start` into
-a signed integer in the given `base`. This function is meant to be a drop-in
-replacement for `strtol`.
-
-`start`: The string that begins with the number to be converted. `out_end`: If
-provided, the function places a pointer to the end of the consumed portion of
-the string into `out_end`. `base`: The base into which the number will be
-converted. The value must be between `2` and `36`, inclusive.
-NOLINTNEXTLINE(runtime/int)
-
-#### Declaration ####
-
-```
-long SbStringParseSignedInteger(const char *start, char **out_end, int base)
-```
-
-### SbStringParseUInt64 ###
-
-Extracts a string that represents an integer from the beginning of `start` into
-an unsigned 64-bit integer in the given `base`.
-
-This function is meant to be a drop-in replacement for `strtoull`, except that
-it is explicitly declared to return `uint64_t`.
-
-`start`: The string that begins with the number to be converted. `out_end`: If
-provided, the function places a pointer to the end of the consumed portion of
-the string into `out_end`. `base`: The base into which the number will be
-converted. The value must be between `2` and `36`, inclusive.
-
-#### Declaration ####
-
-```
-uint64_t SbStringParseUInt64(const char *start, char **out_end, int base)
-```
-
-### SbStringParseUnsignedInteger ###
-
-Extracts a string that represents an integer from the beginning of `start` into
-an unsigned integer in the given `base`. This function is meant to be a drop-in
-replacement for `strtoul`.
-
-`start`: The string that begins with the number to be converted. `out_end`: If
-provided, the function places a pointer to the end of the consumed portion of
-the string into `out_end`. `base`: The base into which the number will be
-converted. The value must be between `2` and `36`, inclusive.
-NOLINTNEXTLINE(runtime/int)
-
-#### Declaration ####
-
-```
-unsigned long SbStringParseUnsignedInteger(const char *start, char **out_end, int base)
-```
-
-### SbStringScan ###
-
-Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
-return value specifies the number of successfully matched items, which may be
-`0`.
-
-This function is meant to be a drop-in replacement for `vsscanf`.
-
-`buffer`: The string to scan for the pattern. `pattern`: The string to search
-for in `buffer`. `arguments`: Values matching `pattern` that were extracted from
-`buffer`.
-
-#### Declaration ####
-
-```
-int SbStringScan(const char *buffer, const char *pattern, va_list arguments)
-```
-
-### SbStringScanF ###
-
-An inline wrapper of SbStringScan that converts from ellipsis to `va_args`. This
-function is meant to be a drop-in replacement for `sscanf`. `buffer`: The string
-to scan for the pattern. `pattern`: The string to search for in `buffer`. `...`:
-Values matching `pattern` that were extracted from `buffer`.
-
-#### Declaration ####
-
-```
-static int SbStringScanF(const char *buffer, const char *pattern,...)
-```
-
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/accessibility.md b/src/cobalt/site/docs/reference/starboard/modules/11/accessibility.md
index 1a5adcb..a6c8460 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/accessibility.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/accessibility.md
@@ -251,3 +251,4 @@
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md b/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md
index 45d0469..000ddf3 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/audio_sink.md
@@ -27,7 +27,7 @@
 ### SbAudioSinkConsumeFramesFunc ###
 
 Callback used to report frames consumed. The consumed frames will be removed
-from the source frame buffer to free space for new audio frames. When
+from the source frame buffer to free space for new audio frames.When
 `frames_consumed` is updated asynchnously and the last time that it has been
 updated is known, it can be passed in `frames_consumed_at` so the audio time
 calculating can be more accurate.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md b/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md
index b35275f..f7d2a6c 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/blitter.md
@@ -12,7 +12,8 @@
 acceleration, if it is available. Draw commands exist for solid-color rectangles
 and rasterization/blitting of rectangular images onto rectangular target
 patches.
-Threading Concerns
+
+## Threading Concerns ##
 
 Note that in general the Blitter API is not thread safe, except for all
 `SbBlitterDevice`-related functions. All functions that are not required to
@@ -23,14 +24,15 @@
 threads, but manual synchronization must be performed in order to ensure their
 parameters are not referenced at the same time on another thread by another
 function.
-Examples
+
+### Examples ###
 
 *   Multiple threads should not issue commands to the same `SbBlitterContext`
     object unless they are manually synchronized.
 
 *   Multiple threads should not issue draw calls to the same render target, even
     if the draw calls are made within separate contexts. In this case, be sure
-    to manually synchronize through the use of syncrhonization primitives and
+    to manually synchronize through the use of synchronization primitives and
     use of the `SbBlitterFlushContext()` command.
 
 *   Multiple threads can operate on the swap chain, but they must perform manual
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
index 787109b..f632f55 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
@@ -22,7 +22,7 @@
 
 ### SB_ALIGNOF(type) ###
 
-Returns the alignment reqiured for any instance of the type indicated by `type`.
+Returns the alignment required for any instance of the type indicated by `type`.
 
 ### SB_ARRAY_SIZE(array) ###
 
@@ -147,21 +147,14 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RELEASE_CANDIDATE_API_VERSION ###
-
-The next API version to be frozen, but is still subject to emergency changes. It
-is reasonable to base a port on the Release Candidate API version, but be aware
-that small incompatible changes may still be made to it. The following will be
-uncommented when an API version is a release candidate.
-
 ### SB_RESTRICT ###
 
 Include the platform-specific configuration. This macro is set by GYP in
 starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations. After version 12, we start to use runtime constants instead
+all configurations.After version 12, we start to use runtime constants instead
 of macros for certain platform dependent configurations. This file substitutes
 configuration macros for the corresponding runtime constants so we don't
-reference these constants when they aren't defined. Makes a pointer-typed
+reference these constants when they aren't defined.Makes a pointer-typed
 parameter restricted so that the compiler can make certain optimizations because
 it knows the pointers are unique.
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md b/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md
index 7847ee2..d1f8a7e 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/cpu_features.md
@@ -95,7 +95,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    Arm 64 feature flags
+    ###### Arm 64 feature flags  ######
 
     AES instructions.
 *   `bool has_crc32`
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md b/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md
index 0b9442b..89730d7 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/cryptography.md
@@ -7,7 +7,8 @@
 when there are **hardware-accelerated** hardware-accelerated cryptography
 facilities. Applications must fall back to platform-independent CPU-based
 algorithms if the cipher algorithm isn't supported in hardware.
-Tips for Porters
+
+## Tips for Porters ##
 
 You should implement cipher algorithms in this descending order of priority to
 maximize usage for SSL.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md b/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md
index 03ddbb9..2899dba 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/decode_target.md
@@ -12,7 +12,8 @@
 data. This allows the application to allocate fast graphics memory, and have
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
-SbDecodeTargetFormat
+
+## SbDecodeTargetFormat ##
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -20,7 +21,8 @@
 the SbDecodeTargetFormat passed into it, or the decode will produce an error.
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
-SbDecodeTargetGraphicsContextProvider
+
+## SbDecodeTargetGraphicsContextProvider ##
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -34,7 +36,8 @@
 
 The primary usage is likely to be the the SbPlayer implementation on some
 platforms.
-SbDecodeTarget Example
+
+## SbDecodeTarget Example ##
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -71,11 +74,10 @@
 
 // If the decode works, you can get the texture out and render it.
 SbDecodeTargetInfo info;
-SbMemorySet(&info, 0, sizeof(info));
+memset(&info, 0, sizeof(info));
 SbDecodeTargetGetInfo(target, &info);
 GLuint texture =
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
-
 ```
 
 ## Macros ##
@@ -118,8 +120,8 @@
     order.
 *   `kSbDecodeTargetFormat1PlaneUYVY`
 
-    A decoder target format consisting of a single plane with pixels layed out
-    in the format UYVY. Since there are two Y values per sample, but only one U
+    A decoder target format consisting of a single plane with pixels laid out in
+    the format UYVY. Since there are two Y values per sample, but only one U
     value and only one V value, horizontally the Y resolution is twice the size
     of both the U and V resolutions. Vertically, they Y, U and V all have the
     same resolution. This is a YUV 422 format. When using this format with GL
@@ -399,3 +401,4 @@
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/drm.md b/src/cobalt/site/docs/reference/starboard/modules/11/drm.md
index 9e40e05..23810d1 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/drm.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/drm.md
@@ -149,7 +149,7 @@
 
 ### SbDrmSystem ###
 
-A handle to a DRM system which can be used with either an SbDecoder or a
+A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
 #### Definition ####
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/egl.md b/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
index 6990f44..b1e120b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
@@ -10,7 +10,8 @@
 This API is designed to abstract the differences between EGL implementations and
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
-EGL Version
+
+## EGL Version ##
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
@@ -72,163 +73,75 @@
 
 #### Members ####
 
-*   ` eglChooseConfig`
-
-    SbEglBoolean (\*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32\*
-    attrib_list, SbEglConfig\* configs, SbEglInt32 config_size, SbEglInt32\*
-    num_config);
-*   ` eglCopyBuffers`
-
-    SbEglBoolean (\*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglNativePixmapType target);
-*   ` eglCreateContext`
-
-    SbEglContext (\*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
-    SbEglContext share_context, const SbEglInt32\* attrib_list);
-*   ` eglCreatePbufferSurface`
-
-    SbEglSurface (\*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
-    config, const SbEglInt32\* attrib_list);
-*   ` eglCreatePixmapSurface`
-
-    SbEglSurface (\*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig
-    config, SbEglNativePixmapType pixmap, const SbEglInt32\* attrib_list);
-*   ` eglCreateWindowSurface`
-
-    SbEglSurface (\*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig
-    config, SbEglNativeWindowType win, const SbEglInt32\* attrib_list);
-*   ` eglDestroyContext`
-
-    SbEglBoolean (\*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx);
-*   ` eglDestroySurface`
-
-    SbEglBoolean (\*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface);
-*   ` eglGetConfigAttrib`
-
-    SbEglBoolean (\*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglGetConfigs`
-
-    SbEglBoolean (\*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig\* configs,
-    SbEglInt32 config_size, SbEglInt32\* num_config);
-*   ` eglGetCurrentDisplay`
-
-    SbEglDisplay (\*eglGetCurrentDisplay)(void);
-*   ` eglGetCurrentSurface`
-
-    SbEglSurface (\*eglGetCurrentSurface)(SbEglInt32 readdraw);
-*   ` eglGetDisplay`
-
-    SbEglDisplay (\*eglGetDisplay)(SbEglNativeDisplayType display_id);
-*   ` eglGetError`
-
-    SbEglInt32 (\*eglGetError)(void);
-*   ` eglGetProcAddress`
-
-    SbEglCastsToProperFunctionPointerType (\*eglGetProcAddress)(const char\*
-    procname);
-*   ` eglInitialize`
-
-    SbEglBoolean (\*eglInitialize)(SbEglDisplay dpy, SbEglInt32\* major,
-    SbEglInt32\* minor);
-*   ` eglMakeCurrent`
-
-    SbEglBoolean (\*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
-    SbEglSurface read, SbEglContext ctx);
-*   ` eglQueryContext`
-
-    SbEglBoolean (\*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglQueryString`
-
-    const char\* (\*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name);
-*   ` eglQuerySurface`
-
-    SbEglBoolean (\*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglSwapBuffers`
-
-    SbEglBoolean (\*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface);
-*   ` eglTerminate`
-
-    SbEglBoolean (\*eglTerminate)(SbEglDisplay dpy);
-*   ` eglWaitGL`
-
-    SbEglBoolean (\*eglWaitGL)(void);
-*   ` eglWaitNative`
-
-    SbEglBoolean (\*eglWaitNative)(SbEglInt32 engine);
-*   ` eglBindTexImage`
-
-    SbEglBoolean (\*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 buffer);
-*   ` eglReleaseTexImage`
-
-    SbEglBoolean (\*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 buffer);
-*   ` eglSurfaceAttrib`
-
-    SbEglBoolean (\*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 attribute, SbEglInt32 value);
-*   ` eglSwapInterval`
-
-    SbEglBoolean (\*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval);
-*   ` eglBindAPI`
-
-    SbEglBoolean (\*eglBindAPI)(SbEglEnum api);
-*   ` eglQueryAPI`
-
-    SbEglEnum (\*eglQueryAPI)(void);
-*   ` eglCreatePbufferFromClientBuffer`
-
-    SbEglSurface (\*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy,
-    SbEglEnum buftype, SbEglClientBuffer buffer, SbEglConfig config, const
-    SbEglInt32\* attrib_list);
-*   ` eglReleaseThread`
-
-    SbEglBoolean (\*eglReleaseThread)(void);
-*   ` eglWaitClient`
-
-    SbEglBoolean (\*eglWaitClient)(void);
-*   ` eglGetCurrentContext`
-
-    SbEglContext (\*eglGetCurrentContext)(void);
-*   ` eglCreateSync`
-
-    SbEglSync (\*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
-    SbEglAttrib\* attrib_list);
-*   ` eglDestroySync`
-
-    SbEglBoolean (\*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync);
-*   ` eglClientWaitSync`
-
-    SbEglInt32 (\*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync,
-    SbEglInt32 flags, SbEglTime timeout);
-*   ` eglGetSyncAttrib`
-
-    SbEglBoolean (\*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
-    SbEglInt32 attribute, SbEglAttrib\* value);
-*   ` eglCreateImage`
-
-    SbEglImage (\*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
-    target, SbEglClientBuffer buffer, const SbEglAttrib\* attrib_list);
-*   ` eglDestroyImage`
-
-    SbEglBoolean (\*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image);
-*   ` eglGetPlatformDisplay`
-
-    SbEglDisplay (\*eglGetPlatformDisplay)(SbEglEnum platform, void\*
-    native_display, const SbEglAttrib\* attrib_list);
-*   ` eglCreatePlatformWindowSurface`
-
-    SbEglSurface (\*eglCreatePlatformWindowSurface)(SbEglDisplay dpy,
-    SbEglConfig config, void\* native_window, const SbEglAttrib\* attrib_list);
-*   ` eglCreatePlatformPixmapSurface`
-
-    SbEglSurface (\*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy,
-    SbEglConfig config, void\* native_pixmap, const SbEglAttrib\* attrib_list);
-*   ` eglWaitSync`
-
-    SbEglBoolean (\*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
-    flags);
+*   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
+    *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
+    *num_config)`
+*   `SbEglBoolean(*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target)`
+*   `SbEglContext(*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativePixmapType pixmap, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativeWindowType win, const SbEglInt32 *attrib_list)`
+*   `SbEglBoolean(*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx)`
+*   `SbEglBoolean(*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig *configs,
+    SbEglInt32 config_size, SbEglInt32 *num_config)`
+*   `SbEglDisplay(*eglGetCurrentDisplay)(void)`
+*   `SbEglSurface(*eglGetCurrentSurface)(SbEglInt32 readdraw)`
+*   `SbEglDisplay(*eglGetDisplay)(SbEglNativeDisplayType display_id)`
+*   `SbEglInt32(*eglGetError)(void)`
+*   `SbEglCastsToProperFunctionPointerType(*eglGetProcAddress)(const char
+    *procname)`
+*   `SbEglBoolean(*eglInitialize)(SbEglDisplay dpy, SbEglInt32 *major,
+    SbEglInt32 *minor)`
+*   `SbEglBoolean(*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx)`
+*   `SbEglBoolean(*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `const char *(*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name)`
+*   `SbEglBoolean(*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglTerminate)(SbEglDisplay dpy)`
+*   `SbEglBoolean(*eglWaitGL)(void)`
+*   `SbEglBoolean(*eglWaitNative)(SbEglInt32 engine)`
+*   `SbEglBoolean(*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value)`
+*   `SbEglBoolean(*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval)`
+*   `SbEglBoolean(*eglBindAPI)(SbEglEnum api)`
+*   `SbEglEnum(*eglQueryAPI)(void)`
+*   `SbEglSurface(*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy, SbEglEnum
+    buftype, SbEglClientBuffer buffer, SbEglConfig config, const SbEglInt32
+    *attrib_list)`
+*   `SbEglBoolean(*eglReleaseThread)(void)`
+*   `SbEglBoolean(*eglWaitClient)(void)`
+*   `SbEglContext(*eglGetCurrentContext)(void)`
+*   `SbEglSync(*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync)`
+*   `SbEglInt32(*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags, SbEglTime timeout)`
+*   `SbEglBoolean(*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib *value)`
+*   `SbEglImage(*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image)`
+*   `SbEglDisplay(*eglGetPlatformDisplay)(SbEglEnum platform, void
+    *native_display, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_window, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_pixmap, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags)`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/event.md b/src/cobalt/site/docs/reference/starboard/modules/11/event.md
index 2d0f9cc..bdf9d3a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/event.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/event.md
@@ -3,8 +3,92 @@
 title: "Starboard Module Reference: event.h"
 ---
 
+For SB_API_VERSION >= 13
+
+Module Overview: Starboard Event module
+
 Defines the event system that wraps the Starboard main loop and entry point.
-The Starboard Application Lifecycle
+
+## The Starboard Application Lifecycle ##
+
+```
+               * ----------
+               |           |
+             Start         |
+               |           |
+               V           |
+         [===========]     |
+    ---> [  STARTED  ]     |
+   |     [===========]     |
+   |           |           |
+ Focus       Blur      Preload
+   |           |           |
+   |           V           |
+    ---- [===========]     |
+    ---> [  BLURRED  ]     |
+   |     [===========]     |
+   |           |           |
+ Reveal     Conceal        |
+   |           |           |
+   |           V           |
+   |     [===========]     |
+    ---- [ CONCEALED ] <---
+    ---> [===========]
+   |           |
+Unfreeze     Freeze
+   |           |
+   |           V
+   |     [===========]
+    ---- [  FROZEN   ]
+         [===========]
+               |
+              Stop
+               |
+               V
+         [===========]
+         [  STOPPED  ]
+         [===========]
+
+```
+
+The first event that a Starboard application receives is either `Start`
+(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
+application in the `STARTED` state, whereas `Preload` puts the application in
+the `CONCEALED` state.
+
+In the `STARTED` state, the application is in the foreground and can expect to
+do all of the normal things it might want to do. Once in the `STARTED` state, it
+may receive a `Blur` event, putting the application into the `BLURRED` state.
+
+In the `BLURRED` state, the application is still visible, but has lost focus, or
+it is partially obscured by a modal dialog, or it is on its way to being shut
+down. The application should blur activity in this state. In this state, it can
+receive `Focus` to be brought back to the foreground state (`STARTED`), or
+`Conceal` to be pushed to the `CONCEALED` state.
+
+In the `CONCEALED` state, the application should behave as it should for an
+invisible program that can still run, and that can optionally access the network
+and playback audio, albeit potentially will have less CPU and memory available.
+The application may get switched from `CONCEALED` to `FROZEN` at any time, when
+the platform decides to do so.
+
+In the `FROZEN` state, the application is not visible. It should immediately
+release all graphics and video resources, and shut down all background activity
+(timers, rendering, etc). Additionally, the application should flush storage to
+ensure that if the application is killed, the storage will be up-to-date. The
+application may be killed at this point, but will ideally receive a `Stop` event
+for a more graceful shutdown.
+
+Note that the application is always expected to transition through `BLURRED`,
+`CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
+
+For SB_API_VERSION < 13
+
+Module Overview: Starboard Event module
+
+Defines the event system that wraps the Starboard main loop and entry point.
+
+## The Starboard Application Lifecycle ##
 
 ```
     ---------- *
@@ -91,7 +175,7 @@
     SbEventStartData is passed as the data argument.
 
     The system may send `kSbEventTypeSuspend` in `PRELOADING` if it wants to
-    push the app into a lower resource consumption state. Applications can alo
+    push the app into a lower resource consumption state. Applications can also
     call SbSystemRequestSuspend() when they are done preloading to request this.
 *   `kSbEventTypeStart`
 
@@ -136,7 +220,7 @@
 *   `kSbEventTypeStop`
 
     The operating system will shut the application down entirely after this
-    event is handled. Can only be recieved after a Suspend event, in the
+    event is handled. Can only be received after a Suspend event, in the
     SUSPENDED state. No data argument.
 *   `kSbEventTypeInput`
 
@@ -171,10 +255,11 @@
     query the accessibility settings using the appropriate APIs to get the new
     settings. Note this excludes captions settings changes, which causes
     kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
-    version has kSbEventTypeAccessiblityTextToSpeechSettingsChanged, then that
-    event should be used to signal text-to-speech settings changes instead;
+    version has kSbEventTypeAccessib(i)lityTextToSpeechSettingsChanged, then
+    that event should be used to signal text-to-speech settings changes instead;
     platforms using older starboard versions should use
-    kSbEventTypeAccessiblitySettingsChanged for text-to-speech settings changes.
+    kSbEventTypeAccessib(i)litySettingsChanged for text-to-speech settings
+    changes.
 *   `kSbEventTypeLowMemory`
 
     An optional event that platforms may send to indicate that the application
@@ -234,7 +319,7 @@
     ticket value kSbEventOnScreenKeyboardInvalidTicket.
 *   `kSbEventTypeAccessibilityCaptionSettingsChanged`
 
-    SB_HAS(ON_SCREEN_KEYBOARD) One or more of the fields returned by
+    SB_HAS(ON_SCREEN_KEYBOARD)One or more of the fields returned by
     SbAccessibilityGetCaptionSettings has changed.
 
 ## Typedefs ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/gles.md b/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
index 20c5924..7a9108a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
@@ -10,7 +10,8 @@
 This API is designed to abstract the differences between GLES implementations
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
-GLES Version
+
+## GLES Version ##
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
@@ -60,895 +61,402 @@
 
 #### Members ####
 
-*   ` glActiveTexture`
+*   `void(*glActiveTexture)(SbGlEnum texture)`
 
-    void (\*glActiveTexture)(SbGlEnum texture);
-*   ` glAttachShader`
-
-    void (\*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader);
-*   ` glBindAttribLocation`
-
-    void (\*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
-    SbGlChar\* name);
-*   ` glBindBuffer`
-
-    void (\*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer);
-*   ` glBindFramebuffer`
-
-    void (\*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer);
-*   ` glBindRenderbuffer`
-
-    void (\*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer);
-*   ` glBindTexture`
-
-    void (\*glBindTexture)(SbGlEnum target, SbGlUInt32 texture);
-*   ` glBlendColor`
-
-    void (\*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
-    SbGlFloat alpha);
-*   ` glBlendEquation`
-
-    void (\*glBlendEquation)(SbGlEnum mode);
-*   ` glBlendEquationSeparate`
-
-    void (\*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha);
-*   ` glBlendFunc`
-
-    void (\*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor);
-*   ` glBlendFuncSeparate`
-
-    void (\*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
-    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha);
-*   ` glBufferData`
-
-    void (\*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void\* data,
-    SbGlEnum usage);
-*   ` glBufferSubData`
-
-    void (\*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
-    size, const void\* data);
-*   ` glCheckFramebufferStatus`
-
-    SbGlEnum (\*glCheckFramebufferStatus)(SbGlEnum target);
-*   ` glClear`
-
-    void (\*glClear)(SbGlBitfield mask);
-*   ` glClearColor`
-
-    void (\*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
-    SbGlFloat alpha);
-*   ` glClearDepthf`
-
-    void (\*glClearDepthf)(SbGlFloat d);
-*   ` glClearStencil`
-
-    void (\*glClearStencil)(SbGlInt32 s);
-*   ` glColorMask`
-
-    void (\*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
-    SbGlBoolean alpha);
-*   ` glCompileShader`
-
-    void (\*glCompileShader)(SbGlUInt32 shader);
-*   ` glCompressedTexImage2D`
-
-    void (\*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+    .
+*   `void(*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar *name)`
+*   `void(*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer)`
+*   `void(*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer)`
+*   `void(*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer)`
+*   `void(*glBindTexture)(SbGlEnum target, SbGlUInt32 texture)`
+*   `void(*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glBlendEquation)(SbGlEnum mode)`
+*   `void(*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha)`
+*   `void(*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor)`
+*   `void(*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha)`
+*   `void(*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void *data,
+    SbGlEnum usage)`
+*   `void(*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void *data)`
+*   `SbGlEnum(*glCheckFramebufferStatus)(SbGlEnum target)`
+*   `void(*glClear)(SbGlBitfield mask)`
+*   `void(*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glClearDepthf)(SbGlFloat d)`
+*   `void(*glClearStencil)(SbGlInt32 s)`
+*   `void(*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha)`
+*   `void(*glCompileShader)(SbGlUInt32 shader)`
+*   `void(*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
-    SbGlSizei imageSize, const void\* data);
-*   ` glCompressedTexSubImage2D`
-
-    void (\*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
     SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
-    SbGlEnum format, SbGlSizei imageSize, const void\* data);
-*   ` glCopyTexImage2D`
-
-    void (\*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    SbGlEnum format, SbGlSizei imageSize, const void *data)`
+*   `void(*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
-    SbGlInt32 border);
-*   ` glCopyTexSubImage2D`
-
-    void (\*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlInt32 border)`
+*   `void(*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
-    SbGlSizei height);
-*   ` glCreateProgram`
-
-    SbGlUInt32 (\*glCreateProgram)(void);
-*   ` glCreateShader`
-
-    SbGlUInt32 (\*glCreateShader)(SbGlEnum type);
-*   ` glCullFace`
-
-    void (\*glCullFace)(SbGlEnum mode);
-*   ` glDeleteBuffers`
-
-    void (\*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32\* buffers);
-*   ` glDeleteFramebuffers`
-
-    void (\*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32\* framebuffers);
-*   ` glDeleteProgram`
-
-    void (\*glDeleteProgram)(SbGlUInt32 program);
-*   ` glDeleteRenderbuffers`
-
-    void (\*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32\*
-    renderbuffers);
-*   ` glDeleteShader`
-
-    void (\*glDeleteShader)(SbGlUInt32 shader);
-*   ` glDeleteTextures`
-
-    void (\*glDeleteTextures)(SbGlSizei n, const SbGlUInt32\* textures);
-*   ` glDepthFunc`
-
-    void (\*glDepthFunc)(SbGlEnum func);
-*   ` glDepthMask`
-
-    void (\*glDepthMask)(SbGlBoolean flag);
-*   ` glDepthRangef`
-
-    void (\*glDepthRangef)(SbGlFloat n, SbGlFloat f);
-*   ` glDetachShader`
-
-    void (\*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader);
-*   ` glDisable`
-
-    void (\*glDisable)(SbGlEnum cap);
-*   ` glDisableVertexAttribArray`
-
-    void (\*glDisableVertexAttribArray)(SbGlUInt32 index);
-*   ` glDrawArrays`
-
-    void (\*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count);
-*   ` glDrawElements`
-
-    void (\*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
-    void\* indices);
-*   ` glEnable`
-
-    void (\*glEnable)(SbGlEnum cap);
-*   ` glEnableVertexAttribArray`
-
-    void (\*glEnableVertexAttribArray)(SbGlUInt32 index);
-*   ` glFinish`
-
-    void (\*glFinish)(void);
-*   ` glFlush`
-
-    void (\*glFlush)(void);
-*   ` glFramebufferRenderbuffer`
-
-    void (\*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
-    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer);
-*   ` glFramebufferTexture2D`
-
-    void (\*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
-    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level);
-*   ` glFrontFace`
-
-    void (\*glFrontFace)(SbGlEnum mode);
-*   ` glGenBuffers`
-
-    void (\*glGenBuffers)(SbGlSizei n, SbGlUInt32\* buffers);
-*   ` glGenerateMipmap`
-
-    void (\*glGenerateMipmap)(SbGlEnum target);
-*   ` glGenFramebuffers`
-
-    void (\*glGenFramebuffers)(SbGlSizei n, SbGlUInt32\* framebuffers);
-*   ` glGenRenderbuffers`
-
-    void (\*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32\* renderbuffers);
-*   ` glGenTextures`
-
-    void (\*glGenTextures)(SbGlSizei n, SbGlUInt32\* textures);
-*   ` glGetActiveAttrib`
-
-    void (\*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
-    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
-    name);
-*   ` glGetActiveUniform`
-
-    void (\*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
-    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
-    name);
-*   ` glGetAttachedShaders`
-
-    void (\*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
-    SbGlSizei\* count, SbGlUInt32\* shaders);
-*   ` glGetAttribLocation`
-
-    SbGlInt32 (\*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glGetBooleanv`
-
-    void (\*glGetBooleanv)(SbGlEnum pname, SbGlBoolean\* data);
-*   ` glGetBufferParameteriv`
-
-    void (\*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetError`
-
-    SbGlEnum (\*glGetError)(void);
-*   ` glGetFloatv`
-
-    void (\*glGetFloatv)(SbGlEnum pname, SbGlFloat\* data);
-*   ` glGetFramebufferAttachmentParameteriv`
-
-    void (\*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
-    attachment, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetIntegerv`
-
-    void (\*glGetIntegerv)(SbGlEnum pname, SbGlInt32\* data);
-*   ` glGetProgramiv`
-
-    void (\*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetProgramInfoLog`
-
-    void (\*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlChar\* infoLog);
-*   ` glGetRenderbufferParameteriv`
-
-    void (\*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
-    SbGlInt32\* params);
-*   ` glGetShaderiv`
-
-    void (\*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetShaderInfoLog`
-
-    void (\*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlChar\* infoLog);
-*   ` glGetShaderPrecisionFormat`
-
-    void (\*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
-    precisiontype, SbGlInt32\* range, SbGlInt32\* precision);
-*   ` glGetShaderSource`
-
-    void (\*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei\*
-    length, SbGlChar\* source);
-*   ` glGetString`
-
-    const SbGlUInt8\* (\*glGetString)(SbGlEnum name);
-*   ` glGetTexParameterfv`
-
-    void (\*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat\*
-    params);
-*   ` glGetTexParameteriv`
-
-    void (\*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetUniformfv`
-
-    void (\*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat\*
-    params);
-*   ` glGetUniformiv`
-
-    void (\*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32\*
-    params);
-*   ` glGetUniformLocation`
-
-    SbGlInt32 (\*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glGetVertexAttribfv`
-
-    void (\*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat\*
-    params);
-*   ` glGetVertexAttribiv`
-
-    void (\*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetVertexAttribPointerv`
-
-    void (\*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname,
-    void\*\* pointer);
-*   ` glHint`
-
-    void (\*glHint)(SbGlEnum target, SbGlEnum mode);
-*   ` glIsBuffer`
-
-    SbGlBoolean (\*glIsBuffer)(SbGlUInt32 buffer);
-*   ` glIsEnabled`
-
-    SbGlBoolean (\*glIsEnabled)(SbGlEnum cap);
-*   ` glIsFramebuffer`
-
-    SbGlBoolean (\*glIsFramebuffer)(SbGlUInt32 framebuffer);
-*   ` glIsProgram`
-
-    SbGlBoolean (\*glIsProgram)(SbGlUInt32 program);
-*   ` glIsRenderbuffer`
-
-    SbGlBoolean (\*glIsRenderbuffer)(SbGlUInt32 renderbuffer);
-*   ` glIsShader`
-
-    SbGlBoolean (\*glIsShader)(SbGlUInt32 shader);
-*   ` glIsTexture`
-
-    SbGlBoolean (\*glIsTexture)(SbGlUInt32 texture);
-*   ` glLineWidth`
-
-    void (\*glLineWidth)(SbGlFloat width);
-*   ` glLinkProgram`
-
-    void (\*glLinkProgram)(SbGlUInt32 program);
-*   ` glPixelStorei`
-
-    void (\*glPixelStorei)(SbGlEnum pname, SbGlInt32 param);
-*   ` glPolygonOffset`
-
-    void (\*glPolygonOffset)(SbGlFloat factor, SbGlFloat units);
-*   ` glReadPixels`
-
-    void (\*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height, SbGlEnum format, SbGlEnum type, void\* pixels);
-*   ` glReleaseShaderCompiler`
-
-    void (\*glReleaseShaderCompiler)(void);
-*   ` glRenderbufferStorage`
-
-    void (\*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
-    SbGlSizei width, SbGlSizei height);
-*   ` glSampleCoverage`
-
-    void (\*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert);
-*   ` glScissor`
-
-    void (\*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height);
-*   ` glShaderBinary`
-
-    void (\*glShaderBinary)(SbGlSizei count, const SbGlUInt32\* shaders,
-    SbGlEnum binaryformat, const void\* binary, SbGlSizei length);
-*   ` glShaderSource`
-
-    void (\*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar\*
-    const\* string, const SbGlInt32\* length);
-*   ` glStencilFunc`
-
-    void (\*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask);
-*   ` glStencilFuncSeparate`
-
-    void (\*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
-    SbGlUInt32 mask);
-*   ` glStencilMask`
-
-    void (\*glStencilMask)(SbGlUInt32 mask);
-*   ` glStencilMaskSeparate`
-
-    void (\*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask);
-*   ` glStencilOp`
-
-    void (\*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass);
-*   ` glStencilOpSeparate`
-
-    void (\*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
-    SbGlEnum dppass);
-*   ` glTexImage2D`
-
-    void (\*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlSizei height)`
+*   `SbGlUInt32(*glCreateProgram)(void)`
+*   `SbGlUInt32(*glCreateShader)(SbGlEnum type)`
+*   `void(*glCullFace)(SbGlEnum mode)`
+*   `void(*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32 *buffers)`
+*   `void(*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32 *framebuffers)`
+*   `void(*glDeleteProgram)(SbGlUInt32 program)`
+*   `void(*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32 *renderbuffers)`
+*   `void(*glDeleteShader)(SbGlUInt32 shader)`
+*   `void(*glDeleteTextures)(SbGlSizei n, const SbGlUInt32 *textures)`
+*   `void(*glDepthFunc)(SbGlEnum func)`
+*   `void(*glDepthMask)(SbGlBoolean flag)`
+*   `void(*glDepthRangef)(SbGlFloat n, SbGlFloat f)`
+*   `void(*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glDisable)(SbGlEnum cap)`
+*   `void(*glDisableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count)`
+*   `void(*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void *indices)`
+*   `void(*glEnable)(SbGlEnum cap)`
+*   `void(*glEnableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glFinish)(void)`
+*   `void(*glFlush)(void)`
+*   `void(*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer)`
+*   `void(*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level)`
+*   `void(*glFrontFace)(SbGlEnum mode)`
+*   `void(*glGenBuffers)(SbGlSizei n, SbGlUInt32 *buffers)`
+*   `void(*glGenerateMipmap)(SbGlEnum target)`
+*   `void(*glGenFramebuffers)(SbGlSizei n, SbGlUInt32 *framebuffers)`
+*   `void(*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32 *renderbuffers)`
+*   `void(*glGenTextures)(SbGlSizei n, SbGlUInt32 *textures)`
+*   `void(*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei *count, SbGlUInt32 *shaders)`
+*   `SbGlInt32(*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetBooleanv)(SbGlEnum pname, SbGlBoolean *data)`
+*   `void(*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `SbGlEnum(*glGetError)(void)`
+*   `void(*glGetFloatv)(SbGlEnum pname, SbGlFloat *data)`
+*   `void(*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetIntegerv)(SbGlEnum pname, SbGlInt32 *data)`
+*   `void(*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32 *range, SbGlInt32 *precision)`
+*   `void(*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *source)`
+*   `const SbGlUInt8 *(*glGetString)(SbGlEnum name)`
+*   `void(*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat
+    *params)`
+*   `void(*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32
+    *params)`
+*   `SbGlInt32(*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname, void
+    **pointer)`
+*   `void(*glHint)(SbGlEnum target, SbGlEnum mode)`
+*   `SbGlBoolean(*glIsBuffer)(SbGlUInt32 buffer)`
+*   `SbGlBoolean(*glIsEnabled)(SbGlEnum cap)`
+*   `SbGlBoolean(*glIsFramebuffer)(SbGlUInt32 framebuffer)`
+*   `SbGlBoolean(*glIsProgram)(SbGlUInt32 program)`
+*   `SbGlBoolean(*glIsRenderbuffer)(SbGlUInt32 renderbuffer)`
+*   `SbGlBoolean(*glIsShader)(SbGlUInt32 shader)`
+*   `SbGlBoolean(*glIsTexture)(SbGlUInt32 texture)`
+*   `void(*glLineWidth)(SbGlFloat width)`
+*   `void(*glLinkProgram)(SbGlUInt32 program)`
+*   `void(*glPixelStorei)(SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glPolygonOffset)(SbGlFloat factor, SbGlFloat units)`
+*   `void(*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void *pixels)`
+*   `void(*glReleaseShaderCompiler)(void)`
+*   `void(*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert)`
+*   `void(*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glShaderBinary)(SbGlSizei count, const SbGlUInt32 *shaders, SbGlEnum
+    binaryformat, const void *binary, SbGlSizei length)`
+*   `void(*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar
+    *const *string, const SbGlInt32 *length)`
+*   `void(*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask)`
+*   `void(*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask)`
+*   `void(*glStencilMask)(SbGlUInt32 mask)`
+*   `void(*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask)`
+*   `void(*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass)`
+*   `void(*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass)`
+*   `void(*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
-    SbGlEnum format, SbGlEnum type, const void\* pixels);
-*   ` glTexParameterf`
+    SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param)`
+*   `void(*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat
+    *params)`
+*   `void(*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32
+    *params)`
+*   `void(*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum format,
+    SbGlEnum type, const void *pixels)`
+*   `void(*glUniform1f)(SbGlInt32 location, SbGlFloat v0)`
+*   `void(*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform1i)(SbGlInt32 location, SbGlInt32 v0)`
+*   `void(*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1)`
+*   `void(*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1)`
+*   `void(*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2)`
+*   `void(*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2)`
+*   `void(*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3)`
+*   `void(*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3)`
+*   `void(*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUseProgram)(SbGlUInt32 program)`
+*   `void(*glValidateProgram)(SbGlUInt32 program)`
+*   `void(*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x)`
+*   `void(*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y)`
+*   `void(*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z)`
+*   `void(*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w)`
+*   `void(*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void *pointer)`
+*   `void(*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glReadBuffer)(SbGlEnum src)`
 
-    void (\*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param);
-*   ` glTexParameterfv`
-
-    void (\*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat\*
-    params);
-*   ` glTexParameteri`
-
-    void (\*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param);
-*   ` glTexParameteriv`
-
-    void (\*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32\*
-    params);
-*   ` glTexSubImage2D`
-
-    void (\*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
-    xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum
-    format, SbGlEnum type, const void\* pixels);
-*   ` glUniform1f`
-
-    void (\*glUniform1f)(SbGlInt32 location, SbGlFloat v0);
-*   ` glUniform1fv`
-
-    void (\*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform1i`
-
-    void (\*glUniform1i)(SbGlInt32 location, SbGlInt32 v0);
-*   ` glUniform1iv`
-
-    void (\*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform2f`
-
-    void (\*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1);
-*   ` glUniform2fv`
-
-    void (\*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform2i`
-
-    void (\*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1);
-*   ` glUniform2iv`
-
-    void (\*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform3f`
-
-    void (\*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
-    SbGlFloat v2);
-*   ` glUniform3fv`
-
-    void (\*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform3i`
-
-    void (\*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
-    SbGlInt32 v2);
-*   ` glUniform3iv`
-
-    void (\*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform4f`
-
-    void (\*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
-    SbGlFloat v2, SbGlFloat v3);
-*   ` glUniform4fv`
-
-    void (\*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform4i`
-
-    void (\*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
-    SbGlInt32 v2, SbGlInt32 v3);
-*   ` glUniform4iv`
-
-    void (\*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniformMatrix2fv`
-
-    void (\*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3fv`
-
-    void (\*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4fv`
-
-    void (\*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUseProgram`
-
-    void (\*glUseProgram)(SbGlUInt32 program);
-*   ` glValidateProgram`
-
-    void (\*glValidateProgram)(SbGlUInt32 program);
-*   ` glVertexAttrib1f`
-
-    void (\*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x);
-*   ` glVertexAttrib1fv`
-
-    void (\*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib2f`
-
-    void (\*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y);
-*   ` glVertexAttrib2fv`
-
-    void (\*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib3f`
-
-    void (\*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
-    SbGlFloat z);
-*   ` glVertexAttrib3fv`
-
-    void (\*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib4f`
-
-    void (\*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
-    SbGlFloat z, SbGlFloat w);
-*   ` glVertexAttrib4fv`
-
-    void (\*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttribPointer`
-
-    void (\*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
-    type, SbGlBoolean normalized, SbGlSizei stride, const void\* pointer);
-*   ` glViewport`
-
-    void (\*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height);
-*   ` glReadBuffer`
-
-    void (\*glReadBuffer)(SbGlEnum src);
-*   ` glDrawRangeElements`
-
-    void (\*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32
-    end, SbGlSizei count, SbGlEnum type, const void\* indices);
-*   ` glTexImage3D`
-
-    void (\*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+    .
+*   `void(*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32 end,
+    SbGlSizei count, SbGlEnum type, const void *indices)`
+*   `void(*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
-    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void\* pixels);
-*   ` glTexSubImage3D`
-
-    void (\*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
-    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei
-    height, SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void\*
-    pixels);
-*   ` glCopyTexSubImage3D`
-
-    void (\*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei height,
+    SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
-    SbGlSizei width, SbGlSizei height);
-*   ` glCompressedTexImage3D`
-
-    void (\*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
-    SbGlInt32 border, SbGlSizei imageSize, const void\* data);
-*   ` glCompressedTexSubImage3D`
-
-    void (\*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 border, SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
     SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
     SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
-    const void\* data);
-*   ` glGenQueries`
-
-    void (\*glGenQueries)(SbGlSizei n, SbGlUInt32\* ids);
-*   ` glDeleteQueries`
-
-    void (\*glDeleteQueries)(SbGlSizei n, const SbGlUInt32\* ids);
-*   ` glIsQuery`
-
-    SbGlBoolean (\*glIsQuery)(SbGlUInt32 id);
-*   ` glBeginQuery`
-
-    void (\*glBeginQuery)(SbGlEnum target, SbGlUInt32 id);
-*   ` glEndQuery`
-
-    void (\*glEndQuery)(SbGlEnum target);
-*   ` glGetQueryiv`
-
-    void (\*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetQueryObjectuiv`
-
-    void (\*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32\*
-    params);
-*   ` glUnmapBuffer`
-
-    SbGlBoolean (\*glUnmapBuffer)(SbGlEnum target);
-*   ` glGetBufferPointerv`
-
-    void (\*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void\*\*
-    params);
-*   ` glDrawBuffers`
-
-    void (\*glDrawBuffers)(SbGlSizei n, const SbGlEnum\* bufs);
-*   ` glUniformMatrix2x3fv`
-
-    void (\*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3x2fv`
-
-    void (\*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix2x4fv`
-
-    void (\*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4x2fv`
-
-    void (\*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3x4fv`
-
-    void (\*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4x3fv`
-
-    void (\*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glBlitFramebuffer`
-
-    void (\*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32
-    srcX1, SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
-    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter);
-*   ` glRenderbufferStorageMultisample`
-
-    void (\*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei
-    samples, SbGlEnum internalformat, SbGlSizei width, SbGlSizei height);
-*   ` glFramebufferTextureLayer`
-
-    void (\*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
-    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer);
-*   ` glMapBufferRange`
-
-    void\* (\*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
-    length, SbGlBitfield access);
-*   ` glFlushMappedBufferRange`
-
-    void (\*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
-    SbGlSizeiPtr length);
-*   ` glBindVertexArray`
-
-    void (\*glBindVertexArray)(SbGlUInt32 array);
-*   ` glDeleteVertexArrays`
-
-    void (\*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32\* arrays);
-*   ` glGenVertexArrays`
-
-    void (\*glGenVertexArrays)(SbGlSizei n, SbGlUInt32\* arrays);
-*   ` glIsVertexArray`
-
-    SbGlBoolean (\*glIsVertexArray)(SbGlUInt32 array);
-*   ` glGetIntegeri_v`
-
-    void (\*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32\*
-    data);
-*   ` glBeginTransformFeedback`
-
-    void (\*glBeginTransformFeedback)(SbGlEnum primitiveMode);
-*   ` glEndTransformFeedback`
-
-    void (\*glEndTransformFeedback)(void);
-*   ` glBindBufferRange`
-
-    void (\*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
-    buffer, SbGlIntPtr offset, SbGlSizeiPtr size);
-*   ` glBindBufferBase`
-
-    void (\*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
-    buffer);
-*   ` glTransformFeedbackVaryings`
-
-    void (\*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
-    const SbGlChar\* const\* varyings, SbGlEnum bufferMode);
-*   ` glGetTransformFeedbackVarying`
-
-    void (\*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
-    SbGlSizei bufSize, SbGlSizei\* length, SbGlSizei\* size, SbGlEnum\* type,
-    SbGlChar\* name);
-*   ` glVertexAttribIPointer`
-
-    void (\*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
-    type, SbGlSizei stride, const void\* pointer);
-*   ` glGetVertexAttribIiv`
-
-    void (\*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetVertexAttribIuiv`
-
-    void (\*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname,
-    SbGlUInt32\* params);
-*   ` glVertexAttribI4i`
-
-    void (\*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
-    SbGlInt32 z, SbGlInt32 w);
-*   ` glVertexAttribI4ui`
-
-    void (\*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
-    SbGlUInt32 z, SbGlUInt32 w);
-*   ` glVertexAttribI4iv`
-
-    void (\*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32\* v);
-*   ` glVertexAttribI4uiv`
-
-    void (\*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32\* v);
-*   ` glGetUniformuiv`
-
-    void (\*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location,
-    SbGlUInt32\* params);
-*   ` glGetFragDataLocation`
-
-    SbGlInt32 (\*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glUniform1ui`
-
-    void (\*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0);
-*   ` glUniform2ui`
-
-    void (\*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1);
-*   ` glUniform3ui`
-
-    void (\*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
-    SbGlUInt32 v2);
-*   ` glUniform4ui`
-
-    void (\*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
-    SbGlUInt32 v2, SbGlUInt32 v3);
-*   ` glUniform1uiv`
-
-    void (\*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform2uiv`
-
-    void (\*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform3uiv`
-
-    void (\*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform4uiv`
-
-    void (\*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glClearBufferiv`
-
-    void (\*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlInt32\* value);
-*   ` glClearBufferuiv`
-
-    void (\*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlUInt32\* value);
-*   ` glClearBufferfv`
-
-    void (\*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlFloat\* value);
-*   ` glClearBufferfi`
-
-    void (\*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
-    depth, SbGlInt32 stencil);
-*   ` glGetStringi`
-
-    const SbGlUInt8\* (\*glGetStringi)(SbGlEnum name, SbGlUInt32 index);
-*   ` glCopyBufferSubData`
-
-    void (\*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
-    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size);
-*   ` glGetUniformIndices`
-
-    void (\*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
-    const SbGlChar\* const\* uniformNames, SbGlUInt32\* uniformIndices);
-*   ` glGetActiveUniformsiv`
-
-    void (\*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
-    const SbGlUInt32\* uniformIndices, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetUniformBlockIndex`
-
-    SbGlUInt32 (\*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar\*
-    uniformBlockName);
-*   ` glGetActiveUniformBlockiv`
-
-    void (\*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetActiveUniformBlockName`
-
-    void (\*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei\* length, SbGlChar\*
-    uniformBlockName);
-*   ` glUniformBlockBinding`
-
-    void (\*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlUInt32 uniformBlockBinding);
-*   ` glDrawArraysInstanced`
-
-    void (\*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
-    count, SbGlSizei instancecount);
-*   ` glDrawElementsInstanced`
-
-    void (\*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
-    type, const void\* indices, SbGlSizei instancecount);
-*   ` glFenceSync`
-
-    SbGlSync (\*glFenceSync)(SbGlEnum condition, SbGlBitfield flags);
-*   ` glIsSync`
-
-    SbGlBoolean (\*glIsSync)(SbGlSync sync);
-*   ` glDeleteSync`
-
-    void (\*glDeleteSync)(SbGlSync sync);
-*   ` glClientWaitSync`
-
-    SbGlEnum (\*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
-    timeout);
-*   ` glWaitSync`
-
-    void (\*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout);
-*   ` glGetInteger64v`
-
-    void (\*glGetInteger64v)(SbGlEnum pname, SbGlInt64\* data);
-*   ` glGetSynciv`
-
-    void (\*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlInt32\* values);
-*   ` glGetInteger64i_v`
-
-    void (\*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64\*
-    data);
-*   ` glGetBufferParameteri64v`
-
-    void (\*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname,
-    SbGlInt64\* params);
-*   ` glGenSamplers`
-
-    void (\*glGenSamplers)(SbGlSizei count, SbGlUInt32\* samplers);
-*   ` glDeleteSamplers`
-
-    void (\*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32\* samplers);
-*   ` glIsSampler`
-
-    SbGlBoolean (\*glIsSampler)(SbGlUInt32 sampler);
-*   ` glBindSampler`
-
-    void (\*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler);
-*   ` glSamplerParameteri`
-
-    void (\*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
-    param);
-*   ` glSamplerParameteriv`
-
-    void (\*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
-    SbGlInt32\* param);
-*   ` glSamplerParameterf`
-
-    void (\*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
-    param);
-*   ` glSamplerParameterfv`
-
-    void (\*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
-    SbGlFloat\* param);
-*   ` glGetSamplerParameteriv`
-
-    void (\*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
-    SbGlInt32\* params);
-*   ` glGetSamplerParameterfv`
-
-    void (\*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
-    SbGlFloat\* params);
-*   ` glVertexAttribDivisor`
-
-    void (\*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor);
-*   ` glBindTransformFeedback`
-
-    void (\*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id);
-*   ` glDeleteTransformFeedbacks`
-
-    void (\*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32\* ids);
-*   ` glGenTransformFeedbacks`
-
-    void (\*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32\* ids);
-*   ` glIsTransformFeedback`
-
-    SbGlBoolean (\*glIsTransformFeedback)(SbGlUInt32 id);
-*   ` glPauseTransformFeedback`
-
-    void (\*glPauseTransformFeedback)(void);
-*   ` glResumeTransformFeedback`
-
-    void (\*glResumeTransformFeedback)(void);
-*   ` glGetProgramBinary`
-
-    void (\*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlEnum\* binaryFormat, void\* binary);
-*   ` glProgramBinary`
-
-    void (\*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
-    void\* binary, SbGlSizei length);
-*   ` glProgramParameteri`
-
-    void (\*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
-    value);
-*   ` glInvalidateFramebuffer`
-
-    void (\*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
-    const SbGlEnum\* attachments);
-*   ` glInvalidateSubFramebuffer`
-
-    void (\*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
-    numAttachments, const SbGlEnum\* attachments, SbGlInt32 x, SbGlInt32 y,
-    SbGlSizei width, SbGlSizei height);
-*   ` glTexStorage2D`
-
-    void (\*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
-    internalformat, SbGlSizei width, SbGlSizei height);
-*   ` glTexStorage3D`
-
-    void (\*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
-    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth);
-*   ` glGetInternalformativ`
-
-    void (\*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
-    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32\* params);
+    const void *data)`
+*   `void(*glGenQueries)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `void(*glDeleteQueries)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsQuery)(SbGlUInt32 id)`
+*   `void(*glBeginQuery)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glEndQuery)(SbGlEnum target)`
+*   `void(*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `SbGlBoolean(*glUnmapBuffer)(SbGlEnum target)`
+*   `void(*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void **params)`
+*   `void(*glDrawBuffers)(SbGlSizei n, const SbGlEnum *bufs)`
+*   `void(*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32 srcX1,
+    SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter)`
+*   `void(*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei samples,
+    SbGlEnum internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer)`
+*   `void *(*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access)`
+*   `void(*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length)`
+*   `void(*glBindVertexArray)(SbGlUInt32 array)`
+*   `void(*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32 *arrays)`
+*   `void(*glGenVertexArrays)(SbGlSizei n, SbGlUInt32 *arrays)`
+*   `SbGlBoolean(*glIsVertexArray)(SbGlUInt32 array)`
+*   `void(*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32 *data)`
+*   `void(*glBeginTransformFeedback)(SbGlEnum primitiveMode)`
+*   `void(*glEndTransformFeedback)(void)`
+*   `void(*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size)`
+*   `void(*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer)`
+*   `void(*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar *const *varyings, SbGlEnum bufferMode)`
+*   `void(*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei *length, SbGlSizei *size, SbGlEnum *type,
+    SbGlChar *name)`
+*   `void(*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void *pointer)`
+*   `void(*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `void(*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w)`
+*   `void(*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w)`
+*   `void(*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32 *v)`
+*   `void(*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32 *v)`
+*   `void(*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location, SbGlUInt32
+    *params)`
+*   `SbGlInt32(*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar
+    *name)`
+*   `void(*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0)`
+*   `void(*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1)`
+*   `void(*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2)`
+*   `void(*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3)`
+*   `void(*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32 *value)`
+*   `void(*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32 *value)`
+*   `void(*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat *value)`
+*   `void(*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil)`
+*   `const SbGlUInt8 *(*glGetStringi)(SbGlEnum name, SbGlUInt32 index)`
+*   `void(*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size)`
+*   `void(*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar *const *uniformNames, SbGlUInt32 *uniformIndices)`
+*   `void(*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32 *uniformIndices, SbGlEnum pname, SbGlInt32 *params)`
+*   `SbGlUInt32(*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar
+    *uniformBlockName)`
+*   `void(*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei *length, SbGlChar
+    *uniformBlockName)`
+*   `void(*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding)`
+*   `void(*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount)`
+*   `void(*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void *indices, SbGlSizei instancecount)`
+*   `SbGlSync(*glFenceSync)(SbGlEnum condition, SbGlBitfield flags)`
+*   `SbGlBoolean(*glIsSync)(SbGlSync sync)`
+*   `void(*glDeleteSync)(SbGlSync sync)`
+*   `SbGlEnum(*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout)`
+*   `void(*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout)`
+*   `void(*glGetInteger64v)(SbGlEnum pname, SbGlInt64 *data)`
+*   `void(*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei *length, SbGlInt32 *values)`
+*   `void(*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64
+    *data)`
+*   `void(*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname, SbGlInt64
+    *params)`
+*   `void(*glGenSamplers)(SbGlSizei count, SbGlUInt32 *samplers)`
+*   `void(*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32 *samplers)`
+*   `SbGlBoolean(*glIsSampler)(SbGlUInt32 sampler)`
+*   `void(*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler)`
+*   `void(*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param)`
+*   `void(*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32 *param)`
+*   `void(*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param)`
+*   `void(*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat *param)`
+*   `void(*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat *params)`
+*   `void(*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor)`
+*   `void(*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `void(*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsTransformFeedback)(SbGlUInt32 id)`
+*   `void(*glPauseTransformFeedback)(void)`
+*   `void(*glResumeTransformFeedback)(void)`
+*   `void(*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlEnum *binaryFormat, void *binary)`
+*   `void(*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void *binary, SbGlSizei length)`
+*   `void(*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value)`
+*   `void(*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum *attachments)`
+*   `void(*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum *attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth)`
+*   `void(*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32 *params)`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/image.md b/src/cobalt/site/docs/reference/starboard/modules/11/image.md
index c911e41..634dab8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/image.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/image.md
@@ -10,7 +10,8 @@
 
 All functions in this module are safe to call from any thread at any point in
 time.
-SbImageIsDecodeSupported and SbImageDecode Example
+
+## SbImageIsDecodeSupported and SbImageDecode Example ##
 
 Let's assume that we're on a Blitter platform.
 
@@ -30,7 +31,6 @@
 SbBlitterSurface surface =
     SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
 // Do stuff with surface...
-
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/media.md b/src/cobalt/site/docs/reference/starboard/modules/11/media.md
index a67be4c..10f0c24 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/media.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/media.md
@@ -127,7 +127,7 @@
     The media type cannot be played.
 *   `kSbMediaSupportTypeMaybe`
 
-    Cannot determinate if the media type is playable without playing it.
+    Cannot determine if the media type is playable without playing it.
 *   `kSbMediaSupportTypeProbably`
 
     The media type seems to be playable.
@@ -192,12 +192,13 @@
 
 ### SbMediaAudioSampleInfo ###
 
-An audio sample info, which is a description of a given audio sample. This, in
-hexadecimal string form, acts as a set of instructions to the audio decoder.
+An audio sample info, which is a description of a given audio sample. This acts
+as a set of instructions to the audio decoder.
 
-The audio sample info consists of a little-endian hexadecimal encoded
-`WAVEFORMATEX` structure followed by an Audio-specific configuration field. The
-`WAVEFORMATEX` structure is specified at: [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)
+The audio sample info consists of information found in the `WAVEFORMATEX`
+structure, as well as other information for the audio decoder, including the
+Audio-specific configuration field. The `WAVEFORMATEX` structure is specified at
+[http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)x) .
 
 #### Members ####
 
@@ -270,11 +271,11 @@
 *   `unsigned int chroma_siting_horizontal`
 
     How chroma is subsampled horizontally. (0: Unspecified, 1: Left Collocated,
-    2: Half)
+    2: Half).
 *   `unsigned int chroma_siting_vertical`
 
     How chroma is subsampled vertically. (0: Unspecified, 1: Top Collocated, 2:
-    Half)
+    Half).
 *   `SbMediaMasteringMetadata mastering_metadata`
 
     [HDR Metadata field] SMPTE 2086 mastering data.
@@ -292,7 +293,7 @@
     value and meanings for Primaries are adopted from Table 2 of ISO/IEC
     23001-8:2013/DCOR1. (0: Reserved, 1: ITU-R BT.709, 2: Unspecified, 3:
     Reserved, 4: ITU-R BT.470M, 5: ITU-R BT.470BG, 6: SMPTE 170M, 7: SMPTE 240M,
-    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors)
+    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors).
 *   `SbMediaTransferId transfer`
 
     [Color Space field] The transfer characteristics of the video. For clarity,
@@ -302,7 +303,7 @@
     4: Gamma 2.2 curve, 5: Gamma 2.8 curve, 6: SMPTE 170M, 7: SMPTE 240M, 8:
     Linear, 9: Log, 10: Log Sqrt, 11: IEC 61966-2-4, 12: ITU-R BT.1361 Extended
     Colour Gamut, 13: IEC 61966-2-1, 14: ITU-R BT.2020 10 bit, 15: ITU-R BT.2020
-    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG))
+    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG)).
 *   `SbMediaMatrixId matrix`
 
     [Color Space field] The Matrix Coefficients of the video used to derive luma
@@ -310,12 +311,12 @@
     the value and meanings for MatrixCoefficients are adopted from Table 4 of
     ISO/IEC 23001-8:2013/DCOR1. (0:GBR, 1: BT709, 2: Unspecified, 3: Reserved,
     4: FCC, 5: BT470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: YCOCG, 9: BT2020 Non-
-    constant Luminance, 10: BT2020 Constant Luminance)
+    constant Luminance, 10: BT2020 Constant Luminance).
 *   `SbMediaRangeId range`
 
     [Color Space field] Clipping of the color ranges. (0: Unspecified, 1:
     Broadcast Range, 2: Full range (no clipping), 3: Defined by
-    MatrixCoefficients/TransferCharacteristics)
+    MatrixCoefficients/TransferCharacteristics).
 *   `float custom_primary_matrix`
 
     [Color Space field] Only used if primaries == kSbMediaPrimaryIdCustom. This
@@ -429,11 +430,39 @@
 `mime`: The mime information of the media in the form of `video/webm` or
 `video/mp4; codecs="avc1.42001E"`. It may include arbitrary parameters like
 "codecs", "channels", etc. Note that the "codecs" parameter may contain more
-than one codec, delimited by comma. `key_system`: A lowercase value in fhe form
+than one codec, delimited by comma. `key_system`: A lowercase value in the form
 of "com.example.somesystem" as suggested by [https://w3c.github.io/encrypted-media/#key-system](https://w3c.github.io/encrypted-media/#key-system)) that can
 be matched exactly with known DRM key systems of the platform. When `key_system`
 is an empty string, the return value is an indication for non-encrypted media.
 
+An implementation may choose to support `key_system` with extra attributes,
+separated by ';', like `com.example.somesystem; attribute_name1="value1";
+attribute_name2=value1`. If `key_system` with attributes is not supported by an
+implementation, it should treat `key_system` as if it contains only the key
+system, and reject any input containing extra attributes, i.e. it can keep using
+its existing implementation. When an implementation supports `key_system` with
+attributes, it has to support all attributes defined by the Starboard version
+the implementation uses. An implementation should ignore any unknown attributes,
+and make a decision solely based on the key system and the known attributes. For
+example, if an implementation supports "com.widevine.alpha", it should also
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; invalid_attribute="invalid_value"`.
+Currently the only attribute has to be supported is `encryptionscheme`. It
+reflects the value passed to `encryptionScheme` encryptionScheme of
+MediaKeySystemMediaCapability, as defined in [https://wicg.github.io/encrypted-media-encryption-scheme/,](https://wicg.github.io/encrypted-media-encryption-scheme/,),) which can take value "cenc", "cbcs", or "cbcs-1-9". Empty string is
+not a valid value for `encryptionscheme` and the implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`encryptionscheme` is set to "". The implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported for unknown
+values of known attributes. For example, if an implementation supports
+"encryptionscheme" with value "cenc", "cbcs", or "cbcs-1-9", then it should
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; encryptionscheme="cenc"`, and return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`key_system` is `com.widevine.alpha; encryptionscheme="invalid"`. If an
+implementation supports key system with attributes on one key system, it has to
+support key system with attributes on all key systems supported.
+
 #### Declaration ####
 
 ```
@@ -721,3 +750,4 @@
 ```
 bool SbMediaSetOutputProtection(bool enabled)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/memory.md b/src/cobalt/site/docs/reference/starboard/modules/11/memory.md
index a3fecb6..7ea1c5b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/memory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/memory.md
@@ -4,12 +4,14 @@
 ---
 
 Defines functions for memory allocation, alignment, copying, and comparing.
-Porters
+
+## Porters ##
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
-Porters and Application Developers
+
+## Porters and Application Developers ##
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/player.md b/src/cobalt/site/docs/reference/starboard/modules/11/player.md
index 0a9ebd2..8763383 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/player.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/player.md
@@ -292,66 +292,6 @@
 
 ## Functions ##
 
-### SbPlayerCreate ###
-
-Creates a player that will be displayed on `window` for the specified
-`video_codec` and `audio_codec`, acquiring all resources needed to operate it,
-and returning an opaque handle to it. The expectation is that a new player will
-be created and destroyed for every playback.
-
-This function returns the created player. Note the following:
-
-*   The associated decoder of the returned player should be assumed to not be in
-    `kSbPlayerDecoderStateNeedsData` until SbPlayerSeek() has been called on it.
-
-*   It is expected either that the thread that calls SbPlayerCreate is the same
-    thread that calls the other `SbPlayer` functions for that player, or that
-    there is a mutex guarding calls into each `SbPlayer` instance.
-
-*   If there is a platform limitation on how many players can coexist
-    simultaneously, then calls made to this function that attempt to exceed that
-    limit must return `kSbPlayerInvalid`. Multiple calls to SbPlayerCreate must
-    not cause a crash.
-
-`window`: The window that will display the player. `window` can be
-`kSbWindowInvalid` for platforms where video is only displayed on a particular
-window that the underlying implementation already has access to.
-
-`video_codec`: The video codec used for the player. If `video_codec` is
-`kSbMediaVideoCodecNone`, the player is an audio-only player. If `video_codec`
-is any other value, the player is an audio/video decoder. This can be set to
-`kSbMediaVideoCodecNone` to play a video with only an audio track.
-
-`audio_codec`: The audio codec used for the player. The caller must provide a
-populated `audio_sample_info` if audio codec is `kSbMediaAudioCodecAac`. Can be
-set to `kSbMediaAudioCodecNone` to play a video without any audio track. In such
-case `audio_sample_info` must be NULL.
-
-`drm_system`: If the media stream has encrypted portions, then this parameter
-provides an appropriate DRM system, created with `SbDrmCreateSystem()`. If the
-stream does not have encrypted portions, then `drm_system` may be
-`kSbDrmSystemInvalid`. `audio_sample_info`: Note that the caller must provide a
-populated `audio_sample_info` if the audio codec is `kSbMediaAudioCodecAac`.
-Otherwise, `audio_sample_info` can be NULL. See media.h for the format of the
-`SbMediaAudioSampleInfo` struct. Note that `audio_specific_config` is a pointer
-and the content it points to is no longer valid after this function returns. The
-implementation has to make a copy of the content if it is needed after the
-function returns. `max_video_capabilities`: This string communicates the max
-video capabilities required to the platform. The web app will not provide a
-video stream exceeding the maximums described by this parameter. Allows the
-platform to optimize playback pipeline for low quality video streams if it knows
-that it will never adapt to higher quality streams. The string uses the same
-format as the string passed in to SbMediaCanPlayMimeAndKeySystem(), for example,
-when it is set to "width=1920; height=1080; framerate=15;", the video will never
-adapt to resolution higher than 1920x1080 or frame per second higher than 15
-fps. When the maximums are unknown, this will be set to NULL.
-
-#### Declaration ####
-
-```
-SbPlayer SbPlayerCreate(SbWindow window, const SbPlayerCreationParam *creation_param, SbPlayerDeallocateSampleFunc sample_deallocate_func, SbPlayerDecoderStatusFunc decoder_status_func, SbPlayerStatusFunc player_status_func, SbPlayerErrorFunc player_error_func, void *context, SbDecodeTargetGraphicsContextProvider *context_provider)
-```
-
 ### SbPlayerDestroy ###
 
 Destroys `player`, freeing all associated resources.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/socket.md b/src/cobalt/site/docs/reference/starboard/modules/11/socket.md
index 2098939..c903af6 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/socket.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/socket.md
@@ -276,8 +276,8 @@
 If the destination address is ::, and its `type` is `kSbSocketAddressTypeIpv6`
 then any IPv6 local interface that is up and not loopback or a link-local IP is
 a valid return value. However, in the case of IPv6, the address with the biggest
-scope must be returned. E.g., a globally scoped and routable IP is prefered over
-a unique local address (ULA). Also, the IP address that is returned must be
+scope must be returned. E.g., a globally scoped and routable IP is preferred
+over a unique local address (ULA). Also, the IP address that is returned must be
 permanent.
 
 If destination address is NULL, then any IP address that is valid for
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/socket_waiter.md b/src/cobalt/site/docs/reference/starboard/modules/11/socket_waiter.md
index 409169f..738fafb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/socket_waiter.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/socket_waiter.md
@@ -116,8 +116,9 @@
 *   If `persistent` is `true`, then `socket` stays registered with `waiter`
     until SbSocketWaiterRemove() is called with `waiter` and `socket`.
 
-*   If `persistent` is `false`, then `socket` is removed after the next call to
-    `callback`, even if not all registered `interests` became ready.
+*   If `persistent` is `false`, then `socket` is removed before the next call to
+    `callback`, even if not all registered `interests` became ready, which
+    allows for adding it again in the `callback`.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/speech_synthesis.md b/src/cobalt/site/docs/reference/starboard/modules/11/speech_synthesis.md
index 2074650..bb3724c 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/speech_synthesis.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/speech_synthesis.md
@@ -3,7 +3,7 @@
 title: "Starboard Module Reference: speech_synthesis.h"
 ---
 
-A basic text-to-speech API intended to be used for audio accessibilty.
+A basic text-to-speech API intended to be used for audio accessibility.
 
 Implementations of this API should audibly play back text to assist users in
 non-visual navigation of the application.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/system.md b/src/cobalt/site/docs/reference/starboard/modules/11/system.md
index 371d49d..8231497 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/system.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/system.md
@@ -324,6 +324,33 @@
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
+### SbSystemGetExtension ###
+
+Returns pointer to a constant global struct implementing the extension named
+`name`, if it is implemented. Otherwise return NULL.
+
+Extensions are used to implement behavior which is specific to the combination
+of application & platform. An extension relies on a header file in the
+"extension" subdirectory of an app, which is used by both the application and
+the Starboard platform to define an extension API struct. Since the header is
+used both above and below Starboard, it cannot include any files from above
+Starboard. It may depend on Starboard headers. That API struct has only 2
+required fields which must be first: a const char* `name`, storing the extension
+name, and a uint32_t `version` storing the version number of the extension. All
+other fields may be C types (including custom structs) or function pointers. The
+application will query for the function by name using SbSystemGetExtension, and
+the platform returns a pointer to the singleton instance of the extension
+struct. The singleton struct should be constant after initialization, since the
+application may only get the extension once, meaning updated values would be
+ignored. As the version of extensions are incremented, fields may be added to
+the end of the struct, but never removed (only deprecated).
+
+#### Declaration ####
+
+```
+const void* SbSystemGetExtension(const char *name)
+```
+
 ### SbSystemGetLastError ###
 
 Gets the last platform-specific error code produced by any Starboard call in the
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/accessibility.md b/src/cobalt/site/docs/reference/starboard/modules/12/accessibility.md
index 1a5adcb..a6c8460 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/accessibility.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/accessibility.md
@@ -251,3 +251,4 @@
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/condition_variable.md b/src/cobalt/site/docs/reference/starboard/modules/12/condition_variable.md
index 22c2b79..836c4b8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/condition_variable.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/condition_variable.md
@@ -40,7 +40,7 @@
 #### Definition ####
 
 ```
-typedef union SbConditionVariable SbConditionVariable
+typedef union SbConditionVariable  SbConditionVariable
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md
index 362c24e..5c351ef 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md
@@ -22,7 +22,7 @@
 
 ### SB_ALIGNOF(type) ###
 
-Returns the alignment reqiured for any instance of the type indicated by `type`.
+Returns the alignment required for any instance of the type indicated by `type`.
 
 ### SB_ARRAY_SIZE(array) ###
 
@@ -137,18 +137,11 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RELEASE_CANDIDATE_API_VERSION ###
-
-The next API version to be frozen, but is still subject to emergency changes. It
-is reasonable to base a port on the Release Candidate API version, but be aware
-that small incompatible changes may still be made to it. The following will be
-uncommented when an API version is a release candidate.
-
 ### SB_RESTRICT ###
 
 Include the platform-specific configuration. This macro is set by GYP in
 starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations. Makes a pointer-typed parameter restricted so that the
+all configurations.Makes a pointer-typed parameter restricted so that the
 compiler can make certain optimizations because it knows the pointers are
 unique.
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/configuration_constants.md b/src/cobalt/site/docs/reference/starboard/modules/12/configuration_constants.md
index 5c59a7c..b380f62 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/configuration_constants.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/configuration_constants.md
@@ -11,7 +11,7 @@
 
 ### kSbDefaultMmapThreshold ###
 
-Determines the threshhold of allocation size that should be done with mmap (if
+Determines the threshold of allocation size that should be done with mmap (if
 available), rather than allocated within the core heap.
 
 ### kSbFileAltSepChar ###
@@ -93,22 +93,6 @@
 The maximum video bitrate the platform can decode. The following value equals to
 8M bytes per seconds which is more than enough for compressed video.
 
-### kSbMediaMaximumVideoFrames ###
-
-Specify the number of video frames to be cached during playback. A large value
-leads to more stable fps but also causes the app to use more memory.
-
-### kSbMediaMaximumVideoPrerollFrames ###
-
-The encoded video frames are compressed in different ways, so their decoding
-time can vary a lot. Occasionally a single frame can take longer time to decode
-than the average time per frame. The player has to cache some frames to account
-for such inconsistency. The number of frames being cached are controlled by
-SB_MEDIA_MAXIMUM_VIDEO_PREROLL_FRAMES and SB_MEDIA_MAXIMUM_VIDEO_FRAMES.
-
-Specify the number of video frames to be cached before the playback starts. Note
-that setting this value too large may increase the playback start delay.
-
 ### kSbMediaVideoFrameAlignment ###
 
 Specifies how video frame buffers must be aligned on this platform.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/cpu_features.md b/src/cobalt/site/docs/reference/starboard/modules/12/cpu_features.md
index 9cdb94c..e939881 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/cpu_features.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/cpu_features.md
@@ -95,7 +95,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    Arm 64 feature flags
+    ###### Arm 64 feature flags  ######
 
     AES instructions.
 *   `bool has_crc32`
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/decode_target.md b/src/cobalt/site/docs/reference/starboard/modules/12/decode_target.md
index 6b068a3..852af38 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/decode_target.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/decode_target.md
@@ -12,7 +12,8 @@
 data. This allows the application to allocate fast graphics memory, and have
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
-SbDecodeTargetFormat
+
+## SbDecodeTargetFormat ##
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -20,7 +21,8 @@
 the SbDecodeTargetFormat passed into it, or the decode will produce an error.
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
-SbDecodeTargetGraphicsContextProvider
+
+## SbDecodeTargetGraphicsContextProvider ##
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -34,7 +36,8 @@
 
 The primary usage is likely to be the the SbPlayer implementation on some
 platforms.
-SbDecodeTarget Example
+
+## SbDecodeTarget Example ##
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -71,11 +74,10 @@
 
 // If the decode works, you can get the texture out and render it.
 SbDecodeTargetInfo info;
-SbMemorySet(&info, 0, sizeof(info));
+memset(&info, 0, sizeof(info));
 SbDecodeTargetGetInfo(target, &info);
 GLuint texture =
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
-
 ```
 
 ## Macros ##
@@ -118,8 +120,8 @@
     order.
 *   `kSbDecodeTargetFormat1PlaneUYVY`
 
-    A decoder target format consisting of a single plane with pixels layed out
-    in the format UYVY. Since there are two Y values per sample, but only one U
+    A decoder target format consisting of a single plane with pixels laid out in
+    the format UYVY. Since there are two Y values per sample, but only one U
     value and only one V value, horizontally the Y resolution is twice the size
     of both the U and V resolutions. Vertically, they Y, U and V all have the
     same resolution. This is a YUV 422 format. When using this format with GL
@@ -392,3 +394,4 @@
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/drm.md b/src/cobalt/site/docs/reference/starboard/modules/12/drm.md
index 3036863..beb65c9 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/drm.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/drm.md
@@ -158,7 +158,7 @@
 
 ### SbDrmSystem ###
 
-A handle to a DRM system which can be used with either an SbDecoder or a
+A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
 #### Definition ####
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/egl.md b/src/cobalt/site/docs/reference/starboard/modules/12/egl.md
index 6990f44..b1e120b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/egl.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/egl.md
@@ -10,7 +10,8 @@
 This API is designed to abstract the differences between EGL implementations and
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
-EGL Version
+
+## EGL Version ##
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
@@ -72,163 +73,75 @@
 
 #### Members ####
 
-*   ` eglChooseConfig`
-
-    SbEglBoolean (\*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32\*
-    attrib_list, SbEglConfig\* configs, SbEglInt32 config_size, SbEglInt32\*
-    num_config);
-*   ` eglCopyBuffers`
-
-    SbEglBoolean (\*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglNativePixmapType target);
-*   ` eglCreateContext`
-
-    SbEglContext (\*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
-    SbEglContext share_context, const SbEglInt32\* attrib_list);
-*   ` eglCreatePbufferSurface`
-
-    SbEglSurface (\*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
-    config, const SbEglInt32\* attrib_list);
-*   ` eglCreatePixmapSurface`
-
-    SbEglSurface (\*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig
-    config, SbEglNativePixmapType pixmap, const SbEglInt32\* attrib_list);
-*   ` eglCreateWindowSurface`
-
-    SbEglSurface (\*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig
-    config, SbEglNativeWindowType win, const SbEglInt32\* attrib_list);
-*   ` eglDestroyContext`
-
-    SbEglBoolean (\*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx);
-*   ` eglDestroySurface`
-
-    SbEglBoolean (\*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface);
-*   ` eglGetConfigAttrib`
-
-    SbEglBoolean (\*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglGetConfigs`
-
-    SbEglBoolean (\*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig\* configs,
-    SbEglInt32 config_size, SbEglInt32\* num_config);
-*   ` eglGetCurrentDisplay`
-
-    SbEglDisplay (\*eglGetCurrentDisplay)(void);
-*   ` eglGetCurrentSurface`
-
-    SbEglSurface (\*eglGetCurrentSurface)(SbEglInt32 readdraw);
-*   ` eglGetDisplay`
-
-    SbEglDisplay (\*eglGetDisplay)(SbEglNativeDisplayType display_id);
-*   ` eglGetError`
-
-    SbEglInt32 (\*eglGetError)(void);
-*   ` eglGetProcAddress`
-
-    SbEglCastsToProperFunctionPointerType (\*eglGetProcAddress)(const char\*
-    procname);
-*   ` eglInitialize`
-
-    SbEglBoolean (\*eglInitialize)(SbEglDisplay dpy, SbEglInt32\* major,
-    SbEglInt32\* minor);
-*   ` eglMakeCurrent`
-
-    SbEglBoolean (\*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
-    SbEglSurface read, SbEglContext ctx);
-*   ` eglQueryContext`
-
-    SbEglBoolean (\*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglQueryString`
-
-    const char\* (\*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name);
-*   ` eglQuerySurface`
-
-    SbEglBoolean (\*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglSwapBuffers`
-
-    SbEglBoolean (\*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface);
-*   ` eglTerminate`
-
-    SbEglBoolean (\*eglTerminate)(SbEglDisplay dpy);
-*   ` eglWaitGL`
-
-    SbEglBoolean (\*eglWaitGL)(void);
-*   ` eglWaitNative`
-
-    SbEglBoolean (\*eglWaitNative)(SbEglInt32 engine);
-*   ` eglBindTexImage`
-
-    SbEglBoolean (\*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 buffer);
-*   ` eglReleaseTexImage`
-
-    SbEglBoolean (\*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 buffer);
-*   ` eglSurfaceAttrib`
-
-    SbEglBoolean (\*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 attribute, SbEglInt32 value);
-*   ` eglSwapInterval`
-
-    SbEglBoolean (\*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval);
-*   ` eglBindAPI`
-
-    SbEglBoolean (\*eglBindAPI)(SbEglEnum api);
-*   ` eglQueryAPI`
-
-    SbEglEnum (\*eglQueryAPI)(void);
-*   ` eglCreatePbufferFromClientBuffer`
-
-    SbEglSurface (\*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy,
-    SbEglEnum buftype, SbEglClientBuffer buffer, SbEglConfig config, const
-    SbEglInt32\* attrib_list);
-*   ` eglReleaseThread`
-
-    SbEglBoolean (\*eglReleaseThread)(void);
-*   ` eglWaitClient`
-
-    SbEglBoolean (\*eglWaitClient)(void);
-*   ` eglGetCurrentContext`
-
-    SbEglContext (\*eglGetCurrentContext)(void);
-*   ` eglCreateSync`
-
-    SbEglSync (\*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
-    SbEglAttrib\* attrib_list);
-*   ` eglDestroySync`
-
-    SbEglBoolean (\*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync);
-*   ` eglClientWaitSync`
-
-    SbEglInt32 (\*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync,
-    SbEglInt32 flags, SbEglTime timeout);
-*   ` eglGetSyncAttrib`
-
-    SbEglBoolean (\*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
-    SbEglInt32 attribute, SbEglAttrib\* value);
-*   ` eglCreateImage`
-
-    SbEglImage (\*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
-    target, SbEglClientBuffer buffer, const SbEglAttrib\* attrib_list);
-*   ` eglDestroyImage`
-
-    SbEglBoolean (\*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image);
-*   ` eglGetPlatformDisplay`
-
-    SbEglDisplay (\*eglGetPlatformDisplay)(SbEglEnum platform, void\*
-    native_display, const SbEglAttrib\* attrib_list);
-*   ` eglCreatePlatformWindowSurface`
-
-    SbEglSurface (\*eglCreatePlatformWindowSurface)(SbEglDisplay dpy,
-    SbEglConfig config, void\* native_window, const SbEglAttrib\* attrib_list);
-*   ` eglCreatePlatformPixmapSurface`
-
-    SbEglSurface (\*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy,
-    SbEglConfig config, void\* native_pixmap, const SbEglAttrib\* attrib_list);
-*   ` eglWaitSync`
-
-    SbEglBoolean (\*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
-    flags);
+*   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
+    *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
+    *num_config)`
+*   `SbEglBoolean(*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target)`
+*   `SbEglContext(*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativePixmapType pixmap, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativeWindowType win, const SbEglInt32 *attrib_list)`
+*   `SbEglBoolean(*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx)`
+*   `SbEglBoolean(*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig *configs,
+    SbEglInt32 config_size, SbEglInt32 *num_config)`
+*   `SbEglDisplay(*eglGetCurrentDisplay)(void)`
+*   `SbEglSurface(*eglGetCurrentSurface)(SbEglInt32 readdraw)`
+*   `SbEglDisplay(*eglGetDisplay)(SbEglNativeDisplayType display_id)`
+*   `SbEglInt32(*eglGetError)(void)`
+*   `SbEglCastsToProperFunctionPointerType(*eglGetProcAddress)(const char
+    *procname)`
+*   `SbEglBoolean(*eglInitialize)(SbEglDisplay dpy, SbEglInt32 *major,
+    SbEglInt32 *minor)`
+*   `SbEglBoolean(*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx)`
+*   `SbEglBoolean(*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `const char *(*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name)`
+*   `SbEglBoolean(*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglTerminate)(SbEglDisplay dpy)`
+*   `SbEglBoolean(*eglWaitGL)(void)`
+*   `SbEglBoolean(*eglWaitNative)(SbEglInt32 engine)`
+*   `SbEglBoolean(*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value)`
+*   `SbEglBoolean(*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval)`
+*   `SbEglBoolean(*eglBindAPI)(SbEglEnum api)`
+*   `SbEglEnum(*eglQueryAPI)(void)`
+*   `SbEglSurface(*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy, SbEglEnum
+    buftype, SbEglClientBuffer buffer, SbEglConfig config, const SbEglInt32
+    *attrib_list)`
+*   `SbEglBoolean(*eglReleaseThread)(void)`
+*   `SbEglBoolean(*eglWaitClient)(void)`
+*   `SbEglContext(*eglGetCurrentContext)(void)`
+*   `SbEglSync(*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync)`
+*   `SbEglInt32(*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags, SbEglTime timeout)`
+*   `SbEglBoolean(*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib *value)`
+*   `SbEglImage(*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image)`
+*   `SbEglDisplay(*eglGetPlatformDisplay)(SbEglEnum platform, void
+    *native_display, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_window, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_pixmap, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags)`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/event.md b/src/cobalt/site/docs/reference/starboard/modules/12/event.md
index 65b6394..226d79e 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/event.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/event.md
@@ -3,8 +3,92 @@
 title: "Starboard Module Reference: event.h"
 ---
 
+For SB_API_VERSION >= 13
+
+Module Overview: Starboard Event module
+
 Defines the event system that wraps the Starboard main loop and entry point.
-The Starboard Application Lifecycle
+
+## The Starboard Application Lifecycle ##
+
+```
+               * ----------
+               |           |
+             Start         |
+               |           |
+               V           |
+         [===========]     |
+    ---> [  STARTED  ]     |
+   |     [===========]     |
+   |           |           |
+ Focus       Blur      Preload
+   |           |           |
+   |           V           |
+    ---- [===========]     |
+    ---> [  BLURRED  ]     |
+   |     [===========]     |
+   |           |           |
+ Reveal     Conceal        |
+   |           |           |
+   |           V           |
+   |     [===========]     |
+    ---- [ CONCEALED ] <---
+    ---> [===========]
+   |           |
+Unfreeze     Freeze
+   |           |
+   |           V
+   |     [===========]
+    ---- [  FROZEN   ]
+         [===========]
+               |
+              Stop
+               |
+               V
+         [===========]
+         [  STOPPED  ]
+         [===========]
+
+```
+
+The first event that a Starboard application receives is either `Start`
+(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
+application in the `STARTED` state, whereas `Preload` puts the application in
+the `CONCEALED` state.
+
+In the `STARTED` state, the application is in the foreground and can expect to
+do all of the normal things it might want to do. Once in the `STARTED` state, it
+may receive a `Blur` event, putting the application into the `BLURRED` state.
+
+In the `BLURRED` state, the application is still visible, but has lost focus, or
+it is partially obscured by a modal dialog, or it is on its way to being shut
+down. The application should blur activity in this state. In this state, it can
+receive `Focus` to be brought back to the foreground state (`STARTED`), or
+`Conceal` to be pushed to the `CONCEALED` state.
+
+In the `CONCEALED` state, the application should behave as it should for an
+invisible program that can still run, and that can optionally access the network
+and playback audio, albeit potentially will have less CPU and memory available.
+The application may get switched from `CONCEALED` to `FROZEN` at any time, when
+the platform decides to do so.
+
+In the `FROZEN` state, the application is not visible. It should immediately
+release all graphics and video resources, and shut down all background activity
+(timers, rendering, etc). Additionally, the application should flush storage to
+ensure that if the application is killed, the storage will be up-to-date. The
+application may be killed at this point, but will ideally receive a `Stop` event
+for a more graceful shutdown.
+
+Note that the application is always expected to transition through `BLURRED`,
+`CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
+
+For SB_API_VERSION < 13
+
+Module Overview: Starboard Event module
+
+Defines the event system that wraps the Starboard main loop and entry point.
+
+## The Starboard Application Lifecycle ##
 
 ```
     ---------- *
@@ -91,7 +175,7 @@
     SbEventStartData is passed as the data argument.
 
     The system may send `kSbEventTypeSuspend` in `PRELOADING` if it wants to
-    push the app into a lower resource consumption state. Applications can alo
+    push the app into a lower resource consumption state. Applications can also
     call SbSystemRequestSuspend() when they are done preloading to request this.
 *   `kSbEventTypeStart`
 
@@ -136,7 +220,7 @@
 *   `kSbEventTypeStop`
 
     The operating system will shut the application down entirely after this
-    event is handled. Can only be recieved after a Suspend event, in the
+    event is handled. Can only be received after a Suspend event, in the
     SUSPENDED state. No data argument.
 *   `kSbEventTypeInput`
 
@@ -171,10 +255,11 @@
     query the accessibility settings using the appropriate APIs to get the new
     settings. Note this excludes captions settings changes, which causes
     kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
-    version has kSbEventTypeAccessiblityTextToSpeechSettingsChanged, then that
-    event should be used to signal text-to-speech settings changes instead;
+    version has kSbEventTypeAccessib(i)lityTextToSpeechSettingsChanged, then
+    that event should be used to signal text-to-speech settings changes instead;
     platforms using older starboard versions should use
-    kSbEventTypeAccessiblitySettingsChanged for text-to-speech settings changes.
+    kSbEventTypeAccessib(i)litySettingsChanged for text-to-speech settings
+    changes.
 *   `kSbEventTypeLowMemory`
 
     An optional event that platforms may send to indicate that the application
@@ -234,7 +319,7 @@
     ticket value kSbEventOnScreenKeyboardInvalidTicket.
 *   `kSbEventTypeAccessibilityCaptionSettingsChanged`
 
-    SB_HAS(ON_SCREEN_KEYBOARD) One or more of the fields returned by
+    SB_HAS(ON_SCREEN_KEYBOARD)One or more of the fields returned by
     SbAccessibilityGetCaptionSettings has changed.
 *   `kSbEventTypeAccessiblityTextToSpeechSettingsChanged`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/gles.md b/src/cobalt/site/docs/reference/starboard/modules/12/gles.md
index 20c5924..7a9108a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/gles.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/gles.md
@@ -10,7 +10,8 @@
 This API is designed to abstract the differences between GLES implementations
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
-GLES Version
+
+## GLES Version ##
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
@@ -60,895 +61,402 @@
 
 #### Members ####
 
-*   ` glActiveTexture`
+*   `void(*glActiveTexture)(SbGlEnum texture)`
 
-    void (\*glActiveTexture)(SbGlEnum texture);
-*   ` glAttachShader`
-
-    void (\*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader);
-*   ` glBindAttribLocation`
-
-    void (\*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
-    SbGlChar\* name);
-*   ` glBindBuffer`
-
-    void (\*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer);
-*   ` glBindFramebuffer`
-
-    void (\*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer);
-*   ` glBindRenderbuffer`
-
-    void (\*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer);
-*   ` glBindTexture`
-
-    void (\*glBindTexture)(SbGlEnum target, SbGlUInt32 texture);
-*   ` glBlendColor`
-
-    void (\*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
-    SbGlFloat alpha);
-*   ` glBlendEquation`
-
-    void (\*glBlendEquation)(SbGlEnum mode);
-*   ` glBlendEquationSeparate`
-
-    void (\*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha);
-*   ` glBlendFunc`
-
-    void (\*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor);
-*   ` glBlendFuncSeparate`
-
-    void (\*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
-    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha);
-*   ` glBufferData`
-
-    void (\*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void\* data,
-    SbGlEnum usage);
-*   ` glBufferSubData`
-
-    void (\*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
-    size, const void\* data);
-*   ` glCheckFramebufferStatus`
-
-    SbGlEnum (\*glCheckFramebufferStatus)(SbGlEnum target);
-*   ` glClear`
-
-    void (\*glClear)(SbGlBitfield mask);
-*   ` glClearColor`
-
-    void (\*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
-    SbGlFloat alpha);
-*   ` glClearDepthf`
-
-    void (\*glClearDepthf)(SbGlFloat d);
-*   ` glClearStencil`
-
-    void (\*glClearStencil)(SbGlInt32 s);
-*   ` glColorMask`
-
-    void (\*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
-    SbGlBoolean alpha);
-*   ` glCompileShader`
-
-    void (\*glCompileShader)(SbGlUInt32 shader);
-*   ` glCompressedTexImage2D`
-
-    void (\*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+    .
+*   `void(*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar *name)`
+*   `void(*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer)`
+*   `void(*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer)`
+*   `void(*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer)`
+*   `void(*glBindTexture)(SbGlEnum target, SbGlUInt32 texture)`
+*   `void(*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glBlendEquation)(SbGlEnum mode)`
+*   `void(*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha)`
+*   `void(*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor)`
+*   `void(*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha)`
+*   `void(*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void *data,
+    SbGlEnum usage)`
+*   `void(*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void *data)`
+*   `SbGlEnum(*glCheckFramebufferStatus)(SbGlEnum target)`
+*   `void(*glClear)(SbGlBitfield mask)`
+*   `void(*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glClearDepthf)(SbGlFloat d)`
+*   `void(*glClearStencil)(SbGlInt32 s)`
+*   `void(*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha)`
+*   `void(*glCompileShader)(SbGlUInt32 shader)`
+*   `void(*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
-    SbGlSizei imageSize, const void\* data);
-*   ` glCompressedTexSubImage2D`
-
-    void (\*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
     SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
-    SbGlEnum format, SbGlSizei imageSize, const void\* data);
-*   ` glCopyTexImage2D`
-
-    void (\*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    SbGlEnum format, SbGlSizei imageSize, const void *data)`
+*   `void(*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
-    SbGlInt32 border);
-*   ` glCopyTexSubImage2D`
-
-    void (\*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlInt32 border)`
+*   `void(*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
-    SbGlSizei height);
-*   ` glCreateProgram`
-
-    SbGlUInt32 (\*glCreateProgram)(void);
-*   ` glCreateShader`
-
-    SbGlUInt32 (\*glCreateShader)(SbGlEnum type);
-*   ` glCullFace`
-
-    void (\*glCullFace)(SbGlEnum mode);
-*   ` glDeleteBuffers`
-
-    void (\*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32\* buffers);
-*   ` glDeleteFramebuffers`
-
-    void (\*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32\* framebuffers);
-*   ` glDeleteProgram`
-
-    void (\*glDeleteProgram)(SbGlUInt32 program);
-*   ` glDeleteRenderbuffers`
-
-    void (\*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32\*
-    renderbuffers);
-*   ` glDeleteShader`
-
-    void (\*glDeleteShader)(SbGlUInt32 shader);
-*   ` glDeleteTextures`
-
-    void (\*glDeleteTextures)(SbGlSizei n, const SbGlUInt32\* textures);
-*   ` glDepthFunc`
-
-    void (\*glDepthFunc)(SbGlEnum func);
-*   ` glDepthMask`
-
-    void (\*glDepthMask)(SbGlBoolean flag);
-*   ` glDepthRangef`
-
-    void (\*glDepthRangef)(SbGlFloat n, SbGlFloat f);
-*   ` glDetachShader`
-
-    void (\*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader);
-*   ` glDisable`
-
-    void (\*glDisable)(SbGlEnum cap);
-*   ` glDisableVertexAttribArray`
-
-    void (\*glDisableVertexAttribArray)(SbGlUInt32 index);
-*   ` glDrawArrays`
-
-    void (\*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count);
-*   ` glDrawElements`
-
-    void (\*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
-    void\* indices);
-*   ` glEnable`
-
-    void (\*glEnable)(SbGlEnum cap);
-*   ` glEnableVertexAttribArray`
-
-    void (\*glEnableVertexAttribArray)(SbGlUInt32 index);
-*   ` glFinish`
-
-    void (\*glFinish)(void);
-*   ` glFlush`
-
-    void (\*glFlush)(void);
-*   ` glFramebufferRenderbuffer`
-
-    void (\*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
-    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer);
-*   ` glFramebufferTexture2D`
-
-    void (\*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
-    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level);
-*   ` glFrontFace`
-
-    void (\*glFrontFace)(SbGlEnum mode);
-*   ` glGenBuffers`
-
-    void (\*glGenBuffers)(SbGlSizei n, SbGlUInt32\* buffers);
-*   ` glGenerateMipmap`
-
-    void (\*glGenerateMipmap)(SbGlEnum target);
-*   ` glGenFramebuffers`
-
-    void (\*glGenFramebuffers)(SbGlSizei n, SbGlUInt32\* framebuffers);
-*   ` glGenRenderbuffers`
-
-    void (\*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32\* renderbuffers);
-*   ` glGenTextures`
-
-    void (\*glGenTextures)(SbGlSizei n, SbGlUInt32\* textures);
-*   ` glGetActiveAttrib`
-
-    void (\*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
-    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
-    name);
-*   ` glGetActiveUniform`
-
-    void (\*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
-    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
-    name);
-*   ` glGetAttachedShaders`
-
-    void (\*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
-    SbGlSizei\* count, SbGlUInt32\* shaders);
-*   ` glGetAttribLocation`
-
-    SbGlInt32 (\*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glGetBooleanv`
-
-    void (\*glGetBooleanv)(SbGlEnum pname, SbGlBoolean\* data);
-*   ` glGetBufferParameteriv`
-
-    void (\*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetError`
-
-    SbGlEnum (\*glGetError)(void);
-*   ` glGetFloatv`
-
-    void (\*glGetFloatv)(SbGlEnum pname, SbGlFloat\* data);
-*   ` glGetFramebufferAttachmentParameteriv`
-
-    void (\*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
-    attachment, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetIntegerv`
-
-    void (\*glGetIntegerv)(SbGlEnum pname, SbGlInt32\* data);
-*   ` glGetProgramiv`
-
-    void (\*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetProgramInfoLog`
-
-    void (\*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlChar\* infoLog);
-*   ` glGetRenderbufferParameteriv`
-
-    void (\*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
-    SbGlInt32\* params);
-*   ` glGetShaderiv`
-
-    void (\*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetShaderInfoLog`
-
-    void (\*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlChar\* infoLog);
-*   ` glGetShaderPrecisionFormat`
-
-    void (\*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
-    precisiontype, SbGlInt32\* range, SbGlInt32\* precision);
-*   ` glGetShaderSource`
-
-    void (\*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei\*
-    length, SbGlChar\* source);
-*   ` glGetString`
-
-    const SbGlUInt8\* (\*glGetString)(SbGlEnum name);
-*   ` glGetTexParameterfv`
-
-    void (\*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat\*
-    params);
-*   ` glGetTexParameteriv`
-
-    void (\*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetUniformfv`
-
-    void (\*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat\*
-    params);
-*   ` glGetUniformiv`
-
-    void (\*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32\*
-    params);
-*   ` glGetUniformLocation`
-
-    SbGlInt32 (\*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glGetVertexAttribfv`
-
-    void (\*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat\*
-    params);
-*   ` glGetVertexAttribiv`
-
-    void (\*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetVertexAttribPointerv`
-
-    void (\*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname,
-    void\*\* pointer);
-*   ` glHint`
-
-    void (\*glHint)(SbGlEnum target, SbGlEnum mode);
-*   ` glIsBuffer`
-
-    SbGlBoolean (\*glIsBuffer)(SbGlUInt32 buffer);
-*   ` glIsEnabled`
-
-    SbGlBoolean (\*glIsEnabled)(SbGlEnum cap);
-*   ` glIsFramebuffer`
-
-    SbGlBoolean (\*glIsFramebuffer)(SbGlUInt32 framebuffer);
-*   ` glIsProgram`
-
-    SbGlBoolean (\*glIsProgram)(SbGlUInt32 program);
-*   ` glIsRenderbuffer`
-
-    SbGlBoolean (\*glIsRenderbuffer)(SbGlUInt32 renderbuffer);
-*   ` glIsShader`
-
-    SbGlBoolean (\*glIsShader)(SbGlUInt32 shader);
-*   ` glIsTexture`
-
-    SbGlBoolean (\*glIsTexture)(SbGlUInt32 texture);
-*   ` glLineWidth`
-
-    void (\*glLineWidth)(SbGlFloat width);
-*   ` glLinkProgram`
-
-    void (\*glLinkProgram)(SbGlUInt32 program);
-*   ` glPixelStorei`
-
-    void (\*glPixelStorei)(SbGlEnum pname, SbGlInt32 param);
-*   ` glPolygonOffset`
-
-    void (\*glPolygonOffset)(SbGlFloat factor, SbGlFloat units);
-*   ` glReadPixels`
-
-    void (\*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height, SbGlEnum format, SbGlEnum type, void\* pixels);
-*   ` glReleaseShaderCompiler`
-
-    void (\*glReleaseShaderCompiler)(void);
-*   ` glRenderbufferStorage`
-
-    void (\*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
-    SbGlSizei width, SbGlSizei height);
-*   ` glSampleCoverage`
-
-    void (\*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert);
-*   ` glScissor`
-
-    void (\*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height);
-*   ` glShaderBinary`
-
-    void (\*glShaderBinary)(SbGlSizei count, const SbGlUInt32\* shaders,
-    SbGlEnum binaryformat, const void\* binary, SbGlSizei length);
-*   ` glShaderSource`
-
-    void (\*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar\*
-    const\* string, const SbGlInt32\* length);
-*   ` glStencilFunc`
-
-    void (\*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask);
-*   ` glStencilFuncSeparate`
-
-    void (\*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
-    SbGlUInt32 mask);
-*   ` glStencilMask`
-
-    void (\*glStencilMask)(SbGlUInt32 mask);
-*   ` glStencilMaskSeparate`
-
-    void (\*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask);
-*   ` glStencilOp`
-
-    void (\*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass);
-*   ` glStencilOpSeparate`
-
-    void (\*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
-    SbGlEnum dppass);
-*   ` glTexImage2D`
-
-    void (\*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlSizei height)`
+*   `SbGlUInt32(*glCreateProgram)(void)`
+*   `SbGlUInt32(*glCreateShader)(SbGlEnum type)`
+*   `void(*glCullFace)(SbGlEnum mode)`
+*   `void(*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32 *buffers)`
+*   `void(*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32 *framebuffers)`
+*   `void(*glDeleteProgram)(SbGlUInt32 program)`
+*   `void(*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32 *renderbuffers)`
+*   `void(*glDeleteShader)(SbGlUInt32 shader)`
+*   `void(*glDeleteTextures)(SbGlSizei n, const SbGlUInt32 *textures)`
+*   `void(*glDepthFunc)(SbGlEnum func)`
+*   `void(*glDepthMask)(SbGlBoolean flag)`
+*   `void(*glDepthRangef)(SbGlFloat n, SbGlFloat f)`
+*   `void(*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glDisable)(SbGlEnum cap)`
+*   `void(*glDisableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count)`
+*   `void(*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void *indices)`
+*   `void(*glEnable)(SbGlEnum cap)`
+*   `void(*glEnableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glFinish)(void)`
+*   `void(*glFlush)(void)`
+*   `void(*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer)`
+*   `void(*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level)`
+*   `void(*glFrontFace)(SbGlEnum mode)`
+*   `void(*glGenBuffers)(SbGlSizei n, SbGlUInt32 *buffers)`
+*   `void(*glGenerateMipmap)(SbGlEnum target)`
+*   `void(*glGenFramebuffers)(SbGlSizei n, SbGlUInt32 *framebuffers)`
+*   `void(*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32 *renderbuffers)`
+*   `void(*glGenTextures)(SbGlSizei n, SbGlUInt32 *textures)`
+*   `void(*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei *count, SbGlUInt32 *shaders)`
+*   `SbGlInt32(*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetBooleanv)(SbGlEnum pname, SbGlBoolean *data)`
+*   `void(*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `SbGlEnum(*glGetError)(void)`
+*   `void(*glGetFloatv)(SbGlEnum pname, SbGlFloat *data)`
+*   `void(*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetIntegerv)(SbGlEnum pname, SbGlInt32 *data)`
+*   `void(*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32 *range, SbGlInt32 *precision)`
+*   `void(*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *source)`
+*   `const SbGlUInt8 *(*glGetString)(SbGlEnum name)`
+*   `void(*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat
+    *params)`
+*   `void(*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32
+    *params)`
+*   `SbGlInt32(*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname, void
+    **pointer)`
+*   `void(*glHint)(SbGlEnum target, SbGlEnum mode)`
+*   `SbGlBoolean(*glIsBuffer)(SbGlUInt32 buffer)`
+*   `SbGlBoolean(*glIsEnabled)(SbGlEnum cap)`
+*   `SbGlBoolean(*glIsFramebuffer)(SbGlUInt32 framebuffer)`
+*   `SbGlBoolean(*glIsProgram)(SbGlUInt32 program)`
+*   `SbGlBoolean(*glIsRenderbuffer)(SbGlUInt32 renderbuffer)`
+*   `SbGlBoolean(*glIsShader)(SbGlUInt32 shader)`
+*   `SbGlBoolean(*glIsTexture)(SbGlUInt32 texture)`
+*   `void(*glLineWidth)(SbGlFloat width)`
+*   `void(*glLinkProgram)(SbGlUInt32 program)`
+*   `void(*glPixelStorei)(SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glPolygonOffset)(SbGlFloat factor, SbGlFloat units)`
+*   `void(*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void *pixels)`
+*   `void(*glReleaseShaderCompiler)(void)`
+*   `void(*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert)`
+*   `void(*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glShaderBinary)(SbGlSizei count, const SbGlUInt32 *shaders, SbGlEnum
+    binaryformat, const void *binary, SbGlSizei length)`
+*   `void(*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar
+    *const *string, const SbGlInt32 *length)`
+*   `void(*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask)`
+*   `void(*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask)`
+*   `void(*glStencilMask)(SbGlUInt32 mask)`
+*   `void(*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask)`
+*   `void(*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass)`
+*   `void(*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass)`
+*   `void(*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
-    SbGlEnum format, SbGlEnum type, const void\* pixels);
-*   ` glTexParameterf`
+    SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param)`
+*   `void(*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat
+    *params)`
+*   `void(*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32
+    *params)`
+*   `void(*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum format,
+    SbGlEnum type, const void *pixels)`
+*   `void(*glUniform1f)(SbGlInt32 location, SbGlFloat v0)`
+*   `void(*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform1i)(SbGlInt32 location, SbGlInt32 v0)`
+*   `void(*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1)`
+*   `void(*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1)`
+*   `void(*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2)`
+*   `void(*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2)`
+*   `void(*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3)`
+*   `void(*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3)`
+*   `void(*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUseProgram)(SbGlUInt32 program)`
+*   `void(*glValidateProgram)(SbGlUInt32 program)`
+*   `void(*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x)`
+*   `void(*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y)`
+*   `void(*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z)`
+*   `void(*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w)`
+*   `void(*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void *pointer)`
+*   `void(*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glReadBuffer)(SbGlEnum src)`
 
-    void (\*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param);
-*   ` glTexParameterfv`
-
-    void (\*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat\*
-    params);
-*   ` glTexParameteri`
-
-    void (\*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param);
-*   ` glTexParameteriv`
-
-    void (\*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32\*
-    params);
-*   ` glTexSubImage2D`
-
-    void (\*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
-    xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum
-    format, SbGlEnum type, const void\* pixels);
-*   ` glUniform1f`
-
-    void (\*glUniform1f)(SbGlInt32 location, SbGlFloat v0);
-*   ` glUniform1fv`
-
-    void (\*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform1i`
-
-    void (\*glUniform1i)(SbGlInt32 location, SbGlInt32 v0);
-*   ` glUniform1iv`
-
-    void (\*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform2f`
-
-    void (\*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1);
-*   ` glUniform2fv`
-
-    void (\*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform2i`
-
-    void (\*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1);
-*   ` glUniform2iv`
-
-    void (\*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform3f`
-
-    void (\*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
-    SbGlFloat v2);
-*   ` glUniform3fv`
-
-    void (\*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform3i`
-
-    void (\*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
-    SbGlInt32 v2);
-*   ` glUniform3iv`
-
-    void (\*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform4f`
-
-    void (\*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
-    SbGlFloat v2, SbGlFloat v3);
-*   ` glUniform4fv`
-
-    void (\*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform4i`
-
-    void (\*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
-    SbGlInt32 v2, SbGlInt32 v3);
-*   ` glUniform4iv`
-
-    void (\*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniformMatrix2fv`
-
-    void (\*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3fv`
-
-    void (\*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4fv`
-
-    void (\*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUseProgram`
-
-    void (\*glUseProgram)(SbGlUInt32 program);
-*   ` glValidateProgram`
-
-    void (\*glValidateProgram)(SbGlUInt32 program);
-*   ` glVertexAttrib1f`
-
-    void (\*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x);
-*   ` glVertexAttrib1fv`
-
-    void (\*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib2f`
-
-    void (\*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y);
-*   ` glVertexAttrib2fv`
-
-    void (\*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib3f`
-
-    void (\*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
-    SbGlFloat z);
-*   ` glVertexAttrib3fv`
-
-    void (\*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib4f`
-
-    void (\*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
-    SbGlFloat z, SbGlFloat w);
-*   ` glVertexAttrib4fv`
-
-    void (\*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttribPointer`
-
-    void (\*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
-    type, SbGlBoolean normalized, SbGlSizei stride, const void\* pointer);
-*   ` glViewport`
-
-    void (\*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height);
-*   ` glReadBuffer`
-
-    void (\*glReadBuffer)(SbGlEnum src);
-*   ` glDrawRangeElements`
-
-    void (\*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32
-    end, SbGlSizei count, SbGlEnum type, const void\* indices);
-*   ` glTexImage3D`
-
-    void (\*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+    .
+*   `void(*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32 end,
+    SbGlSizei count, SbGlEnum type, const void *indices)`
+*   `void(*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
-    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void\* pixels);
-*   ` glTexSubImage3D`
-
-    void (\*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
-    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei
-    height, SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void\*
-    pixels);
-*   ` glCopyTexSubImage3D`
-
-    void (\*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei height,
+    SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
-    SbGlSizei width, SbGlSizei height);
-*   ` glCompressedTexImage3D`
-
-    void (\*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
-    SbGlInt32 border, SbGlSizei imageSize, const void\* data);
-*   ` glCompressedTexSubImage3D`
-
-    void (\*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 border, SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
     SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
     SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
-    const void\* data);
-*   ` glGenQueries`
-
-    void (\*glGenQueries)(SbGlSizei n, SbGlUInt32\* ids);
-*   ` glDeleteQueries`
-
-    void (\*glDeleteQueries)(SbGlSizei n, const SbGlUInt32\* ids);
-*   ` glIsQuery`
-
-    SbGlBoolean (\*glIsQuery)(SbGlUInt32 id);
-*   ` glBeginQuery`
-
-    void (\*glBeginQuery)(SbGlEnum target, SbGlUInt32 id);
-*   ` glEndQuery`
-
-    void (\*glEndQuery)(SbGlEnum target);
-*   ` glGetQueryiv`
-
-    void (\*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetQueryObjectuiv`
-
-    void (\*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32\*
-    params);
-*   ` glUnmapBuffer`
-
-    SbGlBoolean (\*glUnmapBuffer)(SbGlEnum target);
-*   ` glGetBufferPointerv`
-
-    void (\*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void\*\*
-    params);
-*   ` glDrawBuffers`
-
-    void (\*glDrawBuffers)(SbGlSizei n, const SbGlEnum\* bufs);
-*   ` glUniformMatrix2x3fv`
-
-    void (\*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3x2fv`
-
-    void (\*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix2x4fv`
-
-    void (\*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4x2fv`
-
-    void (\*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3x4fv`
-
-    void (\*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4x3fv`
-
-    void (\*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glBlitFramebuffer`
-
-    void (\*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32
-    srcX1, SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
-    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter);
-*   ` glRenderbufferStorageMultisample`
-
-    void (\*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei
-    samples, SbGlEnum internalformat, SbGlSizei width, SbGlSizei height);
-*   ` glFramebufferTextureLayer`
-
-    void (\*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
-    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer);
-*   ` glMapBufferRange`
-
-    void\* (\*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
-    length, SbGlBitfield access);
-*   ` glFlushMappedBufferRange`
-
-    void (\*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
-    SbGlSizeiPtr length);
-*   ` glBindVertexArray`
-
-    void (\*glBindVertexArray)(SbGlUInt32 array);
-*   ` glDeleteVertexArrays`
-
-    void (\*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32\* arrays);
-*   ` glGenVertexArrays`
-
-    void (\*glGenVertexArrays)(SbGlSizei n, SbGlUInt32\* arrays);
-*   ` glIsVertexArray`
-
-    SbGlBoolean (\*glIsVertexArray)(SbGlUInt32 array);
-*   ` glGetIntegeri_v`
-
-    void (\*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32\*
-    data);
-*   ` glBeginTransformFeedback`
-
-    void (\*glBeginTransformFeedback)(SbGlEnum primitiveMode);
-*   ` glEndTransformFeedback`
-
-    void (\*glEndTransformFeedback)(void);
-*   ` glBindBufferRange`
-
-    void (\*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
-    buffer, SbGlIntPtr offset, SbGlSizeiPtr size);
-*   ` glBindBufferBase`
-
-    void (\*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
-    buffer);
-*   ` glTransformFeedbackVaryings`
-
-    void (\*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
-    const SbGlChar\* const\* varyings, SbGlEnum bufferMode);
-*   ` glGetTransformFeedbackVarying`
-
-    void (\*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
-    SbGlSizei bufSize, SbGlSizei\* length, SbGlSizei\* size, SbGlEnum\* type,
-    SbGlChar\* name);
-*   ` glVertexAttribIPointer`
-
-    void (\*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
-    type, SbGlSizei stride, const void\* pointer);
-*   ` glGetVertexAttribIiv`
-
-    void (\*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetVertexAttribIuiv`
-
-    void (\*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname,
-    SbGlUInt32\* params);
-*   ` glVertexAttribI4i`
-
-    void (\*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
-    SbGlInt32 z, SbGlInt32 w);
-*   ` glVertexAttribI4ui`
-
-    void (\*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
-    SbGlUInt32 z, SbGlUInt32 w);
-*   ` glVertexAttribI4iv`
-
-    void (\*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32\* v);
-*   ` glVertexAttribI4uiv`
-
-    void (\*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32\* v);
-*   ` glGetUniformuiv`
-
-    void (\*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location,
-    SbGlUInt32\* params);
-*   ` glGetFragDataLocation`
-
-    SbGlInt32 (\*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glUniform1ui`
-
-    void (\*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0);
-*   ` glUniform2ui`
-
-    void (\*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1);
-*   ` glUniform3ui`
-
-    void (\*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
-    SbGlUInt32 v2);
-*   ` glUniform4ui`
-
-    void (\*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
-    SbGlUInt32 v2, SbGlUInt32 v3);
-*   ` glUniform1uiv`
-
-    void (\*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform2uiv`
-
-    void (\*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform3uiv`
-
-    void (\*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform4uiv`
-
-    void (\*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glClearBufferiv`
-
-    void (\*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlInt32\* value);
-*   ` glClearBufferuiv`
-
-    void (\*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlUInt32\* value);
-*   ` glClearBufferfv`
-
-    void (\*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlFloat\* value);
-*   ` glClearBufferfi`
-
-    void (\*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
-    depth, SbGlInt32 stencil);
-*   ` glGetStringi`
-
-    const SbGlUInt8\* (\*glGetStringi)(SbGlEnum name, SbGlUInt32 index);
-*   ` glCopyBufferSubData`
-
-    void (\*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
-    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size);
-*   ` glGetUniformIndices`
-
-    void (\*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
-    const SbGlChar\* const\* uniformNames, SbGlUInt32\* uniformIndices);
-*   ` glGetActiveUniformsiv`
-
-    void (\*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
-    const SbGlUInt32\* uniformIndices, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetUniformBlockIndex`
-
-    SbGlUInt32 (\*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar\*
-    uniformBlockName);
-*   ` glGetActiveUniformBlockiv`
-
-    void (\*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetActiveUniformBlockName`
-
-    void (\*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei\* length, SbGlChar\*
-    uniformBlockName);
-*   ` glUniformBlockBinding`
-
-    void (\*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlUInt32 uniformBlockBinding);
-*   ` glDrawArraysInstanced`
-
-    void (\*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
-    count, SbGlSizei instancecount);
-*   ` glDrawElementsInstanced`
-
-    void (\*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
-    type, const void\* indices, SbGlSizei instancecount);
-*   ` glFenceSync`
-
-    SbGlSync (\*glFenceSync)(SbGlEnum condition, SbGlBitfield flags);
-*   ` glIsSync`
-
-    SbGlBoolean (\*glIsSync)(SbGlSync sync);
-*   ` glDeleteSync`
-
-    void (\*glDeleteSync)(SbGlSync sync);
-*   ` glClientWaitSync`
-
-    SbGlEnum (\*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
-    timeout);
-*   ` glWaitSync`
-
-    void (\*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout);
-*   ` glGetInteger64v`
-
-    void (\*glGetInteger64v)(SbGlEnum pname, SbGlInt64\* data);
-*   ` glGetSynciv`
-
-    void (\*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlInt32\* values);
-*   ` glGetInteger64i_v`
-
-    void (\*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64\*
-    data);
-*   ` glGetBufferParameteri64v`
-
-    void (\*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname,
-    SbGlInt64\* params);
-*   ` glGenSamplers`
-
-    void (\*glGenSamplers)(SbGlSizei count, SbGlUInt32\* samplers);
-*   ` glDeleteSamplers`
-
-    void (\*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32\* samplers);
-*   ` glIsSampler`
-
-    SbGlBoolean (\*glIsSampler)(SbGlUInt32 sampler);
-*   ` glBindSampler`
-
-    void (\*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler);
-*   ` glSamplerParameteri`
-
-    void (\*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
-    param);
-*   ` glSamplerParameteriv`
-
-    void (\*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
-    SbGlInt32\* param);
-*   ` glSamplerParameterf`
-
-    void (\*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
-    param);
-*   ` glSamplerParameterfv`
-
-    void (\*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
-    SbGlFloat\* param);
-*   ` glGetSamplerParameteriv`
-
-    void (\*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
-    SbGlInt32\* params);
-*   ` glGetSamplerParameterfv`
-
-    void (\*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
-    SbGlFloat\* params);
-*   ` glVertexAttribDivisor`
-
-    void (\*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor);
-*   ` glBindTransformFeedback`
-
-    void (\*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id);
-*   ` glDeleteTransformFeedbacks`
-
-    void (\*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32\* ids);
-*   ` glGenTransformFeedbacks`
-
-    void (\*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32\* ids);
-*   ` glIsTransformFeedback`
-
-    SbGlBoolean (\*glIsTransformFeedback)(SbGlUInt32 id);
-*   ` glPauseTransformFeedback`
-
-    void (\*glPauseTransformFeedback)(void);
-*   ` glResumeTransformFeedback`
-
-    void (\*glResumeTransformFeedback)(void);
-*   ` glGetProgramBinary`
-
-    void (\*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlEnum\* binaryFormat, void\* binary);
-*   ` glProgramBinary`
-
-    void (\*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
-    void\* binary, SbGlSizei length);
-*   ` glProgramParameteri`
-
-    void (\*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
-    value);
-*   ` glInvalidateFramebuffer`
-
-    void (\*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
-    const SbGlEnum\* attachments);
-*   ` glInvalidateSubFramebuffer`
-
-    void (\*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
-    numAttachments, const SbGlEnum\* attachments, SbGlInt32 x, SbGlInt32 y,
-    SbGlSizei width, SbGlSizei height);
-*   ` glTexStorage2D`
-
-    void (\*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
-    internalformat, SbGlSizei width, SbGlSizei height);
-*   ` glTexStorage3D`
-
-    void (\*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
-    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth);
-*   ` glGetInternalformativ`
-
-    void (\*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
-    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32\* params);
+    const void *data)`
+*   `void(*glGenQueries)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `void(*glDeleteQueries)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsQuery)(SbGlUInt32 id)`
+*   `void(*glBeginQuery)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glEndQuery)(SbGlEnum target)`
+*   `void(*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `SbGlBoolean(*glUnmapBuffer)(SbGlEnum target)`
+*   `void(*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void **params)`
+*   `void(*glDrawBuffers)(SbGlSizei n, const SbGlEnum *bufs)`
+*   `void(*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32 srcX1,
+    SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter)`
+*   `void(*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei samples,
+    SbGlEnum internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer)`
+*   `void *(*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access)`
+*   `void(*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length)`
+*   `void(*glBindVertexArray)(SbGlUInt32 array)`
+*   `void(*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32 *arrays)`
+*   `void(*glGenVertexArrays)(SbGlSizei n, SbGlUInt32 *arrays)`
+*   `SbGlBoolean(*glIsVertexArray)(SbGlUInt32 array)`
+*   `void(*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32 *data)`
+*   `void(*glBeginTransformFeedback)(SbGlEnum primitiveMode)`
+*   `void(*glEndTransformFeedback)(void)`
+*   `void(*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size)`
+*   `void(*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer)`
+*   `void(*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar *const *varyings, SbGlEnum bufferMode)`
+*   `void(*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei *length, SbGlSizei *size, SbGlEnum *type,
+    SbGlChar *name)`
+*   `void(*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void *pointer)`
+*   `void(*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `void(*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w)`
+*   `void(*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w)`
+*   `void(*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32 *v)`
+*   `void(*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32 *v)`
+*   `void(*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location, SbGlUInt32
+    *params)`
+*   `SbGlInt32(*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar
+    *name)`
+*   `void(*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0)`
+*   `void(*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1)`
+*   `void(*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2)`
+*   `void(*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3)`
+*   `void(*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32 *value)`
+*   `void(*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32 *value)`
+*   `void(*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat *value)`
+*   `void(*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil)`
+*   `const SbGlUInt8 *(*glGetStringi)(SbGlEnum name, SbGlUInt32 index)`
+*   `void(*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size)`
+*   `void(*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar *const *uniformNames, SbGlUInt32 *uniformIndices)`
+*   `void(*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32 *uniformIndices, SbGlEnum pname, SbGlInt32 *params)`
+*   `SbGlUInt32(*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar
+    *uniformBlockName)`
+*   `void(*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei *length, SbGlChar
+    *uniformBlockName)`
+*   `void(*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding)`
+*   `void(*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount)`
+*   `void(*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void *indices, SbGlSizei instancecount)`
+*   `SbGlSync(*glFenceSync)(SbGlEnum condition, SbGlBitfield flags)`
+*   `SbGlBoolean(*glIsSync)(SbGlSync sync)`
+*   `void(*glDeleteSync)(SbGlSync sync)`
+*   `SbGlEnum(*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout)`
+*   `void(*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout)`
+*   `void(*glGetInteger64v)(SbGlEnum pname, SbGlInt64 *data)`
+*   `void(*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei *length, SbGlInt32 *values)`
+*   `void(*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64
+    *data)`
+*   `void(*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname, SbGlInt64
+    *params)`
+*   `void(*glGenSamplers)(SbGlSizei count, SbGlUInt32 *samplers)`
+*   `void(*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32 *samplers)`
+*   `SbGlBoolean(*glIsSampler)(SbGlUInt32 sampler)`
+*   `void(*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler)`
+*   `void(*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param)`
+*   `void(*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32 *param)`
+*   `void(*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param)`
+*   `void(*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat *param)`
+*   `void(*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat *params)`
+*   `void(*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor)`
+*   `void(*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `void(*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsTransformFeedback)(SbGlUInt32 id)`
+*   `void(*glPauseTransformFeedback)(void)`
+*   `void(*glResumeTransformFeedback)(void)`
+*   `void(*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlEnum *binaryFormat, void *binary)`
+*   `void(*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void *binary, SbGlSizei length)`
+*   `void(*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value)`
+*   `void(*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum *attachments)`
+*   `void(*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum *attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth)`
+*   `void(*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32 *params)`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/image.md b/src/cobalt/site/docs/reference/starboard/modules/12/image.md
index c911e41..634dab8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/image.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/image.md
@@ -10,7 +10,8 @@
 
 All functions in this module are safe to call from any thread at any point in
 time.
-SbImageIsDecodeSupported and SbImageDecode Example
+
+## SbImageIsDecodeSupported and SbImageDecode Example ##
 
 Let's assume that we're on a Blitter platform.
 
@@ -30,7 +31,6 @@
 SbBlitterSurface surface =
     SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
 // Do stuff with surface...
-
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/media.md b/src/cobalt/site/docs/reference/starboard/modules/12/media.md
index 6a2f7c1..9b4d7bb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/media.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/media.md
@@ -127,7 +127,7 @@
     The media type cannot be played.
 *   `kSbMediaSupportTypeMaybe`
 
-    Cannot determinate if the media type is playable without playing it.
+    Cannot determine if the media type is playable without playing it.
 *   `kSbMediaSupportTypeProbably`
 
     The media type seems to be playable.
@@ -192,12 +192,13 @@
 
 ### SbMediaAudioSampleInfo ###
 
-An audio sample info, which is a description of a given audio sample. This, in
-hexadecimal string form, acts as a set of instructions to the audio decoder.
+An audio sample info, which is a description of a given audio sample. This acts
+as a set of instructions to the audio decoder.
 
-The audio sample info consists of a little-endian hexadecimal encoded
-`WAVEFORMATEX` structure followed by an Audio-specific configuration field. The
-`WAVEFORMATEX` structure is specified at: [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)
+The audio sample info consists of information found in the `WAVEFORMATEX`
+structure, as well as other information for the audio decoder, including the
+Audio-specific configuration field. The `WAVEFORMATEX` structure is specified at
+[http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)x) .
 
 #### Members ####
 
@@ -270,11 +271,11 @@
 *   `unsigned int chroma_siting_horizontal`
 
     How chroma is subsampled horizontally. (0: Unspecified, 1: Left Collocated,
-    2: Half)
+    2: Half).
 *   `unsigned int chroma_siting_vertical`
 
     How chroma is subsampled vertically. (0: Unspecified, 1: Top Collocated, 2:
-    Half)
+    Half).
 *   `SbMediaMasteringMetadata mastering_metadata`
 
     [HDR Metadata field] SMPTE 2086 mastering data.
@@ -292,7 +293,7 @@
     value and meanings for Primaries are adopted from Table 2 of ISO/IEC
     23001-8:2013/DCOR1. (0: Reserved, 1: ITU-R BT.709, 2: Unspecified, 3:
     Reserved, 4: ITU-R BT.470M, 5: ITU-R BT.470BG, 6: SMPTE 170M, 7: SMPTE 240M,
-    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors)
+    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors).
 *   `SbMediaTransferId transfer`
 
     [Color Space field] The transfer characteristics of the video. For clarity,
@@ -302,7 +303,7 @@
     4: Gamma 2.2 curve, 5: Gamma 2.8 curve, 6: SMPTE 170M, 7: SMPTE 240M, 8:
     Linear, 9: Log, 10: Log Sqrt, 11: IEC 61966-2-4, 12: ITU-R BT.1361 Extended
     Colour Gamut, 13: IEC 61966-2-1, 14: ITU-R BT.2020 10 bit, 15: ITU-R BT.2020
-    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG))
+    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG)).
 *   `SbMediaMatrixId matrix`
 
     [Color Space field] The Matrix Coefficients of the video used to derive luma
@@ -310,12 +311,12 @@
     the value and meanings for MatrixCoefficients are adopted from Table 4 of
     ISO/IEC 23001-8:2013/DCOR1. (0:GBR, 1: BT709, 2: Unspecified, 3: Reserved,
     4: FCC, 5: BT470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: YCOCG, 9: BT2020 Non-
-    constant Luminance, 10: BT2020 Constant Luminance)
+    constant Luminance, 10: BT2020 Constant Luminance).
 *   `SbMediaRangeId range`
 
     [Color Space field] Clipping of the color ranges. (0: Unspecified, 1:
     Broadcast Range, 2: Full range (no clipping), 3: Defined by
-    MatrixCoefficients/TransferCharacteristics)
+    MatrixCoefficients/TransferCharacteristics).
 *   `float custom_primary_matrix`
 
     [Color Space field] Only used if primaries == kSbMediaPrimaryIdCustom. This
@@ -429,11 +430,39 @@
 `mime`: The mime information of the media in the form of `video/webm` or
 `video/mp4; codecs="avc1.42001E"`. It may include arbitrary parameters like
 "codecs", "channels", etc. Note that the "codecs" parameter may contain more
-than one codec, delimited by comma. `key_system`: A lowercase value in fhe form
+than one codec, delimited by comma. `key_system`: A lowercase value in the form
 of "com.example.somesystem" as suggested by [https://w3c.github.io/encrypted-media/#key-system](https://w3c.github.io/encrypted-media/#key-system)) that can
 be matched exactly with known DRM key systems of the platform. When `key_system`
 is an empty string, the return value is an indication for non-encrypted media.
 
+An implementation may choose to support `key_system` with extra attributes,
+separated by ';', like `com.example.somesystem; attribute_name1="value1";
+attribute_name2=value1`. If `key_system` with attributes is not supported by an
+implementation, it should treat `key_system` as if it contains only the key
+system, and reject any input containing extra attributes, i.e. it can keep using
+its existing implementation. When an implementation supports `key_system` with
+attributes, it has to support all attributes defined by the Starboard version
+the implementation uses. An implementation should ignore any unknown attributes,
+and make a decision solely based on the key system and the known attributes. For
+example, if an implementation supports "com.widevine.alpha", it should also
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; invalid_attribute="invalid_value"`.
+Currently the only attribute has to be supported is `encryptionscheme`. It
+reflects the value passed to `encryptionScheme` encryptionScheme of
+MediaKeySystemMediaCapability, as defined in [https://wicg.github.io/encrypted-media-encryption-scheme/,](https://wicg.github.io/encrypted-media-encryption-scheme/,),) which can take value "cenc", "cbcs", or "cbcs-1-9". Empty string is
+not a valid value for `encryptionscheme` and the implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`encryptionscheme` is set to "". The implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported for unknown
+values of known attributes. For example, if an implementation supports
+"encryptionscheme" with value "cenc", "cbcs", or "cbcs-1-9", then it should
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; encryptionscheme="cenc"`, and return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`key_system` is `com.widevine.alpha; encryptionscheme="invalid"`. If an
+implementation supports key system with attributes on one key system, it has to
+support key system with attributes on all key systems supported.
+
 #### Declaration ####
 
 ```
@@ -688,3 +717,4 @@
 ```
 void SbMediaSetAudioWriteDuration(SbTime duration)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/memory.md b/src/cobalt/site/docs/reference/starboard/modules/12/memory.md
index a3fecb6..7ea1c5b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/memory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/memory.md
@@ -4,12 +4,14 @@
 ---
 
 Defines functions for memory allocation, alignment, copying, and comparing.
-Porters
+
+## Porters ##
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
-Porters and Application Developers
+
+## Porters and Application Developers ##
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/mutex.md b/src/cobalt/site/docs/reference/starboard/modules/12/mutex.md
index a9d2a9a..58f1907 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/mutex.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/mutex.md
@@ -40,7 +40,7 @@
 #### Definition ####
 
 ```
-typedef union SbMutex SbMutex
+typedef union SbMutex  SbMutex
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/once.md b/src/cobalt/site/docs/reference/starboard/modules/12/once.md
index 61aad5d..ce3c4d6 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/once.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/once.md
@@ -22,7 +22,7 @@
 #### Definition ####
 
 ```
-typedef union SbOnceControl SbOnceControl
+typedef union SbOnceControl  SbOnceControl
 ```
 
 ### SbOnceInitRoutine ###
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/player.md b/src/cobalt/site/docs/reference/starboard/modules/12/player.md
index 2f64632..d6910e2 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/player.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/player.md
@@ -284,66 +284,6 @@
 
 ## Functions ##
 
-### SbPlayerCreate ###
-
-Creates a player that will be displayed on `window` for the specified
-`video_codec` and `audio_codec`, acquiring all resources needed to operate it,
-and returning an opaque handle to it. The expectation is that a new player will
-be created and destroyed for every playback.
-
-This function returns the created player. Note the following:
-
-*   The associated decoder of the returned player should be assumed to not be in
-    `kSbPlayerDecoderStateNeedsData` until SbPlayerSeek() has been called on it.
-
-*   It is expected either that the thread that calls SbPlayerCreate is the same
-    thread that calls the other `SbPlayer` functions for that player, or that
-    there is a mutex guarding calls into each `SbPlayer` instance.
-
-*   If there is a platform limitation on how many players can coexist
-    simultaneously, then calls made to this function that attempt to exceed that
-    limit must return `kSbPlayerInvalid`. Multiple calls to SbPlayerCreate must
-    not cause a crash.
-
-`window`: The window that will display the player. `window` can be
-`kSbWindowInvalid` for platforms where video is only displayed on a particular
-window that the underlying implementation already has access to.
-
-`video_codec`: The video codec used for the player. If `video_codec` is
-`kSbMediaVideoCodecNone`, the player is an audio-only player. If `video_codec`
-is any other value, the player is an audio/video decoder. This can be set to
-`kSbMediaVideoCodecNone` to play a video with only an audio track.
-
-`audio_codec`: The audio codec used for the player. The caller must provide a
-populated `audio_sample_info` if audio codec is `kSbMediaAudioCodecAac`. Can be
-set to `kSbMediaAudioCodecNone` to play a video without any audio track. In such
-case `audio_sample_info` must be NULL.
-
-`drm_system`: If the media stream has encrypted portions, then this parameter
-provides an appropriate DRM system, created with `SbDrmCreateSystem()`. If the
-stream does not have encrypted portions, then `drm_system` may be
-`kSbDrmSystemInvalid`. `audio_sample_info`: Note that the caller must provide a
-populated `audio_sample_info` if the audio codec is `kSbMediaAudioCodecAac`.
-Otherwise, `audio_sample_info` can be NULL. See media.h for the format of the
-`SbMediaAudioSampleInfo` struct. Note that `audio_specific_config` is a pointer
-and the content it points to is no longer valid after this function returns. The
-implementation has to make a copy of the content if it is needed after the
-function returns. `max_video_capabilities`: This string communicates the max
-video capabilities required to the platform. The web app will not provide a
-video stream exceeding the maximums described by this parameter. Allows the
-platform to optimize playback pipeline for low quality video streams if it knows
-that it will never adapt to higher quality streams. The string uses the same
-format as the string passed in to SbMediaCanPlayMimeAndKeySystem(), for example,
-when it is set to "width=1920; height=1080; framerate=15;", the video will never
-adapt to resolution higher than 1920x1080 or frame per second higher than 15
-fps. When the maximums are unknown, this will be set to NULL.
-
-#### Declaration ####
-
-```
-SbPlayer SbPlayerCreate(SbWindow window, const SbPlayerCreationParam *creation_param, SbPlayerDeallocateSampleFunc sample_deallocate_func, SbPlayerDecoderStatusFunc decoder_status_func, SbPlayerStatusFunc player_status_func, SbPlayerErrorFunc player_error_func, void *context, SbDecodeTargetGraphicsContextProvider *context_provider)
-```
-
 ### SbPlayerDestroy ###
 
 Destroys `player`, freeing all associated resources.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/socket.md b/src/cobalt/site/docs/reference/starboard/modules/12/socket.md
index 2bfb614..548f57d 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/socket.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/socket.md
@@ -276,8 +276,8 @@
 If the destination address is ::, and its `type` is `kSbSocketAddressTypeIpv6`
 then any IPv6 local interface that is up and not loopback or a link-local IP is
 a valid return value. However, in the case of IPv6, the address with the biggest
-scope must be returned. E.g., a globally scoped and routable IP is prefered over
-a unique local address (ULA). Also, the IP address that is returned must be
+scope must be returned. E.g., a globally scoped and routable IP is preferred
+over a unique local address (ULA). Also, the IP address that is returned must be
 permanent.
 
 If destination address is NULL, then any IP address that is valid for
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/socket_waiter.md b/src/cobalt/site/docs/reference/starboard/modules/12/socket_waiter.md
index 409169f..738fafb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/socket_waiter.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/socket_waiter.md
@@ -116,8 +116,9 @@
 *   If `persistent` is `true`, then `socket` stays registered with `waiter`
     until SbSocketWaiterRemove() is called with `waiter` and `socket`.
 
-*   If `persistent` is `false`, then `socket` is removed after the next call to
-    `callback`, even if not all registered `interests` became ready.
+*   If `persistent` is `false`, then `socket` is removed before the next call to
+    `callback`, even if not all registered `interests` became ready, which
+    allows for adding it again in the `callback`.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/speech_synthesis.md b/src/cobalt/site/docs/reference/starboard/modules/12/speech_synthesis.md
index 39bdec2..e46a2ca 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/speech_synthesis.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/speech_synthesis.md
@@ -3,7 +3,7 @@
 title: "Starboard Module Reference: speech_synthesis.h"
 ---
 
-A basic text-to-speech API intended to be used for audio accessibilty.
+A basic text-to-speech API intended to be used for audio accessibility.
 
 Implementations of this API should audibly play back text to assist users in
 non-visual navigation of the application.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/system.md b/src/cobalt/site/docs/reference/starboard/modules/12/system.md
index e2b07d4..0a135ce 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/system.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/system.md
@@ -328,6 +328,33 @@
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
+### SbSystemGetExtension ###
+
+Returns pointer to a constant global struct implementing the extension named
+`name`, if it is implemented. Otherwise return NULL.
+
+Extensions are used to implement behavior which is specific to the combination
+of application & platform. An extension relies on a header file in the
+"extension" subdirectory of an app, which is used by both the application and
+the Starboard platform to define an extension API struct. Since the header is
+used both above and below Starboard, it cannot include any files from above
+Starboard. It may depend on Starboard headers. That API struct has only 2
+required fields which must be first: a const char* `name`, storing the extension
+name, and a uint32_t `version` storing the version number of the extension. All
+other fields may be C types (including custom structs) or function pointers. The
+application will query for the function by name using SbSystemGetExtension, and
+the platform returns a pointer to the singleton instance of the extension
+struct. The singleton struct should be constant after initialization, since the
+application may only get the extension once, meaning updated values would be
+ignored. As the version of extensions are incremented, fields may be added to
+the end of the struct, but never removed (only deprecated).
+
+#### Declaration ####
+
+```
+const void* SbSystemGetExtension(const char *name)
+```
+
 ### SbSystemGetLastError ###
 
 Gets the last platform-specific error code produced by any Starboard call in the
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md b/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md
index a9fb339..23f8049 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md
@@ -66,19 +66,13 @@
 
 #### Members ####
 
-*   ` onblur`
-
-    void (\*onblur)(SbUiNavItem item, void\* callback_context);
+*   `void(*onblur)(SbUiNavItem item, void *callback_context)`
 
     Invoke when an item has lost focus. This is only used with focus items.
-*   ` onfocus`
-
-    void (\*onfocus)(SbUiNavItem item, void\* callback_context);
+*   `void(*onfocus)(SbUiNavItem item, void *callback_context)`
 
     Invoke when an item has gained focus. This is only used with focus items.
-*   ` onscroll`
-
-    void (\*onscroll)(SbUiNavItem item, void\* callback_context);
+*   `void(*onscroll)(SbUiNavItem item, void *callback_context)`
 
     Invoke when an item's content offset is changed. This is only used with
     container items.
@@ -90,33 +84,25 @@
 
 #### Members ####
 
-*   ` create_item`
-
-    SbUiNavItem (\*create_item)(SbUiNavItemType type, const SbUiNavCallbacks \*
-    callbacks, void\* callback_context);
+*   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
+    *callbacks, void *callback_context)`
 
     Create a new navigation item. When the user interacts with this item the
     appropriate SbUiNavCallbacks function will be invoked with the provided
     `callback_context`. An item is not interactable until it is enabled.
-*   ` destroy_item`
-
-    void (\*destroy_item)(SbUiNavItem item);
+*   `void(*destroy_item)(SbUiNavItem item)`
 
     Destroy the given navigation item. If this is a content of another item,
     then it will first be unregistered. Additionally, if this item contains
     other items, then those will be unregistered as well, but they will not be
     automatically destroyed.
-*   ` set_focus`
-
-    void (\*set_focus)(SbUiNavItem item);
+*   `void(*set_focus)(SbUiNavItem item)`
 
     This is used to manually force focus on a navigation item of type
     kSbUiNavItemTypeFocus. Any previously focused navigation item should receive
     the blur event. If the item is not transitively a content of the root item,
     then this does nothing.
-*   ` set_item_enabled`
-
-    void (\*set_item_enabled)(SbUiNavItem item, bool enabled);
+*   `void(*set_item_enabled)(SbUiNavItem item, bool enabled)`
 
     This is used to enable or disable user interaction with the specified
     navigation item. All navigation items are disabled when created, and they
@@ -125,33 +111,25 @@
     remain enabled. If `enabled` is false, it must be guaranteed that once this
     function returns, no callbacks associated with this item will be invoked
     until the item is re-enabled.
-*   ` set_item_dir`
-
-    void (\*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir);
+*   `void(*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir)`
 
     This specifies directionality for container items. Containers within
     containers do not inherit directionality. Directionality must be specified
     for each container explicitly.
-*   ` set_item_size`
-
-    void (\*set_item_size)(SbUiNavItem item, float width, float height);
+*   `void(*set_item_size)(SbUiNavItem item, float width, float height)`
 
     Set the interactable size of the specified navigation item. By default, an
     item's size is (0,0).
-*   ` set_item_transform`
-
-    void (\*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3 \*
-    transform);
+*   `void(*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3
+    *transform)`
 
     Set the transform for the navigation item and its contents if the item is a
     container. This specifies the placement of the item's center within its
     container. The transform origin is the center of the item. Distance is
     measured in pixels with the origin being the top-left of the item's
     container. By default, an item's transform is identity.
-*   ` get_item_focus_transform`
-
-    bool (\*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4 \*
-    out_transform);
+*   `bool(*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4
+    *out_transform)`
 
     Retrieve the focus transform matrix for the navigation item. The UI engine
     may translate, rotate, and/or tilt focus items to reflect user interaction.
@@ -159,10 +137,7 @@
     position inside its container. The transform origin is the center of the
     item. Return false if the item position should not be changed (i.e. the
     transform should be treated as identity).
-*   ` get_item_focus_vector`
-
-    bool (\*get_item_focus_vector)(SbUiNavItem item, float\* out_x, float\*
-    out_y);
+*   `bool(*get_item_focus_vector)(SbUiNavItem item, float *out_x, float *out_y)`
 
     Retrieve a vector representing the focus location within a focused item.
     This is used to provide feedback about user input that is too small to
@@ -171,19 +146,15 @@
     return true and set the output values in the range of [-1, +1] with (out_x,
     out_y) of (-1, -1) being the top-left corner of the navigation item and (0,
     0) being the center.
-*   ` set_item_container_window`
-
-    void (\*set_item_container_window)(SbUiNavItem item, SbWindow window);
+*   `void(*set_item_container_window)(SbUiNavItem item, SbWindow window)`
 
     This attaches the given navigation item (which must be a container) to the
     specified window. Navigation items are only interactable if they are
-    transitively attached to a window.
-
-    A navigation item may only have a SbUiNavItem or SbWindow as its direct
-    container. The navigation item hierarchy is established using
-    set_item_container_item() with the root container attached to a SbWindow
-    using set_item_container_window() to enable interaction with all enabled
-    items in the hierarchy.
+    transitively attached to a window.A navigation item may only have a
+    SbUiNavItem or SbWindow as its direct container. The navigation item
+    hierarchy is established using set_item_container_item() with the root
+    container attached to a SbWindow using set_item_container_window() to enable
+    interaction with all enabled items in the hierarchy.
 
     If `item` is already registered with a different window, then this will
     unregister it from that window then attach it to the given `window`. It is
@@ -191,14 +162,12 @@
     `window` is kSbWindowInvalid, then this will unregister the `item` from its
     current window if any. Upon destruction of `item` or `window`, the `item` is
     automatically unregistered from the `window`.
-*   ` set_item_container_item`
-
-    void (\*set_item_container_item)(SbUiNavItem item, SbUiNavItem container);
+*   `void(*set_item_container_item)(SbUiNavItem item, SbUiNavItem container)`
 
     A container navigation item may contain other navigation items. However, it
     is an error to have circular containment or for `container` to not be of
     type kSbUiNavItemTypeContainer. If `item` already has a different container,
-    then this first severs that connection. If `container` is
+    then this first serves that connection. If `container` is
     kSbUiNavItemInvalid, then this removes `item` from its current container.
     Upon destruction of `item` or `container`, the `item` is automatically
     removed from the `container`.
@@ -217,10 +186,8 @@
 
     Essentially, content items should be drawn at: [container position] +
     [content position] - [container content offset]
-*   ` set_item_content_offset`
-
-    void (\*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
-    float content_offset_y);
+*   `void(*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
+    float content_offset_y)`
 
     Set the current content offset for the given container. This may be used to
     force scrolling to make certain content items visible. A container item's
@@ -228,10 +195,8 @@
     Essentially, a content item should be drawn at: [container position] +
     [content position] - [container content offset] If `item` is not a
     container, then this does nothing. By default, the content offset is (0,0).
-*   ` get_item_content_offset`
-
-    void (\*get_item_content_offset)(SbUiNavItem item, float\*
-    out_content_offset_x, float\* out_content_offset_y);
+*   `void(*get_item_content_offset)(SbUiNavItem item, float
+    *out_content_offset_x, float *out_content_offset_y)`
 
     Retrieve the current content offset for the navigation item. If `item` is
     not a container, then the content offset is (0,0).
@@ -242,22 +207,32 @@
 directionality is not specified for a container, it should default to left-to-
 right and top-to-bottom.
 
-For left-to-right, content offset x = 0 shows the leftmost content. `< –
-Container Size-->` +----------------- – +----------------- – +-----------------
-– + ` Not selectable. ` Selectable. ` Selectable. ` ` Offscreen. ` Onscreen. `
-Offscreen. ` ` Negative position. ` Positive position. ` Positive position. `
-+----------------- – +----------------- – +----------------- – + ^ Content
-Offset X = 0.
+```
+///   For left-to-right, content offset x = 0 shows the leftmost content.
+///                          |<--Container Size-->|
+///     +--------------------+--------------------+--------------------+
+///     | Not selectable.    | Selectable.        | Selectable.        |
+///     | Offscreen.         | Onscreen.          | Offscreen.         |
+///     | Negative position. | Positive position. | Positive position. |
+///     +--------------------+--------------------+--------------------+
+///                          ^
+///                  Content Offset X = 0.
+///
+///   For right-to-left, content offset x = 0 shows the rightmost content.
+///                          |<--Container Size-->|
+///     +--------------------+--------------------+--------------------+
+///     | Selectable.        | Selectable.        | Not selectable.    |
+///     | Offscreen.         | Onscreen.          | Offscreen.         |
+///     | Negative position. | Positive position. | Positive position. |
+///     +--------------------+--------------------+--------------------+
+///                          ^
+///                  Content Offset X = 0. 
+```
 
-For right-to-left, content offset x = 0 shows the rightmost content. `< –
-Container Size-->` +----------------- – +----------------- – +-----------------
-– + ` Selectable. ` Selectable. ` Not selectable. ` ` Offscreen. ` Onscreen. `
-Offscreen. ` ` Negative position. ` Positive position. ` Positive position. `
-+----------------- – +----------------- – +----------------- – + ^ Content
-Offset X = 0.
-
-Top-to-bottom is similar to left-to-right, but for the Y position. Bottom-to-top
-is similar to right-to-left, but for the Y position.
+```
+  Top-to-bottom is similar to left-to-right, but for the Y position.
+  Bottom-to-top is similar to right-to-left, but for the Y position.
+```
 
 #### Members ####
 
@@ -266,7 +241,12 @@
 
 ### SbUiNavMatrix2x3 ###
 
-This represents a 2x3 transform matrix in row-major order. ` a b tx ` ` c d ty `
+This represents a 2x3 transform matrix in row-major order.
+
+```
+///   | a b tx |
+///   | c d ty | 
+```
 
 #### Members ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/accessibility.md b/src/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
similarity index 99%
rename from src/cobalt/site/docs/reference/starboard/modules/10/accessibility.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
index 1a5adcb..a6c8460 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/accessibility.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
@@ -251,3 +251,4 @@
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/atomic.md b/src/cobalt/site/docs/reference/starboard/modules/13/atomic.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/atomic.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/atomic.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md b/src/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md
similarity index 83%
rename from src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md
index 47b12ed..8cf2329 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/audio_sink.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md
@@ -27,15 +27,12 @@
 ### SbAudioSinkConsumeFramesFunc ###
 
 Callback used to report frames consumed. The consumed frames will be removed
-from the source frame buffer to free space for new audio frames. When
-`frames_consumed` is updated asynchnously and the last time that it has been
-updated is known, it can be passed in `frames_consumed_at` so the audio time
-calculating can be more accurate.
+from the source frame buffer to free space for new audio frames.
 
 #### Definition ####
 
 ```
-typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, SbTime frames_consumed_at, void *context)
+typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, void *context)
 ```
 
 ### SbAudioSinkFrameBuffers ###
@@ -105,6 +102,25 @@
 int SbAudioSinkGetMaxChannels()
 ```
 
+### SbAudioSinkGetMinBufferSizeInFrames ###
+
+Returns the minimum frames required by audio sink to play without underflows.
+Returns -1, if `channels`, `sample_type` or `sampling_frequency_hz` is not
+supported. It's user's responsibility to ensure that there're enough frames
+written into audio sink during playing, or it may have underflows.
+
+`channels`: The number of audio channels, such as left and right channels in
+stereo audio. `audio_sample_type`: The type of each sample of the audio data –
+`int16`, `float32`, etc. `sampling_frequency_hz`: The sample frequency of the
+audio data being streamed. For example, 22,000 Hz means 22,000 sample elements
+represents one second of audio data.
+
+#### Declaration ####
+
+```
+int SbAudioSinkGetMinBufferSizeInFrames(int channels, SbMediaAudioSampleType sample_type, int sampling_frequency_hz)
+```
+
 ### SbAudioSinkGetNearestSupportedSampleFrequency ###
 
 Returns the supported sample rate closest to `sampling_frequency_hz`. On
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/byte_swap.md b/src/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/byte_swap.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/condition_variable.md b/src/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
similarity index 87%
rename from src/cobalt/site/docs/reference/starboard/modules/10/condition_variable.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
index 9fdcdb1..836c4b8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/condition_variable.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
@@ -5,6 +5,12 @@
 
 Defines an interface for condition variables.
 
+## Macros ##
+
+### SB_CONDITION_VARIABLE_MAX_SIZE ###
+
+Max size of the SbConditionVariable type.
+
 ## Enums ##
 
 ### SbConditionVariableResult ###
@@ -24,6 +30,19 @@
     The wait failed, either because a parameter wasn't valid, or the condition
     variable has already been destroyed, or something similar.
 
+## Typedefs ##
+
+### SbConditionVariable ###
+
+An opaque handle to a condition variable type with reserved memory buffer of
+size SB_CONDITION_VARIABLE_MAX_SIZE and aligned at void pointer type.
+
+#### Definition ####
+
+```
+typedef union SbConditionVariable  SbConditionVariable
+```
+
 ## Functions ##
 
 ### SbConditionVariableBroadcast ###
@@ -55,7 +74,7 @@
 
 ### SbConditionVariableDestroy ###
 
-Destroys the specified SbConditionVariable. The return value indicates whether
+Destroys the specified SbConditionVariable . The return value indicates whether
 the destruction was successful. The behavior is undefined if other threads are
 currently waiting on this condition variable.
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/13/configuration.md
similarity index 79%
rename from src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/configuration.md
index 848031a..4b2f8db 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/configuration.md
@@ -22,7 +22,7 @@
 
 ### SB_ALIGNOF(type) ###
 
-Returns the alignment reqiured for any instance of the type indicated by `type`.
+Returns the alignment required for any instance of the type indicated by `type`.
 
 ### SB_ARRAY_SIZE(array) ###
 
@@ -53,11 +53,6 @@
 SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for external
 clients, but not deprecated for starboard.
 
-### SB_DISALLOW_COPY_AND_ASSIGN(TypeName) ###
-
-A macro to disallow the copy constructor and operator= functions This should be
-used in the private: declarations for a class
-
 ### SB_EXPERIMENTAL_API_VERSION ###
 
 The API version that is currently open for changes, and therefore is not stable
@@ -97,13 +92,6 @@
 
 Determines at compile-time an inherent aspect of this platform.
 
-### SB_IS_LITTLE_ENDIAN ###
-
-Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above as
-SB_PREFERRED_RGBA_BYTE_ORDER_*. If your platform uses GLES, you should set this
-to SB_PREFERRED_RGBA_BYTE_ORDER_RGBA. Whether the current platform is little
-endian.
-
 ### SB_LIKELY(x) ###
 
 Macro for hinting that an expression is likely to be true.
@@ -144,23 +132,13 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RELEASE_CANDIDATE_API_VERSION ###
-
-The next API version to be frozen, but is still subject to emergency changes. It
-is reasonable to base a port on the Release Candidate API version, but be aware
-that small incompatible changes may still be made to it. The following will be
-uncommented when an API version is a release candidate.
-
 ### SB_RESTRICT ###
 
 Include the platform-specific configuration. This macro is set by GYP in
 starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations. After version 12, we start to use runtime constants instead
-of macros for certain platform dependent configurations. This file substitutes
-configuration macros for the corresponding runtime constants so we don't
-reference these constants when they aren't defined. Makes a pointer-typed
-parameter restricted so that the compiler can make certain optimizations because
-it knows the pointers are unique.
+all configurations.Makes a pointer-typed parameter restricted so that the
+compiler can make certain optimizations because it knows the pointers are
+unique.
 
 ### SB_SIZE_OF(DATATYPE) ###
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md b/src/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md
new file mode 100644
index 0000000..b380f62
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md
@@ -0,0 +1,145 @@
+---
+layout: doc
+title: "Starboard Module Reference: configuration_constants.h"
+---
+
+Declares all configuration variables we will need to use at runtime. These
+variables describe the current platform in detail to allow cobalt to make
+runtime decisions based on per platform configurations.
+
+## Variables ##
+
+### kSbDefaultMmapThreshold ###
+
+Determines the threshold of allocation size that should be done with mmap (if
+available), rather than allocated within the core heap.
+
+### kSbFileAltSepChar ###
+
+The current platform's alternate file path component separator character. This
+is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
+character, then you can place that here. For example, on windows machines, the
+primary separator character is probably '\', but the alternate is '/'.
+
+### kSbFileAltSepString ###
+
+The string form of SB_FILE_ALT_SEP_CHAR.
+
+### kSbFileMaxName ###
+
+The current platform's maximum length of the name of a single directory entry,
+not including the absolute path.
+
+### kSbFileMaxOpen ###
+
+The current platform's maximum number of files that can be opened at the same
+time by one process.
+
+### kSbFileMaxPath ###
+
+The current platform's maximum length of an absolute path.
+
+### kSbFileSepChar ###
+
+The current platform's file path component separator character. This is the
+character that appears after a directory in a file path. For example, the
+absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
+component separator character.
+
+### kSbFileSepString ###
+
+The string form of SB_FILE_SEP_CHAR.
+
+### kSbHasAc3Audio ###
+
+Allow ac3 and ec3 support
+
+### kSbHasMediaWebmVp9Support ###
+
+Specifies whether this platform has webm/vp9 support. This should be set to non-
+zero on platforms with webm/vp9 support.
+
+### kSbHasThreadPrioritySupport ###
+
+Whether the current platform supports thread priorities.
+
+### kSbMallocAlignment ###
+
+Determines the alignment that allocations should have on this platform.
+
+### kSbMaxThreadLocalKeys ###
+
+The maximum number of thread local storage keys supported by this platform. This
+comes from _POSIX_THREAD_KEYS_MAX. The value of PTHREAD_KEYS_MAX is higher, but
+unit tests show that the implementation doesn't support nearly as many keys.
+
+### kSbMaxThreadNameLength ###
+
+The maximum length of the name for a thread, including the NULL-terminator.
+
+### kSbMaxThreads ###
+
+Defines the maximum number of simultaneous threads for this platform. Some
+platforms require sharing thread handles with other kinds of system handles,
+like mutexes, so we want to keep this manageable.
+
+### kSbMediaMaxAudioBitrateInBitsPerSecond ###
+
+The maximum audio bitrate the platform can decode. The following value equals to
+5M bytes per seconds which is more than enough for compressed audio.
+
+### kSbMediaMaxVideoBitrateInBitsPerSecond ###
+
+The maximum video bitrate the platform can decode. The following value equals to
+8M bytes per seconds which is more than enough for compressed video.
+
+### kSbMediaVideoFrameAlignment ###
+
+Specifies how video frame buffers must be aligned on this platform.
+
+### kSbMemoryLogPath ###
+
+Defines the path where memory debugging logs should be written to.
+
+### kSbMemoryPageSize ###
+
+The memory page size, which controls the size of chunks on memory that
+allocators deal with, and the alignment of those chunks. This doesn't have to be
+the hardware-defined physical page size, but it should be a multiple of it.
+
+### kSbNetworkReceiveBufferSize ###
+
+Specifies the network receive buffer size in bytes, set via
+SbSocketSetReceiveBufferSize().
+
+Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should not be
+called. Use this for OSs (such as Linux) where receive buffer auto-tuning is
+better.
+
+On some platforms, this may affect max TCP window size which may dramatically
+affect throughput in the presence of latency.
+
+If your platform does not have a good TCP auto-tuning mechanism, a setting of
+(128 * 1024) here is recommended.
+
+### kSbPathSepChar ###
+
+The current platform's search path component separator character. When
+specifying an ordered list of absolute paths of directories to search for a
+given reason, this is the character that appears between entries. For example,
+the search path of "/etc/search/first:/etc/search/second" uses ':' as a search
+path component separator character.
+
+### kSbPathSepString ###
+
+The string form of SB_PATH_SEP_CHAR.
+
+### kSbPreferredRgbaByteOrder ###
+
+Specifies the preferred byte order of color channels in a pixel. Refer to
+starboard/configuration.h for the possible values. EGL/GLES platforms should
+generally prefer a byte order of RGBA, regardless of endianness.
+
+### kSbUserMaxSignedIn ###
+
+The maximum number of users that can be signed in at the same time.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md b/src/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
new file mode 100644
index 0000000..ee12e71
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
@@ -0,0 +1,262 @@
+---
+layout: doc
+title: "Starboard Module Reference: cpu_features.h"
+---
+
+## Structs ##
+
+### SbCPUFeatures ###
+
+#### Members ####
+
+*   `SbCPUFeaturesArchitecture architecture`
+
+    Architecture of the processor.
+*   `const char * brand`
+
+    Processor brand string retrievable by CPUID or from /proc/cpuinfo under the
+    key "model name" or "Processor".
+*   `int32_t icache_line_size`
+
+    Processor cache line size in bytes of Level 1 instruction cache and data
+    cache. Queried by sysconf(_SC_LEVEL1_ICACHE_LINESIZE) and
+    sysconf(_SC_LEVEL1_DCACHE_LINESIZE), or from files /proc/cpuinfo,
+    /proc/self/auxv, or CPUID with CLFLUSH instruction.
+*   `int32_t dcache_line_size`
+*   `bool has_fpu`
+
+    Processor has floating-point unit on-chip.
+*   `uint32_t hwcap`
+
+    Bit-mask containing processor features flags. Queried by getauxval(AT_HWCAP)
+    if it is supported.
+*   `uint32_t hwcap2`
+
+    Similar to hwcap. Queried by getauxval(AT_HWCAP2) if it is supported.
+*   `SbCPUFeaturesARM arm`
+
+    Processor features specific to each architecture. Set the appropriate
+    `SbCPUFeatures<ARCH_NAME>` for the underlying architecture. Set the other
+    `SbCPUFeatures<OTHER_ARCH>` to be invalid, meaning:
+
+    *   '-1' for signed integer fields
+
+    *   'false' for feature flag fields
+
+    *   '0' for feature flag bitmasks
+
+    *   empty string for string fields
+
+*   `SbCPUFeaturesMIPS mips_arch`
+
+    The reason that the "_arch" suffix exists for mips is because on some
+    platforms that use MIPS as the underlying architecture, "mips" is already
+    defined as a macro.
+*   `SbCPUFeaturesX86 x86`
+
+### SbCPUFeaturesARM ###
+
+#### Members ####
+
+*   `int16_t implementer`
+
+    Processor implementer/implementor code. ARM is 0x41, NVIDIA is 0x4e, etc.
+*   `int16_t variant`
+
+    Processor variant number, indicating the major revision number.
+*   `int16_t revision`
+
+    Processor revision number, indicating the minor revision number.
+*   `int16_t architecture_generation`
+
+    Processor architecture generation number, indicating the generations
+    (ARMv6-M, ARMv7, etc) within an architecture family. This field is called
+    "Architecture" or "Constant" in the processor ID register.
+*   `int16_t part`
+
+    Processor part number, indicating Cortex-M0, Cortex-A8, etc.
+*   `bool has_neon`
+
+    ARM Advanced SIMD (NEON) vector instruction set extension.
+*   `bool has_thumb2`
+
+    Thumb-2 mode.
+*   `bool has_vfp`
+
+    VFP (SIMD vector floating point instructions).
+*   `bool has_vfp3`
+
+    VFP version 3
+*   `bool has_vfp4`
+
+    VFP version 4
+*   `bool has_vfp3_d32`
+
+    VFP version 3 with 32 D-registers.
+*   `bool has_idiva`
+
+    SDIV and UDIV hardware division in ARM mode.
+*   `bool has_aes`
+
+    ###### Arm 64 feature flags  ######
+
+    AES instructions.
+*   `bool has_crc32`
+
+    CRC32 instructions.
+*   `bool has_sha1`
+
+    SHA-1 instructions.
+*   `bool has_sha2`
+
+    SHA-256 instructions.
+*   `bool has_pmull`
+
+    64-bit PMULL and PMULL2 instructions.
+
+### SbCPUFeaturesMIPS ###
+
+#### Members ####
+
+*   `bool has_msa`
+
+    MIPS SIMD Architecture (MSA).
+
+### SbCPUFeaturesX86 ###
+
+#### Members ####
+
+*   `const char * vendor`
+
+    Processor vendor ID string, e.g. "GenuineIntel", "AuthenticAMD", etc
+*   `int16_t family`
+
+    Processor family ID
+*   `int16_t ext_family`
+
+    Processor extended family ID, needs to be examined only when the family ID
+    is 0FH.
+*   `int16_t model`
+
+    Processor model ID
+*   `int16_t ext_model`
+
+    Processor extended model ID, needs to be examined only when the family ID is
+    06H or 0FH.
+*   `int16_t stepping`
+
+    Processor stepping ID, a product revision number
+*   `int16_t type`
+
+    Processor type ID
+*   `int32_t signature`
+
+    A raw form of collection of processor stepping, model, and family
+    information
+*   `bool has_cmov`
+
+    Conditional Move Instructions (plus FCMOVcc, FCOMI with FPU).
+*   `bool has_mmx`
+
+    Multimedia extensions.
+*   `bool has_sse`
+
+    SSE (Streaming SIMD Extensions).
+*   `bool has_sse2`
+
+    SSE2 extensions.
+*   `bool has_tsc`
+
+    Time Stamp Counter.
+*   `bool has_sse3`
+
+    SSE3 extensions.
+*   `bool has_pclmulqdq`
+
+    PCLMULQDQ instruction.
+*   `bool has_ssse3`
+
+    Supplemental SSE3 extensions.
+*   `bool has_sse41`
+
+    SSE-4.1 extensions.
+*   `bool has_sse42`
+
+    SSE-4.2 extensions.
+*   `bool has_movbe`
+
+    MOVBE instruction.
+*   `bool has_popcnt`
+
+    POPCNT instruction.
+*   `bool has_osxsave`
+
+    XSAVE/XRSTOR/XGETBV/XSETBV instruction enabled in this OS.
+*   `bool has_avx`
+
+    AVX (Advanced Vector Extensions).
+*   `bool has_f16c`
+
+    16-bit FP conversions.
+*   `bool has_fma3`
+
+    Fused multiply-add.
+*   `bool has_aesni`
+
+    AES new instructions (AES-NI).
+*   `bool has_avx2`
+
+    AVX2 Extensions.
+*   `bool has_avx512f`
+
+    AVX-512 Foundation.
+*   `bool has_avx512dq`
+
+    AVX-512 DQ (Double/Quad granular) Instructions.
+*   `bool has_avx512ifma`
+
+    AVX-512 Integer Fused Multiply-Add instructions.
+*   `bool has_avx512pf`
+
+    AVX-512 Prefetch.
+*   `bool has_avx512er`
+
+    AVX-512 Exponential and Reciprocal.
+*   `bool has_avx512cd`
+
+    AVX-512 Conflict Detection.
+*   `bool has_avx512bw`
+
+    AVX-512 BW (Byte/Word granular) Instructions.
+*   `bool has_avx512vl`
+
+    AVX-512 VL (128/256 Vector Length) Extensions.
+*   `bool has_bmi1`
+
+    First group of bit manipulation extensions.
+*   `bool has_bmi2`
+
+    Second group of bit manipulation extensions.
+*   `bool has_lzcnt`
+
+    Bit manipulation instruction LZCNT.
+*   `bool has_sahf`
+
+    SAHF in long mode.
+
+## Functions ##
+
+### SbCPUFeaturesGet ###
+
+Retrieve the underlying CPU features and place it in `features`, which must not
+be NULL.
+
+If this function returns false, it means the CPU architecture is unknown and all
+fields in `features` are invalid.
+
+#### Declaration ####
+
+```
+bool SbCPUFeaturesGet(SbCPUFeatures *features)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md b/src/cobalt/site/docs/reference/starboard/modules/13/decode_target.md
similarity index 95%
rename from src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/decode_target.md
index d640306..852af38 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/decode_target.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/decode_target.md
@@ -12,7 +12,8 @@
 data. This allows the application to allocate fast graphics memory, and have
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
-SbDecodeTargetFormat
+
+## SbDecodeTargetFormat ##
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -20,7 +21,8 @@
 the SbDecodeTargetFormat passed into it, or the decode will produce an error.
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
-SbDecodeTargetGraphicsContextProvider
+
+## SbDecodeTargetGraphicsContextProvider ##
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -34,7 +36,8 @@
 
 The primary usage is likely to be the the SbPlayer implementation on some
 platforms.
-SbDecodeTarget Example
+
+## SbDecodeTarget Example ##
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -71,11 +74,10 @@
 
 // If the decode works, you can get the texture out and render it.
 SbDecodeTargetInfo info;
-SbMemorySet(&info, 0, sizeof(info));
+memset(&info, 0, sizeof(info));
 SbDecodeTargetGetInfo(target, &info);
 GLuint texture =
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
-
 ```
 
 ## Macros ##
@@ -118,8 +120,8 @@
     order.
 *   `kSbDecodeTargetFormat1PlaneUYVY`
 
-    A decoder target format consisting of a single plane with pixels layed out
-    in the format UYVY. Since there are two Y values per sample, but only one U
+    A decoder target format consisting of a single plane with pixels laid out in
+    the format UYVY. Since there are two Y values per sample, but only one U
     value and only one V value, horizontally the Y resolution is twice the size
     of both the U and V resolutions. Vertically, they Y, U and V all have the
     same resolution. This is a YUV 422 format. When using this format with GL
@@ -206,10 +208,6 @@
 
 #### Members ####
 
-*   `SbBlitterDevice device`
-
-    The SbBlitterDevice object that will be used to render any produced
-    SbDecodeTargets.
 *   `void * egl_display`
 
     A reference to the EGLDisplay object that hosts the EGLContext that will be
@@ -271,13 +269,15 @@
 
 #### Members ####
 
-*   `int left`
+*   `float left`
 
-    These integer values are assumed to be in units of pixels, within the
-    texture's width and height.
-*   `int top`
-*   `int right`
-*   `int bottom`
+    If the texture (width, height) is set to (1, 1), then these values will be
+    interpreted as normalized coordinates, and depending on the platform (for
+    example GLES 2.0 provides no method of obtaining the texture width/height)
+    this may be more natural than specifying absolute pixel offsets.
+*   `float top`
+*   `float right`
+*   `float bottom`
 
 ### SbDecodeTargetInfoPlane ###
 
@@ -285,9 +285,6 @@
 
 #### Members ####
 
-*   `SbBlitterSurface surface`
-
-    A handle to the Blitter surface that can be used for rendering.
 *   `uint32_t texture`
 
     A handle to the GL texture that can be used for rendering.
@@ -397,3 +394,4 @@
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/directory.md b/src/cobalt/site/docs/reference/starboard/modules/13/directory.md
similarity index 84%
rename from src/cobalt/site/docs/reference/starboard/modules/10/directory.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/directory.md
index 2ec9cca..d46c9a1 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/directory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/directory.md
@@ -23,18 +23,6 @@
 typedef struct SbDirectoryPrivate* SbDirectory
 ```
 
-## Structs ##
-
-### SbDirectoryEntry ###
-
-Represents a directory entry.
-
-#### Members ####
-
-*   `char name`
-
-    The name of this directory entry.
-
 ## Functions ##
 
 ### SbDirectoryCanOpen ###
@@ -86,15 +74,19 @@
 in the directory stream.
 
 This function returns `true` if there was a next directory, and `false` at the
-end of the directory stream.
+end of the directory stream or if `out_entry_size` is smaller than
+kSbFileMaxName.
 
 `directory`: The directory stream from which to retrieve the next directory.
-`out_entry`: The variable to be populated with the next directory entry.
+`out_entry`: The null terminated string to be populated with the next directory
+entry. The space allocated for this string should be equal to `out_entry_size`.
+`out_entry_size`: The size of the space allocated for `out_entry`. This should
+be at least equal to kSbFileMaxName.
 
 #### Declaration ####
 
 ```
-bool SbDirectoryGetNext(SbDirectory directory, SbDirectoryEntry *out_entry)
+bool SbDirectoryGetNext(SbDirectory directory, char *out_entry, size_t out_entry_size)
 ```
 
 ### SbDirectoryIsValid ###
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/drm.md b/src/cobalt/site/docs/reference/starboard/modules/13/drm.md
similarity index 86%
rename from src/cobalt/site/docs/reference/starboard/modules/10/drm.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/drm.md
index 9e40e05..beb65c9 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/drm.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/drm.md
@@ -18,6 +18,15 @@
 
 ## Enums ##
 
+### SbDrmEncryptionScheme ###
+
+Encryption scheme of the input sample, as defined in ISO/IEC 23001 part 7.
+
+#### Values ####
+
+*   `kSbDrmEncryptionSchemeAesCtr`
+*   `kSbDrmEncryptionSchemeAesCbc`
+
 ### SbDrmKeyStatus ###
 
 Status of a particular media key. [https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus](https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus)
@@ -149,7 +158,7 @@
 
 ### SbDrmSystem ###
 
-A handle to a DRM system which can be used with either an SbDecoder or a
+A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
 #### Definition ####
@@ -160,6 +169,15 @@
 
 ## Structs ##
 
+### SbDrmEncryptionPattern ###
+
+Encryption pattern of the input sample, as defined in ISO/IEC 23001 part 7.
+
+#### Members ####
+
+*   `uint32_t crypt_byte_block`
+*   `uint32_t skip_byte_block`
+
 ### SbDrmKeyId ###
 
 #### Members ####
@@ -176,6 +194,12 @@
 
 #### Members ####
 
+*   `SbDrmEncryptionScheme encryption_scheme`
+
+    The encryption scheme of this sample.
+*   `SbDrmEncryptionPattern encryption_pattern`
+
+    The encryption pattern of this sample.
 *   `uint8_t initialization_vector`
 
     The Initialization Vector needed to decrypt this sample.
@@ -276,6 +300,36 @@
 void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
 ```
 
+### SbDrmGetMetrics ###
+
+Get the metrics of the underlying drm system.
+
+When it is called on an implementation that supports drm system metrics, it
+should return a pointer containing the metrics as a blob, encoded using url safe
+base64 without padding and line wrapping, with the size of the encoded result in
+`size` on return. For example, on Android API level 28 or later, it should
+return the result of MediaDrm.getPropertyByteArray("metrics"), encoded using url
+safe base64 without padding and line wrapping. On systems using Widevine CE CDM
+with oemcrypto 16 or later, it should return the metrics retrieved via
+Cdm::getMetrics(), encoded using url safe base64 without padding and line
+wrapping. The returned pointer should remain valid and its content should remain
+unmodified until the next time this function is called on the associated
+`drm_system` or the `drm_system` is destroyed.
+
+When the metrics is empty on supported system, it should return a non-null
+pointer with `size` set to 0.
+
+It should return NULL when there is no metrics support in the underlying drm
+system, or when the drm system implementation fails to retrieve the metrics.
+
+The caller will never set `size` to NULL.
+
+#### Declaration ####
+
+```
+const void* SbDrmGetMetrics(SbDrmSystem drm_system, int *size)
+```
+
 ### SbDrmIsServerCertificateUpdatable ###
 
 Returns true if server certificate of `drm_system` can be updated via
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/egl.md b/src/cobalt/site/docs/reference/starboard/modules/13/egl.md
new file mode 100644
index 0000000..b1e120b
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/egl.md
@@ -0,0 +1,147 @@
+---
+layout: doc
+title: "Starboard Module Reference: egl.h"
+---
+
+The EGL API provides an interface with accompanying type declarations and
+defines that together provide a single consistent method of EGL usage across
+platforms.
+
+This API is designed to abstract the differences between EGL implementations and
+versions on different systems, and to remove the requirement for any other code
+to directly pull in and use these system libraries.
+
+## EGL Version ##
+
+This API has the ability to support EGL 1.5, however it is not required to
+support anything beyond EGL 1.4. The user is responsible for ensuring that the
+functions from EGL 1.5 they are calling from the interface are valid.
+
+## Macros ##
+
+### SB_EGL_ALPHA_FORMAT ###
+
+EGL_VERSION_1_2
+
+### SB_EGL_ALPHA_SIZE ###
+
+EGL_VERSION_1_0
+
+### SB_EGL_BACK_BUFFER ###
+
+EGL_VERSION_1_1
+
+### SB_EGL_CONFORMANT ###
+
+EGL_VERSION_1_3
+
+### SB_EGL_CONTEXT_MAJOR_VERSION ###
+
+EGL_VERSION_1_5
+
+### SB_EGL_DEFAULT_DISPLAY ###
+
+EGL_VERSION_1_4
+
+## Typedefs ##
+
+### SbEglCastsToProperFunctionPointerType ###
+
+The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/egl.h](https://www.khronos.org/registry/EGL/api/EGL/egl.h)
+.
+
+#### Definition ####
+
+```
+typedef void(* SbEglCastsToProperFunctionPointerType) (void)
+```
+
+### SbEglInt32 ###
+
+The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h](https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h)
+.
+
+#### Definition ####
+
+```
+typedef int32_t SbEglInt32
+```
+
+## Structs ##
+
+### SbEglInterface ###
+
+#### Members ####
+
+*   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
+    *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
+    *num_config)`
+*   `SbEglBoolean(*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target)`
+*   `SbEglContext(*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativePixmapType pixmap, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativeWindowType win, const SbEglInt32 *attrib_list)`
+*   `SbEglBoolean(*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx)`
+*   `SbEglBoolean(*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig *configs,
+    SbEglInt32 config_size, SbEglInt32 *num_config)`
+*   `SbEglDisplay(*eglGetCurrentDisplay)(void)`
+*   `SbEglSurface(*eglGetCurrentSurface)(SbEglInt32 readdraw)`
+*   `SbEglDisplay(*eglGetDisplay)(SbEglNativeDisplayType display_id)`
+*   `SbEglInt32(*eglGetError)(void)`
+*   `SbEglCastsToProperFunctionPointerType(*eglGetProcAddress)(const char
+    *procname)`
+*   `SbEglBoolean(*eglInitialize)(SbEglDisplay dpy, SbEglInt32 *major,
+    SbEglInt32 *minor)`
+*   `SbEglBoolean(*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx)`
+*   `SbEglBoolean(*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `const char *(*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name)`
+*   `SbEglBoolean(*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglTerminate)(SbEglDisplay dpy)`
+*   `SbEglBoolean(*eglWaitGL)(void)`
+*   `SbEglBoolean(*eglWaitNative)(SbEglInt32 engine)`
+*   `SbEglBoolean(*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value)`
+*   `SbEglBoolean(*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval)`
+*   `SbEglBoolean(*eglBindAPI)(SbEglEnum api)`
+*   `SbEglEnum(*eglQueryAPI)(void)`
+*   `SbEglSurface(*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy, SbEglEnum
+    buftype, SbEglClientBuffer buffer, SbEglConfig config, const SbEglInt32
+    *attrib_list)`
+*   `SbEglBoolean(*eglReleaseThread)(void)`
+*   `SbEglBoolean(*eglWaitClient)(void)`
+*   `SbEglContext(*eglGetCurrentContext)(void)`
+*   `SbEglSync(*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync)`
+*   `SbEglInt32(*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags, SbEglTime timeout)`
+*   `SbEglBoolean(*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib *value)`
+*   `SbEglImage(*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image)`
+*   `SbEglDisplay(*eglGetPlatformDisplay)(SbEglEnum platform, void
+    *native_display, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_window, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_pixmap, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags)`
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/event.md b/src/cobalt/site/docs/reference/starboard/modules/13/event.md
new file mode 100644
index 0000000..601e343
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/event.md
@@ -0,0 +1,478 @@
+---
+layout: doc
+title: "Starboard Module Reference: event.h"
+---
+
+For SB_API_VERSION >= 13
+
+Module Overview: Starboard Event module
+
+Defines the event system that wraps the Starboard main loop and entry point.
+
+## The Starboard Application Lifecycle ##
+
+```
+               * ----------
+               |           |
+             Start         |
+               |           |
+               V           |
+         [===========]     |
+    ---> [  STARTED  ]     |
+   |     [===========]     |
+   |           |           |
+ Focus       Blur      Preload
+   |           |           |
+   |           V           |
+    ---- [===========]     |
+    ---> [  BLURRED  ]     |
+   |     [===========]     |
+   |           |           |
+ Reveal     Conceal        |
+   |           |           |
+   |           V           |
+   |     [===========]     |
+    ---- [ CONCEALED ] <---
+    ---> [===========]
+   |           |
+Unfreeze     Freeze
+   |           |
+   |           V
+   |     [===========]
+    ---- [  FROZEN   ]
+         [===========]
+               |
+              Stop
+               |
+               V
+         [===========]
+         [  STOPPED  ]
+         [===========]
+
+```
+
+The first event that a Starboard application receives is either `Start`
+(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
+application in the `STARTED` state, whereas `Preload` puts the application in
+the `CONCEALED` state.
+
+In the `STARTED` state, the application is in the foreground and can expect to
+do all of the normal things it might want to do. Once in the `STARTED` state, it
+may receive a `Blur` event, putting the application into the `BLURRED` state.
+
+In the `BLURRED` state, the application is still visible, but has lost focus, or
+it is partially obscured by a modal dialog, or it is on its way to being shut
+down. The application should blur activity in this state. In this state, it can
+receive `Focus` to be brought back to the foreground state (`STARTED`), or
+`Conceal` to be pushed to the `CONCEALED` state.
+
+In the `CONCEALED` state, the application should behave as it should for an
+invisible program that can still run, and that can optionally access the network
+and playback audio, albeit potentially will have less CPU and memory available.
+The application may get switched from `CONCEALED` to `FROZEN` at any time, when
+the platform decides to do so.
+
+In the `FROZEN` state, the application is not visible. It should immediately
+release all graphics and video resources, and shut down all background activity
+(timers, rendering, etc). Additionally, the application should flush storage to
+ensure that if the application is killed, the storage will be up-to-date. The
+application may be killed at this point, but will ideally receive a `Stop` event
+for a more graceful shutdown.
+
+Note that the application is always expected to transition through `BLURRED`,
+`CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
+
+For SB_API_VERSION < 13
+
+Module Overview: Starboard Event module
+
+Defines the event system that wraps the Starboard main loop and entry point.
+
+## The Starboard Application Lifecycle ##
+
+```
+    ---------- *
+   |           |
+   |        Preload
+   |           |
+   |           V
+ Start   [ PRELOADING ] ------------
+   |           |                    |
+   |         Start                  |
+   |           |                    |
+   |           V                    |
+    ----> [ STARTED ] <----         |
+               |           |        |
+             Pause       Unpause    |
+               |           |     Suspend
+               V           |        |
+    -----> [ PAUSED ] -----         |
+   |           |                    |
+Resume      Suspend                 |
+   |           |                    |
+   |           V                    |
+    ---- [ SUSPENDED ] <------------
+               |
+              Stop
+               |
+               V
+          [ STOPPED ]
+
+```
+
+The first event that a Starboard application receives is either `Start`
+(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
+application in the `STARTED` state, whereas `Preload` puts the application in
+the `PRELOADING` state.
+
+`PRELOADING` can only happen as the first application state. In this state, the
+application should start and run as normal, but will not receive any input, and
+should not try to initialize graphics resources (via GL or `SbBlitter`). In
+`PRELOADING`, the application can receive `Start` or `Suspend` events. `Start`
+will receive the same data that was passed into `Preload`.
+
+In the `STARTED` state, the application is in the foreground and can expect to
+do all of the normal things it might want to do. Once in the `STARTED` state, it
+may receive a `Pause` event, putting the application into the `PAUSED` state.
+
+In the `PAUSED` state, the application is still visible, but has lost focus, or
+it is partially obscured by a modal dialog, or it is on its way to being shut
+down. The application should pause activity in this state. In this state, it can
+receive `Unpause` to be brought back to the foreground state (`STARTED`), or
+`Suspend` to be pushed further in the background to the `SUSPENDED` state.
+
+In the `SUSPENDED` state, the application is generally not visible. It should
+immediately release all graphics and video resources, and shut down all
+background activity (timers, rendering, etc). Additionally, the application
+should flush storage to ensure that if the application is killed, the storage
+will be up-to-date. The application may be killed at this point, but will
+ideally receive a `Stop` event for a more graceful shutdown.
+
+Note that the application is always expected to transition through `PAUSED` to
+`SUSPENDED` before receiving `Stop` or being killed.
+
+## Enums ##
+
+### SbEventType ###
+
+An enumeration of all possible event types dispatched directly by the system.
+Each event is accompanied by a void* data argument, and each event must define
+the type of the value pointed to by that data argument, if any.
+
+#### Values ####
+
+*   `kSbEventTypePreload`
+
+    The system may send `kSbEventTypePreload` in `UNSTARTED` if it wants to push
+    the app into a lower resource consumption state. Applications will also call
+    SbSystemRequestConceal() when they request this. The only events that should
+    be dispatched after a Preload event are Reveal or Freeze. No data argument.
+*   `kSbEventTypeStart`
+
+    The first event that an application receives on startup when starting
+    normally. Applications should perform initialization, start running, and
+    prepare to react to subsequent events. Applications that wish to run and
+    then exit must call `SbSystemRequestStop()` to terminate. This event will
+    only be sent once for a given process launch. `SbEventStartData` is passed
+    as the data argument.
+*   `kSbEventTypeBlur`
+
+    A dialog will be raised or the application will otherwise be put into a
+    background-but-visible or partially-obscured state (BLURRED). Graphics and
+    video resources will still be available, but the application could pause
+    foreground activity like animations and video playback. Can only be received
+    after a Start event. The only events that should be dispatched after a Blur
+    event are Focus or Conceal. No data argument.
+*   `kSbEventTypeFocus`
+
+    The application is returning to the foreground (STARTED) after having been
+    put in the BLURRED (e.g. partially-obscured) state. The application should
+    resume foreground activity like animations and video playback. Can only be
+    received after a Blur or Reveal event. No data argument.
+*   `kSbEventTypeConceal`
+
+    The operating system will put the application into the Concealed state after
+    this event is handled. The application is expected to be made invisible, but
+    background tasks can still be running, such as audio playback, or updating
+    of recommendations. Can only be received after a Blur or Reveal event. The
+    only events that should be dispatched after a Conceal event are Freeze or
+    Reveal. On some platforms, the process may also be killed after Conceal
+    without a Freeze event.
+*   `kSbEventTypeReveal`
+
+    The operating system will restore the application to the BLURRED state from
+    the CONCEALED state. This is the first event the application will receive
+    coming out of CONCEALED, and it can be received after a Conceal or Unfreeze
+    event. The application will now be in the BLURRED state. No data argument.
+*   `kSbEventTypeFreeze`
+
+    The operating system will put the application into the Frozen state after
+    this event is handled. The application is expected to stop periodic
+    background work, release ALL graphics and video resources, and flush any
+    pending SbStorage writes. Some platforms will terminate the application if
+    work is done or resources are retained after freezing. Can be received after
+    a Conceal or Unfreeze event. The only events that should be dispatched after
+    a Freeze event are Unfreeze or Stop. On some platforms, the process may also
+    be killed after Freeze without a Stop event. No data argument.
+*   `kSbEventTypeUnfreeze`
+
+    The operating system has restored the application to the CONCEALED state
+    from the FROZEN state. This is the first event the application will receive
+    coming out of FROZEN, and it will only be received after a Freeze event. The
+    application will now be in the CONCEALED state. NO data argument.
+*   `kSbEventTypeStop`
+
+    The operating system will shut the application down entirely after this
+    event is handled. Can only be received after a Freeze event, in the FROZEN
+    state. No data argument.
+*   `kSbEventTypeInput`
+
+    A user input event, including keyboard, mouse, gesture, or something else.
+    SbInputData (from input.h) is passed as the data argument.
+*   `kSbEventTypeUser`
+
+    A user change event, which means a new user signed-in or signed-out, or the
+    current user changed. No data argument, call SbUserGetSignedIn() and
+    SbUserGetCurrent() to get the latest changes.
+*   `kSbEventTypeLink`
+
+    A navigational link has come from the system, and the application should
+    consider handling it by navigating to the corresponding application
+    location. The data argument is an application-specific, null-terminated
+    string.
+*   `kSbEventTypeVerticalSync`
+
+    The beginning of a vertical sync has been detected. This event is very
+    timing-sensitive, so as little work as possible should be done on the main
+    thread if the application wants to receive this event in a timely manner. No
+    data argument.
+*   `kSbEventTypeScheduled`
+
+    An event type reserved for scheduled callbacks. It will only be sent in
+    response to an application call to SbEventSchedule(), and it will call the
+    callback directly, so SbEventHandle should never receive this event
+    directly. The data type is an internally-defined structure.
+*   `kSbEventTypeAccessibilitySettingsChanged`
+
+    The platform's accessibility settings have changed. The application should
+    query the accessibility settings using the appropriate APIs to get the new
+    settings. Note this excludes captions settings changes, which causes
+    kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
+    version has kSbEventTypeAccessib(i)lityTextToSpeechSettingsChanged, then
+    that event should be used to signal text-to-speech settings changes instead;
+    platforms using older starboard versions should use
+    kSbEventTypeAccessib(i)litySettingsChanged for text-to-speech settings
+    changes.
+*   `kSbEventTypeLowMemory`
+
+    An optional event that platforms may send to indicate that the application
+    may soon be terminated (or crash) due to low memory availability. The
+    application may respond by reducing memory consumption by running a Garbage
+    Collection, flushing caches, or something similar. There is no requirement
+    to respond to or handle this event, it is only advisory.
+*   `kSbEventTypeWindowSizeChanged`
+
+    The size or position of a SbWindow has changed. The data is
+    SbEventWindowSizeChangedData .
+*   `kSbEventTypeOnScreenKeyboardShown`
+
+    The platform has shown the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard show method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the show method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowShowOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardHidden`
+
+    The platform has hidden the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard hide method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the hide method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowHideOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardFocused`
+
+    The platform has focused the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard focus method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the focus method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowFocusOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardBlurred`
+
+    The platform has blurred the on screen keyboard. This event is triggered by
+    the system or by the application's OnScreenKeyboard blur method. The event
+    has int data representing a ticket. The ticket is used by the application to
+    mark individual calls to the blur method as successfully completed. Events
+    triggered by the application have tickets passed in via
+    SbWindowBlurOnScreenKeyboard. System-triggered events have ticket value
+    kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeOnScreenKeyboardSuggestionsUpdated`
+
+    The platform has updated the on screen keyboard suggestions. This event is
+    triggered by the system or by the application's OnScreenKeyboard update
+    suggestions method. The event has int data representing a ticket. The ticket
+    is used by the application to mark individual calls to the update
+    suggestions method as successfully completed. Events triggered by the
+    application have tickets passed in via
+    SbWindowUpdateOnScreenKeyboardSuggestions. System-triggered events have
+    ticket value kSbEventOnScreenKeyboardInvalidTicket.
+*   `kSbEventTypeAccessibilityCaptionSettingsChanged`
+
+    SB_HAS(ON_SCREEN_KEYBOARD)One or more of the fields returned by
+    SbAccessibilityGetCaptionSettings has changed.
+*   `kSbEventTypeAccessibilityTextToSpeechSettingsChanged`
+
+    The platform's text-to-speech settings have changed.
+*   `kSbEventTypeOsNetworkDisconnected`
+
+    The platform has detected a network disconnection. There are likely to be
+    cases where the platform cannot detect the disconnection but the platform
+    should make a best effort to send an event of this type when the network
+    disconnects. This event is used to implement window.onoffline DOM event.
+*   `kSbEventTypeOsNetworkConnected`
+
+    The platform has detected a network connection. There are likely to be cases
+    where the platform cannot detect the connection but the platform should make
+    a best effort to send an event of this type when the device is just
+    connected to the internet. This event is used to implement window.ononline
+    DOM event.
+*   `kSbEventDateTimeConfigurationChanged`
+
+    The platform has detected a date and/or time configuration change (such as a
+    change in the timezone setting). This should trigger the application to re-
+    query the relevant APIs to update the date and time.
+
+## Typedefs ##
+
+### SbEventCallback ###
+
+A function that can be called back from the main Starboard event pump.
+
+#### Definition ####
+
+```
+typedef void(* SbEventCallback) (void *context)
+```
+
+### SbEventDataDestructor ###
+
+A function that will cleanly destroy an event data instance of a specific type.
+
+#### Definition ####
+
+```
+typedef void(* SbEventDataDestructor) (void *data)
+```
+
+### SbEventId ###
+
+An ID that can be used to refer to a scheduled event.
+
+#### Definition ####
+
+```
+typedef uint32_t SbEventId
+```
+
+## Structs ##
+
+### SbEvent ###
+
+Structure representing a Starboard event and its data.
+
+#### Members ####
+
+*   `SbEventType type`
+*   `SbTimeMonotonic timestamp`
+*   `void * data`
+
+### SbEventStartData ###
+
+Event data for kSbEventTypeStart events.
+
+#### Members ####
+
+*   `char ** argument_values`
+
+    The command-line argument values (argv).
+*   `int argument_count`
+
+    The command-line argument count (argc).
+*   `const char * link`
+
+    The startup link, if any.
+
+### SbEventWindowSizeChangedData ###
+
+Event data for kSbEventTypeWindowSizeChanged events.
+
+#### Members ####
+
+*   `SbWindow window`
+*   `SbWindowSize size`
+
+## Functions ##
+
+### SbEventCancel ###
+
+Cancels the specified `event_id`. Note that this function is a no-op if the
+event already fired. This function can be safely called from any thread, but the
+only way to guarantee that the event does not run anyway is to call it from the
+main Starboard event loop thread.
+
+#### Declaration ####
+
+```
+void SbEventCancel(SbEventId event_id)
+```
+
+### SbEventHandle ###
+
+The entry point that Starboard applications MUST implement. Any memory pointed
+at by `event` or the `data` field inside `event` is owned by the system, and
+that memory is reclaimed after this function returns, so the implementation must
+copy this data to extend its life. This behavior should also be assumed of all
+fields within the `data` object, unless otherwise explicitly specified.
+
+This function is only called from the main Starboard thread. There is no
+specification about what other work might happen on this thread, so the
+application should generally do as little work as possible on this thread, and
+just dispatch it over to another thread.
+
+#### Declaration ####
+
+```
+SB_IMPORT void SbEventHandle(const SbEvent *event)
+```
+
+### SbEventIsIdValid ###
+
+Returns whether the given event handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbEventIsIdValid(SbEventId handle)
+```
+
+### SbEventSchedule ###
+
+Schedules an event `callback` into the main Starboard event loop. This function
+may be called from any thread, but `callback` is always called from the main
+Starboard thread, queued with other pending events.
+
+`callback`: The callback function to be called. `context`: The context that is
+passed to the `callback` function. `delay`: The minimum number of microseconds
+to wait before calling the `callback` function. Set `delay` to `0` to call the
+callback as soon as possible.
+
+#### Declaration ####
+
+```
+SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/export.md b/src/cobalt/site/docs/reference/starboard/modules/13/export.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/export.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/export.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/file.md b/src/cobalt/site/docs/reference/starboard/modules/13/file.md
similarity index 94%
rename from src/cobalt/site/docs/reference/starboard/modules/10/file.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/file.md
index b9c0e36..e22edeb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/file.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/file.md
@@ -37,10 +37,9 @@
 *   `kSbFileErrorNotAFile`
 *   `kSbFileErrorNotEmpty`
 *   `kSbFileErrorInvalidUrl`
+*   `kSbFileErrorIO`
 *   `kSbFileErrorMax`
 
-    Put new entries here and increment kSbFileErrorMax.
-
 ### SbFileFlags ###
 
 Flags that define how a file is used in the application. These flags should be
@@ -137,6 +136,22 @@
 
 ## Functions ##
 
+### SbFileAtomicReplace ###
+
+Replaces the content of the file at `path` with `data`. Returns whether the
+contents of the file were replaced. The replacement of the content is an atomic
+operation. The file will either have all of the data, or none.
+
+`path`: The path to the file whose contents should be replaced. `data`: The data
+to replace the file contents with. `data_size`: The amount of `data`, in bytes,
+to be written to the file.
+
+#### Declaration ####
+
+```
+bool SbFileAtomicReplace(const char *path, const char *data, int64_t data_size)
+```
+
 ### SbFileCanOpen ###
 
 Indicates whether SbFileOpen() with the given `flags` is allowed for `path`.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/gles.md b/src/cobalt/site/docs/reference/starboard/modules/13/gles.md
new file mode 100644
index 0000000..7a9108a
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/gles.md
@@ -0,0 +1,462 @@
+---
+layout: doc
+title: "Starboard Module Reference: gles.h"
+---
+
+The GLES API provides an interface with accompanying type declarations and
+defines that together provide a single consistent method of GLES usage across
+platforms.
+
+This API is designed to abstract the differences between GLES implementations
+and versions on different systems, and to remove the requirement for any other
+code to directly pull in and use these system libraries.
+
+## GLES Version ##
+
+This API has the ability to support GLES 3.0, however platforms are not required
+to support anything beyond GLES 2.0. The caller is responsible for ensuring that
+the functions from GLES 3.0 they are calling from the interface are valid.
+
+## Macros ##
+
+### SB_GL_DEPTH_BUFFER_BIT ###
+
+Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+
+### SB_GL_READ_BUFFER ###
+
+Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+.
+
+## Typedefs ##
+
+### SbGlBoolean ###
+
+The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+.
+
+#### Definition ####
+
+```
+typedef uint8_t SbGlBoolean
+```
+
+### SbGlIntPtr ###
+
+Some compilers will transform the intptr_t to an int transparently behind the
+scenes, which is not equivalent to a long int, or long long int, as far as the
+compiler is concerned. We check the Starboard configuration and set the types to
+those exact types used by OpenGL ES 2.0 ( [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h)
+).
+
+#### Definition ####
+
+```
+typedef long int SbGlIntPtr
+```
+
+## Structs ##
+
+### SbGlesInterface ###
+
+#### Members ####
+
+*   `void(*glActiveTexture)(SbGlEnum texture)`
+
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+    .
+*   `void(*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar *name)`
+*   `void(*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer)`
+*   `void(*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer)`
+*   `void(*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer)`
+*   `void(*glBindTexture)(SbGlEnum target, SbGlUInt32 texture)`
+*   `void(*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glBlendEquation)(SbGlEnum mode)`
+*   `void(*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha)`
+*   `void(*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor)`
+*   `void(*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha)`
+*   `void(*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void *data,
+    SbGlEnum usage)`
+*   `void(*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void *data)`
+*   `SbGlEnum(*glCheckFramebufferStatus)(SbGlEnum target)`
+*   `void(*glClear)(SbGlBitfield mask)`
+*   `void(*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glClearDepthf)(SbGlFloat d)`
+*   `void(*glClearStencil)(SbGlInt32 s)`
+*   `void(*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha)`
+*   `void(*glCompileShader)(SbGlUInt32 shader)`
+*   `void(*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
+    SbGlEnum format, SbGlSizei imageSize, const void *data)`
+*   `void(*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
+    SbGlInt32 border)`
+*   `void(*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
+    SbGlSizei height)`
+*   `SbGlUInt32(*glCreateProgram)(void)`
+*   `SbGlUInt32(*glCreateShader)(SbGlEnum type)`
+*   `void(*glCullFace)(SbGlEnum mode)`
+*   `void(*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32 *buffers)`
+*   `void(*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32 *framebuffers)`
+*   `void(*glDeleteProgram)(SbGlUInt32 program)`
+*   `void(*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32 *renderbuffers)`
+*   `void(*glDeleteShader)(SbGlUInt32 shader)`
+*   `void(*glDeleteTextures)(SbGlSizei n, const SbGlUInt32 *textures)`
+*   `void(*glDepthFunc)(SbGlEnum func)`
+*   `void(*glDepthMask)(SbGlBoolean flag)`
+*   `void(*glDepthRangef)(SbGlFloat n, SbGlFloat f)`
+*   `void(*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glDisable)(SbGlEnum cap)`
+*   `void(*glDisableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count)`
+*   `void(*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void *indices)`
+*   `void(*glEnable)(SbGlEnum cap)`
+*   `void(*glEnableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glFinish)(void)`
+*   `void(*glFlush)(void)`
+*   `void(*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer)`
+*   `void(*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level)`
+*   `void(*glFrontFace)(SbGlEnum mode)`
+*   `void(*glGenBuffers)(SbGlSizei n, SbGlUInt32 *buffers)`
+*   `void(*glGenerateMipmap)(SbGlEnum target)`
+*   `void(*glGenFramebuffers)(SbGlSizei n, SbGlUInt32 *framebuffers)`
+*   `void(*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32 *renderbuffers)`
+*   `void(*glGenTextures)(SbGlSizei n, SbGlUInt32 *textures)`
+*   `void(*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei *count, SbGlUInt32 *shaders)`
+*   `SbGlInt32(*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetBooleanv)(SbGlEnum pname, SbGlBoolean *data)`
+*   `void(*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `SbGlEnum(*glGetError)(void)`
+*   `void(*glGetFloatv)(SbGlEnum pname, SbGlFloat *data)`
+*   `void(*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetIntegerv)(SbGlEnum pname, SbGlInt32 *data)`
+*   `void(*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32 *range, SbGlInt32 *precision)`
+*   `void(*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *source)`
+*   `const SbGlUInt8 *(*glGetString)(SbGlEnum name)`
+*   `void(*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat
+    *params)`
+*   `void(*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32
+    *params)`
+*   `SbGlInt32(*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname, void
+    **pointer)`
+*   `void(*glHint)(SbGlEnum target, SbGlEnum mode)`
+*   `SbGlBoolean(*glIsBuffer)(SbGlUInt32 buffer)`
+*   `SbGlBoolean(*glIsEnabled)(SbGlEnum cap)`
+*   `SbGlBoolean(*glIsFramebuffer)(SbGlUInt32 framebuffer)`
+*   `SbGlBoolean(*glIsProgram)(SbGlUInt32 program)`
+*   `SbGlBoolean(*glIsRenderbuffer)(SbGlUInt32 renderbuffer)`
+*   `SbGlBoolean(*glIsShader)(SbGlUInt32 shader)`
+*   `SbGlBoolean(*glIsTexture)(SbGlUInt32 texture)`
+*   `void(*glLineWidth)(SbGlFloat width)`
+*   `void(*glLinkProgram)(SbGlUInt32 program)`
+*   `void(*glPixelStorei)(SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glPolygonOffset)(SbGlFloat factor, SbGlFloat units)`
+*   `void(*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void *pixels)`
+*   `void(*glReleaseShaderCompiler)(void)`
+*   `void(*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert)`
+*   `void(*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glShaderBinary)(SbGlSizei count, const SbGlUInt32 *shaders, SbGlEnum
+    binaryformat, const void *binary, SbGlSizei length)`
+*   `void(*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar
+    *const *string, const SbGlInt32 *length)`
+*   `void(*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask)`
+*   `void(*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask)`
+*   `void(*glStencilMask)(SbGlUInt32 mask)`
+*   `void(*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask)`
+*   `void(*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass)`
+*   `void(*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass)`
+*   `void(*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param)`
+*   `void(*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat
+    *params)`
+*   `void(*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32
+    *params)`
+*   `void(*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum format,
+    SbGlEnum type, const void *pixels)`
+*   `void(*glUniform1f)(SbGlInt32 location, SbGlFloat v0)`
+*   `void(*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform1i)(SbGlInt32 location, SbGlInt32 v0)`
+*   `void(*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1)`
+*   `void(*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1)`
+*   `void(*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2)`
+*   `void(*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2)`
+*   `void(*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3)`
+*   `void(*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3)`
+*   `void(*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUseProgram)(SbGlUInt32 program)`
+*   `void(*glValidateProgram)(SbGlUInt32 program)`
+*   `void(*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x)`
+*   `void(*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y)`
+*   `void(*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z)`
+*   `void(*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w)`
+*   `void(*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void *pointer)`
+*   `void(*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glReadBuffer)(SbGlEnum src)`
+
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+    .
+*   `void(*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32 end,
+    SbGlSizei count, SbGlEnum type, const void *indices)`
+*   `void(*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei height,
+    SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
+    SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
+    const void *data)`
+*   `void(*glGenQueries)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `void(*glDeleteQueries)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsQuery)(SbGlUInt32 id)`
+*   `void(*glBeginQuery)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glEndQuery)(SbGlEnum target)`
+*   `void(*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `SbGlBoolean(*glUnmapBuffer)(SbGlEnum target)`
+*   `void(*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void **params)`
+*   `void(*glDrawBuffers)(SbGlSizei n, const SbGlEnum *bufs)`
+*   `void(*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32 srcX1,
+    SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter)`
+*   `void(*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei samples,
+    SbGlEnum internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer)`
+*   `void *(*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access)`
+*   `void(*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length)`
+*   `void(*glBindVertexArray)(SbGlUInt32 array)`
+*   `void(*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32 *arrays)`
+*   `void(*glGenVertexArrays)(SbGlSizei n, SbGlUInt32 *arrays)`
+*   `SbGlBoolean(*glIsVertexArray)(SbGlUInt32 array)`
+*   `void(*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32 *data)`
+*   `void(*glBeginTransformFeedback)(SbGlEnum primitiveMode)`
+*   `void(*glEndTransformFeedback)(void)`
+*   `void(*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size)`
+*   `void(*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer)`
+*   `void(*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar *const *varyings, SbGlEnum bufferMode)`
+*   `void(*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei *length, SbGlSizei *size, SbGlEnum *type,
+    SbGlChar *name)`
+*   `void(*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void *pointer)`
+*   `void(*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `void(*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w)`
+*   `void(*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w)`
+*   `void(*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32 *v)`
+*   `void(*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32 *v)`
+*   `void(*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location, SbGlUInt32
+    *params)`
+*   `SbGlInt32(*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar
+    *name)`
+*   `void(*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0)`
+*   `void(*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1)`
+*   `void(*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2)`
+*   `void(*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3)`
+*   `void(*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32 *value)`
+*   `void(*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32 *value)`
+*   `void(*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat *value)`
+*   `void(*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil)`
+*   `const SbGlUInt8 *(*glGetStringi)(SbGlEnum name, SbGlUInt32 index)`
+*   `void(*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size)`
+*   `void(*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar *const *uniformNames, SbGlUInt32 *uniformIndices)`
+*   `void(*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32 *uniformIndices, SbGlEnum pname, SbGlInt32 *params)`
+*   `SbGlUInt32(*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar
+    *uniformBlockName)`
+*   `void(*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei *length, SbGlChar
+    *uniformBlockName)`
+*   `void(*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding)`
+*   `void(*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount)`
+*   `void(*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void *indices, SbGlSizei instancecount)`
+*   `SbGlSync(*glFenceSync)(SbGlEnum condition, SbGlBitfield flags)`
+*   `SbGlBoolean(*glIsSync)(SbGlSync sync)`
+*   `void(*glDeleteSync)(SbGlSync sync)`
+*   `SbGlEnum(*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout)`
+*   `void(*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout)`
+*   `void(*glGetInteger64v)(SbGlEnum pname, SbGlInt64 *data)`
+*   `void(*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei *length, SbGlInt32 *values)`
+*   `void(*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64
+    *data)`
+*   `void(*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname, SbGlInt64
+    *params)`
+*   `void(*glGenSamplers)(SbGlSizei count, SbGlUInt32 *samplers)`
+*   `void(*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32 *samplers)`
+*   `SbGlBoolean(*glIsSampler)(SbGlUInt32 sampler)`
+*   `void(*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler)`
+*   `void(*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param)`
+*   `void(*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32 *param)`
+*   `void(*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param)`
+*   `void(*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat *param)`
+*   `void(*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat *params)`
+*   `void(*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor)`
+*   `void(*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `void(*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsTransformFeedback)(SbGlUInt32 id)`
+*   `void(*glPauseTransformFeedback)(void)`
+*   `void(*glResumeTransformFeedback)(void)`
+*   `void(*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlEnum *binaryFormat, void *binary)`
+*   `void(*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void *binary, SbGlSizei length)`
+*   `void(*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value)`
+*   `void(*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum *attachments)`
+*   `void(*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum *attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth)`
+*   `void(*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32 *params)`
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/image.md b/src/cobalt/site/docs/reference/starboard/modules/13/image.md
similarity index 97%
rename from src/cobalt/site/docs/reference/starboard/modules/10/image.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/image.md
index c911e41..634dab8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/image.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/image.md
@@ -10,7 +10,8 @@
 
 All functions in this module are safe to call from any thread at any point in
 time.
-SbImageIsDecodeSupported and SbImageDecode Example
+
+## SbImageIsDecodeSupported and SbImageDecode Example ##
 
 Let's assume that we're on a Blitter platform.
 
@@ -30,7 +31,6 @@
 SbBlitterSurface surface =
     SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
 // Do stuff with surface...
-
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/input.md b/src/cobalt/site/docs/reference/starboard/modules/13/input.md
similarity index 93%
rename from src/cobalt/site/docs/reference/starboard/modules/10/input.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/input.md
index 3554af6..e8df816 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/input.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/input.md
@@ -94,13 +94,6 @@
 
 #### Members ####
 
-*   `SbTimeMonotonic timestamp`
-
-    The time that should be reported for this event. This is intended to
-    facilitate calculation of time-sensitive information (e.g. velocity for
-    kSbInputEventTypeMove). This may be set to 0 to have the relevant systems
-    automatically set the timestamp. However, this may happen at a later time,
-    so the relative time between events may not be preserved.
 *   `SbWindow window`
 
     The window in which the input was generated.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/key.md b/src/cobalt/site/docs/reference/starboard/modules/13/key.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/key.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/key.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/log.md b/src/cobalt/site/docs/reference/starboard/modules/13/log.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/log.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/log.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/media.md b/src/cobalt/site/docs/reference/starboard/modules/13/media.md
similarity index 86%
rename from src/cobalt/site/docs/reference/starboard/modules/10/media.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/media.md
index aec4f36..9b4d7bb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/media.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/media.md
@@ -127,7 +127,7 @@
     The media type cannot be played.
 *   `kSbMediaSupportTypeMaybe`
 
-    Cannot determinate if the media type is playable without playing it.
+    Cannot determine if the media type is playable without playing it.
 *   `kSbMediaSupportTypeProbably`
 
     The media type seems to be playable.
@@ -157,22 +157,10 @@
 *   `kSbMediaVideoCodecMpeg2`
 *   `kSbMediaVideoCodecTheora`
 *   `kSbMediaVideoCodecVc1`
-*   `kSbMediaVideoCodecVp10`
+*   `kSbMediaVideoCodecAv1`
 *   `kSbMediaVideoCodecVp8`
 *   `kSbMediaVideoCodecVp9`
 
-## Typedefs ##
-
-### SbMediaAudioHeader ###
-
-SbMediaAudioHeader is same as SbMediaAudioSampleInfo in old starboard version.
-
-#### Definition ####
-
-```
-typedef SbMediaAudioSampleInfo SbMediaAudioHeader
-```
-
 ## Structs ##
 
 ### SbMediaAudioConfiguration ###
@@ -204,15 +192,19 @@
 
 ### SbMediaAudioSampleInfo ###
 
-An audio sample info, which is a description of a given audio sample. This, in
-hexadecimal string form, acts as a set of instructions to the audio decoder.
+An audio sample info, which is a description of a given audio sample. This acts
+as a set of instructions to the audio decoder.
 
-The audio sample info consists of a little-endian hexadecimal encoded
-`WAVEFORMATEX` structure followed by an Audio-specific configuration field. The
-`WAVEFORMATEX` structure is specified at: [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)
+The audio sample info consists of information found in the `WAVEFORMATEX`
+structure, as well as other information for the audio decoder, including the
+Audio-specific configuration field. The `WAVEFORMATEX` structure is specified at
+[http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)x) .
 
 #### Members ####
 
+*   `SbMediaAudioCodec codec`
+
+    The audio codec of this sample.
 *   `const char * mime`
 
     The mime of the audio stream when `codec` isn't kSbMediaAudioCodecNone. It
@@ -279,11 +271,11 @@
 *   `unsigned int chroma_siting_horizontal`
 
     How chroma is subsampled horizontally. (0: Unspecified, 1: Left Collocated,
-    2: Half)
+    2: Half).
 *   `unsigned int chroma_siting_vertical`
 
     How chroma is subsampled vertically. (0: Unspecified, 1: Top Collocated, 2:
-    Half)
+    Half).
 *   `SbMediaMasteringMetadata mastering_metadata`
 
     [HDR Metadata field] SMPTE 2086 mastering data.
@@ -301,7 +293,7 @@
     value and meanings for Primaries are adopted from Table 2 of ISO/IEC
     23001-8:2013/DCOR1. (0: Reserved, 1: ITU-R BT.709, 2: Unspecified, 3:
     Reserved, 4: ITU-R BT.470M, 5: ITU-R BT.470BG, 6: SMPTE 170M, 7: SMPTE 240M,
-    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors)
+    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors).
 *   `SbMediaTransferId transfer`
 
     [Color Space field] The transfer characteristics of the video. For clarity,
@@ -311,7 +303,7 @@
     4: Gamma 2.2 curve, 5: Gamma 2.8 curve, 6: SMPTE 170M, 7: SMPTE 240M, 8:
     Linear, 9: Log, 10: Log Sqrt, 11: IEC 61966-2-4, 12: ITU-R BT.1361 Extended
     Colour Gamut, 13: IEC 61966-2-1, 14: ITU-R BT.2020 10 bit, 15: ITU-R BT.2020
-    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG))
+    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG)).
 *   `SbMediaMatrixId matrix`
 
     [Color Space field] The Matrix Coefficients of the video used to derive luma
@@ -319,12 +311,12 @@
     the value and meanings for MatrixCoefficients are adopted from Table 4 of
     ISO/IEC 23001-8:2013/DCOR1. (0:GBR, 1: BT709, 2: Unspecified, 3: Reserved,
     4: FCC, 5: BT470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: YCOCG, 9: BT2020 Non-
-    constant Luminance, 10: BT2020 Constant Luminance)
+    constant Luminance, 10: BT2020 Constant Luminance).
 *   `SbMediaRangeId range`
 
     [Color Space field] Clipping of the color ranges. (0: Unspecified, 1:
     Broadcast Range, 2: Full range (no clipping), 3: Defined by
-    MatrixCoefficients/TransferCharacteristics)
+    MatrixCoefficients/TransferCharacteristics).
 *   `float custom_primary_matrix`
 
     [Color Space field] Only used if primaries == kSbMediaPrimaryIdCustom. This
@@ -381,6 +373,9 @@
 
 #### Members ####
 
+*   `SbMediaVideoCodec codec`
+
+    The video codec of this sample.
 *   `const char * mime`
 
     The mime of the video stream when `codec` isn't kSbMediaVideoCodecNone. It
@@ -412,7 +407,7 @@
     The frame height of this sample, in pixels. Also could be parsed from the
     Sequence Parameter Set (SPS) NAL Unit. Frame dimensions must only change on
     key frames, but may change on any key frame.
-*   `SbMediaColorMetadata* color_metadata`
+*   `SbMediaColorMetadata color_metadata`
 
     HDR metadata common for HDR10 and WebM/VP9-based HDR formats as well as the
     Color Space, and Color elements: MatrixCoefficients, BitsPerChannel,
@@ -435,11 +430,39 @@
 `mime`: The mime information of the media in the form of `video/webm` or
 `video/mp4; codecs="avc1.42001E"`. It may include arbitrary parameters like
 "codecs", "channels", etc. Note that the "codecs" parameter may contain more
-than one codec, delimited by comma. `key_system`: A lowercase value in fhe form
+than one codec, delimited by comma. `key_system`: A lowercase value in the form
 of "com.example.somesystem" as suggested by [https://w3c.github.io/encrypted-media/#key-system](https://w3c.github.io/encrypted-media/#key-system)) that can
 be matched exactly with known DRM key systems of the platform. When `key_system`
 is an empty string, the return value is an indication for non-encrypted media.
 
+An implementation may choose to support `key_system` with extra attributes,
+separated by ';', like `com.example.somesystem; attribute_name1="value1";
+attribute_name2=value1`. If `key_system` with attributes is not supported by an
+implementation, it should treat `key_system` as if it contains only the key
+system, and reject any input containing extra attributes, i.e. it can keep using
+its existing implementation. When an implementation supports `key_system` with
+attributes, it has to support all attributes defined by the Starboard version
+the implementation uses. An implementation should ignore any unknown attributes,
+and make a decision solely based on the key system and the known attributes. For
+example, if an implementation supports "com.widevine.alpha", it should also
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; invalid_attribute="invalid_value"`.
+Currently the only attribute has to be supported is `encryptionscheme`. It
+reflects the value passed to `encryptionScheme` encryptionScheme of
+MediaKeySystemMediaCapability, as defined in [https://wicg.github.io/encrypted-media-encryption-scheme/,](https://wicg.github.io/encrypted-media-encryption-scheme/,),) which can take value "cenc", "cbcs", or "cbcs-1-9". Empty string is
+not a valid value for `encryptionscheme` and the implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`encryptionscheme` is set to "". The implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported for unknown
+values of known attributes. For example, if an implementation supports
+"encryptionscheme" with value "cenc", "cbcs", or "cbcs-1-9", then it should
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; encryptionscheme="cenc"`, and return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`key_system` is `com.widevine.alpha; encryptionscheme="invalid"`. If an
+implementation supports key system with attributes on one key system, it has to
+support key system with attributes on all key systems supported.
+
 #### Declaration ####
 
 ```
@@ -659,20 +682,6 @@
 bool SbMediaIsBufferUsingMemoryPool()
 ```
 
-### SbMediaIsOutputProtected ###
-
-Indicates whether output copy protection is currently enabled on all capable
-outputs. If `true`, then non-protection-capable outputs are expected to be
-blanked.
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-bool SbMediaIsOutputProtected()
-```
-
 ### SbMediaIsSupported ###
 
 Indicates whether this platform supports decoding `video_codec` and
@@ -691,21 +700,21 @@
 bool SbMediaIsSupported(SbMediaVideoCodec video_codec, SbMediaAudioCodec audio_codec, const char *key_system)
 ```
 
-### SbMediaSetOutputProtection ###
+### SbMediaSetAudioWriteDuration ###
 
-Enables or disables output copy protection on all capable outputs. If enabled,
-then non-protection-capable outputs are expected to be blanked.
-
-The return value indicates whether the operation was successful, and the
-function returns a success even if the call is redundant in that it doesn't
-change the current value.
-
-`enabled`: Indicates whether output protection is enabled (`true`) or disabled.
-
-presubmit: allow sb_export mismatch
+Communicate to the platform how far past `current_playback_position` the app
+will write audio samples. The app will write all samples between
+`current_playback_position` and `current_playback_position` + `duration`, as
+soon as they are available. The app may sometimes write more samples than that,
+but the app only guarantees to write `duration` past `current_playback_position`
+in general. The platform is responsible for guaranteeing that when only
+`duration` audio samples are written at a time, no playback issues occur (such
+as transient or indefinite hanging). The platform may assume `duration` >= 0.5
+seconds.
 
 #### Declaration ####
 
 ```
-bool SbMediaSetOutputProtection(bool enabled)
+void SbMediaSetAudioWriteDuration(SbTime duration)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/memory.md b/src/cobalt/site/docs/reference/starboard/modules/13/memory.md
similarity index 74%
rename from src/cobalt/site/docs/reference/starboard/modules/10/memory.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/memory.md
index a3fecb6..e09dbc3 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/memory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/memory.md
@@ -4,12 +4,14 @@
 ---
 
 Defines functions for memory allocation, alignment, copying, and comparing.
-Porters
+
+## Porters ##
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
-Porters and Application Developers
+
+## Porters and Application Developers ##
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -44,16 +46,6 @@
 
 ## Functions ##
 
-### SbMemoryAlignToPageSize ###
-
-Rounds `size` up to kSbMemoryPageSize.
-
-#### Declaration ####
-
-```
-static size_t SbMemoryAlignToPageSize(size_t size)
-```
-
 ### SbMemoryAllocate ###
 
 Allocates and returns a chunk of memory of at least `size` bytes. This function
@@ -166,46 +158,6 @@
 static void* SbMemoryCalloc(size_t count, size_t size)
 ```
 
-### SbMemoryCompare ###
-
-Compares the contents of the first `count` bytes of `buffer1` and `buffer2`.
-This function returns:
-
-*   `-1` if `buffer1` is "less-than" `buffer2`
-
-*   `0` if `buffer1` and `buffer2` are equal
-
-*   `1` if `buffer1` is "greater-than" `buffer2`.
-
-This function is meant to be a drop-in replacement for `memcmp`.
-
-`buffer1`: The first buffer to be compared. `buffer2`: The second buffer to be
-compared. `count`: The number of bytes to be compared.
-
-#### Declaration ####
-
-```
-int SbMemoryCompare(const void *buffer1, const void *buffer2, size_t count)
-```
-
-### SbMemoryCopy ###
-
-Copies `count` sequential bytes from `source` to `destination`, without support
-for the `source` and `destination` regions overlapping. This function is meant
-to be a drop-in replacement for `memcpy`.
-
-The function's behavior is undefined if `destination` or `source` are NULL, and
-the function is a no-op if `count` is 0. The return value is `destination`.
-
-`destination`: The destination of the copied memory. `source`: The source of the
-copied memory. `count`: The number of sequential bytes to be copied.
-
-#### Declaration ####
-
-```
-void* SbMemoryCopy(void *destination, const void *source, size_t count)
-```
-
 ### SbMemoryDeallocate ###
 
 Frees a previously allocated chunk of memory. If `memory` is NULL, then the
@@ -242,18 +194,6 @@
 void SbMemoryDeallocateNoReport(void *memory)
 ```
 
-### SbMemoryFindByte ###
-
-Finds the lower 8-bits of `value` in the first `count` bytes of `buffer` and
-returns either a pointer to the first found occurrence or `NULL` if the value is
-not found. This function is meant to be a drop-in replacement for `memchr`.
-
-#### Declaration ####
-
-```
-const void* SbMemoryFindByte(const void *buffer, int value, size_t count)
-```
-
 ### SbMemoryFlush ###
 
 Flushes any data in the given virtual address range that is cached locally in
@@ -306,26 +246,6 @@
 void SbMemoryGetStackBounds(void **out_high, void **out_low)
 ```
 
-### SbMemoryIsAligned ###
-
-Checks whether `memory` is aligned to `alignment` bytes.
-
-#### Declaration ####
-
-```
-static bool SbMemoryIsAligned(const void *memory, size_t alignment)
-```
-
-### SbMemoryIsZero ###
-
-Returns true if the first `count` bytes of `buffer` are set to zero.
-
-#### Declaration ####
-
-```
-static bool SbMemoryIsZero(const void *buffer, size_t count)
-```
-
 ### SbMemoryMap ###
 
 Allocates `size_bytes` worth of physical memory pages and maps them into an
@@ -347,24 +267,6 @@
 void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
 ```
 
-### SbMemoryMove ###
-
-Copies `count` sequential bytes from `source` to `destination`, with support for
-the `source` and `destination` regions overlapping. This function is meant to be
-a drop-in replacement for `memmove`.
-
-The function's behavior is undefined if `destination` or `source` are NULL, and
-the function is a no-op if `count` is 0. The return value is `destination`.
-
-`destination`: The destination of the copied memory. `source`: The source of the
-copied memory. `count`: The number of sequential bytes to be copied.
-
-#### Declaration ####
-
-```
-void* SbMemoryMove(void *destination, const void *source, size_t count)
-```
-
 ### SbMemoryProtect ###
 
 Change the protection of `size_bytes` of memory regions, starting from
@@ -428,24 +330,6 @@
 void* SbMemoryReallocateUnchecked(void *memory, size_t size)
 ```
 
-### SbMemorySet ###
-
-Fills `count` sequential bytes starting at `destination`, with the unsigned char
-coercion of `byte_value`. This function is meant to be a drop-in replacement for
-`memset`.
-
-The function's behavior is undefined if `destination` is NULL, and the function
-is a no-op if `count` is 0. The return value is `destination`.
-
-`destination`: The destination of the copied memory. `count`: The number of
-sequential bytes to be set.
-
-#### Declaration ####
-
-```
-void* SbMemorySet(void *destination, int byte_value, size_t count)
-```
-
 ### SbMemoryUnmap ###
 
 Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/memory_reporter.md b/src/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/memory_reporter.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/microphone.md b/src/cobalt/site/docs/reference/starboard/modules/13/microphone.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/microphone.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/microphone.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/mutex.md b/src/cobalt/site/docs/reference/starboard/modules/13/mutex.md
similarity index 84%
rename from src/cobalt/site/docs/reference/starboard/modules/10/mutex.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/mutex.md
index 2081a74..58f1907 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/mutex.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/mutex.md
@@ -6,6 +6,12 @@
 Defines a mutually exclusive lock that can be used to coordinate with other
 threads.
 
+## Macros ##
+
+### SB_MUTEX_MAX_SIZE ###
+
+Max size of the SbMutex type.
+
 ## Enums ##
 
 ### SbMutexResult ###
@@ -24,6 +30,19 @@
 
     The mutex has already been destroyed.
 
+## Typedefs ##
+
+### SbMutex ###
+
+An opaque handle to a mutex type with reserved memory buffer of size
+SB_MUTEX_MAX_SIZE and aligned at void pointer type.
+
+#### Definition ####
+
+```
+typedef union SbMutex  SbMutex
+```
+
 ## Functions ##
 
 ### SbMutexAcquire ###
@@ -43,7 +62,8 @@
 ### SbMutexAcquireTry ###
 
 Acquires `mutex`, without blocking. The return value identifies the acquisition
-result. SbMutexes are not reentrant, so a recursive acquisition always fails.
+result. SbMutexes are not reentrant, so a recursive acquisition has undefined
+behavior.
 
 `mutex`: The mutex to be acquired.
 
@@ -69,7 +89,7 @@
 ### SbMutexDestroy ###
 
 Destroys a mutex. The return value indicates whether the destruction was
-successful.
+successful. Destroying a locked mutex results in undefined behavior.
 
 `mutex`: The mutex to be invalidated.
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/once.md b/src/cobalt/site/docs/reference/starboard/modules/13/once.md
similarity index 74%
rename from src/cobalt/site/docs/reference/starboard/modules/10/once.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/once.md
index b226b4b..ce3c4d6 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/once.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/once.md
@@ -6,8 +6,25 @@
 Onces represent initializations that should only ever happen once per process,
 in a thread-safe way.
 
+## Macros ##
+
+### SB_ONCE_MAX_SIZE ###
+
+Max size of the SbOnceControl type.
+
 ## Typedefs ##
 
+### SbOnceControl ###
+
+An opaque handle to a once control type with reserved memory buffer of size
+SB_ONCE_MAX_SIZE and aligned at void pointer type.
+
+#### Definition ####
+
+```
+typedef union SbOnceControl  SbOnceControl
+```
+
 ### SbOnceInitRoutine ###
 
 Function pointer type for methods that can be called via the SbOnce() system.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/player.md b/src/cobalt/site/docs/reference/starboard/modules/13/player.md
similarity index 83%
rename from src/cobalt/site/docs/reference/starboard/modules/10/player.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/player.md
index 129d94d..d6910e2 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/player.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/player.md
@@ -33,14 +33,20 @@
 *   `kSbPlayerDecoderStateNeedsData`
 
     The decoder is asking for one more sample.
-*   `kSbPlayerDecoderStateBufferFull`
 
-    The decoder is not ready for any more samples, so do not send them. Note
-    that this enum value has been deprecated and the SbPlayer implementation
-    should no longer use this value.
-*   `kSbPlayerDecoderStateDestroyed`
+### SbPlayerSampleSideDataType ###
 
-    The player has been destroyed, and will send no more callbacks.
+Identify the type of side data accompanied with `SbPlayerSampleInfo`, as side
+data may come from multiple sources.
+
+#### Values ####
+
+*   `kMatroskaBlockAdditional`
+
+    The side data comes from the BlockAdditional data in the Matroska/Webm
+    container, as specified in [https://tools.ietf.org/id/draft-lhomme-cellar-matroska-03.html#rfc.section.7.3.39](https://tools.ietf.org/id/draft-lhomme-cellar-matroska-03.html#rfc.section.7.3.39)9) andnd [https://www.webmproject.org/docs/container/#BlockAdditional](https://www.webmproject.org/docs/container/#BlockAdditional)l)
+    . The first 8 bytes of the data contains the value of BlockAddID in big
+    endian format, followed by the content of BlockAdditional.
 
 ### SbPlayerState ###
 
@@ -229,6 +235,7 @@
 
 #### Members ####
 
+*   `SbMediaType type`
 *   `const void * buffer`
 
     Points to the buffer containing the sample data.
@@ -238,68 +245,45 @@
 *   `SbTime timestamp`
 
     The timestamp of the sample in SbTime.
-*   `constSbMediaVideoSampleInfo* video_sample_info`
+*   `SbPlayerSampleSideData* side_data`
 
-    Information about a video sample. This value is required for video samples.
-    Otherwise, it must be `NULL`.
+    Points to an array of side data for the input, when available.
+*   `int side_data_count`
+
+    The number of side data pointed by `side_data`. It should be set to 0 if
+    there is no side data for the input.
+*   `SbMediaAudioSampleInfo audio_sample_info`
+
+    Information about an audio sample. This value can only be used when `type`
+    is kSbMediaTypeAudio.
+*   `SbMediaVideoSampleInfo video_sample_info`
+
+    Information about a video sample. This value can only be used when `type` is
+    kSbMediaTypeVideo.
+*   `union SbPlayerSampleInfo::@0 @1`
 *   `constSbDrmSampleInfo* drm_info`
 
     The DRM system related info for the media sample. This value is required for
     encrypted samples. Otherwise, it must be `NULL`.
 
+### SbPlayerSampleSideData ###
+
+Side data accompanied with `SbPlayerSampleInfo`, it can be arbitrary binary data
+coming from multiple sources.
+
+#### Members ####
+
+*   `SbPlayerSampleSideDataType type`
+*   `const uint8_t * data`
+
+    `data` will remain valid until SbPlayerDeallocateSampleFunc() is called on
+    the `SbPlayerSampleInfo::buffer` the data is associated with.
+*   `size_t size`
+
+    The size of the data pointed by `data`, in bytes.
+
 ## Functions ##
 
-### SbPlayerCreate ###
-
-Creates a player that will be displayed on `window` for the specified
-`video_codec` and `audio_codec`, acquiring all resources needed to operate it,
-and returning an opaque handle to it. The expectation is that a new player will
-be created and destroyed for every playback.
-
-This function returns the created player. Note the following:
-
-*   The associated decoder of the returned player should be assumed to not be in
-    `kSbPlayerDecoderStateNeedsData` until SbPlayerSeek() has been called on it.
-
-*   It is expected either that the thread that calls SbPlayerCreate is the same
-    thread that calls the other `SbPlayer` functions for that player, or that
-    there is a mutex guarding calls into each `SbPlayer` instance.
-
-*   If there is a platform limitation on how many players can coexist
-    simultaneously, then calls made to this function that attempt to exceed that
-    limit must return `kSbPlayerInvalid`. Multiple calls to SbPlayerCreate must
-    not cause a crash.
-
-`window`: The window that will display the player. `window` can be
-`kSbWindowInvalid` for platforms where video is only displayed on a particular
-window that the underlying implementation already has access to.
-
-`video_codec`: The video codec used for the player. If `video_codec` is
-`kSbMediaVideoCodecNone`, the player is an audio-only player. If `video_codec`
-is any other value, the player is an audio/video decoder. This can be set to
-`kSbMediaVideoCodecNone` to play a video with only an audio track.
-
-`audio_codec`: The audio codec used for the player. The caller must provide a
-populated `audio_sample_info` if audio codec is `kSbMediaAudioCodecAac`. Can be
-set to `kSbMediaAudioCodecNone` to play a video without any audio track. In such
-case `audio_sample_info` must be NULL.
-
-`drm_system`: If the media stream has encrypted portions, then this parameter
-provides an appropriate DRM system, created with `SbDrmCreateSystem()`. If the
-stream does not have encrypted portions, then `drm_system` may be
-`kSbDrmSystemInvalid`. `audio_header`: `audio_header` is same as
-`audio_sample_info` in old starboard version. When `audio_codec` is
-`kSbMediaAudioCodecNone`, this must be set to NULL. Note that
-`audio_specific_config` is a pointer and the content it points to is no longer
-valid after this function returns. The implementation has to make a copy of the
-content if it is needed after the function returns.
-
-#### Declaration ####
-
-```
-SbPlayer SbPlayerCreate(SbWindow window, const SbPlayerCreationParam *creation_param, SbPlayerDeallocateSampleFunc sample_deallocate_func, SbPlayerDecoderStatusFunc decoder_status_func, SbPlayerStatusFunc player_status_func, SbPlayerErrorFunc player_error_func, void *context, SbDecodeTargetGraphicsContextProvider *context_provider)
-```
-
 ### SbPlayerDestroy ###
 
 Destroys `player`, freeing all associated resources.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/socket.md b/src/cobalt/site/docs/reference/starboard/modules/13/socket.md
similarity index 98%
rename from src/cobalt/site/docs/reference/starboard/modules/10/socket.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/socket.md
index 2098939..548f57d 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/socket.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/socket.md
@@ -276,8 +276,8 @@
 If the destination address is ::, and its `type` is `kSbSocketAddressTypeIpv6`
 then any IPv6 local interface that is up and not loopback or a link-local IP is
 a valid return value. However, in the case of IPv6, the address with the biggest
-scope must be returned. E.g., a globally scoped and routable IP is prefered over
-a unique local address (ULA). Also, the IP address that is returned must be
+scope must be returned. E.g., a globally scoped and routable IP is preferred
+over a unique local address (ULA). Also, the IP address that is returned must be
 permanent.
 
 If destination address is NULL, then any IP address that is valid for
@@ -348,6 +348,16 @@
 bool SbSocketIsConnectedAndIdle(SbSocket socket)
 ```
 
+### SbSocketIsIpv6Supported ###
+
+Returns whether IPV6 is supported on the current platform.
+
+#### Declaration ####
+
+```
+bool SbSocketIsIpv6Supported()
+```
+
 ### SbSocketIsValid ###
 
 Returns whether the given socket handle is valid.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/socket_waiter.md b/src/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
similarity index 97%
rename from src/cobalt/site/docs/reference/starboard/modules/10/socket_waiter.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
index 409169f..738fafb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/socket_waiter.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
@@ -116,8 +116,9 @@
 *   If `persistent` is `true`, then `socket` stays registered with `waiter`
     until SbSocketWaiterRemove() is called with `waiter` and `socket`.
 
-*   If `persistent` is `false`, then `socket` is removed after the next call to
-    `callback`, even if not all registered `interests` became ready.
+*   If `persistent` is `false`, then `socket` is removed before the next call to
+    `callback`, even if not all registered `interests` became ready, which
+    allows for adding it again in the `callback`.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/speech_recognizer.md b/src/cobalt/site/docs/reference/starboard/modules/13/speech_recognizer.md
similarity index 97%
rename from src/cobalt/site/docs/reference/starboard/modules/10/speech_recognizer.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/speech_recognizer.md
index 7755e5b..0a1dc6b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/speech_recognizer.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/speech_recognizer.md
@@ -218,6 +218,16 @@
 void SbSpeechRecognizerDestroy(SbSpeechRecognizer recognizer)
 ```
 
+### SbSpeechRecognizerIsSupported ###
+
+Returns whether the platform supports SbSpeechRecognizer.
+
+#### Declaration ####
+
+```
+bool SbSpeechRecognizerIsSupported()
+```
+
 ### SbSpeechRecognizerIsValid ###
 
 Indicates whether the given speech recognizer is valid.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/speech_synthesis.md b/src/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
similarity index 86%
rename from src/cobalt/site/docs/reference/starboard/modules/10/speech_synthesis.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
index 2074650..e46a2ca 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/speech_synthesis.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
@@ -3,7 +3,7 @@
 title: "Starboard Module Reference: speech_synthesis.h"
 ---
 
-A basic text-to-speech API intended to be used for audio accessibilty.
+A basic text-to-speech API intended to be used for audio accessibility.
 
 Implementations of this API should audibly play back text to assist users in
 non-visual navigation of the application.
@@ -23,6 +23,16 @@
 void SbSpeechSynthesisCancel()
 ```
 
+### SbSpeechSynthesisIsSupported ###
+
+Returns whether the platform supports speech synthesis
+
+#### Declaration ####
+
+```
+bool SbSpeechSynthesisIsSupported()
+```
+
 ### SbSpeechSynthesisSpeak ###
 
 Enqueues `text`, a UTF-8 string, to be spoken. Returns immediately.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/storage.md b/src/cobalt/site/docs/reference/starboard/modules/13/storage.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/storage.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/storage.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/string.md b/src/cobalt/site/docs/reference/starboard/modules/13/string.md
new file mode 100644
index 0000000..95790d4
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/string.md
@@ -0,0 +1,175 @@
+---
+layout: doc
+title: "Starboard Module Reference: string.h"
+---
+
+Defines functions for interacting with c-style strings.
+
+## Functions ##
+
+### SbStringCompareNoCase ###
+
+Compares two strings, ignoring differences in case. The return value is:
+
+*   `< 0` if `string1` is ASCII-betically lower than `string2`.
+
+*   `0` if the two strings are equal.
+
+*   `> 0` if `string1` is ASCII-betically higher than `string2`.
+
+This function is meant to be a drop-in replacement for `strcasecmp`.
+
+`string1`: The first string to compare. `string2`: The second string to compare.
+
+#### Declaration ####
+
+```
+int SbStringCompareNoCase(const char *string1, const char *string2)
+```
+
+### SbStringCompareNoCaseN ###
+
+Compares the first `count` characters of two strings, ignoring differences in
+case. The return value is:
+
+*   `< 0` if `string1` is ASCII-betically lower than `string2`.
+
+*   `0` if the two strings are equal.
+
+*   `> 0` if `string1` is ASCII-betically higher than `string2`.
+
+This function is meant to be a drop-in replacement for `strncasecmp`.
+
+`string1`: The first string to compare. `string2`: The second string to compare.
+`count`: The number of characters to compare.
+
+#### Declaration ####
+
+```
+int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
+```
+
+### SbStringDuplicate ###
+
+Copies `source` into a buffer that is allocated by this function and that can be
+freed with SbMemoryDeallocate. This function is meant to be a drop-in
+replacement for `strdup`.
+
+`source`: The string to be copied.
+
+#### Declaration ####
+
+```
+char* SbStringDuplicate(const char *source)
+```
+
+### SbStringFormat ###
+
+Produces a string formatted with `format` and `arguments`, placing as much of
+the result that will fit into `out_buffer`. The return value specifies the
+number of characters that the format would produce if `buffer_size` were
+infinite.
+
+This function is meant to be a drop-in replacement for `vsnprintf`.
+
+`out_buffer`: The location where the formatted string is stored. `buffer_size`:
+The size of `out_buffer`. `format`: A string that specifies how the data should
+be formatted. `arguments`: Variable arguments used in the string.
+
+#### Declaration ####
+
+```
+int SbStringFormat(char *out_buffer, size_t buffer_size, const char *format, va_list arguments) SB_PRINTF_FORMAT(3
+```
+
+### SbStringFormatF ###
+
+An inline wrapper of SbStringFormat that converts from ellipsis to va_args. This
+function is meant to be a drop-in replacement for `snprintf`.
+
+`out_buffer`: The location where the formatted string is stored. `buffer_size`:
+The size of `out_buffer`. `format`: A string that specifies how the data should
+be formatted. `...`: Arguments used in the string.
+
+#### Declaration ####
+
+```
+int static int static int SbStringFormatF(char *out_buffer, size_t buffer_size, const char *format,...) SB_PRINTF_FORMAT(3
+```
+
+### SbStringFormatUnsafeF ###
+
+An inline wrapper of SbStringFormat that is meant to be a drop-in replacement
+for the unsafe but commonly used `sprintf`.
+
+`out_buffer`: The location where the formatted string is stored. `format`: A
+string that specifies how the data should be formatted. `...`: Arguments used in
+the string.
+
+#### Declaration ####
+
+```
+static int static int SbStringFormatUnsafeF(char *out_buffer, const char *format,...) SB_PRINTF_FORMAT(2
+```
+
+### SbStringFormatWide ###
+
+This function is identical to SbStringFormat, but is for wide characters. It is
+meant to be a drop-in replacement for `vswprintf`.
+
+`out_buffer`: The location where the formatted string is stored. `buffer_size`:
+The size of `out_buffer`. `format`: A string that specifies how the data should
+be formatted. `arguments`: Variable arguments used in the string.
+
+#### Declaration ####
+
+```
+int SbStringFormatWide(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format, va_list arguments)
+```
+
+### SbStringFormatWideF ###
+
+An inline wrapper of SbStringFormatWide that converts from ellipsis to
+`va_args`.
+
+`out_buffer`: The location where the formatted string is stored. `buffer_size`:
+The size of `out_buffer`. `format`: A string that specifies how the data should
+be formatted. `...`: Arguments used in the string.
+
+#### Declaration ####
+
+```
+static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
+```
+
+### SbStringScan ###
+
+Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
+return value specifies the number of successfully matched items, which may be
+`0`.
+
+This function is meant to be a drop-in replacement for `vsscanf`.
+
+`buffer`: The string to scan for the pattern. `pattern`: The string to search
+for in `buffer`. `arguments`: Values matching `pattern` that were extracted from
+`buffer`.
+
+#### Declaration ####
+
+```
+int SbStringScan(const char *buffer, const char *pattern, va_list arguments)
+```
+
+### SbStringScanF ###
+
+An inline wrapper of SbStringScan that converts from ellipsis to `va_args`. This
+function is meant to be a drop-in replacement for `sscanf`. `buffer`: The string
+to scan for the pattern. `pattern`: The string to search for in `buffer`. `...`:
+Values matching `pattern` that were extracted from `buffer`.
+
+#### Declaration ####
+
+```
+static int SbStringScanF(const char *buffer, const char *pattern,...)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/system.md b/src/cobalt/site/docs/reference/starboard/modules/13/system.md
similarity index 77%
rename from src/cobalt/site/docs/reference/starboard/modules/10/system.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/system.md
index 3c2acee..d6ce62e 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/system.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/system.md
@@ -6,12 +6,6 @@
 Defines a broad set of APIs that allow the client application to query build and
 runtime properties of the enclosing system.
 
-## Macros ##
-
-### kSbSystemPlatformErrorInvalid ###
-
-Well-defined value for an invalid `SbSystemPlatformError`.
-
 ## Enums ##
 
 ### SbSystemCapabilityId ###
@@ -31,12 +25,6 @@
     Whether this system has the ability to report on GPU memory usage. If (and
     only if) a system has this capability will SbSystemGetTotalGPUMemory() and
     SbSystemGetUsedGPUMemory() be valid to call.
-*   `kSbSystemCapabilitySetsInputTimestamp`
-
-    Whether this system sets the `timestamp` field of SbInputData . If the
-    system does not set this field, then it will automatically be set; however,
-    the relative time between input events likely will not be preserved, so
-    time-related calculations (e.g. velocity for move events) will be incorrect.
 
 ### SbSystemConnectionType ###
 
@@ -124,6 +112,11 @@
 *   `kSbSystemPathExecutableFile`
 
     Full path to the executable file.
+*   `kSbSystemPathStorageDirectory`
+
+    Path to a directory for permanent file storage. Both read and write access
+    is required. This is where an app may store its persistent settings. The
+    location should be user agnostic if possible.
 
 ### SbSystemPlatformErrorResponse ###
 
@@ -156,6 +149,9 @@
 
 #### Values ####
 
+*   `kSbSystemPropertyCertificationScope`
+
+    The certification scope that identifies a group of devices.
 *   `kSbSystemPropertyChipsetModelNumber`
 
     The full model number of the main platform chipset, including any vendor-
@@ -181,9 +177,10 @@
 *   `kSbSystemPropertyModelYear`
 
     The year the device was launched, e.g. "2016".
-*   `kSbSystemPropertyNetworkOperatorName`
+*   `kSbSystemPropertySystemIntegratorName`
 
-    The name of the network operator that owns the target device, if applicable.
+    The corporate entity responsible for submitting the device to YouTube
+    certification and for the device maintenance/updates.
 *   `kSbSystemPropertyPlatformName`
 
     The name of the operating system and platform, suitable for inclusion in a
@@ -229,17 +226,6 @@
 typedef int SbSystemError
 ```
 
-### SbSystemPlatformError ###
-
-Opaque handle returned by `SbSystemRaisePlatformError` that can be passed to
-`SbSystemClearPlatformError`.
-
-#### Definition ####
-
-```
-typedef SbSystemPlatformErrorPrivate* SbSystemPlatformError
-```
-
 ### SbSystemPlatformErrorCallback ###
 
 Type of callback function that may be called in response to an error
@@ -256,26 +242,6 @@
 
 ## Functions ##
 
-### SbSystemBinarySearch ###
-
-Binary searches a sorted table `base` of `element_count` objects, each element
-`element_width` bytes in size for an element that `comparator` compares equal to
-`key`.
-
-This function is meant to be a drop-in replacement for `bsearch`.
-
-`key`: The key to search for in the table. `base`: The sorted table of elements
-to be searched. `element_count`: The number of elements in the table.
-`element_width`: The size, in bytes, of each element in the table. `comparator`:
-A value that indicates how the element in the table should compare to the
-specified `key`.
-
-#### Declaration ####
-
-```
-void* SbSystemBinarySearch(const void *key, const void *base, size_t element_count, size_t element_width, SbSystemComparator comparator)
-```
-
 ### SbSystemBreakIntoDebugger ###
 
 Breaks the current program into the debugger, if a debugger is attached. If a
@@ -297,16 +263,6 @@
 void SbSystemClearLastError()
 ```
 
-### SbSystemClearPlatformError ###
-
-presubmit: allow sb_export mismatch
-
-#### Declaration ####
-
-```
-void SbSystemClearPlatformError(SbSystemPlatformError handle)
-```
-
 ### SbSystemGetConnectionType ###
 
 Returns the device's current network connection type.
@@ -342,6 +298,33 @@
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
+### SbSystemGetExtension ###
+
+Returns pointer to a constant global struct implementing the extension named
+`name`, if it is implemented. Otherwise return NULL.
+
+Extensions are used to implement behavior which is specific to the combination
+of application & platform. An extension relies on a header file in the
+"extension" subdirectory of an app, which is used by both the application and
+the Starboard platform to define an extension API struct. Since the header is
+used both above and below Starboard, it cannot include any files from above
+Starboard. It may depend on Starboard headers. That API struct has only 2
+required fields which must be first: a const char* `name`, storing the extension
+name, and a uint32_t `version` storing the version number of the extension. All
+other fields may be C types (including custom structs) or function pointers. The
+application will query for the function by name using SbSystemGetExtension, and
+the platform returns a pointer to the singleton instance of the extension
+struct. The singleton struct should be constant after initialization, since the
+application may only get the extension once, meaning updated values would be
+ignored. As the version of extensions are incremented, fields may be added to
+the end of the struct, but never removed (only deprecated).
+
+#### Declaration ####
+
+```
+const void* SbSystemGetExtension(const char *name)
+```
+
 ### SbSystemGetLastError ###
 
 Gets the last platform-specific error code produced by any Starboard call in the
@@ -551,14 +534,16 @@
 bool SbSystemIsDebuggerAttached()
 ```
 
-### SbSystemPlatformErrorIsValid ###
+### SbSystemNetworkIsDisconnected ###
 
-Checks whether a `SbSystemPlatformError` is valid.
+Returns if the device is disconnected from network. "Disconnected" is chosen
+over connected because disconnection can be determined with more certainty than
+connection usually.
 
 #### Declaration ####
 
 ```
-static bool SbSystemPlatformErrorIsValid(SbSystemPlatformError handle)
+bool SbSystemNetworkIsDisconnected()
 ```
 
 ### SbSystemRaisePlatformError ###
@@ -568,13 +553,8 @@
 to then notify the user of the error and to provide a means for any required
 interaction, such as by showing a dialog.
 
-The return value is a handle that may be used in a subsequent call to
-`SbSystemClearPlatformError`. For example, the handle could be used to
-programatically dismiss a dialog that was raised in response to the error. The
-lifetime of the object referenced by the handle is until the user reacts to the
-error or the error is dismissed by a call to SbSystemClearPlatformError,
-whichever happens first. Note that if the platform cannot respond to the error,
-then this function should return `kSbSystemPlatformErrorInvalid`.
+The return value is a boolean. If the platform cannot respond to the error, then
+this function should return `false`, otherwise it should return `true`.
 
 This function may be called from any thread, and it is the platform's
 responsibility to decide how to handle an error received while a previous error
@@ -591,23 +571,97 @@
 #### Declaration ####
 
 ```
-SbSystemPlatformError SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
+bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
 ```
 
-### SbSystemRequestPause ###
+### SbSystemRequestBlur ###
 
-Requests that the application move into the Paused state at the next convenient
+Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to "unfocused application" in a
 traditional window manager, where the application may be partially visible.
 
-This function eventually causes a `kSbEventTypePause` event to be dispatched to
-the application. Before the `kSbEventTypePause` event is dispatched, some work
+This function eventually causes a `kSbEventTypeBlur` event to be dispatched to
+the application. Before the `kSbEventTypeBlur` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
 #### Declaration ####
 
 ```
-void SbSystemRequestPause()
+void SbSystemRequestBlur()
+```
+
+### SbSystemRequestConceal ###
+
+Requests that the application move into the Concealed state at the next
+convenient point. This should roughly correspond to "minimization" in a
+traditional window manager, where the application is no longer visible. However,
+the background tasks can still be running.
+
+This function eventually causes a `kSbEventTypeConceal` event to be dispatched
+to the application. Before the `kSbEventTypeConceal` event is dispatched, some
+work may continue to be done, and unrelated system events may be dispatched.
+
+In the Concealed state, the application will be invisible, but probably still be
+running background tasks. The expectation is that an external system event will
+bring the application out of the Concealed state.
+
+#### Declaration ####
+
+```
+void SbSystemRequestConceal()
+```
+
+### SbSystemRequestFocus ###
+
+Requests that the application move into the Started state at the next convenient
+point. This should roughly correspond to a "focused application" in a
+traditional window manager, where the application is fully visible and the
+primary receiver of input events.
+
+This function eventually causes a `kSbEventTypeFocus` event to be dispatched to
+the application. Before `kSbEventTypeFocus` is dispatched, some work may
+continue to be done, and unrelated system events may be dispatched.
+
+#### Declaration ####
+
+```
+void SbSystemRequestFocus()
+```
+
+### SbSystemRequestFreeze ###
+
+Requests that the application move into the Frozen state at the next convenient
+point.
+
+This function eventually causes a `kSbEventTypeFreeze` event to be dispatched to
+the application. Before the `kSbEventTypeSuspend` event is dispatched, some work
+may continue to be done, and unrelated system events may be dispatched.
+
+In the Frozen state, the application will be resident, but probably not running.
+The expectation is that an external system event will bring the application out
+of the Frozen state.
+
+#### Declaration ####
+
+```
+void SbSystemRequestFreeze()
+```
+
+### SbSystemRequestReveal ###
+
+Requests that the application move into the Blurred state at the next convenient
+point. This should roughly correspond to a "focused application" in a
+traditional window manager, where the application is fully visible and the
+primary receiver of input events.
+
+This function eventually causes a `kSbEventTypeReveal` event to be dispatched to
+the application. Before the `kSbEventTypeReveal` event is dispatched, some work
+may continue to be done, and unrelated system events may be dispatched.
+
+#### Declaration ####
+
+```
+void SbSystemRequestReveal()
 ```
 
 ### SbSystemRequestStop ###
@@ -627,58 +681,24 @@
 void SbSystemRequestStop(int error_level)
 ```
 
-### SbSystemRequestSuspend ###
+### SbSystemSignWithCertificationSecretKey ###
 
-Requests that the application move into the Suspended state at the next
-convenient point. This should roughly correspond to "minimization" in a
-traditional window manager, where the application is no longer visible.
+Computes a HMAC-SHA256 digest of `message` into `digest` using the application's
+certification secret.
 
-This function eventually causes a `kSbEventTypeSuspend` event to be dispatched
-to the application. Before the `kSbEventTypeSuspend` event is dispatched, some
-work may continue to be done, and unrelated system events may be dispatched.
+This function may be implemented as an alternative to implementing
+SbSystemGetProperty(kSbSystemPropertyBase64EncodedCertificationSecret), however
+both should not be implemented.
 
-In the Suspended state, the application will be resident, but probably not
-running. The expectation is that an external system event will bring the
-application out of the Suspended state.
+The output will be written into `digest`. `digest_size_in_bytes` must be 32 (or
+greater), since 32-bytes will be written into it. Returns false in the case of
+an error, or if it is not implemented. In this case the contents of `digest`
+will be undefined.
 
 #### Declaration ####
 
 ```
-void SbSystemRequestSuspend()
-```
-
-### SbSystemRequestUnpause ###
-
-Requests that the application move into the Started state at the next convenient
-point. This should roughly correspond to a "focused application" in a
-traditional window manager, where the application is fully visible and the
-primary receiver of input events.
-
-This function eventually causes a `kSbEventTypeUnpause` event to be dispatched
-to the application. Before `kSbEventTypeUnpause` is dispatched, some work may
-continue to be done, and unrelated system events may be dispatched.
-
-#### Declaration ####
-
-```
-void SbSystemRequestUnpause()
-```
-
-### SbSystemSort ###
-
-Sorts an array of elements `base`, with `element_count` elements of
-`element_width` bytes each, using `comparator` as the comparison function.
-
-This function is meant to be a drop-in replacement for `qsort`.
-
-`base`: The array of elements to be sorted. `element_count`: The number of
-elements in the array. `element_width`: The size, in bytes, of each element in
-the array. `comparator`: A value that indicates how the array should be sorted.
-
-#### Declaration ####
-
-```
-void SbSystemSort(void *base, size_t element_count, size_t element_width, SbSystemComparator comparator)
+bool SbSystemSignWithCertificationSecretKey(const uint8_t *message, size_t message_size_in_bytes, uint8_t *digest, size_t digest_size_in_bytes)
 ```
 
 ### SbSystemSupportsResume ###
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/thread.md b/src/cobalt/site/docs/reference/starboard/modules/13/thread.md
similarity index 79%
rename from src/cobalt/site/docs/reference/starboard/modules/10/thread.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/thread.md
index 22b075b..8440477 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/thread.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/thread.md
@@ -7,6 +7,10 @@
 
 ## Macros ##
 
+### kSbThreadContextInvalid ###
+
+Well-defined value for an invalid thread context.
+
 ### kSbThreadInvalidId ###
 
 Well-defined constant value to mean "no thread ID."
@@ -19,6 +23,10 @@
 
 Well-defined constant value to mean "no affinity."
 
+### kSbThreadSamplerInvalid ###
+
+Well-defined value for an invalid thread sampler.
+
 ## Enums ##
 
 ### SbThreadPriority ###
@@ -73,6 +81,16 @@
 
 ## Typedefs ##
 
+### SbThread ###
+
+An opaque handle to a thread type.
+
+#### Definition ####
+
+```
+typedef void* SbThread
+```
+
 ### SbThreadAffinity ###
 
 Type for thread core affinity. This generally will be a single cpu (or core or
@@ -85,6 +103,16 @@
 typedef int32_t SbThreadAffinity
 ```
 
+### SbThreadContext ###
+
+A handle to the context of a frozen thread.
+
+#### Definition ####
+
+```
+typedef SbThreadContextPrivate* SbThreadContext
+```
+
 ### SbThreadEntryPoint ###
 
 Function pointer type for SbThreadCreate. `context` is a pointer-sized bit of
@@ -126,8 +154,40 @@
 typedef SbThreadLocalKeyPrivate* SbThreadLocalKey
 ```
 
+### SbThreadSampler ###
+
+A handle to a thread sampler.
+
+#### Definition ####
+
+```
+typedef SbThreadSamplerPrivate* SbThreadSampler
+```
+
 ## Functions ##
 
+### SbThreadContextGetPointer ###
+
+Gets the specified pointer-type `property` from the specified `context`. Returns
+`true` if successful and `out_value` has been modified, otherwise returns
+`false` and `out_value` is not modified.
+
+#### Declaration ####
+
+```
+bool SbThreadContextGetPointer(SbThreadContext context, SbThreadContextProperty property, void **out_value)
+```
+
+### SbThreadContextIsValid ###
+
+Returns whether the given thread context is valid.
+
+#### Declaration ####
+
+```
+static bool SbThreadContextIsValid(SbThreadContext context)
+```
+
 ### SbThreadCreate ###
 
 Creates a new thread, which starts immediately.
@@ -349,6 +409,77 @@
 bool SbThreadJoin(SbThread thread, void **out_return)
 ```
 
+### SbThreadSamplerCreate ###
+
+Creates a new thread sampler for the specified `thread`.
+
+If successful, this function returns the newly created handle. If unsuccessful,
+this function returns `kSbThreadSamplerInvalid`.
+
+#### Declaration ####
+
+```
+SbThreadSampler SbThreadSamplerCreate(SbThread thread)
+```
+
+### SbThreadSamplerDestroy ###
+
+Destroys the `sampler` and frees whatever resources it was using.
+
+#### Declaration ####
+
+```
+void SbThreadSamplerDestroy(SbThreadSampler sampler)
+```
+
+### SbThreadSamplerFreeze ###
+
+Suspends execution of the thread that `sampler` was created for.
+
+If successful, this function returns a `SbThreadContext` for the frozen thread,
+from which properties may be read while the thread remains frozen. If
+unsuccessful, this function returns `kSbThreadContextInvalid`.
+
+#### Declaration ####
+
+```
+SbThreadContext SbThreadSamplerFreeze(SbThreadSampler sampler)
+```
+
+### SbThreadSamplerIsSupported ###
+
+Whether the current platform supports thread sampling. The result of this
+function must not change over the course of the program, which means that the
+results of this function may be cached indefinitely. If this returns false,
+`SbThreadSamplerCreate` will return an invalid sampler.
+
+#### Declaration ####
+
+```
+bool SbThreadSamplerIsSupported()
+```
+
+### SbThreadSamplerIsValid ###
+
+Returns whether the given thread sampler is valid.
+
+#### Declaration ####
+
+```
+static bool SbThreadSamplerIsValid(SbThreadSampler sampler)
+```
+
+### SbThreadSamplerThaw ###
+
+Resumes execution of the thread that `sampler` was created for. This invalidates
+the context returned from `SbThreadSamplerFreeze`.
+
+#### Declaration ####
+
+```
+bool SbThreadSamplerThaw(SbThreadSampler sampler)
+```
+
 ### SbThreadSetLocalValue ###
 
 Sets the pointer-sized value for `key` in the currently executing thread's local
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/time.md b/src/cobalt/site/docs/reference/starboard/modules/13/time.md
similarity index 94%
rename from src/cobalt/site/docs/reference/starboard/modules/10/time.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/time.md
index bd59b91..17ea6ad 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/time.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/time.md
@@ -116,6 +116,16 @@
 SbTime SbTimeGetNow()
 ```
 
+### SbTimeIsTimeThreadNowSupported ###
+
+Returns whether the current platform supports time thread now
+
+#### Declaration ####
+
+```
+bool SbTimeIsTimeThreadNowSupported()
+```
+
 ### SbTimeNarrow ###
 
 Safely narrows a number from a more precise unit to a less precise one. This
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/time_zone.md b/src/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/time_zone.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/types.md b/src/cobalt/site/docs/reference/starboard/modules/13/types.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/types.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/types.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md b/src/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md
new file mode 100644
index 0000000..e5f533b
--- /dev/null
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md
@@ -0,0 +1,312 @@
+---
+layout: doc
+title: "Starboard Module Reference: ui_navigation.h"
+---
+
+API to allow applications to take advantage of the platform's native UI engine.
+This is mainly to drive the animation of visual elements and to signal which of
+those elements have focus. The implementation should not render any visual
+elements; instead, it will be used to guide the app in where these elements
+should be drawn.
+
+When the application creates the user interface, it will create SbUiNavItems for
+interactable elements. Additionally, the app must specify the position and size
+of these navigation items. As the app's user interface changes, it will create
+and destroy navigation items as appropriate.
+
+For each render frame, the app will query the local transform for each
+SbUiNavItem in case the native UI engine moves individual items in response to
+user interaction. If the navigation item is a container, then the content offset
+will also be queried to determine the placement of its content items.
+
+## Macros ##
+
+### kSbUiNavItemInvalid ###
+
+Well-defined value for an invalid navigation item.
+
+## Enums ##
+
+### SbUiNavItemType ###
+
+Navigation items may be one of the following types. This must be specified upon
+item creation and may not change during the item's lifespan.
+
+#### Values ####
+
+*   `kSbUiNavItemTypeFocus`
+
+    This is a single focusable item.
+*   `kSbUiNavItemTypeContainer`
+
+    This is a container of navigation items which can also be containers
+    themselves or focusable items. Containers themselves cannot be focused.
+
+## Typedefs ##
+
+### SbUiNavItem ###
+
+An opaque handle to an implementation-private structure representing a
+navigation item.
+
+#### Definition ####
+
+```
+typedef struct SbUiNavItemPrivate* SbUiNavItem
+```
+
+## Structs ##
+
+### SbUiNavCallbacks ###
+
+This structure specifies all the callbacks which the platform UI engine should
+invoke for various interaction events on navigation items. These callbacks may
+be invoked from any thread at any frequency. The `callback_context` is the value
+that was passed on creation of the relevant SbUiNavItem.
+
+#### Members ####
+
+*   `void(*onblur)(SbUiNavItem item, void *callback_context)`
+
+    Invoke when an item has lost focus. This is only used with focus items.
+*   `void(*onfocus)(SbUiNavItem item, void *callback_context)`
+
+    Invoke when an item has gained focus. This is only used with focus items.
+*   `void(*onscroll)(SbUiNavItem item, void *callback_context)`
+
+    Invoke when an item's content offset is changed. This is only used with
+    container items.
+
+### SbUiNavInterface ###
+
+This structure declares the interface to the UI navigation implementation. All
+function pointers must be specified if the platform supports UI navigation.
+
+#### Members ####
+
+*   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
+    *callbacks, void *callback_context)`
+
+    Create a new navigation item. When the user interacts with this item the
+    appropriate SbUiNavCallbacks function will be invoked with the provided
+    `callback_context`. An item is not interactable until it is enabled.
+*   `void(*destroy_item)(SbUiNavItem item)`
+
+    Destroy the given navigation item. If this is a content of another item,
+    then it will first be unregistered. Additionally, if this item contains
+    other items, then those will be unregistered as well, but they will not be
+    automatically destroyed.
+*   `void(*set_focus)(SbUiNavItem item)`
+
+    This is used to manually force focus on a navigation item of type
+    kSbUiNavItemTypeFocus. Any previously focused navigation item should receive
+    the blur event. If the item is not transitively a content of the root item,
+    then this does nothing. Specifying kSbUiNavItemInvalid should remove focus
+    from the UI navigation system.
+*   `void(*set_item_enabled)(SbUiNavItem item, bool enabled)`
+
+    This is used to enable or disable user interaction with the specified
+    navigation item. All navigation items are disabled when created, and they
+    must be explicitly enabled to allow user interaction. If a container is
+    disabled, then all of its contents are not interactable even though they
+    remain enabled. If `enabled` is false, it must be guaranteed that once this
+    function returns, no callbacks associated with this item will be invoked
+    until the item is re-enabled.
+*   `void(*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir)`
+
+    This specifies directionality for container items. Containers within
+    containers do not inherit directionality. Directionality must be specified
+    for each container explicitly. This should work even if `item` is disabled.
+*   `void(*set_item_focus_duration)(SbUiNavItem item, float seconds)`
+
+    Set the minimum amount of time the focus item should remain focused once it
+    becomes focused. This may be used to make important focus items harder to
+    navigate over. Focus may still be moved before `seconds` has elapsed by
+    using the set_focus() function. By default, item focus duration is 0
+    seconds.
+*   `void(*set_item_size)(SbUiNavItem item, float width, float height)`
+
+    Set the interactable size of the specified navigation item. By default, an
+    item's size is (0,0).
+*   `void(*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3
+    *transform)`
+
+    Set the transform for the navigation item and its contents if the item is a
+    container. This specifies the placement of the item's center within its
+    container. The transform origin is the center of the item. Distance is
+    measured in pixels with the origin being the top-left of the item's
+    container. By default, an item's transform is identity.
+*   `bool(*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4
+    *out_transform)`
+
+    Retrieve the focus transform matrix for the navigation item. The UI engine
+    may translate, rotate, and/or tilt focus items to reflect user interaction.
+    This transform should be multiplied with the item's transform to get its
+    position inside its container. The transform origin is the center of the
+    item. Return false if the item position should not be changed (i.e. the
+    transform should be treated as identity).
+*   `bool(*get_item_focus_vector)(SbUiNavItem item, float *out_x, float *out_y)`
+
+    Retrieve a vector representing the focus location within a focused item.
+    This is used to provide feedback about user input that is too small to
+    result in a focus change. If there is no focus vector for the navigation
+    item, then return false and leave `out_x` and `out_y` unchanged. Otherwise,
+    return true and set the output values in the range of [-1, +1] with (out_x,
+    out_y) of (-1, -1) being the top-left corner of the navigation item and (0,
+    0) being the center.
+*   `void(*set_item_container_window)(SbUiNavItem item, SbWindow window)`
+
+    This attaches the given navigation item (which must be a container) to the
+    specified window. Navigation items are only interactable if they are
+    transitively attached to a window.The native UI engine should never change
+    this navigation item's content offset. It is assumed to be used as a proxy
+    for the system window.A navigation item may only have a SbUiNavItem or
+    SbWindow as its direct container. The navigation item hierarchy is
+    established using set_item_container_item() with the root container attached
+    to a SbWindow using set_item_container_window() to enable interaction with
+    all enabled items in the hierarchy.
+
+    If `item` is already registered with a different window, then this will
+    unregister it from that window then attach it to the given `window`. It is
+    an error to register more than one navigation item with any given window. If
+    `window` is kSbWindowInvalid, then this will unregister the `item` from its
+    current window if any. Upon destruction of `item` or `window`, the `item` is
+    automatically unregistered from the `window`.
+*   `void(*set_item_container_item)(SbUiNavItem item, SbUiNavItem container)`
+
+    A container navigation item may contain other navigation items. However, it
+    is an error to have circular containment or for `container` to not be of
+    type kSbUiNavItemTypeContainer. If `item` already has a different container,
+    then this first serves that connection. If `container` is
+    kSbUiNavItemInvalid, then this removes `item` from its current container.
+    Upon destruction of `item` or `container`, the `item` is automatically
+    removed from the `container`.
+
+    The position of items within a container are specified relative to the
+    container's position. The position of these content items are further
+    modified by the container's "content offset".
+
+    For example, consider item A with position (5,5) and content offset (0,0).
+    Given item B with position (10,10) is registered as a content of item A.
+
+    1) Item B should be drawn at position (15,15).
+
+    2) If item A's content offset is changed to (10,0), then item B should be
+    drawn at position (5,15).
+
+    Essentially, content items should be drawn at: [container position] +
+    [content position] - [container content offset] Content items may overlap
+    within a container. This can cause obscured items to be unfocusable. The
+    only rule that needs to be followed is that contents which are focus items
+    can obscure other contents which are containers, but not vice versa. The
+    caller must ensure that content focus items do not overlap other content
+    focus items and content container items do not overlap other content
+    container items.
+*   `void(*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
+    float content_offset_y)`
+
+    Set the current content offset for the given container. This may be used to
+    force scrolling to make certain content items visible. A container item's
+    content offset helps determine where its content items should be drawn.
+    Essentially, a content item should be drawn at: [container position] +
+    [content position] - [container content offset] If `item` is not a
+    container, then this does nothing. By default, the content offset is (0,0).
+    This should update the values returned by get_item_content_offset() even if
+    the `item` is disabled.
+*   `void(*get_item_content_offset)(SbUiNavItem item, float
+    *out_content_offset_x, float *out_content_offset_y)`
+
+    Retrieve the current content offset for the navigation item. If `item` is
+    not a container, then the content offset is (0,0). The native UI engine
+    should not change the content offset of a container unless one of its
+    contents (possibly recursively) is focused. This is to allow seamlessly
+    disabling then re-enabling focus items without having their containers
+    change offsets.
+*   `void(*do_batch_update)(void(*update_function)(void *), void *context)`
+
+    Call `update_function` with `context` to perform a series of UI navigation
+    changes atomically before returning.
+
+### SbUiNavItemDir ###
+
+Navigation items of type kSbUiNavItemTypeContainer have directionality. If
+directionality is not specified for a container, it should default to left-to-
+right and top-to-bottom.
+
+```
+///   For left-to-right, content offset x = 0 shows the leftmost content.
+///                          |<--Container Size-->|
+///     +--------------------+--------------------+--------------------+
+///     | Not selectable.    | Selectable.        | Selectable.        |
+///     | Offscreen.         | Onscreen.          | Offscreen.         |
+///     | Negative position. | Positive position. | Positive position. |
+///     +--------------------+--------------------+--------------------+
+///                          ^
+///                  Content Offset X = 0.
+///
+///   For right-to-left, content offset x = 0 shows the rightmost content.
+///                          |<--Container Size-->|
+///     +--------------------+--------------------+--------------------+
+///     | Selectable.        | Selectable.        | Not selectable.    |
+///     | Offscreen.         | Onscreen.          | Offscreen.         |
+///     | Negative position. | Positive position. | Positive position. |
+///     +--------------------+--------------------+--------------------+
+///                          ^
+///                  Content Offset X = 0. 
+```
+
+```
+  Top-to-bottom is similar to left-to-right, but for the Y position.
+  Bottom-to-top is similar to right-to-left, but for the Y position.
+```
+
+#### Members ####
+
+*   `bool is_left_to_right`
+*   `bool is_top_to_bottom`
+
+### SbUiNavMatrix2x3 ###
+
+This represents a 2x3 transform matrix in row-major order.
+
+```
+///   | a b tx |
+///   | c d ty | 
+```
+
+#### Members ####
+
+*   `float m`
+
+### SbUiNavMatrix4 ###
+
+This represents a 4x4 transform matrix in row-major order.
+
+#### Members ####
+
+*   `float m`
+
+## Functions ##
+
+### SbUiNavGetInterface ###
+
+Retrieve the platform's UI navigation implementation. If the platform does not
+provide one, then return false without modifying `out_interface`. Otherwise,
+initialize all members of `out_interface` and return true.
+
+#### Declaration ####
+
+```
+bool SbUiNavGetInterface(SbUiNavInterface *out_interface)
+```
+
+### SbUiNavItemIsValid ###
+
+Returns whether the given navigation item handle is valid.
+
+#### Declaration ####
+
+```
+static bool SbUiNavItemIsValid(SbUiNavItem item)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/user.md b/src/cobalt/site/docs/reference/starboard/modules/13/user.md
similarity index 100%
rename from src/cobalt/site/docs/reference/starboard/modules/10/user.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/user.md
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/window.md b/src/cobalt/site/docs/reference/starboard/modules/13/window.md
similarity index 87%
rename from src/cobalt/site/docs/reference/starboard/modules/10/window.md
rename to src/cobalt/site/docs/reference/starboard/modules/13/window.md
index 8355b67..53cda4a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/window.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/13/window.md
@@ -163,6 +163,19 @@
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
+### SbWindowGetDiagonalSizeInInches ###
+
+Gets the size of the diagonal between two opposing screen corners.
+
+A return value of 0 means that starboard does not know what the screen diagonal
+is.
+
+#### Declaration ####
+
+```
+float SbWindowGetDiagonalSizeInInches(SbWindow window)
+```
+
 ### SbWindowGetOnScreenKeyboardBoundingRect ###
 
 Get the rectangle of the on screen keyboard in screen pixel coordinates. Return
@@ -236,12 +249,31 @@
 static bool SbWindowIsValid(SbWindow window)
 ```
 
+### SbWindowOnScreenKeyboardIsSupported ###
+
+Return whether the current platform supports an on screen keyboard
+
+#### Declaration ####
+
+```
+bool SbWindowOnScreenKeyboardIsSupported()
+```
+
+### SbWindowOnScreenKeyboardSuggestionsSupported ###
+
+Determine if the on screen keyboard has suggestions implemented. If this returns
+false, then calling SbWindowUpdateOnScreenKeyboardSuggestions() will be
+undefined.
+
+#### Declaration ####
+
+```
+bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window)
+```
+
 ### SbWindowSetDefaultOptions ###
 
-Gets the size of the diagonal between two opposing screen corners.
-
-A return value of 0 means that starboard does not know what the screen diagonal
-is. Sets the default options for system windows.
+Sets the default options for system windows.
 
 `options`: The option values to use as default values. This object must not be
 `NULL`.
@@ -283,3 +315,17 @@
 void SbWindowShowOnScreenKeyboard(SbWindow window, const char *input_text, int ticket)
 ```
 
+### SbWindowUpdateOnScreenKeyboardSuggestions ###
+
+Update the on screen keyboard custom suggestions. Fire
+kSbEventTypeOnScreenKeyboardSuggestionsUpdated.
+kSbEventTypeOnScreenKeyboardSuggestionsUpdated has data `ticket`. The
+suggestions should remain up-to-date when the keyboard is shown after being
+hidden.
+
+#### Declaration ####
+
+```
+void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
+```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/accessibility.md b/src/cobalt/site/docs/reference/starboard/modules/accessibility.md
index 1a5adcb..a6c8460 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/accessibility.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/accessibility.md
@@ -251,3 +251,4 @@
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/condition_variable.md b/src/cobalt/site/docs/reference/starboard/modules/condition_variable.md
index 22c2b79..836c4b8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/condition_variable.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/condition_variable.md
@@ -40,7 +40,7 @@
 #### Definition ####
 
 ```
-typedef union SbConditionVariable SbConditionVariable
+typedef union SbConditionVariable  SbConditionVariable
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/configuration.md
index 5e41790..4b2f8db 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/configuration.md
@@ -22,7 +22,7 @@
 
 ### SB_ALIGNOF(type) ###
 
-Returns the alignment reqiured for any instance of the type indicated by `type`.
+Returns the alignment required for any instance of the type indicated by `type`.
 
 ### SB_ARRAY_SIZE(array) ###
 
@@ -111,6 +111,11 @@
 Macro to annotate a function as noreturn, which signals to the compiler that the
 function cannot return.
 
+### SB_OVERRIDE ###
+
+Declares a function as overriding a virtual function on compilers that support
+it.
+
 ### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
 
 An enumeration of values for the kSbPreferredByteOrder configuration variable.
@@ -127,18 +132,11 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RELEASE_CANDIDATE_API_VERSION ###
-
-The next API version to be frozen, but is still subject to emergency changes. It
-is reasonable to base a port on the Release Candidate API version, but be aware
-that small incompatible changes may still be made to it. The following will be
-uncommented when an API version is a release candidate.
-
 ### SB_RESTRICT ###
 
 Include the platform-specific configuration. This macro is set by GYP in
 starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations. Makes a pointer-typed parameter restricted so that the
+all configurations.Makes a pointer-typed parameter restricted so that the
 compiler can make certain optimizations because it knows the pointers are
 unique.
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/configuration_constants.md b/src/cobalt/site/docs/reference/starboard/modules/configuration_constants.md
index 5c59a7c..b380f62 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/configuration_constants.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/configuration_constants.md
@@ -11,7 +11,7 @@
 
 ### kSbDefaultMmapThreshold ###
 
-Determines the threshhold of allocation size that should be done with mmap (if
+Determines the threshold of allocation size that should be done with mmap (if
 available), rather than allocated within the core heap.
 
 ### kSbFileAltSepChar ###
@@ -93,22 +93,6 @@
 The maximum video bitrate the platform can decode. The following value equals to
 8M bytes per seconds which is more than enough for compressed video.
 
-### kSbMediaMaximumVideoFrames ###
-
-Specify the number of video frames to be cached during playback. A large value
-leads to more stable fps but also causes the app to use more memory.
-
-### kSbMediaMaximumVideoPrerollFrames ###
-
-The encoded video frames are compressed in different ways, so their decoding
-time can vary a lot. Occasionally a single frame can take longer time to decode
-than the average time per frame. The player has to cache some frames to account
-for such inconsistency. The number of frames being cached are controlled by
-SB_MEDIA_MAXIMUM_VIDEO_PREROLL_FRAMES and SB_MEDIA_MAXIMUM_VIDEO_FRAMES.
-
-Specify the number of video frames to be cached before the playback starts. Note
-that setting this value too large may increase the playback start delay.
-
 ### kSbMediaVideoFrameAlignment ###
 
 Specifies how video frame buffers must be aligned on this platform.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/cpu_features.md b/src/cobalt/site/docs/reference/starboard/modules/cpu_features.md
index 9cdb94c..ee12e71 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/cpu_features.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/cpu_features.md
@@ -87,6 +87,9 @@
 *   `bool has_vfp3`
 
     VFP version 3
+*   `bool has_vfp4`
+
+    VFP version 4
 *   `bool has_vfp3_d32`
 
     VFP version 3 with 32 D-registers.
@@ -95,7 +98,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    Arm 64 feature flags
+    ###### Arm 64 feature flags  ######
 
     AES instructions.
 *   `bool has_crc32`
diff --git a/src/cobalt/site/docs/reference/starboard/modules/decode_target.md b/src/cobalt/site/docs/reference/starboard/modules/decode_target.md
index 6b068a3..852af38 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/decode_target.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/decode_target.md
@@ -12,7 +12,8 @@
 data. This allows the application to allocate fast graphics memory, and have
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
-SbDecodeTargetFormat
+
+## SbDecodeTargetFormat ##
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -20,7 +21,8 @@
 the SbDecodeTargetFormat passed into it, or the decode will produce an error.
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
-SbDecodeTargetGraphicsContextProvider
+
+## SbDecodeTargetGraphicsContextProvider ##
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -34,7 +36,8 @@
 
 The primary usage is likely to be the the SbPlayer implementation on some
 platforms.
-SbDecodeTarget Example
+
+## SbDecodeTarget Example ##
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -71,11 +74,10 @@
 
 // If the decode works, you can get the texture out and render it.
 SbDecodeTargetInfo info;
-SbMemorySet(&info, 0, sizeof(info));
+memset(&info, 0, sizeof(info));
 SbDecodeTargetGetInfo(target, &info);
 GLuint texture =
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
-
 ```
 
 ## Macros ##
@@ -118,8 +120,8 @@
     order.
 *   `kSbDecodeTargetFormat1PlaneUYVY`
 
-    A decoder target format consisting of a single plane with pixels layed out
-    in the format UYVY. Since there are two Y values per sample, but only one U
+    A decoder target format consisting of a single plane with pixels laid out in
+    the format UYVY. Since there are two Y values per sample, but only one U
     value and only one V value, horizontally the Y resolution is twice the size
     of both the U and V resolutions. Vertically, they Y, U and V all have the
     same resolution. This is a YUV 422 format. When using this format with GL
@@ -392,3 +394,4 @@
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/drm.md b/src/cobalt/site/docs/reference/starboard/modules/drm.md
index 3036863..beb65c9 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/drm.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/drm.md
@@ -158,7 +158,7 @@
 
 ### SbDrmSystem ###
 
-A handle to a DRM system which can be used with either an SbDecoder or a
+A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
 #### Definition ####
diff --git a/src/cobalt/site/docs/reference/starboard/modules/egl.md b/src/cobalt/site/docs/reference/starboard/modules/egl.md
index 6990f44..b1e120b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/egl.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/egl.md
@@ -10,7 +10,8 @@
 This API is designed to abstract the differences between EGL implementations and
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
-EGL Version
+
+## EGL Version ##
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
@@ -72,163 +73,75 @@
 
 #### Members ####
 
-*   ` eglChooseConfig`
-
-    SbEglBoolean (\*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32\*
-    attrib_list, SbEglConfig\* configs, SbEglInt32 config_size, SbEglInt32\*
-    num_config);
-*   ` eglCopyBuffers`
-
-    SbEglBoolean (\*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglNativePixmapType target);
-*   ` eglCreateContext`
-
-    SbEglContext (\*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
-    SbEglContext share_context, const SbEglInt32\* attrib_list);
-*   ` eglCreatePbufferSurface`
-
-    SbEglSurface (\*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
-    config, const SbEglInt32\* attrib_list);
-*   ` eglCreatePixmapSurface`
-
-    SbEglSurface (\*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig
-    config, SbEglNativePixmapType pixmap, const SbEglInt32\* attrib_list);
-*   ` eglCreateWindowSurface`
-
-    SbEglSurface (\*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig
-    config, SbEglNativeWindowType win, const SbEglInt32\* attrib_list);
-*   ` eglDestroyContext`
-
-    SbEglBoolean (\*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx);
-*   ` eglDestroySurface`
-
-    SbEglBoolean (\*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface);
-*   ` eglGetConfigAttrib`
-
-    SbEglBoolean (\*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglGetConfigs`
-
-    SbEglBoolean (\*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig\* configs,
-    SbEglInt32 config_size, SbEglInt32\* num_config);
-*   ` eglGetCurrentDisplay`
-
-    SbEglDisplay (\*eglGetCurrentDisplay)(void);
-*   ` eglGetCurrentSurface`
-
-    SbEglSurface (\*eglGetCurrentSurface)(SbEglInt32 readdraw);
-*   ` eglGetDisplay`
-
-    SbEglDisplay (\*eglGetDisplay)(SbEglNativeDisplayType display_id);
-*   ` eglGetError`
-
-    SbEglInt32 (\*eglGetError)(void);
-*   ` eglGetProcAddress`
-
-    SbEglCastsToProperFunctionPointerType (\*eglGetProcAddress)(const char\*
-    procname);
-*   ` eglInitialize`
-
-    SbEglBoolean (\*eglInitialize)(SbEglDisplay dpy, SbEglInt32\* major,
-    SbEglInt32\* minor);
-*   ` eglMakeCurrent`
-
-    SbEglBoolean (\*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
-    SbEglSurface read, SbEglContext ctx);
-*   ` eglQueryContext`
-
-    SbEglBoolean (\*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglQueryString`
-
-    const char\* (\*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name);
-*   ` eglQuerySurface`
-
-    SbEglBoolean (\*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 attribute, SbEglInt32\* value);
-*   ` eglSwapBuffers`
-
-    SbEglBoolean (\*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface);
-*   ` eglTerminate`
-
-    SbEglBoolean (\*eglTerminate)(SbEglDisplay dpy);
-*   ` eglWaitGL`
-
-    SbEglBoolean (\*eglWaitGL)(void);
-*   ` eglWaitNative`
-
-    SbEglBoolean (\*eglWaitNative)(SbEglInt32 engine);
-*   ` eglBindTexImage`
-
-    SbEglBoolean (\*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 buffer);
-*   ` eglReleaseTexImage`
-
-    SbEglBoolean (\*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 buffer);
-*   ` eglSurfaceAttrib`
-
-    SbEglBoolean (\*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
-    SbEglInt32 attribute, SbEglInt32 value);
-*   ` eglSwapInterval`
-
-    SbEglBoolean (\*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval);
-*   ` eglBindAPI`
-
-    SbEglBoolean (\*eglBindAPI)(SbEglEnum api);
-*   ` eglQueryAPI`
-
-    SbEglEnum (\*eglQueryAPI)(void);
-*   ` eglCreatePbufferFromClientBuffer`
-
-    SbEglSurface (\*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy,
-    SbEglEnum buftype, SbEglClientBuffer buffer, SbEglConfig config, const
-    SbEglInt32\* attrib_list);
-*   ` eglReleaseThread`
-
-    SbEglBoolean (\*eglReleaseThread)(void);
-*   ` eglWaitClient`
-
-    SbEglBoolean (\*eglWaitClient)(void);
-*   ` eglGetCurrentContext`
-
-    SbEglContext (\*eglGetCurrentContext)(void);
-*   ` eglCreateSync`
-
-    SbEglSync (\*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
-    SbEglAttrib\* attrib_list);
-*   ` eglDestroySync`
-
-    SbEglBoolean (\*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync);
-*   ` eglClientWaitSync`
-
-    SbEglInt32 (\*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync,
-    SbEglInt32 flags, SbEglTime timeout);
-*   ` eglGetSyncAttrib`
-
-    SbEglBoolean (\*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
-    SbEglInt32 attribute, SbEglAttrib\* value);
-*   ` eglCreateImage`
-
-    SbEglImage (\*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
-    target, SbEglClientBuffer buffer, const SbEglAttrib\* attrib_list);
-*   ` eglDestroyImage`
-
-    SbEglBoolean (\*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image);
-*   ` eglGetPlatformDisplay`
-
-    SbEglDisplay (\*eglGetPlatformDisplay)(SbEglEnum platform, void\*
-    native_display, const SbEglAttrib\* attrib_list);
-*   ` eglCreatePlatformWindowSurface`
-
-    SbEglSurface (\*eglCreatePlatformWindowSurface)(SbEglDisplay dpy,
-    SbEglConfig config, void\* native_window, const SbEglAttrib\* attrib_list);
-*   ` eglCreatePlatformPixmapSurface`
-
-    SbEglSurface (\*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy,
-    SbEglConfig config, void\* native_pixmap, const SbEglAttrib\* attrib_list);
-*   ` eglWaitSync`
-
-    SbEglBoolean (\*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
-    flags);
+*   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
+    *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
+    *num_config)`
+*   `SbEglBoolean(*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target)`
+*   `SbEglContext(*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativePixmapType pixmap, const SbEglInt32 *attrib_list)`
+*   `SbEglSurface(*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglNativeWindowType win, const SbEglInt32 *attrib_list)`
+*   `SbEglBoolean(*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx)`
+*   `SbEglBoolean(*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig *configs,
+    SbEglInt32 config_size, SbEglInt32 *num_config)`
+*   `SbEglDisplay(*eglGetCurrentDisplay)(void)`
+*   `SbEglSurface(*eglGetCurrentSurface)(SbEglInt32 readdraw)`
+*   `SbEglDisplay(*eglGetDisplay)(SbEglNativeDisplayType display_id)`
+*   `SbEglInt32(*eglGetError)(void)`
+*   `SbEglCastsToProperFunctionPointerType(*eglGetProcAddress)(const char
+    *procname)`
+*   `SbEglBoolean(*eglInitialize)(SbEglDisplay dpy, SbEglInt32 *major,
+    SbEglInt32 *minor)`
+*   `SbEglBoolean(*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx)`
+*   `SbEglBoolean(*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `const char *(*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name)`
+*   `SbEglBoolean(*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 *value)`
+*   `SbEglBoolean(*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface)`
+*   `SbEglBoolean(*eglTerminate)(SbEglDisplay dpy)`
+*   `SbEglBoolean(*eglWaitGL)(void)`
+*   `SbEglBoolean(*eglWaitNative)(SbEglInt32 engine)`
+*   `SbEglBoolean(*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer)`
+*   `SbEglBoolean(*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value)`
+*   `SbEglBoolean(*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval)`
+*   `SbEglBoolean(*eglBindAPI)(SbEglEnum api)`
+*   `SbEglEnum(*eglQueryAPI)(void)`
+*   `SbEglSurface(*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy, SbEglEnum
+    buftype, SbEglClientBuffer buffer, SbEglConfig config, const SbEglInt32
+    *attrib_list)`
+*   `SbEglBoolean(*eglReleaseThread)(void)`
+*   `SbEglBoolean(*eglWaitClient)(void)`
+*   `SbEglContext(*eglGetCurrentContext)(void)`
+*   `SbEglSync(*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync)`
+*   `SbEglInt32(*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags, SbEglTime timeout)`
+*   `SbEglBoolean(*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib *value)`
+*   `SbEglImage(*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image)`
+*   `SbEglDisplay(*eglGetPlatformDisplay)(SbEglEnum platform, void
+    *native_display, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_window, const SbEglAttrib *attrib_list)`
+*   `SbEglSurface(*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, void *native_pixmap, const SbEglAttrib *attrib_list)`
+*   `SbEglBoolean(*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags)`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/event.md b/src/cobalt/site/docs/reference/starboard/modules/event.md
index 65b6394..601e343 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/event.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/event.md
@@ -3,8 +3,92 @@
 title: "Starboard Module Reference: event.h"
 ---
 
+For SB_API_VERSION >= 13
+
+Module Overview: Starboard Event module
+
 Defines the event system that wraps the Starboard main loop and entry point.
-The Starboard Application Lifecycle
+
+## The Starboard Application Lifecycle ##
+
+```
+               * ----------
+               |           |
+             Start         |
+               |           |
+               V           |
+         [===========]     |
+    ---> [  STARTED  ]     |
+   |     [===========]     |
+   |           |           |
+ Focus       Blur      Preload
+   |           |           |
+   |           V           |
+    ---- [===========]     |
+    ---> [  BLURRED  ]     |
+   |     [===========]     |
+   |           |           |
+ Reveal     Conceal        |
+   |           |           |
+   |           V           |
+   |     [===========]     |
+    ---- [ CONCEALED ] <---
+    ---> [===========]
+   |           |
+Unfreeze     Freeze
+   |           |
+   |           V
+   |     [===========]
+    ---- [  FROZEN   ]
+         [===========]
+               |
+              Stop
+               |
+               V
+         [===========]
+         [  STOPPED  ]
+         [===========]
+
+```
+
+The first event that a Starboard application receives is either `Start`
+(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
+application in the `STARTED` state, whereas `Preload` puts the application in
+the `CONCEALED` state.
+
+In the `STARTED` state, the application is in the foreground and can expect to
+do all of the normal things it might want to do. Once in the `STARTED` state, it
+may receive a `Blur` event, putting the application into the `BLURRED` state.
+
+In the `BLURRED` state, the application is still visible, but has lost focus, or
+it is partially obscured by a modal dialog, or it is on its way to being shut
+down. The application should blur activity in this state. In this state, it can
+receive `Focus` to be brought back to the foreground state (`STARTED`), or
+`Conceal` to be pushed to the `CONCEALED` state.
+
+In the `CONCEALED` state, the application should behave as it should for an
+invisible program that can still run, and that can optionally access the network
+and playback audio, albeit potentially will have less CPU and memory available.
+The application may get switched from `CONCEALED` to `FROZEN` at any time, when
+the platform decides to do so.
+
+In the `FROZEN` state, the application is not visible. It should immediately
+release all graphics and video resources, and shut down all background activity
+(timers, rendering, etc). Additionally, the application should flush storage to
+ensure that if the application is killed, the storage will be up-to-date. The
+application may be killed at this point, but will ideally receive a `Stop` event
+for a more graceful shutdown.
+
+Note that the application is always expected to transition through `BLURRED`,
+`CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
+
+For SB_API_VERSION < 13
+
+Module Overview: Starboard Event module
+
+Defines the event system that wraps the Starboard main loop and entry point.
+
+## The Starboard Application Lifecycle ##
 
 ```
     ---------- *
@@ -79,65 +163,68 @@
 
 *   `kSbEventTypePreload`
 
-    Applications should perform initialization and prepare to react to
-    subsequent events, but must not initialize any graphics resources (through
-    GL or SbBlitter). The intent of this event is to allow the application to do
-    as much work as possible ahead of time, so that when the application is
-    first brought to the foreground, it's as fast as a resume.
-
-    The `kSbEventTypeStart` event may be sent at any time, regardless of
-    initialization state. Input events will not be sent in the `PRELOADING`
-    state. This event will only be sent once for a given process launch.
-    SbEventStartData is passed as the data argument.
-
-    The system may send `kSbEventTypeSuspend` in `PRELOADING` if it wants to
-    push the app into a lower resource consumption state. Applications can alo
-    call SbSystemRequestSuspend() when they are done preloading to request this.
+    The system may send `kSbEventTypePreload` in `UNSTARTED` if it wants to push
+    the app into a lower resource consumption state. Applications will also call
+    SbSystemRequestConceal() when they request this. The only events that should
+    be dispatched after a Preload event are Reveal or Freeze. No data argument.
 *   `kSbEventTypeStart`
 
     The first event that an application receives on startup when starting
-    normally (i.e. not being preloaded). Applications should perform
-    initialization, start running, and prepare to react to subsequent events.
-    Applications that wish to run and then exit must call
-    `SbSystemRequestStop()` to terminate. This event will only be sent once for
-    a given process launch. `SbEventStartData` is passed as the data argument.
-    In case of preload, the `SbEventStartData` will be the same as what was
-    passed to `kSbEventTypePreload`.
-*   `kSbEventTypePause`
+    normally. Applications should perform initialization, start running, and
+    prepare to react to subsequent events. Applications that wish to run and
+    then exit must call `SbSystemRequestStop()` to terminate. This event will
+    only be sent once for a given process launch. `SbEventStartData` is passed
+    as the data argument.
+*   `kSbEventTypeBlur`
 
     A dialog will be raised or the application will otherwise be put into a
-    background-but-visible or partially-obscured state (PAUSED). Graphics and
-    video resources will still be available, but the application should pause
+    background-but-visible or partially-obscured state (BLURRED). Graphics and
+    video resources will still be available, but the application could pause
     foreground activity like animations and video playback. Can only be received
-    after a Start event. The only events that should be dispatched after a Pause
-    event are Unpause or Suspend. No data argument.
-*   `kSbEventTypeUnpause`
+    after a Start event. The only events that should be dispatched after a Blur
+    event are Focus or Conceal. No data argument.
+*   `kSbEventTypeFocus`
 
     The application is returning to the foreground (STARTED) after having been
-    put in the PAUSED (e.g. partially-obscured) state. The application should
-    unpause foreground activity like animations and video playback. Can only be
-    received after a Pause or Resume event. No data argument.
-*   `kSbEventTypeSuspend`
+    put in the BLURRED (e.g. partially-obscured) state. The application should
+    resume foreground activity like animations and video playback. Can only be
+    received after a Blur or Reveal event. No data argument.
+*   `kSbEventTypeConceal`
 
-    The operating system will put the application into a Suspended state after
+    The operating system will put the application into the Concealed state after
+    this event is handled. The application is expected to be made invisible, but
+    background tasks can still be running, such as audio playback, or updating
+    of recommendations. Can only be received after a Blur or Reveal event. The
+    only events that should be dispatched after a Conceal event are Freeze or
+    Reveal. On some platforms, the process may also be killed after Conceal
+    without a Freeze event.
+*   `kSbEventTypeReveal`
+
+    The operating system will restore the application to the BLURRED state from
+    the CONCEALED state. This is the first event the application will receive
+    coming out of CONCEALED, and it can be received after a Conceal or Unfreeze
+    event. The application will now be in the BLURRED state. No data argument.
+*   `kSbEventTypeFreeze`
+
+    The operating system will put the application into the Frozen state after
     this event is handled. The application is expected to stop periodic
     background work, release ALL graphics and video resources, and flush any
     pending SbStorage writes. Some platforms will terminate the application if
-    work is done or resources are retained after suspension. Can only be
-    received after a Pause event. The only events that should be dispatched
-    after a Suspend event are Resume or Stop. On some platforms, the process may
-    also be killed after Suspend without a Stop event. No data argument.
-*   `kSbEventTypeResume`
+    work is done or resources are retained after freezing. Can be received after
+    a Conceal or Unfreeze event. The only events that should be dispatched after
+    a Freeze event are Unfreeze or Stop. On some platforms, the process may also
+    be killed after Freeze without a Stop event. No data argument.
+*   `kSbEventTypeUnfreeze`
 
-    The operating system has restored the application to the PAUSED state from
-    the SUSPENDED state. This is the first event the application will receive
-    coming out of SUSPENDED, and it will only be received after a Suspend event.
-    The application will now be in the PAUSED state. No data argument.
+    The operating system has restored the application to the CONCEALED state
+    from the FROZEN state. This is the first event the application will receive
+    coming out of FROZEN, and it will only be received after a Freeze event. The
+    application will now be in the CONCEALED state. NO data argument.
 *   `kSbEventTypeStop`
 
     The operating system will shut the application down entirely after this
-    event is handled. Can only be recieved after a Suspend event, in the
-    SUSPENDED state. No data argument.
+    event is handled. Can only be received after a Freeze event, in the FROZEN
+    state. No data argument.
 *   `kSbEventTypeInput`
 
     A user input event, including keyboard, mouse, gesture, or something else.
@@ -165,16 +252,17 @@
     response to an application call to SbEventSchedule(), and it will call the
     callback directly, so SbEventHandle should never receive this event
     directly. The data type is an internally-defined structure.
-*   `kSbEventTypeAccessiblitySettingsChanged`
+*   `kSbEventTypeAccessibilitySettingsChanged`
 
     The platform's accessibility settings have changed. The application should
     query the accessibility settings using the appropriate APIs to get the new
     settings. Note this excludes captions settings changes, which causes
     kSbEventTypeAccessibilityCaptionSettingsChanged to fire. If the starboard
-    version has kSbEventTypeAccessiblityTextToSpeechSettingsChanged, then that
-    event should be used to signal text-to-speech settings changes instead;
+    version has kSbEventTypeAccessib(i)lityTextToSpeechSettingsChanged, then
+    that event should be used to signal text-to-speech settings changes instead;
     platforms using older starboard versions should use
-    kSbEventTypeAccessiblitySettingsChanged for text-to-speech settings changes.
+    kSbEventTypeAccessib(i)litySettingsChanged for text-to-speech settings
+    changes.
 *   `kSbEventTypeLowMemory`
 
     An optional event that platforms may send to indicate that the application
@@ -234,11 +322,29 @@
     ticket value kSbEventOnScreenKeyboardInvalidTicket.
 *   `kSbEventTypeAccessibilityCaptionSettingsChanged`
 
-    SB_HAS(ON_SCREEN_KEYBOARD) One or more of the fields returned by
+    SB_HAS(ON_SCREEN_KEYBOARD)One or more of the fields returned by
     SbAccessibilityGetCaptionSettings has changed.
-*   `kSbEventTypeAccessiblityTextToSpeechSettingsChanged`
+*   `kSbEventTypeAccessibilityTextToSpeechSettingsChanged`
 
     The platform's text-to-speech settings have changed.
+*   `kSbEventTypeOsNetworkDisconnected`
+
+    The platform has detected a network disconnection. There are likely to be
+    cases where the platform cannot detect the disconnection but the platform
+    should make a best effort to send an event of this type when the network
+    disconnects. This event is used to implement window.onoffline DOM event.
+*   `kSbEventTypeOsNetworkConnected`
+
+    The platform has detected a network connection. There are likely to be cases
+    where the platform cannot detect the connection but the platform should make
+    a best effort to send an event of this type when the device is just
+    connected to the internet. This event is used to implement window.ononline
+    DOM event.
+*   `kSbEventDateTimeConfigurationChanged`
+
+    The platform has detected a date and/or time configuration change (such as a
+    change in the timezone setting). This should trigger the application to re-
+    query the relevant APIs to update the date and time.
 
 ## Typedefs ##
 
@@ -281,6 +387,7 @@
 #### Members ####
 
 *   `SbEventType type`
+*   `SbTimeMonotonic timestamp`
 *   `void * data`
 
 ### SbEventStartData ###
diff --git a/src/cobalt/site/docs/reference/starboard/modules/gles.md b/src/cobalt/site/docs/reference/starboard/modules/gles.md
index 20c5924..7a9108a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/gles.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/gles.md
@@ -10,7 +10,8 @@
 This API is designed to abstract the differences between GLES implementations
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
-GLES Version
+
+## GLES Version ##
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
@@ -60,895 +61,402 @@
 
 #### Members ####
 
-*   ` glActiveTexture`
+*   `void(*glActiveTexture)(SbGlEnum texture)`
 
-    void (\*glActiveTexture)(SbGlEnum texture);
-*   ` glAttachShader`
-
-    void (\*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader);
-*   ` glBindAttribLocation`
-
-    void (\*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
-    SbGlChar\* name);
-*   ` glBindBuffer`
-
-    void (\*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer);
-*   ` glBindFramebuffer`
-
-    void (\*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer);
-*   ` glBindRenderbuffer`
-
-    void (\*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer);
-*   ` glBindTexture`
-
-    void (\*glBindTexture)(SbGlEnum target, SbGlUInt32 texture);
-*   ` glBlendColor`
-
-    void (\*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
-    SbGlFloat alpha);
-*   ` glBlendEquation`
-
-    void (\*glBlendEquation)(SbGlEnum mode);
-*   ` glBlendEquationSeparate`
-
-    void (\*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha);
-*   ` glBlendFunc`
-
-    void (\*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor);
-*   ` glBlendFuncSeparate`
-
-    void (\*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
-    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha);
-*   ` glBufferData`
-
-    void (\*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void\* data,
-    SbGlEnum usage);
-*   ` glBufferSubData`
-
-    void (\*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
-    size, const void\* data);
-*   ` glCheckFramebufferStatus`
-
-    SbGlEnum (\*glCheckFramebufferStatus)(SbGlEnum target);
-*   ` glClear`
-
-    void (\*glClear)(SbGlBitfield mask);
-*   ` glClearColor`
-
-    void (\*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
-    SbGlFloat alpha);
-*   ` glClearDepthf`
-
-    void (\*glClearDepthf)(SbGlFloat d);
-*   ` glClearStencil`
-
-    void (\*glClearStencil)(SbGlInt32 s);
-*   ` glColorMask`
-
-    void (\*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
-    SbGlBoolean alpha);
-*   ` glCompileShader`
-
-    void (\*glCompileShader)(SbGlUInt32 shader);
-*   ` glCompressedTexImage2D`
-
-    void (\*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
+    .
+*   `void(*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar *name)`
+*   `void(*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer)`
+*   `void(*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer)`
+*   `void(*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer)`
+*   `void(*glBindTexture)(SbGlEnum target, SbGlUInt32 texture)`
+*   `void(*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glBlendEquation)(SbGlEnum mode)`
+*   `void(*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha)`
+*   `void(*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor)`
+*   `void(*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha)`
+*   `void(*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void *data,
+    SbGlEnum usage)`
+*   `void(*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void *data)`
+*   `SbGlEnum(*glCheckFramebufferStatus)(SbGlEnum target)`
+*   `void(*glClear)(SbGlBitfield mask)`
+*   `void(*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha)`
+*   `void(*glClearDepthf)(SbGlFloat d)`
+*   `void(*glClearStencil)(SbGlInt32 s)`
+*   `void(*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha)`
+*   `void(*glCompileShader)(SbGlUInt32 shader)`
+*   `void(*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
-    SbGlSizei imageSize, const void\* data);
-*   ` glCompressedTexSubImage2D`
-
-    void (\*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
     SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
-    SbGlEnum format, SbGlSizei imageSize, const void\* data);
-*   ` glCopyTexImage2D`
-
-    void (\*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    SbGlEnum format, SbGlSizei imageSize, const void *data)`
+*   `void(*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
-    SbGlInt32 border);
-*   ` glCopyTexSubImage2D`
-
-    void (\*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlInt32 border)`
+*   `void(*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
-    SbGlSizei height);
-*   ` glCreateProgram`
-
-    SbGlUInt32 (\*glCreateProgram)(void);
-*   ` glCreateShader`
-
-    SbGlUInt32 (\*glCreateShader)(SbGlEnum type);
-*   ` glCullFace`
-
-    void (\*glCullFace)(SbGlEnum mode);
-*   ` glDeleteBuffers`
-
-    void (\*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32\* buffers);
-*   ` glDeleteFramebuffers`
-
-    void (\*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32\* framebuffers);
-*   ` glDeleteProgram`
-
-    void (\*glDeleteProgram)(SbGlUInt32 program);
-*   ` glDeleteRenderbuffers`
-
-    void (\*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32\*
-    renderbuffers);
-*   ` glDeleteShader`
-
-    void (\*glDeleteShader)(SbGlUInt32 shader);
-*   ` glDeleteTextures`
-
-    void (\*glDeleteTextures)(SbGlSizei n, const SbGlUInt32\* textures);
-*   ` glDepthFunc`
-
-    void (\*glDepthFunc)(SbGlEnum func);
-*   ` glDepthMask`
-
-    void (\*glDepthMask)(SbGlBoolean flag);
-*   ` glDepthRangef`
-
-    void (\*glDepthRangef)(SbGlFloat n, SbGlFloat f);
-*   ` glDetachShader`
-
-    void (\*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader);
-*   ` glDisable`
-
-    void (\*glDisable)(SbGlEnum cap);
-*   ` glDisableVertexAttribArray`
-
-    void (\*glDisableVertexAttribArray)(SbGlUInt32 index);
-*   ` glDrawArrays`
-
-    void (\*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count);
-*   ` glDrawElements`
-
-    void (\*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
-    void\* indices);
-*   ` glEnable`
-
-    void (\*glEnable)(SbGlEnum cap);
-*   ` glEnableVertexAttribArray`
-
-    void (\*glEnableVertexAttribArray)(SbGlUInt32 index);
-*   ` glFinish`
-
-    void (\*glFinish)(void);
-*   ` glFlush`
-
-    void (\*glFlush)(void);
-*   ` glFramebufferRenderbuffer`
-
-    void (\*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
-    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer);
-*   ` glFramebufferTexture2D`
-
-    void (\*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
-    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level);
-*   ` glFrontFace`
-
-    void (\*glFrontFace)(SbGlEnum mode);
-*   ` glGenBuffers`
-
-    void (\*glGenBuffers)(SbGlSizei n, SbGlUInt32\* buffers);
-*   ` glGenerateMipmap`
-
-    void (\*glGenerateMipmap)(SbGlEnum target);
-*   ` glGenFramebuffers`
-
-    void (\*glGenFramebuffers)(SbGlSizei n, SbGlUInt32\* framebuffers);
-*   ` glGenRenderbuffers`
-
-    void (\*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32\* renderbuffers);
-*   ` glGenTextures`
-
-    void (\*glGenTextures)(SbGlSizei n, SbGlUInt32\* textures);
-*   ` glGetActiveAttrib`
-
-    void (\*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
-    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
-    name);
-*   ` glGetActiveUniform`
-
-    void (\*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
-    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
-    name);
-*   ` glGetAttachedShaders`
-
-    void (\*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
-    SbGlSizei\* count, SbGlUInt32\* shaders);
-*   ` glGetAttribLocation`
-
-    SbGlInt32 (\*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glGetBooleanv`
-
-    void (\*glGetBooleanv)(SbGlEnum pname, SbGlBoolean\* data);
-*   ` glGetBufferParameteriv`
-
-    void (\*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetError`
-
-    SbGlEnum (\*glGetError)(void);
-*   ` glGetFloatv`
-
-    void (\*glGetFloatv)(SbGlEnum pname, SbGlFloat\* data);
-*   ` glGetFramebufferAttachmentParameteriv`
-
-    void (\*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
-    attachment, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetIntegerv`
-
-    void (\*glGetIntegerv)(SbGlEnum pname, SbGlInt32\* data);
-*   ` glGetProgramiv`
-
-    void (\*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetProgramInfoLog`
-
-    void (\*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlChar\* infoLog);
-*   ` glGetRenderbufferParameteriv`
-
-    void (\*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
-    SbGlInt32\* params);
-*   ` glGetShaderiv`
-
-    void (\*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetShaderInfoLog`
-
-    void (\*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlChar\* infoLog);
-*   ` glGetShaderPrecisionFormat`
-
-    void (\*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
-    precisiontype, SbGlInt32\* range, SbGlInt32\* precision);
-*   ` glGetShaderSource`
-
-    void (\*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei\*
-    length, SbGlChar\* source);
-*   ` glGetString`
-
-    const SbGlUInt8\* (\*glGetString)(SbGlEnum name);
-*   ` glGetTexParameterfv`
-
-    void (\*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat\*
-    params);
-*   ` glGetTexParameteriv`
-
-    void (\*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetUniformfv`
-
-    void (\*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat\*
-    params);
-*   ` glGetUniformiv`
-
-    void (\*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32\*
-    params);
-*   ` glGetUniformLocation`
-
-    SbGlInt32 (\*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glGetVertexAttribfv`
-
-    void (\*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat\*
-    params);
-*   ` glGetVertexAttribiv`
-
-    void (\*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetVertexAttribPointerv`
-
-    void (\*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname,
-    void\*\* pointer);
-*   ` glHint`
-
-    void (\*glHint)(SbGlEnum target, SbGlEnum mode);
-*   ` glIsBuffer`
-
-    SbGlBoolean (\*glIsBuffer)(SbGlUInt32 buffer);
-*   ` glIsEnabled`
-
-    SbGlBoolean (\*glIsEnabled)(SbGlEnum cap);
-*   ` glIsFramebuffer`
-
-    SbGlBoolean (\*glIsFramebuffer)(SbGlUInt32 framebuffer);
-*   ` glIsProgram`
-
-    SbGlBoolean (\*glIsProgram)(SbGlUInt32 program);
-*   ` glIsRenderbuffer`
-
-    SbGlBoolean (\*glIsRenderbuffer)(SbGlUInt32 renderbuffer);
-*   ` glIsShader`
-
-    SbGlBoolean (\*glIsShader)(SbGlUInt32 shader);
-*   ` glIsTexture`
-
-    SbGlBoolean (\*glIsTexture)(SbGlUInt32 texture);
-*   ` glLineWidth`
-
-    void (\*glLineWidth)(SbGlFloat width);
-*   ` glLinkProgram`
-
-    void (\*glLinkProgram)(SbGlUInt32 program);
-*   ` glPixelStorei`
-
-    void (\*glPixelStorei)(SbGlEnum pname, SbGlInt32 param);
-*   ` glPolygonOffset`
-
-    void (\*glPolygonOffset)(SbGlFloat factor, SbGlFloat units);
-*   ` glReadPixels`
-
-    void (\*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height, SbGlEnum format, SbGlEnum type, void\* pixels);
-*   ` glReleaseShaderCompiler`
-
-    void (\*glReleaseShaderCompiler)(void);
-*   ` glRenderbufferStorage`
-
-    void (\*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
-    SbGlSizei width, SbGlSizei height);
-*   ` glSampleCoverage`
-
-    void (\*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert);
-*   ` glScissor`
-
-    void (\*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height);
-*   ` glShaderBinary`
-
-    void (\*glShaderBinary)(SbGlSizei count, const SbGlUInt32\* shaders,
-    SbGlEnum binaryformat, const void\* binary, SbGlSizei length);
-*   ` glShaderSource`
-
-    void (\*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar\*
-    const\* string, const SbGlInt32\* length);
-*   ` glStencilFunc`
-
-    void (\*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask);
-*   ` glStencilFuncSeparate`
-
-    void (\*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
-    SbGlUInt32 mask);
-*   ` glStencilMask`
-
-    void (\*glStencilMask)(SbGlUInt32 mask);
-*   ` glStencilMaskSeparate`
-
-    void (\*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask);
-*   ` glStencilOp`
-
-    void (\*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass);
-*   ` glStencilOpSeparate`
-
-    void (\*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
-    SbGlEnum dppass);
-*   ` glTexImage2D`
-
-    void (\*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlSizei height)`
+*   `SbGlUInt32(*glCreateProgram)(void)`
+*   `SbGlUInt32(*glCreateShader)(SbGlEnum type)`
+*   `void(*glCullFace)(SbGlEnum mode)`
+*   `void(*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32 *buffers)`
+*   `void(*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32 *framebuffers)`
+*   `void(*glDeleteProgram)(SbGlUInt32 program)`
+*   `void(*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32 *renderbuffers)`
+*   `void(*glDeleteShader)(SbGlUInt32 shader)`
+*   `void(*glDeleteTextures)(SbGlSizei n, const SbGlUInt32 *textures)`
+*   `void(*glDepthFunc)(SbGlEnum func)`
+*   `void(*glDepthMask)(SbGlBoolean flag)`
+*   `void(*glDepthRangef)(SbGlFloat n, SbGlFloat f)`
+*   `void(*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader)`
+*   `void(*glDisable)(SbGlEnum cap)`
+*   `void(*glDisableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count)`
+*   `void(*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void *indices)`
+*   `void(*glEnable)(SbGlEnum cap)`
+*   `void(*glEnableVertexAttribArray)(SbGlUInt32 index)`
+*   `void(*glFinish)(void)`
+*   `void(*glFlush)(void)`
+*   `void(*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer)`
+*   `void(*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level)`
+*   `void(*glFrontFace)(SbGlEnum mode)`
+*   `void(*glGenBuffers)(SbGlSizei n, SbGlUInt32 *buffers)`
+*   `void(*glGenerateMipmap)(SbGlEnum target)`
+*   `void(*glGenFramebuffers)(SbGlSizei n, SbGlUInt32 *framebuffers)`
+*   `void(*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32 *renderbuffers)`
+*   `void(*glGenTextures)(SbGlSizei n, SbGlUInt32 *textures)`
+*   `void(*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei *length, SbGlInt32 *size, SbGlEnum *type, SbGlChar
+    *name)`
+*   `void(*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei *count, SbGlUInt32 *shaders)`
+*   `SbGlInt32(*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetBooleanv)(SbGlEnum pname, SbGlBoolean *data)`
+*   `void(*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `SbGlEnum(*glGetError)(void)`
+*   `void(*glGetFloatv)(SbGlEnum pname, SbGlFloat *data)`
+*   `void(*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetIntegerv)(SbGlEnum pname, SbGlInt32 *data)`
+*   `void(*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *infoLog)`
+*   `void(*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32 *range, SbGlInt32 *precision)`
+*   `void(*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlChar *source)`
+*   `const SbGlUInt8 *(*glGetString)(SbGlEnum name)`
+*   `void(*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat
+    *params)`
+*   `void(*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32
+    *params)`
+*   `SbGlInt32(*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar *name)`
+*   `void(*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat
+    *params)`
+*   `void(*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname, void
+    **pointer)`
+*   `void(*glHint)(SbGlEnum target, SbGlEnum mode)`
+*   `SbGlBoolean(*glIsBuffer)(SbGlUInt32 buffer)`
+*   `SbGlBoolean(*glIsEnabled)(SbGlEnum cap)`
+*   `SbGlBoolean(*glIsFramebuffer)(SbGlUInt32 framebuffer)`
+*   `SbGlBoolean(*glIsProgram)(SbGlUInt32 program)`
+*   `SbGlBoolean(*glIsRenderbuffer)(SbGlUInt32 renderbuffer)`
+*   `SbGlBoolean(*glIsShader)(SbGlUInt32 shader)`
+*   `SbGlBoolean(*glIsTexture)(SbGlUInt32 texture)`
+*   `void(*glLineWidth)(SbGlFloat width)`
+*   `void(*glLinkProgram)(SbGlUInt32 program)`
+*   `void(*glPixelStorei)(SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glPolygonOffset)(SbGlFloat factor, SbGlFloat units)`
+*   `void(*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void *pixels)`
+*   `void(*glReleaseShaderCompiler)(void)`
+*   `void(*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert)`
+*   `void(*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glShaderBinary)(SbGlSizei count, const SbGlUInt32 *shaders, SbGlEnum
+    binaryformat, const void *binary, SbGlSizei length)`
+*   `void(*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar
+    *const *string, const SbGlInt32 *length)`
+*   `void(*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask)`
+*   `void(*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask)`
+*   `void(*glStencilMask)(SbGlUInt32 mask)`
+*   `void(*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask)`
+*   `void(*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass)`
+*   `void(*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass)`
+*   `void(*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
-    SbGlEnum format, SbGlEnum type, const void\* pixels);
-*   ` glTexParameterf`
+    SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param)`
+*   `void(*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat
+    *params)`
+*   `void(*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param)`
+*   `void(*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32
+    *params)`
+*   `void(*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum format,
+    SbGlEnum type, const void *pixels)`
+*   `void(*glUniform1f)(SbGlInt32 location, SbGlFloat v0)`
+*   `void(*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform1i)(SbGlInt32 location, SbGlInt32 v0)`
+*   `void(*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1)`
+*   `void(*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1)`
+*   `void(*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2)`
+*   `void(*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2)`
+*   `void(*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3)`
+*   `void(*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat
+    *value)`
+*   `void(*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3)`
+*   `void(*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32
+    *value)`
+*   `void(*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat *value)`
+*   `void(*glUseProgram)(SbGlUInt32 program)`
+*   `void(*glValidateProgram)(SbGlUInt32 program)`
+*   `void(*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x)`
+*   `void(*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y)`
+*   `void(*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z)`
+*   `void(*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w)`
+*   `void(*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat *v)`
+*   `void(*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void *pointer)`
+*   `void(*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height)`
+*   `void(*glReadBuffer)(SbGlEnum src)`
 
-    void (\*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param);
-*   ` glTexParameterfv`
-
-    void (\*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat\*
-    params);
-*   ` glTexParameteri`
-
-    void (\*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param);
-*   ` glTexParameteriv`
-
-    void (\*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32\*
-    params);
-*   ` glTexSubImage2D`
-
-    void (\*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
-    xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum
-    format, SbGlEnum type, const void\* pixels);
-*   ` glUniform1f`
-
-    void (\*glUniform1f)(SbGlInt32 location, SbGlFloat v0);
-*   ` glUniform1fv`
-
-    void (\*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform1i`
-
-    void (\*glUniform1i)(SbGlInt32 location, SbGlInt32 v0);
-*   ` glUniform1iv`
-
-    void (\*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform2f`
-
-    void (\*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1);
-*   ` glUniform2fv`
-
-    void (\*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform2i`
-
-    void (\*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1);
-*   ` glUniform2iv`
-
-    void (\*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform3f`
-
-    void (\*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
-    SbGlFloat v2);
-*   ` glUniform3fv`
-
-    void (\*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform3i`
-
-    void (\*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
-    SbGlInt32 v2);
-*   ` glUniform3iv`
-
-    void (\*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniform4f`
-
-    void (\*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
-    SbGlFloat v2, SbGlFloat v3);
-*   ` glUniform4fv`
-
-    void (\*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
-    value);
-*   ` glUniform4i`
-
-    void (\*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
-    SbGlInt32 v2, SbGlInt32 v3);
-*   ` glUniform4iv`
-
-    void (\*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
-    value);
-*   ` glUniformMatrix2fv`
-
-    void (\*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3fv`
-
-    void (\*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4fv`
-
-    void (\*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
-    transpose, const SbGlFloat\* value);
-*   ` glUseProgram`
-
-    void (\*glUseProgram)(SbGlUInt32 program);
-*   ` glValidateProgram`
-
-    void (\*glValidateProgram)(SbGlUInt32 program);
-*   ` glVertexAttrib1f`
-
-    void (\*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x);
-*   ` glVertexAttrib1fv`
-
-    void (\*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib2f`
-
-    void (\*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y);
-*   ` glVertexAttrib2fv`
-
-    void (\*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib3f`
-
-    void (\*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
-    SbGlFloat z);
-*   ` glVertexAttrib3fv`
-
-    void (\*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttrib4f`
-
-    void (\*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
-    SbGlFloat z, SbGlFloat w);
-*   ` glVertexAttrib4fv`
-
-    void (\*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat\* v);
-*   ` glVertexAttribPointer`
-
-    void (\*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
-    type, SbGlBoolean normalized, SbGlSizei stride, const void\* pointer);
-*   ` glViewport`
-
-    void (\*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
-    height);
-*   ` glReadBuffer`
-
-    void (\*glReadBuffer)(SbGlEnum src);
-*   ` glDrawRangeElements`
-
-    void (\*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32
-    end, SbGlSizei count, SbGlEnum type, const void\* indices);
-*   ` glTexImage3D`
-
-    void (\*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
+    .
+*   `void(*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32 end,
+    SbGlSizei count, SbGlEnum type, const void *indices)`
+*   `void(*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
-    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void\* pixels);
-*   ` glTexSubImage3D`
-
-    void (\*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
-    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei
-    height, SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void\*
-    pixels);
-*   ` glCopyTexSubImage3D`
-
-    void (\*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32 xoffset,
+    SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei height,
+    SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void *pixels)`
+*   `void(*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
     xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
-    SbGlSizei width, SbGlSizei height);
-*   ` glCompressedTexImage3D`
-
-    void (\*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
-    SbGlInt32 border, SbGlSizei imageSize, const void\* data);
-*   ` glCompressedTexSubImage3D`
-
-    void (\*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 border, SbGlSizei imageSize, const void *data)`
+*   `void(*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
     SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
     SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
-    const void\* data);
-*   ` glGenQueries`
-
-    void (\*glGenQueries)(SbGlSizei n, SbGlUInt32\* ids);
-*   ` glDeleteQueries`
-
-    void (\*glDeleteQueries)(SbGlSizei n, const SbGlUInt32\* ids);
-*   ` glIsQuery`
-
-    SbGlBoolean (\*glIsQuery)(SbGlUInt32 id);
-*   ` glBeginQuery`
-
-    void (\*glBeginQuery)(SbGlEnum target, SbGlUInt32 id);
-*   ` glEndQuery`
-
-    void (\*glEndQuery)(SbGlEnum target);
-*   ` glGetQueryiv`
-
-    void (\*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetQueryObjectuiv`
-
-    void (\*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32\*
-    params);
-*   ` glUnmapBuffer`
-
-    SbGlBoolean (\*glUnmapBuffer)(SbGlEnum target);
-*   ` glGetBufferPointerv`
-
-    void (\*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void\*\*
-    params);
-*   ` glDrawBuffers`
-
-    void (\*glDrawBuffers)(SbGlSizei n, const SbGlEnum\* bufs);
-*   ` glUniformMatrix2x3fv`
-
-    void (\*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3x2fv`
-
-    void (\*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix2x4fv`
-
-    void (\*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4x2fv`
-
-    void (\*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix3x4fv`
-
-    void (\*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glUniformMatrix4x3fv`
-
-    void (\*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
-    SbGlBoolean transpose, const SbGlFloat\* value);
-*   ` glBlitFramebuffer`
-
-    void (\*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32
-    srcX1, SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
-    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter);
-*   ` glRenderbufferStorageMultisample`
-
-    void (\*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei
-    samples, SbGlEnum internalformat, SbGlSizei width, SbGlSizei height);
-*   ` glFramebufferTextureLayer`
-
-    void (\*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
-    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer);
-*   ` glMapBufferRange`
-
-    void\* (\*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
-    length, SbGlBitfield access);
-*   ` glFlushMappedBufferRange`
-
-    void (\*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
-    SbGlSizeiPtr length);
-*   ` glBindVertexArray`
-
-    void (\*glBindVertexArray)(SbGlUInt32 array);
-*   ` glDeleteVertexArrays`
-
-    void (\*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32\* arrays);
-*   ` glGenVertexArrays`
-
-    void (\*glGenVertexArrays)(SbGlSizei n, SbGlUInt32\* arrays);
-*   ` glIsVertexArray`
-
-    SbGlBoolean (\*glIsVertexArray)(SbGlUInt32 array);
-*   ` glGetIntegeri_v`
-
-    void (\*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32\*
-    data);
-*   ` glBeginTransformFeedback`
-
-    void (\*glBeginTransformFeedback)(SbGlEnum primitiveMode);
-*   ` glEndTransformFeedback`
-
-    void (\*glEndTransformFeedback)(void);
-*   ` glBindBufferRange`
-
-    void (\*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
-    buffer, SbGlIntPtr offset, SbGlSizeiPtr size);
-*   ` glBindBufferBase`
-
-    void (\*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
-    buffer);
-*   ` glTransformFeedbackVaryings`
-
-    void (\*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
-    const SbGlChar\* const\* varyings, SbGlEnum bufferMode);
-*   ` glGetTransformFeedbackVarying`
-
-    void (\*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
-    SbGlSizei bufSize, SbGlSizei\* length, SbGlSizei\* size, SbGlEnum\* type,
-    SbGlChar\* name);
-*   ` glVertexAttribIPointer`
-
-    void (\*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
-    type, SbGlSizei stride, const void\* pointer);
-*   ` glGetVertexAttribIiv`
-
-    void (\*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
-    params);
-*   ` glGetVertexAttribIuiv`
-
-    void (\*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname,
-    SbGlUInt32\* params);
-*   ` glVertexAttribI4i`
-
-    void (\*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
-    SbGlInt32 z, SbGlInt32 w);
-*   ` glVertexAttribI4ui`
-
-    void (\*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
-    SbGlUInt32 z, SbGlUInt32 w);
-*   ` glVertexAttribI4iv`
-
-    void (\*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32\* v);
-*   ` glVertexAttribI4uiv`
-
-    void (\*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32\* v);
-*   ` glGetUniformuiv`
-
-    void (\*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location,
-    SbGlUInt32\* params);
-*   ` glGetFragDataLocation`
-
-    SbGlInt32 (\*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar\*
-    name);
-*   ` glUniform1ui`
-
-    void (\*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0);
-*   ` glUniform2ui`
-
-    void (\*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1);
-*   ` glUniform3ui`
-
-    void (\*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
-    SbGlUInt32 v2);
-*   ` glUniform4ui`
-
-    void (\*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
-    SbGlUInt32 v2, SbGlUInt32 v3);
-*   ` glUniform1uiv`
-
-    void (\*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform2uiv`
-
-    void (\*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform3uiv`
-
-    void (\*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glUniform4uiv`
-
-    void (\*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const
-    SbGlUInt32\* value);
-*   ` glClearBufferiv`
-
-    void (\*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlInt32\* value);
-*   ` glClearBufferuiv`
-
-    void (\*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlUInt32\* value);
-*   ` glClearBufferfv`
-
-    void (\*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
-    SbGlFloat\* value);
-*   ` glClearBufferfi`
-
-    void (\*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
-    depth, SbGlInt32 stencil);
-*   ` glGetStringi`
-
-    const SbGlUInt8\* (\*glGetStringi)(SbGlEnum name, SbGlUInt32 index);
-*   ` glCopyBufferSubData`
-
-    void (\*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
-    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size);
-*   ` glGetUniformIndices`
-
-    void (\*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
-    const SbGlChar\* const\* uniformNames, SbGlUInt32\* uniformIndices);
-*   ` glGetActiveUniformsiv`
-
-    void (\*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
-    const SbGlUInt32\* uniformIndices, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetUniformBlockIndex`
-
-    SbGlUInt32 (\*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar\*
-    uniformBlockName);
-*   ` glGetActiveUniformBlockiv`
-
-    void (\*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlEnum pname, SbGlInt32\* params);
-*   ` glGetActiveUniformBlockName`
-
-    void (\*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei\* length, SbGlChar\*
-    uniformBlockName);
-*   ` glUniformBlockBinding`
-
-    void (\*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
-    uniformBlockIndex, SbGlUInt32 uniformBlockBinding);
-*   ` glDrawArraysInstanced`
-
-    void (\*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
-    count, SbGlSizei instancecount);
-*   ` glDrawElementsInstanced`
-
-    void (\*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
-    type, const void\* indices, SbGlSizei instancecount);
-*   ` glFenceSync`
-
-    SbGlSync (\*glFenceSync)(SbGlEnum condition, SbGlBitfield flags);
-*   ` glIsSync`
-
-    SbGlBoolean (\*glIsSync)(SbGlSync sync);
-*   ` glDeleteSync`
-
-    void (\*glDeleteSync)(SbGlSync sync);
-*   ` glClientWaitSync`
-
-    SbGlEnum (\*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
-    timeout);
-*   ` glWaitSync`
-
-    void (\*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout);
-*   ` glGetInteger64v`
-
-    void (\*glGetInteger64v)(SbGlEnum pname, SbGlInt64\* data);
-*   ` glGetSynciv`
-
-    void (\*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlInt32\* values);
-*   ` glGetInteger64i_v`
-
-    void (\*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64\*
-    data);
-*   ` glGetBufferParameteri64v`
-
-    void (\*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname,
-    SbGlInt64\* params);
-*   ` glGenSamplers`
-
-    void (\*glGenSamplers)(SbGlSizei count, SbGlUInt32\* samplers);
-*   ` glDeleteSamplers`
-
-    void (\*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32\* samplers);
-*   ` glIsSampler`
-
-    SbGlBoolean (\*glIsSampler)(SbGlUInt32 sampler);
-*   ` glBindSampler`
-
-    void (\*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler);
-*   ` glSamplerParameteri`
-
-    void (\*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
-    param);
-*   ` glSamplerParameteriv`
-
-    void (\*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
-    SbGlInt32\* param);
-*   ` glSamplerParameterf`
-
-    void (\*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
-    param);
-*   ` glSamplerParameterfv`
-
-    void (\*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
-    SbGlFloat\* param);
-*   ` glGetSamplerParameteriv`
-
-    void (\*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
-    SbGlInt32\* params);
-*   ` glGetSamplerParameterfv`
-
-    void (\*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
-    SbGlFloat\* params);
-*   ` glVertexAttribDivisor`
-
-    void (\*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor);
-*   ` glBindTransformFeedback`
-
-    void (\*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id);
-*   ` glDeleteTransformFeedbacks`
-
-    void (\*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32\* ids);
-*   ` glGenTransformFeedbacks`
-
-    void (\*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32\* ids);
-*   ` glIsTransformFeedback`
-
-    SbGlBoolean (\*glIsTransformFeedback)(SbGlUInt32 id);
-*   ` glPauseTransformFeedback`
-
-    void (\*glPauseTransformFeedback)(void);
-*   ` glResumeTransformFeedback`
-
-    void (\*glResumeTransformFeedback)(void);
-*   ` glGetProgramBinary`
-
-    void (\*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize,
-    SbGlSizei\* length, SbGlEnum\* binaryFormat, void\* binary);
-*   ` glProgramBinary`
-
-    void (\*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
-    void\* binary, SbGlSizei length);
-*   ` glProgramParameteri`
-
-    void (\*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
-    value);
-*   ` glInvalidateFramebuffer`
-
-    void (\*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
-    const SbGlEnum\* attachments);
-*   ` glInvalidateSubFramebuffer`
-
-    void (\*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
-    numAttachments, const SbGlEnum\* attachments, SbGlInt32 x, SbGlInt32 y,
-    SbGlSizei width, SbGlSizei height);
-*   ` glTexStorage2D`
-
-    void (\*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
-    internalformat, SbGlSizei width, SbGlSizei height);
-*   ` glTexStorage3D`
-
-    void (\*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
-    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth);
-*   ` glGetInternalformativ`
-
-    void (\*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
-    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32\* params);
+    const void *data)`
+*   `void(*glGenQueries)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `void(*glDeleteQueries)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsQuery)(SbGlUInt32 id)`
+*   `void(*glBeginQuery)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glEndQuery)(SbGlEnum target)`
+*   `void(*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `SbGlBoolean(*glUnmapBuffer)(SbGlEnum target)`
+*   `void(*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void **params)`
+*   `void(*glDrawBuffers)(SbGlSizei n, const SbGlEnum *bufs)`
+*   `void(*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat *value)`
+*   `void(*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32 srcX1,
+    SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter)`
+*   `void(*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei samples,
+    SbGlEnum internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer)`
+*   `void *(*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access)`
+*   `void(*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length)`
+*   `void(*glBindVertexArray)(SbGlUInt32 array)`
+*   `void(*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32 *arrays)`
+*   `void(*glGenVertexArrays)(SbGlSizei n, SbGlUInt32 *arrays)`
+*   `SbGlBoolean(*glIsVertexArray)(SbGlUInt32 array)`
+*   `void(*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32 *data)`
+*   `void(*glBeginTransformFeedback)(SbGlEnum primitiveMode)`
+*   `void(*glEndTransformFeedback)(void)`
+*   `void(*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size)`
+*   `void(*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer)`
+*   `void(*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar *const *varyings, SbGlEnum bufferMode)`
+*   `void(*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei *length, SbGlSizei *size, SbGlEnum *type,
+    SbGlChar *name)`
+*   `void(*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void *pointer)`
+*   `void(*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32
+    *params)`
+*   `void(*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname, SbGlUInt32
+    *params)`
+*   `void(*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w)`
+*   `void(*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w)`
+*   `void(*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32 *v)`
+*   `void(*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32 *v)`
+*   `void(*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location, SbGlUInt32
+    *params)`
+*   `SbGlInt32(*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar
+    *name)`
+*   `void(*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0)`
+*   `void(*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1)`
+*   `void(*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2)`
+*   `void(*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3)`
+*   `void(*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const SbGlUInt32
+    *value)`
+*   `void(*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32 *value)`
+*   `void(*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32 *value)`
+*   `void(*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat *value)`
+*   `void(*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil)`
+*   `const SbGlUInt8 *(*glGetStringi)(SbGlEnum name, SbGlUInt32 index)`
+*   `void(*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size)`
+*   `void(*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar *const *uniformNames, SbGlUInt32 *uniformIndices)`
+*   `void(*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32 *uniformIndices, SbGlEnum pname, SbGlInt32 *params)`
+*   `SbGlUInt32(*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar
+    *uniformBlockName)`
+*   `void(*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32 *params)`
+*   `void(*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei *length, SbGlChar
+    *uniformBlockName)`
+*   `void(*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding)`
+*   `void(*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount)`
+*   `void(*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void *indices, SbGlSizei instancecount)`
+*   `SbGlSync(*glFenceSync)(SbGlEnum condition, SbGlBitfield flags)`
+*   `SbGlBoolean(*glIsSync)(SbGlSync sync)`
+*   `void(*glDeleteSync)(SbGlSync sync)`
+*   `SbGlEnum(*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout)`
+*   `void(*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout)`
+*   `void(*glGetInteger64v)(SbGlEnum pname, SbGlInt64 *data)`
+*   `void(*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei *length, SbGlInt32 *values)`
+*   `void(*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64
+    *data)`
+*   `void(*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname, SbGlInt64
+    *params)`
+*   `void(*glGenSamplers)(SbGlSizei count, SbGlUInt32 *samplers)`
+*   `void(*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32 *samplers)`
+*   `SbGlBoolean(*glIsSampler)(SbGlUInt32 sampler)`
+*   `void(*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler)`
+*   `void(*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param)`
+*   `void(*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32 *param)`
+*   `void(*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param)`
+*   `void(*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat *param)`
+*   `void(*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32 *params)`
+*   `void(*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat *params)`
+*   `void(*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor)`
+*   `void(*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id)`
+*   `void(*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32 *ids)`
+*   `void(*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32 *ids)`
+*   `SbGlBoolean(*glIsTransformFeedback)(SbGlUInt32 id)`
+*   `void(*glPauseTransformFeedback)(void)`
+*   `void(*glResumeTransformFeedback)(void)`
+*   `void(*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize, SbGlSizei
+    *length, SbGlEnum *binaryFormat, void *binary)`
+*   `void(*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void *binary, SbGlSizei length)`
+*   `void(*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value)`
+*   `void(*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum *attachments)`
+*   `void(*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum *attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height)`
+*   `void(*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth)`
+*   `void(*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32 *params)`
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/image.md b/src/cobalt/site/docs/reference/starboard/modules/image.md
index c911e41..634dab8 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/image.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/image.md
@@ -10,7 +10,8 @@
 
 All functions in this module are safe to call from any thread at any point in
 time.
-SbImageIsDecodeSupported and SbImageDecode Example
+
+## SbImageIsDecodeSupported and SbImageDecode Example ##
 
 Let's assume that we're on a Blitter platform.
 
@@ -30,7 +31,6 @@
 SbBlitterSurface surface =
     SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
 // Do stuff with surface...
-
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/input.md b/src/cobalt/site/docs/reference/starboard/modules/input.md
index 3554af6..e8df816 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/input.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/input.md
@@ -94,13 +94,6 @@
 
 #### Members ####
 
-*   `SbTimeMonotonic timestamp`
-
-    The time that should be reported for this event. This is intended to
-    facilitate calculation of time-sensitive information (e.g. velocity for
-    kSbInputEventTypeMove). This may be set to 0 to have the relevant systems
-    automatically set the timestamp. However, this may happen at a later time,
-    so the relative time between events may not be preserved.
 *   `SbWindow window`
 
     The window in which the input was generated.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/media.md b/src/cobalt/site/docs/reference/starboard/modules/media.md
index 6a2f7c1..4ad1e16 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/media.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/media.md
@@ -127,7 +127,7 @@
     The media type cannot be played.
 *   `kSbMediaSupportTypeMaybe`
 
-    Cannot determinate if the media type is playable without playing it.
+    Cannot determine if the media type is playable without playing it.
 *   `kSbMediaSupportTypeProbably`
 
     The media type seems to be playable.
@@ -192,12 +192,13 @@
 
 ### SbMediaAudioSampleInfo ###
 
-An audio sample info, which is a description of a given audio sample. This, in
-hexadecimal string form, acts as a set of instructions to the audio decoder.
+An audio sample info, which is a description of a given audio sample. This acts
+as a set of instructions to the audio decoder.
 
-The audio sample info consists of a little-endian hexadecimal encoded
-`WAVEFORMATEX` structure followed by an Audio-specific configuration field. The
-`WAVEFORMATEX` structure is specified at: [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)
+The audio sample info consists of information found in the `WAVEFORMATEX`
+structure, as well as other information for the audio decoder, including the
+Audio-specific configuration field. The `WAVEFORMATEX` structure is specified at
+[http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)x) .
 
 #### Members ####
 
@@ -270,11 +271,11 @@
 *   `unsigned int chroma_siting_horizontal`
 
     How chroma is subsampled horizontally. (0: Unspecified, 1: Left Collocated,
-    2: Half)
+    2: Half).
 *   `unsigned int chroma_siting_vertical`
 
     How chroma is subsampled vertically. (0: Unspecified, 1: Top Collocated, 2:
-    Half)
+    Half).
 *   `SbMediaMasteringMetadata mastering_metadata`
 
     [HDR Metadata field] SMPTE 2086 mastering data.
@@ -292,7 +293,7 @@
     value and meanings for Primaries are adopted from Table 2 of ISO/IEC
     23001-8:2013/DCOR1. (0: Reserved, 1: ITU-R BT.709, 2: Unspecified, 3:
     Reserved, 4: ITU-R BT.470M, 5: ITU-R BT.470BG, 6: SMPTE 170M, 7: SMPTE 240M,
-    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors)
+    8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 phosphors).
 *   `SbMediaTransferId transfer`
 
     [Color Space field] The transfer characteristics of the video. For clarity,
@@ -302,7 +303,7 @@
     4: Gamma 2.2 curve, 5: Gamma 2.8 curve, 6: SMPTE 170M, 7: SMPTE 240M, 8:
     Linear, 9: Log, 10: Log Sqrt, 11: IEC 61966-2-4, 12: ITU-R BT.1361 Extended
     Colour Gamut, 13: IEC 61966-2-1, 14: ITU-R BT.2020 10 bit, 15: ITU-R BT.2020
-    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG))
+    12 bit, 16: SMPTE ST 2084, 17: SMPTE ST 428-1 18: ARIB STD-B67 (HLG)).
 *   `SbMediaMatrixId matrix`
 
     [Color Space field] The Matrix Coefficients of the video used to derive luma
@@ -310,12 +311,12 @@
     the value and meanings for MatrixCoefficients are adopted from Table 4 of
     ISO/IEC 23001-8:2013/DCOR1. (0:GBR, 1: BT709, 2: Unspecified, 3: Reserved,
     4: FCC, 5: BT470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: YCOCG, 9: BT2020 Non-
-    constant Luminance, 10: BT2020 Constant Luminance)
+    constant Luminance, 10: BT2020 Constant Luminance).
 *   `SbMediaRangeId range`
 
     [Color Space field] Clipping of the color ranges. (0: Unspecified, 1:
     Broadcast Range, 2: Full range (no clipping), 3: Defined by
-    MatrixCoefficients/TransferCharacteristics)
+    MatrixCoefficients/TransferCharacteristics).
 *   `float custom_primary_matrix`
 
     [Color Space field] Only used if primaries == kSbMediaPrimaryIdCustom. This
@@ -429,11 +430,39 @@
 `mime`: The mime information of the media in the form of `video/webm` or
 `video/mp4; codecs="avc1.42001E"`. It may include arbitrary parameters like
 "codecs", "channels", etc. Note that the "codecs" parameter may contain more
-than one codec, delimited by comma. `key_system`: A lowercase value in fhe form
+than one codec, delimited by comma. `key_system`: A lowercase value in the form
 of "com.example.somesystem" as suggested by [https://w3c.github.io/encrypted-media/#key-system](https://w3c.github.io/encrypted-media/#key-system)) that can
 be matched exactly with known DRM key systems of the platform. When `key_system`
 is an empty string, the return value is an indication for non-encrypted media.
 
+An implementation may choose to support `key_system` with extra attributes,
+separated by ';', like `com.example.somesystem; attribute_name1="value1";
+attribute_name2=value1`. If `key_system` with attributes is not supported by an
+implementation, it should treat `key_system` as if it contains only the key
+system, and reject any input containing extra attributes, i.e. it can keep using
+its existing implementation. When an implementation supports `key_system` with
+attributes, it has to support all attributes defined by the Starboard version
+the implementation uses. An implementation should ignore any unknown attributes,
+and make a decision solely based on the key system and the known attributes. For
+example, if an implementation supports "com.widevine.alpha", it should also
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; invalid_attribute="invalid_value"`.
+Currently the only attribute has to be supported is `encryptionscheme`. It
+reflects the value passed to `encryptionScheme` encryptionScheme of
+MediaKeySystemMediaCapability, as defined in [https://wicg.github.io/encrypted-media-encryption-scheme/,](https://wicg.github.io/encrypted-media-encryption-scheme/,),) which can take value "cenc", "cbcs", or "cbcs-1-9". Empty string is
+not a valid value for `encryptionscheme` and the implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`encryptionscheme` is set to "". The implementation should return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported for unknown
+values of known attributes. For example, if an implementation supports
+"encryptionscheme" with value "cenc", "cbcs", or "cbcs-1-9", then it should
+return `kSbMediaSupportTypeProbably` kSbMediaSupportTypeProbably when
+`key_system` is `com.widevine.alpha; encryptionscheme="cenc"`, and return
+`kSbMediaSupportTypeNotSupported` kSbMediaSupportTypeNotSupported when
+`key_system` is `com.widevine.alpha; encryptionscheme="invalid"`. If an
+implementation supports key system with attributes on one key system, it has to
+support key system with attributes on all key systems supported.
+
 #### Declaration ####
 
 ```
@@ -653,18 +682,6 @@
 bool SbMediaIsBufferUsingMemoryPool()
 ```
 
-### SbMediaIsSupported ###
-
-Indicates whether this platform supports decoding `video_codec` and
-`audio_codec` along with decrypting using `key_system`. If `video_codec` is
-`kSbMediaVideoCodecNone` or if `audio_codec` is `kSbMediaAudioCodecNone`, this
-function should return `true` as long as `key_system` is supported on the
-platform to decode any supported input formats.
-
-`video_codec`: The `SbMediaVideoCodec` being checked for platform compatibility.
-`audio_codec`: The `SbMediaAudioCodec` being checked for platform compatibility.
-`key_system`: The key system being checked for platform compatibility.
-
 #### Declaration ####
 
 ```
@@ -688,3 +705,4 @@
 ```
 void SbMediaSetAudioWriteDuration(SbTime duration)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/memory.md b/src/cobalt/site/docs/reference/starboard/modules/memory.md
index a3fecb6..e09dbc3 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/memory.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/memory.md
@@ -4,12 +4,14 @@
 ---
 
 Defines functions for memory allocation, alignment, copying, and comparing.
-Porters
+
+## Porters ##
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
-Porters and Application Developers
+
+## Porters and Application Developers ##
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -44,16 +46,6 @@
 
 ## Functions ##
 
-### SbMemoryAlignToPageSize ###
-
-Rounds `size` up to kSbMemoryPageSize.
-
-#### Declaration ####
-
-```
-static size_t SbMemoryAlignToPageSize(size_t size)
-```
-
 ### SbMemoryAllocate ###
 
 Allocates and returns a chunk of memory of at least `size` bytes. This function
@@ -166,46 +158,6 @@
 static void* SbMemoryCalloc(size_t count, size_t size)
 ```
 
-### SbMemoryCompare ###
-
-Compares the contents of the first `count` bytes of `buffer1` and `buffer2`.
-This function returns:
-
-*   `-1` if `buffer1` is "less-than" `buffer2`
-
-*   `0` if `buffer1` and `buffer2` are equal
-
-*   `1` if `buffer1` is "greater-than" `buffer2`.
-
-This function is meant to be a drop-in replacement for `memcmp`.
-
-`buffer1`: The first buffer to be compared. `buffer2`: The second buffer to be
-compared. `count`: The number of bytes to be compared.
-
-#### Declaration ####
-
-```
-int SbMemoryCompare(const void *buffer1, const void *buffer2, size_t count)
-```
-
-### SbMemoryCopy ###
-
-Copies `count` sequential bytes from `source` to `destination`, without support
-for the `source` and `destination` regions overlapping. This function is meant
-to be a drop-in replacement for `memcpy`.
-
-The function's behavior is undefined if `destination` or `source` are NULL, and
-the function is a no-op if `count` is 0. The return value is `destination`.
-
-`destination`: The destination of the copied memory. `source`: The source of the
-copied memory. `count`: The number of sequential bytes to be copied.
-
-#### Declaration ####
-
-```
-void* SbMemoryCopy(void *destination, const void *source, size_t count)
-```
-
 ### SbMemoryDeallocate ###
 
 Frees a previously allocated chunk of memory. If `memory` is NULL, then the
@@ -242,18 +194,6 @@
 void SbMemoryDeallocateNoReport(void *memory)
 ```
 
-### SbMemoryFindByte ###
-
-Finds the lower 8-bits of `value` in the first `count` bytes of `buffer` and
-returns either a pointer to the first found occurrence or `NULL` if the value is
-not found. This function is meant to be a drop-in replacement for `memchr`.
-
-#### Declaration ####
-
-```
-const void* SbMemoryFindByte(const void *buffer, int value, size_t count)
-```
-
 ### SbMemoryFlush ###
 
 Flushes any data in the given virtual address range that is cached locally in
@@ -306,26 +246,6 @@
 void SbMemoryGetStackBounds(void **out_high, void **out_low)
 ```
 
-### SbMemoryIsAligned ###
-
-Checks whether `memory` is aligned to `alignment` bytes.
-
-#### Declaration ####
-
-```
-static bool SbMemoryIsAligned(const void *memory, size_t alignment)
-```
-
-### SbMemoryIsZero ###
-
-Returns true if the first `count` bytes of `buffer` are set to zero.
-
-#### Declaration ####
-
-```
-static bool SbMemoryIsZero(const void *buffer, size_t count)
-```
-
 ### SbMemoryMap ###
 
 Allocates `size_bytes` worth of physical memory pages and maps them into an
@@ -347,24 +267,6 @@
 void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
 ```
 
-### SbMemoryMove ###
-
-Copies `count` sequential bytes from `source` to `destination`, with support for
-the `source` and `destination` regions overlapping. This function is meant to be
-a drop-in replacement for `memmove`.
-
-The function's behavior is undefined if `destination` or `source` are NULL, and
-the function is a no-op if `count` is 0. The return value is `destination`.
-
-`destination`: The destination of the copied memory. `source`: The source of the
-copied memory. `count`: The number of sequential bytes to be copied.
-
-#### Declaration ####
-
-```
-void* SbMemoryMove(void *destination, const void *source, size_t count)
-```
-
 ### SbMemoryProtect ###
 
 Change the protection of `size_bytes` of memory regions, starting from
@@ -428,24 +330,6 @@
 void* SbMemoryReallocateUnchecked(void *memory, size_t size)
 ```
 
-### SbMemorySet ###
-
-Fills `count` sequential bytes starting at `destination`, with the unsigned char
-coercion of `byte_value`. This function is meant to be a drop-in replacement for
-`memset`.
-
-The function's behavior is undefined if `destination` is NULL, and the function
-is a no-op if `count` is 0. The return value is `destination`.
-
-`destination`: The destination of the copied memory. `count`: The number of
-sequential bytes to be set.
-
-#### Declaration ####
-
-```
-void* SbMemorySet(void *destination, int byte_value, size_t count)
-```
-
 ### SbMemoryUnmap ###
 
 Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
diff --git a/src/cobalt/site/docs/reference/starboard/modules/mutex.md b/src/cobalt/site/docs/reference/starboard/modules/mutex.md
index a9d2a9a..58f1907 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/mutex.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/mutex.md
@@ -40,7 +40,7 @@
 #### Definition ####
 
 ```
-typedef union SbMutex SbMutex
+typedef union SbMutex  SbMutex
 ```
 
 ## Functions ##
diff --git a/src/cobalt/site/docs/reference/starboard/modules/once.md b/src/cobalt/site/docs/reference/starboard/modules/once.md
index 61aad5d..ce3c4d6 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/once.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/once.md
@@ -22,7 +22,7 @@
 #### Definition ####
 
 ```
-typedef union SbOnceControl SbOnceControl
+typedef union SbOnceControl  SbOnceControl
 ```
 
 ### SbOnceInitRoutine ###
diff --git a/src/cobalt/site/docs/reference/starboard/modules/player.md b/src/cobalt/site/docs/reference/starboard/modules/player.md
index 2f64632..d6910e2 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/player.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/player.md
@@ -284,66 +284,6 @@
 
 ## Functions ##
 
-### SbPlayerCreate ###
-
-Creates a player that will be displayed on `window` for the specified
-`video_codec` and `audio_codec`, acquiring all resources needed to operate it,
-and returning an opaque handle to it. The expectation is that a new player will
-be created and destroyed for every playback.
-
-This function returns the created player. Note the following:
-
-*   The associated decoder of the returned player should be assumed to not be in
-    `kSbPlayerDecoderStateNeedsData` until SbPlayerSeek() has been called on it.
-
-*   It is expected either that the thread that calls SbPlayerCreate is the same
-    thread that calls the other `SbPlayer` functions for that player, or that
-    there is a mutex guarding calls into each `SbPlayer` instance.
-
-*   If there is a platform limitation on how many players can coexist
-    simultaneously, then calls made to this function that attempt to exceed that
-    limit must return `kSbPlayerInvalid`. Multiple calls to SbPlayerCreate must
-    not cause a crash.
-
-`window`: The window that will display the player. `window` can be
-`kSbWindowInvalid` for platforms where video is only displayed on a particular
-window that the underlying implementation already has access to.
-
-`video_codec`: The video codec used for the player. If `video_codec` is
-`kSbMediaVideoCodecNone`, the player is an audio-only player. If `video_codec`
-is any other value, the player is an audio/video decoder. This can be set to
-`kSbMediaVideoCodecNone` to play a video with only an audio track.
-
-`audio_codec`: The audio codec used for the player. The caller must provide a
-populated `audio_sample_info` if audio codec is `kSbMediaAudioCodecAac`. Can be
-set to `kSbMediaAudioCodecNone` to play a video without any audio track. In such
-case `audio_sample_info` must be NULL.
-
-`drm_system`: If the media stream has encrypted portions, then this parameter
-provides an appropriate DRM system, created with `SbDrmCreateSystem()`. If the
-stream does not have encrypted portions, then `drm_system` may be
-`kSbDrmSystemInvalid`. `audio_sample_info`: Note that the caller must provide a
-populated `audio_sample_info` if the audio codec is `kSbMediaAudioCodecAac`.
-Otherwise, `audio_sample_info` can be NULL. See media.h for the format of the
-`SbMediaAudioSampleInfo` struct. Note that `audio_specific_config` is a pointer
-and the content it points to is no longer valid after this function returns. The
-implementation has to make a copy of the content if it is needed after the
-function returns. `max_video_capabilities`: This string communicates the max
-video capabilities required to the platform. The web app will not provide a
-video stream exceeding the maximums described by this parameter. Allows the
-platform to optimize playback pipeline for low quality video streams if it knows
-that it will never adapt to higher quality streams. The string uses the same
-format as the string passed in to SbMediaCanPlayMimeAndKeySystem(), for example,
-when it is set to "width=1920; height=1080; framerate=15;", the video will never
-adapt to resolution higher than 1920x1080 or frame per second higher than 15
-fps. When the maximums are unknown, this will be set to NULL.
-
-#### Declaration ####
-
-```
-SbPlayer SbPlayerCreate(SbWindow window, const SbPlayerCreationParam *creation_param, SbPlayerDeallocateSampleFunc sample_deallocate_func, SbPlayerDecoderStatusFunc decoder_status_func, SbPlayerStatusFunc player_status_func, SbPlayerErrorFunc player_error_func, void *context, SbDecodeTargetGraphicsContextProvider *context_provider)
-```
-
 ### SbPlayerDestroy ###
 
 Destroys `player`, freeing all associated resources.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/socket.md b/src/cobalt/site/docs/reference/starboard/modules/socket.md
index 2bfb614..548f57d 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/socket.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/socket.md
@@ -276,8 +276,8 @@
 If the destination address is ::, and its `type` is `kSbSocketAddressTypeIpv6`
 then any IPv6 local interface that is up and not loopback or a link-local IP is
 a valid return value. However, in the case of IPv6, the address with the biggest
-scope must be returned. E.g., a globally scoped and routable IP is prefered over
-a unique local address (ULA). Also, the IP address that is returned must be
+scope must be returned. E.g., a globally scoped and routable IP is preferred
+over a unique local address (ULA). Also, the IP address that is returned must be
 permanent.
 
 If destination address is NULL, then any IP address that is valid for
diff --git a/src/cobalt/site/docs/reference/starboard/modules/socket_waiter.md b/src/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
index 409169f..738fafb 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
@@ -116,8 +116,9 @@
 *   If `persistent` is `true`, then `socket` stays registered with `waiter`
     until SbSocketWaiterRemove() is called with `waiter` and `socket`.
 
-*   If `persistent` is `false`, then `socket` is removed after the next call to
-    `callback`, even if not all registered `interests` became ready.
+*   If `persistent` is `false`, then `socket` is removed before the next call to
+    `callback`, even if not all registered `interests` became ready, which
+    allows for adding it again in the `callback`.
 
 #### Declaration ####
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md b/src/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
index 39bdec2..e46a2ca 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
@@ -3,7 +3,7 @@
 title: "Starboard Module Reference: speech_synthesis.h"
 ---
 
-A basic text-to-speech API intended to be used for audio accessibilty.
+A basic text-to-speech API intended to be used for audio accessibility.
 
 Implementations of this API should audibly play back text to assist users in
 non-visual navigation of the application.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/string.md b/src/cobalt/site/docs/reference/starboard/modules/string.md
index fb35aa3..95790d4 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/string.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/string.md
@@ -7,49 +7,6 @@
 
 ## Functions ##
 
-### SbStringCompare ###
-
-Compares the first `count` characters of two 8-bit character strings. The return
-value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `strncmp`.
-
-`string1`: The first 8-bit character string to compare. `string2`: The second
-8-bit character string to compare. `count`: The number of characters to compare.
-
-#### Declaration ####
-
-```
-int SbStringCompare(const char *string1, const char *string2, size_t count)
-```
-
-### SbStringCompareAll ###
-
-Compares two entire 8-bit character strings. The return value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `strcmp`.
-
-`string1`: The first 8-bit character string to compare. `string2`: The second
-8-bit character string to compare.
-
-#### Declaration ####
-
-```
-int SbStringCompareAll(const char *string1, const char *string2)
-```
-
 ### SbStringCompareNoCase ###
 
 Compares two strings, ignoring differences in case. The return value is:
@@ -92,126 +49,6 @@
 int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
 ```
 
-### SbStringCompareWide ###
-
-Compares the first `count` characters of two 16-bit character strings. The
-return value is:
-
-*   `< 0` if `string1` is ASCII-betically lower than `string2`.
-
-*   `0` if the two strings are equal.
-
-*   `> 0` if `string1` is ASCII-betically higher than `string2`.
-
-This function is meant to be a drop-in replacement for `wcsncmp`.
-
-`string1`: The first 16-bit character string to compare.weird `string2`: The
-second 16-bit character string to compare. `count`: The number of characters to
-compare.
-
-#### Declaration ####
-
-```
-int SbStringCompareWide(const wchar_t *string1, const wchar_t *string2, size_t count)
-```
-
-### SbStringConcat ###
-
-Appends `source` to `out_destination` as long as `out_destination` has enough
-storage space to hold the concatenated string.
-
-This function is meant to be a drop-in replacement for `strlcat`. Also note that
-this function's signature is NOT compatible with `strncat`.
-
-`out_destination`: The string to which the `source` string is appended.
-`source`: The string to be appended to the destination string.
-`destination_size`: The amount of storage space available for the concatenated
-string.
-
-#### Declaration ####
-
-```
-int SbStringConcat(char *out_destination, const char *source, int destination_size)
-```
-
-### SbStringConcatUnsafe ###
-
-An inline wrapper for an unsafe SbStringConcat that assumes that the
-`out_destination` provides enough storage space for the concatenated string.
-Note that this function's signature is NOT compatible with `strcat`.
-
-`out_destination`: The string to which the `source` string is appended.
-`source`: The string to be appended to the destination string.
-
-#### Declaration ####
-
-```
-static int SbStringConcatUnsafe(char *out_destination, const char *source)
-```
-
-### SbStringConcatWide ###
-
-Identical to SbStringCat, but for wide characters.
-
-`out_destination`: The string to which the `source` string is appended.
-`source`: The string to be appended to the destination string.
-`destination_size`: The amount of storage space available for the concatenated
-string.
-
-#### Declaration ####
-
-```
-int SbStringConcatWide(wchar_t *out_destination, const wchar_t *source, int destination_size)
-```
-
-### SbStringCopy ###
-
-Copies as much of a `source` string as possible and null-terminates it, given
-that `destination_size` characters of storage are available. This function is
-meant to be a drop-in replacement for `strlcpy`.
-
-The return value specifies the length of `source`.
-
-`out_destination`: The location to which the string is copied. `source`: The
-string to be copied. `destination_size`: The amount of the source string to
-copy.
-
-#### Declaration ####
-
-```
-int SbStringCopy(char *out_destination, const char *source, int destination_size)
-```
-
-### SbStringCopyUnsafe ###
-
-An inline wrapper for an unsafe SbStringCopy that assumes that the destination
-provides enough storage space for the entire string. The return value is a
-pointer to the destination string. This function is meant to be a drop-in
-replacement for `strcpy`.
-
-`out_destination`: The location to which the string is copied. `source`: The
-string to be copied.
-
-#### Declaration ####
-
-```
-static char* SbStringCopyUnsafe(char *out_destination, const char *source)
-```
-
-### SbStringCopyWide ###
-
-Identical to SbStringCopy, but for wide characters.
-
-`out_destination`: The location to which the string is copied. `source`: The
-string to be copied. `destination_size`: The amount of the source string to
-copy.
-
-#### Declaration ####
-
-```
-int SbStringCopyWide(wchar_t *out_destination, const wchar_t *source, int destination_size)
-```
-
 ### SbStringDuplicate ###
 
 Copies `source` into a buffer that is allocated by this function and that can be
@@ -226,53 +63,6 @@
 char* SbStringDuplicate(const char *source)
 ```
 
-### SbStringFindCharacter ###
-
-Finds the first occurrence of a `character` in `str`. The return value is a
-pointer to the found character in the given string or `NULL` if the character is
-not found. Note that this function's signature does NOT match that of the
-`strchr` function.
-
-`str`: The string to search for the character. `character`: The character to
-find in the string.
-
-#### Declaration ####
-
-```
-const char* SbStringFindCharacter(const char *str, char character)
-```
-
-### SbStringFindLastCharacter ###
-
-Finds the last occurrence of a specified character in a string. The return value
-is a pointer to the found character in the given string or `NULL` if the
-character is not found. Note that this function's signature does NOT match that
-of the `strrchr` function.
-
-`str`: The string to search for the character. `character`: The character to
-find in the string.
-
-#### Declaration ####
-
-```
-const char* SbStringFindLastCharacter(const char *str, char character)
-```
-
-### SbStringFindString ###
-
-Finds the first occurrence of `str2` in `str1`. The return value is a pointer to
-the beginning of the found string or `NULL` if the string is not found. This
-function is meant to be a drop-in replacement for `strstr`.
-
-`str1`: The string in which to search for the presence of `str2`. `str2`: The
-string to locate in `str1`.
-
-#### Declaration ####
-
-```
-const char* SbStringFindString(const char *str1, const char *str2)
-```
-
 ### SbStringFormat ###
 
 Produces a string formatted with `format` and `arguments`, placing as much of
@@ -352,32 +142,6 @@
 static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
 ```
 
-### SbStringGetLength ###
-
-Returns the length, in characters, of `str`.
-
-`str`: A zero-terminated ASCII string.
-
-#### Declaration ####
-
-```
-size_t SbStringGetLength(const char *str)
-```
-
-### SbStringGetLengthWide ###
-
-Returns the length of a wide character string. (This function is the same as
-SbStringGetLength, but for a string comprised of wide characters.) This function
-assumes that there are no multi-element characters.
-
-`str`: A zero-terminated ASCII string.
-
-#### Declaration ####
-
-```
-size_t SbStringGetLengthWide(const wchar_t *str)
-```
-
 ### SbStringScan ###
 
 Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
@@ -408,3 +172,4 @@
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/system.md b/src/cobalt/site/docs/reference/starboard/modules/system.md
index 9fb60ca..d6ce62e 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/system.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/system.md
@@ -25,12 +25,6 @@
     Whether this system has the ability to report on GPU memory usage. If (and
     only if) a system has this capability will SbSystemGetTotalGPUMemory() and
     SbSystemGetUsedGPUMemory() be valid to call.
-*   `kSbSystemCapabilitySetsInputTimestamp`
-
-    Whether this system sets the `timestamp` field of SbInputData . If the
-    system does not set this field, then it will automatically be set; however,
-    the relative time between input events likely will not be preserved, so
-    time-related calculations (e.g. velocity for move events) will be incorrect.
 
 ### SbSystemConnectionType ###
 
@@ -158,10 +152,6 @@
 *   `kSbSystemPropertyCertificationScope`
 
     The certification scope that identifies a group of devices.
-*   `kSbSystemPropertyBase64EncodedCertificationSecret`
-
-    The HMAC-SHA256 base64 encoded symmetric key used to sign a subset of the
-    query parameters from the application startup URL.
 *   `kSbSystemPropertyChipsetModelNumber`
 
     The full model number of the main platform chipset, including any vendor-
@@ -308,6 +298,33 @@
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
+### SbSystemGetExtension ###
+
+Returns pointer to a constant global struct implementing the extension named
+`name`, if it is implemented. Otherwise return NULL.
+
+Extensions are used to implement behavior which is specific to the combination
+of application & platform. An extension relies on a header file in the
+"extension" subdirectory of an app, which is used by both the application and
+the Starboard platform to define an extension API struct. Since the header is
+used both above and below Starboard, it cannot include any files from above
+Starboard. It may depend on Starboard headers. That API struct has only 2
+required fields which must be first: a const char* `name`, storing the extension
+name, and a uint32_t `version` storing the version number of the extension. All
+other fields may be C types (including custom structs) or function pointers. The
+application will query for the function by name using SbSystemGetExtension, and
+the platform returns a pointer to the singleton instance of the extension
+struct. The singleton struct should be constant after initialization, since the
+application may only get the extension once, meaning updated values would be
+ignored. As the version of extensions are incremented, fields may be added to
+the end of the struct, but never removed (only deprecated).
+
+#### Declaration ####
+
+```
+const void* SbSystemGetExtension(const char *name)
+```
+
 ### SbSystemGetLastError ###
 
 Gets the last platform-specific error code produced by any Starboard call in the
@@ -517,6 +534,18 @@
 bool SbSystemIsDebuggerAttached()
 ```
 
+### SbSystemNetworkIsDisconnected ###
+
+Returns if the device is disconnected from network. "Disconnected" is chosen
+over connected because disconnection can be determined with more certainty than
+connection usually.
+
+#### Declaration ####
+
+```
+bool SbSystemNetworkIsDisconnected()
+```
+
 ### SbSystemRaisePlatformError ###
 
 Cobalt calls this function to notify the platform that an error has occurred in
@@ -545,20 +574,94 @@
 bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
 ```
 
-### SbSystemRequestPause ###
+### SbSystemRequestBlur ###
 
-Requests that the application move into the Paused state at the next convenient
+Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to "unfocused application" in a
 traditional window manager, where the application may be partially visible.
 
-This function eventually causes a `kSbEventTypePause` event to be dispatched to
-the application. Before the `kSbEventTypePause` event is dispatched, some work
+This function eventually causes a `kSbEventTypeBlur` event to be dispatched to
+the application. Before the `kSbEventTypeBlur` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
 #### Declaration ####
 
 ```
-void SbSystemRequestPause()
+void SbSystemRequestBlur()
+```
+
+### SbSystemRequestConceal ###
+
+Requests that the application move into the Concealed state at the next
+convenient point. This should roughly correspond to "minimization" in a
+traditional window manager, where the application is no longer visible. However,
+the background tasks can still be running.
+
+This function eventually causes a `kSbEventTypeConceal` event to be dispatched
+to the application. Before the `kSbEventTypeConceal` event is dispatched, some
+work may continue to be done, and unrelated system events may be dispatched.
+
+In the Concealed state, the application will be invisible, but probably still be
+running background tasks. The expectation is that an external system event will
+bring the application out of the Concealed state.
+
+#### Declaration ####
+
+```
+void SbSystemRequestConceal()
+```
+
+### SbSystemRequestFocus ###
+
+Requests that the application move into the Started state at the next convenient
+point. This should roughly correspond to a "focused application" in a
+traditional window manager, where the application is fully visible and the
+primary receiver of input events.
+
+This function eventually causes a `kSbEventTypeFocus` event to be dispatched to
+the application. Before `kSbEventTypeFocus` is dispatched, some work may
+continue to be done, and unrelated system events may be dispatched.
+
+#### Declaration ####
+
+```
+void SbSystemRequestFocus()
+```
+
+### SbSystemRequestFreeze ###
+
+Requests that the application move into the Frozen state at the next convenient
+point.
+
+This function eventually causes a `kSbEventTypeFreeze` event to be dispatched to
+the application. Before the `kSbEventTypeSuspend` event is dispatched, some work
+may continue to be done, and unrelated system events may be dispatched.
+
+In the Frozen state, the application will be resident, but probably not running.
+The expectation is that an external system event will bring the application out
+of the Frozen state.
+
+#### Declaration ####
+
+```
+void SbSystemRequestFreeze()
+```
+
+### SbSystemRequestReveal ###
+
+Requests that the application move into the Blurred state at the next convenient
+point. This should roughly correspond to a "focused application" in a
+traditional window manager, where the application is fully visible and the
+primary receiver of input events.
+
+This function eventually causes a `kSbEventTypeReveal` event to be dispatched to
+the application. Before the `kSbEventTypeReveal` event is dispatched, some work
+may continue to be done, and unrelated system events may be dispatched.
+
+#### Declaration ####
+
+```
+void SbSystemRequestReveal()
 ```
 
 ### SbSystemRequestStop ###
@@ -578,43 +681,6 @@
 void SbSystemRequestStop(int error_level)
 ```
 
-### SbSystemRequestSuspend ###
-
-Requests that the application move into the Suspended state at the next
-convenient point. This should roughly correspond to "minimization" in a
-traditional window manager, where the application is no longer visible.
-
-This function eventually causes a `kSbEventTypeSuspend` event to be dispatched
-to the application. Before the `kSbEventTypeSuspend` event is dispatched, some
-work may continue to be done, and unrelated system events may be dispatched.
-
-In the Suspended state, the application will be resident, but probably not
-running. The expectation is that an external system event will bring the
-application out of the Suspended state.
-
-#### Declaration ####
-
-```
-void SbSystemRequestSuspend()
-```
-
-### SbSystemRequestUnpause ###
-
-Requests that the application move into the Started state at the next convenient
-point. This should roughly correspond to a "focused application" in a
-traditional window manager, where the application is fully visible and the
-primary receiver of input events.
-
-This function eventually causes a `kSbEventTypeUnpause` event to be dispatched
-to the application. Before `kSbEventTypeUnpause` is dispatched, some work may
-continue to be done, and unrelated system events may be dispatched.
-
-#### Declaration ####
-
-```
-void SbSystemRequestUnpause()
-```
-
 ### SbSystemSignWithCertificationSecretKey ###
 
 Computes a HMAC-SHA256 digest of `message` into `digest` using the application's
@@ -635,12 +701,6 @@
 bool SbSystemSignWithCertificationSecretKey(const uint8_t *message, size_t message_size_in_bytes, uint8_t *digest, size_t digest_size_in_bytes)
 ```
 
-#### Declaration ####
-
-```
-void SbSystemSort(void *base, size_t element_count, size_t element_width, SbSystemComparator comparator)
-```
-
 ### SbSystemSupportsResume ###
 
 Returns false if the platform doesn't need resume after suspend support. In such
@@ -672,3 +732,4 @@
 ```
 bool SbSystemSymbolize(const void *address, char *out_buffer, int buffer_size)
 ```
+
diff --git a/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md b/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
index a9fb339..e5f533b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
@@ -66,19 +66,13 @@
 
 #### Members ####
 
-*   ` onblur`
-
-    void (\*onblur)(SbUiNavItem item, void\* callback_context);
+*   `void(*onblur)(SbUiNavItem item, void *callback_context)`
 
     Invoke when an item has lost focus. This is only used with focus items.
-*   ` onfocus`
-
-    void (\*onfocus)(SbUiNavItem item, void\* callback_context);
+*   `void(*onfocus)(SbUiNavItem item, void *callback_context)`
 
     Invoke when an item has gained focus. This is only used with focus items.
-*   ` onscroll`
-
-    void (\*onscroll)(SbUiNavItem item, void\* callback_context);
+*   `void(*onscroll)(SbUiNavItem item, void *callback_context)`
 
     Invoke when an item's content offset is changed. This is only used with
     container items.
@@ -90,33 +84,26 @@
 
 #### Members ####
 
-*   ` create_item`
-
-    SbUiNavItem (\*create_item)(SbUiNavItemType type, const SbUiNavCallbacks \*
-    callbacks, void\* callback_context);
+*   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
+    *callbacks, void *callback_context)`
 
     Create a new navigation item. When the user interacts with this item the
     appropriate SbUiNavCallbacks function will be invoked with the provided
     `callback_context`. An item is not interactable until it is enabled.
-*   ` destroy_item`
-
-    void (\*destroy_item)(SbUiNavItem item);
+*   `void(*destroy_item)(SbUiNavItem item)`
 
     Destroy the given navigation item. If this is a content of another item,
     then it will first be unregistered. Additionally, if this item contains
     other items, then those will be unregistered as well, but they will not be
     automatically destroyed.
-*   ` set_focus`
-
-    void (\*set_focus)(SbUiNavItem item);
+*   `void(*set_focus)(SbUiNavItem item)`
 
     This is used to manually force focus on a navigation item of type
     kSbUiNavItemTypeFocus. Any previously focused navigation item should receive
     the blur event. If the item is not transitively a content of the root item,
-    then this does nothing.
-*   ` set_item_enabled`
-
-    void (\*set_item_enabled)(SbUiNavItem item, bool enabled);
+    then this does nothing. Specifying kSbUiNavItemInvalid should remove focus
+    from the UI navigation system.
+*   `void(*set_item_enabled)(SbUiNavItem item, bool enabled)`
 
     This is used to enable or disable user interaction with the specified
     navigation item. All navigation items are disabled when created, and they
@@ -125,33 +112,32 @@
     remain enabled. If `enabled` is false, it must be guaranteed that once this
     function returns, no callbacks associated with this item will be invoked
     until the item is re-enabled.
-*   ` set_item_dir`
-
-    void (\*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir);
+*   `void(*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir)`
 
     This specifies directionality for container items. Containers within
     containers do not inherit directionality. Directionality must be specified
-    for each container explicitly.
-*   ` set_item_size`
+    for each container explicitly. This should work even if `item` is disabled.
+*   `void(*set_item_focus_duration)(SbUiNavItem item, float seconds)`
 
-    void (\*set_item_size)(SbUiNavItem item, float width, float height);
+    Set the minimum amount of time the focus item should remain focused once it
+    becomes focused. This may be used to make important focus items harder to
+    navigate over. Focus may still be moved before `seconds` has elapsed by
+    using the set_focus() function. By default, item focus duration is 0
+    seconds.
+*   `void(*set_item_size)(SbUiNavItem item, float width, float height)`
 
     Set the interactable size of the specified navigation item. By default, an
     item's size is (0,0).
-*   ` set_item_transform`
-
-    void (\*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3 \*
-    transform);
+*   `void(*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3
+    *transform)`
 
     Set the transform for the navigation item and its contents if the item is a
     container. This specifies the placement of the item's center within its
     container. The transform origin is the center of the item. Distance is
     measured in pixels with the origin being the top-left of the item's
     container. By default, an item's transform is identity.
-*   ` get_item_focus_transform`
-
-    bool (\*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4 \*
-    out_transform);
+*   `bool(*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4
+    *out_transform)`
 
     Retrieve the focus transform matrix for the navigation item. The UI engine
     may translate, rotate, and/or tilt focus items to reflect user interaction.
@@ -159,10 +145,7 @@
     position inside its container. The transform origin is the center of the
     item. Return false if the item position should not be changed (i.e. the
     transform should be treated as identity).
-*   ` get_item_focus_vector`
-
-    bool (\*get_item_focus_vector)(SbUiNavItem item, float\* out_x, float\*
-    out_y);
+*   `bool(*get_item_focus_vector)(SbUiNavItem item, float *out_x, float *out_y)`
 
     Retrieve a vector representing the focus location within a focused item.
     This is used to provide feedback about user input that is too small to
@@ -171,19 +154,17 @@
     return true and set the output values in the range of [-1, +1] with (out_x,
     out_y) of (-1, -1) being the top-left corner of the navigation item and (0,
     0) being the center.
-*   ` set_item_container_window`
-
-    void (\*set_item_container_window)(SbUiNavItem item, SbWindow window);
+*   `void(*set_item_container_window)(SbUiNavItem item, SbWindow window)`
 
     This attaches the given navigation item (which must be a container) to the
     specified window. Navigation items are only interactable if they are
-    transitively attached to a window.
-
-    A navigation item may only have a SbUiNavItem or SbWindow as its direct
-    container. The navigation item hierarchy is established using
-    set_item_container_item() with the root container attached to a SbWindow
-    using set_item_container_window() to enable interaction with all enabled
-    items in the hierarchy.
+    transitively attached to a window.The native UI engine should never change
+    this navigation item's content offset. It is assumed to be used as a proxy
+    for the system window.A navigation item may only have a SbUiNavItem or
+    SbWindow as its direct container. The navigation item hierarchy is
+    established using set_item_container_item() with the root container attached
+    to a SbWindow using set_item_container_window() to enable interaction with
+    all enabled items in the hierarchy.
 
     If `item` is already registered with a different window, then this will
     unregister it from that window then attach it to the given `window`. It is
@@ -191,14 +172,12 @@
     `window` is kSbWindowInvalid, then this will unregister the `item` from its
     current window if any. Upon destruction of `item` or `window`, the `item` is
     automatically unregistered from the `window`.
-*   ` set_item_container_item`
-
-    void (\*set_item_container_item)(SbUiNavItem item, SbUiNavItem container);
+*   `void(*set_item_container_item)(SbUiNavItem item, SbUiNavItem container)`
 
     A container navigation item may contain other navigation items. However, it
     is an error to have circular containment or for `container` to not be of
     type kSbUiNavItemTypeContainer. If `item` already has a different container,
-    then this first severs that connection. If `container` is
+    then this first serves that connection. If `container` is
     kSbUiNavItemInvalid, then this removes `item` from its current container.
     Upon destruction of `item` or `container`, the `item` is automatically
     removed from the `container`.
@@ -216,11 +195,15 @@
     drawn at position (5,15).
 
     Essentially, content items should be drawn at: [container position] +
-    [content position] - [container content offset]
-*   ` set_item_content_offset`
-
-    void (\*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
-    float content_offset_y);
+    [content position] - [container content offset] Content items may overlap
+    within a container. This can cause obscured items to be unfocusable. The
+    only rule that needs to be followed is that contents which are focus items
+    can obscure other contents which are containers, but not vice versa. The
+    caller must ensure that content focus items do not overlap other content
+    focus items and content container items do not overlap other content
+    container items.
+*   `void(*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
+    float content_offset_y)`
 
     Set the current content offset for the given container. This may be used to
     force scrolling to make certain content items visible. A container item's
@@ -228,13 +211,21 @@
     Essentially, a content item should be drawn at: [container position] +
     [content position] - [container content offset] If `item` is not a
     container, then this does nothing. By default, the content offset is (0,0).
-*   ` get_item_content_offset`
-
-    void (\*get_item_content_offset)(SbUiNavItem item, float\*
-    out_content_offset_x, float\* out_content_offset_y);
+    This should update the values returned by get_item_content_offset() even if
+    the `item` is disabled.
+*   `void(*get_item_content_offset)(SbUiNavItem item, float
+    *out_content_offset_x, float *out_content_offset_y)`
 
     Retrieve the current content offset for the navigation item. If `item` is
-    not a container, then the content offset is (0,0).
+    not a container, then the content offset is (0,0). The native UI engine
+    should not change the content offset of a container unless one of its
+    contents (possibly recursively) is focused. This is to allow seamlessly
+    disabling then re-enabling focus items without having their containers
+    change offsets.
+*   `void(*do_batch_update)(void(*update_function)(void *), void *context)`
+
+    Call `update_function` with `context` to perform a series of UI navigation
+    changes atomically before returning.
 
 ### SbUiNavItemDir ###
 
@@ -242,22 +233,32 @@
 directionality is not specified for a container, it should default to left-to-
 right and top-to-bottom.
 
-For left-to-right, content offset x = 0 shows the leftmost content. `< –
-Container Size-->` +----------------- – +----------------- – +-----------------
-– + ` Not selectable. ` Selectable. ` Selectable. ` ` Offscreen. ` Onscreen. `
-Offscreen. ` ` Negative position. ` Positive position. ` Positive position. `
-+----------------- – +----------------- – +----------------- – + ^ Content
-Offset X = 0.
+```
+///   For left-to-right, content offset x = 0 shows the leftmost content.
+///                          |<--Container Size-->|
+///     +--------------------+--------------------+--------------------+
+///     | Not selectable.    | Selectable.        | Selectable.        |
+///     | Offscreen.         | Onscreen.          | Offscreen.         |
+///     | Negative position. | Positive position. | Positive position. |
+///     +--------------------+--------------------+--------------------+
+///                          ^
+///                  Content Offset X = 0.
+///
+///   For right-to-left, content offset x = 0 shows the rightmost content.
+///                          |<--Container Size-->|
+///     +--------------------+--------------------+--------------------+
+///     | Selectable.        | Selectable.        | Not selectable.    |
+///     | Offscreen.         | Onscreen.          | Offscreen.         |
+///     | Negative position. | Positive position. | Positive position. |
+///     +--------------------+--------------------+--------------------+
+///                          ^
+///                  Content Offset X = 0. 
+```
 
-For right-to-left, content offset x = 0 shows the rightmost content. `< –
-Container Size-->` +----------------- – +----------------- – +-----------------
-– + ` Selectable. ` Selectable. ` Not selectable. ` ` Offscreen. ` Onscreen. `
-Offscreen. ` ` Negative position. ` Positive position. ` Positive position. `
-+----------------- – +----------------- – +----------------- – + ^ Content
-Offset X = 0.
-
-Top-to-bottom is similar to left-to-right, but for the Y position. Bottom-to-top
-is similar to right-to-left, but for the Y position.
+```
+  Top-to-bottom is similar to left-to-right, but for the Y position.
+  Bottom-to-top is similar to right-to-left, but for the Y position.
+```
 
 #### Members ####
 
@@ -266,7 +267,12 @@
 
 ### SbUiNavMatrix2x3 ###
 
-This represents a 2x3 transform matrix in row-major order. ` a b tx ` ` c d ty `
+This represents a 2x3 transform matrix in row-major order.
+
+```
+///   | a b tx |
+///   | c d ty | 
+```
 
 #### Members ####
 
diff --git a/src/cobalt/speech/microphone_fake.cc b/src/cobalt/speech/microphone_fake.cc
index d490c65..643bbe7 100644
--- a/src/cobalt/speech/microphone_fake.cc
+++ b/src/cobalt/speech/microphone_fake.cc
@@ -93,7 +93,7 @@
         new AudioBus(kSupportedMonoChannel,
                      file_length_ / audio::GetSampleTypeSize(AudioBus::kInt16),
                      AudioBus::kInt16, AudioBus::kInterleaved));
-    SbMemoryCopy(audio_bus_->interleaved_data(), options.external_audio_data,
+    memcpy(audio_bus_->interleaved_data(), options.external_audio_data,
                  file_length_);
   }
 }
@@ -135,7 +135,7 @@
           kSupportedMonoChannel,
           file_buffer_size / audio::GetSampleTypeSize(AudioBus::kInt16),
           AudioBus::kInt16, AudioBus::kInterleaved));
-      SbMemoryCopy(audio_bus_->interleaved_data(), audio_input.get(),
+      memcpy(audio_bus_->interleaved_data(), audio_input.get(),
                    file_buffer_size);
       file_length_ = file_buffer_size;
     } else if (reader->sample_type() != AudioBus::kInt16 ||
@@ -163,7 +163,7 @@
   }
 
   int copy_bytes = std::min(file_length_ - read_index_, data_size);
-  SbMemoryCopy(out_data, audio_bus_->interleaved_data() + read_index_,
+  memcpy(out_data, audio_bus_->interleaved_data() + read_index_,
                copy_bytes);
   read_index_ += copy_bytes;
   if (read_index_ == file_length_) {
diff --git a/src/cobalt/system_window/system_window.cc b/src/cobalt/system_window/system_window.cc
index 396158f..85dbe0c 100644
--- a/src/cobalt/system_window/system_window.cc
+++ b/src/cobalt/system_window/system_window.cc
@@ -104,21 +104,27 @@
   return SbWindowGetPlatformHandle(window_);
 }
 
-void SystemWindow::DispatchInputEvent(const SbInputData& data,
+void SystemWindow::DispatchInputEvent(const SbEvent* event,
                                       InputEvent::Type type, bool is_repeat) {
+  DCHECK(event);
+  DCHECK(event->data);
+  SbInputData* input_data = static_cast<SbInputData*>(event->data);
+  const SbInputData& data = *input_data;
+
   // Use the current time unless it was overridden.
   SbTimeMonotonic timestamp = 0;
-
+#if SB_API_VERSION >= 13
+  timestamp = event->timestamp;
+#else  // SB_API_VERSION >= 13
   bool use_input_timestamp =
       SbSystemHasCapability(kSbSystemCapabilitySetsInputTimestamp);
   if (use_input_timestamp) {
     timestamp = data.timestamp;
   }
-
+#endif  // SB_API_VERSION >= 13
   if (timestamp == 0) {
     timestamp = SbTimeGetMonotonicNow();
   }
-
   // Starboard handily uses the Microsoft key mapping, which is also what Cobalt
   // uses.
   int key_code = static_cast<int>(data.key);
@@ -177,7 +183,11 @@
       std::unique_ptr<base::Event>(input_event.release()));
 }
 
-void SystemWindow::HandlePointerInputEvent(const SbInputData& data) {
+void SystemWindow::HandlePointerInputEvent(const SbEvent* event) {
+  DCHECK(event);
+  DCHECK(event->data);
+  SbInputData* input_data = static_cast<SbInputData*>(event->data);
+  const SbInputData& data = *input_data;
   InputEvent::Type input_event_type;
   switch (data.type) {
     case kSbInputEventTypePress: {
@@ -188,7 +198,7 @@
       } else {
         input_event_type = InputEvent::kPointerDown;
       }
-      DispatchInputEvent(data, input_event_type, false /* is_repeat */);
+      DispatchInputEvent(event, input_event_type, false /* is_repeat */);
       break;
     }
     case kSbInputEventTypeUnpress: {
@@ -199,11 +209,11 @@
       } else {
         input_event_type = InputEvent::kPointerUp;
       }
-      DispatchInputEvent(data, input_event_type, false /* is_repeat */);
+      DispatchInputEvent(event, input_event_type, false /* is_repeat */);
       break;
     }
     case kSbInputEventTypeWheel: {
-      DispatchInputEvent(data, InputEvent::kWheel, false /* is_repeat */);
+      DispatchInputEvent(event, InputEvent::kWheel, false /* is_repeat */);
       break;
     }
     case kSbInputEventTypeMove: {
@@ -214,7 +224,7 @@
       } else {
         input_event_type = InputEvent::kPointerMove;
       }
-      DispatchInputEvent(data, input_event_type, false /* is_repeat */);
+      DispatchInputEvent(event, input_event_type, false /* is_repeat */);
       break;
     }
     default:
@@ -223,35 +233,39 @@
   }
 }
 
-void SystemWindow::HandleInputEvent(const SbInputData& data) {
+void SystemWindow::HandleInputEvent(const SbEvent* event) {
+  DCHECK(event);
+  DCHECK(event->data);
+  SbInputData* input_data = static_cast<SbInputData*>(event->data);
+  const SbInputData& data = *input_data;
   DCHECK_EQ(window_, data.window);
   // Handle supported pointer device types.
   if ((kSbInputDeviceTypeMouse == data.device_type) ||
       (kSbInputDeviceTypeTouchScreen == data.device_type) ||
       (kSbInputDeviceTypeTouchPad == data.device_type)) {
-    HandlePointerInputEvent(data);
+    HandlePointerInputEvent(event);
     return;
   }
 
   // Handle all other input device types.
   switch (data.type) {
     case kSbInputEventTypePress: {
-      DispatchInputEvent(data, InputEvent::kKeyDown, key_down_);
+      DispatchInputEvent(event, InputEvent::kKeyDown, key_down_);
       key_down_ = true;
       break;
     }
     case kSbInputEventTypeUnpress: {
-      DispatchInputEvent(data, InputEvent::kKeyUp, false /* is_repeat */);
+      DispatchInputEvent(event, InputEvent::kKeyUp, false /* is_repeat */);
       key_down_ = false;
       break;
     }
     case kSbInputEventTypeMove: {
-      DispatchInputEvent(data, InputEvent::kKeyMove, false /* is_repeat */);
+      DispatchInputEvent(event, InputEvent::kKeyMove, false /* is_repeat */);
       break;
     }
 #if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     case kSbInputEventTypeInput: {
-      DispatchInputEvent(data, InputEvent::kInput, false /* is_repeat */);
+      DispatchInputEvent(event, InputEvent::kInput, false /* is_repeat */);
       break;
     }
 #endif  // SB_API_VERSION >= 12 ||
@@ -269,9 +283,7 @@
   }
 
   DCHECK(g_the_window);
-  DCHECK(event->data);
-  SbInputData* data = reinterpret_cast<SbInputData*>(event->data);
-  g_the_window->HandleInputEvent(*data);
+  g_the_window->HandleInputEvent(event);
   return;
 }
 
diff --git a/src/cobalt/system_window/system_window.h b/src/cobalt/system_window/system_window.h
index 255f6e3..0059c84 100644
--- a/src/cobalt/system_window/system_window.h
+++ b/src/cobalt/system_window/system_window.h
@@ -61,7 +61,7 @@
   void* GetWindowHandle();
 
   // Handles a single Starboard input event, dispatching any appropriate events.
-  void HandleInputEvent(const SbInputData& data);
+  void HandleInputEvent(const SbEvent* event);
 
   // Returns the primary SystemWindow currently in use by the application.
   // Only one SystemWindow is currently supported, and this method will return
@@ -71,9 +71,11 @@
  private:
   void UpdateModifiers(SbKey key, bool pressed);
   InputEvent::Modifiers GetModifiers();
-  void DispatchInputEvent(const SbInputData& data, InputEvent::Type type,
-                          bool is_repeat);
-  void HandlePointerInputEvent(const SbInputData& data);
+
+  void DispatchInputEvent(const SbEvent* event,
+                          InputEvent::Type type, bool is_repeat);
+
+  void HandlePointerInputEvent(const SbEvent* event);
 
   base::EventDispatcher* event_dispatcher_;
 
diff --git a/src/cobalt/trace_event/json_file_outputter.cc b/src/cobalt/trace_event/json_file_outputter.cc
index aa8b1a3..2b85b61 100644
--- a/src/cobalt/trace_event/json_file_outputter.cc
+++ b/src/cobalt/trace_event/json_file_outputter.cc
@@ -71,7 +71,7 @@
                 << output_path_.value();
   } else {
     const char tail[] = "\n]}";
-    Write(tail, SbStringGetLength(tail));
+    Write(tail, strlen(tail));
   }
   Close();
 }
@@ -111,7 +111,7 @@
   // multiple times.
   if (output_trace_event_call_count_ != 0) {
     const char text[] = ",\n";
-    Write(text, SbStringGetLength(text));
+    Write(text, strlen(text));
   }
   const std::string& event_str = event_string->data();
   Write(event_str.c_str(), event_str.size());
diff --git a/src/cobalt/updater/configurator.cc b/src/cobalt/updater/configurator.cc
index b8df78b..b14e2d1 100644
--- a/src/cobalt/updater/configurator.cc
+++ b/src/cobalt/updater/configurator.cc
@@ -207,7 +207,8 @@
 std::vector<uint8_t> Configurator::GetRunActionKeyHash() const { return {}; }
 
 std::string Configurator::GetAppGuid() const {
-  return "{6D4E53F3-CC64-4CB8-B6BD-AB0B8F300E1C}";
+  // Omaha console app id for trunk
+  return "{A9557415-DDCD-4948-8113-C643EFCF710C}";
 }
 
 std::unique_ptr<update_client::ProtocolHandlerFactory>
diff --git a/src/cobalt/updater/updater_module.cc b/src/cobalt/updater/updater_module.cc
index db02d9a..8f5663f 100644
--- a/src/cobalt/updater/updater_module.cc
+++ b/src/cobalt/updater/updater_module.cc
@@ -105,7 +105,8 @@
     if (updater_notification_ext_ != nullptr) {
       updater_notification_ext_->UpdaterState(
           ComponentStateToCobaltExtensionUpdaterNotificationState(
-              crx_update_item_.state));
+              crx_update_item_.state),
+          GetCurrentEvergreenVersion().c_str());
     }
   } else {
     status = "No status available";
diff --git a/src/cobalt/updater/updater_module.h b/src/cobalt/updater/updater_module.h
index 49b8715..fa4abc0 100644
--- a/src/cobalt/updater/updater_module.h
+++ b/src/cobalt/updater/updater_module.h
@@ -100,7 +100,7 @@
         static_cast<const CobaltExtensionUpdaterNotificationApi*>(
             SbSystemGetExtension(kCobaltExtensionUpdaterNotificationName));
     if (updater_notification_ext &&
-        SbStringCompareAll(updater_notification_ext->name,
+        strcmp(updater_notification_ext->name,
                            kCobaltExtensionUpdaterNotificationName) == 0 &&
         updater_notification_ext->version >= 1) {
       updater_notification_ext_ = updater_notification_ext;
diff --git a/src/cobalt/websocket/cobalt_web_socket_event_handler.cc b/src/cobalt/websocket/cobalt_web_socket_event_handler.cc
index e154cf1..c0c2d86 100644
--- a/src/cobalt/websocket/cobalt_web_socket_event_handler.cc
+++ b/src/cobalt/websocket/cobalt_web_socket_event_handler.cc
@@ -46,7 +46,7 @@
     std::size_t frame_chunk_size = iterator->second;
 
     if (bytes_available >= frame_chunk_size) {
-      SbMemoryCopy(out_destination, data->data(), frame_chunk_size);
+      memcpy(out_destination, data->data(), frame_chunk_size);
       out_destination += frame_chunk_size;
       bytes_written += frame_chunk_size;
       bytes_available -= frame_chunk_size;
diff --git a/src/cobalt/websocket/sec_web_socket_key.h b/src/cobalt/websocket/sec_web_socket_key.h
index 02cdeeb..47c394f 100644
--- a/src/cobalt/websocket/sec_web_socket_key.h
+++ b/src/cobalt/websocket/sec_web_socket_key.h
@@ -31,14 +31,14 @@
   typedef char SecWebSocketKeyBytes[kKeySizeInBytes];
 
   SecWebSocketKey() {
-    SbMemorySet(&key_bytes[0], 0, kKeySizeInBytes);
+    memset(&key_bytes[0], 0, kKeySizeInBytes);
     base::StringPiece key_stringpiece(key_bytes, sizeof(key_bytes));
     bool success = base::Base64Encode(key_stringpiece, &key_base64_encoded);
     DCHECK(success);
   }
 
   explicit SecWebSocketKey(const SecWebSocketKeyBytes& key) {
-    SbMemoryCopy(&key_bytes[0], &key[0], sizeof(key_bytes));
+    memcpy(&key_bytes[0], &key[0], sizeof(key_bytes));
     base::StringPiece key_stringpiece(key_bytes, sizeof(key_bytes));
     bool success = base::Base64Encode(key_stringpiece, &key_base64_encoded);
     DCHECK(success);
diff --git a/src/cobalt/websocket/web_socket_event_interface.cc b/src/cobalt/websocket/web_socket_event_interface.cc
index e4ebd80..8230aaa 100644
--- a/src/cobalt/websocket/web_socket_event_interface.cc
+++ b/src/cobalt/websocket/web_socket_event_interface.cc
@@ -41,7 +41,7 @@
     std::size_t frame_chunk_size = iterator->second;
 
     if (bytes_available >= frame_chunk_size) {
-      SbMemoryCopy(out_destination, data->data(), frame_chunk_size);
+      memcpy(out_destination, data->data(), frame_chunk_size);
       out_destination += frame_chunk_size;
       bytes_written += frame_chunk_size;
       bytes_available -= frame_chunk_size;
diff --git a/src/cobalt/websocket/web_socket_handshake_helper_test.cc b/src/cobalt/websocket/web_socket_handshake_helper_test.cc
index a01b9a2..5fd60f8 100644
--- a/src/cobalt/websocket/web_socket_handshake_helper_test.cc
+++ b/src/cobalt/websocket/web_socket_handshake_helper_test.cc
@@ -30,7 +30,7 @@
 
 SecWebSocketKey NullMaskingKeyGenerator() {
   SecWebSocketKey::SecWebSocketKeyBytes key_bytes;
-  SbMemorySet(&key_bytes, 0, sizeof(key_bytes));
+  memset(&key_bytes, 0, sizeof(key_bytes));
   return SecWebSocketKey(key_bytes);
 }
 
@@ -83,9 +83,9 @@
   handshake_helper_.GenerateSecWebSocketKey();
   std::string null_key(SecWebSocketKey::kKeySizeInBytes, '\0');
   EXPECT_EQ(
-      SbMemoryCompare(null_key.data(),
-                      handshake_helper_.sec_websocket_key_.GetRawKeyBytes(),
-                      SecWebSocketKey::kKeySizeInBytes),
+      memcmp(null_key.data(),
+             handshake_helper_.sec_websocket_key_.GetRawKeyBytes(),
+             SecWebSocketKey::kKeySizeInBytes),
       0);
 }
 
diff --git a/src/cobalt/websocket/web_socket_impl.cc b/src/cobalt/websocket/web_socket_impl.cc
index eaa9b33..39b54d2 100644
--- a/src/cobalt/websocket/web_socket_impl.cc
+++ b/src/cobalt/websocket/web_socket_impl.cc
@@ -240,7 +240,7 @@
                                const char *data, std::size_t length,
                                std::string *error_message) {
   scoped_refptr<net::IOBuffer> io_buffer(new net::IOBuffer(length));
-  SbMemoryCopy(io_buffer->data(), data, length);
+  memcpy(io_buffer->data(), data, length);
 
   if (delegate_task_runner_->BelongsToCurrentThread()) {
     SendOnDelegateThread(op_code, std::move(io_buffer), length);
@@ -275,11 +275,12 @@
     SendQueueMessage message = send_queue_.front();
     size_t current_message_length = message.length - sent_size_of_top_message_;
     bool final = false;
+    bool continuation = sent_size_of_top_message_ > 0 ? true : false;
     if (current_quota_ < static_cast<int64_t>(current_message_length)) {
       // quota is not enough to send the top message.
       scoped_refptr<net::IOBuffer> new_io_buffer(
           new net::IOBuffer(static_cast<size_t>(current_quota_)));
-      SbMemoryCopy(new_io_buffer->data(),
+      memcpy(new_io_buffer->data(),
                    message.io_buffer->data() + sent_size_of_top_message_,
                    current_quota_);
       sent_size_of_top_message_ += current_quota_;
@@ -294,7 +295,10 @@
       current_quota_ -= current_message_length;
     }
     auto channel_state = websocket_channel_->SendFrame(
-        final, message.op_code, message.io_buffer, current_message_length);
+        final,
+        continuation ? net::WebSocketFrameHeader::kOpCodeContinuation
+                     : message.op_code,
+        message.io_buffer, current_message_length);
     if (channel_state == net::WebSocketChannel::CHANNEL_DELETED) {
       websocket_channel_.reset();
     }
diff --git a/src/cobalt/websocket/web_socket_impl_test.cc b/src/cobalt/websocket/web_socket_impl_test.cc
index 8db8285..802ab70 100644
--- a/src/cobalt/websocket/web_socket_impl_test.cc
+++ b/src/cobalt/websocket/web_socket_impl_test.cc
@@ -172,12 +172,19 @@
     EXPECT_CALL(*mock_channel_,
                 MockSendFrame(false, net::WebSocketFrameHeader::kOpCodeText, _,
                               kDefaultSendQuotaHighWaterMark))
-        .Times(2)
+        .Times(1)
         .WillRepeatedly(Return(net::WebSocketChannel::CHANNEL_ALIVE));
 
     EXPECT_CALL(
         *mock_channel_,
-        MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeText, _, 1))
+        MockSendFrame(false, net::WebSocketFrameHeader::kOpCodeContinuation, _,
+                      kDefaultSendQuotaHighWaterMark))
+        .Times(1)
+        .WillRepeatedly(Return(net::WebSocketChannel::CHANNEL_ALIVE));
+
+    EXPECT_CALL(*mock_channel_,
+                MockSendFrame(
+                    true, net::WebSocketFrameHeader::kOpCodeContinuation, _, 1))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
   }
@@ -204,7 +211,7 @@
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
     EXPECT_CALL(
         *mock_channel_,
-        MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeBinary, _, 1))
+        MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeContinuation, _, 1))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
     EXPECT_CALL(*mock_channel_,
@@ -213,7 +220,7 @@
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
     EXPECT_CALL(*mock_channel_,
-                MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeText, _,
+                MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeContinuation, _,
                               kTooMuch - (k512KB - 1)))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
diff --git a/src/cobalt/websocket/web_socket_message_container.cc b/src/cobalt/websocket/web_socket_message_container.cc
index c85c91f..4260c8b 100644
--- a/src/cobalt/websocket/web_socket_message_container.cc
+++ b/src/cobalt/websocket/web_socket_message_container.cc
@@ -34,7 +34,7 @@
       std::size_t frame_chunk_size = data->size();
 
       if (bytes_available >= frame_chunk_size) {
-        SbMemoryCopy(out_destination, data->data(), frame_chunk_size);
+        memcpy(out_destination, data->data(), frame_chunk_size);
         out_destination += frame_chunk_size;
         bytes_written += frame_chunk_size;
         bytes_available -= frame_chunk_size;
diff --git a/src/cobalt/websocket/web_socket_message_container_test.cc b/src/cobalt/websocket/web_socket_message_container_test.cc
index 7bf1312..dcaada5 100644
--- a/src/cobalt/websocket/web_socket_message_container_test.cc
+++ b/src/cobalt/websocket/web_socket_message_container_test.cc
@@ -75,7 +75,7 @@
         new net::IOBufferWithSize(payload_size));
 
     net::IOBufferWithSize& data_array(*chunk->data.get());
-    SbMemorySet(data_array.data(), payload_filler, data_array.size());
+    memset(data_array.data(), payload_filler, data_array.size());
 
     chunk->final_chunk = true;
     WebSocketFrameContainer::ErrorCode error_code =
diff --git a/src/cobalt/xhr/url_fetcher_buffer_writer.cc b/src/cobalt/xhr/url_fetcher_buffer_writer.cc
index fd67bb4..fd31307 100644
--- a/src/cobalt/xhr/url_fetcher_buffer_writer.cc
+++ b/src/cobalt/xhr/url_fetcher_buffer_writer.cc
@@ -236,7 +236,7 @@
 
   auto destination = static_cast<uint8_t*>(data_as_array_buffer_.data()) +
                      data_as_array_buffer_size_;
-  SbMemoryCopy(destination, buffer, num_bytes);
+  memcpy(destination, buffer, num_bytes);
   data_as_array_buffer_size_ += num_bytes;
 }
 
@@ -281,7 +281,7 @@
   if (type == kArrayBuffer) {
     data_as_array_buffer_.Resize(data_as_string_.capacity());
     data_as_array_buffer_size_ = data_as_string_.size();
-    SbMemoryCopy(data_as_array_buffer_.data(), data_as_string_.data(),
+    memcpy(data_as_array_buffer_.data(), data_as_string_.data(),
                  data_as_array_buffer_size_);
 
     ReleaseMemory(&data_as_string_);
diff --git a/src/components/update_client/cobalt_slot_management_test.cc b/src/components/update_client/cobalt_slot_management_test.cc
index 46090c8..f12f060 100644
--- a/src/components/update_client/cobalt_slot_management_test.cc
+++ b/src/components/update_client/cobalt_slot_management_test.cc
@@ -139,10 +139,10 @@
   }
 
   // In slot 2 create manifest v1.
-  CreateManifest("installation_2", kManifestV1, SbStringGetLength(kManifestV1));
+  CreateManifest("installation_2", kManifestV1, strlen(kManifestV1));
 
   // In slot 1 create manifest v2.
-  CreateManifest("installation_1", kManifestV2, SbStringGetLength(kManifestV2));
+  CreateManifest("installation_1", kManifestV2, strlen(kManifestV2));
 
   CobaltSlotManagement cobalt_slot_management;
   ASSERT_TRUE(cobalt_slot_management.Init(api_));
@@ -204,10 +204,10 @@
 
 TEST_F(CobaltSlotManagementTest, GoodCobaltQuickUpdate) {
   // In slot 1 create manifest v1.
-  CreateManifest("installation_1", kManifestV1, SbStringGetLength(kManifestV1));
+  CreateManifest("installation_1", kManifestV1, strlen(kManifestV1));
 
   // In slot 2 create manifest v2.
-  CreateManifest("installation_2", kManifestV2, SbStringGetLength(kManifestV2));
+  CreateManifest("installation_2", kManifestV2, strlen(kManifestV2));
 
   // Mark slot 2 good for app 2.
   std::string slot_path = storage_path_;
diff --git a/src/components/update_client/utils_unittest.cc b/src/components/update_client/utils_unittest.cc
index 5045e2a..71a8b88 100644
--- a/src/components/update_client/utils_unittest.cc
+++ b/src/components/update_client/utils_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "components/update_client/updater_state.h"
-#include "nb/cpp14oncpp11.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
diff --git a/src/crypto/encryptor.cc b/src/crypto/encryptor.cc
index 390f287..7d0ffd8 100644
--- a/src/crypto/encryptor.cc
+++ b/src/crypto/encryptor.cc
@@ -51,7 +51,7 @@
 Encryptor::Counter::Counter(base::StringPiece counter) {
   CHECK(sizeof(counter_) == counter.length());
 
-  SbMemoryCopy(&counter_, counter.data(), sizeof(counter_));
+  memcpy(&counter_, counter.data(), sizeof(counter_));
 }
 
 Encryptor::Counter::~Counter() = default;
@@ -73,7 +73,7 @@
 
 void Encryptor::Counter::Write(void* buf) {
   uint8_t* buf_ptr = reinterpret_cast<uint8_t*>(buf);
-  SbMemoryCopy(buf_ptr, &counter_, sizeof(counter_));
+  memcpy(buf_ptr, &counter_, sizeof(counter_));
 }
 
 size_t Encryptor::Counter::GetLengthInBytes() const {
diff --git a/src/crypto/encryptor_unittest.cc b/src/crypto/encryptor_unittest.cc
index f62947f..fa702ff 100644
--- a/src/crypto/encryptor_unittest.cc
+++ b/src/crypto/encryptor_unittest.cc
@@ -204,7 +204,7 @@
   EXPECT_TRUE(encryptor.Encrypt(plaintext_str, &encrypted));
 
   EXPECT_EQ(ciphertext_size, encrypted.size());
-  EXPECT_EQ(0, SbMemoryCompare(encrypted.data(), ciphertext, encrypted.size()));
+  EXPECT_EQ(0, memcmp(encrypted.data(), ciphertext, encrypted.size()));
 
   std::string decrypted;
   EXPECT_TRUE(encryptor.SetCounter(init_counter_str));
@@ -242,7 +242,7 @@
     EXPECT_TRUE(
         encryptor.Decrypt(ciphertext_str.substr(offset, len), &decrypted));
     EXPECT_EQ(len, decrypted.size());
-    EXPECT_EQ(0, SbMemoryCompare(decrypted.data(), plaintext + offset, len));
+    EXPECT_EQ(0, memcmp(decrypted.data(), plaintext + offset, len));
     offset += len;
   }
 }
@@ -324,7 +324,7 @@
   for (int i = 0; i < 10; ++i)
     counter1.Increment();
   counter1.Write(buf);
-  EXPECT_EQ(0, SbMemoryCompare(buf, kTest1, 15));
+  EXPECT_EQ(0, memcmp(buf, kTest1, 15));
   EXPECT_EQ(10, buf[15]);
 
   // Check corner cases.
@@ -338,7 +338,7 @@
       std::string(reinterpret_cast<const char*>(kTest2), kCounterSize));
   counter2.Increment();
   counter2.Write(buf);
-  EXPECT_EQ(0, SbMemoryCompare(buf, kExpect2, kCounterSize));
+  EXPECT_EQ(0, memcmp(buf, kExpect2, kCounterSize));
 
   const unsigned char kTest3[] = {
       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -350,7 +350,7 @@
       std::string(reinterpret_cast<const char*>(kTest3), kCounterSize));
   counter3.Increment();
   counter3.Write(buf);
-  EXPECT_EQ(0, SbMemoryCompare(buf, kExpect3, kCounterSize));
+  EXPECT_EQ(0, memcmp(buf, kExpect3, kCounterSize));
 }
 
 // TODO(wtc): add more known-answer tests.  Test vectors are available from
@@ -422,7 +422,7 @@
 
   EXPECT_EQ(sizeof(kRawCiphertext), ciphertext.size());
   EXPECT_EQ(
-      0, SbMemoryCompare(ciphertext.data(), kRawCiphertext, ciphertext.size()));
+      0, memcmp(ciphertext.data(), kRawCiphertext, ciphertext.size()));
 
   std::string decrypted;
   EXPECT_TRUE(encryptor.Decrypt(ciphertext, &decrypted));
diff --git a/src/crypto/hmac_unittest.cc b/src/crypto/hmac_unittest.cc
index 876add1..82faec6 100644
--- a/src/crypto/hmac_unittest.cc
+++ b/src/crypto/hmac_unittest.cc
@@ -83,7 +83,7 @@
 
   EXPECT_TRUE(hmac.Sign(message_data, calculated_hmac, kSHA1DigestSize));
   EXPECT_EQ(0,
-            SbMemoryCompare(kReceivedHmac, calculated_hmac, kSHA1DigestSize));
+            memcmp(kReceivedHmac, calculated_hmac, kSHA1DigestSize));
 }
 
 // Test cases from RFC 2202 section 3
@@ -153,7 +153,7 @@
     std::string data_string(cases[i].data, cases[i].data_len);
     unsigned char digest[kSHA1DigestSize];
     EXPECT_TRUE(hmac.Sign(data_string, digest, kSHA1DigestSize));
-    EXPECT_EQ(0, SbMemoryCompare(cases[i].digest, digest, kSHA1DigestSize));
+    EXPECT_EQ(0, memcmp(cases[i].digest, digest, kSHA1DigestSize));
   }
 }
 
@@ -180,7 +180,7 @@
   EXPECT_EQ(kSHA256DigestSize, hmac.DigestLength());
   EXPECT_TRUE(hmac.Sign(data, calculated_hmac, kSHA256DigestSize));
   EXPECT_EQ(
-      0, SbMemoryCompare(kKnownHMACSHA256, calculated_hmac, kSHA256DigestSize));
+      0, memcmp(kKnownHMACSHA256, calculated_hmac, kSHA256DigestSize));
 }
 
 // Based on NSS's FIPS HMAC power-up self-test.
@@ -222,7 +222,7 @@
   EXPECT_EQ(kSHA1DigestSize, hmac.DigestLength());
   EXPECT_TRUE(hmac.Sign(message_data, calculated_hmac, kSHA1DigestSize));
   EXPECT_EQ(0,
-            SbMemoryCompare(kKnownHMACSHA1, calculated_hmac, kSHA1DigestSize));
+            memcmp(kKnownHMACSHA1, calculated_hmac, kSHA1DigestSize));
   EXPECT_TRUE(hmac.Verify(
       message_data,
       base::StringPiece(reinterpret_cast<const char*>(kKnownHMACSHA1),
@@ -237,7 +237,7 @@
   unsigned char calculated_hmac2[kSHA256DigestSize];
 
   EXPECT_TRUE(hmac2.Sign(message_data, calculated_hmac2, kSHA256DigestSize));
-  EXPECT_EQ(0, SbMemoryCompare(kKnownHMACSHA256, calculated_hmac2,
+  EXPECT_EQ(0, memcmp(kKnownHMACSHA256, calculated_hmac2,
                                kSHA256DigestSize));
 }
 
@@ -251,7 +251,7 @@
                             kSimpleHmacCases[i].data_len);
     unsigned char digest[kSHA1DigestSize];
     EXPECT_TRUE(hmac.Sign(data_string, digest, kSHA1DigestSize));
-    EXPECT_EQ(0, SbMemoryCompare(kSimpleHmacCases[i].digest, digest,
+    EXPECT_EQ(0, memcmp(kSimpleHmacCases[i].digest, digest,
                                  kSHA1DigestSize));
   }
 }
@@ -296,7 +296,7 @@
 
   unsigned char digest[kSHA1DigestSize];
   EXPECT_TRUE(hmac.Sign(data, digest, kSHA1DigestSize));
-  EXPECT_EQ(0, SbMemoryCompare(kExpectedDigest, digest, kSHA1DigestSize));
+  EXPECT_EQ(0, memcmp(kExpectedDigest, digest, kSHA1DigestSize));
 
   EXPECT_TRUE(hmac.Verify(
       data, base::StringPiece(kExpectedDigest, kSHA1DigestSize)));
diff --git a/src/crypto/openssl_util.h b/src/crypto/openssl_util.h
index b546503..37db91c 100644
--- a/src/crypto/openssl_util.h
+++ b/src/crypto/openssl_util.h
@@ -31,7 +31,7 @@
   ~ScopedOpenSSLSafeSizeBuffer() {
     if (output_len_ < MIN_SIZE) {
       // Copy the temporary buffer out, truncating as needed.
-      SbMemoryCopy(output_, min_sized_buffer_, output_len_);
+      memcpy(output_, min_sized_buffer_, output_len_);
     }
     // else... any writing already happened directly into |output_|.
   }
diff --git a/src/crypto/p224.cc b/src/crypto/p224.cc
index 52e59ce..cb18834 100644
--- a/src/crypto/p224.cc
+++ b/src/crypto/p224.cc
@@ -45,7 +45,7 @@
 // IsZero returns 0xffffffff if a == 0 mod p and 0 otherwise.
 uint32_t IsZero(const FieldElement& a) {
   FieldElement minimal;
-  SbMemoryCopy(&minimal, &a, sizeof(minimal));
+  memcpy(&minimal, &a, sizeof(minimal));
   Contract(&minimal);
 
   uint32_t is_zero = 0, is_p = 0;
@@ -172,7 +172,7 @@
 // out[i] < 2**29
 void Mul(FieldElement* out, const FieldElement& a, const FieldElement& b) {
   LargeFieldElement tmp;
-  SbMemorySet(&tmp, 0, sizeof(tmp));
+  memset(&tmp, 0, sizeof(tmp));
 
   for (int i = 0; i < 8; i++) {
     for (int j = 0; j < 8; j++) {
@@ -189,7 +189,7 @@
 // out[i] < 2**29
 void Square(FieldElement* out, const FieldElement& a) {
   LargeFieldElement tmp;
-  SbMemorySet(&tmp, 0, sizeof(tmp));
+  memset(&tmp, 0, sizeof(tmp));
 
   for (int i = 0; i < 8; i++) {
     for (int j = 0; j <= i; j++) {
@@ -596,7 +596,7 @@
                 const Point& a,
                 const uint8_t* scalar,
                 size_t scalar_len) {
-  SbMemorySet(out, 0, sizeof(*out));
+  memset(out, 0, sizeof(*out));
   Point tmp;
 
   for (size_t i = 0; i < scalar_len; i++) {
@@ -654,7 +654,7 @@
   const uint32_t* inwords = reinterpret_cast<const uint32_t*>(in.data());
   Get224Bits(x, inwords);
   Get224Bits(y, inwords + 7);
-  SbMemorySet(&z, 0, sizeof(z));
+  memset(&z, 0, sizeof(z));
   z[0] = 1;
 
   // Check that the point is on the curve, i.e. that y² = x³ - 3x + b.
@@ -676,7 +676,7 @@
 
   ::Add(&rhs, rhs, kB);
   Contract(&rhs);
-  return SbMemoryCompare(&lhs, &rhs, sizeof(lhs)) == 0;
+  return memcmp(&lhs, &rhs, sizeof(lhs)) == 0;
 }
 
 std::string Point::ToString() const {
@@ -738,7 +738,7 @@
   Subtract(&out->y, kP, y);
   Reduce(&out->y);
 
-  SbMemorySet(&out->z, 0, sizeof(out->z));
+  memset(&out->z, 0, sizeof(out->z));
   out->z[0] = 1;
 }
 
diff --git a/src/crypto/p224_spake.cc b/src/crypto/p224_spake.cc
index 0515b3c..f19f931 100644
--- a/src/crypto/p224_spake.cc
+++ b/src/crypto/p224_spake.cc
@@ -106,8 +106,8 @@
 P224EncryptedKeyExchange::P224EncryptedKeyExchange(PeerType peer_type,
                                                    base::StringPiece password)
     : state_(kStateInitial), is_server_(peer_type == kPeerTypeServer) {
-  SbMemorySet(&x_, 0, sizeof(x_));
-  SbMemorySet(&expected_authenticator_, 0, sizeof(expected_authenticator_));
+  memset(&x_, 0, sizeof(x_));
+  memset(&expected_authenticator_, 0, sizeof(expected_authenticator_));
 
   // x_ is a random scalar.
   RandBytes(x_, sizeof(x_));
@@ -219,7 +219,7 @@
 
   next_message_ =
       std::string(reinterpret_cast<const char*>(my_hash), kSHA256Length);
-  SbMemoryCopy(expected_authenticator_, their_hash, kSHA256Length);
+  memcpy(expected_authenticator_, their_hash, kSHA256Length);
   state_ = kStateSendHash;
   return kResultPending;
 }
@@ -265,8 +265,8 @@
 }
 
 void P224EncryptedKeyExchange::SetXForTesting(const std::string& x) {
-  SbMemorySet(&x_, 0, sizeof(x_));
-  SbMemoryCopy(&x_, x.data(), std::min(x.size(), sizeof(x_)));
+  memset(&x_, 0, sizeof(x_));
+  memcpy(&x_, x.data(), std::min(x.size(), sizeof(x_)));
   Init();
 }
 
diff --git a/src/crypto/p224_unittest.cc b/src/crypto/p224_unittest.cc
index 126b50d..eae8dd0 100644
--- a/src/crypto/p224_unittest.cc
+++ b/src/crypto/p224_unittest.cc
@@ -778,8 +778,8 @@
   const std::string external = point.ToString();
 
   ASSERT_EQ(external.size(), 56u);
-  EXPECT_EQ(0, SbMemoryCompare(external.data(), kBasePointExternal,
-                               sizeof(kBasePointExternal)));
+  EXPECT_EQ(0, memcmp(external.data(), kBasePointExternal,
+                      sizeof(kBasePointExternal)));
 }
 
 TEST(P224, ScalarBaseMult) {
@@ -789,8 +789,8 @@
     p224::ScalarBaseMult(kNISTTestVectors[i].scalar, &point);
     const std::string external = point.ToString();
     ASSERT_EQ(external.size(), 56u);
-    EXPECT_EQ(0, SbMemoryCompare(external.data(), kNISTTestVectors[i].affine,
-                                 external.size()));
+    EXPECT_EQ(0, memcmp(external.data(), kNISTTestVectors[i].affine,
+                        external.size()));
   }
 }
 
@@ -804,19 +804,19 @@
 
   p224::Negate(b, &minus_b);
   p224::Add(a, b, &sum);
-  EXPECT_NE(0, SbMemoryCompare(&sum, &a, sizeof(sum)));
+  EXPECT_NE(0, memcmp(&sum, &a, sizeof(sum)));
   p224::Add(minus_b, sum, &a_again);
   EXPECT_EQ(a_again.ToString(), a.ToString());
 }
 
 TEST(P224, Infinity) {
   char zeros[56];
-  SbMemorySet(zeros, 0, sizeof(zeros));
+  memset(zeros, 0, sizeof(zeros));
 
   // Test that x^0 = ∞.
   Point a;
   p224::ScalarBaseMult(reinterpret_cast<const uint8_t*>(zeros), &a);
-  EXPECT_EQ(0, SbMemoryCompare(zeros, a.ToString().data(), sizeof(zeros)));
+  EXPECT_EQ(0, memcmp(zeros, a.ToString().data(), sizeof(zeros)));
 
   // We shouldn't allow ∞ to be imported.
   EXPECT_FALSE(a.SetFromString(std::string(zeros, sizeof(zeros))));
diff --git a/src/crypto/rsa_private_key_unittest.cc b/src/crypto/rsa_private_key_unittest.cc
index 27e8419..4af496a 100644
--- a/src/crypto/rsa_private_key_unittest.cc
+++ b/src/crypto/rsa_private_key_unittest.cc
@@ -107,10 +107,10 @@
 
   ASSERT_EQ(privkey1.size(), privkey3.size());
   ASSERT_EQ(privkey2.size(), privkey4.size());
-  ASSERT_EQ(0, SbMemoryCompare(&privkey1.front(), &privkey3.front(),
-                               privkey1.size()));
-  ASSERT_EQ(0, SbMemoryCompare(&privkey2.front(), &privkey4.front(),
-                               privkey2.size()));
+  ASSERT_EQ(0, memcmp(&privkey1.front(), &privkey3.front(),
+                      privkey1.size()));
+  ASSERT_EQ(0, memcmp(&privkey2.front(), &privkey4.front(),
+                      privkey2.size()));
 }
 
 // Test Copy() method.
@@ -199,8 +199,8 @@
   std::vector<uint8_t> output;
   ASSERT_TRUE(key->ExportPublicKey(&output));
 
-  ASSERT_EQ(0, SbMemoryCompare(expected_public_key_info, &output.front(),
-                               output.size()));
+  ASSERT_EQ(0, memcmp(expected_public_key_info, &output.front(),
+                      output.size()));
 }
 
 // These two test keys each contain an integer that has 0x00 for its most
@@ -334,9 +334,9 @@
   input1.resize(sizeof(short_integer_with_high_bit));
   input2.resize(sizeof(short_integer_without_high_bit));
 
-  SbMemoryCopy(&input1.front(), short_integer_with_high_bit,
+  memcpy(&input1.front(), short_integer_with_high_bit,
                sizeof(short_integer_with_high_bit));
-  SbMemoryCopy(&input2.front(), short_integer_without_high_bit,
+  memcpy(&input2.front(), short_integer_without_high_bit,
                sizeof(short_integer_without_high_bit));
 
   std::unique_ptr<crypto::RSAPrivateKey> keypair1(
@@ -354,9 +354,9 @@
   ASSERT_EQ(input1.size(), output1.size());
   ASSERT_EQ(input2.size(), output2.size());
   ASSERT_EQ(0,
-            SbMemoryCompare(&output1.front(), &input1.front(), input1.size()));
+            memcmp(&output1.front(), &input1.front(), input1.size()));
   ASSERT_EQ(0,
-            SbMemoryCompare(&output2.front(), &input2.front(), input2.size()));
+            memcmp(&output2.front(), &input2.front(), input2.size()));
 }
 
 TEST(RSAPrivateKeyUnitTest, CreateFromKeyTest) {
diff --git a/src/crypto/secure_hash.cc b/src/crypto/secure_hash.cc
index 18d058a..edc36e9 100644
--- a/src/crypto/secure_hash.cc
+++ b/src/crypto/secure_hash.cc
@@ -24,7 +24,7 @@
   }
 
   SecureHashSHA256(const SecureHashSHA256& other) {
-    SbMemoryCopy(&ctx_, &other.ctx_, sizeof(ctx_));
+    memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
   }
 
   ~SecureHashSHA256() override {
diff --git a/src/crypto/secure_hash_unittest.cc b/src/crypto/secure_hash_unittest.cc
index cf37b9c..effff7a 100644
--- a/src/crypto/secure_hash_unittest.cc
+++ b/src/crypto/secure_hash_unittest.cc
@@ -65,14 +65,14 @@
   ctx2->Update(input2.data(), input2.size());
   ctx2->Finish(output2, sizeof(output2));
 
-  EXPECT_EQ(0, SbMemoryCompare(output1, output2, crypto::kSHA256Length));
-  EXPECT_EQ(0, SbMemoryCompare(output1, kExpectedHashOfInput1And2,
-                               crypto::kSHA256Length));
+  EXPECT_EQ(0, memcmp(output1, output2, crypto::kSHA256Length));
+  EXPECT_EQ(0, memcmp(output1, kExpectedHashOfInput1And2,
+                      crypto::kSHA256Length));
 
   // Finish() ctx3, which should produce the hash of input1.
   ctx3->Finish(&output3, sizeof(output3));
-  EXPECT_EQ(0, SbMemoryCompare(output3, kExpectedHashOfInput1,
-                               crypto::kSHA256Length));
+  EXPECT_EQ(0, memcmp(output3, kExpectedHashOfInput1,
+                      crypto::kSHA256Length));
 }
 
 TEST(SecureHashTest, TestLength) {
@@ -103,5 +103,5 @@
   ctx2->Finish(output2, sizeof(output2));
 
   // The hash should be the same.
-  EXPECT_EQ(0, SbMemoryCompare(output1, output2, crypto::kSHA256Length));
+  EXPECT_EQ(0, memcmp(output1, output2, crypto::kSHA256Length));
 }
diff --git a/src/crypto/signature_verifier_unittest.cc b/src/crypto/signature_verifier_unittest.cc
index 58d5d3a..93e8c4d 100644
--- a/src/crypto/signature_verifier_unittest.cc
+++ b/src/crypto/signature_verifier_unittest.cc
@@ -207,7 +207,7 @@
 
   // Test 3: verify the signature with incorrect data.
   uint8_t bad_tbs_certificate[sizeof(tbs_certificate)];
-  SbMemoryCopy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate));
+  memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate));
   bad_tbs_certificate[10] += 1;  // Corrupt one byte of the data.
   EXPECT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
                                   signature, public_key_info));
@@ -216,7 +216,7 @@
 
   // Test 4: verify a bad signature.
   uint8_t bad_signature[sizeof(signature)];
-  SbMemoryCopy(bad_signature, signature, sizeof(signature));
+  memcpy(bad_signature, signature, sizeof(signature));
   bad_signature[10] += 1;  // Corrupt one byte of the signature.
   EXPECT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
                                   bad_signature, public_key_info));
@@ -225,15 +225,15 @@
 
   // Test 5: import an invalid key.
   uint8_t bad_public_key_info[sizeof(public_key_info)];
-  SbMemoryCopy(bad_public_key_info, public_key_info, sizeof(public_key_info));
+  memcpy(bad_public_key_info, public_key_info, sizeof(public_key_info));
   bad_public_key_info[0] += 1;  // Corrupt part of the SPKI syntax.
   EXPECT_FALSE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
                                    signature, bad_public_key_info));
 
   // Test 6: import a key with extra data.
   uint8_t long_public_key_info[sizeof(public_key_info) + 5];
-  SbMemorySet(long_public_key_info, 0, sizeof(long_public_key_info));
-  SbMemoryCopy(long_public_key_info, public_key_info, sizeof(public_key_info));
+  memset(long_public_key_info, 0, sizeof(long_public_key_info));
+  memcpy(long_public_key_info, public_key_info, sizeof(public_key_info));
   EXPECT_FALSE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
                                    signature, long_public_key_info));
 }
diff --git a/src/docker-compose.yml b/src/docker-compose.yml
index 794cdc0..743a169 100644
--- a/src/docker-compose.yml
+++ b/src/docker-compose.yml
@@ -142,31 +142,44 @@
       - build-base-xenial
     scale: 0
 
-  linux-x64x11-clang-3-6:
+  linux-x64x11-clang-3-9:
     <<: *common-definitions
     <<: *build-volumes
     build:
       context: ./docker/linux/
-      dockerfile: clang-3-6/Dockerfile
-    image: cobalt-build-linux-clang-3-6
+      dockerfile: clang-3-9/Dockerfile
+    image: cobalt-build-linux-clang-3-9
     environment:
       <<: *shared-build-env
-      PLATFORM: linux-x64x11-clang-3-6
+      PLATFORM: linux-x64x11-clang-3-9
       CONFIG: ${CONFIG:-debug}
     depends_on:
       - linux-x64x11-xenial
 
-  linux-x64x11-clang-3-6-prebuilt:
+  linux-x64x11-clang-3-9-prebuilt:
     <<: *common-definitions
     <<: *build-volumes
-    image: gcr.io/cobalt-tools/build-cobalt-linux-x64x11-clang-3-6:1.3
+    image: gcr.io/cobalt-tools/build-cobalt-linux-x64x11-clang-3-9:1.4
     environment:
       <<: *shared-build-env
-      PLATFORM: linux-x64x11-clang-3-6
+      PLATFORM: linux-x64x11-clang-3-9
       CONFIG: ${CONFIG:-debug}
       USE_CCACHE: ${USE_CCACHE:-1}
       NINJA_STATUS: ${NINJA_STATUS}
 
+  linux-x64x11-sbversion12-evergreen:
+    <<: *build-common-definitions
+    build:
+      context: ./docker/linux
+      dockerfile: linux-x64x11/Dockerfile
+      args:
+        - FROM_IMAGE=cobalt-build-evergreen
+    image: cobalt-build-linux-x64x11-evergreen
+    environment:
+      <<: *shared-build-env
+      PLATFORM: linux-x64x11-sbversion-12
+      CONFIG: ${CONFIG:-debug}
+
   # Define common build container for Android
   build-android:
     <<: *build-common-definitions
@@ -186,6 +199,20 @@
       PLATFORM: android-x86
       CONFIG: ${CONFIG:-debug}
 
+  android-x86-gn:
+    <<: *build-common-definitions
+    image: cobalt-build-android-gn
+    depends_on: [ android-x86 ]
+    build:
+      context: ./docker/linux/android
+      dockerfile: ./gn/Dockerfile
+    environment:
+      <<: *shared-build-env
+      IS_DOCKER: 1
+      PLATFORM: android-x86
+      CONFIG: ${CONFIG:-debug}
+      TARGET_CPU: ${TARGET_CPU:-x86}
+
   android-arm:
     <<: *build-common-definitions
     image: cobalt-build-android
@@ -196,6 +223,20 @@
       PLATFORM: android-arm
       CONFIG: ${CONFIG:-debug}
 
+  android-arm-gn:
+    <<: *build-common-definitions
+    image: cobalt-build-android-gn
+    depends_on: [ android-arm ]
+    build:
+      context: ./docker/linux/android
+      dockerfile: ./gn/Dockerfile
+    environment:
+      <<: *shared-build-env
+      IS_DOCKER: 1
+      PLATFORM: android-arm
+      CONFIG: ${CONFIG:-debug}
+      TARGET_CPU: ${TARGET_CPU:-arm}
+
   android-arm64:
     <<: *build-common-definitions
     image: cobalt-build-android
@@ -206,6 +247,20 @@
       PLATFORM: android-arm64
       CONFIG: ${CONFIG:-debug}
 
+  android-arm64-gn:
+    <<: *build-common-definitions
+    image: cobalt-build-android-gn
+    depends_on: [ android-arm64 ]
+    build:
+      context: ./docker/linux/android
+      dockerfile: ./gn/Dockerfile
+    environment:
+      <<: *shared-build-env
+      IS_DOCKER: 1
+      PLATFORM: android-arm64
+      CONFIG: ${CONFIG:-debug}
+      TARGET_CPU: ${TARGET_CPU:-arm64}
+
   raspi:
     <<: *build-common-definitions
     build:
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/docker/linux/android/gn/Dockerfile
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/docker/linux/android/gn/Dockerfile
index 97c4786..7c1eb41 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/docker/linux/android/gn/Dockerfile
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
+FROM cobalt-build-android
+
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" target_os=\"android\" target_cpu=\"${TARGET_CPU}\"" && \
+    ninja -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG}
diff --git a/src/docker/linux/clang-3-6/Dockerfile b/src/docker/linux/clang-3-9/Dockerfile
similarity index 94%
rename from src/docker/linux/clang-3-6/Dockerfile
rename to src/docker/linux/clang-3-9/Dockerfile
index d2aa15b..af62c51 100644
--- a/src/docker/linux/clang-3-6/Dockerfile
+++ b/src/docker/linux/clang-3-9/Dockerfile
@@ -17,7 +17,7 @@
 ARG DEBIAN_FRONTEND=noninteractive
 
 RUN apt update -qqy \
-    && apt install -qqy --no-install-recommends clang-3.6 \
+    && apt install -qqy --no-install-recommends clang-3.9 \
     && apt-get clean autoclean \
     && apt-get autoremove -y --purge \
     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
diff --git a/src/docker/linux/raspi/Dockerfile b/src/docker/linux/raspi/Dockerfile
index c05c2e8..e4f7f01 100644
--- a/src/docker/linux/raspi/Dockerfile
+++ b/src/docker/linux/raspi/Dockerfile
@@ -20,24 +20,27 @@
 # Required by the gyp build system.
 ENV RASPI_HOME=${raspi_home}
 
+# libxml2 and binutils* needed for evergreen
 RUN apt update -qqy \
     && apt install -qqy --no-install-recommends \
         g++-multilib \
         bzip2 \
+        libxml2 \
+        binutils-aarch64-linux-gnu \
+        binutils-arm-linux-gnueabi \
     && apt-get clean autoclean \
     && apt-get autoremove -y --purge \
     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
     && rm -rf /var/lib/{apt,dpkg,cache,log} \
     && echo "Done"
 
-# Get the combined toolchains package and trim the unneeded older versions
+# Get the combined toolchains package.
 RUN cd /tmp \
     && curl --silent -O -J \
     "https://storage.googleapis.com/cobalt-static-storage/${raspi_tools}" \
     && mkdir -p ${raspi_home} \
     && cd ${raspi_home} \
     && tar xjvf /tmp/${raspi_tools} \
-    && rm -rf sysroot tools/arm-bcm2708/arm-* tools/.git \
     && rm /tmp/${raspi_tools}
 
 CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} \
diff --git a/src/glimp/gles/context.cc b/src/glimp/gles/context.cc
index 991097b..5a5eb59 100644
--- a/src/glimp/gles/context.cc
+++ b/src/glimp/gles/context.cc
@@ -2089,7 +2089,7 @@
   SB_DCHECK(elem_size <= 4);
 
   VertexAttributeConstant* value = &const_vertex_attrib_map_[indx];
-  SbMemorySet(value, 0, sizeof(*value));
+  memset(value, 0, sizeof(*value));
   for (int i = 0; i < elem_size; ++i) {
     value->data[i] = values[i];
   }
diff --git a/src/glimp/gles/convert_pixel_data.cc b/src/glimp/gles/convert_pixel_data.cc
index f2ed107..dfa4ef1 100644
--- a/src/glimp/gles/convert_pixel_data.cc
+++ b/src/glimp/gles/convert_pixel_data.cc
@@ -34,11 +34,11 @@
                    int num_rows) {
   if (destination_pitch == source_pitch) {
     // If the pitches are equal, we can do the entire copy in one memcpy().
-    SbMemoryCopy(destination, source, destination_pitch * num_rows);
+    memcpy(destination, source, destination_pitch * num_rows);
   } else {
     // If the pitches are not equal, we must memcpy each row separately.
     for (int i = 0; i < num_rows; ++i) {
-      SbMemoryCopy(destination + i * destination_pitch,
+      memcpy(destination + i * destination_pitch,
                    source + i * source_pitch, bytes_per_row);
     }
   }
diff --git a/src/glimp/gles/program.cc b/src/glimp/gles/program.cc
index e57f6b0..d258120 100644
--- a/src/glimp/gles/program.cc
+++ b/src/glimp/gles/program.cc
@@ -104,7 +104,8 @@
 void Program::GetProgramInfoLog(GLsizei bufsize,
                                 GLsizei* length,
                                 GLchar* infolog) {
-  *length = SbStringCopy(infolog, link_results_.info_log.c_str(), bufsize);
+  *length = starboard::strlcpy(infolog, link_results_.info_log.c_str(),
+                               bufsize);
 }
 
 GLint Program::GetUniformLocation(const GLchar* name) {
@@ -209,7 +210,7 @@
     SbMemoryDeallocate(uniform->data);
     uniform->data = SbMemoryAllocate(DataSizeForType(count, elem_size, type));
   }
-  SbMemoryCopy(uniform->data, v, DataSizeForType(count, elem_size, type));
+  memcpy(uniform->data, v, DataSizeForType(count, elem_size, type));
 
   return GL_NO_ERROR;
 }
diff --git a/src/glimp/gles/shader.cc b/src/glimp/gles/shader.cc
index 5a4049f..fbb56fc 100644
--- a/src/glimp/gles/shader.cc
+++ b/src/glimp/gles/shader.cc
@@ -70,7 +70,8 @@
 void Shader::GetShaderInfoLog(GLsizei bufsize,
                               GLsizei* length,
                               GLchar* infolog) {
-  *length = SbStringCopy(infolog, compile_results_.info_log.c_str(), bufsize);
+  *length = starboard::strlcpy(infolog, compile_results_.info_log.c_str(),
+                               bufsize);
 }
 
 }  // namespace gles
diff --git a/src/nb/analytics/memory_tracker_impl.cc b/src/nb/analytics/memory_tracker_impl.cc
index 6b08eea..099663d 100644
--- a/src/nb/analytics/memory_tracker_impl.cc
+++ b/src/nb/analytics/memory_tracker_impl.cc
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-
 #include "nb/analytics/memory_tracker_impl.h"
 
 #include <algorithm>
diff --git a/src/nb/bit_cast.h b/src/nb/bit_cast.h
index 6dac6fb..af8cebe 100644
--- a/src/nb/bit_cast.h
+++ b/src/nb/bit_cast.h
@@ -1,21 +1,21 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/*
-* Modifications Copyright 2017 Google Inc. All Rights Reserved.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/*
+* Modifications Copyright 2017 Google Inc. All Rights Reserved.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
 */
 
 #ifndef NB_BIT_CAST_H_
@@ -69,7 +69,7 @@
   SB_COMPILE_ASSERT(sizeof(Dest) == sizeof(source),
                     Source_and_destination_types_should_have_equal_sizes);
   Dest dest;
-  SbMemoryCopy(&dest, &source, sizeof(dest));
+  memcpy(&dest, &source, sizeof(dest));
   return dest;
 }
 
diff --git a/src/nb/cpp14oncpp11.h b/src/nb/cpp14oncpp11.h
deleted file mode 100644
index 6a1fa0f..0000000
--- a/src/nb/cpp14oncpp11.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NB_CPP14ONCPP11_H_
-#define NB_CPP14ONCPP11_H_
-
-#include <memory>
-
-#include "starboard/configuration.h"
-
-#if defined(STARBOARD)
-
-#define CONSTEXPR constexpr
-#define CONSTEXPR_OR_INLINE constexpr
-#define STATIC_ASSERT(value, message) static_assert(value, message)
-#define CHECK14(expr) CHECK(expr)
-
-#endif  // defined(STARBOARD)
-
-#endif  // NB_CPP14ONCPP11_H_
diff --git a/src/nb/multipart_allocator.cc b/src/nb/multipart_allocator.cc
index 874a46d..648cac1 100644
--- a/src/nb/multipart_allocator.cc
+++ b/src/nb/multipart_allocator.cc
@@ -109,7 +109,7 @@
           std::min(size, buffer_sizes_[buffer_index] - destination_offset);
       uint8_t* destination_in_uint8 =
           static_cast<uint8_t*>(buffers_[buffer_index]);
-      SbMemoryCopy(destination_in_uint8 + destination_offset, src_in_uint8,
+      memcpy(destination_in_uint8 + destination_offset, src_in_uint8,
                    bytes_to_copy);
       destination_offset = 0;
       src_in_uint8 += bytes_to_copy;
@@ -123,7 +123,7 @@
   uint8_t* destination_in_uint8 = static_cast<uint8_t*>(destination);
 
   for (size_t i = 0; i < number_of_buffers_; ++i) {
-    SbMemoryCopy(destination_in_uint8, buffers_[i], buffer_sizes_[i]);
+    memcpy(destination_in_uint8, buffers_[i], buffer_sizes_[i]);
     destination_in_uint8 += buffer_sizes_[i];
   }
 }
@@ -150,8 +150,8 @@
   }
   buffers_ = new void*[number_of_buffers_];
   buffer_sizes_ = new int[number_of_buffers_];
-  SbMemoryCopy(buffers_, buffers, sizeof(*buffers_) * number_of_buffers_);
-  SbMemoryCopy(buffer_sizes_, buffer_sizes,
+  memcpy(buffers_, buffers, sizeof(*buffers_) * number_of_buffers_);
+  memcpy(buffer_sizes_, buffer_sizes,
                sizeof(*buffer_sizes_) * number_of_buffers_);
 }
 
diff --git a/src/nb/multipart_allocator_test.cc b/src/nb/multipart_allocator_test.cc
index 63931ed..5fcf08e 100644
--- a/src/nb/multipart_allocator_test.cc
+++ b/src/nb/multipart_allocator_test.cc
@@ -19,6 +19,7 @@
 #include <vector>
 
 #include "starboard/common/log.h"
+#include "starboard/common/memory.h"
 #include "starboard/configuration.h"
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -26,6 +27,8 @@
 namespace nb {
 namespace {
 
+using starboard::common::MemoryIsZero;
+
 TEST(MultipartAllocatorAllocationsTest, DefaultCtor) {
   MultipartAllocator::Allocations allocations;
   EXPECT_EQ(allocations.number_of_buffers(), 0);
@@ -158,24 +161,23 @@
   char source[kBufferSize];
 
   MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-  SbMemorySet(source, 'x', kBufferSize);
+  memset(source, 'x', kBufferSize);
 
-  SbMemorySet(buffer, 0, kBufferSize * 2);
+  memset(buffer, 0, kBufferSize * 2);
   allocations.Write(0, source, kBufferSize);
-  EXPECT_EQ(SbMemoryCompare(buffer, source, kBufferSize), 0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer + kBufferSize, kBufferSize));
+  EXPECT_EQ(memcmp(buffer, source, kBufferSize), 0);
+  EXPECT_TRUE(MemoryIsZero(buffer + kBufferSize, kBufferSize));
 
-  SbMemorySet(buffer, 0, kBufferSize * 2);
+  memset(buffer, 0, kBufferSize * 2);
   allocations.Write(kBufferSize / 2, source, kBufferSize / 2);
-  EXPECT_TRUE(SbMemoryIsZero(buffer, kBufferSize / 2));
-  EXPECT_EQ(SbMemoryCompare(buffer + kBufferSize / 2, source, kBufferSize / 2),
-            0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer + kBufferSize, kBufferSize));
+  EXPECT_TRUE(MemoryIsZero(buffer, kBufferSize / 2));
+  EXPECT_EQ(memcmp(buffer + kBufferSize / 2, source, kBufferSize / 2), 0);
+  EXPECT_TRUE(MemoryIsZero(buffer + kBufferSize, kBufferSize));
 
-  SbMemorySet(buffer, 0, kBufferSize * 2);
+  memset(buffer, 0, kBufferSize * 2);
   allocations.Write(kBufferSize, source, 0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer, kBufferSize * 2));
-  EXPECT_TRUE(SbMemoryIsZero(buffer + kBufferSize, kBufferSize));
+  EXPECT_TRUE(MemoryIsZero(buffer, kBufferSize * 2));
+  EXPECT_TRUE(MemoryIsZero(buffer + kBufferSize, kBufferSize));
 }
 
 TEST(MultipartAllocatorAllocationsTest, SingleBufferRead) {
@@ -185,11 +187,11 @@
 
   MultipartAllocator::Allocations allocations(buffer, kBufferSize);
 
-  SbMemorySet(buffer, 'x', kBufferSize);
-  SbMemorySet(destination, 0, kBufferSize * 2);
+  memset(buffer, 'x', kBufferSize);
+  memset(destination, 0, kBufferSize * 2);
   allocations.Read(destination);
-  EXPECT_EQ(SbMemoryCompare(buffer, destination, kBufferSize), 0);
-  EXPECT_TRUE(SbMemoryIsZero(destination + kBufferSize, kBufferSize));
+  EXPECT_EQ(memcmp(buffer, destination, kBufferSize), 0);
+  EXPECT_TRUE(MemoryIsZero(destination + kBufferSize, kBufferSize));
 }
 
 TEST(MultipartAllocatorAllocationsTest, MultipleBuffers) {
@@ -263,36 +265,35 @@
 
   MultipartAllocator::Allocations allocations(
       static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-  SbMemorySet(source, 'x', kBufferSize0 + kBufferSize1);
+  memset(source, 'x', kBufferSize0 + kBufferSize1);
 
-  SbMemorySet(buffer0, 0, kBufferSize0);
-  SbMemorySet(buffer1, 0, kBufferSize1 * 2);
+  memset(buffer0, 0, kBufferSize0);
+  memset(buffer1, 0, kBufferSize1 * 2);
   allocations.Write(0, source, kBufferSize0 + kBufferSize1);
-  EXPECT_EQ(SbMemoryCompare(buffer0, source, kBufferSize0), 0);
-  EXPECT_EQ(SbMemoryCompare(buffer1, source, kBufferSize1), 0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
+  EXPECT_EQ(memcmp(buffer0, source, kBufferSize0), 0);
+  EXPECT_EQ(memcmp(buffer1, source, kBufferSize1), 0);
+  EXPECT_TRUE(MemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
 
-  SbMemorySet(buffer0, 0, kBufferSize0);
-  SbMemorySet(buffer1, 0, kBufferSize1 * 2);
+  memset(buffer0, 0, kBufferSize0);
+  memset(buffer1, 0, kBufferSize1 * 2);
   allocations.Write(kBufferSize0 / 2, source, kBufferSize0 / 2 + kBufferSize1);
-  EXPECT_TRUE(SbMemoryIsZero(buffer0, kBufferSize0 / 2));
-  EXPECT_EQ(
-      SbMemoryCompare(buffer0 + kBufferSize0 / 2, source, kBufferSize0 / 2), 0);
-  EXPECT_EQ(SbMemoryCompare(buffer1, source, kBufferSize1), 0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
+  EXPECT_TRUE(MemoryIsZero(buffer0, kBufferSize0 / 2));
+  EXPECT_EQ(memcmp(buffer0 + kBufferSize0 / 2, source, kBufferSize0 / 2), 0);
+  EXPECT_EQ(memcmp(buffer1, source, kBufferSize1), 0);
+  EXPECT_TRUE(MemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
 
-  SbMemorySet(buffer0, 0, kBufferSize0);
-  SbMemorySet(buffer1, 0, kBufferSize1 * 2);
+  memset(buffer0, 0, kBufferSize0);
+  memset(buffer1, 0, kBufferSize1 * 2);
   allocations.Write(kBufferSize0, source, kBufferSize1);
-  EXPECT_TRUE(SbMemoryIsZero(buffer0, kBufferSize0));
-  EXPECT_EQ(SbMemoryCompare(buffer1, source, kBufferSize1), 0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
+  EXPECT_TRUE(MemoryIsZero(buffer0, kBufferSize0));
+  EXPECT_EQ(memcmp(buffer1, source, kBufferSize1), 0);
+  EXPECT_TRUE(MemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
 
-  SbMemorySet(buffer0, 0, kBufferSize0);
-  SbMemorySet(buffer1, 0, kBufferSize1 * 2);
+  memset(buffer0, 0, kBufferSize0);
+  memset(buffer1, 0, kBufferSize1 * 2);
   allocations.Write(kBufferSize0 + kBufferSize1, source, 0);
-  EXPECT_TRUE(SbMemoryIsZero(buffer0, kBufferSize0));
-  EXPECT_TRUE(SbMemoryIsZero(buffer1, kBufferSize1 * 2));
+  EXPECT_TRUE(MemoryIsZero(buffer0, kBufferSize0));
+  EXPECT_TRUE(MemoryIsZero(buffer1, kBufferSize1 * 2));
 }
 
 TEST(MultipartAllocatorAllocationsTest, MultipleBuffersRead) {
@@ -308,15 +309,14 @@
   MultipartAllocator::Allocations allocations(
       static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
 
-  SbMemorySet(buffer0, 'x', kBufferSize0);
-  SbMemorySet(buffer1, 'y', kBufferSize1);
-  SbMemorySet(destination, 0, kBufferSize0 + kBufferSize1 * 2);
+  memset(buffer0, 'x', kBufferSize0);
+  memset(buffer1, 'y', kBufferSize1);
+  memset(destination, 0, kBufferSize0 + kBufferSize1 * 2);
   allocations.Read(destination);
-  EXPECT_EQ(SbMemoryCompare(buffer0, destination, kBufferSize0), 0);
-  EXPECT_EQ(SbMemoryCompare(buffer1, destination + kBufferSize0, kBufferSize1),
-            0);
+  EXPECT_EQ(memcmp(buffer0, destination, kBufferSize0), 0);
+  EXPECT_EQ(memcmp(buffer1, destination + kBufferSize0, kBufferSize1), 0);
   EXPECT_TRUE(
-      SbMemoryIsZero(destination + kBufferSize0 + kBufferSize1, kBufferSize1));
+      MemoryIsZero(destination + kBufferSize0 + kBufferSize1, kBufferSize1));
 }
 
 }  // namespace
diff --git a/src/nb/nb.gyp b/src/nb/nb.gyp
index 6078f07..7f266b1 100644
--- a/src/nb/nb.gyp
+++ b/src/nb/nb.gyp
@@ -50,7 +50,6 @@
             'bidirectional_fit_reuse_allocator.cc',
             'concurrent_map.h',
             'concurrent_ptr.h',
-            'cpp14oncpp11.h',
             'first_fit_reuse_allocator.h',
             'first_fit_reuse_allocator.cc',
             'fixed_no_free_allocator.cc',
diff --git a/src/nb/simple_profiler.cc b/src/nb/simple_profiler.cc
index a8b160e..46e906e 100644
--- a/src/nb/simple_profiler.cc
+++ b/src/nb/simple_profiler.cc
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-
 #include <algorithm>
 #include <string>
 #include <vector>
diff --git a/src/nb/string_interner.cc b/src/nb/string_interner.cc
index d3f1f78..279d1b1 100644
--- a/src/nb/string_interner.cc
+++ b/src/nb/string_interner.cc
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-
 #include "nb/hash.h"
 #include "nb/string_interner.h"
 #include "starboard/client_porting/poem/string_poem.h"
@@ -99,7 +97,7 @@
 }
 
 const std::string& ConcurrentStringInterner::Intern(const char* c_string) {
-  return GetBucket(c_string, SbStringGetLength(c_string)).Intern(c_string);
+  return GetBucket(c_string, strlen(c_string)).Intern(c_string);
 }
 
 const std::string* ConcurrentStringInterner::Get(const std::string& str) const {
@@ -107,7 +105,7 @@
 }
 
 const std::string* ConcurrentStringInterner::Get(const char* c_string) const {
-  return GetBucket(c_string, SbStringGetLength(c_string)).Get(c_string);
+  return GetBucket(c_string, strlen(c_string)).Get(c_string);
 }
 
 size_t ConcurrentStringInterner::Size() const {
diff --git a/src/net/base/address_list_unittest.cc b/src/net/base/address_list_unittest.cc
index ca8dc1a..42251fd 100644
--- a/src/net/base/address_list_unittest.cc
+++ b/src/net/base/address_list_unittest.cc
@@ -26,11 +26,11 @@
   struct sockaddr_in address;
   // The contents of address do not matter for this test,
   // so just zero-ing them out for consistency.
-  SbMemorySet(&address, 0x0, sizeof(address));
+  memset(&address, 0x0, sizeof(address));
   // But we need to set the family.
   address.sin_family = AF_INET;
   struct addrinfo ai;
-  SbMemorySet(&ai, 0x0, sizeof(ai));
+  memset(&ai, 0x0, sizeof(ai));
   ai.ai_family = AF_INET;
   ai.ai_socktype = SOCK_STREAM;
   ai.ai_addrlen = sizeof(address);
@@ -57,11 +57,11 @@
         reinterpret_cast<struct sockaddr_in*>(storage[i].addr);
     storage[i].addr_len = sizeof(struct sockaddr_in);
     // Populating the address with { i, i, i, i }.
-    SbMemorySet(&addr->sin_addr, i, IPAddress::kIPv4AddressSize);
+    memset(&addr->sin_addr, i, IPAddress::kIPv4AddressSize);
     addr->sin_family = AF_INET;
     // Set port to i << 2;
     addr->sin_port = base::HostToNet16(static_cast<uint16_t>(i << 2));
-    SbMemorySet(&ai[i], 0x0, sizeof(ai[i]));
+    memset(&ai[i], 0x0, sizeof(ai[i]));
     ai[i].ai_family = addr->sin_family;
     ai[i].ai_socktype = SOCK_STREAM;
     ai[i].ai_addrlen = storage[i].addr_len;
diff --git a/src/net/base/address_tracker_linux.cc b/src/net/base/address_tracker_linux.cc
index 634886b..66e9299 100644
--- a/src/net/base/address_tracker_linux.cc
+++ b/src/net/base/address_tracker_linux.cc
@@ -103,7 +103,7 @@
 
 // static
 char* AddressTrackerLinux::GetInterfaceName(int interface_index, char* buf) {
-  SbMemorySet(buf, 0, IFNAMSIZ);
+  memset(buf, 0, IFNAMSIZ);
   base::ScopedFD ioctl_socket = GetSocketForIoctl();
   if (!ioctl_socket.is_valid())
     return buf;
@@ -112,7 +112,7 @@
   ifr.ifr_ifindex = interface_index;
 
   if (ioctl(ioctl_socket.get(), SIOCGIFNAME, &ifr) == 0)
-    SbStringCopy(buf, ifr.ifr_name, IFNAMSIZ - 1);
+    strncpy(buf, ifr.ifr_name, IFNAMSIZ - 1);
   return buf;
 }
 
@@ -366,7 +366,7 @@
           if (it == address_map_.end()) {
             address_map_.insert(it, std::make_pair(address, *msg));
             *address_changed = true;
-          } else if (SbMemoryCompare(&it->second, msg, sizeof(*msg))) {
+          } else if (memcmp(&it->second, msg, sizeof(*msg))) {
             it->second = *msg;
             *address_changed = true;
           }
diff --git a/src/net/base/arena.cc b/src/net/base/arena.cc
index 33a1d5f..14f9043 100644
--- a/src/net/base/arena.cc
+++ b/src/net/base/arena.cc
@@ -46,13 +46,13 @@
     }
   }
   char* out = Alloc(newsize);
-  SbMemoryCopy(out, original, oldsize);
+  memcpy(out, original, oldsize);
   return out;
 }
 
 char* UnsafeArena::Memdup(const char* data, size_t size) {
   char* out = Alloc(size);
-  SbMemoryCopy(out, data, size);
+  memcpy(out, data, size);
   return out;
 }
 
diff --git a/src/net/base/arena_unittest.cc b/src/net/base/arena_unittest.cc
index fb08808..2419627 100644
--- a/src/net/base/arena_unittest.cc
+++ b/src/net/base/arena_unittest.cc
@@ -21,7 +21,7 @@
 
 TEST(UnsafeArenaTest, Memdup) {
   UnsafeArena arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c = arena.Memdup(kTestString, length);
   EXPECT_NE(nullptr, c);
   EXPECT_NE(c, kTestString);
@@ -30,7 +30,7 @@
 
 TEST(UnsafeArenaTest, MemdupLargeString) {
   UnsafeArena arena(10 /* block size */);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c = arena.Memdup(kTestString, length);
   EXPECT_NE(nullptr, c);
   EXPECT_NE(c, kTestString);
@@ -55,7 +55,7 @@
 
 TEST(UnsafeArenaTest, UseAfterReset) {
   UnsafeArena arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c = arena.Memdup(kTestString, length);
   arena.Reset();
   c = arena.Memdup(kTestString, length);
@@ -66,7 +66,7 @@
 
 TEST(UnsafeArenaTest, Free) {
   UnsafeArena arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   // Freeing memory not owned by the arena should be a no-op, and freeing
   // before any allocations from the arena should be a no-op.
   arena.Free(const_cast<char*>(kTestString), length);
@@ -92,7 +92,7 @@
 
 TEST(UnsafeArenaTest, Alloc) {
   UnsafeArena arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c1 = arena.Alloc(length);
   char* c2 = arena.Alloc(2 * length);
   char* c3 = arena.Alloc(3 * length);
@@ -105,7 +105,7 @@
 
 TEST(UnsafeArenaTest, Realloc) {
   UnsafeArena arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   // Simple realloc that fits in the block.
   char* c1 = arena.Memdup(kTestString, length);
   char* c2 = arena.Realloc(c1, length, 2 * length);
diff --git a/src/net/base/chunked_upload_data_stream.cc b/src/net/base/chunked_upload_data_stream.cc
index 8a93dea..d39be19 100644
--- a/src/net/base/chunked_upload_data_stream.cc
+++ b/src/net/base/chunked_upload_data_stream.cc
@@ -101,7 +101,7 @@
     size_t bytes_to_read =
         std::min(static_cast<size_t>(buf_len - bytes_read),
                  data->size() - read_offset_);
-    SbMemoryCopy(buf->data() + bytes_read, data->data() + read_offset_,
+    memcpy(buf->data() + bytes_read, data->data() + read_offset_,
                  bytes_to_read);
     bytes_read += bytes_to_read;
     read_offset_ += bytes_to_read;
diff --git a/src/net/base/data_url.cc b/src/net/base/data_url.cc
index b221b83..df1f28f 100644
--- a/src/net/base/data_url.cc
+++ b/src/net/base/data_url.cc
@@ -13,7 +13,6 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "nb/cpp14oncpp11.h"
 #include "net/base/escape.h"
 #include "net/base/mime_util.h"
 #include "net/http/http_util.h"
@@ -53,8 +52,8 @@
     ++iter;
   }
 
-  static CONSTEXPR base::StringPiece kBase64Tag("base64");
-  static CONSTEXPR base::StringPiece kCharsetTag("charset=");
+  static constexpr base::StringPiece kBase64Tag("base64");
+  static constexpr base::StringPiece kCharsetTag("charset=");
 
   bool base64_encoded = false;
   for (; iter != meta_data.cend(); ++iter) {
diff --git a/src/net/base/datagram_buffer.cc b/src/net/base/datagram_buffer.cc
index b73b0e8..4520faf 100644
--- a/src/net/base/datagram_buffer.cc
+++ b/src/net/base/datagram_buffer.cc
@@ -48,7 +48,7 @@
 
 void DatagramBuffer::Set(const char* buffer, size_t buf_len) {
   length_ = buf_len;
-  SbMemoryCopy(data_.get(), buffer, buf_len);
+  memcpy(data_.get(), buffer, buf_len);
 }
 
 char* DatagramBuffer::data() const {
diff --git a/src/net/base/datagram_buffer_unittest.cc b/src/net/base/datagram_buffer_unittest.cc
index 91a25fe..5f4d684 100644
--- a/src/net/base/datagram_buffer_unittest.cc
+++ b/src/net/base/datagram_buffer_unittest.cc
@@ -25,7 +25,7 @@
   pool_.Enqueue(data, sizeof(data), &buffers);
   EXPECT_EQ(sizeof(data), buffers.front()->length());
   EXPECT_NE(data, buffers.front()->data());
-  EXPECT_EQ(0, SbMemoryCompare(data, buffers.front()->data(), sizeof(data)));
+  EXPECT_EQ(0, memcmp(data, buffers.front()->data(), sizeof(data)));
 }
 
 TEST_F(DatagramBufferTest, DatgramBufferPoolRecycles) {
diff --git a/src/net/base/escape.cc b/src/net/base/escape.cc
index 3304ed0..ecf4017 100644
--- a/src/net/base/escape.cc
+++ b/src/net/base/escape.cc
@@ -4,7 +4,6 @@
 
 #include "net/base/escape.h"
 
-#include "nb/cpp14oncpp11.h"
 
 #include "base/logging.h"
 #include "base/stl_util.h"
@@ -329,7 +328,7 @@
 // Convert a character |c| to a form that will not be mistaken as HTML.
 template <class str>
 void AppendEscapedCharForHTMLImpl(typename str::value_type c, str* output) {
-  static CONSTEXPR struct {
+  static constexpr struct {
     char key;
     base::StringPiece replacement;
   } kCharsToEscape[] = {
diff --git a/src/net/base/file_stream_unittest.cc b/src/net/base/file_stream_unittest.cc
index facc93e..dda0979 100644
--- a/src/net/base/file_stream_unittest.cc
+++ b/src/net/base/file_stream_unittest.cc
@@ -51,7 +51,7 @@
 scoped_refptr<IOBufferWithSize> CreateTestDataBuffer() {
   scoped_refptr<IOBufferWithSize> buf =
       base::MakeRefCounted<IOBufferWithSize>(kTestDataSize);
-  SbMemoryCopy(buf->data(), kTestData, kTestDataSize);
+  memcpy(buf->data(), kTestData, kTestDataSize);
   return buf;
 }
 
@@ -138,7 +138,7 @@
       base::MakeRefCounted<IOBufferWithSize>(kTestDataSize);
   rv = read_stream->Read(read_buffer.get(), kTestDataSize, callback.callback());
   ASSERT_EQ(kTestDataSize, callback.GetResult(rv));
-  ASSERT_EQ(0, SbMemoryCompare(kTestData, read_buffer->data(), kTestDataSize));
+  ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize));
   read_stream.reset();
 
   // 2. Test writing with a file handle.
@@ -162,7 +162,7 @@
   ASSERT_EQ(kTestDataSize,
             base::ReadFile(temp_file_path(), read_buffer->data(),
                            kTestDataSize));
-  ASSERT_EQ(0, SbMemoryCompare(kTestData, read_buffer->data(), kTestDataSize));
+  ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize));
 }
 
 TEST_F(FileStreamTest, UseClosedStream) {
diff --git a/src/net/base/hash_value.cc b/src/net/base/hash_value.cc
index 8f53c18..dd829c1 100644
--- a/src/net/base/hash_value.cc
+++ b/src/net/base/hash_value.cc
@@ -25,12 +25,12 @@
 struct SHA256ToHashValueComparator {
   bool operator()(const SHA256HashValue& lhs, const HashValue& rhs) const {
     DCHECK_EQ(HASH_VALUE_SHA256, rhs.tag());
-    return SbMemoryCompare(lhs.data, rhs.data(), rhs.size()) < 0;
+    return memcmp(lhs.data, rhs.data(), rhs.size()) < 0;
   }
 
   bool operator()(const HashValue& lhs, const SHA256HashValue& rhs) const {
     DCHECK_EQ(HASH_VALUE_SHA256, lhs.tag());
-    return SbMemoryCompare(lhs.data(), rhs.data, lhs.size()) < 0;
+    return memcmp(lhs.data(), rhs.data, lhs.size()) < 0;
   }
 };
 
@@ -55,7 +55,7 @@
   if (!base::Base64Decode(base64_str, &decoded) || decoded.size() != size())
     return false;
 
-  SbMemoryCopy(data(), decoded.data(), size());
+  memcpy(data(), decoded.data(), size());
   return true;
 }
 
diff --git a/src/net/base/hash_value.h b/src/net/base/hash_value.h
index 6633343..6ab6bb9 100644
--- a/src/net/base/hash_value.h
+++ b/src/net/base/hash_value.h
@@ -28,27 +28,27 @@
 };
 
 inline bool operator==(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
-  return SbMemoryCompare(lhs.data, rhs.data, sizeof(lhs.data)) == 0;
+  return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) == 0;
 }
 
 inline bool operator!=(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
-  return SbMemoryCompare(lhs.data, rhs.data, sizeof(lhs.data)) != 0;
+  return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) != 0;
 }
 
 inline bool operator<(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
-  return SbMemoryCompare(lhs.data, rhs.data, sizeof(lhs.data)) < 0;
+  return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) < 0;
 }
 
 inline bool operator>(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
-  return SbMemoryCompare(lhs.data, rhs.data, sizeof(lhs.data)) > 0;
+  return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) > 0;
 }
 
 inline bool operator<=(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
-  return SbMemoryCompare(lhs.data, rhs.data, sizeof(lhs.data)) <= 0;
+  return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) <= 0;
 }
 
 inline bool operator>=(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
-  return SbMemoryCompare(lhs.data, rhs.data, sizeof(lhs.data)) >= 0;
+  return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) >= 0;
 }
 
 enum HashValueTag {
diff --git a/src/net/base/ip_endpoint.cc b/src/net/base/ip_endpoint.cc
index 076d49c..0ac4bc8 100644
--- a/src/net/base/ip_endpoint.cc
+++ b/src/net/base/ip_endpoint.cc
@@ -157,16 +157,16 @@
 bool IPEndPoint::ToSbSocketAddress(SbSocketAddress* out_address) const {
   DCHECK(out_address);
   out_address->port = port_;
-  SbMemorySet(out_address->address, 0, sizeof(out_address->address));
+  memset(out_address->address, 0, sizeof(out_address->address));
   switch (GetFamily()) {
     case ADDRESS_FAMILY_IPV4:
       out_address->type = kSbSocketAddressTypeIpv4;
-      SbMemoryCopy(&out_address->address, address_.bytes().data(),
+      memcpy(&out_address->address, address_.bytes().data(),
                    IPAddress::kIPv4AddressSize);
       break;
     case ADDRESS_FAMILY_IPV6:
       out_address->type = kSbSocketAddressTypeIpv6;
-      SbMemoryCopy(&out_address->address, address_.bytes().data(),
+      memcpy(&out_address->address, address_.bytes().data(),
                    IPAddress::kIPv6AddressSize);
       break;
     default:
@@ -202,10 +202,10 @@
         return false;
       *address_length = kSockaddrInSize;
       struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(address);
-      SbMemorySet(addr, 0, sizeof(struct sockaddr_in));
+      memset(addr, 0, sizeof(struct sockaddr_in));
       addr->sin_family = AF_INET;
       addr->sin_port = base::HostToNet16(port_);
-      SbMemoryCopy(&addr->sin_addr, address_.bytes().data(),
+      memcpy(&addr->sin_addr, address_.bytes().data(),
                    IPAddress::kIPv4AddressSize);
       break;
     }
@@ -215,10 +215,10 @@
       *address_length = kSockaddrIn6Size;
       struct sockaddr_in6* addr6 =
           reinterpret_cast<struct sockaddr_in6*>(address);
-      SbMemorySet(addr6, 0, sizeof(struct sockaddr_in6));
+      memset(addr6, 0, sizeof(struct sockaddr_in6));
       addr6->sin6_family = AF_INET6;
       addr6->sin6_port = base::HostToNet16(port_);
-      SbMemoryCopy(&addr6->sin6_addr, address_.bytes().data(),
+      memcpy(&addr6->sin6_addr, address_.bytes().data(),
                    IPAddress::kIPv6AddressSize);
       break;
     }
diff --git a/src/net/base/ip_endpoint_unittest.cc b/src/net/base/ip_endpoint_unittest.cc
index 17c1d00..3246cea 100644
--- a/src/net/base/ip_endpoint_unittest.cc
+++ b/src/net/base/ip_endpoint_unittest.cc
@@ -149,7 +149,7 @@
 
 TEST_F(IPEndPointTest, FromSockAddrBufTooSmall) {
   struct sockaddr_in addr;
-  SbMemorySet(&addr, 0, sizeof(addr));
+  memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
   IPEndPoint ip_endpoint;
   struct sockaddr* sockaddr = reinterpret_cast<struct sockaddr*>(&addr);
diff --git a/src/net/base/lookup_string_in_fixed_set_unittest.cc b/src/net/base/lookup_string_in_fixed_set_unittest.cc
index c4cb53f..ab11530 100644
--- a/src/net/base/lookup_string_in_fixed_set_unittest.cc
+++ b/src/net/base/lookup_string_in_fixed_set_unittest.cc
@@ -53,7 +53,7 @@
  protected:
   template <size_t N>
   int LookupInGraph(const unsigned char(&graph)[N], const char* key) {
-    return LookupStringInFixedSet(graph, N, key, SbStringGetLength(key));
+    return LookupStringInFixedSet(graph, N, key, strlen(key));
   }
 };
 
diff --git a/src/net/base/mime_sniffer.cc b/src/net/base/mime_sniffer.cc
index 75aa030..ecc0903 100644
--- a/src/net/base/mime_sniffer.cc
+++ b/src/net/base/mime_sniffer.cc
@@ -93,7 +93,6 @@
 #include "base/logging.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "nb/cpp14oncpp11.h"
 #include "starboard/common/string.h"
 #include "starboard/types.h"
 #include "url/gurl.h"
@@ -333,7 +332,7 @@
   if (magic_entry.is_string) {
     if (content_strlen >= len) {
       // Do a case-insensitive prefix comparison.
-      DCHECK_EQ(SbStringGetLength(magic_entry.magic), len);
+      DCHECK_EQ(strlen(magic_entry.magic), len);
       match = base::EqualsCaseInsensitiveASCII(magic_entry.magic,
                                                base::StringPiece(content, len));
     }
@@ -568,8 +567,8 @@
     if (!pos)
       return false;
 
-    static CONSTEXPR base::StringPiece kXmlPrefix("<?xml");
-    static CONSTEXPR base::StringPiece kDocTypePrefix("<!DOCTYPE");
+    static constexpr base::StringPiece kXmlPrefix("<?xml");
+    static constexpr base::StringPiece kDocTypePrefix("<!DOCTYPE");
 
     base::StringPiece current(pos, end - pos);
     if (base::EqualsCaseInsensitiveASCII(current.substr(0, kXmlPrefix.size()),
diff --git a/src/net/base/mime_sniffer_unittest.cc b/src/net/base/mime_sniffer_unittest.cc
index 89970fb..01a91b3 100644
--- a/src/net/base/mime_sniffer_unittest.cc
+++ b/src/net/base/mime_sniffer_unittest.cc
@@ -531,7 +531,7 @@
 
 TEST_P(MimeSnifferControlCodesEdgeCaseTest, EdgeCase) {
   const char* param = GetParam();
-  EXPECT_TRUE(LooksLikeBinary(param, SbStringGetLength(param)));
+  EXPECT_TRUE(LooksLikeBinary(param, strlen(param)));
 }
 
 INSTANTIATE_TEST_CASE_P(MimeSnifferControlCodesEdgeCaseTest,
diff --git a/src/net/base/mime_util.cc b/src/net/base/mime_util.cc
index c30af3c..24f82e6 100644
--- a/src/net/base/mime_util.cc
+++ b/src/net/base/mime_util.cc
@@ -21,7 +21,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 #include "net/base/mime_util.h"
 #include "net/base/platform_mime_util.h"
 #include "net/http/http_util.h"
@@ -231,7 +230,7 @@
       const char* extensions = mapping.extensions;
       const char* extension_end = strchr(extensions, ',');
       int len = extension_end ? extension_end - extensions
-                              : SbStringGetLength(extensions);
+                              : strlen(extensions);
       *result = StringToFilePathStringType(base::StringPiece(extensions, len));
       return true;
     }
@@ -636,7 +635,7 @@
 // following characters are legal for boundaries:  '()+_,-./:=?
 // However the following characters, though legal, cause some sites
 // to fail: (),./:=+
-CONSTEXPR base::StringPiece kMimeBoundaryCharacters(
+constexpr base::StringPiece kMimeBoundaryCharacters(
     "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
 
 // Size of mime multipart boundary.
diff --git a/src/net/base/mime_util_unittest.cc b/src/net/base/mime_util_unittest.cc
index 530f853..813df6c 100644
--- a/src/net/base/mime_util_unittest.cc
+++ b/src/net/base/mime_util_unittest.cc
@@ -267,7 +267,7 @@
       // Convert ASCII to FilePath::StringType.
       base::FilePath::StringType contained_result(
           test.contained_result,
-          test.contained_result + SbStringGetLength(test.contained_result));
+          test.contained_result + strlen(test.contained_result));
 
       bool found = base::ContainsValue(extensions, contained_result);
 
diff --git a/src/net/base/network_change_notifier_win.cc b/src/net/base/network_change_notifier_win.cc
index 4cb5f6a..382dcf3 100644
--- a/src/net/base/network_change_notifier_win.cc
+++ b/src/net/base/network_change_notifier_win.cc
@@ -63,7 +63,7 @@
       last_announced_offline_(last_computed_connection_type_ ==
                               CONNECTION_NONE),
       weak_factory_(this) {
-  SbMemorySet(&addr_overlapped_, 0, sizeof addr_overlapped_);
+  memset(&addr_overlapped_, 0, sizeof addr_overlapped_);
   addr_overlapped_.hEvent = WSACreateEvent();
 }
 
diff --git a/src/net/base/network_interfaces_getifaddrs.cc b/src/net/base/network_interfaces_getifaddrs.cc
index e202155..c88b428 100644
--- a/src/net/base/network_interfaces_getifaddrs.cc
+++ b/src/net/base/network_interfaces_getifaddrs.cc
@@ -97,8 +97,8 @@
 bool IPAttributesGetterMac::GetAddressAttributes(const ifaddrs* if_addr,
                                                  int* attributes) {
   struct in6_ifreq ifr = {};
-  SbStringCopy(ifr.ifr_name, if_addr->ifa_name, sizeof(ifr.ifr_name) - 1);
-  SbMemoryCopy(&ifr.ifr_ifru.ifru_addr, if_addr->ifa_addr,
+  strncpy(ifr.ifr_name, if_addr->ifa_name, sizeof(ifr.ifr_name) - 1);
+  memcpy(&ifr.ifr_ifru.ifru_addr, if_addr->ifa_addr,
                if_addr->ifa_addr->sa_len);
   int rv = ioctl(ioctl_socket_, SIOCGIFAFLAG_IN6, &ifr);
   if (rv >= 0) {
@@ -113,7 +113,7 @@
     return NetworkChangeNotifier::CONNECTION_UNKNOWN;
 
   struct ifmediareq ifmr = {};
-  SbStringCopy(ifmr.ifm_name, if_addr->ifa_name, sizeof(ifmr.ifm_name) - 1);
+  strncpy(ifmr.ifm_name, if_addr->ifa_name, sizeof(ifmr.ifm_name) - 1);
 
   if (ioctl(ioctl_socket_, SIOCGIFMEDIA, &ifmr) != -1) {
     if (ifmr.ifm_current & IFM_IEEE80211) {
diff --git a/src/net/base/network_interfaces_linux.cc b/src/net/base/network_interfaces_linux.cc
index 0b2af1e..6fd8d2e 100644
--- a/src/net/base/network_interfaces_linux.cc
+++ b/src/net/base/network_interfaces_linux.cc
@@ -84,7 +84,7 @@
 
   // Test wireless extensions for CONNECTION_WIFI
   struct iwreq pwrq = {};
-  SbStringCopy(pwrq.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
+  strncpy(pwrq.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
   if (ioctl(s.get(), SIOCGIWNAME, &pwrq) != -1)
     return NetworkChangeNotifier::CONNECTION_WIFI;
 
@@ -94,7 +94,7 @@
   ecmd.cmd = ETHTOOL_GSET;
   struct ifreq ifr = {};
   ifr.ifr_data = &ecmd;
-  SbStringCopy(ifr.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
+  strncpy(ifr.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
   if (ioctl(s.get(), SIOCETHTOOL, &ifr) != -1)
     return NetworkChangeNotifier::CONNECTION_ETHERNET;
 #endif  // !defined(OS_ANDROID)
@@ -107,7 +107,7 @@
   if (!ioctl_socket.is_valid())
     return std::string();
   struct iwreq wreq = {};
-  SbStringCopy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
+  strncpy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
 
   char ssid[IW_ESSID_MAX_SIZE + 1] = {0};
   wreq.u.essid.pointer = ssid;
diff --git a/src/net/base/network_interfaces_linux_unittest.cc b/src/net/base/network_interfaces_linux_unittest.cc
index c45fd8f..83e21c7 100644
--- a/src/net/base/network_interfaces_linux_unittest.cc
+++ b/src/net/base/network_interfaces_linux_unittest.cc
@@ -35,14 +35,14 @@
 
 char* GetInterfaceName(int interface_index, char* ifname) {
   static_assert(base::size(kIfnameEm1) < IF_NAMESIZE, "Invalid interface name");
-  SbMemoryCopy(ifname, kIfnameEm1, base::size(kIfnameEm1));
+  memcpy(ifname, kIfnameEm1, base::size(kIfnameEm1));
   return ifname;
 }
 
 char* GetInterfaceNameVM(int interface_index, char* ifname) {
   static_assert(base::size(kIfnameVmnet) < IF_NAMESIZE,
                 "Invalid interface name");
-  SbMemoryCopy(ifname, kIfnameVmnet, base::size(kIfnameVmnet));
+  memcpy(ifname, kIfnameVmnet, base::size(kIfnameVmnet));
   return ifname;
 }
 
diff --git a/src/net/base/sockaddr_storage.cc b/src/net/base/sockaddr_storage.cc
index b09d6f1..ceb07ad 100644
--- a/src/net/base/sockaddr_storage.cc
+++ b/src/net/base/sockaddr_storage.cc
@@ -18,13 +18,13 @@
 SockaddrStorage::SockaddrStorage(const SockaddrStorage& other)
     : addr_len(other.addr_len),
       addr(reinterpret_cast<struct sockaddr*>(&addr_storage)) {
-  SbMemoryCopy(addr, other.addr, addr_len);
+  memcpy(addr, other.addr, addr_len);
 }
 
 void SockaddrStorage::operator=(const SockaddrStorage& other) {
   addr_len = other.addr_len;
   // addr is already set to &this->addr_storage by default ctor.
-  SbMemoryCopy(addr, other.addr, addr_len);
+  memcpy(addr, other.addr, addr_len);
 }
 
 }  // namespace net
diff --git a/src/net/base/test_data_stream.cc b/src/net/base/test_data_stream.cc
index 7816b25..26959cb 100644
--- a/src/net/base/test_data_stream.cc
+++ b/src/net/base/test_data_stream.cc
@@ -16,7 +16,7 @@
   while (length) {
     AdvanceIndex();
     int bytes_to_copy = std::min(length, bytes_remaining_);
-    SbMemoryCopy(buffer, buffer_ptr_, bytes_to_copy);
+    memcpy(buffer, buffer_ptr_, bytes_to_copy);
     buffer += bytes_to_copy;
     Consume(bytes_to_copy);
     length -= bytes_to_copy;
@@ -27,7 +27,7 @@
   while (length) {
     AdvanceIndex();
     int bytes_to_compare = std::min(length, bytes_remaining_);
-    if (SbMemoryCompare(buffer, buffer_ptr_, bytes_to_compare))
+    if (memcmp(buffer, buffer_ptr_, bytes_to_compare))
       return false;
     Consume(bytes_to_compare);
     length -= bytes_to_compare;
diff --git a/src/net/base/upload_bytes_element_reader.cc b/src/net/base/upload_bytes_element_reader.cc
index 061e1d0..37e8b54 100644
--- a/src/net/base/upload_bytes_element_reader.cc
+++ b/src/net/base/upload_bytes_element_reader.cc
@@ -54,7 +54,7 @@
   // the address of an element in |bytes_| and that will throw an
   // exception if |bytes_| is an empty vector.
   if (num_bytes_to_read > 0)
-    SbMemoryCopy(buf->data(), bytes_ + offset_, num_bytes_to_read);
+    memcpy(buf->data(), bytes_ + offset_, num_bytes_to_read);
 
   offset_ += num_bytes_to_read;
   return num_bytes_to_read;
diff --git a/src/net/cert/cert_verify_proc.cc b/src/net/cert/cert_verify_proc.cc
index 623282b..a88f785 100644
--- a/src/net/cert/cert_verify_proc.cc
+++ b/src/net/cert/cert_verify_proc.cc
@@ -18,7 +18,6 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "crypto/sha2.h"
-#include "nb/cpp14oncpp11.h"
 #include "net/base/net_errors.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/base/url_util.h"
@@ -313,14 +312,14 @@
   bool operator()(const uint8_t(&lhs)[N], const HashValue& rhs) const {
     static_assert(N == crypto::kSHA256Length,
                   "Only SHA-256 hashes are supported");
-    return SbMemoryCompare(lhs, rhs.data(), crypto::kSHA256Length) < 0;
+    return memcmp(lhs, rhs.data(), crypto::kSHA256Length) < 0;
   }
 
   template <size_t N>
   bool operator()(const HashValue& lhs, const uint8_t(&rhs)[N]) const {
     static_assert(N == crypto::kSHA256Length,
                   "Only SHA-256 hashes are supported");
-    return SbMemoryCompare(lhs.data(), rhs, crypto::kSHA256Length) < 0;
+    return memcmp(lhs.data(), rhs, crypto::kSHA256Length) < 0;
   }
 };
 
@@ -645,9 +644,9 @@
   // The old certs had a lifetime of five years, so this can be removed April
   // 2nd, 2019.
   const base::StringPiece cn(cert->subject().common_name);
-  static CONSTEXPR base::StringPiece kCloudflareCNSuffix(".cloudflare.com");
+  static constexpr base::StringPiece kCloudflareCNSuffix(".cloudflare.com");
   // April 2nd, 2014 UTC, expressed as seconds since the Unix Epoch.
-  static CONSTEXPR base::TimeDelta kCloudflareEpoch =
+  static constexpr base::TimeDelta kCloudflareEpoch =
       base::TimeDelta::FromSeconds(1396396800);
 
   if (cn.ends_with(kCloudflareCNSuffix) &&
@@ -723,7 +722,7 @@
     const std::string& common_name,
     const std::vector<std::string>& dns_names,
     const std::vector<std::string>& ip_addrs) {
-  static CONSTEXPR base::StringPiece kDomainsANSSI[] = {
+  static constexpr base::StringPiece kDomainsANSSI[] = {
       ".fr",  // France
       ".gp",  // Guadeloupe
       ".gf",  // Guyane
@@ -739,12 +738,12 @@
       ".tf",  // Terres australes et antarctiques françaises
   };
 
-  static CONSTEXPR base::StringPiece kDomainsIndiaCCA[] = {
+  static constexpr base::StringPiece kDomainsIndiaCCA[] = {
       ".gov.in",   ".nic.in",    ".ac.in", ".rbi.org.in", ".bankofindia.co.in",
       ".ncode.in", ".tcs.co.in",
   };
 
-  static CONSTEXPR base::StringPiece kDomainsTest[] = {
+  static constexpr base::StringPiece kDomainsTest[] = {
       ".example.com",
   };
 
@@ -809,8 +808,8 @@
     for (const auto& hash : public_key_hashes) {
       if (hash.tag() != HASH_VALUE_SHA256)
         continue;
-      if (SbMemoryCompare(hash.data(), limit.public_key_hash.data,
-                          hash.size()) != 0)
+      if (memcmp(hash.data(), limit.public_key_hash.data,
+                 hash.size()) != 0)
         continue;
       if (dns_names.empty() && ip_addrs.empty()) {
         std::vector<std::string> names;
diff --git a/src/net/cert/cert_verify_proc_mac.cc b/src/net/cert/cert_verify_proc_mac.cc
index 5588e99..ba5e1a5 100644
--- a/src/net/cert/cert_verify_proc_mac.cc
+++ b/src/net/cert/cert_verify_proc_mac.cc
@@ -539,7 +539,7 @@
   }
 
   CSSM_APPLE_TP_ACTION_DATA tp_action_data;
-  SbMemorySet(&tp_action_data, 0, sizeof(tp_action_data));
+  memset(&tp_action_data, 0, sizeof(tp_action_data));
   tp_action_data.Version = CSSM_APPLE_TP_ACTION_VERSION;
   // Allow CSSM to download any missing intermediate certificates if an
   // authorityInfoAccess extension or issuerAltName extension is present.
diff --git a/src/net/cert/cert_verify_proc_nss.cc b/src/net/cert/cert_verify_proc_nss.cc
index 5e2dc29..87b16f4 100644
--- a/src/net/cert/cert_verify_proc_nss.cc
+++ b/src/net/cert/cert_verify_proc_nss.cc
@@ -867,7 +867,7 @@
   check_chain_revocation_args.next_callback = chain_verify_callback;
 
   CERTChainVerifyCallback crlset_callback;
-  SbMemorySet(&crlset_callback, 0, sizeof(crlset_callback));
+  memset(&crlset_callback, 0, sizeof(crlset_callback));
   crlset_callback.isChainValid = &CheckChainRevocationWithCRLSet;
   crlset_callback.isChainValidArg =
       static_cast<void*>(&check_chain_revocation_args);
diff --git a/src/net/cert/cert_verify_proc_unittest.cc b/src/net/cert/cert_verify_proc_unittest.cc
index 131062e..ed60cdd 100644
--- a/src/net/cert/cert_verify_proc_unittest.cc
+++ b/src/net/cert/cert_verify_proc_unittest.cc
@@ -1228,8 +1228,8 @@
 #include "net/cert/cert_verify_proc_blacklist.inc"
 #include "starboard/memory.h"
   for (size_t i = 0; i < base::size(kBlacklistedSPKIs) - 1; ++i) {
-    EXPECT_GT(0, SbMemoryCompare(kBlacklistedSPKIs[i], kBlacklistedSPKIs[i + 1],
-                                 crypto::kSHA256Length))
+    EXPECT_GT(0, memcmp(kBlacklistedSPKIs[i], kBlacklistedSPKIs[i + 1],
+                        crypto::kSHA256Length))
         << " at index " << i;
   }
 }
@@ -1256,7 +1256,7 @@
     HashValueVector public_keys;
     HashValue hash(HASH_VALUE_SHA256);
     ASSERT_EQ(hash.size(), spki_sha256.size());
-    SbMemoryCopy(hash.data(), spki_sha256.data(), spki_sha256.size());
+    memcpy(hash.data(), spki_sha256.data(), spki_sha256.size());
     public_keys.push_back(hash);
 
     EXPECT_TRUE(CertVerifyProc::IsPublicKeyBlacklisted(public_keys))
@@ -1421,7 +1421,7 @@
       return false;
     }
 
-    SbMemoryCopy(const_cast<char*>(algorithm_sequence->data()),
+    memcpy(const_cast<char*>(algorithm_sequence->data()),
                  replacement_sequence.data(), replacement_sequence.size());
     return true;
   }
diff --git a/src/net/cert/cert_verify_proc_win.cc b/src/net/cert/cert_verify_proc_win.cc
index d52dd0f..e845702 100644
--- a/src/net/cert/cert_verify_proc_win.cc
+++ b/src/net/cert/cert_verify_proc_win.cc
@@ -689,11 +689,11 @@
   // copy. If the caller didn't supply anything, it will be empty; otherwise,
   // it will be (non-owning) copies of the caller's original params.
   CERT_REVOCATION_PARA local_params;
-  SbMemorySet(&local_params, 0, sizeof(local_params));
+  memset(&local_params, 0, sizeof(local_params));
   if (revocation_params) {
     DWORD bytes_to_copy = std::min(revocation_params->cbSize,
                                    static_cast<DWORD>(sizeof(local_params)));
-    SbMemoryCopy(&local_params, revocation_params, bytes_to_copy);
+    memcpy(&local_params, revocation_params, bytes_to_copy);
   }
   local_params.cbSize = sizeof(local_params);
 
@@ -865,7 +865,7 @@
 
   // Build and validate certificate chain.
   CERT_CHAIN_PARA chain_para;
-  SbMemorySet(&chain_para, 0, sizeof(chain_para));
+  memset(&chain_para, 0, sizeof(chain_para));
   chain_para.cbSize = sizeof(chain_para);
   // ExtendedKeyUsage.
   // We still need to request szOID_SERVER_GATED_CRYPTO and szOID_SGC_NETSCAPE
@@ -946,7 +946,7 @@
   }
 
   CERT_STRONG_SIGN_SERIALIZED_INFO strong_signed_info;
-  SbMemorySet(&strong_signed_info, 0, sizeof(strong_signed_info));
+  memset(&strong_signed_info, 0, sizeof(strong_signed_info));
   strong_signed_info.dwFlags = 0;  // Don't check OCSP or CRL signatures.
 
   // Note that the following two configurations result in disabling support for
@@ -968,7 +968,7 @@
   strong_signed_info.pwszCNGPubKeyMinBitLengths = key_sizes;
 
   CERT_STRONG_SIGN_PARA strong_sign_params;
-  SbMemorySet(&strong_sign_params, 0, sizeof(strong_sign_params));
+  memset(&strong_sign_params, 0, sizeof(strong_sign_params));
   strong_sign_params.cbSize = sizeof(strong_sign_params);
   strong_sign_params.dwInfoChoice = CERT_STRONG_SIGN_SERIALIZED_INFO_CHOICE;
   strong_sign_params.pSerializedInfo = &strong_signed_info;
@@ -1107,7 +1107,7 @@
   base::string16 hostname16 = base::ASCIIToUTF16(hostname);
 
   SSL_EXTRA_CERT_CHAIN_POLICY_PARA extra_policy_para;
-  SbMemorySet(&extra_policy_para, 0, sizeof(extra_policy_para));
+  memset(&extra_policy_para, 0, sizeof(extra_policy_para));
   extra_policy_para.cbSize = sizeof(extra_policy_para);
   extra_policy_para.dwAuthType = AUTHTYPE_SERVER;
   // Certificate name validation happens separately, later, using an internal
@@ -1118,13 +1118,13 @@
       const_cast<base::char16*>(hostname16.c_str());
 
   CERT_CHAIN_POLICY_PARA policy_para;
-  SbMemorySet(&policy_para, 0, sizeof(policy_para));
+  memset(&policy_para, 0, sizeof(policy_para));
   policy_para.cbSize = sizeof(policy_para);
   policy_para.dwFlags = 0;
   policy_para.pvExtraPolicyPara = &extra_policy_para;
 
   CERT_CHAIN_POLICY_STATUS policy_status;
-  SbMemorySet(&policy_status, 0, sizeof(policy_status));
+  memset(&policy_status, 0, sizeof(policy_status));
   policy_status.cbSize = sizeof(policy_status);
 
   if (!CertVerifyCertificateChainPolicy(
diff --git a/src/net/cert/crl_set.cc b/src/net/cert/crl_set.cc
index 7b57a71..9cc19e0 100644
--- a/src/net/cert/crl_set.cc
+++ b/src/net/cert/crl_set.cc
@@ -46,7 +46,7 @@
   if (data->size() < sizeof(header_len))
     return nullptr;
   // Assumes little-endian.
-  SbMemoryCopy(&header_len, data->data(), sizeof(header_len));
+  memcpy(&header_len, data->data(), sizeof(header_len));
   data->remove_prefix(sizeof(header_len));
 
   if (data->size() < header_len)
@@ -81,7 +81,7 @@
   if (data->size() < sizeof(num_serials))
     return false;
   // Assumes little endian.
-  SbMemoryCopy(&num_serials, data->data(), sizeof(num_serials));
+  memcpy(&num_serials, data->data(), sizeof(num_serials));
   data->remove_prefix(sizeof(num_serials));
 
   if (num_serials > 32 * 1024 * 1024)  // Sanity check.
@@ -260,7 +260,7 @@
 CRLSet::Result CRLSet::CheckSPKI(const base::StringPiece& spki_hash) const {
   for (auto i = blocked_spkis_.begin(); i != blocked_spkis_.end(); ++i) {
     if (spki_hash.size() == i->size() &&
-        SbMemoryCompare(spki_hash.data(), i->data(), i->size()) == 0) {
+        memcmp(spki_hash.data(), i->data(), i->size()) == 0) {
       return REVOKED;
     }
   }
diff --git a/src/net/cert/ct_log_response_parser.cc b/src/net/cert/ct_log_response_parser.cc
index 54bfa4c..1908d38 100644
--- a/src/net/cert/ct_log_response_parser.cc
+++ b/src/net/cert/ct_log_response_parser.cc
@@ -148,7 +148,7 @@
   signed_tree_head->tree_size = parsed_sth.tree_size;
   signed_tree_head->timestamp = base::Time::FromJsTime(parsed_sth.timestamp);
   signed_tree_head->signature = parsed_sth.signature;
-  SbMemoryCopy(signed_tree_head->sha256_root_hash,
+  memcpy(signed_tree_head->sha256_root_hash,
                parsed_sth.sha256_root_hash.c_str(), kSthRootHashLength);
   return true;
 }
diff --git a/src/net/cert/ct_log_response_parser_unittest.cc b/src/net/cert/ct_log_response_parser_unittest.cc
index d456460..cad1d73 100644
--- a/src/net/cert/ct_log_response_parser_unittest.cc
+++ b/src/net/cert/ct_log_response_parser_unittest.cc
@@ -44,7 +44,7 @@
   // Copy the field from the SignedTreeHead because it's not null terminated
   // there and ASSERT_STREQ expects null-terminated strings.
   char actual_hash[kSthRootHashLength + 1];
-  SbMemoryCopy(actual_hash, tree_head.sha256_root_hash, kSthRootHashLength);
+  memcpy(actual_hash, tree_head.sha256_root_hash, kSthRootHashLength);
   actual_hash[kSthRootHashLength] = '\0';
   std::string expected_sha256_root_hash = GetSampleSTHSHA256RootHash();
   ASSERT_STREQ(expected_sha256_root_hash.c_str(), actual_hash);
diff --git a/src/net/cert/ct_log_verifier.cc b/src/net/cert/ct_log_verifier.cc
index c2d534a..ae7799a 100644
--- a/src/net/cert/ct_log_verifier.cc
+++ b/src/net/cert/ct_log_verifier.cc
@@ -115,9 +115,9 @@
                       signed_tree_head.signature.signature_data)) {
     if (signed_tree_head.tree_size == 0) {
       // Root hash must equate SHA256 hash of the empty string.
-      return (SbMemoryCompare(signed_tree_head.sha256_root_hash,
-                              kSHA256EmptyStringHash,
-                              ct::kSthRootHashLength) == 0);
+      return (memcmp(signed_tree_head.sha256_root_hash,
+                     kSHA256EmptyStringHash,
+                     ct::kSthRootHashLength) == 0);
     }
     return true;
   }
diff --git a/src/net/cert/ct_log_verifier_unittest.cc b/src/net/cert/ct_log_verifier_unittest.cc
index 5e2840a..680790f 100644
--- a/src/net/cert/ct_log_verifier_unittest.cc
+++ b/src/net/cert/ct_log_verifier_unittest.cc
@@ -590,7 +590,7 @@
   const char kLeafPrefix[] = {'\x00'};
 
   SHA256HashValue sha256;
-  SbMemorySet(sha256.data, 0, sizeof(sha256.data));
+  memset(sha256.data, 0, sizeof(sha256.data));
 
   std::unique_ptr<crypto::SecureHash> hash(
       crypto::SecureHash::Create(crypto::SecureHash::SHA256));
diff --git a/src/net/cert/ct_objects_extractor.cc b/src/net/cert/ct_objects_extractor.cc
index da51f5b..d16fb5f 100644
--- a/src/net/cert/ct_objects_extractor.cc
+++ b/src/net/cert/ct_objects_extractor.cc
@@ -49,7 +49,7 @@
 bool StringEqualToCBS(const std::string& value1, const CBS* value2) {
   if (CBS_len(value2) != value1.size())
     return false;
-  return SbMemoryCompare(value1.data(), CBS_data(value2), CBS_len(value2)) == 0;
+  return memcmp(value1.data(), CBS_data(value2), CBS_len(value2)) == 0;
 }
 
 bool SkipElements(CBS* cbs, int count) {
diff --git a/src/net/cert/ct_objects_extractor_unittest.cc b/src/net/cert/ct_objects_extractor_unittest.cc
index 15dd734..3d81f7e 100644
--- a/src/net/cert/ct_objects_extractor_unittest.cc
+++ b/src/net/cert/ct_objects_extractor_unittest.cc
@@ -82,7 +82,7 @@
   ASSERT_TRUE(entry.leaf_certificate.empty());
   // Compare hash values of issuer spki.
   SHA256HashValue expected_issuer_key_hash;
-  SbMemoryCopy(expected_issuer_key_hash.data, GetDefaultIssuerKeyHash().data(),
+  memcpy(expected_issuer_key_hash.data, GetDefaultIssuerKeyHash().data(),
                32);
   ASSERT_EQ(expected_issuer_key_hash, entry.issuer_key_hash);
 }
diff --git a/src/net/cert/ev_root_ca_metadata_unittest.cc b/src/net/cert/ev_root_ca_metadata_unittest.cc
index 48d6c6f..a826b4a 100644
--- a/src/net/cert/ev_root_ca_metadata_unittest.cc
+++ b/src/net/cert/ev_root_ca_metadata_unittest.cc
@@ -71,7 +71,7 @@
 
 SECOidTag RegisterOID(PLArenaPool* arena, const char* oid_string) {
   SECOidData oid_data;
-  SbMemorySet(&oid_data, 0, sizeof(oid_data));
+  memset(&oid_data, 0, sizeof(oid_data));
   oid_data.offset = SEC_OID_UNKNOWN;
   oid_data.desc = oid_string;
   oid_data.mechanism = CKM_INVALID_MECHANISM;
diff --git a/src/net/cert/internal/general_names.cc b/src/net/cert/internal/general_names.cc
index d845bd9..d9f09b3 100644
--- a/src/net/cert/internal/general_names.cc
+++ b/src/net/cert/internal/general_names.cc
@@ -41,8 +41,7 @@
   size_t zero_bits = mask.size() * CHAR_BIT - prefix_length;
   size_t zero_bytes = zero_bits / CHAR_BIT;
   std::vector<uint8_t> zeros(zero_bytes, 0);
-  if (SbMemoryCompare(zeros.data(), mask.data() + mask.size() - zero_bytes,
-                      zero_bytes))
+  if (memcmp(zeros.data(), mask.data() + mask.size() - zero_bytes, zero_bytes))
     return false;
   size_t leftover_bits = zero_bits % CHAR_BIT;
   if (leftover_bits) {
diff --git a/src/net/cert/internal/parse_name.cc b/src/net/cert/internal/parse_name.cc
index 7607730..a294d27 100644
--- a/src/net/cert/internal/parse_name.cc
+++ b/src/net/cert/internal/parse_name.cc
@@ -28,7 +28,7 @@
 
   base::string16 in_16bit;
   if (in.Length()) {
-    SbMemoryCopy(base::WriteInto(&in_16bit, in.Length() / 2 + 1),
+    memcpy(base::WriteInto(&in_16bit, in.Length() / 2 + 1),
                  in.UnsafeData(), in.Length());
   }
   for (base::char16& c : in_16bit) {
@@ -53,7 +53,7 @@
 
   std::vector<uint32_t> in_32bit(in.Length() / 4);
   if (in.Length())
-    SbMemoryCopy(in_32bit.data(), in.UnsafeData(), in.Length());
+    memcpy(in_32bit.data(), in.UnsafeData(), in.Length());
   for (const uint32_t c : in_32bit) {
     // UniversalString is UCS-4 in big-endian order.
     uint32_t codepoint = base::NetToHost32(c);
diff --git a/src/net/cert/internal/trust_store_in_memory_starboard.cc b/src/net/cert/internal/trust_store_in_memory_starboard.cc
index 6cab1cf..d5538c9 100644
--- a/src/net/cert/internal/trust_store_in_memory_starboard.cc
+++ b/src/net/cert/internal/trust_store_in_memory_starboard.cc
@@ -82,7 +82,7 @@
 
   while (SbDirectoryGetNext(sb_certs_directory, dir_entry.data(),
                             dir_entry.size())) {
-    if (SbStringGetLength(dir_entry.data()) != kCertFileNameLength) {
+    if (strlen(dir_entry.data()) != kCertFileNameLength) {
       continue;
     }
     trusted_certs_on_disk.emplace(dir_entry.data());
@@ -91,7 +91,7 @@
   SbDirectoryEntry dir_entry;
 
   while (SbDirectoryGetNext(sb_certs_directory, &dir_entry)) {
-    if (SbStringGetLength(dir_entry.name) != kCertFileNameLength) {
+    if (strlen(dir_entry.name) != kCertFileNameLength) {
       continue;
     }
     trusted_certs_on_disk.emplace(dir_entry.name);
diff --git a/src/net/cert/jwk_serializer_unittest.cc b/src/net/cert/jwk_serializer_unittest.cc
index b45888e..cd041de 100644
--- a/src/net/cert/jwk_serializer_unittest.cc
+++ b/src/net/cert/jwk_serializer_unittest.cc
@@ -97,8 +97,8 @@
       &decoded_coordinate));
   EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size());
   EXPECT_EQ(
-      0, SbMemoryCompare(decoded_coordinate.data(),
-                         kSpkiEc + sizeof(kP256SpkiPrefix), kEcCoordinateSize));
+      0, memcmp(decoded_coordinate.data(),
+                kSpkiEc + sizeof(kP256SpkiPrefix), kEcCoordinateSize));
 
   EXPECT_TRUE(public_key_jwk.GetString("y", &string_value));
   EXPECT_FALSE(ContainsNonUrlSafeBase64Characters(string_value));
@@ -107,9 +107,9 @@
       &decoded_coordinate));
   EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size());
   EXPECT_EQ(
-      0, SbMemoryCompare(decoded_coordinate.data(),
-                         kSpkiEc + sizeof(kP256SpkiPrefix) + kEcCoordinateSize,
-                         kEcCoordinateSize));
+      0, memcmp(decoded_coordinate.data(),
+                kSpkiEc + sizeof(kP256SpkiPrefix) + kEcCoordinateSize,
+                kEcCoordinateSize));
 
   // Test the result of a corner case: leading 0s in the x, y coordinates are
   // not trimmed, but the point is fixed-length encoded.
@@ -128,9 +128,9 @@
       string_value, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
       &decoded_coordinate));
   EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size());
-  EXPECT_EQ(0, SbMemoryCompare(decoded_coordinate.data(),
-                               kSpkiEcWithLeadingZero + sizeof(kP256SpkiPrefix),
-                               kEcCoordinateSize));
+  EXPECT_EQ(0, memcmp(decoded_coordinate.data(),
+                      kSpkiEcWithLeadingZero + sizeof(kP256SpkiPrefix),
+                      kEcCoordinateSize));
 
   EXPECT_TRUE(public_key_jwk.GetString("y", &string_value));
   EXPECT_FALSE(ContainsNonUrlSafeBase64Characters(string_value));
@@ -138,10 +138,10 @@
       string_value, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
       &decoded_coordinate));
   EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size());
-  EXPECT_EQ(0, SbMemoryCompare(decoded_coordinate.data(),
-                               kSpkiEcWithLeadingZero +
-                                   sizeof(kP256SpkiPrefix) + kEcCoordinateSize,
-                               kEcCoordinateSize));
+  EXPECT_EQ(0, memcmp(decoded_coordinate.data(),
+                      kSpkiEcWithLeadingZero +
+                         sizeof(kP256SpkiPrefix) + kEcCoordinateSize,
+                      kEcCoordinateSize));
 }
 
 }  // namespace net
diff --git a/src/net/cert/known_roots.cc b/src/net/cert/known_roots.cc
index f44f500..2b53ca3 100644
--- a/src/net/cert/known_roots.cc
+++ b/src/net/cert/known_roots.cc
@@ -22,12 +22,12 @@
 struct HashValueToRootCertDataComp {
   bool operator()(const HashValue& hash, const RootCertData& root_cert) {
     DCHECK_EQ(HASH_VALUE_SHA256, hash.tag());
-    return SbMemoryCompare(hash.data(), root_cert.sha256_spki_hash, 32) < 0;
+    return memcmp(hash.data(), root_cert.sha256_spki_hash, 32) < 0;
   }
 
   bool operator()(const RootCertData& root_cert, const HashValue& hash) {
     DCHECK_EQ(HASH_VALUE_SHA256, hash.tag());
-    return SbMemoryCompare(root_cert.sha256_spki_hash, hash.data(), 32) < 0;
+    return memcmp(root_cert.sha256_spki_hash, hash.data(), 32) < 0;
   }
 };
 
diff --git a/src/net/cert/known_roots_unittest.cc b/src/net/cert/known_roots_unittest.cc
index 869f919..8411c04 100644
--- a/src/net/cert/known_roots_unittest.cc
+++ b/src/net/cert/known_roots_unittest.cc
@@ -22,7 +22,7 @@
   EXPECT_TRUE(std::is_sorted(
       std::begin(kRootCerts), std::end(kRootCerts),
       [](const RootCertData& lhs, const RootCertData& rhs) {
-        return SbMemoryCompare(lhs.sha256_spki_hash, rhs.sha256_spki_hash, 32) <
+        return memcmp(lhs.sha256_spki_hash, rhs.sha256_spki_hash, 32) <
                0;
       }));
 }
diff --git a/src/net/cert/merkle_tree_leaf_unittest.cc b/src/net/cert/merkle_tree_leaf_unittest.cc
index 376312f..cbab6b5 100644
--- a/src/net/cert/merkle_tree_leaf_unittest.cc
+++ b/src/net/cert/merkle_tree_leaf_unittest.cc
@@ -43,7 +43,7 @@
 
   // Print hex string (easier to read than default GTest representation)
   *result_listener << "a.k.a. 0x" << base::HexEncode(arg.data(), arg.size());
-  return SbMemoryCompare(arg.data(), bytes.data(), bytes.size()) == 0;
+  return memcmp(arg.data(), bytes.data(), bytes.size()) == 0;
 }
 
 class MerkleTreeLeafTest : public ::testing::Test {
diff --git a/src/net/cert/signed_tree_head.cc b/src/net/cert/signed_tree_head.cc
index a42cdd8..5b81984 100644
--- a/src/net/cert/signed_tree_head.cc
+++ b/src/net/cert/signed_tree_head.cc
@@ -28,7 +28,7 @@
       tree_size(tree_size),
       signature(signature),
       log_id(log_id) {
-  SbMemoryCopy(this->sha256_root_hash, sha256_root_hash, kSthRootHashLength);
+  memcpy(this->sha256_root_hash, sha256_root_hash, kSthRootHashLength);
 }
 
 SignedTreeHead::SignedTreeHead(const SignedTreeHead& other) = default;
@@ -50,7 +50,7 @@
 bool operator==(const SignedTreeHead& lhs, const SignedTreeHead& rhs) {
   return std::tie(lhs.version, lhs.timestamp, lhs.tree_size, lhs.log_id) ==
              std::tie(rhs.version, rhs.timestamp, rhs.tree_size, rhs.log_id) &&
-         SbMemoryCompare(lhs.sha256_root_hash, rhs.sha256_root_hash,
+         memcmp(lhs.sha256_root_hash, rhs.sha256_root_hash,
                          kSthRootHashLength) == 0 &&
          lhs.signature.SignatureParametersMatch(
              rhs.signature.hash_algorithm, rhs.signature.signature_algorithm) &&
diff --git a/src/net/cert/x509_certificate.cc b/src/net/cert/x509_certificate.cc
index 7bdcf10..d5cf24a 100644
--- a/src/net/cert/x509_certificate.cc
+++ b/src/net/cert/x509_certificate.cc
@@ -759,7 +759,7 @@
 
 SHA256HashValue X509Certificate::CalculateChainFingerprint256() const {
   SHA256HashValue sha256;
-  SbMemorySet(sha256.data, 0, sizeof(sha256.data));
+  memset(sha256.data, 0, sizeof(sha256.data));
 
   SHA256_CTX sha256_ctx;
   SHA256_Init(&sha256_ctx);
diff --git a/src/net/cert/x509_certificate_unittest.cc b/src/net/cert/x509_certificate_unittest.cc
index 40961d3..a62e959 100644
--- a/src/net/cert/x509_certificate_unittest.cc
+++ b/src/net/cert/x509_certificate_unittest.cc
@@ -367,8 +367,8 @@
   };
 
   ASSERT_EQ(sizeof(google_serial), google_cert->serial_number().size());
-  EXPECT_TRUE(SbMemoryCompare(google_cert->serial_number().data(),
-                              google_serial, sizeof(google_serial)) == 0);
+  EXPECT_TRUE(memcmp(google_cert->serial_number().data(),
+                     google_serial, sizeof(google_serial)) == 0);
 }
 
 TEST(X509CertificateTest, SerialNumberZeroPadded) {
@@ -382,8 +382,8 @@
   // serial() should contain the leading 0 padding byte.
   static const uint8_t expected_serial[3] = {0x00, 0x80, 0x01};
   ASSERT_EQ(sizeof(expected_serial), cert->serial_number().size());
-  EXPECT_TRUE(SbMemoryCompare(cert->serial_number().data(), expected_serial,
-                              sizeof(expected_serial)) == 0);
+  EXPECT_TRUE(memcmp(cert->serial_number().data(), expected_serial,
+                     sizeof(expected_serial)) == 0);
 }
 
 TEST(X509CertificateTest, SerialNumberZeroPadded21BytesLong) {
@@ -400,8 +400,8 @@
       0x00, 0x80, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
       0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13};
   ASSERT_EQ(sizeof(expected_serial), cert->serial_number().size());
-  EXPECT_TRUE(SbMemoryCompare(cert->serial_number().data(), expected_serial,
-                              sizeof(expected_serial)) == 0);
+  EXPECT_TRUE(memcmp(cert->serial_number().data(), expected_serial,
+                     sizeof(expected_serial)) == 0);
 }
 
 TEST(X509CertificateTest, SerialNumberNegative) {
@@ -415,8 +415,8 @@
   // parsing is currently permissive, so this does not cause an error.
   static const uint8_t expected_serial[2] = {0x80, 0x01};
   ASSERT_EQ(sizeof(expected_serial), cert->serial_number().size());
-  EXPECT_TRUE(SbMemoryCompare(cert->serial_number().data(), expected_serial,
-                              sizeof(expected_serial)) == 0);
+  EXPECT_TRUE(memcmp(cert->serial_number().data(), expected_serial,
+                     sizeof(expected_serial)) == 0);
 }
 
 TEST(X509CertificateTest, SerialNumber37BytesLong) {
@@ -434,8 +434,8 @@
       0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
       0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25};
   ASSERT_EQ(sizeof(expected_serial), cert->serial_number().size());
-  EXPECT_TRUE(SbMemoryCompare(cert->serial_number().data(), expected_serial,
-                              sizeof(expected_serial)) == 0);
+  EXPECT_TRUE(memcmp(cert->serial_number().data(), expected_serial,
+                     sizeof(expected_serial)) == 0);
 }
 
 TEST(X509CertificateTest, SHA256FingerprintsCorrectly) {
@@ -537,16 +537,16 @@
       0x7F, 0x00, 0x00, 0x02
   };
   ASSERT_EQ(base::size(kIPv4Address), ip_addresses[0].size());
-  EXPECT_EQ(0, SbMemoryCompare(ip_addresses[0].data(), kIPv4Address,
-                               base::size(kIPv4Address)));
+  EXPECT_EQ(0, memcmp(ip_addresses[0].data(), kIPv4Address,
+                      base::size(kIPv4Address)));
 
   static const uint8_t kIPv6Address[] = {
       0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
   };
   ASSERT_EQ(base::size(kIPv6Address), ip_addresses[1].size());
-  EXPECT_EQ(0, SbMemoryCompare(ip_addresses[1].data(), kIPv6Address,
-                               base::size(kIPv6Address)));
+  EXPECT_EQ(0, memcmp(ip_addresses[1].data(), kIPv6Address,
+                      base::size(kIPv6Address)));
 
   // Ensure the subjectAltName dirName has not influenced the handling of
   // the subject commonName.
@@ -577,7 +577,7 @@
   base::SHA1HashBytes(reinterpret_cast<const uint8_t*>(spkiBytes.data()),
                       spkiBytes.size(), hash);
 
-  EXPECT_EQ(0, SbMemoryCompare(hash, kNistSPKIHash, sizeof(hash)));
+  EXPECT_EQ(0, memcmp(hash, kNistSPKIHash, sizeof(hash)));
 }
 
 TEST(X509CertificateTest, HasTLSFeatureExtension) {
diff --git a/src/net/cert/x509_util.cc b/src/net/cert/x509_util.cc
index 15759fa..72ccd31 100644
--- a/src/net/cert/x509_util.cc
+++ b/src/net/cert/x509_util.cc
@@ -353,8 +353,8 @@
   if (a == b)
     return true;
   return CRYPTO_BUFFER_len(a) == CRYPTO_BUFFER_len(b) &&
-         SbMemoryCompare(CRYPTO_BUFFER_data(a), CRYPTO_BUFFER_data(b),
-                         CRYPTO_BUFFER_len(a)) == 0;
+         memcmp(CRYPTO_BUFFER_data(a), CRYPTO_BUFFER_data(b),
+                CRYPTO_BUFFER_len(a)) == 0;
 }
 
 base::StringPiece CryptoBufferAsStringPiece(const CRYPTO_BUFFER* buffer) {
diff --git a/src/net/cert/x509_util_mac.cc b/src/net/cert/x509_util_mac.cc
index 8ae92f6..dfe9e0a 100644
--- a/src/net/cert/x509_util_mac.cc
+++ b/src/net/cert/x509_util_mac.cc
@@ -140,8 +140,8 @@
     return false;
 
   if (subject.field()->Length != issuer.field()->Length ||
-      SbMemoryCompare(subject.field()->Data, issuer.field()->Data,
-                      issuer.field()->Length) != 0) {
+      memcmp(subject.field()->Data, issuer.field()->Data,
+             issuer.field()->Length) != 0) {
     return false;
   }
 
@@ -161,7 +161,7 @@
 
 SHA256HashValue CalculateFingerprint256(SecCertificateRef cert) {
   SHA256HashValue sha256;
-  SbMemorySet(sha256.data, 0, sizeof(sha256.data));
+  memset(sha256.data, 0, sizeof(sha256.data));
 
   CSSM_DATA cert_data;
   OSStatus status = SecCertificateGetData(cert, &cert_data);
@@ -238,7 +238,7 @@
   // This behaviour is used to implement EV-only revocation checking.
   if (enable_revocation_checking) {
     CSSM_APPLE_TP_CRL_OPTIONS tp_crl_options;
-    SbMemorySet(&tp_crl_options, 0, sizeof(tp_crl_options));
+    memset(&tp_crl_options, 0, sizeof(tp_crl_options));
     tp_crl_options.Version = CSSM_APPLE_TP_CRL_OPTS_VERSION;
     // Only allow network CRL fetches if the caller explicitly requests
     // online revocation checking. Note that, as of OS X 10.7.2, the system
@@ -263,7 +263,7 @@
   // accessing the network. This is done because the TP will force an OCSP
   // policy to be present when it believes the certificate is EV.
   CSSM_APPLE_TP_OCSP_OPTIONS tp_ocsp_options;
-  SbMemorySet(&tp_ocsp_options, 0, sizeof(tp_ocsp_options));
+  memset(&tp_ocsp_options, 0, sizeof(tp_ocsp_options));
   tp_ocsp_options.Version = CSSM_APPLE_TP_OCSP_OPTS_VERSION;
 
   if (enable_revocation_checking) {
diff --git a/src/net/cert/x509_util_mac.h b/src/net/cert/x509_util_mac.h
index 4c05f8a..ccece18 100644
--- a/src/net/cert/x509_util_mac.h
+++ b/src/net/cert/x509_util_mac.h
@@ -183,7 +183,7 @@
 // Compares two OIDs by value.
 inline bool CSSMOIDEqual(const CSSM_OID* oid1, const CSSM_OID* oid2) {
   return oid1->Length == oid2->Length &&
-         (SbMemoryCompare(oid1->Data, oid2->Data, oid1->Length) == 0);
+         (memcmp(oid1->Data, oid2->Data, oid1->Length) == 0);
 }
 
 #pragma clang diagnostic pop  // "-Wdeprecated-declarations"
diff --git a/src/net/cert/x509_util_nss.cc b/src/net/cert/x509_util_nss.cc
index 555014e..2c58fed 100644
--- a/src/net/cert/x509_util_nss.cc
+++ b/src/net/cert/x509_util_nss.cc
@@ -140,13 +140,13 @@
   if (a == b)
     return true;
   return a->derCert.len == b->derCert.len &&
-         SbMemoryCompare(a->derCert.data, b->derCert.data, a->derCert.len) == 0;
+         memcmp(a->derCert.data, b->derCert.data, a->derCert.len) == 0;
 }
 
 bool IsSameCertificate(CERTCertificate* a, const X509Certificate* b) {
   return a->derCert.len == CRYPTO_BUFFER_len(b->cert_buffer()) &&
-         SbMemoryCompare(a->derCert.data, CRYPTO_BUFFER_data(b->cert_buffer()),
-                         a->derCert.len) == 0;
+         memcmp(a->derCert.data, CRYPTO_BUFFER_data(b->cert_buffer()),
+                a->derCert.len) == 0;
 }
 bool IsSameCertificate(const X509Certificate* a, CERTCertificate* b) {
   return IsSameCertificate(b, a);
@@ -363,7 +363,7 @@
     if (name->type == certOtherName) {
       OtherName* on = &name->name.OthName;
       if (on->oid.len == sizeof(kUpnOid) &&
-          SbMemoryCompare(on->oid.data, kUpnOid, sizeof(kUpnOid)) == 0) {
+          memcmp(on->oid.data, kUpnOid, sizeof(kUpnOid)) == 0) {
         SECItem decoded;
         if (SEC_QuickDERDecodeItem(arena.get(), &decoded,
                                    SEC_ASN1_GET(SEC_UTF8StringTemplate),
@@ -430,7 +430,7 @@
 
 SHA256HashValue CalculateFingerprint256(CERTCertificate* cert) {
   SHA256HashValue sha256;
-  SbMemorySet(sha256.data, 0, sizeof(sha256.data));
+  memset(sha256.data, 0, sizeof(sha256.data));
 
   DCHECK(cert->derCert.data);
   DCHECK_NE(0U, cert->derCert.len);
diff --git a/src/net/cert/x509_util_unittest.cc b/src/net/cert/x509_util_unittest.cc
index a18bf57..b8276fc 100644
--- a/src/net/cert/x509_util_unittest.cc
+++ b/src/net/cert/x509_util_unittest.cc
@@ -133,7 +133,7 @@
 
   std::vector<uint8_t> input;
   input.resize(sizeof(private_key_info));
-  SbMemoryCopy(&input.front(), private_key_info, sizeof(private_key_info));
+  memcpy(&input.front(), private_key_info, sizeof(private_key_info));
 
   std::unique_ptr<crypto::RSAPrivateKey> private_key(
       crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
diff --git a/src/net/der/input.cc b/src/net/der/input.cc
index 7526a13..7b197e7 100644
--- a/src/net/der/input.cc
+++ b/src/net/der/input.cc
@@ -38,7 +38,7 @@
 bool operator==(const Input& lhs, const Input& rhs) {
   if (lhs.Length() != rhs.Length())
     return false;
-  return SbMemoryCompare(lhs.UnsafeData(), rhs.UnsafeData(), lhs.Length()) == 0;
+  return memcmp(lhs.UnsafeData(), rhs.UnsafeData(), lhs.Length()) == 0;
 }
 
 bool operator!=(const Input& lhs, const Input& rhs) {
diff --git a/src/net/der/input_unittest.cc b/src/net/der/input_unittest.cc
index ea35c24..7f47e9f 100644
--- a/src/net/der/input_unittest.cc
+++ b/src/net/der/input_unittest.cc
@@ -22,7 +22,7 @@
   EXPECT_EQ(test, test2);
 
   uint8_t input_copy[base::size(kInput)] = {0};
-  SbMemoryCopy(input_copy, kInput, base::size(kInput));
+  memcpy(input_copy, kInput, base::size(kInput));
   Input test_copy(input_copy);
   EXPECT_EQ(test, test_copy);
 
diff --git a/src/net/dial/dial_http_server.cc b/src/net/dial/dial_http_server.cc
index 634e78d..dc59290 100644
--- a/src/net/dial/dial_http_server.cc
+++ b/src/net/dial/dial_http_server.cc
@@ -56,13 +56,13 @@
 base::Optional<net::IPEndPoint> GetLocalIpAddress() {
   net::IPEndPoint ip_addr;
   SbSocketAddress local_ip;
-  SbMemorySet(&local_ip, 0, sizeof(local_ip));
+  memset(&local_ip, 0, sizeof(local_ip));
   bool result = false;
 
   // Dial Server only supports Ipv4 now.
   SbSocketAddressType address_types = {kSbSocketAddressTypeIpv4};
   SbSocketAddress destination;
-  SbMemorySet(&(destination.address), 0, sizeof(destination.address));
+  memset(&(destination.address), 0, sizeof(destination.address));
   destination.type = address_types;
   if (!SbSocketGetInterfaceAddress(&destination, &local_ip, NULL) ||
       !ip_addr.FromSbSocketAddress(&local_ip)) {
@@ -149,7 +149,7 @@
 
   } else if (strstr(info.path.c_str(), kAppsPrefix)) {
     if (info.method == "GET" &&
-        info.path.length() == SbStringGetLength(kAppsPrefix)) {
+        info.path.length() == strlen(kAppsPrefix)) {
       // If /apps/ request, send 302 to current application.
       http_server_->SendRaw(
           conn_id,
diff --git a/src/net/dial/dial_system_config.cc b/src/net/dial/dial_system_config.cc
index 668382d..589c97e 100644
--- a/src/net/dial/dial_system_config.cc
+++ b/src/net/dial/dial_system_config.cc
@@ -38,7 +38,7 @@
 
 const char* DialSystemConfig::model_uuid() const {
   base::AutoLock lock(lock_);
-  if (!SbStringGetLength(s_dial_uuid)) {
+  if (!strlen(s_dial_uuid)) {
     CreateDialUuid();
   }
   return s_dial_uuid;
@@ -55,7 +55,7 @@
   EVP_MD_CTX* mdctx;
   mdctx = EVP_MD_CTX_create();
   EVP_DigestInit_ex(mdctx, EVP_sha1(), NULL);
-  EVP_DigestUpdate(mdctx, kSecret, SbStringGetLength(kSecret));
+  EVP_DigestUpdate(mdctx, kSecret, strlen(kSecret));
   EVP_DigestUpdate(mdctx, platform_uuid.data(), platform_uuid.size());
   EVP_DigestFinal_ex(mdctx, md_value, &md_len);
   EVP_MD_CTX_destroy(mdctx);
@@ -74,7 +74,7 @@
            md_value[1], md_value[2], md_value[3], md_value[4], md_value[5],
            md_value[6], md_value[7], md_value[8], md_value[9]);
 
-  DCHECK_EQ(22, SbStringGetLength(s_dial_uuid));
+  DCHECK_EQ(22, strlen(s_dial_uuid));
 }
 
 }  // namespace net
diff --git a/src/net/disk_cache/backend_unittest.cc b/src/net/disk_cache/backend_unittest.cc
index 113db63..3e9b43b 100644
--- a/src/net/disk_cache/backend_unittest.cc
+++ b/src/net/disk_cache/backend_unittest.cc
@@ -458,7 +458,7 @@
 
   // Now verify long keys.
   char buffer2[20000];
-  SbMemorySet(buffer2, 's', sizeof(buffer2));
+  memset(buffer2, 's', sizeof(buffer2));
   buffer2[1023] = '\0';
   ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file";
   entry2->Close();
@@ -803,7 +803,7 @@
   scoped_refptr<net::IOBuffer> buffer2(
       base::MakeRefCounted<net::IOBuffer>(kSize));
   ASSERT_EQ(kSize, base::ReadFile(filename, buffer2->data(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), buffer2->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize));
 }
 
 // Tests that we deal with file-level pending operations at destruction time.
@@ -1036,7 +1036,7 @@
 
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(cache_size);
-  SbMemorySet(buffer->data(), 0, cache_size);
+  memset(buffer->data(), 0, cache_size);
   EXPECT_EQ(cache_size / 10,
             WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false))
       << "normal file";
@@ -1238,7 +1238,7 @@
   const int kSize = 50;
   scoped_refptr<net::IOBuffer> buffer1 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer1->data(), 0, kSize);
+  memset(buffer1->data(), 0, kSize);
   base::strlcpy(buffer1->data(), "And the data to save", kSize);
   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false));
   entry->Close();
@@ -1248,7 +1248,7 @@
 
   scoped_refptr<net::IOBuffer> buffer2 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer2->data(), 0, kSize);
+  memset(buffer2->data(), 0, kSize);
   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2.get(), kSize));
   entry->Close();
   EXPECT_STREQ(buffer1->data(), buffer2->data());
@@ -1276,7 +1276,7 @@
   const int kSize = 50;
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer->data(), 0, kSize);
+  memset(buffer->data(), 0, kSize);
   base::strlcpy(buffer->data(), "And the data to save", kSize);
   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
   SimulateCrash();
@@ -1321,7 +1321,7 @@
   const int kSize = 50;
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer->data(), 0, kSize);
+  memset(buffer->data(), 0, kSize);
   base::strlcpy(buffer->data(), "And the data to save", kSize);
   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
   entry->Close();
@@ -1449,7 +1449,7 @@
 
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer->data(), 0, kSize);
+  memset(buffer->data(), 0, kSize);
   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
 
   // Simulate a crash.
@@ -1499,7 +1499,7 @@
 
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer->data(), 0, kSize);
+  memset(buffer->data(), 0, kSize);
   disk_cache::Entry* entry;
 
   // Writing 32 entries to this cache chains most of them.
@@ -1771,7 +1771,7 @@
       base::MakeRefCounted<net::IOBuffer>(kSize);
 
   ASSERT_THAT(CreateEntry(first, &entry1), IsOk());
-  SbMemorySet(buffer1->data(), 0, kSize);
+  memset(buffer1->data(), 0, kSize);
   base::strlcpy(buffer1->data(), "And the data to save", kSize);
   EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
 
@@ -1806,7 +1806,7 @@
   const int kSize = 50;
   scoped_refptr<net::IOBuffer> buffer1 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buffer1->data(), 0, kSize);
+  memset(buffer1->data(), 0, kSize);
   base::strlcpy(buffer1->data(), "And the data to save", kSize);
   EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
   entry1->Close();
@@ -3236,7 +3236,7 @@
   const int kBufSize = 20000;
   scoped_refptr<net::IOBuffer> buf =
       base::MakeRefCounted<net::IOBuffer>(kBufSize);
-  SbMemorySet(buf->data(), 0, kBufSize);
+  memset(buf->data(), 0, kBufSize);
   EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false));
   EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false));
 
@@ -3794,11 +3794,11 @@
   const int kSize = 200;
   char buffer1[kSize];
   char buffer2[kSize];
-  SbMemorySet(buffer1, 't', kSize);
-  SbMemorySet(buffer2, 0, kSize);
+  memset(buffer1, 't', kSize);
+  memset(buffer2, 0, kSize);
   EXPECT_TRUE(file->Write(buffer1, kSize, 0));
   EXPECT_TRUE(file->Read(buffer2, kSize, 0));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1, buffer2, kSize));
+  EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize));
 
   EXPECT_TRUE(disk_cache::DeleteCacheFile(name));
 }
@@ -4548,7 +4548,7 @@
     scoped_refptr<net::IOBuffer> read_buf =
         base::MakeRefCounted<net::IOBuffer>(kSize);
     ASSERT_EQ(kSize, ReadData(entries[i], 1, 0, read_buf.get(), kSize));
-    EXPECT_EQ(0, SbMemoryCompare(read_buf->data(), buf1->data(), kSize));
+    EXPECT_EQ(0, memcmp(read_buf->data(), buf1->data(), kSize));
   }
 
   histogram_tester.ExpectBucketCount(
@@ -4566,12 +4566,12 @@
   scoped_refptr<net::IOBuffer> read_buf =
       base::MakeRefCounted<net::IOBuffer>(kSize);
   ASSERT_EQ(kSize, ReadData(entries[0], 1, 0, read_buf.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(read_buf->data(), buf1->data(), kSize));
+  EXPECT_EQ(0, memcmp(read_buf->data(), buf1->data(), kSize));
 
   scoped_refptr<net::IOBuffer> read_buf2 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
   ASSERT_EQ(kSize, ReadData(alt_entry, 1, 0, read_buf2.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(read_buf2->data(), buf2->data(), kSize));
+  EXPECT_EQ(0, memcmp(read_buf2->data(), buf2->data(), kSize));
 
   // Two more things than last time --- entries[0] and |alt_entry|
   histogram_tester.ExpectBucketCount(
diff --git a/src/net/disk_cache/blockfile/bitmap.cc b/src/net/disk_cache/blockfile/bitmap.cc
index de6ed51..db9280f 100644
--- a/src/net/disk_cache/blockfile/bitmap.cc
+++ b/src/net/disk_cache/blockfile/bitmap.cc
@@ -75,7 +75,7 @@
     uint32_t* new_map = new uint32_t[array_size_];
     // Always clear the unused bits in the last word.
     new_map[array_size_ - 1] = 0;
-    SbMemoryCopy(new_map, map_,
+    memcpy(new_map, map_,
                  sizeof(*map_) * std::min(array_size_, old_array_size));
     if (alloc_)
       delete[] map_;  // No need to check for NULL.
@@ -129,7 +129,7 @@
 }
 
 void Bitmap::SetMap(const uint32_t* map, int size) {
-  SbMemoryCopy(map_, map, std::min(size, array_size_) * sizeof(*map_));
+  memcpy(map_, map, std::min(size, array_size_) * sizeof(*map_));
 }
 
 void Bitmap::SetRange(int begin, int end, bool value) {
@@ -151,7 +151,7 @@
   SetWordBits(end, end_offset, value);
 
   // Set all the words in the middle.
-  SbMemorySet(map_ + (begin / kIntBits), (value ? 0xFF : 0x00),
+  memset(map_ + (begin / kIntBits), (value ? 0xFF : 0x00),
               ((end / kIntBits) - (begin / kIntBits)) * sizeof(*map_));
 }
 
diff --git a/src/net/disk_cache/blockfile/bitmap.h b/src/net/disk_cache/blockfile/bitmap.h
index 4b5a18e..df0fdb5 100644
--- a/src/net/disk_cache/blockfile/bitmap.h
+++ b/src/net/disk_cache/blockfile/bitmap.h
@@ -45,7 +45,7 @@
 
   // Sets all the bits to true or false.
   void SetAll(bool value) {
-    SbMemorySet(map_, (value ? 0xFF : 0x00), array_size_ * sizeof(*map_));
+    memset(map_, (value ? 0xFF : 0x00), array_size_ * sizeof(*map_));
   }
 
   // Clears all bits in the bitmap
diff --git a/src/net/disk_cache/blockfile/bitmap_unittest.cc b/src/net/disk_cache/blockfile/bitmap_unittest.cc
index 1dfb0a3..ac8d193 100644
--- a/src/net/disk_cache/blockfile/bitmap_unittest.cc
+++ b/src/net/disk_cache/blockfile/bitmap_unittest.cc
@@ -103,16 +103,16 @@
       EXPECT_FALSE(bitmap.Get(i * 8));
   }
 
-  EXPECT_EQ(0, SbMemoryCompare(local_map, bitmap.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(local_map, bitmap.GetMap(), kMapSize));
 
   // Now let's create a bitmap that shares local_map as storage.
   disk_cache::Bitmap bitmap2(reinterpret_cast<uint32_t*>(local_map),
                              kMapSize * 8, kMapSize / 4);
-  EXPECT_EQ(0, SbMemoryCompare(local_map, bitmap2.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(local_map, bitmap2.GetMap(), kMapSize));
 
   local_map[kMapSize / 2] = 'a';
-  EXPECT_EQ(0, SbMemoryCompare(local_map, bitmap2.GetMap(), kMapSize));
-  EXPECT_NE(0, SbMemoryCompare(local_map, bitmap.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(local_map, bitmap2.GetMap(), kMapSize));
+  EXPECT_NE(0, memcmp(local_map, bitmap.GetMap(), kMapSize));
 }
 
 TEST(BitmapTest, SetAll) {
@@ -120,18 +120,18 @@
   const int kMapSize = 80;
   char ones[kMapSize];
   char zeros[kMapSize];
-  SbMemorySet(ones, 0xff, kMapSize);
-  SbMemorySet(zeros, 0, kMapSize);
+  memset(ones, 0xff, kMapSize);
+  memset(zeros, 0, kMapSize);
 
   disk_cache::Bitmap map(kMapSize * 8, true);
-  EXPECT_EQ(0, SbMemoryCompare(zeros, map.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(zeros, map.GetMap(), kMapSize));
   map.SetAll(true);
-  EXPECT_EQ(0, SbMemoryCompare(ones, map.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(ones, map.GetMap(), kMapSize));
   map.SetAll(false);
-  EXPECT_EQ(0, SbMemoryCompare(zeros, map.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(zeros, map.GetMap(), kMapSize));
   map.SetAll(true);
   map.Clear();
-  EXPECT_EQ(0, SbMemoryCompare(zeros, map.GetMap(), kMapSize));
+  EXPECT_EQ(0, memcmp(zeros, map.GetMap(), kMapSize));
 }
 
 TEST(BitmapTest, Range) {
diff --git a/src/net/disk_cache/blockfile/block_files.cc b/src/net/disk_cache/blockfile/block_files.cc
index 0ab7b52..8b6dcbc 100644
--- a/src/net/disk_cache/blockfile/block_files.cc
+++ b/src/net/disk_cache/blockfile/block_files.cc
@@ -353,7 +353,7 @@
 
   if (!zero_buffer_) {
     zero_buffer_ = new char[Addr::BlockSizeForFileType(BLOCK_4K) * 4];
-    SbMemorySet(zero_buffer_, 0, Addr::BlockSizeForFileType(BLOCK_4K) * 4);
+    memset(zero_buffer_, 0, Addr::BlockSizeForFileType(BLOCK_4K) * 4);
   }
   MappedFile* file = GetFile(address);
   if (!file)
@@ -448,7 +448,7 @@
     return false;
 
   BlockFileHeader header;
-  SbMemorySet(&header, 0, sizeof(header));
+  memset(&header, 0, sizeof(header));
   header.magic = kBlockMagic;
   header.version = kBlockVersion2;
   header.entry_size = Addr::BlockSizeForFileType(file_type);
diff --git a/src/net/disk_cache/blockfile/block_files_unittest.cc b/src/net/disk_cache/blockfile/block_files_unittest.cc
index 8eb9467..5859f85 100644
--- a/src/net/disk_cache/blockfile/block_files_unittest.cc
+++ b/src/net/disk_cache/blockfile/block_files_unittest.cc
@@ -269,7 +269,7 @@
   // Let's create an invalid file.
   base::FilePath filename(files.Name(5));
   char header[kBlockHeaderSize];
-  SbMemorySet(header, 'a', kBlockHeaderSize);
+  memset(header, 'a', kBlockHeaderSize);
   EXPECT_EQ(kBlockHeaderSize,
             base::WriteFile(filename, header, kBlockHeaderSize));
 
diff --git a/src/net/disk_cache/blockfile/disk_format.cc b/src/net/disk_cache/blockfile/disk_format.cc
index 88192cb..62cebe0 100644
--- a/src/net/disk_cache/blockfile/disk_format.cc
+++ b/src/net/disk_cache/blockfile/disk_format.cc
@@ -8,7 +8,7 @@
 namespace disk_cache {
 
 IndexHeader::IndexHeader() {
-  SbMemorySet(this, 0, sizeof(*this));
+  memset(this, 0, sizeof(*this));
   magic = kIndexMagic;
   version = kCurrentVersion;
 }
diff --git a/src/net/disk_cache/blockfile/entry_impl.cc b/src/net/disk_cache/blockfile/entry_impl.cc
index 7fb0798..492221f 100644
--- a/src/net/disk_cache/blockfile/entry_impl.cc
+++ b/src/net/disk_cache/blockfile/entry_impl.cc
@@ -201,7 +201,7 @@
   int valid_len = Size() - offset;
   int copy_len = std::min(valid_len, len);
   if (copy_len) {
-    SbMemoryCopy(&buffer_[offset], buffer, copy_len);
+    memcpy(&buffer_[offset], buffer, copy_len);
     len -= copy_len;
     buffer += copy_len;
   }
@@ -245,7 +245,7 @@
   if (offset < offset_) {
     // We don't have a file so lets fill the first part with 0.
     clean_bytes = std::min(offset_ - offset, len);
-    SbMemorySet(buf->data(), 0, clean_bytes);
+    memset(buf->data(), 0, clean_bytes);
     if (len == clean_bytes)
       return len;
     offset = offset_;
@@ -257,7 +257,7 @@
   DCHECK_GE(start, 0);
   DCHECK_GE(available, 0);
   len = std::min(len, available);
-  SbMemoryCopy(buf->data() + clean_bytes, &buffer_[start], len);
+  memcpy(buf->data() + clean_bytes, &buffer_[start], len);
   return len + clean_bytes;
 }
 
@@ -425,9 +425,9 @@
   Trace("Create entry In");
   EntryStore* entry_store = entry_.Data();
   RankingsNode* node = node_.Data();
-  SbMemorySet(entry_store, 0,
+  memset(entry_store, 0,
               sizeof(EntryStore) * entry_.address().num_blocks());
-  SbMemorySet(node, 0, sizeof(RankingsNode));
+  memset(node, 0, sizeof(RankingsNode));
   if (!node_.LazyInit(backend_->File(node_address), node_address))
     return false;
 
@@ -458,7 +458,7 @@
     if (address.is_separate_file())
       key_file->SetLength(key.size() + 1);
   } else {
-    SbMemoryCopy(entry_store->key, key.data(), key.size());
+    memcpy(entry_store->key, key.data(), key.size());
     entry_store->key[key.size()] = '\0';
   }
   backend_->ModifyStorageSize(0, static_cast<int32_t>(key.size()));
@@ -1565,7 +1565,7 @@
     if (data_len <= user_buffers_[index]->Size()) {
       DCHECK(!user_buffers_[index]->Start());
       *buffer = new char[data_len];
-      SbMemoryCopy(*buffer, user_buffers_[index]->Data(), data_len);
+      memcpy(*buffer, user_buffers_[index]->Data(), data_len);
       return;
     }
   }
diff --git a/src/net/disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc b/src/net/disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc
index c422658..273f890 100644
--- a/src/net/disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc
+++ b/src/net/disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc
@@ -24,7 +24,7 @@
   buffer_ = SbMemoryAllocate(size);
   snapshot_ = SbMemoryAllocate(size);
   if (buffer_ && snapshot_ && Read(buffer_, size, 0)) {
-    SbMemoryCopy(snapshot_, buffer_, size);
+    memcpy(snapshot_, buffer_, size);
   } else {
     SbMemoryDeallocate(buffer_);
     SbMemoryDeallocate(snapshot_);
@@ -44,8 +44,8 @@
   const size_t block_size = 4096;
   for (size_t offset = 0; offset < view_size_; offset += block_size) {
     size_t size = std::min(view_size_ - offset, block_size);
-    if (SbMemoryCompare(snapshot_ptr + offset, buffer_ptr + offset, size)) {
-      SbMemoryCopy(snapshot_ptr + offset, buffer_ptr + offset, size);
+    if (memcmp(snapshot_ptr + offset, buffer_ptr + offset, size)) {
+      memcpy(snapshot_ptr + offset, buffer_ptr + offset, size);
       Write(snapshot_ptr + offset, size, offset);
     }
   }
diff --git a/src/net/disk_cache/blockfile/rankings.cc b/src/net/disk_cache/blockfile/rankings.cc
index d372225..6c70ae2 100644
--- a/src/net/disk_cache/blockfile/rankings.cc
+++ b/src/net/disk_cache/blockfile/rankings.cc
@@ -204,7 +204,7 @@
     : std::unique_ptr<CacheRankingsBlock>(node), rankings_(rankings) {}
 
 Rankings::Iterator::Iterator() {
-  SbMemorySet(this, 0, sizeof(Iterator));
+  memset(this, 0, sizeof(Iterator));
 }
 
 void Rankings::Iterator::Reset() {
@@ -212,7 +212,7 @@
     for (int i = 0; i < 3; i++)
       ScopedRankingsBlock(my_rankings, nodes[i]);
   }
-  SbMemorySet(this, 0, sizeof(Iterator));
+  memset(this, 0, sizeof(Iterator));
 }
 
 Rankings::Rankings() : init_(false) {}
diff --git a/src/net/disk_cache/blockfile/sparse_control.cc b/src/net/disk_cache/blockfile/sparse_control.cc
index 39e89eb..69ef3d0 100644
--- a/src/net/disk_cache/blockfile/sparse_control.cc
+++ b/src/net/disk_cache/blockfile/sparse_control.cc
@@ -209,8 +209,8 @@
       child_offset_(0),
       child_len_(0),
       result_(0) {
-  SbMemorySet(&sparse_header_, 0, sizeof(sparse_header_));
-  SbMemorySet(&child_data_, 0, sizeof(child_data_));
+  memset(&sparse_header_, 0, sizeof(sparse_header_));
+  memset(&child_data_, 0, sizeof(child_data_));
 }
 
 SparseControl::~SparseControl() {
@@ -389,7 +389,7 @@
   if (CHILD_ENTRY & entry_->GetEntryFlags())
     return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
 
-  SbMemorySet(&sparse_header_, 0, sizeof(sparse_header_));
+  memset(&sparse_header_, 0, sizeof(sparse_header_));
   sparse_header_.signature = Time::Now().ToInternalValue();
   sparse_header_.magic = kIndexMagic;
   sparse_header_.parent_key_len = entry_->GetKey().size();
@@ -670,7 +670,7 @@
 void SparseControl::InitChildData() {
   child_->SetEntryFlags(CHILD_ENTRY);
 
-  SbMemorySet(&child_data_, 0, sizeof(child_data_));
+  memset(&child_data_, 0, sizeof(child_data_));
   child_data_.header = sparse_header_;
 
   scoped_refptr<net::WrappedIOBuffer> buf =
diff --git a/src/net/disk_cache/blockfile/stats.cc b/src/net/disk_cache/blockfile/stats.cc
index 4f2e364..990ede5 100644
--- a/src/net/disk_cache/blockfile/stats.cc
+++ b/src/net/disk_cache/blockfile/stats.cc
@@ -82,11 +82,11 @@
   // We don't want to discard the whole cache every time we have one extra
   // counter; we keep old data if we can.
   if (static_cast<unsigned int>(stats->size) > sizeof(*stats)) {
-    SbMemorySet(stats, 0, sizeof(*stats));
+    memset(stats, 0, sizeof(*stats));
     stats->signature = kDiskSignature;
   } else if (static_cast<unsigned int>(stats->size) != sizeof(*stats)) {
     size_t delta = sizeof(*stats) - static_cast<unsigned int>(stats->size);
-    SbMemorySet(reinterpret_cast<char*>(stats) + stats->size, 0, delta);
+    memset(reinterpret_cast<char*>(stats) + stats->size, 0, delta);
     stats->size = sizeof(*stats);
   }
 
@@ -101,14 +101,14 @@
   OnDiskStats local_stats;
   OnDiskStats* stats = &local_stats;
   if (!num_bytes) {
-    SbMemorySet(stats, 0, sizeof(local_stats));
+    memset(stats, 0, sizeof(local_stats));
     local_stats.signature = kDiskSignature;
     local_stats.size = sizeof(local_stats);
   } else if (num_bytes >= static_cast<int>(sizeof(*stats))) {
     stats = reinterpret_cast<OnDiskStats*>(data);
     if (!VerifyStats(stats)) {
-      SbMemorySet(&local_stats, 0, sizeof(local_stats));
-      if (SbMemoryCompare(stats, &local_stats, sizeof(local_stats))) {
+      memset(&local_stats, 0, sizeof(local_stats));
+      if (memcmp(stats, &local_stats, sizeof(local_stats))) {
         return false;
       } else {
         // The storage is empty which means that SerializeStats() was never
@@ -124,8 +124,8 @@
 
   storage_addr_ = address;
 
-  SbMemoryCopy(data_sizes_, stats->data_sizes, sizeof(data_sizes_));
-  SbMemoryCopy(counters_, stats->counters, sizeof(counters_));
+  memcpy(data_sizes_, stats->data_sizes, sizeof(data_sizes_));
+  memcpy(counters_, stats->counters, sizeof(counters_));
 
   // Clean up old value.
   SetCounter(UNUSED, 0);
@@ -245,8 +245,8 @@
 
   stats->signature = kDiskSignature;
   stats->size = sizeof(*stats);
-  SbMemoryCopy(stats->data_sizes, data_sizes_, sizeof(data_sizes_));
-  SbMemoryCopy(stats->counters, counters_, sizeof(counters_));
+  memcpy(stats->data_sizes, data_sizes_, sizeof(data_sizes_));
+  memcpy(stats->counters, counters_, sizeof(counters_));
 
   *address = storage_addr_;
   return sizeof(*stats);
diff --git a/src/net/disk_cache/blockfile/stats_unittest.cc b/src/net/disk_cache/blockfile/stats_unittest.cc
index 395ddde..cbfd62b 100644
--- a/src/net/disk_cache/blockfile/stats_unittest.cc
+++ b/src/net/disk_cache/blockfile/stats_unittest.cc
@@ -19,7 +19,7 @@
   disk_cache::Stats stats;
   int required_len = stats.StorageSize();
   std::unique_ptr<char[]> storage(new char[required_len]);
-  SbMemorySet(storage.get(), 0, required_len);
+  memset(storage.get(), 0, required_len);
 
   ASSERT_TRUE(stats.Init(storage.get(), required_len, disk_cache::Addr()));
   EXPECT_EQ(0, stats.GetCounter(disk_cache::Stats::TRIM_ENTRY));
@@ -29,7 +29,7 @@
   disk_cache::Stats stats;
   int required_len = stats.StorageSize();
   std::unique_ptr<char[]> storage(new char[required_len]);
-  SbMemorySet(storage.get(), 0, required_len);
+  memset(storage.get(), 0, required_len);
 
   // Try a small buffer.
   EXPECT_LT(200, required_len);
@@ -37,7 +37,7 @@
   EXPECT_FALSE(stats.Init(storage.get(), 200, addr));
 
   // Try a buffer with garbage.
-  SbMemorySet(storage.get(), 'a', required_len);
+  memset(storage.get(), 'a', required_len);
   EXPECT_FALSE(stats.Init(storage.get(), required_len, addr));
 }
 
diff --git a/src/net/disk_cache/blockfile/storage_block_unittest.cc b/src/net/disk_cache/blockfile/storage_block_unittest.cc
index 8a662d3..632628c 100644
--- a/src/net/disk_cache/blockfile/storage_block_unittest.cc
+++ b/src/net/disk_cache/blockfile/storage_block_unittest.cc
@@ -20,7 +20,7 @@
   ASSERT_TRUE(file->Init(filename, 8192));
 
   CacheEntryBlock entry1(file.get(), disk_cache::Addr(0xa0010001));
-  SbMemorySet(entry1.Data(), 0, sizeof(disk_cache::EntryStore));
+  memset(entry1.Data(), 0, sizeof(disk_cache::EntryStore));
   entry1.Data()->hash = 0xaa5555aa;
   entry1.Data()->rankings_node = 0xa0010002;
 
diff --git a/src/net/disk_cache/blockfile/trace.cc b/src/net/disk_cache/blockfile/trace.cc
index 04fb858..43930c2 100644
--- a/src/net/disk_cache/blockfile/trace.cc
+++ b/src/net/disk_cache/blockfile/trace.cc
@@ -98,7 +98,7 @@
     return;
 
   s_trace_buffer = new TraceBuffer;
-  SbMemorySet(s_trace_buffer, 0, sizeof(*s_trace_buffer));
+  memset(s_trace_buffer, 0, sizeof(*s_trace_buffer));
 }
 
 void DestroyTrace(void) {
@@ -135,7 +135,7 @@
     if (!s_trace_buffer || !s_trace_enabled)
       return;
 
-    SbMemoryCopy(s_trace_buffer->buffer[s_trace_buffer->current], line,
+    memcpy(s_trace_buffer->buffer[s_trace_buffer->current], line,
                  kEntrySize);
 
     s_trace_buffer->num_traces++;
@@ -161,9 +161,9 @@
       current += kNumberOfEntries;
 
     for (int i = 0; i < num_traces; i++) {
-      SbMemoryCopy(line, s_trace_buffer->buffer[current], kEntrySize);
+      memcpy(line, s_trace_buffer->buffer[current], kEntrySize);
       line[kEntrySize] = '\0';
-      size_t length = SbStringGetLength(line);
+      size_t length = strlen(line);
       if (length) {
         line[length] = '\n';
         line[length + 1] = '\0';
diff --git a/src/net/disk_cache/entry_unittest.cc b/src/net/disk_cache/entry_unittest.cc
index 2fc194c..939e2d1 100644
--- a/src/net/disk_cache/entry_unittest.cc
+++ b/src/net/disk_cache/entry_unittest.cc
@@ -98,7 +98,7 @@
   base::strlcpy(buffer1->data(), "the data", kSize1);
   EXPECT_EQ(10, entry->WriteData(0, 0, buffer1.get(), kSize1,
                                  net::CompletionOnceCallback(), false));
-  SbMemorySet(buffer1->data(), 0, kSize1);
+  memset(buffer1->data(), 0, kSize1);
   EXPECT_EQ(10, entry->ReadData(0, 0, buffer1.get(), kSize1,
                                 net::CompletionOnceCallback()));
   EXPECT_STREQ("the data", buffer1->data());
@@ -109,18 +109,18 @@
       base::MakeRefCounted<net::IOBuffer>(kSize2);
   scoped_refptr<net::IOBuffer> buffer3 =
       base::MakeRefCounted<net::IOBuffer>(kSize3);
-  SbMemorySet(buffer3->data(), 0, kSize3);
+  memset(buffer3->data(), 0, kSize3);
   CacheTestFillBuffer(buffer2->data(), kSize2, false);
   base::strlcpy(buffer2->data(), "The really big data goes here", kSize2);
   EXPECT_EQ(5000, entry->WriteData(1, 1500, buffer2.get(), kSize2,
                                    net::CompletionOnceCallback(), false));
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  memset(buffer2->data(), 0, kSize2);
   EXPECT_EQ(4989, entry->ReadData(1, 1511, buffer2.get(), kSize2,
                                   net::CompletionOnceCallback()));
   EXPECT_STREQ("big data goes here", buffer2->data());
   EXPECT_EQ(5000, entry->ReadData(1, 0, buffer2.get(), kSize2,
                                   net::CompletionOnceCallback()));
-  EXPECT_EQ(0, SbMemoryCompare(buffer2->data(), buffer3->data(), 1500));
+  EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500));
   EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2.get(), kSize2,
                                   net::CompletionOnceCallback()));
 
@@ -238,7 +238,7 @@
     expected++;
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  memset(buffer2->data(), 0, kSize2);
   ret = entry->ReadData(
       0,
       0,
@@ -265,7 +265,7 @@
     expected++;
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
-  SbMemorySet(buffer3->data(), 0, kSize3);
+  memset(buffer3->data(), 0, kSize3);
   ret = entry->ReadData(
       1,
       1511,
@@ -288,10 +288,10 @@
   if (net::ERR_IO_PENDING == ret)
     expected++;
 
-  SbMemorySet(buffer3->data(), 0, kSize3);
+  memset(buffer3->data(), 0, kSize3);
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
-  EXPECT_EQ(0, SbMemoryCompare(buffer2->data(), buffer3->data(), 1500));
+  EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500));
   ret = entry->ReadData(
       1,
       5000,
@@ -390,7 +390,7 @@
   base::strlcpy(buffer1->data(), "the data", kSize1);
   EXPECT_EQ(17000, entry->WriteData(0, 0, buffer1.get(), kSize1,
                                     net::CompletionOnceCallback(), false));
-  SbMemorySet(buffer1->data(), 0, kSize1);
+  memset(buffer1->data(), 0, kSize1);
   EXPECT_EQ(17000, entry->ReadData(0, 0, buffer1.get(), kSize1,
                                    net::CompletionOnceCallback()));
   EXPECT_STREQ("the data", buffer1->data());
@@ -398,7 +398,7 @@
   base::strlcpy(buffer2->data(), "The really big data goes here", kSize2);
   EXPECT_EQ(25000, entry->WriteData(1, 10000, buffer2.get(), kSize2,
                                     net::CompletionOnceCallback(), false));
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  memset(buffer2->data(), 0, kSize2);
   EXPECT_EQ(24989, entry->ReadData(1, 10011, buffer2.get(), kSize2,
                                    net::CompletionOnceCallback()));
   EXPECT_STREQ("big data goes here", buffer2->data());
@@ -498,7 +498,7 @@
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
 
-  SbMemorySet(buffer2->data(), 0, kSize1);
+  memset(buffer2->data(), 0, kSize1);
   ret = entry->ReadData(
       0,
       0,
@@ -526,7 +526,7 @@
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
 
-  SbMemorySet(buffer3->data(), 0, kSize3);
+  memset(buffer3->data(), 0, kSize3);
   ret = entry->ReadData(
       1,
       10011,
@@ -550,8 +550,8 @@
     expected++;
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
-  SbMemorySet(buffer3->data(), 0, kSize3);
-  EXPECT_EQ(0, SbMemoryCompare(buffer2->data(), buffer3->data(), 10000));
+  memset(buffer3->data(), 0, kSize3);
+  EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 10000));
   ret = entry->ReadData(
       1,
       30000,
@@ -671,9 +671,9 @@
     EXPECT_EQ(
         kBufferSize,
         WriteData(entry, i, 0, reference_buffers[i].get(), kBufferSize, false));
-    SbMemorySet(buffer1->data(), 0, kBufferSize);
+    memset(buffer1->data(), 0, kBufferSize);
     EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer1.get(), kBufferSize));
-    EXPECT_EQ(0, SbMemoryCompare(reference_buffers[i]->data(), buffer1->data(),
+    EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer1->data(),
                                  kBufferSize));
   }
   EXPECT_EQ(net::ERR_INVALID_ARGUMENT,
@@ -690,17 +690,17 @@
   scoped_refptr<net::IOBuffer> buffer2 =
       base::MakeRefCounted<net::IOBuffer>(kReadBufferSize);
   for (int i = 0; i < kNumStreams; i++) {
-    SbMemorySet(buffer2->data(), 0, kReadBufferSize);
+    memset(buffer2->data(), 0, kReadBufferSize);
     EXPECT_EQ(kReadBufferSize,
               ReadData(entry, i, 0, buffer2.get(), kReadBufferSize));
-    EXPECT_EQ(0, SbMemoryCompare(reference_buffers[i]->data(), buffer2->data(),
+    EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer2->data(),
                                  kReadBufferSize));
 
-    SbMemorySet(buffer2->data(), 0, kReadBufferSize);
+    memset(buffer2->data(), 0, kReadBufferSize);
     EXPECT_EQ(
         kFinalReadSize,
         ReadData(entry, i, kReadBufferSize, buffer2.get(), kReadBufferSize));
-    EXPECT_EQ(0, SbMemoryCompare(reference_buffers[i]->data() + kReadBufferSize,
+    EXPECT_EQ(0, memcmp(reference_buffers[i]->data() + kReadBufferSize,
                                  buffer2->data(), kFinalReadSize));
   }
 
@@ -846,7 +846,7 @@
   scoped_refptr<net::IOBuffer> buffer2 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
   CacheTestFillBuffer(buffer1->data(), kSize, false);
-  SbMemorySet(buffer2->data(), 0, kSize);
+  memset(buffer2->data(), 0, kSize);
 
   base::strlcpy(buffer1->data(), "the data", kSize);
   EXPECT_EQ(10, WriteData(entry, stream_index, 0, buffer1.get(), 10, false));
@@ -858,16 +858,16 @@
             WriteData(entry, stream_index, 0, buffer1.get(), 2000, false));
   EXPECT_EQ(2000, entry->GetDataSize(stream_index));
   EXPECT_EQ(2000, ReadData(entry, stream_index, 0, buffer2.get(), 2000));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), 2000));
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000));
 
   EXPECT_EQ(20000,
             WriteData(entry, stream_index, 0, buffer1.get(), kSize, false));
   EXPECT_EQ(20000, entry->GetDataSize(stream_index));
   EXPECT_EQ(20000, ReadData(entry, stream_index, 0, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize));
   entry->Close();
 
-  SbMemorySet(buffer2->data(), 0, kSize);
+  memset(buffer2->data(), 0, kSize);
   std::string key2("Second key");
   ASSERT_THAT(CreateEntry(key2, &entry), IsOk());
   EXPECT_EQ(10, WriteData(entry, stream_index, 0, buffer1.get(), 10, false));
@@ -880,9 +880,9 @@
             WriteData(entry, stream_index, 0, buffer1.get(), 2000, false));
   EXPECT_EQ(2000, entry->GetDataSize(stream_index));
   EXPECT_EQ(2000, ReadData(entry, stream_index, 0, buffer2.get(), 2000));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), 2000));
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000));
   entry->Close();
-  SbMemorySet(buffer2->data(), 0, kSize);
+  memset(buffer2->data(), 0, kSize);
 
   // Go from an internal address to an external one.
   ASSERT_THAT(OpenEntry(key2, &entry), IsOk());
@@ -890,7 +890,7 @@
             WriteData(entry, stream_index, 0, buffer1.get(), kSize, false));
   EXPECT_EQ(20000, entry->GetDataSize(stream_index));
   EXPECT_EQ(20000, ReadData(entry, stream_index, 0, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize));
   entry->Close();
 
   // Double check the size from disk.
@@ -937,7 +937,7 @@
       base::MakeRefCounted<net::IOBuffer>(kSize2);
 
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  memset(buffer2->data(), 0, kSize2);
 
   // Simple truncation:
   EXPECT_EQ(200, WriteData(entry, stream_index, 0, buffer1.get(), 200, false));
@@ -958,8 +958,8 @@
             WriteData(entry, stream_index, 0, buffer1.get(), 20000, true));
   EXPECT_EQ(20000, entry->GetDataSize(stream_index));
   EXPECT_EQ(20000, ReadData(entry, stream_index, 0, buffer2.get(), 20000));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), 20000));
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000));
+  memset(buffer2->data(), 0, kSize2);
 
   // External file truncation
   EXPECT_EQ(18000,
@@ -976,9 +976,9 @@
             WriteData(entry, stream_index, 1000, buffer1.get(), 600, true));
   EXPECT_EQ(1600, entry->GetDataSize(stream_index));
   EXPECT_EQ(600, ReadData(entry, stream_index, 1000, buffer2.get(), 600));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), 600));
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600));
   EXPECT_EQ(1000, ReadData(entry, stream_index, 0, buffer2.get(), 1000));
-  EXPECT_TRUE(!SbMemoryCompare(buffer1->data(), buffer2->data(), 1000))
+  EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000))
       << "Preserves previous data";
 
   // Go from external file to zero length.
@@ -1034,15 +1034,15 @@
 
   CacheTestFillBuffer(buffer->data(), kSize, false);
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 500, buffer.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer->data(), zeros, kSize));
+  EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
 
   CacheTestFillBuffer(buffer->data(), kSize, false);
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 5000, buffer.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer->data(), zeros, kSize));
+  EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
 
   CacheTestFillBuffer(buffer->data(), kSize, false);
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 50000, buffer.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer->data(), zeros, kSize));
+  EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
 
   entry->Close();
 }
@@ -1086,7 +1086,7 @@
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1.get(), kSize, false));
   EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
 
   // Now go to an external file.
   EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1.get(), kSize, false));
@@ -1097,13 +1097,13 @@
   EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1.get(), kSize, false));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
 
   // Extend the file some more.
   EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1.get(), kSize, false));
@@ -1117,29 +1117,29 @@
   EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, false));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
 
   EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1.get(), kSize, false));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data() + 100, 100));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100));
 
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data() + 100, 100));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100));
 
   // Extend the file again and read before without closing the entry.
   EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, false));
   EXPECT_EQ(kSize, WriteData(entry, 1, 45000, buffer1.get(), kSize, false));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 25000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, 1, 45000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), buffer1->data(), kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
 
   entry->Close();
 }
@@ -1209,21 +1209,21 @@
             WriteData(entry, stream_index, 25000, buffer1.get(), kSize, true));
   EXPECT_EQ(25000 + kSize, entry->GetDataSize(stream_index));
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 24000, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), zeros, kSize));
+  EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize));
 
   // Read at the end of the old file size.
   EXPECT_EQ(
       kSize,
       ReadData(entry, stream_index, 23000 + kSize - 35, buffer2.get(), kSize));
   EXPECT_TRUE(
-      !SbMemoryCompare(buffer2->data(), buffer1->data() + kSize - 35, 35));
+      !memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35));
 
   // Read slightly before the last write.
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 24900, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), zeros, 100));
+  EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
   EXPECT_TRUE(
-      !SbMemoryCompare(buffer2->data() + 100, buffer1->data(), kSize - 100));
+      !memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
 
   // Extend the entry a little more.
   EXPECT_EQ(kSize,
@@ -1231,9 +1231,9 @@
   EXPECT_EQ(26000 + kSize, entry->GetDataSize(stream_index));
   CacheTestFillBuffer(buffer2->data(), kSize, true);
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 25900, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), zeros, 100));
+  EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
   EXPECT_TRUE(
-      !SbMemoryCompare(buffer2->data() + 100, buffer1->data(), kSize - 100));
+      !memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
 
   // And now reduce the size.
   EXPECT_EQ(kSize,
@@ -1243,7 +1243,7 @@
       28,
       ReadData(entry, stream_index, 25000 + kSize - 28, buffer2.get(), kSize));
   EXPECT_TRUE(
-      !SbMemoryCompare(buffer2->data(), buffer1->data() + kSize - 28, 28));
+      !memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28));
 
   // Reduce the size with a buffer that is not extending the size.
   EXPECT_EQ(kSize,
@@ -1253,18 +1253,18 @@
             WriteData(entry, stream_index, 24500, buffer1.get(), kSize, true));
   EXPECT_EQ(24500 + kSize, entry->GetDataSize(stream_index));
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 23900, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), zeros, 100));
+  EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
   EXPECT_TRUE(
-      !SbMemoryCompare(buffer2->data() + 100, buffer1->data(), kSize - 100));
+      !memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
 
   // And now reduce the size below the old size.
   EXPECT_EQ(kSize,
             WriteData(entry, stream_index, 19000, buffer1.get(), kSize, true));
   EXPECT_EQ(19000 + kSize, entry->GetDataSize(stream_index));
   EXPECT_EQ(kSize, ReadData(entry, stream_index, 18900, buffer2.get(), kSize));
-  EXPECT_TRUE(!SbMemoryCompare(buffer2->data(), zeros, 100));
+  EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
   EXPECT_TRUE(
-      !SbMemoryCompare(buffer2->data() + 100, buffer1->data(), kSize - 100));
+      !memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
 
   // Verify that the actual file is truncated.
   entry->Close();
@@ -1277,7 +1277,7 @@
       WriteData(entry, stream_index, 20000 + kSize, buffer1.get(), 0, false));
   EXPECT_EQ(kSize,
             ReadData(entry, stream_index, 19000 + kSize, buffer1.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), zeros, kSize));
+  EXPECT_EQ(0, memcmp(buffer1->data(), zeros, kSize));
 
   entry->Close();
 }
@@ -1364,14 +1364,14 @@
       base::MakeRefCounted<net::IOBuffer>(kSize3);
 
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  memset(buffer2->data(), 0, kSize2);
 
   // Simple data grow:
   EXPECT_EQ(200,
             WriteData(entry, stream_index, 400, buffer1.get(), 200, false));
   EXPECT_EQ(600, entry->GetDataSize(stream_index));
   EXPECT_EQ(100, ReadData(entry, stream_index, 300, buffer3.get(), 100));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer2->data(), 100));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
   entry->Close();
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
 
@@ -1380,7 +1380,7 @@
             WriteData(entry, stream_index, 800, buffer1.get(), 200, false));
   EXPECT_EQ(1000, entry->GetDataSize(stream_index));
   EXPECT_EQ(100, ReadData(entry, stream_index, 700, buffer3.get(), 100));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer2->data(), 100));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
   entry->Close();
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
 
@@ -1389,35 +1389,35 @@
             WriteData(entry, stream_index, 1800, buffer1.get(), 200, true));
   EXPECT_EQ(2000, entry->GetDataSize(stream_index));
   EXPECT_EQ(100, ReadData(entry, stream_index, 1500, buffer3.get(), 100));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer2->data(), 100));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
 
   // Go to an external file.
   EXPECT_EQ(200,
             WriteData(entry, stream_index, 19800, buffer1.get(), 200, false));
   EXPECT_EQ(20000, entry->GetDataSize(stream_index));
   EXPECT_EQ(4000, ReadData(entry, stream_index, 14000, buffer3.get(), 4000));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer2->data(), 4000));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000));
 
   // And back to an internal block.
   EXPECT_EQ(600,
             WriteData(entry, stream_index, 1000, buffer1.get(), 600, true));
   EXPECT_EQ(1600, entry->GetDataSize(stream_index));
   EXPECT_EQ(600, ReadData(entry, stream_index, 1000, buffer3.get(), 600));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer1->data(), 600));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600));
 
   // Extend it again.
   EXPECT_EQ(600,
             WriteData(entry, stream_index, 2000, buffer1.get(), 600, false));
   EXPECT_EQ(2600, entry->GetDataSize(stream_index));
   EXPECT_EQ(200, ReadData(entry, stream_index, 1800, buffer3.get(), 200));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer2->data(), 200));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200));
 
   // And again (with truncation flag).
   EXPECT_EQ(600,
             WriteData(entry, stream_index, 3000, buffer1.get(), 600, true));
   EXPECT_EQ(3600, entry->GetDataSize(stream_index));
   EXPECT_EQ(200, ReadData(entry, stream_index, 2800, buffer3.get(), 200));
-  EXPECT_TRUE(!SbMemoryCompare(buffer3->data(), buffer2->data(), 200));
+  EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200));
 
   entry->Close();
 }
@@ -1573,12 +1573,12 @@
   scoped_refptr<net::IOBuffer> buffer2 =
       base::MakeRefCounted<net::IOBuffer>(kSize2);
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  SbMemorySet(buffer2->data(), 0, kSize2);
+  memset(buffer2->data(), 0, kSize2);
 
   EXPECT_EQ(2000,
             WriteData(entry, stream_index, 0, buffer1.get(), 2000, false));
   EXPECT_EQ(2000, ReadData(entry, stream_index, 0, buffer2.get(), 2000));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), buffer2->data(), kSize1));
+  EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1));
   EXPECT_EQ(key, entry->GetKey());
   EXPECT_TRUE(initial < entry->GetLastModified());
   EXPECT_TRUE(initial < entry->GetLastUsed());
@@ -1675,7 +1675,7 @@
                     net::IOBuffer* buf_2) {
   net::TestCompletionCallback cb;
 
-  SbMemorySet(buf_2->data(), 0, size);
+  memset(buf_2->data(), 0, size);
   int ret = entry->ReadSparseData(offset, buf_2, size, cb.callback());
   EXPECT_EQ(0, cb.GetResult(ret));
 
@@ -1685,7 +1685,7 @@
   ret = entry->ReadSparseData(offset, buf_2, size, cb.callback());
   EXPECT_EQ(size, cb.GetResult(ret));
 
-  EXPECT_EQ(0, SbMemoryCompare(buf_1->data(), buf_2->data(), size));
+  EXPECT_EQ(0, memcmp(buf_1->data(), buf_2->data(), size));
 }
 
 // Reads |size| bytes from |entry| at |offset| and verifies that they are the
@@ -1698,10 +1698,10 @@
 
   scoped_refptr<net::IOBuffer> buf_1 =
       base::MakeRefCounted<net::IOBuffer>(size);
-  SbMemorySet(buf_1->data(), 0, size);
+  memset(buf_1->data(), 0, size);
   int ret = entry->ReadSparseData(offset, buf_1.get(), size, cb.callback());
   EXPECT_EQ(size, cb.GetResult(ret));
-  EXPECT_EQ(0, SbMemoryCompare(buf_1->data(), buffer, size));
+  EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size));
 }
 
 void DiskCacheEntryTest::BasicSparseIO() {
@@ -1996,7 +1996,7 @@
   rv = entry->ReadSparseData(start, buf_2.get(), kSize, cb.callback());
   EXPECT_EQ(80, cb.GetResult(rv));
   EXPECT_EQ(
-      0, SbMemoryCompare(buf_1.get()->data() + 100, buf_2.get()->data(), 80));
+      0, memcmp(buf_1.get()->data() + 100, buf_2.get()->data(), 80));
 
   // And even that part is dropped when another write changes the offset.
   offset = start;
@@ -2038,7 +2038,7 @@
     rv = entry->ReadSparseData(offset, buf_2.get(), kSize, cb.callback());
     EXPECT_EQ(kSize, cb.GetResult(rv));
     EXPECT_EQ(0,
-              SbMemoryCompare(buf_1.get()->data(), buf_2.get()->data(), kSize));
+              memcmp(buf_1.get()->data(), buf_2.get()->data(), kSize));
   }
 
   entry->Close();
@@ -2054,7 +2054,7 @@
   rv = entry->ReadSparseData(offset, buf_2.get(), kSize, cb.callback());
   EXPECT_EQ(kSize, cb.GetResult(rv));
   EXPECT_EQ(0,
-            SbMemoryCompare(buf_1.get()->data(), buf_2.get()->data(), kSize));
+            memcmp(buf_1.get()->data(), buf_2.get()->data(), kSize));
 
   entry->Close();
 }
@@ -2387,11 +2387,11 @@
 
   scoped_refptr<net::IOBuffer> buf2 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
-  SbMemorySet(buf2->data(), 0, kSize);
+  memset(buf2->data(), 0, kSize);
   EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2.get(), kSize));
 
   EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buf2->data(), buf1->data() + kSize - 500, 500));
+  EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500));
   EXPECT_EQ(0, ReadSparseData(entry, 0, buf2.get(), kSize));
 
   // This read should not change anything.
@@ -2451,8 +2451,8 @@
   EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv));
   EXPECT_EQ(1024, start);
   EXPECT_EQ(kSize, ReadSparseData(entry, kSize, buf2.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buf2->data(), buf1->data() + kSize - 500, 500));
-  EXPECT_EQ(0, SbMemoryCompare(buf2->data() + 500, buf1->data(), kSize - 500));
+  EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500));
+  EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500));
 
   entry->Close();
 }
@@ -2594,7 +2594,7 @@
   // We have reserved space for a short key (one block), let's say that the key
   // takes more than one block, and remove the NULLs after the actual key.
   store->key_len = 800;
-  SbMemorySet(store->key + key.size(), 'k', sizeof(store->key) - key.size());
+  memset(store->key + key.size(), 'k', sizeof(store->key) - key.size());
   entry_impl->entry()->set_modified();
   entry->Close();
 
@@ -2804,7 +2804,7 @@
 
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(data_size);
-  SbMemorySet(buffer->data(), 'A', data_size);
+  memset(buffer->data(), 'A', data_size);
 
   EXPECT_EQ(data_size, WriteData(entry, 1, 0, buffer.get(), data_size, false));
   entry->Close();
@@ -3147,7 +3147,7 @@
 
   helper.WaitUntilCacheIoFinished(expected_callback_runs);
   ASSERT_EQ(read_buffer->size(), write_buffer->size());
-  EXPECT_EQ(0, SbMemoryCompare(read_buffer->data(), write_buffer->data(),
+  EXPECT_EQ(0, memcmp(read_buffer->data(), write_buffer->data(),
                                read_buffer->size()));
 }
 
@@ -3212,7 +3212,7 @@
                 base::Bind(&CallbackTest::Run, base::Unretained(&callback3))));
   expected++;
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), buffer1_read->data(), kSize1));
+  EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1));
 
   // At this point after waiting, the pending operations queue on the entry
   // should be empty, so the next Write operation must run as optimistic.
@@ -3237,7 +3237,7 @@
   expected++;
 
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
-  EXPECT_EQ(0, SbMemoryCompare(buffer2->data(), buffer2_read->data(), kSize2));
+  EXPECT_EQ(0, memcmp(buffer2->data(), buffer2_read->data(), kSize2));
 
   // Check that we are not leaking.
   EXPECT_NE(entry, null);
@@ -3447,7 +3447,7 @@
   EXPECT_EQ(net::ERR_IO_PENDING,
             entry->ReadData(1, 0, buffer1_read.get(), kSize1, cb.callback()));
   EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), buffer1_read->data(), kSize1));
+  EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1));
 
   entry->Doom();
 }
@@ -3899,7 +3899,7 @@
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
   EXPECT_EQ(kReadBufferSize, read_callback.last_result());
   EXPECT_EQ(kReadBufferSize, truncate_callback.last_result());
-  EXPECT_EQ(0, SbMemoryCompare(write_buffer->data(), read_buffer->data(),
+  EXPECT_EQ(0, memcmp(write_buffer->data(), read_buffer->data(),
                                kReadBufferSize));
 }
 
@@ -3950,7 +3950,7 @@
   EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
   EXPECT_EQ(kBufferSize, write_callback.last_result());
   EXPECT_EQ(kBufferSize, read_callback.last_result());
-  EXPECT_EQ(0, SbMemoryCompare(write_buffer->data(), read_buffer->data(),
+  EXPECT_EQ(0, memcmp(write_buffer->data(), read_buffer->data(),
                                kBufferSize));
 }
 
@@ -4053,7 +4053,7 @@
       base::MakeRefCounted<net::IOBuffer>(buf_len);
   EXPECT_EQ(buf_len, ReadData(entry2, 1, offset, buffer1_read1.get(), buf_len));
   EXPECT_EQ(0,
-            SbMemoryCompare(buffer1->data(), buffer1_read1->data(), buf_len));
+            memcmp(buffer1->data(), buffer1_read1->data(), buf_len));
 
   // Read the second half of the data.
   offset = buf_len;
@@ -4062,7 +4062,7 @@
       base::MakeRefCounted<net::IOBuffer>(buf_len);
   EXPECT_EQ(buf_len, ReadData(entry2, 1, offset, buffer1_read2.get(), buf_len));
   char* buffer1_data = buffer1->data() + offset;
-  EXPECT_EQ(0, SbMemoryCompare(buffer1_data, buffer1_read2->data(), buf_len));
+  EXPECT_EQ(0, memcmp(buffer1_data, buffer1_read2->data(), buf_len));
 
   // Check that we are not leaking.
   EXPECT_NE(entry, null);
@@ -4091,7 +4091,7 @@
       base::MakeRefCounted<net::IOBuffer>(kSize);
   CacheTestFillBuffer(buffer1->data(), kSize, false);
   char* buffer1_data = buffer1->data() + kHalfSize;
-  SbMemoryCopy(buffer2->data(), buffer1_data, kHalfSize);
+  memcpy(buffer2->data(), buffer1_data, kHalfSize);
 
   disk_cache::Entry* entry = NULL;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
@@ -4117,7 +4117,7 @@
         base::MakeRefCounted<net::IOBuffer>(kSize);
     EXPECT_EQ(kSize, ReadData(entry, i, 0, buffer1_read1.get(), kSize));
     EXPECT_EQ(0,
-              SbMemoryCompare(buffer1->data(), buffer1_read1->data(), kSize));
+              memcmp(buffer1->data(), buffer1_read1->data(), kSize));
     // Check that we are not leaking.
     ASSERT_NE(entry, null);
     EXPECT_TRUE(static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
@@ -4145,7 +4145,7 @@
   // Write something into stream0.
   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), buffer_read->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
   entry->Close();
 
   // Extend stream1.
@@ -4182,7 +4182,7 @@
 
   buffer_read = base::MakeRefCounted<net::IOBuffer>(kSize);
   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), buffer_read->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
 
   // Shrink stream1.
   stream1_size = 50;
@@ -4194,7 +4194,7 @@
   buffer_read = base::MakeRefCounted<net::IOBuffer>(kSize);
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), buffer_read->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
   entry->Close();
   entry = NULL;
 }
@@ -4243,8 +4243,8 @@
         base::MakeRefCounted<net::IOBuffer>(kSize);
     EXPECT_EQ(kSize, ReadData(entry, i, 0, buffer1_read1.get(), kSize));
     EXPECT_EQ(
-        0, SbMemoryCompare(buffer1->data(), buffer1_read1->data(), kHalfSize));
-    EXPECT_EQ(0, SbMemoryCompare(buffer2->data(),
+        0, memcmp(buffer1->data(), buffer1_read1->data(), kHalfSize));
+    EXPECT_EQ(0, memcmp(buffer2->data(),
                                  buffer1_read1->data() + kHalfSize, kHalfSize));
 
     entry->Close();
@@ -4358,7 +4358,7 @@
 
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   EXPECT_EQ(kHalfSize, ReadData(entry, 2, 0, buffer2.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), buffer2->data(), kHalfSize));
+  EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kHalfSize));
   entry->Close();
   EXPECT_TRUE(SimpleCacheThirdStreamFileExists(key));
 
@@ -4887,10 +4887,10 @@
   // re-open it).
   EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
   EXPECT_EQ(kSize, ReadData(entry1, 0, 0, read_buffer.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer1->data(), read_buffer->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer1->data(), read_buffer->data(), kSize));
 
   EXPECT_EQ(kSize, ReadData(entry2, 0, 0, read_buffer.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer2->data(), read_buffer->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer2->data(), read_buffer->data(), kSize));
 
   entry1->Close();
   entry2->Close();
@@ -4924,7 +4924,7 @@
   scoped_refptr<net::IOBuffer> buffer2 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
   EXPECT_EQ(kSize, ReadSparseData(entry, 5, buffer2.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), buffer2->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer->data(), buffer2->data(), kSize));
   entry->Close();
 }
 
@@ -4998,10 +4998,10 @@
   scoped_refptr<net::IOBuffer> buffer2 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
   EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize));
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), buffer2->data(), kSize));
+  EXPECT_EQ(0, memcmp(buffer->data(), buffer2->data(), kSize));
   EXPECT_EQ(kSize, ReadData(entry, 1, kSize, buffer2.get(), kSize));
   EXPECT_EQ(
-      0, SbMemoryCompare(big_buffer->data() + kSize, buffer2->data(), kSize));
+      0, memcmp(big_buffer->data() + kSize, buffer2->data(), kSize));
   entry->Close();
 }
 
@@ -5070,7 +5070,7 @@
     // would be whether the result has a checkum or not.
     scoped_refptr<net::IOBuffer> second_half =
         base::MakeRefCounted<net::IOBuffer>(kRemSize);
-    SbMemoryCopy(second_half->data(), payload_->data() + kHalfSize, kRemSize);
+    memcpy(second_half->data(), payload_->data() + kHalfSize, kRemSize);
     ASSERT_EQ(kRemSize, WriteData(entry, 1, kHalfSize, second_half.get(),
                                   kRemSize, false));
     entry->Close();
@@ -5083,7 +5083,7 @@
         base::MakeRefCounted<net::IOBuffer>(kEntrySize);
     EXPECT_EQ(kEntrySize, ReadData(entry, 1, 0, read_buf.get(), kEntrySize));
     EXPECT_EQ(0,
-              SbMemoryCompare(read_buf->data(), payload_->data(), kEntrySize));
+              memcmp(read_buf->data(), payload_->data(), kEntrySize));
     entry->Close();
   }
 
@@ -5244,6 +5244,6 @@
   // if needed.
   EXPECT_EQ(kEntrySize, entry->ReadData(1, 0, read_buf.get(), kEntrySize,
                                         net::CompletionOnceCallback()));
-  EXPECT_EQ(0, SbMemoryCompare(read_buf->data(), payload_->data(), kEntrySize));
+  EXPECT_EQ(0, memcmp(read_buf->data(), payload_->data(), kEntrySize));
   entry->Close();
 }
diff --git a/src/net/disk_cache/simple/simple_entry_impl.cc b/src/net/disk_cache/simple/simple_entry_impl.cc
index 45284e2..50cb20a 100644
--- a/src/net/disk_cache/simple/simple_entry_impl.cc
+++ b/src/net/disk_cache/simple/simple_entry_impl.cc
@@ -473,7 +473,7 @@
     // operations.
     if (buf) {
       op_buf = base::MakeRefCounted<IOBuffer>(buf_len);
-      SbMemoryCopy(op_buf->data(), buf->data(), buf_len);
+      memcpy(op_buf->data(), buf->data(), buf_len);
     }
     op_callback = CompletionOnceCallback();
     ret_value = buf_len;
@@ -1537,7 +1537,7 @@
                                     net::IOBuffer* out_buf) {
   DCHECK_GE(buf_len, 0);
 
-  SbMemoryCopy(out_buf->data(), in_buf->data() + offset, buf_len);
+  memcpy(out_buf->data(), in_buf->data() + offset, buf_len);
   UpdateDataFromEntryStat(SimpleEntryStat(base::Time::Now(), last_modified_,
                                           data_size_, sparse_data_size_));
   RecordReadResult(cache_type_, READ_RESULT_SUCCESS);
@@ -1557,7 +1557,7 @@
   int data_size = GetDataSize(0);
   if (offset == 0 && truncate) {
     stream_0_data_->SetCapacity(buf_len);
-    SbMemoryCopy(stream_0_data_->data(), buf->data(), buf_len);
+    memcpy(stream_0_data_->data(), buf->data(), buf_len);
     data_size_[0] = buf_len;
   } else {
     const int buffer_size =
@@ -1567,9 +1567,9 @@
     // zero-filled.
     const int fill_size = offset <= data_size ? 0 : offset - data_size;
     if (fill_size > 0)
-      SbMemorySet(stream_0_data_->data() + data_size, 0, fill_size);
+      memset(stream_0_data_->data() + data_size, 0, fill_size);
     if (buf)
-      SbMemoryCopy(stream_0_data_->data() + offset, buf->data(), buf_len);
+      memcpy(stream_0_data_->data() + offset, buf->data(), buf_len);
     data_size_[0] = buffer_size;
   }
   RecordHeaderSize(cache_type_, data_size_[0]);
diff --git a/src/net/disk_cache/simple/simple_synchronous_entry.cc b/src/net/disk_cache/simple/simple_synchronous_entry.cc
index 262b9ed..e4cd4c3 100644
--- a/src/net/disk_cache/simple/simple_synchronous_entry.cc
+++ b/src/net/disk_cache/simple/simple_synchronous_entry.cc
@@ -149,7 +149,7 @@
     : last_used_(last_used),
       last_modified_(last_modified),
       sparse_data_size_(sparse_data_size) {
-  SbMemoryCopy(data_size_, data_size, sizeof(data_size_));
+  memcpy(data_size_, data_size, sizeof(data_size_));
 }
 
 // These size methods all assume the presence of the SHA256 on stream zero,
@@ -1523,7 +1523,7 @@
         end_numeric >= file_0_prefetch.size())
       return false;
 
-    SbMemoryCopy(dest, file_0_prefetch.data() + offset, size);
+    memcpy(dest, file_0_prefetch.data() + offset, size);
     return true;
   }
 }
diff --git a/src/net/dns/address_sorter_posix.cc b/src/net/dns/address_sorter_posix.cc
index 5370252..a1ff2ce 100644
--- a/src/net/dns/address_sorter_posix.cc
+++ b/src/net/dns/address_sorter_posix.cc
@@ -376,9 +376,9 @@
     info.native = info.home = info.deprecated = false;
     if (ifa->ifa_addr->sa_family == AF_INET6) {
       struct in6_ifreq ifr = {};
-      SbStringCopy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name) - 1);
+      strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name) - 1);
       DCHECK_LE(ifa->ifa_addr->sa_len, sizeof(ifr.ifr_ifru.ifru_addr));
-      SbMemoryCopy(&ifr.ifr_ifru.ifru_addr, ifa->ifa_addr,
+      memcpy(&ifr.ifr_ifru.ifru_addr, ifa->ifa_addr,
                    ifa->ifa_addr->sa_len);
       int rv = ioctl(ioctl_socket, SIOCGIFAFLAG_IN6, &ifr);
       if (rv >= 0) {
diff --git a/src/net/dns/dns_config_service_posix.cc b/src/net/dns/dns_config_service_posix.cc
index 5a6eb1b..17036cc 100644
--- a/src/net/dns/dns_config_service_posix.cc
+++ b/src/net/dns/dns_config_service_posix.cc
@@ -153,7 +153,7 @@
 #if defined(OS_OPENBSD) || defined(OS_FUCHSIA)
   // Note: res_ninit in glibc always returns 0 and sets RES_INIT.
   // res_init behaves the same way.
-  SbMemorySet(&_res, 0, sizeof(_res));
+  memset(&_res, 0, sizeof(_res));
   if (res_init() == 0) {
     result = ConvertResStateToDnsConfig(_res, dns_config);
   } else {
@@ -161,7 +161,7 @@
   }
 #else  // all other OS_POSIX
   struct __res_state res;
-  SbMemorySet(&res, 0, sizeof(res));
+  memset(&res, 0, sizeof(res));
   if (res_ninit(&res) == 0) {
     result = ConvertResStateToDnsConfig(res, dns_config);
   } else {
diff --git a/src/net/dns/dns_config_service_posix_unittest.cc b/src/net/dns/dns_config_service_posix_unittest.cc
index 1eb8d0a..2275fa7 100644
--- a/src/net/dns/dns_config_service_posix_unittest.cc
+++ b/src/net/dns/dns_config_service_posix_unittest.cc
@@ -64,7 +64,7 @@
 
 // Fills in |res| with sane configuration.
 void InitializeResState(res_state res) {
-  SbMemorySet(res, 0, sizeof(*res));
+  memset(res, 0, sizeof(*res));
   res->options = RES_INIT | RES_RECURSE | RES_DEFNAMES | RES_DNSRCH |
                  RES_ROTATE;
   res->ndots = 2;
@@ -72,7 +72,7 @@
   res->retry = 7;
 
   const char kDnsrch[] = "chromium.org" "\0" "example.com";
-  SbMemoryCopy(res->defdname, kDnsrch, sizeof(kDnsrch));
+  memcpy(res->defdname, kDnsrch, sizeof(kDnsrch));
   res->dnsrch[0] = res->defdname;
   res->dnsrch[1] = res->defdname + sizeof("chromium.org");
 
@@ -98,7 +98,7 @@
     sa6->sin6_port = base::HostToNet16(NS_DEFAULTPORT - i);
     inet_pton(AF_INET6, kNameserversIPv6[i], &sa6->sin6_addr);
     res->_u._ext.nsaddrs[i] = sa6;
-    SbMemorySet(&res->nsaddr_list[i], 0, sizeof res->nsaddr_list[i]);
+    memset(&res->nsaddr_list[i], 0, sizeof res->nsaddr_list[i]);
     ++nscount6;
   }
   res->_u._ext.nscount6 = nscount6;
@@ -162,7 +162,7 @@
   struct __res_state res = {};
   res.options = RES_INIT | RES_RECURSE | RES_DEFNAMES | RES_DNSRCH;
   const char kDnsrch[] = "chromium.org";
-  SbMemoryCopy(res.defdname, kDnsrch, sizeof(kDnsrch));
+  memcpy(res.defdname, kDnsrch, sizeof(kDnsrch));
   res.dnsrch[0] = res.defdname;
 
   struct sockaddr_in sa = {};
diff --git a/src/net/dns/dns_config_service_win.cc b/src/net/dns/dns_config_service_win.cc
index 6ecb5ca..edd7320 100644
--- a/src/net/dns/dns_config_service_win.cc
+++ b/src/net/dns/dns_config_service_win.cc
@@ -132,7 +132,7 @@
   for (unsigned tries = 0; (tries < 3) && (rv == ERROR_BUFFER_OVERFLOW);
        tries++) {
     out.reset(static_cast<PIP_ADAPTER_ADDRESSES>(SbMemoryAllocate(len)));
-    SbMemorySet(out.get(), 0, len);
+    memset(out.get(), 0, len);
     rv = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, out.get(), &len);
   }
   if (rv != NO_ERROR)
diff --git a/src/net/dns/dns_config_service_win_unittest.cc b/src/net/dns/dns_config_service_win_unittest.cc
index 38fe704..4a4ba4b 100644
--- a/src/net/dns/dns_config_service_win_unittest.cc
+++ b/src/net/dns/dns_config_service_win_unittest.cc
@@ -74,7 +74,7 @@
   std::unique_ptr<IP_ADAPTER_ADDRESSES, base::FreeDeleter> heap(
       static_cast<IP_ADAPTER_ADDRESSES*>(SbMemoryAllocate(heap_size)));
   CHECK(heap.get());
-  SbMemorySet(heap.get(), 0, heap_size);
+  memset(heap.get(), 0, heap_size);
 
   IP_ADAPTER_ADDRESSES* adapters = heap.get();
   IP_ADAPTER_DNS_SERVER_ADDRESS* addresses =
diff --git a/src/net/dns/dns_query.cc b/src/net/dns/dns_query.cc
index 6821e80..6307b53 100644
--- a/src/net/dns/dns_query.cc
+++ b/src/net/dns/dns_query.cc
@@ -150,7 +150,7 @@
 DnsQuery::DnsQuery(const DnsQuery& orig, uint16_t id) {
   qname_size_ = orig.qname_size_;
   io_buffer_ = base::MakeRefCounted<IOBufferWithSize>(orig.io_buffer()->size());
-  SbMemoryCopy(io_buffer_.get()->data(), orig.io_buffer()->data(),
+  memcpy(io_buffer_.get()->data(), orig.io_buffer()->data(),
                io_buffer_.get()->size());
   header_ = reinterpret_cast<dns_protocol::Header*>(io_buffer_->data());
   header_->id = base::HostToNet16(id);
diff --git a/src/net/dns/dns_query_parse_fuzzer.cc b/src/net/dns/dns_query_parse_fuzzer.cc
index 30ea5b8..dc247d0 100644
--- a/src/net/dns/dns_query_parse_fuzzer.cc
+++ b/src/net/dns/dns_query_parse_fuzzer.cc
@@ -12,7 +12,7 @@
 // Entry point for LibFuzzer.
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   auto packet = base::MakeRefCounted<net::IOBufferWithSize>(size);
-  SbMemoryCopy(packet->data(), data, size);
+  memcpy(packet->data(), data, size);
   auto out = std::make_unique<net::DnsQuery>(packet);
   out->Parse();
   return 0;
diff --git a/src/net/dns/dns_query_unittest.cc b/src/net/dns/dns_query_unittest.cc
index be43b15..99e7edc 100644
--- a/src/net/dns/dns_query_unittest.cc
+++ b/src/net/dns/dns_query_unittest.cc
@@ -26,7 +26,7 @@
                                          size_t length,
                                          std::unique_ptr<DnsQuery>* out) {
   auto packet = base::MakeRefCounted<IOBufferWithSize>(length);
-  SbMemoryCopy(packet->data(), data, length);
+  memcpy(packet->data(), data, length);
   out->reset(new DnsQuery(packet));
   return (*out)->Parse();
 }
diff --git a/src/net/dns/dns_response.cc b/src/net/dns/dns_response.cc
index 363c4af..80755c4 100644
--- a/src/net/dns/dns_response.cc
+++ b/src/net/dns/dns_response.cc
@@ -253,7 +253,7 @@
       io_buffer_size_(length),
       parser_(io_buffer_->data(), length, answer_offset) {
   DCHECK(data);
-  SbMemoryCopy(io_buffer_->data(), data, length);
+  memcpy(io_buffer_->data(), data, length);
 }
 
 DnsResponse::~DnsResponse() = default;
diff --git a/src/net/dns/dns_response_fuzzer.cc b/src/net/dns/dns_response_fuzzer.cc
index b2b73e8..a18b162 100644
--- a/src/net/dns/dns_response_fuzzer.cc
+++ b/src/net/dns/dns_response_fuzzer.cc
@@ -14,7 +14,7 @@
 // Entry point for LibFuzzer.
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   auto packet = base::MakeRefCounted<net::IOBufferWithSize>(size);
-  SbMemoryCopy(packet->data(), data, size);
+  memcpy(packet->data(), data, size);
   base::Optional<net::DnsQuery> query;
   query.emplace(packet);
   if (!query->Parse()) {
diff --git a/src/net/dns/dns_response_unittest.cc b/src/net/dns/dns_response_unittest.cc
index bdc8497..93dd216 100644
--- a/src/net/dns/dns_response_unittest.cc
+++ b/src/net/dns/dns_response_unittest.cc
@@ -212,7 +212,7 @@
   };
 
   DnsResponse resp;
-  SbMemoryCopy(resp.io_buffer()->data(), response_data, sizeof(response_data));
+  memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
 
   // Reject too short.
   EXPECT_FALSE(resp.InitParse(query->io_buffer()->size() - 1, *query));
@@ -257,7 +257,7 @@
 
 TEST(DnsResponseTest, InitParseWithoutQuery) {
   DnsResponse resp;
-  SbMemoryCopy(resp.io_buffer()->data(), kT0ResponseDatagram,
+  memcpy(resp.io_buffer()->data(), kT0ResponseDatagram,
                sizeof(kT0ResponseDatagram));
 
   // Accept matching question.
@@ -305,7 +305,7 @@
   };
 
   DnsResponse resp;
-  SbMemoryCopy(resp.io_buffer()->data(), response_data, sizeof(response_data));
+  memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
 
   EXPECT_TRUE(resp.InitParseWithoutQuery(sizeof(response_data)));
 
@@ -360,7 +360,7 @@
   };
 
   DnsResponse resp;
-  SbMemoryCopy(resp.io_buffer()->data(), response_data, sizeof(response_data));
+  memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
 
   EXPECT_TRUE(resp.InitParseWithoutQuery(sizeof(response_data)));
 
@@ -391,7 +391,7 @@
   };
 
   DnsResponse resp;
-  SbMemoryCopy(resp.io_buffer()->data(), response_data, sizeof(response_data));
+  memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
 
   EXPECT_FALSE(resp.InitParseWithoutQuery(sizeof(response_data)));
 }
@@ -725,7 +725,7 @@
       2 /* qclass */ +
       10 /* extra bytes that inflate the internal buffer of a query */;
   auto buf = base::MakeRefCounted<IOBufferWithSize>(buf_size);
-  SbMemorySet(buf->data(), 0, buf->size());
+  memset(buf->data(), 0, buf->size());
   base::BigEndianWriter writer(buf->data(), buf_size);
   writer.WriteU16(0x1234);                              // id
   writer.WriteU16(0);                                   // flags, is query
diff --git a/src/net/dns/dns_test_util.cc b/src/net/dns/dns_test_util.cc
index 2ce8b2e..cd7b3d0 100644
--- a/src/net/dns/dns_test_util.cc
+++ b/src/net/dns/dns_test_util.cc
@@ -104,7 +104,7 @@
         DnsResponse response;
         char* buffer = response.io_buffer()->data();
         int nbytes = query.io_buffer()->size();
-        SbMemoryCopy(buffer, query.io_buffer()->data(), nbytes);
+        memcpy(buffer, query.io_buffer()->data(), nbytes);
         dns_protocol::Header* header =
             reinterpret_cast<dns_protocol::Header*>(buffer);
         header->flags |= dns_protocol::kFlagResponse;
diff --git a/src/net/dns/dns_transaction_unittest.cc b/src/net/dns/dns_transaction_unittest.cc
index 035a0ec..a4fc1bf 100644
--- a/src/net/dns/dns_transaction_unittest.cc
+++ b/src/net/dns/dns_transaction_unittest.cc
@@ -532,12 +532,12 @@
                    IOBuffer* buf,
                    int buf_size) {
     if (data_len > buf_size) {
-      SbMemoryCopy(buf->data(), data, buf_size);
+      memcpy(buf->data(), data, buf_size);
       leftover_data_ = data + buf_size;
       leftover_data_len_ = data_len - buf_size;
       return buf_size;
     }
-    SbMemoryCopy(buf->data(), data, data_len);
+    memcpy(buf->data(), data, data_len);
     return data_len;
   }
 
diff --git a/src/net/dns/dns_util.cc b/src/net/dns/dns_util.cc
index 7802b48..4ade4a7 100644
--- a/src/net/dns/dns_util.cc
+++ b/src/net/dns/dns_util.cc
@@ -74,7 +74,7 @@
       if (namelen + labellen + 1 > sizeof name)
         return false;
       name[namelen++] = static_cast<char>(labellen);
-      SbMemoryCopy(name + namelen, label, labellen);
+      memcpy(name + namelen, label, labellen);
       namelen += labellen;
       labellen = 0;
       continue;
@@ -92,7 +92,7 @@
     if (namelen + labellen + 1 > sizeof name)
       return false;
     name[namelen++] = static_cast<char>(labellen);
-    SbMemoryCopy(name + namelen, label, labellen);
+    memcpy(name + namelen, label, labellen);
     namelen += labellen;
     labellen = 0;
   }
diff --git a/src/net/dns/dns_util_unittest.cc b/src/net/dns/dns_util_unittest.cc
index 295c3b5..5d49e96 100644
--- a/src/net/dns/dns_util_unittest.cc
+++ b/src/net/dns/dns_util_unittest.cc
@@ -10,7 +10,7 @@
 namespace {
 
 bool IsValidDNSDomainName(const char* name) {
-  size_t length = SbStringGetLength(name);
+  size_t length = strlen(name);
   for (size_t i = 0; i < length; ++i) {
     if (name[i] == '.') {
       if (i == 0 || name[i - 1] == '.') {
@@ -37,7 +37,7 @@
 // IncludeNUL converts a char* to a std::string and includes the terminating
 // NUL in the result.
 static std::string IncludeNUL(const char* in) {
-  return std::string(in, SbStringGetLength(in) + 1);
+  return std::string(in, strlen(in) + 1);
 }
 
 TEST_F(DNSUtilTest, DNSDomainFromDot) {
diff --git a/src/net/dns/host_resolver_impl.cc b/src/net/dns/host_resolver_impl.cc
index e1b688e..13c2b7e 100644
--- a/src/net/dns/host_resolver_impl.cc
+++ b/src/net/dns/host_resolver_impl.cc
@@ -547,7 +547,7 @@
  public:
   explicit PriorityTracker(RequestPriority initial_priority)
       : highest_priority_(initial_priority), total_count_(0) {
-    SbMemorySet(counts_, 0, sizeof(counts_));
+    memset(counts_, 0, sizeof(counts_));
   }
 
   RequestPriority highest_priority() const {
diff --git a/src/net/dns/mock_mdns_socket_factory.cc b/src/net/dns/mock_mdns_socket_factory.cc
index 8b9e77a..6ba28bb 100644
--- a/src/net/dns/mock_mdns_socket_factory.cc
+++ b/src/net/dns/mock_mdns_socket_factory.cc
@@ -59,7 +59,7 @@
     CompletionRepeatingCallback callback) {
   int size_returned =
       std::min(response_packet_.size(), static_cast<size_t>(size));
-  SbMemoryCopy(buffer->data(), response_packet_.data(), size_returned);
+  memcpy(buffer->data(), response_packet_.data(), size_returned);
   return size_returned;
 }
 
@@ -106,7 +106,7 @@
   DCHECK(recv_buffer_.get());
   DCHECK(!recv_callback_.is_null());
 
-  SbMemoryCopy(recv_buffer_->data(), packet, size);
+  memcpy(recv_buffer_->data(), packet, size);
   base::ResetAndReturn(&recv_callback_).Run(size);
 }
 
diff --git a/src/net/filter/brotli_source_stream_unittest.cc b/src/net/filter/brotli_source_stream_unittest.cc
index ea64039..723dc33 100644
--- a/src/net/filter/brotli_source_stream_unittest.cc
+++ b/src/net/filter/brotli_source_stream_unittest.cc
@@ -96,7 +96,7 @@
 
   EXPECT_EQ(static_cast<int>(source_data_len()), bytes_read);
   EXPECT_EQ(
-      0, SbMemoryCompare(out_data(), source_data().c_str(), source_data_len()));
+      0, memcmp(out_data(), source_data().c_str(), source_data_len()));
   EXPECT_EQ("BROTLI", brotli_stream()->Description());
 }
 
@@ -178,7 +178,7 @@
   int bytes_read = ReadStream(callback);
   EXPECT_EQ(static_cast<int>(source_data_len()), bytes_read);
   EXPECT_EQ(
-      0, SbMemoryCompare(out_data(), source_data().c_str(), source_data_len()));
+      0, memcmp(out_data(), source_data().c_str(), source_data_len()));
   EXPECT_EQ("BROTLI", brotli_stream()->Description());
 }
 
@@ -195,7 +195,7 @@
   int rv = callback.WaitForResult();
   EXPECT_EQ(static_cast<int>(source_data_len()), rv);
   EXPECT_EQ(
-      0, SbMemoryCompare(out_data(), source_data().c_str(), source_data_len()));
+      0, memcmp(out_data(), source_data().c_str(), source_data_len()));
   EXPECT_EQ("BROTLI", brotli_stream()->Description());
 }
 
@@ -219,11 +219,11 @@
     bytes_read = ReadStream(callback);
     EXPECT_LE(OK, bytes_read);
     EXPECT_GE(kSmallBufferSize, static_cast<size_t>(bytes_read));
-    SbMemoryCopy(buffer->data() + total_bytes_read, out_data(), bytes_read);
+    memcpy(buffer->data() + total_bytes_read, out_data(), bytes_read);
     total_bytes_read += bytes_read;
   } while (bytes_read > 0);
   EXPECT_EQ(source_data_len(), total_bytes_read);
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), source_data().c_str(),
+  EXPECT_EQ(0, memcmp(buffer->data(), source_data().c_str(),
                                total_bytes_read));
   EXPECT_EQ("BROTLI", brotli_stream()->Description());
 }
@@ -251,11 +251,11 @@
       bytes_read = callback.WaitForResult();
     }
     EXPECT_GE(static_cast<int>(kSmallBufferSize), bytes_read);
-    SbMemoryCopy(buffer->data() + total_bytes_read, out_data(), bytes_read);
+    memcpy(buffer->data() + total_bytes_read, out_data(), bytes_read);
     total_bytes_read += bytes_read;
   } while (bytes_read > 0);
   EXPECT_EQ(source_data_len(), total_bytes_read);
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), source_data().c_str(),
+  EXPECT_EQ(0, memcmp(buffer->data(), source_data().c_str(),
                                total_bytes_read));
   EXPECT_EQ("BROTLI", brotli_stream()->Description());
 }
@@ -278,11 +278,11 @@
     bytes_read = ReadStream(callback);
     EXPECT_NE(ERR_IO_PENDING, bytes_read);
     EXPECT_GE(1, bytes_read);
-    SbMemoryCopy(buffer->data() + total_bytes_read, out_data(), bytes_read);
+    memcpy(buffer->data() + total_bytes_read, out_data(), bytes_read);
     total_bytes_read += bytes_read;
   } while (bytes_read > 0);
   EXPECT_EQ(source_data_len(), total_bytes_read);
-  EXPECT_EQ(0, SbMemoryCompare(buffer->data(), source_data().c_str(),
+  EXPECT_EQ(0, memcmp(buffer->data(), source_data().c_str(),
                                source_data_len()));
   EXPECT_EQ("BROTLI", brotli_stream()->Description());
 }
@@ -291,7 +291,7 @@
 TEST_F(BrotliSourceStreamTest, DecodeCorruptedData) {
   char corrupt_data[kDefaultBufferSize];
   int corrupt_data_len = encoded_len();
-  SbMemoryCopy(corrupt_data, encoded_buffer(), encoded_len());
+  memcpy(corrupt_data, encoded_buffer(), encoded_len());
   int pos = corrupt_data_len / 2;
   corrupt_data[pos] = !corrupt_data[pos];
 
@@ -318,11 +318,11 @@
 TEST_F(BrotliSourceStreamTest, DecodeMissingData) {
   char corrupt_data[kDefaultBufferSize];
   int corrupt_data_len = encoded_len();
-  SbMemoryCopy(corrupt_data, encoded_buffer(), encoded_len());
+  memcpy(corrupt_data, encoded_buffer(), encoded_len());
 
   int pos = corrupt_data_len / 2;
   int len = corrupt_data_len - pos - 1;
-  SbMemoryMove(&corrupt_data[pos], &corrupt_data[pos + 1], len);
+  memmove(&corrupt_data[pos], &corrupt_data[pos + 1], len);
   --corrupt_data_len;
 
   // Decode the corrupted data with filter
diff --git a/src/net/filter/filter_source_stream_test_util.cc b/src/net/filter/filter_source_stream_test_util.cc
index e9bac40..b79326e 100644
--- a/src/net/filter/filter_source_stream_test_util.cc
+++ b/src/net/filter/filter_source_stream_test_util.cc
@@ -21,7 +21,7 @@
                   bool gzip_framing) {
   size_t dest_left = *dest_len;
   z_stream zlib_stream;
-  SbMemorySet(&zlib_stream, 0, sizeof(zlib_stream));
+  memset(&zlib_stream, 0, sizeof(zlib_stream));
   int code;
   if (gzip_framing) {
     const int kMemLevel = 8;  // the default, see deflateInit2(3)
@@ -46,7 +46,7 @@
         0xff,  // OS 0xff == unknown
     };
     DCHECK_GE(dest_left, sizeof(gzip_header));
-    SbMemoryCopy(dest, gzip_header, sizeof(gzip_header));
+    memcpy(dest, gzip_header, sizeof(gzip_header));
     dest += sizeof(gzip_header);
     dest_left -= sizeof(gzip_header);
   }
diff --git a/src/net/filter/filter_source_stream_unittest.cc b/src/net/filter/filter_source_stream_unittest.cc
index 927eb77..7cbc460 100644
--- a/src/net/filter/filter_source_stream_unittest.cc
+++ b/src/net/filter/filter_source_stream_unittest.cc
@@ -42,7 +42,7 @@
   int WriteBufferToOutput(IOBuffer* output_buffer, int output_buffer_size) {
     size_t bytes_to_filter =
         std::min(buffer_.length(), static_cast<size_t>(output_buffer_size));
-    SbMemoryCopy(output_buffer->data(), buffer_.data(), bytes_to_filter);
+    memcpy(output_buffer->data(), buffer_.data(), bytes_to_filter);
     buffer_.erase(0, bytes_to_filter);
     return base::checked_cast<int>(bytes_to_filter);
   }
@@ -152,7 +152,7 @@
     buffer_.append(input_buffer->data(), input_buffer_size);
     *consumed_bytes = input_buffer_size;
     int bytes_to_read = std::min(1, static_cast<int>(buffer_.size()));
-    SbMemoryCopy(output_buffer->data(), buffer_.data(), bytes_to_read);
+    memcpy(output_buffer->data(), buffer_.data(), bytes_to_read);
     buffer_.erase(0, bytes_to_read);
     return bytes_to_read;
   }
diff --git a/src/net/filter/gzip_source_stream.cc b/src/net/filter/gzip_source_stream.cc
index 2667e99..66a49de 100644
--- a/src/net/filter/gzip_source_stream.cc
+++ b/src/net/filter/gzip_source_stream.cc
@@ -60,7 +60,7 @@
   zlib_stream_.reset(new z_stream);
   if (!zlib_stream_)
     return false;
-  SbMemorySet(zlib_stream_.get(), 0, sizeof(z_stream));
+  memset(zlib_stream_.get(), 0, sizeof(z_stream));
 
   int ret;
   if (type() == TYPE_GZIP) {
diff --git a/src/net/filter/gzip_source_stream_unittest.cc b/src/net/filter/gzip_source_stream_unittest.cc
index c2360df..3e06585 100644
--- a/src/net/filter/gzip_source_stream_unittest.cc
+++ b/src/net/filter/gzip_source_stream_unittest.cc
@@ -287,7 +287,7 @@
   source()->AddReadResult(nullptr, 0, OK, GetParam().mode);
   std::string actual_output;
   int rv = ReadStream(&actual_output);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kDecompressedData)), rv);
+  EXPECT_EQ(static_cast<int>(strlen(kDecompressedData)), rv);
   EXPECT_EQ(kDecompressedData, actual_output);
   EXPECT_EQ("GZIP", stream()->Description());
 }
@@ -309,7 +309,7 @@
   source()->AddReadResult(nullptr, 0, OK, GetParam().mode);
   std::string actual_output;
   int rv = ReadStream(&actual_output);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kDecompressedData)), rv);
+  EXPECT_EQ(static_cast<int>(strlen(kDecompressedData)), rv);
   EXPECT_EQ(kDecompressedData, actual_output);
   EXPECT_EQ("GZIP", stream()->Description());
 }
@@ -328,7 +328,7 @@
   source()->AddReadResult(nullptr, 0, OK, GetParam().mode);
   std::string actual_output;
   int rv = ReadStream(&actual_output);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kDecompressedData)), rv);
+  EXPECT_EQ(static_cast<int>(strlen(kDecompressedData)), rv);
   EXPECT_EQ(kDecompressedData, actual_output);
   EXPECT_EQ("DEFLATE", stream()->Description());
 }
@@ -357,7 +357,7 @@
   source()->AddReadResult(nullptr, 0, OK, GetParam().mode);
   std::string actual_output;
   int rv = ReadStream(&actual_output);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kDecompressedData)), rv);
+  EXPECT_EQ(static_cast<int>(strlen(kDecompressedData)), rv);
   EXPECT_EQ(kDecompressedData, actual_output);
   EXPECT_EQ("DEFLATE", stream()->Description());
 }
diff --git a/src/net/filter/mock_source_stream.cc b/src/net/filter/mock_source_stream.cc
index c1f9c8a..93efe55 100644
--- a/src/net/filter/mock_source_stream.cc
+++ b/src/net/filter/mock_source_stream.cc
@@ -46,7 +46,7 @@
   }
 
   results_.pop();
-  SbMemoryCopy(dest_buffer->data(), r.data, r.len);
+  memcpy(dest_buffer->data(), r.data, r.len);
   return r.error == OK ? r.len : r.error;
 }
 
@@ -94,7 +94,7 @@
   DCHECK_EQ(ASYNC, r.mode);
   results_.pop();
   DCHECK_GE(dest_buffer_size_, r.len);
-  SbMemoryCopy(dest_buffer_->data(), r.data, r.len);
+  memcpy(dest_buffer_->data(), r.data, r.len);
   dest_buffer_ = nullptr;
   std::move(callback_).Run(r.error == OK ? r.len : r.error);
 }
diff --git a/src/net/ftp/ftp_ctrl_response_buffer_unittest.cc b/src/net/ftp/ftp_ctrl_response_buffer_unittest.cc
index 3c37e9a..13087a8 100644
--- a/src/net/ftp/ftp_ctrl_response_buffer_unittest.cc
+++ b/src/net/ftp/ftp_ctrl_response_buffer_unittest.cc
@@ -26,7 +26,7 @@
 
  protected:
   int PushDataToBuffer(const char* data) {
-    return buffer_.ConsumeData(data, SbStringGetLength(data));
+    return buffer_.ConsumeData(data, strlen(data));
   }
 
   FtpCtrlResponseBuffer buffer_;
diff --git a/src/net/ftp/ftp_network_transaction.cc b/src/net/ftp/ftp_network_transaction.cc
index bc10e4b..6950949 100644
--- a/src/net/ftp/ftp_network_transaction.cc
+++ b/src/net/ftp/ftp_network_transaction.cc
@@ -484,8 +484,8 @@
       base::MakeRefCounted<IOBufferWithSize>(command.length() + 2);
   write_buf_ = base::MakeRefCounted<DrainableIOBuffer>(
       write_command_buf_, write_command_buf_->size());
-  SbMemoryCopy(write_command_buf_->data(), command.data(), command.length());
-  SbMemoryCopy(write_command_buf_->data() + command.length(), kCRLF, 2);
+  memcpy(write_command_buf_->data(), command.data(), command.length());
+  memcpy(write_command_buf_->data() + command.length(), kCRLF, 2);
 
   net_log_.AddEvent(NetLogEventType::FTP_COMMAND_SENT,
                     NetLog::StringCallback("command", &command_for_log));
diff --git a/src/net/ftp/ftp_network_transaction_unittest.cc b/src/net/ftp/ftp_network_transaction_unittest.cc
index 046825a..dfe7025 100644
--- a/src/net/ftp/ftp_network_transaction_unittest.cc
+++ b/src/net/ftp/ftp_network_transaction_unittest.cc
@@ -832,7 +832,7 @@
     if (expected_result == OK) {
       scoped_refptr<IOBuffer> io_buffer =
           base::MakeRefCounted<IOBuffer>(kBufferSize);
-      SbMemorySet(io_buffer->data(), 0, kBufferSize);
+      memset(io_buffer->data(), 0, kBufferSize);
       ASSERT_EQ(ERR_IO_PENDING, transaction_->Read(io_buffer.get(), kBufferSize,
                                                    callback_.callback()));
       ASSERT_EQ(static_cast<int>(mock_data.length()),
diff --git a/src/net/http/http_auth_gssapi_posix.cc b/src/net/http/http_auth_gssapi_posix.cc
index 347f168..b0e6c10 100644
--- a/src/net/http/http_auth_gssapi_posix.cc
+++ b/src/net/http/http_auth_gssapi_posix.cc
@@ -218,8 +218,8 @@
   std::string output;
   if (oid->length != predefined_oid->length)
     return output;
-  if (0 != SbMemoryCompare(oid->elements, predefined_oid->elements,
-                           predefined_oid->length))
+  if (0 != memcmp(oid->elements, predefined_oid->elements,
+                  predefined_oid->length))
     return output;
 
   output += " (";
diff --git a/src/net/http/http_auth_gssapi_posix_unittest.cc b/src/net/http/http_auth_gssapi_posix_unittest.cc
index eafdc6f..489d6e1 100644
--- a/src/net/http/http_auth_gssapi_posix_unittest.cc
+++ b/src/net/http/http_auth_gssapi_posix_unittest.cc
@@ -36,7 +36,7 @@
   dest->length = length;
   if (length) {
     dest->value = new char[length];
-    SbMemoryCopy(dest->value, src, length);
+    memcpy(dest->value, src, length);
   }
 }
 
diff --git a/src/net/http/http_auth_gssapi_starboard.cc b/src/net/http/http_auth_gssapi_starboard.cc
index e810480..175c920 100644
--- a/src/net/http/http_auth_gssapi_starboard.cc
+++ b/src/net/http/http_auth_gssapi_starboard.cc
@@ -193,8 +193,8 @@
   std::string output;
   if (oid->length != predefined_oid->length)
     return output;
-  if (0 != SbMemoryCompare(oid->elements, predefined_oid->elements,
-                           predefined_oid->length))
+  if (0 != memcmp(oid->elements, predefined_oid->elements,
+                  predefined_oid->length))
     return output;
 
   output += " (";
diff --git a/src/net/http/http_auth_gssapi_starboard_unittest.cc b/src/net/http/http_auth_gssapi_starboard_unittest.cc
index 4324165..2d9642a 100644
--- a/src/net/http/http_auth_gssapi_starboard_unittest.cc
+++ b/src/net/http/http_auth_gssapi_starboard_unittest.cc
@@ -36,7 +36,7 @@
   dest->length = length;
   if (length) {
     dest->value = new char[length];
-    SbMemoryCopy(dest->value, src, length);
+    memcpy(dest->value, src, length);
   }
 }
 
diff --git a/src/net/http/http_auth_handler_negotiate_unittest.cc b/src/net/http/http_auth_handler_negotiate_unittest.cc
index feb88d3..077a929 100644
--- a/src/net/http/http_auth_handler_negotiate_unittest.cc
+++ b/src/net/http/http_auth_handler_negotiate_unittest.cc
@@ -76,7 +76,7 @@
   void SetupMocks(MockAuthLibrary* mock_library) {
 #if defined(OS_WIN)
     security_package_.reset(new SecPkgInfoW);
-    SbMemorySet(security_package_.get(), 0x0, sizeof(SecPkgInfoW));
+    memset(security_package_.get(), 0x0, sizeof(SecPkgInfoW));
     security_package_->cbMaxToken = 1337;
     mock_library->ExpectQuerySecurityPackageInfo(
         L"Negotiate", SEC_E_OK, security_package_.get());
diff --git a/src/net/http/http_auth_handler_ntlm_portable_unittest.cc b/src/net/http/http_auth_handler_ntlm_portable_unittest.cc
index b246d17..987f56a 100644
--- a/src/net/http/http_auth_handler_ntlm_portable_unittest.cc
+++ b/src/net/http/http_auth_handler_ntlm_portable_unittest.cc
@@ -150,7 +150,7 @@
   static void MockRandom(uint8_t* output, size_t n) {
     // This is set to 0xaa because the client challenge for testing in
     // [MS-NLMP] Section 4.2.1 is 8 bytes of 0xaa.
-    SbMemorySet(output, 0xaa, n);
+    memset(output, 0xaa, n);
   }
 
   static uint64_t MockGetMSTime() {
@@ -239,9 +239,9 @@
   ASSERT_EQ(arraysize(ntlm::test::kExpectedAuthenticateMsgSpecResponseV1),
             decoded.size());
   ASSERT_EQ(0,
-            SbMemoryCompare(decoded.data(),
-                            ntlm::test::kExpectedAuthenticateMsgSpecResponseV1,
-                            decoded.size()));
+            memcmp(decoded.data(),
+                   ntlm::test::kExpectedAuthenticateMsgSpecResponseV1,
+                   decoded.size()));
 }
 
 }  // namespace net
diff --git a/src/net/http/http_auth_sspi_win_unittest.cc b/src/net/http/http_auth_sspi_win_unittest.cc
index be841b3..f49b98d 100644
--- a/src/net/http/http_auth_sspi_win_unittest.cc
+++ b/src/net/http/http_auth_sspi_win_unittest.cc
@@ -45,7 +45,7 @@
 
 TEST(HttpAuthSSPITest, DetermineMaxTokenLength_Normal) {
   SecPkgInfoW package_info;
-  SbMemorySet(&package_info, 0x0, sizeof(package_info));
+  memset(&package_info, 0x0, sizeof(package_info));
   package_info.cbMaxToken = 1337;
 
   MockSSPILibrary mock_library;
diff --git a/src/net/http/http_cache_unittest.cc b/src/net/http/http_cache_unittest.cc
index c8aa3c5..0740dc8 100644
--- a/src/net/http/http_cache_unittest.cc
+++ b/src/net/http/http_cache_unittest.cc
@@ -2080,7 +2080,7 @@
   mock_transaction.data = kFullRangeData;
   std::string response_headers_str = base::StrCat(
       {"ETag: StrongOne\n", "Content-Length:",
-       base::IntToString(SbStringGetLength(kFullRangeData)), "\n"});
+       base::IntToString(strlen(kFullRangeData)), "\n"});
   mock_transaction.response_headers = response_headers_str.c_str();
 
   ScopedMockTransaction transaction(mock_transaction);
@@ -9201,7 +9201,7 @@
   // Write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
       base::MakeRefCounted<IOBufferWithSize>(50);
-  SbMemorySet(buf->data(), 0, buf->size());
+  memset(buf->data(), 0, buf->size());
   base::strlcpy(buf->data(), "Hi there", buf->size());
   cache.http_cache()->WriteMetadata(GURL(kSimpleGET_Transaction.url),
                                     DEFAULT_PRIORITY, response.response_time,
@@ -9237,7 +9237,7 @@
   // Attempt to write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
       base::MakeRefCounted<IOBufferWithSize>(50);
-  SbMemorySet(buf->data(), 0, buf->size());
+  memset(buf->data(), 0, buf->size());
   base::strlcpy(buf->data(), "Hi there", buf->size());
   base::Time expected_time = response.response_time -
                              base::TimeDelta::FromMilliseconds(20);
@@ -9277,7 +9277,7 @@
   // Attempt to write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
       base::MakeRefCounted<IOBufferWithSize>(50);
-  SbMemorySet(buf->data(), 0, buf->size());
+  memset(buf->data(), 0, buf->size());
   base::strlcpy(buf->data(), "Hi there", buf->size());
   cache.http_cache()->WriteMetadata(GURL(transaction.url), DEFAULT_PRIORITY,
                                     response.response_time, buf.get(),
@@ -9402,7 +9402,7 @@
   // Write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
       base::MakeRefCounted<IOBufferWithSize>(50);
-  SbMemorySet(buf->data(), 0, buf->size());
+  memset(buf->data(), 0, buf->size());
   base::strlcpy(buf->data(), "Hi there", buf->size());
   cache.http_cache()->WriteMetadata(GURL(kTypicalGET_Transaction.url),
                                     DEFAULT_PRIORITY, response.response_time,
diff --git a/src/net/http/http_cache_writers.cc b/src/net/http/http_cache_writers.cc
index 7974441..aa968cd 100644
--- a/src/net/http/http_cache_writers.cc
+++ b/src/net/http/http_cache_writers.cc
@@ -531,7 +531,7 @@
     if (result >= 0) {  // success
       // Save the data in the waiting transaction's read buffer.
       it->second.write_len = std::min(it->second.read_buf_len, result);
-      SbMemoryCopy(it->second.read_buf->data(), read_buf_->data(),
+      memcpy(it->second.read_buf->data(), read_buf_->data(),
                    it->second.write_len);
       callback_result = it->second.write_len;
     }
diff --git a/src/net/http/http_chunked_decoder.cc b/src/net/http/http_chunked_decoder.cc
index 4d74cb8..946c742 100644
--- a/src/net/http/http_chunked_decoder.cc
+++ b/src/net/http/http_chunked_decoder.cc
@@ -100,7 +100,7 @@
 
     buf_len -= bytes_consumed;
     if (buf_len > 0)
-      SbMemoryMove(buf, buf + bytes_consumed, buf_len);
+      memmove(buf, buf + bytes_consumed, buf_len);
   }
 
   return result;
diff --git a/src/net/http/http_chunked_decoder_unittest.cc b/src/net/http/http_chunked_decoder_unittest.cc
index 9d80d6e..b4b68e4 100644
--- a/src/net/http/http_chunked_decoder_unittest.cc
+++ b/src/net/http/http_chunked_decoder_unittest.cc
@@ -399,7 +399,7 @@
 TEST(HttpChunkedDecoderTest, LongChunkLengthLine) {
   int big_chunk_length = HttpChunkedDecoder::kMaxLineBufLen;
   std::unique_ptr<char[]> big_chunk(new char[big_chunk_length + 1]);
-  SbMemorySet(big_chunk.get(), '0', big_chunk_length);
+  memset(big_chunk.get(), '0', big_chunk_length);
   big_chunk[big_chunk_length] = 0;
   const char* const inputs[] = {
     big_chunk.get(),
@@ -413,7 +413,7 @@
 TEST(HttpChunkedDecoderTest, LongLengthLengthLine) {
   int big_chunk_length = HttpChunkedDecoder::kMaxLineBufLen;
   std::unique_ptr<char[]> big_chunk(new char[big_chunk_length + 1]);
-  SbMemorySet(big_chunk.get(), '0', big_chunk_length);
+  memset(big_chunk.get(), '0', big_chunk_length);
   big_chunk[big_chunk_length] = 0;
   const char* const inputs[] = {
     "5;",
diff --git a/src/net/http/http_network_transaction_unittest.cc b/src/net/http/http_network_transaction_unittest.cc
index 627a142..8fbed3e 100644
--- a/src/net/http/http_network_transaction_unittest.cc
+++ b/src/net/http/http_network_transaction_unittest.cc
@@ -527,7 +527,7 @@
 void FillLargeHeadersString(std::string* str, int size) {
   const char row[] =
       "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n";
-  const int sizeof_row = SbStringGetLength(row);
+  const int sizeof_row = strlen(row);
   const int num_rows = static_cast<int>(
       ceil(static_cast<float>(size) / sizeof_row));
   const int sizeof_data = num_rows * sizeof_row;
@@ -549,7 +549,7 @@
 void MockGenerateRandom(uint8_t* output, size_t n) {
   // This is set to 0xaa because the client challenge for testing in
   // [MS-NLMP] Section 4.2.1 is 8 bytes of 0xaa.
-  SbMemorySet(output, 0xaa, n);
+  memset(output, 0xaa, n);
 }
 
 std::string MockGetHostName() {
@@ -928,7 +928,7 @@
   EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line);
   EXPECT_EQ("", out.response_data);
   int64_t reads_size = CountReadBytes(data_reads);
-  int64_t response_size = reads_size - SbStringGetLength(junk);
+  int64_t response_size = reads_size - strlen(junk);
   EXPECT_EQ(response_size, out.total_received_bytes);
 }
 
@@ -1562,12 +1562,12 @@
     data2_reads.push_back(MockRead(ASYNC, OK, 3));
   } else {
     data2_writes.push_back(
-        MockWrite(ASYNC, kHttpRequest, SbStringGetLength(kHttpRequest), 0));
+        MockWrite(ASYNC, kHttpRequest, strlen(kHttpRequest), 0));
 
     data2_reads.push_back(
-        MockRead(ASYNC, kHttpResponse, SbStringGetLength(kHttpResponse), 1));
+        MockRead(ASYNC, kHttpResponse, strlen(kHttpResponse), 1));
     data2_reads.push_back(
-        MockRead(ASYNC, kHttpData, SbStringGetLength(kHttpData), 2));
+        MockRead(ASYNC, kHttpData, strlen(kHttpData), 2));
     data2_reads.push_back(MockRead(ASYNC, OK, 3));
   }
   SequencedSocketData data2(data2_reads, data2_writes);
diff --git a/src/net/http/http_response_headers.cc b/src/net/http/http_response_headers.cc
index 0d8e9e4..6d29ac1 100644
--- a/src/net/http/http_response_headers.cc
+++ b/src/net/http/http_response_headers.cc
@@ -204,7 +204,7 @@
   // Note raw_headers_ has embedded nulls instead of \n,
   // so this just copies the first header line.
   blob.assign(raw_headers_.c_str(),
-              SbStringGetLength(raw_headers_.c_str()) + 1);
+              strlen(raw_headers_.c_str()) + 1);
 
   for (size_t i = 0; i < parsed_.size(); ++i) {
     DCHECK(!parsed_[i].is_continuation());
diff --git a/src/net/http/http_security_headers.cc b/src/net/http/http_security_headers.cc
index fd1ebea..a16c8f6 100644
--- a/src/net/http/http_security_headers.cc
+++ b/src/net/http/http_security_headers.cc
@@ -103,7 +103,7 @@
   if (decoded.size() != hash.size())
     return false;
 
-  SbMemoryCopy(hash.data(), decoded.data(), hash.size());
+  memcpy(hash.data(), decoded.data(), hash.size());
   hashes->push_back(hash);
   return true;
 }
diff --git a/src/net/http/http_security_headers_unittest.cc b/src/net/http/http_security_headers_unittest.cc
index 86b11dd..5bb7fb8 100644
--- a/src/net/http/http_security_headers_unittest.cc
+++ b/src/net/http/http_security_headers_unittest.cc
@@ -29,7 +29,7 @@
 
 HashValue GetTestHashValue(uint8_t label, HashValueTag tag) {
   HashValue hash_value(tag);
-  SbMemorySet(hash_value.data(), label, hash_value.size());
+  memset(hash_value.data(), label, hash_value.size());
   return hash_value;
 }
 
diff --git a/src/net/http/http_stream_parser.cc b/src/net/http/http_stream_parser.cc
index 5bf7287..e0ab56b 100644
--- a/src/net/http/http_stream_parser.cc
+++ b/src/net/http/http_stream_parser.cc
@@ -44,7 +44,7 @@
   while (header_line[0] != 0) {
     cr_separated_headers += header_line;
     cr_separated_headers += "\n";
-    header_line += SbStringGetLength(header_line) + 1;
+    header_line += strlen(header_line) + 1;
   }
   return cr_separated_headers;
 }
@@ -278,7 +278,7 @@
     request_headers_ = base::MakeRefCounted<DrainableIOBuffer>(
         merged_request_headers_and_body, merged_size);
 
-    SbMemoryCopy(request_headers_->data(), request.data(),
+    memcpy(request_headers_->data(), request.data(),
                  request_headers_length_);
     request_headers_->DidConsume(request_headers_length_);
 
@@ -677,7 +677,7 @@
     if (available) {
       CHECK_GT(available, 0);
       int bytes_from_buffer = std::min(available, user_read_buf_len_);
-      SbMemoryCopy(user_read_buf_->data(),
+      memcpy(user_read_buf_->data(),
                    read_buf_->StartOfBuffer() + read_buf_unused_offset_,
                    bytes_from_buffer);
       read_buf_unused_offset_ += bytes_from_buffer;
@@ -782,12 +782,12 @@
 
     if (save_amount) {
       received_bytes_ -= save_amount;
-      SbMemoryCopy(read_buf_->StartOfBuffer(), user_read_buf_->data() + result,
+      memcpy(read_buf_->StartOfBuffer(), user_read_buf_->data() + result,
                    save_amount);
     }
     read_buf_->set_offset(save_amount);
     if (additional_save_amount) {
-      SbMemoryMove(read_buf_->data(),
+      memmove(read_buf_->data(),
                    read_buf_->StartOfBuffer() + read_buf_unused_offset_,
                    additional_save_amount);
       read_buf_->set_offset(save_amount + additional_save_amount);
@@ -897,7 +897,7 @@
       int extra_bytes = read_buf_->offset() - end_of_header_offset;
       if (extra_bytes) {
         CHECK_GT(extra_bytes, 0);
-        SbMemoryMove(read_buf_->StartOfBuffer(),
+        memmove(read_buf_->StartOfBuffer(),
                      read_buf_->StartOfBuffer() + end_of_header_offset,
                      extra_bytes);
       }
@@ -1154,11 +1154,11 @@
   cursor += num_chars;
   // Add the payload if any.
   if (payload.size() > 0) {
-    SbMemoryCopy(cursor, payload.data(), payload.size());
+    memcpy(cursor, payload.data(), payload.size());
     cursor += payload.size();
   }
   // Add the trailing CRLF.
-  SbMemoryCopy(cursor, "\r\n", 2);
+  memcpy(cursor, "\r\n", 2);
   cursor += 2;
 
   return cursor - output;
diff --git a/src/net/http/http_stream_parser_unittest.cc b/src/net/http/http_stream_parser_unittest.cc
index 81c129f..b4e440c 100644
--- a/src/net/http/http_stream_parser_unittest.cc
+++ b/src/net/http/http_stream_parser_unittest.cc
@@ -1234,7 +1234,7 @@
                               read_buffer->capacity()));
 
   EXPECT_EQ(CountWriteBytes(writes), parser.sent_bytes());
-  EXPECT_EQ(CountReadBytes(reads) - static_cast<int64_t>(SbStringGetLength(
+  EXPECT_EQ(CountReadBytes(reads) - static_cast<int64_t>(strlen(
                                         "a fake websocket frame")),
             parser.received_bytes());
 }
@@ -1266,7 +1266,7 @@
     int offset = read_buffer_->offset();
     int size = data.size();
     read_buffer_->SetCapacity(offset + size);
-    SbMemoryCopy(read_buffer_->StartOfBuffer() + offset, data.data(), size);
+    memcpy(read_buffer_->StartOfBuffer() + offset, data.data(), size);
     read_buffer_->set_offset(offset + size);
   }
 
diff --git a/src/net/http/http_transaction_test_util.cc b/src/net/http/http_transaction_test_util.cc
index 97b9482..9b9c92c 100644
--- a/src/net/http/http_transaction_test_util.cc
+++ b/src/net/http/http_transaction_test_util.cc
@@ -351,7 +351,7 @@
       if (test_mode_ & TEST_MODE_SLOW_READ)
         num = std::min(num, 1);
       if (num) {
-        SbMemoryCopy(buf->data(), data_.data() + data_cursor_, num);
+        memcpy(buf->data(), data_.data() + data_cursor_, num);
         data_cursor_ += num;
       }
     }
diff --git a/src/net/http/http_util_unittest.cc b/src/net/http/http_util_unittest.cc
index 02b2096..c15b6e6 100644
--- a/src/net/http/http_util_unittest.cc
+++ b/src/net/http/http_util_unittest.cc
@@ -307,7 +307,7 @@
       {"foo\nbar\r\n\njunk", 10},
   };
   for (size_t i = 0; i < arraysize(tests); ++i) {
-    int input_len = static_cast<int>(SbStringGetLength(tests[i].input));
+    int input_len = static_cast<int>(strlen(tests[i].input));
     int eoh = HttpUtil::LocateEndOfHeaders(tests[i].input, input_len);
     EXPECT_EQ(tests[i].expected_result, eoh);
   }
@@ -331,7 +331,7 @@
       {"foo\nbar\r\n\njunk", 10},
   };
   for (size_t i = 0; i < arraysize(tests); ++i) {
-    int input_len = static_cast<int>(SbStringGetLength(tests[i].input));
+    int input_len = static_cast<int>(strlen(tests[i].input));
     int eoh = HttpUtil::LocateEndOfAdditionalHeaders(tests[i].input, input_len);
     EXPECT_EQ(tests[i].expected_result, eoh);
   }
diff --git a/src/net/http/http_vary_data.cc b/src/net/http/http_vary_data.cc
index 78e5e0c..47a8060 100644
--- a/src/net/http/http_vary_data.cc
+++ b/src/net/http/http_vary_data.cc
@@ -42,7 +42,7 @@
     if (request_header == "*") {
       // What's in request_digest_ will never be looked at, but make it
       // deterministic so we don't serialize out uninitialized memory content.
-      SbMemorySet(&request_digest_, 0, sizeof(request_digest_));
+      memset(&request_digest_, 0, sizeof(request_digest_));
       return is_valid_ = true;
     }
     AddField(request_info, request_header, &ctx);
@@ -60,7 +60,7 @@
   is_valid_ = false;
   const char* data;
   if (iter->ReadBytes(&data, sizeof(request_digest_))) {
-    SbMemoryCopy(&request_digest_, data, sizeof(request_digest_));
+    memcpy(&request_digest_, data, sizeof(request_digest_));
     return is_valid_ = true;
   }
   return false;
@@ -84,8 +84,8 @@
     // by a build before crbug.com/469675 was fixed.
     return false;
   }
-  return SbMemoryCompare(&new_vary_data.request_digest_, &request_digest_,
-                         sizeof(request_digest_)) == 0;
+  return memcmp(&new_vary_data.request_digest_, &request_digest_,
+                sizeof(request_digest_)) == 0;
 }
 
 // static
diff --git a/src/net/http/mock_gssapi_library_posix.cc b/src/net/http/mock_gssapi_library_posix.cc
index 70f5894..eca90bc 100644
--- a/src/net/http/mock_gssapi_library_posix.cc
+++ b/src/net/http/mock_gssapi_library_posix.cc
@@ -71,7 +71,7 @@
   dest->length = length;
   if (length) {
     dest->value = new char[length];
-    SbMemoryCopy(dest->value, src, length);
+    memcpy(dest->value, src, length);
   }
 }
 
@@ -212,7 +212,7 @@
       minor_response_code(in_minor_response_code),
       context_info(in_context_info) {
   if (in_expected_input_token) {
-    expected_input_token.length = SbStringGetLength(in_expected_input_token);
+    expected_input_token.length = strlen(in_expected_input_token);
     expected_input_token.value = const_cast<char*>(in_expected_input_token);
   } else {
     expected_input_token.length = 0;
@@ -220,7 +220,7 @@
   }
 
   if (in_output_token) {
-    output_token.length = SbStringGetLength(in_output_token);
+    output_token.length = strlen(in_output_token);
     output_token.value = const_cast<char*>(in_output_token);
   } else {
     output_token.length = 0;
@@ -400,9 +400,9 @@
   } else {
     EXPECT_EQ(input_token->length, security_query.expected_input_token.length);
     if (input_token->length) {
-      EXPECT_EQ(0, SbMemoryCompare(input_token->value,
-                                   security_query.expected_input_token.value,
-                                   input_token->length));
+      EXPECT_EQ(0, memcmp(input_token->value,
+                          security_query.expected_input_token.value,
+                          input_token->length));
     }
   }
   CopyBuffer(output_token, &security_query.output_token);
diff --git a/src/net/http/mock_gssapi_library_starboard.cc b/src/net/http/mock_gssapi_library_starboard.cc
index 79f2e29..526a3be 100644
--- a/src/net/http/mock_gssapi_library_starboard.cc
+++ b/src/net/http/mock_gssapi_library_starboard.cc
@@ -71,7 +71,7 @@
   dest->length = length;
   if (length) {
     dest->value = new char[length];
-    SbMemoryCopy(dest->value, src, length);
+    memcpy(dest->value, src, length);
   }
 }
 
@@ -207,7 +207,7 @@
       minor_response_code(in_minor_response_code),
       context_info(in_context_info) {
   if (in_expected_input_token) {
-    expected_input_token.length = SbStringGetLength(in_expected_input_token);
+    expected_input_token.length = strlen(in_expected_input_token);
     expected_input_token.value = const_cast<char*>(in_expected_input_token);
   } else {
     expected_input_token.length = 0;
@@ -215,7 +215,7 @@
   }
 
   if (in_output_token) {
-    output_token.length = SbStringGetLength(in_output_token);
+    output_token.length = strlen(in_output_token);
     output_token.value = const_cast<char*>(in_output_token);
   } else {
     output_token.length = 0;
@@ -389,9 +389,9 @@
   } else {
     EXPECT_EQ(input_token->length, security_query.expected_input_token.length);
     if (input_token->length) {
-      EXPECT_EQ(0, SbMemoryCompare(input_token->value,
-                                   security_query.expected_input_token.value,
-                                   input_token->length));
+      EXPECT_EQ(0, memcmp(input_token->value,
+                          security_query.expected_input_token.value,
+                          input_token->length));
     }
   }
   CopyBuffer(output_token, &security_query.output_token);
diff --git a/src/net/http/mock_http_cache.cc b/src/net/http/mock_http_cache.cc
index b165839..7383d2b 100644
--- a/src/net/http/mock_http_cache.cc
+++ b/src/net/http/mock_http_cache.cc
@@ -122,7 +122,7 @@
     return 0;
 
   int num = std::min(buf_len, static_cast<int>(data_[index].size()) - offset);
-  SbMemoryCopy(buf->data(), &data_[index][offset], num);
+  memcpy(buf->data(), &data_[index][offset], num);
 
   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ)
     return num;
@@ -166,7 +166,7 @@
   DCHECK_LT(offset + buf_len, kMaxMockCacheEntrySize);
   data_[index].resize(offset + buf_len);
   if (buf_len)
-    SbMemoryCopy(&data_[index][offset], buf->data(), buf_len);
+    memcpy(&data_[index][offset], buf->data(), buf_len);
 
   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE)
     return buf_len;
@@ -204,7 +204,7 @@
 
   int num = std::min(static_cast<int>(data_[1].size()) - real_offset,
                      buf_len);
-  SbMemoryCopy(buf->data(), &data_[1][real_offset], num);
+  memcpy(buf->data(), &data_[1][real_offset], num);
 
   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ)
     return num;
@@ -245,7 +245,7 @@
     data_[1].resize(real_offset + buf_len);
   }
 
-  SbMemoryCopy(&data_[1][real_offset], buf->data(), buf_len);
+  memcpy(&data_[1][real_offset], buf->data(), buf_len);
   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE)
     return buf_len;
 
diff --git a/src/net/http/transport_security_persister_unittest.cc b/src/net/http/transport_security_persister_unittest.cc
index b315f7d..089b0b1 100644
--- a/src/net/http/transport_security_persister_unittest.cc
+++ b/src/net/http/transport_security_persister_unittest.cc
@@ -69,7 +69,7 @@
 
   state_.AddHSTS(kYahooDomain, expiry, false /* include subdomains */);
   HashValue spki(HASH_VALUE_SHA256);
-  SbMemorySet(spki.data(), 0, spki.size());
+  memset(spki.data(), 0, spki.size());
   HashValueVector dynamic_spki_hashes;
   dynamic_spki_hashes.push_back(spki);
   state_.AddHPKP(kYahooDomain, expiry, false, dynamic_spki_hashes, GURL());
@@ -138,9 +138,9 @@
   const GURL report_uri(kReportUri);
   // Add an entry.
   HashValue fp1(HASH_VALUE_SHA256);
-  SbMemorySet(fp1.data(), 0, fp1.size());
+  memset(fp1.data(), 0, fp1.size());
   HashValue fp2(HASH_VALUE_SHA256);
-  SbMemorySet(fp2.data(), 1, fp2.size());
+  memset(fp2.data(), 1, fp2.size());
   base::Time expiry =
       base::Time::Now() + base::TimeDelta::FromSeconds(1000);
   HashValueVector dynamic_spki_hashes;
@@ -153,8 +153,8 @@
   state_.AddExpectCT("www.example.com", expiry, true /* enforce */, GURL());
 
   // Add another entry.
-  SbMemorySet(fp1.data(), 2, fp1.size());
-  SbMemorySet(fp2.data(), 3, fp2.size());
+  memset(fp1.data(), 2, fp1.size());
+  memset(fp2.data(), 3, fp2.size());
   expiry =
       base::Time::Now() + base::TimeDelta::FromSeconds(3000);
   dynamic_spki_hashes.push_back(fp1);
@@ -260,7 +260,7 @@
   EXPECT_FALSE(pkp_state.CheckPublicKeyPins(hashes, &failure_log));
 
   HashValue sha256(HASH_VALUE_SHA256);
-  SbMemorySet(sha256.data(), '1', sha256.size());
+  memset(sha256.data(), '1', sha256.size());
   pkp_state.spki_hashes.push_back(sha256);
 
   EXPECT_FALSE(pkp_state.CheckPublicKeyPins(hashes, &failure_log));
@@ -286,8 +286,8 @@
   EXPECT_TRUE(state_.GetDynamicPKPState(kTestDomain, &new_pkp_state));
   EXPECT_EQ(1u, new_pkp_state.spki_hashes.size());
   EXPECT_EQ(sha256.tag(), new_pkp_state.spki_hashes[0].tag());
-  EXPECT_EQ(0, SbMemoryCompare(new_pkp_state.spki_hashes[0].data(),
-                               sha256.data(), sha256.size()));
+  EXPECT_EQ(0, memcmp(new_pkp_state.spki_hashes[0].data(),
+                      sha256.data(), sha256.size()));
   EXPECT_EQ(report_uri, new_pkp_state.report_uri);
 }
 
@@ -348,7 +348,7 @@
   state_.AddHSTS(kTestDomain, expiry, false /* include subdomains */);
   state_.AddExpectCT(kTestDomain, expiry, true /* enforce */, GURL());
   HashValue spki_hash(HASH_VALUE_SHA256);
-  SbMemorySet(spki_hash.data(), 0, spki_hash.size());
+  memset(spki_hash.data(), 0, spki_hash.size());
   HashValueVector dynamic_spki_hashes;
   dynamic_spki_hashes.push_back(spki_hash);
   state_.AddHPKP(kTestDomain, expiry, false /* include subdomains */,
@@ -375,8 +375,8 @@
   TransportSecurityState::PKPState pkp_state;
   EXPECT_TRUE(state_.GetDynamicPKPState(kTestDomain, &pkp_state));
   EXPECT_EQ(1u, pkp_state.spki_hashes.size());
-  EXPECT_EQ(0, SbMemoryCompare(pkp_state.spki_hashes[0].data(),
-                               spki_hash.data(), spki_hash.size()));
+  EXPECT_EQ(0, memcmp(pkp_state.spki_hashes[0].data(),
+                      spki_hash.data(), spki_hash.size()));
 }
 
 // Tests that Expect-CT state is not serialized and persisted when the feature
diff --git a/src/net/http/transport_security_state.cc b/src/net/http/transport_security_state.cc
index de244a1..ba85da0 100644
--- a/src/net/http/transport_security_state.cc
+++ b/src/net/http/transport_security_state.cc
@@ -232,7 +232,7 @@
 
 bool AddHash(const char* sha256_hash, HashValueVector* out) {
   HashValue hash(HASH_VALUE_SHA256);
-  SbMemoryCopy(hash.data(), sha256_hash, hash.size());
+  memcpy(hash.data(), sha256_hash, hash.size());
   out->push_back(hash);
   return true;
 }
diff --git a/src/net/http/transport_security_state_unittest.cc b/src/net/http/transport_security_state_unittest.cc
index 1991ddc..87b1d0e 100644
--- a/src/net/http/transport_security_state_unittest.cc
+++ b/src/net/http/transport_security_state_unittest.cc
@@ -337,14 +337,14 @@
   static HashValueVector GetSampleSPKIHashes() {
     HashValueVector spki_hashes;
     HashValue hash(HASH_VALUE_SHA256);
-    SbMemorySet(hash.data(), 0, hash.size());
+    memset(hash.data(), 0, hash.size());
     spki_hashes.push_back(hash);
     return spki_hashes;
   }
 
   static HashValue GetSampleSPKIHash(uint8_t value) {
     HashValue hash(HASH_VALUE_SHA256);
-    SbMemorySet(hash.data(), value, hash.size());
+    memset(hash.data(), value, hash.size());
     return hash;
   }
 
@@ -690,11 +690,11 @@
   const base::Time current_time(base::Time::Now());
   const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
   HashValue hash1(HASH_VALUE_SHA256);
-  SbMemorySet(hash1.data(), 0x01, hash1.size());
+  memset(hash1.data(), 0x01, hash1.size());
   HashValue hash2(HASH_VALUE_SHA256);
-  SbMemorySet(hash2.data(), 0x02, hash1.size());
+  memset(hash2.data(), 0x02, hash1.size());
   HashValue hash3(HASH_VALUE_SHA256);
-  SbMemorySet(hash3.data(), 0x03, hash1.size());
+  memset(hash3.data(), 0x03, hash1.size());
 
   state.AddHPKP("example.com", expiry, true, HashValueVector(1, hash1),
                 report_uri);
diff --git a/src/net/net.gyp b/src/net/net.gyp
index 13d2c9b..5f96584 100644
--- a/src/net/net.gyp
+++ b/src/net/net.gyp
@@ -2098,7 +2098,7 @@
         'proxy_resolution/proxy_list_unittest.cc',
         'proxy_resolution/proxy_resolution_service_unittest.cc',
         'proxy_resolution/proxy_server_unittest.cc',
-        # We still have Mozjs.
+        # not useful to us.
         # 'proxy_resolution/proxy_resolver_v8_tracing_unittest.cc',
         # 'proxy_resolution/proxy_resolver_v8_tracing_wrapper_unittest.cc',
         # 'proxy_resolution/proxy_resolver_v8_unittest.cc',
diff --git a/src/net/network_error_logging/network_error_logging_delegate.cc b/src/net/network_error_logging/network_error_logging_delegate.cc
index 64b45e5..33d5673 100644
--- a/src/net/network_error_logging/network_error_logging_delegate.cc
+++ b/src/net/network_error_logging/network_error_logging_delegate.cc
@@ -4,7 +4,6 @@
 
 #include "net/network_error_logging/network_error_logging_delegate.h"
 
-#include "nb/cpp14oncpp11.h"
 
 namespace net {
 
diff --git a/src/net/ntlm/ntlm.cc b/src/net/ntlm/ntlm.cc
index f386f4f..ca490ff 100644
--- a/src/net/ntlm/ntlm.cc
+++ b/src/net/ntlm/ntlm.cc
@@ -171,7 +171,7 @@
   keys[16] = ntlm_hash[14];
   keys[17] = ntlm_hash[14] << 7 | ntlm_hash[15] >> 1;
   keys[18] = ntlm_hash[15] << 6;
-  SbMemorySet(keys.data() + 19, 0, 5);
+  memset(keys.data() + 19, 0, 5);
 }
 
 void GenerateNtlmHashV1(const base::string16& password,
@@ -236,7 +236,7 @@
 
   // In NTLM v1 (with LMv1 disabled), the lm_response and ntlm_response are the
   // same. So just copy the ntlm_response into the lm_response.
-  SbMemoryCopy(lm_response.data(), ntlm_response.data(), kResponseLenV1);
+  memcpy(lm_response.data(), ntlm_response.data(), kResponseLenV1);
 }
 
 void GenerateLMResponseV1WithSessionSecurity(
@@ -244,8 +244,8 @@
     base::span<uint8_t, kResponseLenV1> lm_response) {
   // In NTLM v1 with Session Security (aka NTLM2) the lm_response is 8 bytes of
   // client challenge and 16 bytes of zeros. (See 3.3.1)
-  SbMemoryCopy(lm_response.data(), client_challenge.data(), kChallengeLen);
-  SbMemorySet(lm_response.data() + kChallengeLen, 0,
+  memcpy(lm_response.data(), client_challenge.data(), kChallengeLen);
+  memset(lm_response.data() + kChallengeLen, 0,
               kResponseLenV1 - kChallengeLen);
 }
 
diff --git a/src/net/ntlm/ntlm_buffer_reader.cc b/src/net/ntlm/ntlm_buffer_reader.cc
index 673073b..9e55340 100644
--- a/src/net/ntlm/ntlm_buffer_reader.cc
+++ b/src/net/ntlm/ntlm_buffer_reader.cc
@@ -59,7 +59,7 @@
   if (buffer.empty())
     return true;
 
-  SbMemoryCopy(buffer.data(), GetBufferAtCursor(), buffer.size());
+  memcpy(buffer.data(), GetBufferAtCursor(), buffer.size());
 
   AdvanceCursor(buffer.size());
   return true;
@@ -73,7 +73,7 @@
   if (buffer.empty())
     return true;
 
-  SbMemoryCopy(buffer.data(), GetBufferPtr() + sec_buf.offset, sec_buf.length);
+  memcpy(buffer.data(), GetBufferPtr() + sec_buf.offset, sec_buf.length);
 
   return true;
 }
@@ -243,7 +243,7 @@
   if (!CanRead(kSignatureLen))
     return false;
 
-  if (SbMemoryCompare(kSignature, GetBufferAtCursor(), kSignatureLen) != 0)
+  if (memcmp(kSignature, GetBufferAtCursor(), kSignatureLen) != 0)
     return false;
 
   AdvanceCursor(kSignatureLen);
diff --git a/src/net/ntlm/ntlm_buffer_reader_unittest.cc b/src/net/ntlm/ntlm_buffer_reader_unittest.cc
index 5dd4952..f753988 100644
--- a/src/net/ntlm/ntlm_buffer_reader_unittest.cc
+++ b/src/net/ntlm/ntlm_buffer_reader_unittest.cc
@@ -147,7 +147,7 @@
 #else
   ASSERT_TRUE(reader.ReadBytes(actual));
 #endif
-  ASSERT_EQ(0, SbMemoryCompare(actual, expected, base::size(actual)));
+  ASSERT_EQ(0, memcmp(actual, expected, base::size(actual)));
   ASSERT_TRUE(reader.IsEndOfBuffer());
 #ifdef STARBOARD
   ASSERT_FALSE(reader.ReadBytes(base::span<uint8_t>(actual, 1)));
@@ -475,7 +475,7 @@
   // Verify the domain name AvPair.
   ASSERT_EQ(TargetInfoAvId::kDomainName, av_pairs[0].avid);
   ASSERT_EQ(8, av_pairs[0].avlen);
-  ASSERT_EQ(0, SbMemoryCompare(buf + 4, av_pairs[0].buffer.data(), 8));
+  ASSERT_EQ(0, memcmp(buf + 4, av_pairs[0].buffer.data(), 8));
 }
 
 TEST(NtlmBufferReaderTest, ReadTargetInfoNoTerminator) {
diff --git a/src/net/ntlm/ntlm_buffer_writer.cc b/src/net/ntlm/ntlm_buffer_writer.cc
index bc6ce50..66451ab 100644
--- a/src/net/ntlm/ntlm_buffer_writer.cc
+++ b/src/net/ntlm/ntlm_buffer_writer.cc
@@ -57,7 +57,7 @@
   if (!CanWrite(bytes.size()))
     return false;
 
-  SbMemoryCopy(GetBufferPtrAtCursor(), bytes.data(), bytes.size());
+  memcpy(GetBufferPtrAtCursor(), bytes.data(), bytes.size());
   AdvanceCursor(bytes.size());
   return true;
 }
@@ -69,7 +69,7 @@
   if (!CanWrite(count))
     return false;
 
-  SbMemorySet(GetBufferPtrAtCursor(), 0, count);
+  memset(GetBufferPtrAtCursor(), 0, count);
   AdvanceCursor(count);
   return true;
 }
@@ -149,7 +149,7 @@
     ptr[i + 1] = str[i / 2] >> 8;
   }
 #else
-  SbMemoryCopy(reinterpret_cast<void*>(GetBufferPtrAtCursor()), str.c_str(),
+  memcpy(reinterpret_cast<void*>(GetBufferPtrAtCursor()), str.c_str(),
                num_bytes);
 
 #endif
diff --git a/src/net/ntlm/ntlm_buffer_writer_unittest.cc b/src/net/ntlm/ntlm_buffer_writer_unittest.cc
index 4ddad40..73020c6 100644
--- a/src/net/ntlm/ntlm_buffer_writer_unittest.cc
+++ b/src/net/ntlm/ntlm_buffer_writer_unittest.cc
@@ -94,8 +94,8 @@
   ASSERT_EQ(base::size(expected), writer.GetLength());
   ASSERT_FALSE(writer.WriteUInt16(value));
 
-  ASSERT_EQ(0, SbMemoryCompare(expected, writer.GetBuffer().data(),
-                               base::size(expected)));
+  ASSERT_EQ(0, memcmp(expected, writer.GetBuffer().data(),
+                      base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, Write16PastEob) {
@@ -116,7 +116,7 @@
   ASSERT_FALSE(writer.WriteUInt32(value));
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, Write32PastEob) {
@@ -137,7 +137,7 @@
   ASSERT_FALSE(writer.WriteUInt64(value));
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, Write64PastEob) {
@@ -159,7 +159,7 @@
   ASSERT_TRUE(writer.WriteBytes(expected));
 #endif
   ASSERT_EQ(
-      0, SbMemoryCompare(GetBufferPtr(writer), expected, base::size(expected)));
+      0, memcmp(GetBufferPtr(writer), expected, base::size(expected)));
   ASSERT_TRUE(writer.IsEndOfBuffer());
 #ifdef STARBOARD
   ASSERT_FALSE(writer.WriteBytes(base::span<const uint8_t>(expected, 1)));
@@ -168,7 +168,7 @@
 #endif
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteBytesPastEob) {
@@ -196,7 +196,7 @@
   ASSERT_FALSE(writer.WriteSecurityBuffer(SecurityBuffer(offset, length)));
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteSecurityBufferPastEob) {
@@ -217,7 +217,7 @@
   ASSERT_FALSE(writer.WriteUtf8String(value));
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteAsciiStringPastEob) {
@@ -239,7 +239,7 @@
   ASSERT_FALSE(writer.WriteUtf16String(value));
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteUtf16StringPastEob) {
@@ -261,7 +261,7 @@
   ASSERT_FALSE(writer.WriteUtf8AsUtf16String(input));
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteSignature) {
@@ -272,7 +272,7 @@
   ASSERT_TRUE(writer.IsEndOfBuffer());
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteSignaturePastEob) {
@@ -307,7 +307,7 @@
   ASSERT_TRUE(writer.IsEndOfBuffer());
 
   ASSERT_EQ(
-      0, SbMemoryCompare(expected, GetBufferPtr(writer), base::size(expected)));
+      0, memcmp(expected, GetBufferPtr(writer), base::size(expected)));
 }
 
 TEST(NtlmBufferWriterTest, WriteAvPairHeaderPastEob) {
diff --git a/src/net/ntlm/ntlm_client.cc b/src/net/ntlm/ntlm_client.cc
index 7a2cc5d..3544041 100644
--- a/src/net/ntlm/ntlm_client.cc
+++ b/src/net/ntlm/ntlm_client.cc
@@ -216,7 +216,7 @@
         GenerateUpdatedTargetInfo(IsMicEnabled(), IsEpaEnabled(),
                                   channel_bindings, spn, av_pairs, &timestamp);
 
-    SbMemorySet(lm_response, 0, kResponseLenV1);
+    memset(lm_response, 0, kResponseLenV1);
     if (timestamp == UINT64_MAX) {
       // If the server didn't send a time, then use the clients time.
       timestamp = client_time;
diff --git a/src/net/ntlm/ntlm_client_unittest.cc b/src/net/ntlm/ntlm_client_unittest.cc
index c136c9e..4a1c71a 100644
--- a/src/net/ntlm/ntlm_client_unittest.cc
+++ b/src/net/ntlm/ntlm_client_unittest.cc
@@ -108,8 +108,8 @@
   std::vector<uint8_t> result = client.GetNegotiateMessage();
 
   ASSERT_EQ(kNegotiateMessageLen, result.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNegotiateMsg, result.data(),
-                               kNegotiateMessageLen));
+  ASSERT_EQ(0, memcmp(test::kExpectedNegotiateMsg, result.data(),
+                      kNegotiateMessageLen));
 }
 
 TEST(NtlmClientTest, MinimalStructurallyValidChallenge) {
@@ -131,7 +131,7 @@
   // In reality the offset should always be ignored if the length is zero.
   // Also implementations often just write zeros.
   uint8_t raw[kMinChallengeHeaderLen];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Modify the default valid message to overwrite the offset to zero.
   ASSERT_NE(0x00, raw[16]);
   raw[16] = 0x00;
@@ -157,7 +157,7 @@
 
   // Fail because the first 8 bytes don't match "NTLMSSP\0"
   uint8_t raw[kMinChallengeHeaderLen];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Modify the default valid message to overwrite the last byte of the
   // signature.
   ASSERT_NE(0xff, raw[7]);
@@ -173,7 +173,7 @@
   // Fail because the message type should be MessageType::kChallenge
   // (0x00000002)
   uint8_t raw[kMinChallengeHeaderLen];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Modify the message type.
   ASSERT_NE(0x03, raw[8]);
   raw[8] = 0x03;
@@ -193,7 +193,7 @@
   // In reality the offset should always be ignored if the length is zero.
   // Also implementations often just write zeros.
   uint8_t raw[kMinChallengeHeaderLen];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Modify the default valid message to overwrite the offset to zero.
   ASSERT_NE(0x00, raw[16]);
   raw[16] = 0x00;
@@ -209,7 +209,7 @@
 
   // One extra byte is provided for target name.
   uint8_t raw[kMinChallengeHeaderLen + 1];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Put something in the target name.
   raw[kMinChallengeHeaderLen] = 'Z';
 
@@ -231,7 +231,7 @@
   NtlmClient client(NtlmFeatures(false));
 
   uint8_t raw[kMinChallengeHeaderLen];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Modify the default valid message to claim that the target name field is 1
   // byte long overrunning the end of the message message.
   ASSERT_NE(0x01, raw[12]);
@@ -256,7 +256,7 @@
   // Message has 1 extra byte of space after the header for the target name.
   // One extra byte is provided for target name.
   uint8_t raw[kMinChallengeHeaderLen + 1];
-  SbMemoryCopy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
+  memcpy(raw, test::kMinChallengeMessage, kMinChallengeHeaderLen);
   // Put something in the target name.
   raw[kMinChallengeHeaderLen] = 'Z';
 
@@ -286,8 +286,8 @@
   ASSERT_FALSE(result.empty());
   ASSERT_EQ(base::size(test::kExpectedAuthenticateMsgSpecResponseV1),
             result.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedAuthenticateMsgSpecResponseV1,
-                               result.data(), result.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedAuthenticateMsgSpecResponseV1,
+                      result.data(), result.size()));
 }
 
 TEST(NtlmClientTest, Type3WithoutUnicode) {
@@ -318,10 +318,10 @@
   ASSERT_TRUE(ReadBytesPayload(&reader, actual_lm_response));
   ASSERT_TRUE(ReadBytesPayload(&reader, actual_ntlm_response));
 
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedLmResponseWithV1SS,
-                               actual_lm_response, kResponseLenV1));
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNtlmResponseWithV1SS,
-                               actual_ntlm_response, kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedLmResponseWithV1SS,
+                      actual_lm_response, kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedNtlmResponseWithV1SS,
+                      actual_ntlm_response, kResponseLenV1));
 
   std::string domain;
   std::string username;
@@ -375,10 +375,10 @@
   // The important part of this test is that even though the
   // server told the client to drop session security. The client
   // DID NOT drop it.
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedLmResponseWithV1SS,
-                               actual_lm_response, kResponseLenV1));
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNtlmResponseWithV1SS,
-                               actual_ntlm_response, kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedLmResponseWithV1SS,
+                      actual_lm_response, kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedNtlmResponseWithV1SS,
+                      actual_ntlm_response, kResponseLenV1));
 
   base::string16 domain;
   base::string16 username;
@@ -420,8 +420,8 @@
   std::vector<uint8_t> result = client.GetNegotiateMessage();
   ASSERT_FALSE(result.empty());
   ASSERT_EQ(base::size(test::kExpectedNegotiateMsg), result.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNegotiateMsg, result.data(),
-                               result.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedNegotiateMsg, result.data(),
+                      result.size()));
 }
 
 TEST(NtlmClientTest, VerifyAuthenticateMessageV2) {
@@ -433,8 +433,8 @@
   ASSERT_FALSE(result.empty());
   ASSERT_EQ(base::size(test::kExpectedAuthenticateMsgSpecResponseV2),
             result.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedAuthenticateMsgSpecResponseV2,
-                               result.data(), result.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedAuthenticateMsgSpecResponseV2,
+                      result.data(), result.size()));
 }
 
 TEST(NtlmClientTest,
@@ -450,8 +450,8 @@
 
   ASSERT_EQ(base::size(test::kExpectedAuthenticateMsgToOldV1ChallegeV2),
             result.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedAuthenticateMsgToOldV1ChallegeV2,
-                               result.data(), result.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedAuthenticateMsgToOldV1ChallegeV2,
+                      result.data(), result.size()));
 }
 
 }  // namespace ntlm
diff --git a/src/net/ntlm/ntlm_unittest.cc b/src/net/ntlm/ntlm_unittest.cc
index 4e05b66..927c5ce 100644
--- a/src/net/ntlm/ntlm_unittest.cc
+++ b/src/net/ntlm/ntlm_unittest.cc
@@ -100,7 +100,7 @@
 TEST(NtlmTest, GenerateNtlmHashV1PasswordSpecTests) {
   uint8_t hash[kNtlmHashLen];
   GenerateNtlmHashV1(test::kPassword, hash);
-  ASSERT_EQ(0, SbMemoryCompare(hash, test::kExpectedNtlmHashV1, kNtlmHashLen));
+  ASSERT_EQ(0, memcmp(hash, test::kExpectedNtlmHashV1, kNtlmHashLen));
 }
 
 TEST(NtlmTest, GenerateNtlmHashV1PasswordChangesHash) {
@@ -113,7 +113,7 @@
   GenerateNtlmHashV1(password2, hash2);
 
   // Verify that the hash is different with a different password.
-  ASSERT_NE(0, SbMemoryCompare(hash1, hash2, kNtlmHashLen));
+  ASSERT_NE(0, memcmp(hash1, hash2, kNtlmHashLen));
 }
 
 TEST(NtlmTest, GenerateResponsesV1SpecTests) {
@@ -122,16 +122,16 @@
   GenerateResponsesV1(test::kPassword, test::kServerChallenge, lm_response,
                       ntlm_response);
 
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNtlmResponseV1, ntlm_response,
-                               kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedNtlmResponseV1, ntlm_response,
+                      kResponseLenV1));
 
   // This implementation never sends an LMv1 response (spec equivalent of the
   // client variable NoLMResponseNTLMv1 being false) so the LM response is
   // equal to the NTLM response when
   // NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY is not negotiated. See
   // [MS-NLMP] Section 3.3.1.
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNtlmResponseV1, lm_response,
-                               kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedNtlmResponseV1, lm_response,
+                      kResponseLenV1));
 }
 
 TEST(NtlmTest, GenerateResponsesV1WithSessionSecuritySpecTests) {
@@ -141,10 +141,10 @@
       test::kPassword, test::kServerChallenge, test::kClientChallenge,
       lm_response, ntlm_response);
 
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedLmResponseWithV1SS, lm_response,
-                               kResponseLenV1));
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedNtlmResponseWithV1SS,
-                               ntlm_response, kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedLmResponseWithV1SS, lm_response,
+                      kResponseLenV1));
+  ASSERT_EQ(0, memcmp(test::kExpectedNtlmResponseWithV1SS,
+                      ntlm_response, kResponseLenV1));
 }
 
 TEST(NtlmTest, GenerateResponsesV1WithSessionSecurityClientChallengeUsed) {
@@ -155,8 +155,8 @@
   uint8_t client_challenge1[kChallengeLen];
   uint8_t client_challenge2[kChallengeLen];
 
-  SbMemorySet(client_challenge1, 0x01, kChallengeLen);
-  SbMemorySet(client_challenge2, 0x02, kChallengeLen);
+  memset(client_challenge1, 0x01, kChallengeLen);
+  memset(client_challenge2, 0x02, kChallengeLen);
 
   GenerateResponsesV1WithSessionSecurity(
       test::kPassword, test::kServerChallenge, client_challenge1, lm_response1,
@@ -167,12 +167,12 @@
 
   // The point of session security is that the client can introduce some
   // randomness, so verify different client_challenge gives a different result.
-  ASSERT_NE(0, SbMemoryCompare(lm_response1, lm_response2, kResponseLenV1));
-  ASSERT_NE(0, SbMemoryCompare(ntlm_response1, ntlm_response2, kResponseLenV1));
+  ASSERT_NE(0, memcmp(lm_response1, lm_response2, kResponseLenV1));
+  ASSERT_NE(0, memcmp(ntlm_response1, ntlm_response2, kResponseLenV1));
 
   // With session security the lm and ntlm hash should be different.
-  ASSERT_NE(0, SbMemoryCompare(lm_response1, ntlm_response1, kResponseLenV1));
-  ASSERT_NE(0, SbMemoryCompare(lm_response2, ntlm_response2, kResponseLenV1));
+  ASSERT_NE(0, memcmp(lm_response1, ntlm_response1, kResponseLenV1));
+  ASSERT_NE(0, memcmp(lm_response2, ntlm_response2, kResponseLenV1));
 }
 
 TEST(NtlmTest, GenerateResponsesV1WithSessionSecurityVerifySSUsed) {
@@ -189,8 +189,8 @@
 
   // Verify that the responses with session security are not the
   // same as without it.
-  ASSERT_NE(0, SbMemoryCompare(lm_response1, lm_response2, kResponseLenV1));
-  ASSERT_NE(0, SbMemoryCompare(ntlm_response1, ntlm_response2, kResponseLenV1));
+  ASSERT_NE(0, memcmp(lm_response1, lm_response2, kResponseLenV1));
+  ASSERT_NE(0, memcmp(ntlm_response1, ntlm_response2, kResponseLenV1));
 }
 
 // ------------------------------------------------
@@ -200,7 +200,7 @@
 TEST(NtlmTest, GenerateNtlmHashV2SpecTests) {
   uint8_t hash[kNtlmHashLen];
   GenerateNtlmHashV2(test::kNtlmDomain, test::kUser, test::kPassword, hash);
-  ASSERT_EQ(0, SbMemoryCompare(hash, test::kExpectedNtlmHashV2, kNtlmHashLen));
+  ASSERT_EQ(0, memcmp(hash, test::kExpectedNtlmHashV2, kNtlmHashLen));
 }
 
 TEST(NtlmTest, GenerateProofInputV2SpecTests) {
@@ -211,8 +211,8 @@
 
   // |GenerateProofInputV2| generates the first |kProofInputLenV2| bytes of
   // what [MS-NLMP] calls "temp".
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedTempFromSpecV2,
-                               proof_input.data(), proof_input.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedTempFromSpecV2,
+                      proof_input.data(), proof_input.size()));
 }
 
 TEST(NtlmTest, GenerateNtlmProofV2SpecTests) {
@@ -225,8 +225,8 @@
                           .subspan<0, kProofInputLenV2>(),
                       test::kExpectedTargetInfoFromSpecV2, v2_proof);
 
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedProofFromSpecV2, v2_proof,
-                               kNtlmProofLenV2));
+  ASSERT_EQ(0, memcmp(test::kExpectedProofFromSpecV2, v2_proof,
+                      kNtlmProofLenV2));
 }
 
 TEST(NtlmTest, GenerateSessionBaseKeyV2SpecTests) {
@@ -236,8 +236,8 @@
                            test::kExpectedProofFromSpecV2, session_base_key);
 
   // Verify the session base key.
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedSessionBaseKeyFromSpecV2,
-                               session_base_key, kSessionKeyLenV2));
+  ASSERT_EQ(0, memcmp(test::kExpectedSessionBaseKeyFromSpecV2,
+                      session_base_key, kSessionKeyLenV2));
 }
 
 TEST(NtlmTest, GenerateSessionBaseKeyWithClientTimestampV2SpecTests) {
@@ -249,8 +249,8 @@
 
   // Verify the session base key.
   ASSERT_EQ(0,
-            SbMemoryCompare(test::kExpectedSessionBaseKeyWithClientTimestampV2,
-                            session_base_key, kSessionKeyLenV2));
+            memcmp(test::kExpectedSessionBaseKeyWithClientTimestampV2,
+                   session_base_key, kSessionKeyLenV2));
 }
 
 TEST(NtlmTest, GenerateChannelBindingHashV2SpecTests) {
@@ -258,8 +258,8 @@
   GenerateChannelBindingHashV2(test::kChannelBindings, v2_channel_binding_hash);
 
   ASSERT_EQ(0,
-            SbMemoryCompare(test::kExpectedChannelBindingHashV2,
-                            v2_channel_binding_hash, kChannelBindingsHashLen));
+            memcmp(test::kExpectedChannelBindingHashV2,
+                   v2_channel_binding_hash, kChannelBindingsHashLen));
 }
 
 TEST(NtlmTest, GenerateMicV2Simple) {
@@ -288,14 +288,14 @@
 #else
   GenerateMicV2(test::kExpectedSessionBaseKeyFromSpecV2, a, b, c, mic);
 #endif
-  ASSERT_EQ(0, SbMemoryCompare(expected_mic, mic, kMicLenV2));
+  ASSERT_EQ(0, memcmp(expected_mic, mic, kMicLenV2));
 }
 
 TEST(NtlmTest, GenerateMicSpecResponseV2) {
   std::vector<uint8_t> authenticate_msg(
       std::begin(test::kExpectedAuthenticateMsgSpecResponseV2),
       std::end(test::kExpectedAuthenticateMsgSpecResponseV2));
-  SbMemorySet(&authenticate_msg[kMicOffsetV2], 0x00, kMicLenV2);
+  memset(&authenticate_msg[kMicOffsetV2], 0x00, kMicLenV2);
 
   uint8_t mic[kMicLenV2];
 #ifdef STARBOARD
@@ -313,7 +313,7 @@
                 test::kExpectedNegotiateMsg, test::kChallengeMsgFromSpecV2,
                 authenticate_msg, mic);
 #endif
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedMicV2, mic, kMicLenV2));
+  ASSERT_EQ(0, memcmp(test::kExpectedMicV2, mic, kMicLenV2));
 }
 
 TEST(NtlmTest, GenerateUpdatedTargetInfo) {
@@ -334,9 +334,9 @@
   // 3) A target name AVPair containing the SPN of the server.
   ASSERT_EQ(base::size(test::kExpectedTargetInfoSpecResponseV2),
             updated_target_info.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedTargetInfoSpecResponseV2,
-                               updated_target_info.data(),
-                               updated_target_info.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedTargetInfoSpecResponseV2,
+                      updated_target_info.data(),
+                      updated_target_info.size()));
 }
 
 TEST(NtlmTest, GenerateUpdatedTargetInfoNoEpaOrMic) {
@@ -355,9 +355,9 @@
       &server_timestamp);
   ASSERT_EQ(base::size(test::kExpectedTargetInfoFromSpecV2),
             updated_target_info.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedTargetInfoFromSpecV2,
-                               updated_target_info.data(),
-                               updated_target_info.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedTargetInfoFromSpecV2,
+                      updated_target_info.data(),
+                      updated_target_info.size()));
 }
 
 TEST(NtlmTest, GenerateUpdatedTargetInfoWithServerTimestamp) {
@@ -383,7 +383,7 @@
   ASSERT_EQ(test::kServerTimestamp, server_timestamp);
   ASSERT_EQ(base::size(test::kExpectedTargetInfoFromSpecPlusServerTimestampV2),
             updated_target_info.size());
-  ASSERT_EQ(0, SbMemoryCompare(
+  ASSERT_EQ(0, memcmp(
                    test::kExpectedTargetInfoFromSpecPlusServerTimestampV2,
                    updated_target_info.data(), updated_target_info.size()));
 }
@@ -411,10 +411,10 @@
   ASSERT_EQ(base::size(test::kExpectedTargetInfoSpecResponseV2) -
                 kMissingServerPairsLength,
             updated_target_info.size());
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedTargetInfoSpecResponseV2 +
-                                   kMissingServerPairsLength,
-                               updated_target_info.data(),
-                               updated_target_info.size()));
+  ASSERT_EQ(0, memcmp(test::kExpectedTargetInfoSpecResponseV2 +
+                        kMissingServerPairsLength,
+                      updated_target_info.data(),
+                      updated_target_info.size()));
 }
 
 TEST(NtlmTest, GenerateNtlmProofV2) {
@@ -424,8 +424,8 @@
                       base::make_span(test::kExpectedTempFromSpecV2)
                           .subspan<0, kProofInputLenV2>(),
                       test::kExpectedTargetInfoSpecResponseV2, proof);
-  ASSERT_EQ(0, SbMemoryCompare(test::kExpectedProofSpecResponseV2, proof,
-                               kNtlmProofLenV2));
+  ASSERT_EQ(0, memcmp(test::kExpectedProofSpecResponseV2, proof,
+                      kNtlmProofLenV2));
 }
 
 TEST(NtlmTest, GenerateNtlmProofWithClientTimestampV2) {
@@ -439,8 +439,8 @@
                           .subspan<0, kProofInputLenV2>(),
                       test::kExpectedTargetInfoSpecResponseV2, proof);
   ASSERT_EQ(
-      0, SbMemoryCompare(test::kExpectedProofSpecResponseWithClientTimestampV2,
-                         proof, kNtlmProofLenV2));
+      0, memcmp(test::kExpectedProofSpecResponseWithClientTimestampV2,
+                proof, kNtlmProofLenV2));
 }
 
 }  // namespace ntlm
diff --git a/src/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc b/src/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
index 834695a..ecba485 100644
--- a/src/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
+++ b/src/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
@@ -330,7 +330,7 @@
 TEST(DhcpPacFileAdapterFetcher, SanitizeDhcpApiString) {
   base::test::ScopedTaskEnvironment scoped_task_environment;
 
-  const size_t kBaseUrlLen = SbStringGetLength(BASE_URL);
+  const size_t kBaseUrlLen = strlen(BASE_URL);
 
   // Default case.
   EXPECT_EQ(BASE_URL, DhcpPacFileAdapterFetcher::SanitizeDhcpApiString(
diff --git a/src/net/proxy_resolution/proxy_config_service_common_unittest.cc b/src/net/proxy_resolution/proxy_config_service_common_unittest.cc
index 632d3ea..ed90e9f 100644
--- a/src/net/proxy_resolution/proxy_config_service_common_unittest.cc
+++ b/src/net/proxy_resolution/proxy_config_service_common_unittest.cc
@@ -27,7 +27,7 @@
                               bool* did_fail) {
   // If |expected_proxy| is empty, then we expect |actual_proxies| to be so as
   // well.
-  if (SbStringGetLength(expected_proxy) == 0) {
+  if (strlen(expected_proxy) == 0) {
     if (!actual_proxies.IsEmpty()) {
       *did_fail = true;
       *failure_details
diff --git a/src/net/proxy_resolution/proxy_config_service_linux.cc b/src/net/proxy_resolution/proxy_config_service_linux.cc
index 4196c83..63c8928 100644
--- a/src/net/proxy_resolution/proxy_config_service_linux.cc
+++ b/src/net/proxy_resolution/proxy_config_service_linux.cc
@@ -831,7 +831,7 @@
     // fgets() will return NULL on EOF or error.
     while (fgets(line, sizeof(line), input.get())) {
       // fgets() guarantees the line will be properly terminated.
-      size_t length = SbStringGetLength(line);
+      size_t length = strlen(line);
       if (!length)
         continue;
       // This should be true even with CRLF endings.
diff --git a/src/net/proxy_resolution/proxy_resolver_v8.cc b/src/net/proxy_resolution/proxy_resolver_v8.cc
index a63f570..087b7e8 100644
--- a/src/net/proxy_resolution/proxy_resolver_v8.cc
+++ b/src/net/proxy_resolution/proxy_resolver_v8.cc
@@ -186,7 +186,7 @@
 v8::Local<v8::String> ASCIILiteralToV8String(v8::Isolate* isolate,
                                              const char* ascii) {
   DCHECK(base::IsStringASCII(ascii));
-  size_t length = SbStringGetLength(ascii);
+  size_t length = strlen(ascii);
   if (length <= kMaxStringBytesForCopy)
     return v8::String::NewFromUtf8(isolate, ascii, v8::NewStringType::kNormal,
                                    length).ToLocalChecked();
@@ -383,9 +383,9 @@
         // and not V8, so tune down V8 to use as little memory as possible.
         static const char kOptimizeForSize[] = "--optimize_for_size";
         v8::V8::SetFlagsFromString(kOptimizeForSize,
-                                   SbStringGetLength(kOptimizeForSize));
+                                   strlen(kOptimizeForSize));
         static const char kNoOpt[] = "--noopt";
-        v8::V8::SetFlagsFromString(kNoOpt, SbStringGetLength(kNoOpt));
+        v8::V8::SetFlagsFromString(kNoOpt, strlen(kNoOpt));
 
         gin::IsolateHolder::Initialize(
             gin::IsolateHolder::kNonStrictMode,
diff --git a/src/net/quic/bidirectional_stream_quic_impl_unittest.cc b/src/net/quic/bidirectional_stream_quic_impl_unittest.cc
index e9bf33b..74e0013 100644
--- a/src/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/src/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -921,7 +921,7 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header + kResponseBody));
   EXPECT_EQ(12, cb.WaitForResult());
@@ -934,7 +934,7 @@
   size_t spdy_trailers_frame_length;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
@@ -953,7 +953,7 @@
   EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
             delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header.length() + spdy_trailers_frame_length),
             delegate->GetTotalReceivedBytes());
   // Check that NetLog was filled as expected.
@@ -1055,8 +1055,8 @@
   AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset));
   const char kBody1[] = "here are some data";
   const char kBody2[] = "data keep coming";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kBody1));
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(kBody2));
+  quic::QuicString header = ConstructDataHeader(strlen(kBody1));
+  quic::QuicString header2 = ConstructDataHeader(strlen(kBody2));
   std::vector<std::string> two_writes = {kBody1, kBody2};
   AddWrite(ConstructRequestHeadersPacketInner(
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
@@ -1074,11 +1074,11 @@
   const char kBody3[] = "hello there";
   const char kBody4[] = "another piece of small data";
   const char kBody5[] = "really small";
-  quic::QuicString header3 = ConstructDataHeader(SbStringGetLength(kBody3));
-  quic::QuicString header4 = ConstructDataHeader(SbStringGetLength(kBody4));
-  quic::QuicString header5 = ConstructDataHeader(SbStringGetLength(kBody5));
-  quic::QuicStreamOffset data_offset = SbStringGetLength(kBody1) +
-                                       SbStringGetLength(kBody2) +
+  quic::QuicString header3 = ConstructDataHeader(strlen(kBody3));
+  quic::QuicString header4 = ConstructDataHeader(strlen(kBody4));
+  quic::QuicString header5 = ConstructDataHeader(strlen(kBody5));
+  quic::QuicStreamOffset data_offset = strlen(kBody1) +
+                                       strlen(kBody2) +
                                        header.length() + header2.length();
   if (version_ != quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(
@@ -1140,12 +1140,12 @@
   EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header6 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   // Server sends data.
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header6 + kResponseBody));
 
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   // Send a second Data packet.
@@ -1164,7 +1164,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
@@ -1178,14 +1178,14 @@
   EXPECT_EQ(2, delegate->on_data_sent_count());
   EXPECT_EQ(kProtoQUIC, delegate->GetProtocol());
   EXPECT_EQ(static_cast<int64_t>(
-                spdy_request_headers_frame_length + SbStringGetLength(kBody1) +
-                SbStringGetLength(kBody2) + SbStringGetLength(kBody3) +
-                SbStringGetLength(kBody4) + SbStringGetLength(kBody5) +
+                spdy_request_headers_frame_length + strlen(kBody1) +
+                strlen(kBody2) + strlen(kBody3) +
+                strlen(kBody4) + strlen(kBody5) +
                 header.length() + header2.length() + header3.length() +
                 header4.length() + header5.length()),
             delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header6.length() + spdy_trailers_frame_length),
             delegate->GetTotalReceivedBytes());
 }
@@ -1199,7 +1199,7 @@
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset));
   const char kBody1[] = "here are some data";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kBody1));
+  quic::QuicString header = ConstructDataHeader(strlen(kBody1));
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
         2, !kFin, DEFAULT_PRIORITY, &header_stream_offset,
@@ -1213,9 +1213,9 @@
   // Ack server's data packet.
   AddWrite(ConstructClientAckPacket(3, 3, 1, 2));
   const char kBody2[] = "really small";
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(kBody2));
+  quic::QuicString header2 = ConstructDataHeader(strlen(kBody2));
   quic::QuicStreamOffset data_offset =
-      SbStringGetLength(kBody1) + header.length();
+      strlen(kBody1) + header.length();
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(
         4, !kIncludeVersion, kFin, data_offset, {header2, kBody2}));
@@ -1268,11 +1268,11 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   quic::QuicString header3 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header3 + kResponseBody));
 
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   // Send a second Data packet.
@@ -1286,7 +1286,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
@@ -1300,11 +1300,11 @@
   EXPECT_EQ(2, delegate->on_data_sent_count());
   EXPECT_EQ(kProtoQUIC, delegate->GetProtocol());
   EXPECT_EQ(static_cast<int64_t>(
-                spdy_request_headers_frame_length + SbStringGetLength(kBody1) +
-                SbStringGetLength(kBody2) + header.length() + header2.length()),
+                spdy_request_headers_frame_length + strlen(kBody1) +
+                strlen(kBody2) + header.length() + header2.length()),
             delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header3.length() + spdy_trailers_frame_length),
             delegate->GetTotalReceivedBytes());
 }
@@ -1319,8 +1319,8 @@
   AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset));
   const char kBody1[] = "here are some data";
   const char kBody2[] = "data keep coming";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kBody1));
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(kBody2));
+  quic::QuicString header = ConstructDataHeader(strlen(kBody1));
+  quic::QuicString header2 = ConstructDataHeader(strlen(kBody2));
 
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
@@ -1337,11 +1337,11 @@
   const char kBody3[] = "hello there";
   const char kBody4[] = "another piece of small data";
   const char kBody5[] = "really small";
-  quic::QuicString header3 = ConstructDataHeader(SbStringGetLength(kBody3));
-  quic::QuicString header4 = ConstructDataHeader(SbStringGetLength(kBody4));
-  quic::QuicString header5 = ConstructDataHeader(SbStringGetLength(kBody5));
-  quic::QuicStreamOffset data_offset = SbStringGetLength(kBody1) +
-                                       SbStringGetLength(kBody2) +
+  quic::QuicString header3 = ConstructDataHeader(strlen(kBody3));
+  quic::QuicString header4 = ConstructDataHeader(strlen(kBody4));
+  quic::QuicString header5 = ConstructDataHeader(strlen(kBody5));
+  quic::QuicStreamOffset data_offset = strlen(kBody1) +
+                                       strlen(kBody2) +
                                        header.length() + header2.length();
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(
@@ -1398,12 +1398,12 @@
   EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header6 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   // Server sends data.
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header6 + kResponseBody));
 
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   // Send a second Data packet.
@@ -1422,7 +1422,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
@@ -1436,14 +1436,14 @@
   EXPECT_EQ(2, delegate->on_data_sent_count());
   EXPECT_EQ(kProtoQUIC, delegate->GetProtocol());
   EXPECT_EQ(static_cast<int64_t>(
-                spdy_request_headers_frame_length + SbStringGetLength(kBody1) +
-                SbStringGetLength(kBody2) + SbStringGetLength(kBody3) +
-                SbStringGetLength(kBody4) + SbStringGetLength(kBody5) +
+                spdy_request_headers_frame_length + strlen(kBody1) +
+                strlen(kBody2) + strlen(kBody3) +
+                strlen(kBody4) + strlen(kBody5) +
                 header.length() + header2.length() + header3.length() +
                 header4.length() + header5.length()),
             delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header6.length() + spdy_trailers_frame_length),
             delegate->GetTotalReceivedBytes());
 }
@@ -1532,7 +1532,7 @@
   AddWrite(ConstructRequestHeadersPacketInner(
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
                                                      0, {header, kUploadData}));
@@ -1585,19 +1585,19 @@
   EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   // Server sends data.
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header2 + kResponseBody));
 
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   size_t spdy_trailers_frame_length;
   spdy::SpdyHeaderBlock trailers;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
@@ -1612,10 +1612,10 @@
   EXPECT_EQ(kProtoQUIC, delegate->GetProtocol());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_request_headers_frame_length +
-                           SbStringGetLength(kUploadData) + header.length()),
+                           strlen(kUploadData) + header.length()),
       delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header2.length() + spdy_trailers_frame_length),
             delegate->GetTotalReceivedBytes());
 }
@@ -1628,7 +1628,7 @@
   AddWrite(ConstructRequestHeadersPacketInner(
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
                                                      0, {header, kUploadData}));
@@ -1683,18 +1683,18 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header2 + kResponseBody));
 
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   size_t spdy_trailers_frame_length;
   spdy::SpdyHeaderBlock trailers;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
@@ -1709,10 +1709,10 @@
   EXPECT_EQ(kProtoQUIC, delegate->GetProtocol());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_request_headers_frame_length +
-                           SbStringGetLength(kUploadData) + header.length()),
+                           strlen(kUploadData) + header.length()),
       delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header2.length() + spdy_trailers_frame_length),
             delegate->GetTotalReceivedBytes());
 }
@@ -1726,19 +1726,19 @@
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
 
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ != quic::QUIC_VERSION_99) {
     AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 2, !kFin, 0,
                                        kUploadData, &client_maker_));
     AddWrite(ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 3, 3, kFin,
-                                       SbStringGetLength(kUploadData),
+                                       strlen(kUploadData),
                                        kUploadData, &client_maker_));
   } else {
     AddWrite(ConstructAckAndMultipleDataFramesPacket(
         3, !kIncludeVersion, 2, 1, 1, !kFin, 0, {header, kUploadData}));
     AddWrite(ConstructAckAndMultipleDataFramesPacket(
         4, !kIncludeVersion, 3, 3, 3, kFin,
-        SbStringGetLength(kUploadData) + header.length(),
+        strlen(kUploadData) + header.length(),
         {header, kUploadData}));
   }
   Initialize();
@@ -1784,13 +1784,13 @@
   const char kResponseBody[] = "Hello world!";
 
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   // Server sends a data packet.
   ProcessPacket(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 1, !kFin,
                                           0, header2 + kResponseBody,
                                           &server_maker_));
 
-  EXPECT_EQ(static_cast<int64_t>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)),
             cb.WaitForResult());
   EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
 
@@ -1803,10 +1803,10 @@
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   ProcessPacket(ConstructAckAndDataPacket(
       4, !kIncludeVersion, 3, 1, 1, kFin,
-      SbStringGetLength(kResponseBody) + header2.length(),
+      strlen(kResponseBody) + header2.length(),
       header2 + kResponseBody, &server_maker_));
 
-  EXPECT_EQ(static_cast<int64_t>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)),
             cb2.WaitForResult());
 
   std::string expected_body(kResponseBody);
@@ -1818,11 +1818,11 @@
   EXPECT_EQ(2, delegate->on_data_sent_count());
   EXPECT_EQ(kProtoQUIC, delegate->GetProtocol());
   EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
-                                 2 * SbStringGetLength(kUploadData) +
+                                 2 * strlen(kUploadData) +
                                  2 * header.length()),
             delegate->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
-                                 2 * SbStringGetLength(kResponseBody) +
+                                 2 * strlen(kResponseBody) +
                                  2 * header2.length()),
             delegate->GetTotalReceivedBytes());
 }
@@ -2260,11 +2260,11 @@
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   // Server sends data.
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header + kResponseBody));
-  EXPECT_EQ(static_cast<int64_t>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   base::RunLoop().RunUntilIdle();
@@ -2282,7 +2282,7 @@
   AddWrite(ConstructRequestHeadersPacketInner(
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kBody));
+  quic::QuicString header = ConstructDataHeader(strlen(kBody));
   if (version_ == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
                                                      0, {header, kBody}));
@@ -2337,13 +2337,13 @@
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
 
   // Server sends data with the fin set, which should result in the stream
   // being closed and hence no RST_STREAM will be sent.
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, kFin, 0,
                                           header2 + kResponseBody));
-  EXPECT_EQ(static_cast<int64_t>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)),
             cb.WaitForResult());
 
   base::RunLoop().RunUntilIdle();
@@ -2401,11 +2401,11 @@
 
   // Server sends data.
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0,
                                           header + kResponseBody));
 
-  EXPECT_EQ(static_cast<int64_t>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)),
             cb.WaitForResult());
   EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
 
@@ -2413,7 +2413,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody));
+      base::NumberToString(strlen(kResponseBody));
   // Server sends trailers.
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset));
diff --git a/src/net/quic/crypto/channel_id_chromium.cc b/src/net/quic/crypto/channel_id_chromium.cc
index fc38daf..75fc9af 100644
--- a/src/net/quic/crypto/channel_id_chromium.cc
+++ b/src/net/quic/crypto/channel_id_chromium.cc
@@ -34,13 +34,13 @@
     return false;
   }
   const size_t len1 =
-      SbStringGetLength(quic::ChannelIDVerifier::kContextStr) + 1;
+      strlen(quic::ChannelIDVerifier::kContextStr) + 1;
   const size_t len2 =
-      SbStringGetLength(quic::ChannelIDVerifier::kClientToServerStr) + 1;
+      strlen(quic::ChannelIDVerifier::kClientToServerStr) + 1;
   std::vector<uint8_t> data(len1 + len2 + signed_data.size());
-  SbMemoryCopy(&data[0], quic::ChannelIDVerifier::kContextStr, len1);
-  SbMemoryCopy(&data[len1], quic::ChannelIDVerifier::kClientToServerStr, len2);
-  SbMemoryCopy(&data[len1 + len2], signed_data.data(), signed_data.size());
+  memcpy(&data[0], quic::ChannelIDVerifier::kContextStr, len1);
+  memcpy(&data[len1], quic::ChannelIDVerifier::kClientToServerStr, len2);
+  memcpy(&data[len1 + len2], signed_data.data(), signed_data.size());
   std::vector<uint8_t> der_signature;
   if (!sig_creator->Sign(&data[0], data.size(), &der_signature)) {
     return false;
@@ -49,7 +49,7 @@
   if (!sig_creator->DecodeSignature(der_signature, &raw_signature)) {
     return false;
   }
-  SbMemoryCopy(base::WriteInto(out_signature, raw_signature.size() + 1),
+  memcpy(base::WriteInto(out_signature, raw_signature.size() + 1),
                &raw_signature[0], raw_signature.size());
   return true;
 }
diff --git a/src/net/quic/crypto/proof_verifier_chromium_test.cc b/src/net/quic/crypto/proof_verifier_chromium_test.cc
index 0e83a57..e676639 100644
--- a/src/net/quic/crypto/proof_verifier_chromium_test.cc
+++ b/src/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -442,7 +442,7 @@
 
 HashValueVector MakeHashValueVector(uint8_t tag) {
   HashValue hash(HASH_VALUE_SHA256);
-  SbMemorySet(hash.data(), tag, hash.size());
+  memset(hash.data(), tag, hash.size());
   HashValueVector hashes;
   hashes.push_back(hash);
   return hashes;
diff --git a/src/net/quic/mock_decrypter.cc b/src/net/quic/mock_decrypter.cc
index ec191d6..6ad9740 100644
--- a/src/net/quic/mock_decrypter.cc
+++ b/src/net/quic/mock_decrypter.cc
@@ -50,7 +50,7 @@
     return false;
   }
 
-  SbMemoryCopy(output, ciphertext.data(), ciphertext.length());
+  memcpy(output, ciphertext.data(), ciphertext.length());
   *output_length = ciphertext.length();
   return true;
 }
diff --git a/src/net/quic/mock_encrypter.cc b/src/net/quic/mock_encrypter.cc
index 5c7138f..a427550 100644
--- a/src/net/quic/mock_encrypter.cc
+++ b/src/net/quic/mock_encrypter.cc
@@ -39,7 +39,7 @@
   if (max_output_length < plaintext.size()) {
     return false;
   }
-  SbMemoryCopy(output, plaintext.data(), plaintext.length());
+  memcpy(output, plaintext.data(), plaintext.length());
   *output_length = plaintext.size();
   return true;
 }
diff --git a/src/net/quic/quic_chromium_client_stream_test.cc b/src/net/quic/quic_chromium_client_stream_test.cc
index d1e253d..3a49a98 100644
--- a/src/net/quic/quic_chromium_client_stream_test.cc
+++ b/src/net/quic/quic_chromium_client_stream_test.cc
@@ -429,7 +429,7 @@
   ProcessHeadersFull(headers_);
 
   const char data[] = "hello world!";
-  int data_len = SbStringGetLength(data);
+  int data_len = strlen(data);
   size_t offset = 0;
   if (GetParam() == quic::QUIC_VERSION_99) {
     quic::QuicString header = ConstructDataHeader(data_len);
@@ -458,7 +458,7 @@
   ProcessHeadersFull(headers_);
 
   const char data[] = "hello world!";
-  int data_len = SbStringGetLength(data);
+  int data_len = strlen(data);
 
   // Start to read the body.
   TestCompletionCallback callback;
@@ -514,7 +514,7 @@
           quic::QUIC_STREAM_CANCELLED, 0));
 
   const char data[] = "hello world!";
-  int data_len = SbStringGetLength(data);
+  int data_len = strlen(data);
 
   // Start to read the body.
   TestCompletionCallback callback;
@@ -555,7 +555,7 @@
   ProcessHeadersFull(headers_);
 
   const char data[] = "hello world!";
-  int data_len = SbStringGetLength(data);
+  int data_len = strlen(data);
   size_t offset = 0;
   if (GetParam() == quic::QUIC_VERSION_99) {
     quic::QuicString header = ConstructDataHeader(data_len);
@@ -581,7 +581,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["bar"] = "foo";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(data));
+      base::NumberToString(strlen(data));
 
   auto t = ProcessTrailers(trailers);
 
@@ -608,7 +608,7 @@
   ProcessHeadersFull(headers_);
 
   const char data[] = "hello world!";
-  int data_len = SbStringGetLength(data);
+  int data_len = strlen(data);
   size_t offset = 0;
   if (GetParam() == quic::QUIC_VERSION_99) {
     quic::QuicString header = ConstructDataHeader(data_len);
@@ -639,7 +639,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["bar"] = "foo";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(data));
+      base::NumberToString(strlen(data));
   quic::QuicHeaderList t = ProcessTrailers(trailers);
   EXPECT_FALSE(stream_->IsDoneReading());
 
@@ -668,7 +668,7 @@
   ProcessHeadersFull(headers_);
 
   const char data[] = "hello world!";
-  int data_len = SbStringGetLength(data);
+  int data_len = strlen(data);
   size_t offset = 0;
   if (GetParam() == quic::QUIC_VERSION_99) {
     quic::QuicString header = ConstructDataHeader(data_len);
@@ -695,7 +695,7 @@
   spdy::SpdyHeaderBlock trailers;
   trailers["bar"] = "foo";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(data));
+      base::NumberToString(strlen(data));
 
   quic::QuicHeaderList t = ProcessTrailers(trailers);
 
@@ -891,7 +891,7 @@
 
   size_t offset = 0;
   if (GetParam() == quic::QUIC_VERSION_99) {
-    quic::QuicString header = ConstructDataHeader(SbStringGetLength(data));
+    quic::QuicString header = ConstructDataHeader(strlen(data));
     stream2->OnStreamFrame(quic::QuicStreamFrame(stream_id,
                                                  /*fin=*/false,
                                                  /*offset=*/offset, header));
diff --git a/src/net/quic/quic_chromium_packet_writer.cc b/src/net/quic/quic_chromium_packet_writer.cc
index 47b7f3b..57acd1a 100644
--- a/src/net/quic/quic_chromium_packet_writer.cc
+++ b/src/net/quic/quic_chromium_packet_writer.cc
@@ -79,7 +79,7 @@
   CHECK_LE(buf_len, capacity_);
   CHECK(HasOneRef());
   size_ = buf_len;
-  SbMemoryCopy(data(), buffer, buf_len);
+  memcpy(data(), buffer, buf_len);
 }
 
 QuicChromiumPacketWriter::QuicChromiumPacketWriter() : weak_factory_(this) {}
diff --git a/src/net/quic/quic_http_stream_test.cc b/src/net/quic/quic_http_stream_test.cc
index 92ef3d1..c43cabf 100644
--- a/src/net/quic/quic_http_stream_test.cc
+++ b/src/net/quic/quic_http_stream_test.cc
@@ -950,21 +950,21 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(3, false, !kFin, /*offset=*/0,
                                           header + kResponseBody));
   spdy::SpdyHeaderBlock trailers;
   size_t spdy_trailers_frame_length;
   trailers["foo"] = "bar";
   trailers[quic::kFinalOffsetHeaderKey] =
-      base::NumberToString(SbStringGetLength(kResponseBody) + header.length());
+      base::NumberToString(strlen(kResponseBody) + header.length());
   ProcessPacket(ConstructResponseTrailersPacket(
       4, kFin, std::move(trailers), &spdy_trailers_frame_length, &offset));
 
   // Make sure trailers are processed.
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
                                       callback_.callback()));
   EXPECT_TRUE(stream_->IsResponseBodyComplete());
@@ -981,7 +981,7 @@
   EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length),
             stream_->GetTotalSentBytes());
   EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length +
-                                 SbStringGetLength(kResponseBody) +
+                                 strlen(kResponseBody) +
                                  header.length() + +spdy_trailers_frame_length),
             stream_->GetTotalReceivedBytes());
   // Check that NetLog was filled as expected.
@@ -1245,7 +1245,7 @@
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
 
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, kFin,
@@ -1264,7 +1264,7 @@
 
   std::vector<std::unique_ptr<UploadElementReader>> element_readers;
   element_readers.push_back(std::make_unique<UploadBytesElementReader>(
-      kUploadData, SbStringGetLength(kUploadData)));
+      kUploadData, strlen(kUploadData)));
   upload_data_stream_ =
       std::make_unique<ElementsUploadDataStream>(std::move(element_readers), 0);
   request_.method = "POST";
@@ -1298,11 +1298,11 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(
       ConstructServerDataPacket(3, false, kFin, 0, header2 + kResponseBody));
   // Since the body has already arrived, this should return immediately.
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
                                       callback_.callback()));
   EXPECT_EQ(0,
@@ -1316,11 +1316,11 @@
   // headers and payload.
   EXPECT_EQ(
       static_cast<int64_t>(spdy_request_headers_frame_length +
-                           SbStringGetLength(kUploadData) + header.length()),
+                           strlen(kUploadData) + header.length()),
       stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header2.length()),
+                           strlen(kResponseBody) + header2.length()),
       stream_->GetTotalReceivedBytes());
 }
 
@@ -1329,7 +1329,7 @@
   size_t spdy_request_headers_frame_length;
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, kFin,
@@ -1348,7 +1348,7 @@
 
   std::vector<std::unique_ptr<UploadElementReader>> element_readers;
   element_readers.push_back(std::make_unique<UploadBytesElementReader>(
-      kUploadData, SbStringGetLength(kUploadData)));
+      kUploadData, strlen(kUploadData)));
   upload_data_stream_ =
       std::make_unique<ElementsUploadDataStream>(std::move(element_readers), 0);
   request_.method = "POST";
@@ -1382,11 +1382,11 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(
       ConstructServerDataPacket(3, false, !kFin, 0, header2 + kResponseBody));
   // Since the body has already arrived, this should return immediately.
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
                                       callback_.callback()));
   ProcessPacket(ConstructServerDataPacket(
@@ -1402,17 +1402,17 @@
   // headers and payload.
   EXPECT_EQ(
       static_cast<int64_t>(spdy_request_headers_frame_length +
-                           SbStringGetLength(kUploadData) + header.length()),
+                           strlen(kUploadData) + header.length()),
       stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header2.length()),
+                           strlen(kResponseBody) + header2.length()),
       stream_->GetTotalReceivedBytes());
 }
 
 TEST_P(QuicHttpStreamTest, SendChunkedPostRequest) {
   SetRequest("POST", "/", DEFAULT_PRIORITY);
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   size_t spdy_request_headers_frame_length;
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
@@ -1475,12 +1475,12 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(
       3, false, kFin, response_data_.length(), header2 + kResponseBody));
 
   // Since the body has already arrived, this should return immediately.
-  ASSERT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
                                       callback_.callback()));
 
@@ -1490,18 +1490,18 @@
   // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
   // headers and payload.
   EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
-                                 SbStringGetLength(kUploadData) * 2 +
+                                 strlen(kUploadData) * 2 +
                                  header.length() * 2),
             stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header2.length()),
+                           strlen(kResponseBody) + header2.length()),
       stream_->GetTotalReceivedBytes());
 }
 
 TEST_P(QuicHttpStreamTest, SendChunkedPostRequestWithFinalEmptyDataPacket) {
   SetRequest("POST", "/", DEFAULT_PRIORITY);
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   size_t spdy_request_headers_frame_length;
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
@@ -1560,12 +1560,12 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header2 =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(
       3, false, kFin, response_data_.length(), header2 + kResponseBody));
 
   // The body has arrived, but it is delivered asynchronously
-  ASSERT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
                                       callback_.callback()));
   EXPECT_TRUE(stream_->IsResponseBodyComplete());
@@ -1575,11 +1575,11 @@
   // headers and payload.
   EXPECT_EQ(
       static_cast<int64_t>(spdy_request_headers_frame_length +
-                           SbStringGetLength(kUploadData) + header.length()),
+                           strlen(kUploadData) + header.length()),
       stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header2.length()),
+                           strlen(kResponseBody) + header2.length()),
       stream_->GetTotalReceivedBytes());
 }
 
@@ -1632,12 +1632,12 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(ConstructServerDataPacket(
       3, false, kFin, response_data_.length(), header + kResponseBody));
 
   // The body has arrived, but it is delivered asynchronously
-  ASSERT_EQ(static_cast<int>(SbStringGetLength(kResponseBody)),
+  ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
                                       callback_.callback()));
 
@@ -1650,7 +1650,7 @@
             stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header.length()),
+                           strlen(kResponseBody) + header.length()),
       stream_->GetTotalReceivedBytes());
 }
 
@@ -1748,7 +1748,7 @@
   size_t spdy_request_headers_frame_length;
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
@@ -1776,7 +1776,7 @@
   ASSERT_EQ(OK, request_.upload_data_stream->Init(
                     TestCompletionCallback().callback(), NetLogWithSource()));
 
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   chunked_upload_stream->AppendData(kUploadData, chunk_size, false);
   ASSERT_EQ(OK,
             stream_->InitializeStream(&request_, false, DEFAULT_PRIORITY,
@@ -1820,7 +1820,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Error will be surfaced once |upload_data_stream| triggers the next write.
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   chunked_upload_stream->AppendData(kUploadData, chunk_size, true);
   ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
 
@@ -1843,7 +1843,7 @@
   request_.url = GURL("https://www.example.org/");
   request_.upload_data_stream = upload_data_stream_.get();
 
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   chunked_upload_stream->AppendData(kUploadData, chunk_size, true);
 
   ASSERT_EQ(OK, request_.upload_data_stream->Init(
@@ -1891,7 +1891,7 @@
   ASSERT_EQ(ERR_IO_PENDING,
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   chunked_upload_stream->AppendData(kUploadData, chunk_size, true);
   // Error does not surface yet since packet write is triggered by a packet
   // flusher that tries to bundle request body writes.
@@ -1909,7 +1909,7 @@
   size_t spdy_request_headers_frame_length;
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(kUploadData));
+  quic::QuicString header = ConstructDataHeader(strlen(kUploadData));
   if (version_ != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
@@ -1933,7 +1933,7 @@
   request_.url = GURL("https://www.example.org/");
   request_.upload_data_stream = upload_data_stream_.get();
 
-  size_t chunk_size = SbStringGetLength(kUploadData);
+  size_t chunk_size = strlen(kUploadData);
   chunked_upload_stream->AppendData(kUploadData, chunk_size, false);
 
   ASSERT_EQ(OK, request_.upload_data_stream->Init(
@@ -1992,7 +1992,7 @@
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(InnerConstructDataPacket(
       2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_));
 
@@ -2012,7 +2012,7 @@
 
   // As will be the body.
   EXPECT_EQ(
-      static_cast<int>(SbStringGetLength(kResponseBody)),
+      static_cast<int>(strlen(kResponseBody)),
       promised_stream_->ReadResponseBody(
           read_buffer_.get(), read_buffer_->size(), callback_.callback()));
   EXPECT_TRUE(promised_stream_->IsResponseBodyComplete());
@@ -2023,7 +2023,7 @@
   EXPECT_EQ(0, promised_stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header.length()),
+                           strlen(kResponseBody) + header.length()),
       promised_stream_->GetTotalReceivedBytes());
 }
 
@@ -2066,7 +2066,7 @@
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(InnerConstructDataPacket(
       2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_));
 
@@ -2086,7 +2086,7 @@
               IsOk());
 
   EXPECT_EQ(
-      static_cast<int>(SbStringGetLength(kResponseBody)),
+      static_cast<int>(strlen(kResponseBody)),
       promised_stream_->ReadResponseBody(
           read_buffer_.get(), read_buffer_->size(), callback_.callback()));
 
@@ -2099,7 +2099,7 @@
   EXPECT_EQ(0, promised_stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header.length()),
+                           strlen(kResponseBody) + header.length()),
       promised_stream_->GetTotalReceivedBytes());
 }
 
@@ -2184,7 +2184,7 @@
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(InnerConstructDataPacket(
       2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_));
 
@@ -2204,7 +2204,7 @@
 
   // As will be the body.
   EXPECT_EQ(
-      static_cast<int>(SbStringGetLength(kResponseBody)),
+      static_cast<int>(strlen(kResponseBody)),
       promised_stream_->ReadResponseBody(
           read_buffer_.get(), read_buffer_->size(), callback_.callback()));
   EXPECT_TRUE(promised_stream_->IsResponseBodyComplete());
@@ -2215,7 +2215,7 @@
   EXPECT_EQ(0, promised_stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header.length()),
+                           strlen(kResponseBody) + header.length()),
       promised_stream_->GetTotalReceivedBytes());
 }
 
@@ -2286,7 +2286,7 @@
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
   quic::QuicString header =
-      ConstructDataHeader(SbStringGetLength(kResponseBody));
+      ConstructDataHeader(strlen(kResponseBody));
   ProcessPacket(InnerConstructDataPacket(
       2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_));
 
@@ -2306,7 +2306,7 @@
               IsOk());
 
   EXPECT_EQ(
-      static_cast<int>(SbStringGetLength(kResponseBody)),
+      static_cast<int>(strlen(kResponseBody)),
       promised_stream_->ReadResponseBody(
           read_buffer_.get(), read_buffer_->size(), callback_.callback()));
 
@@ -2319,7 +2319,7 @@
   EXPECT_EQ(0, promised_stream_->GetTotalSentBytes());
   EXPECT_EQ(
       static_cast<int64_t>(spdy_response_headers_frame_length +
-                           SbStringGetLength(kResponseBody) + header.length()),
+                           strlen(kResponseBody) + header.length()),
       promised_stream_->GetTotalReceivedBytes());
 }
 
diff --git a/src/net/quic/quic_network_transaction_unittest.cc b/src/net/quic/quic_network_transaction_unittest.cc
index 672b5aa..c1899e7 100644
--- a/src/net/quic/quic_network_transaction_unittest.cc
+++ b/src/net/quic/quic_network_transaction_unittest.cc
@@ -7480,7 +7480,7 @@
       "GET / HTTP/1.1\r\n"
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(get_request));
+  quic::QuicString header = ConstructDataHeader(strlen(get_request));
   if (version_ != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
@@ -7498,7 +7498,7 @@
   const char get_response[] =
       "HTTP/1.1 200 OK\r\n"
       "Content-Length: 10\r\n\r\n";
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(get_response));
+  quic::QuicString header2 = ConstructDataHeader(strlen(get_response));
   mock_quic_data.AddRead(
       ASYNC, ConstructServerDataPacket(
                  2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
@@ -7507,7 +7507,7 @@
   mock_quic_data.AddRead(
       SYNCHRONOUS, ConstructServerDataPacket(
                        3, GetNthClientInitiatedBidirectionalStreamId(0), false,
-                       false, SbStringGetLength(get_response) + header2.length(),
+                       false, strlen(get_response) + header2.length(),
                        header3 + quic::QuicString("0123456789")));
   mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more data to read
@@ -7516,7 +7516,7 @@
       SYNCHRONOUS,
       ConstructClientRstPacket(5, GetNthClientInitiatedBidirectionalStreamId(0),
                                quic::QUIC_STREAM_CANCELLED,
-                               SbStringGetLength(get_request) + header.length()));
+                               strlen(get_request) + header.length()));
 
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
@@ -7676,7 +7676,7 @@
       "GET / HTTP/1.1\r\n"
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(get_request_1));
+  quic::QuicString header = ConstructDataHeader(strlen(get_request_1));
   if (version_ != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
@@ -7693,18 +7693,18 @@
             client_data_offset, {header, quic::QuicString(get_request_1)}));
   }
 
-  client_data_offset += SbStringGetLength(get_request_1) + header.length();
+  client_data_offset += strlen(get_request_1) + header.length();
 
   const char get_response_1[] =
       "HTTP/1.1 200 OK\r\n"
       "Content-Length: 10\r\n\r\n";
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(get_response_1));
+  quic::QuicString header2 = ConstructDataHeader(strlen(get_response_1));
   mock_quic_data.AddRead(
       ASYNC,
       ConstructServerDataPacket(
           2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
           server_data_offset, header2 + quic::QuicString(get_response_1)));
-  server_data_offset += SbStringGetLength(get_response_1) + header2.length();
+  server_data_offset += strlen(get_response_1) + header2.length();
 
   quic::QuicString header3 = ConstructDataHeader(10);
   mock_quic_data.AddRead(
@@ -7721,7 +7721,7 @@
       "GET /2 HTTP/1.1\r\n"
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
-  quic::QuicString header4 = ConstructDataHeader(SbStringGetLength(get_request_2));
+  quic::QuicString header4 = ConstructDataHeader(strlen(get_request_2));
   if (version_ == quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
@@ -7729,7 +7729,7 @@
             write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
             false, false, client_data_offset,
             {header4, quic::QuicString(get_request_2)}));
-    client_data_offset += header4.length() + SbStringGetLength(get_request_2);
+    client_data_offset += header4.length() + strlen(get_request_2);
   } else {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
@@ -7737,19 +7737,19 @@
                                   GetNthClientInitiatedBidirectionalStreamId(0),
                                   false, false, client_data_offset,
                                   quic::QuicStringPiece(get_request_2)));
-    client_data_offset += SbStringGetLength(get_request_2);
+    client_data_offset += strlen(get_request_2);
   }
 
   const char get_response_2[] =
       "HTTP/1.1 200 OK\r\n"
       "Content-Length: 7\r\n\r\n";
-  quic::QuicString header5 = ConstructDataHeader(SbStringGetLength(get_response_2));
+  quic::QuicString header5 = ConstructDataHeader(strlen(get_response_2));
   mock_quic_data.AddRead(
       ASYNC,
       ConstructServerDataPacket(
           4, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
           server_data_offset, header5 + quic::QuicString(get_response_2)));
-  server_data_offset += SbStringGetLength(get_response_2) + header5.length();
+  server_data_offset += strlen(get_response_2) + header5.length();
 
   quic::QuicString header6 = ConstructDataHeader(7);
   mock_quic_data.AddRead(
@@ -7841,7 +7841,7 @@
       "GET / HTTP/1.1\r\n"
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(get_request));
+  quic::QuicString header = ConstructDataHeader(strlen(get_request));
   if (version_ != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
@@ -7859,7 +7859,7 @@
   const char get_response[] =
       "HTTP/1.1 200 OK\r\n"
       "Content-Length: 10\r\n\r\n";
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(get_response));
+  quic::QuicString header2 = ConstructDataHeader(strlen(get_response));
   mock_quic_data.AddRead(
       ASYNC, ConstructServerDataPacket(
                  2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
@@ -7868,7 +7868,7 @@
   mock_quic_data.AddRead(
       SYNCHRONOUS, ConstructServerDataPacket(
                        3, GetNthClientInitiatedBidirectionalStreamId(0), false,
-                       false, SbStringGetLength(get_response) + header2.length(),
+                       false, strlen(get_response) + header2.length(),
                        header3 + quic::QuicString("0123456789")));
   mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1));
 
@@ -7932,7 +7932,7 @@
       SYNCHRONOUS,
       ConstructClientRstPacket(8, GetNthClientInitiatedBidirectionalStreamId(0),
                                quic::QUIC_STREAM_CANCELLED,
-                               SbStringGetLength(get_request) + header.length()));
+                               strlen(get_request) + header.length()));
   mock_quic_data.AddWrite(
       SYNCHRONOUS,
       ConstructClientRstPacket(9, GetNthClientInitiatedBidirectionalStreamId(1),
@@ -8111,7 +8111,7 @@
       "GET / HTTP/1.1\r\n"
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
-  quic::QuicString header = ConstructDataHeader(SbStringGetLength(get_request));
+  quic::QuicString header = ConstructDataHeader(strlen(get_request));
   if (version_ != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
@@ -8128,7 +8128,7 @@
   const char get_response[] =
       "HTTP/1.1 200 OK\r\n"
       "Content-Length: 10\r\n\r\n";
-  quic::QuicString header2 = ConstructDataHeader(SbStringGetLength(get_response));
+  quic::QuicString header2 = ConstructDataHeader(strlen(get_response));
   mock_quic_data.AddRead(
       ASYNC, ConstructServerDataPacket(
                  3, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
@@ -8138,7 +8138,7 @@
   mock_quic_data.AddRead(
       SYNCHRONOUS, ConstructServerDataPacket(
                        4, GetNthClientInitiatedBidirectionalStreamId(1), false,
-                       false, SbStringGetLength(get_response) + header2.length(),
+                       false, strlen(get_response) + header2.length(),
                        header3 + quic::QuicString("0123456789")));
   mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(6, 4, 3, 1));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more data to read
@@ -8147,7 +8147,7 @@
       SYNCHRONOUS,
       ConstructClientRstPacket(7, GetNthClientInitiatedBidirectionalStreamId(1),
                                quic::QUIC_STREAM_CANCELLED,
-                               SbStringGetLength(get_request) + header.length()));
+                               strlen(get_request) + header.length()));
 
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
diff --git a/src/net/quic/quic_proxy_client_socket_unittest.cc b/src/net/quic/quic_proxy_client_socket_unittest.cc
index 0061bf8..14104db 100644
--- a/src/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/src/net/quic/quic_proxy_client_socket_unittest.cc
@@ -510,7 +510,7 @@
   void AssertWriteReturns(const char* data, int len, int rv) {
     scoped_refptr<IOBufferWithSize> buf =
         base::MakeRefCounted<IOBufferWithSize>(len);
-    SbMemoryCopy(buf->data(), data, len);
+    memcpy(buf->data(), data, len);
     EXPECT_EQ(rv,
               sock_->Write(buf.get(), buf->size(), write_callback_.callback(),
                            TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -519,7 +519,7 @@
   void AssertSyncWriteSucceeds(const char* data, int len) {
     scoped_refptr<IOBufferWithSize> buf =
         base::MakeRefCounted<IOBufferWithSize>(len);
-    SbMemoryCopy(buf->data(), data, len);
+    memcpy(buf->data(), data, len);
     EXPECT_EQ(len,
               sock_->Write(buf.get(), buf->size(), CompletionOnceCallback(),
                            TRAFFIC_ANNOTATION_FOR_TESTS));
diff --git a/src/net/server/http_connection.cc b/src/net/server/http_connection.cc
index 02f2740..4391763 100644
--- a/src/net/server/http_connection.cc
+++ b/src/net/server/http_connection.cc
@@ -72,7 +72,7 @@
   DCHECK_LE(0, unconsumed_size);
   if (unconsumed_size > 0) {
     // Move unconsumed data to the start of buffer.
-    SbMemoryMove(StartOfBuffer(), StartOfBuffer() + bytes, unconsumed_size);
+    memmove(StartOfBuffer(), StartOfBuffer() + bytes, unconsumed_size);
   }
   base_->set_offset(unconsumed_size);
   data_ = base_->data();
diff --git a/src/net/server/http_connection_unittest.cc b/src/net/server/http_connection_unittest.cc
index d23f685..73e69fa 100644
--- a/src/net/server/http_connection_unittest.cc
+++ b/src/net/server/http_connection_unittest.cc
@@ -49,7 +49,7 @@
   // Write arbitrary data up to kInitialBufSize.
   const std::string kReadData(
       GetTestString(HttpConnection::ReadIOBuffer::kInitialBufSize));
-  SbMemoryCopy(buffer->data(), kReadData.data(), kReadData.size());
+  memcpy(buffer->data(), kReadData.data(), kReadData.size());
   buffer->DidRead(kReadData.size());
   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
             buffer->GetCapacity());
@@ -119,7 +119,7 @@
 
   // Write arbitrary data up to kExpectedInitialBufSize.
   std::string kReadData(GetTestString(kExpectedInitialBufSize));
-  SbMemoryCopy(buffer->data(), kReadData.data(), kReadData.size());
+  memcpy(buffer->data(), kReadData.data(), kReadData.size());
   buffer->DidRead(kReadData.size());
   EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity());
   EXPECT_EQ(kExpectedInitialBufSize - static_cast<int>(kReadData.size()),
@@ -153,7 +153,7 @@
   // Read data.
   const int kReadLength = 128;
   const std::string kReadData(GetTestString(kReadLength));
-  SbMemoryCopy(buffer->data(), kReadData.data(), kReadLength);
+  memcpy(buffer->data(), kReadData.data(), kReadLength);
   buffer->DidRead(kReadLength);
   // No change in total capacity.
   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
diff --git a/src/net/server/http_server_unittest.cc b/src/net/server/http_server_unittest.cc
index 8c50259..9822b3c 100644
--- a/src/net/server/http_server_unittest.cc
+++ b/src/net/server/http_server_unittest.cc
@@ -601,7 +601,7 @@
     DCHECK_GT(buf_len, 0);
     int read_len = std::min(static_cast<int>(pending_read_data_.size()),
                             buf_len);
-    SbMemoryCopy(buf->data(), pending_read_data_.data(), read_len);
+    memcpy(buf->data(), pending_read_data_.data(), read_len);
     pending_read_data_.erase(0, read_len);
     return read_len;
   }
@@ -623,7 +623,7 @@
       return;
     }
     int read_len = std::min(data_len, read_buf_len_);
-    SbMemoryCopy(read_buf_->data(), data, read_len);
+    memcpy(read_buf_->data(), data, read_len);
     pending_read_data_.assign(data + read_len, data_len - read_len);
     read_buf_ = NULL;
     read_buf_len_ = 0;
diff --git a/src/net/socket/sequenced_socket_data_unittest.cc b/src/net/socket/sequenced_socket_data_unittest.cc
index d3ed845..f828522 100644
--- a/src/net/socket/sequenced_socket_data_unittest.cc
+++ b/src/net/socket/sequenced_socket_data_unittest.cc
@@ -126,7 +126,7 @@
     } else {
       scoped_refptr<IOBuffer> write_buf =
           base::MakeRefCounted<IOBuffer>(second_len_);
-      SbMemoryCopy(write_buf->data(), second_write_data_, second_len_);
+      memcpy(write_buf->data(), second_write_data_, second_len_);
       ASSERT_EQ(second_rv_, socket_->Write(write_buf.get(), second_len_,
                                            std::move(second_callback_),
                                            TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -342,7 +342,7 @@
                                                  int len,
                                                  int rv) {
   scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(len);
-  SbMemoryCopy(buf->data(), data, len);
+  memcpy(buf->data(), data, len);
 
   if (rv == ERR_IO_PENDING) {
     ASSERT_EQ(rv, sock_->Write(buf.get(), len, write_callback_.callback(),
@@ -391,7 +391,7 @@
     int rv) {
   EXPECT_EQ(expected_rv, rv);
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(len);
-  SbMemoryCopy(write_buf->data(), data, len);
+  memcpy(write_buf->data(), data, len);
   EXPECT_THAT(sock_->Write(write_buf.get(), len, std::move(callback),
                            TRAFFIC_ANNOTATION_FOR_TESTS),
               IsError(ERR_IO_PENDING));
@@ -804,7 +804,7 @@
   Initialize(base::span<MockRead>(), writes);
 
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(kLen1);
-  SbMemoryCopy(write_buf->data(), kMsg1, kLen1);
+  memcpy(write_buf->data(), kMsg1, kLen1);
   ASSERT_EQ(ERR_IO_PENDING,
             sock_->Write(
                 write_buf.get(), kLen1,
@@ -823,7 +823,7 @@
   Initialize(base::span<MockRead>(), writes);
 
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(kLen1);
-  SbMemoryCopy(write_buf->data(), kMsg1, kLen1);
+  memcpy(write_buf->data(), kMsg1, kLen1);
   ASSERT_EQ(
       ERR_IO_PENDING,
       sock_->Write(write_buf.get(), kLen1,
@@ -860,7 +860,7 @@
   helper.SetInvokeWrite(kMsg2, kLen2, ERR_IO_PENDING, helper2.callback());
 
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(kLen1);
-  SbMemoryCopy(write_buf->data(), kMsg1, kLen1);
+  memcpy(write_buf->data(), kMsg1, kLen1);
   sock_->Write(write_buf.get(), kLen1, helper.callback(),
                TRAFFIC_ANNOTATION_FOR_TESTS);
 
@@ -1001,7 +1001,7 @@
   Initialize(reads, writes);
 
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(kLen1);
-  SbMemoryCopy(write_buf->data(), kMsg1, kLen1);
+  memcpy(write_buf->data(), kMsg1, kLen1);
   ASSERT_EQ(ERR_IO_PENDING,
             sock_->Write(
                 write_buf.get(), kLen1,
@@ -1066,7 +1066,7 @@
                        helper2.callback());
 
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(kLen1);
-  SbMemoryCopy(write_buf->data(), kMsg1, kLen1);
+  memcpy(write_buf->data(), kMsg1, kLen1);
   sock_->Write(write_buf.get(), kLen1, helper.callback(),
                TRAFFIC_ANNOTATION_FOR_TESTS);
 
@@ -1100,7 +1100,7 @@
                        helper2.callback());
 
   scoped_refptr<IOBuffer> write_buf = base::MakeRefCounted<IOBuffer>(kLen1);
-  SbMemoryCopy(write_buf->data(), kMsg1, kLen1);
+  memcpy(write_buf->data(), kMsg1, kLen1);
   ASSERT_EQ(ERR_IO_PENDING,
             sock_->Write(write_buf.get(), kLen1, helper.callback(),
                          TRAFFIC_ANNOTATION_FOR_TESTS));
diff --git a/src/net/socket/socket_bio_adapter.cc b/src/net/socket/socket_bio_adapter.cc
index 4a98601..dcb4524 100644
--- a/src/net/socket/socket_bio_adapter.cc
+++ b/src/net/socket/socket_bio_adapter.cc
@@ -160,7 +160,7 @@
   // Report the result of the last Read() if non-empty.
   CHECK_LT(read_offset_, read_result_);
   len = std::min(len, read_result_ - read_offset_);
-  SbMemoryCopy(out, read_buffer_->data() + read_offset_, len);
+  memcpy(out, read_buffer_->data() + read_offset_, len);
   read_offset_ += len;
 
   // Release the buffer when empty.
@@ -238,7 +238,7 @@
   if (write_buffer_used_ < write_buffer_->RemainingCapacity()) {
     int chunk =
         std::min(write_buffer_->RemainingCapacity() - write_buffer_used_, len);
-    SbMemoryCopy(write_buffer_->data() + write_buffer_used_, in, chunk);
+    memcpy(write_buffer_->data() + write_buffer_used_, in, chunk);
     in += chunk;
     len -= chunk;
     bytes_copied += chunk;
@@ -252,7 +252,7 @@
     CHECK_LE(write_buffer_->RemainingCapacity(), write_buffer_used_);
     int write_offset = write_buffer_used_ - write_buffer_->RemainingCapacity();
     int chunk = std::min(len, write_buffer_->capacity() - write_buffer_used_);
-    SbMemoryCopy(write_buffer_->StartOfBuffer() + write_offset, in, chunk);
+    memcpy(write_buffer_->StartOfBuffer() + write_offset, in, chunk);
     in += chunk;
     len -= chunk;
     bytes_copied += chunk;
diff --git a/src/net/socket/socket_bio_adapter_unittest.cc b/src/net/socket/socket_bio_adapter_unittest.cc
index d623871..28699c4 100644
--- a/src/net/socket/socket_bio_adapter_unittest.cc
+++ b/src/net/socket/socket_bio_adapter_unittest.cc
@@ -192,7 +192,7 @@
   // BIO_read only reports one socket-level Read.
   char buf[10];
   EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf)));
-  EXPECT_EQ(0, SbMemoryCompare("hello", buf, 5));
+  EXPECT_EQ(0, memcmp("hello", buf, 5));
   EXPECT_FALSE(adapter->HasPendingReadData());
 
   // Consume the next portion one byte at a time.
@@ -206,7 +206,7 @@
 
   // The remainder may be consumed in a single BIO_read.
   EXPECT_EQ(3, BIO_read(bio, buf, sizeof(buf)));
-  EXPECT_EQ(0, SbMemoryCompare("rld", buf, 3));
+  EXPECT_EQ(0, memcmp("rld", buf, 3));
   EXPECT_FALSE(adapter->HasPendingReadData());
 
   // The error is available synchoronously.
@@ -244,7 +244,7 @@
 
   // The first read is now available synchronously.
   EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf)));
-  EXPECT_EQ(0, SbMemoryCompare("hello", buf, 5));
+  EXPECT_EQ(0, memcmp("hello", buf, 5));
   EXPECT_FALSE(adapter->HasPendingReadData());
 
   // The adapter does not schedule another Read until BIO_read is next called.
@@ -266,7 +266,7 @@
 
   // The next read is now available synchronously.
   EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf)));
-  EXPECT_EQ(0, SbMemoryCompare("world", buf, 5));
+  EXPECT_EQ(0, memcmp("world", buf, 5));
   EXPECT_FALSE(adapter->HasPendingReadData());
 
   // The error is not yet available.
diff --git a/src/net/socket/socket_tag_unittest.cc b/src/net/socket/socket_tag_unittest.cc
index 696f1a7..7b70f42 100644
--- a/src/net/socket/socket_tag_unittest.cc
+++ b/src/net/socket/socket_tag_unittest.cc
@@ -86,8 +86,8 @@
   SocketTag tag2(getuid(), tag_val2);
   tag2.Apply(s);
   const char kRequest1[] = "GET / HTTP/1.0";
-  ASSERT_EQ(send(s, kRequest1, SbStringGetLength(kRequest1), 0),
-            static_cast<int>(SbStringGetLength(kRequest1)));
+  ASSERT_EQ(send(s, kRequest1, strlen(kRequest1), 0),
+            static_cast<int>(strlen(kRequest1)));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
 
   // Verify socket can be retagged with a new value and the current process's
@@ -95,8 +95,8 @@
   old_traffic = GetTaggedBytes(tag_val1);
   tag1.Apply(s);
   const char kRequest2[] = "\n\n";
-  ASSERT_EQ(send(s, kRequest2, SbStringGetLength(kRequest2), 0),
-            static_cast<int>(SbStringGetLength(kRequest2)));
+  ASSERT_EQ(send(s, kRequest2, strlen(kRequest2), 0),
+            static_cast<int>(strlen(kRequest2)));
   EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
 
   ASSERT_EQ(close(s), 0);
diff --git a/src/net/socket/socket_test_util.cc b/src/net/socket/socket_test_util.cc
index 3b5c1bb..c2e0fea 100644
--- a/src/net/socket/socket_test_util.cc
+++ b/src/net/socket/socket_test_util.cc
@@ -1250,7 +1250,7 @@
   if (read_data_.data) {
     if (read_data_.data_len - read_offset_ > 0) {
       result = std::min(buf_len, read_data_.data_len - read_offset_);
-      SbMemoryCopy(buf->data(), read_data_.data + read_offset_, result);
+      memcpy(buf->data(), read_data_.data + read_offset_, result);
       read_offset_ += result;
       if (read_offset_ == read_data_.data_len) {
         need_read_data_ = true;
@@ -1592,7 +1592,7 @@
                                               const base::StringPiece& context,
                                               unsigned char* out,
                                               unsigned int outlen) {
-  SbMemorySet(out, 'A', outlen);
+  memset(out, 'A', outlen);
   return OK;
 }
 
@@ -1925,7 +1925,7 @@
   if (read_data_.data) {
     if (read_data_.data_len - read_offset_ > 0) {
       result = std::min(buf_len, read_data_.data_len - read_offset_);
-      SbMemoryCopy(buf->data(), read_data_.data + read_offset_, result);
+      memcpy(buf->data(), read_data_.data + read_offset_, result);
       read_offset_ += result;
       if (read_offset_ == read_data_.data_len) {
         need_read_data_ = true;
diff --git a/src/net/socket/socket_test_util.h b/src/net/socket/socket_test_util.h
index 1340604..057cc74 100644
--- a/src/net/socket/socket_test_util.h
+++ b/src/net/socket/socket_test_util.h
@@ -146,7 +146,7 @@
       : mode(ASYNC),
         result(0),
         data(data),
-        data_len(SbStringGetLength(data)),
+        data_len(strlen(data)),
         sequence_number(0) {}
 
   // Read/write success (inferred data length).
@@ -154,7 +154,7 @@
       : mode(io_mode),
         result(0),
         data(data),
-        data_len(SbStringGetLength(data)),
+        data_len(strlen(data)),
         sequence_number(0) {}
 
   // Read/write success.
@@ -170,7 +170,7 @@
       : mode(io_mode),
         result(0),
         data(data),
-        data_len(SbStringGetLength(data)),
+        data_len(strlen(data)),
         sequence_number(seq) {}
 
   // Read/write success with sequence information.
diff --git a/src/net/socket/socks5_client_socket.cc b/src/net/socket/socks5_client_socket.cc
index 1471c64..7c1cd59 100644
--- a/src/net/socket/socks5_client_socket.cc
+++ b/src/net/socket/socks5_client_socket.cc
@@ -292,7 +292,7 @@
   next_state_ = STATE_GREET_WRITE_COMPLETE;
   size_t handshake_buf_len = buffer_.size() - bytes_sent_;
   handshake_buf_ = base::MakeRefCounted<IOBuffer>(handshake_buf_len);
-  SbMemoryCopy(handshake_buf_->data(), &buffer_.data()[bytes_sent_],
+  memcpy(handshake_buf_->data(), &buffer_.data()[bytes_sent_],
                handshake_buf_len);
   return transport_->socket()->Write(handshake_buf_.get(), handshake_buf_len,
                                      io_callback_, traffic_annotation_);
@@ -391,7 +391,7 @@
   int handshake_buf_len = buffer_.size() - bytes_sent_;
   DCHECK_LT(0, handshake_buf_len);
   handshake_buf_ = base::MakeRefCounted<IOBuffer>(handshake_buf_len);
-  SbMemoryCopy(handshake_buf_->data(), &buffer_[bytes_sent_],
+  memcpy(handshake_buf_->data(), &buffer_[bytes_sent_],
                handshake_buf_len);
   return transport_->socket()->Write(handshake_buf_.get(), handshake_buf_len,
                                      io_callback_, traffic_annotation_);
diff --git a/src/net/socket/socks5_client_socket_unittest.cc b/src/net/socket/socks5_client_socket_unittest.cc
index 77df128..1d6e5ca 100644
--- a/src/net/socket/socks5_client_socket_unittest.cc
+++ b/src/net/socket/socks5_client_socket_unittest.cc
@@ -174,7 +174,7 @@
 
   scoped_refptr<IOBuffer> buffer =
       base::MakeRefCounted<IOBuffer>(payload_write.size());
-  SbMemoryCopy(buffer->data(), payload_write.data(), payload_write.size());
+  memcpy(buffer->data(), payload_write.data(), payload_write.size());
   rv = user_sock_->Write(buffer.get(), payload_write.size(),
                          callback_.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
diff --git a/src/net/socket/socks_client_socket.cc b/src/net/socket/socks_client_socket.cc
index 147455d..8caf576 100644
--- a/src/net/socket/socks_client_socket.cc
+++ b/src/net/socket/socks_client_socket.cc
@@ -342,7 +342,7 @@
   //               failing the connect attempt.
   CHECK_EQ(ADDRESS_FAMILY_IPV4, endpoint.GetFamily());
   CHECK_LE(endpoint.address().size(), sizeof(request.ip));
-  SbMemoryCopy(&request.ip, &endpoint.address().bytes()[0],
+  memcpy(&request.ip, &endpoint.address().bytes()[0],
                endpoint.address().size());
 
   DVLOG(1) << "Resolved Host is : " << endpoint.ToStringWithoutPort();
@@ -366,7 +366,7 @@
   int handshake_buf_len = buffer_.size() - bytes_sent_;
   DCHECK_GT(handshake_buf_len, 0);
   handshake_buf_ = base::MakeRefCounted<IOBuffer>(handshake_buf_len);
-  SbMemoryCopy(handshake_buf_->data(), &buffer_[bytes_sent_],
+  memcpy(handshake_buf_->data(), &buffer_[bytes_sent_],
                handshake_buf_len);
   return transport_->socket()->Write(
       handshake_buf_.get(), handshake_buf_len,
diff --git a/src/net/socket/socks_client_socket_unittest.cc b/src/net/socket/socks_client_socket_unittest.cc
index a3d0e35..19ef0f6 100644
--- a/src/net/socket/socks_client_socket_unittest.cc
+++ b/src/net/socket/socks_client_socket_unittest.cc
@@ -227,7 +227,7 @@
 
     scoped_refptr<IOBuffer> buffer =
         base::MakeRefCounted<IOBuffer>(payload_write.size());
-    SbMemoryCopy(buffer->data(), payload_write.data(), payload_write.size());
+    memcpy(buffer->data(), payload_write.data(), payload_write.size());
     rv = user_sock_->Write(buffer.get(), payload_write.size(),
                            callback_.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
     EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
diff --git a/src/net/socket/ssl_client_socket_impl.cc b/src/net/socket/ssl_client_socket_impl.cc
index 658a6db..1bcdada 100644
--- a/src/net/socket/ssl_client_socket_impl.cc
+++ b/src/net/socket/ssl_client_socket_impl.cc
@@ -1723,7 +1723,7 @@
     OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
     return ssl_private_key_failure;
   }
-  SbMemoryCopy(out, signature_.data(), signature_.size());
+  memcpy(out, signature_.data(), signature_.size());
   *out_len = signature_.size();
   signature_.clear();
   return ssl_private_key_success;
diff --git a/src/net/socket/ssl_client_socket_pool_unittest.cc b/src/net/socket/ssl_client_socket_pool_unittest.cc
index 4709799..34aebbd 100644
--- a/src/net/socket/ssl_client_socket_pool_unittest.cc
+++ b/src/net/socket/ssl_client_socket_pool_unittest.cc
@@ -929,9 +929,9 @@
   scoped_refptr<IOBuffer> write_buffer =
       base::MakeRefCounted<StringIOBuffer>(kRequest);
   rv =
-      handle.socket()->Write(write_buffer.get(), SbStringGetLength(kRequest),
+      handle.socket()->Write(write_buffer.get(), strlen(kRequest),
                              callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback.GetResult(rv));
   scoped_refptr<IOBufferWithSize> read_buffer =
       base::MakeRefCounted<IOBufferWithSize>(1);
@@ -995,10 +995,10 @@
   const char kRequest[] = "GET / HTTP/1.1\r\n\r\n";
   scoped_refptr<IOBuffer> write_buffer =
       base::MakeRefCounted<StringIOBuffer>(kRequest);
-  rv = handle.socket()->Write(write_buffer.get(), SbStringGetLength(kRequest),
+  rv = handle.socket()->Write(write_buffer.get(), strlen(kRequest),
                               callback2.callback(),
                               TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback2.GetResult(rv));
   scoped_refptr<IOBufferWithSize> read_buffer =
       base::MakeRefCounted<IOBufferWithSize>(1);
@@ -1076,9 +1076,9 @@
   scoped_refptr<IOBuffer> write_buffer =
       base::MakeRefCounted<StringIOBuffer>(kRequest);
   rv =
-      handle.socket()->Write(write_buffer.get(), SbStringGetLength(kRequest),
+      handle.socket()->Write(write_buffer.get(), strlen(kRequest),
                              callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback.GetResult(rv));
   scoped_refptr<IOBufferWithSize> read_buffer =
       base::MakeRefCounted<IOBufferWithSize>(1);
diff --git a/src/net/socket/ssl_client_socket_unittest.cc b/src/net/socket/ssl_client_socket_unittest.cc
index 46e72dc..813c6d0 100644
--- a/src/net/socket/ssl_client_socket_unittest.cc
+++ b/src/net/socket/ssl_client_socket_unittest.cc
@@ -178,7 +178,7 @@
     return transport_->ReadIfReady(buf, buf_len, std::move(callback));
 
   if (read_buffer_->RemainingCapacity() == 0) {
-    SbMemoryCopy(buf->data(), read_buffer_->StartOfBuffer(),
+    memcpy(buf->data(), read_buffer_->StartOfBuffer(),
                  read_buffer_->capacity());
     read_buffer_->set_offset(0);
     return read_buffer_->capacity();
@@ -241,7 +241,7 @@
   if (user_read_buf_ == nullptr)
     return OK;
 
-  SbMemoryCopy(user_read_buf_->data(), read_buffer_->StartOfBuffer(),
+  memcpy(user_read_buf_->data(), read_buffer_->StartOfBuffer(),
                read_buffer_->capacity());
   read_buffer_->set_offset(0);
   return read_buffer_->capacity();
@@ -476,7 +476,7 @@
     CHECK(!should_block_read_);
     CHECK_GE(len, static_cast<int>(read_if_ready_buf_.size()));
     int rv = read_if_ready_buf_.size();
-    SbMemoryCopy(buf->data(), read_if_ready_buf_.data(), rv);
+    memcpy(buf->data(), read_if_ready_buf_.data(), rv);
     read_if_ready_buf_.clear();
     return rv;
   }
@@ -485,7 +485,7 @@
                 base::Bind(&FakeBlockingStreamSocket::CompleteReadIfReady,
                            base::Unretained(this), buf_copy));
   if (rv > 0)
-    SbMemoryCopy(buf->data(), buf_copy->data(), rv);
+    memcpy(buf->data(), buf_copy->data(), rv);
   if (rv == ERR_IO_PENDING)
     read_if_ready_callback_ = std::move(callback);
   return rv;
@@ -540,7 +540,7 @@
   if (static_cast<size_t>(pending_read_buf_len_) < data.size())
     return false;
 
-  SbMemoryCopy(pending_read_buf_->data(), data.data(), data.size());
+  memcpy(pending_read_buf_->data(), data.data(), data.size());
   pending_read_result_ = data.size();
   return true;
 }
@@ -1135,7 +1135,7 @@
           static_cast<int>(arraysize(request_text) - 1);
       scoped_refptr<IOBuffer> request_buffer =
           base::MakeRefCounted<IOBuffer>(kRequestTextSize);
-      SbMemoryCopy(request_buffer->data(), request_text, kRequestTextSize);
+      memcpy(request_buffer->data(), request_text, kRequestTextSize);
 
       // Write the request.
       rv = callback.GetResult(sock->Write(request_buffer.get(),
@@ -1288,7 +1288,7 @@
   int WriteAndWait(base::StringPiece request) {
     scoped_refptr<IOBuffer> request_buffer =
         base::MakeRefCounted<IOBuffer>(request.size());
-    SbMemoryCopy(request_buffer->data(), request.data(), request.size());
+    memcpy(request_buffer->data(), request.data(), request.size());
     return callback_.GetResult(
         ssl_socket_->Write(request_buffer.get(), request.size(),
                            callback_.callback(), TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -1522,7 +1522,7 @@
   const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(base::size(request_text) - 1);
-  SbMemoryCopy(request_buffer->data(), request_text,
+  memcpy(request_buffer->data(), request_text,
                arraysize(request_text) - 1);
 
   rv = callback.GetResult(
@@ -1614,7 +1614,7 @@
       static_cast<int>(arraysize(request_text) - 1);
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kRequestTextSize);
-  SbMemoryCopy(request_buffer->data(), request_text, kRequestTextSize);
+  memcpy(request_buffer->data(), request_text, kRequestTextSize);
 
   rv = callback.GetResult(sock->Write(request_buffer.get(), kRequestTextSize,
                                       callback.callback(),
@@ -1671,7 +1671,7 @@
       static_cast<int>(arraysize(request_text) - 1);
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kRequestTextSize);
-  SbMemoryCopy(request_buffer->data(), request_text, kRequestTextSize);
+  memcpy(request_buffer->data(), request_text, kRequestTextSize);
 
   // Simulate an unclean/forcible shutdown on the underlying socket.
   // However, simulate this error asynchronously.
@@ -1743,7 +1743,7 @@
       static_cast<int>(arraysize(request_text) - 1);
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kRequestTextSize);
-  SbMemoryCopy(request_buffer->data(), request_text, kRequestTextSize);
+  memcpy(request_buffer->data(), request_text, kRequestTextSize);
 
   // This write should complete synchronously, because the TLS ciphertext
   // can be created and placed into the outgoing buffers independent of the
@@ -1932,7 +1932,7 @@
       static_cast<int>(arraysize(request_text) - 1);
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kRequestTextSize);
-  SbMemoryCopy(request_buffer->data(), request_text, kRequestTextSize);
+  memcpy(request_buffer->data(), request_text, kRequestTextSize);
 
   rv = callback.GetResult(sock->Write(request_buffer.get(), kRequestTextSize,
                                       callback.callback(),
@@ -2113,7 +2113,7 @@
   const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(base::size(request_text) - 1);
-  SbMemoryCopy(request_buffer->data(), request_text,
+  memcpy(request_buffer->data(), request_text,
                arraysize(request_text) - 1);
 
   TestCompletionCallback callback;
@@ -2153,7 +2153,7 @@
   const char request_text[] = "GET /ssl-many-small-records HTTP/1.0\r\n\r\n";
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(base::size(request_text) - 1);
-  SbMemoryCopy(request_buffer->data(), request_text,
+  memcpy(request_buffer->data(), request_text,
                arraysize(request_text) - 1);
 
   rv = callback.GetResult(
@@ -2188,7 +2188,7 @@
   const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(base::size(request_text) - 1);
-  SbMemoryCopy(request_buffer->data(), request_text,
+  memcpy(request_buffer->data(), request_text,
                arraysize(request_text) - 1);
 
   TestCompletionCallback callback;
@@ -2225,7 +2225,7 @@
   const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(base::size(request_text) - 1);
-  SbMemoryCopy(request_buffer->data(), request_text,
+  memcpy(request_buffer->data(), request_text,
                arraysize(request_text) - 1);
 
   rv = callback.GetResult(
@@ -2355,32 +2355,32 @@
   const char kKeyingLabel1[] = "client-socket-test-1";
   const char kKeyingContext1[] = "";
   unsigned char client_out1[kKeyingMaterialSize];
-  SbMemorySet(client_out1, 0, sizeof(client_out1));
+  memset(client_out1, 0, sizeof(client_out1));
   rv = sock_->ExportKeyingMaterial(kKeyingLabel1, false, kKeyingContext1,
                                    client_out1, sizeof(client_out1));
   EXPECT_EQ(rv, OK);
 
   const char kKeyingLabel2[] = "client-socket-test-2";
   unsigned char client_out2[kKeyingMaterialSize];
-  SbMemorySet(client_out2, 0, sizeof(client_out2));
+  memset(client_out2, 0, sizeof(client_out2));
   rv = sock_->ExportKeyingMaterial(kKeyingLabel2, false, kKeyingContext1,
                                    client_out2, sizeof(client_out2));
   EXPECT_EQ(rv, OK);
-  EXPECT_NE(SbMemoryCompare(client_out1, client_out2, kKeyingMaterialSize), 0);
+  EXPECT_NE(memcmp(client_out1, client_out2, kKeyingMaterialSize), 0);
 
   const char kKeyingContext2[] = "context";
   rv = sock_->ExportKeyingMaterial(kKeyingLabel1, true, kKeyingContext2,
                                    client_out2, sizeof(client_out2));
   EXPECT_EQ(rv, OK);
-  EXPECT_NE(SbMemoryCompare(client_out1, client_out2, kKeyingMaterialSize), 0);
+  EXPECT_NE(memcmp(client_out1, client_out2, kKeyingMaterialSize), 0);
 
   // Using an empty context should give different key material from not using a
   // context at all.
-  SbMemorySet(client_out2, 0, sizeof(client_out2));
+  memset(client_out2, 0, sizeof(client_out2));
   rv = sock_->ExportKeyingMaterial(kKeyingLabel1, true, kKeyingContext1,
                                    client_out2, sizeof(client_out2));
   EXPECT_EQ(rv, OK);
-  EXPECT_NE(SbMemoryCompare(client_out1, client_out2, kKeyingMaterialSize), 0);
+  EXPECT_NE(memcmp(client_out1, client_out2, kKeyingMaterialSize), 0);
 }
 
 // Verifies that SSLClientSocket::ClearSessionCache can be called without
@@ -2826,7 +2826,7 @@
   const size_t kRequestLen = arraysize(kRequestText) - 1;
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kRequestLen);
-  SbMemoryCopy(request_buffer->data(), kRequestText, kRequestLen);
+  memcpy(request_buffer->data(), kRequestText, kRequestLen);
 
   TestCompletionCallback callback;
   rv = callback.GetResult(sock_->Write(request_buffer.get(), kRequestLen,
@@ -2905,7 +2905,7 @@
   const size_t kRequestLen = arraysize(kRequestText) - 1;
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kRequestLen);
-  SbMemoryCopy(request_buffer->data(), kRequestText, kRequestLen);
+  memcpy(request_buffer->data(), kRequestText, kRequestLen);
 
   // Although transport writes are blocked, SSLClientSocketImpl completes the
   // outer Write operation.
@@ -3503,7 +3503,7 @@
 HashValueVector MakeHashValueVector(uint8_t value) {
   HashValueVector out;
   HashValue hash(HASH_VALUE_SHA256);
-  SbMemorySet(hash.data(), value, hash.size());
+  memset(hash.data(), value, hash.size());
   out.push_back(hash);
   return out;
 }
diff --git a/src/net/socket/ssl_server_socket_impl.cc b/src/net/socket/ssl_server_socket_impl.cc
index 70e0e65..c1ca345 100644
--- a/src/net/socket/ssl_server_socket_impl.cc
+++ b/src/net/socket/ssl_server_socket_impl.cc
@@ -316,7 +316,7 @@
     OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
     return ssl_private_key_failure;
   }
-  SbMemoryCopy(out, signature_.data(), signature_.size());
+  memcpy(out, signature_.data(), signature_.size());
   *out_len = signature_.size();
   signature_.clear();
   return ssl_private_key_success;
diff --git a/src/net/socket/ssl_server_socket_unittest.cc b/src/net/socket/ssl_server_socket_unittest.cc
index e20c348..a066a54 100644
--- a/src/net/socket/ssl_server_socket_unittest.cc
+++ b/src/net/socket/ssl_server_socket_unittest.cc
@@ -190,7 +190,7 @@
   int PropagateData(scoped_refptr<IOBuffer> read_buf, int read_buf_len) {
     scoped_refptr<DrainableIOBuffer> buf = data_.front();
     int copied = std::min(buf->BytesRemaining(), read_buf_len);
-    SbMemoryCopy(read_buf->data(), buf->data(), copied);
+    memcpy(read_buf->data(), buf->data(), copied);
     buf->DidConsume(copied);
 
     if (!buf->BytesRemaining())
@@ -316,7 +316,7 @@
   FakeSocket server(&channel_2, &channel_1);
 
   const char kTestData[] = "testing123";
-  const int kTestDataSize = SbStringGetLength(kTestData);
+  const int kTestDataSize = strlen(kTestData);
   const int kReadBufSize = 1024;
   scoped_refptr<IOBuffer> write_buf =
       base::MakeRefCounted<StringIOBuffer>(kTestData);
@@ -334,7 +334,7 @@
       client.Read(read_buf.get(), kReadBufSize, CompletionOnceCallback());
   EXPECT_GT(read, 0);
   EXPECT_LE(read, written);
-  EXPECT_EQ(0, SbMemoryCompare(kTestData, read_buf->data(), read));
+  EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
 
   // Read then write.
   TestCompletionCallback callback;
@@ -350,7 +350,7 @@
   read = callback.WaitForResult();
   EXPECT_GT(read, 0);
   EXPECT_LE(read, written);
-  EXPECT_EQ(0, SbMemoryCompare(kTestData, read_buf->data(), read));
+  EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
 }
 
 class SSLServerSocketTest : public PlatformTest,
@@ -955,8 +955,8 @@
   }
   EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
   read_buf->SetOffset(0);
-  EXPECT_EQ(0, SbMemoryCompare(write_buf->data(), read_buf->data(),
-                               write_buf->size()));
+  EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(),
+                      write_buf->size()));
 
   // Read then write.
   write_buf = base::MakeRefCounted<StringIOBuffer>("hello123");
@@ -984,8 +984,8 @@
   }
   EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
   read_buf->SetOffset(0);
-  EXPECT_EQ(0, SbMemoryCompare(write_buf->data(), read_buf->data(),
-                               write_buf->size()));
+  EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(),
+                      write_buf->size()));
 }
 
 // A regression test for bug 127822 (http://crbug.com/127822).
@@ -1077,14 +1077,14 @@
   rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, false, kKeyingContext,
                                             client_out, sizeof(client_out));
   ASSERT_THAT(rv, IsOk());
-  EXPECT_EQ(0, SbMemoryCompare(server_out, client_out, sizeof(server_out)));
+  EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out)));
 
   const char kKeyingLabelBad[] = "EXPERIMENTAL-server-socket-test-bad";
   unsigned char client_bad[kKeyingMaterialSize];
   rv = client_socket_->ExportKeyingMaterial(
       kKeyingLabelBad, false, kKeyingContext, client_bad, sizeof(client_bad));
   ASSERT_EQ(rv, OK);
-  EXPECT_NE(0, SbMemoryCompare(server_out, client_bad, sizeof(server_out)));
+  EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out)));
 }
 
 // Verifies that SSLConfig::require_ecdhe flags works properly.
diff --git a/src/net/socket/tcp_client_socket_unittest.cc b/src/net/socket/tcp_client_socket_unittest.cc
index 9500c50..38912fb 100644
--- a/src/net/socket/tcp_client_socket_unittest.cc
+++ b/src/net/socket/tcp_client_socket_unittest.cc
@@ -262,9 +262,9 @@
   scoped_refptr<IOBuffer> write_buffer1 =
       base::MakeRefCounted<StringIOBuffer>(kRequest1);
   TestCompletionCallback write_callback1;
-  EXPECT_EQ(s.Write(write_buffer1.get(), SbStringGetLength(kRequest1),
+  EXPECT_EQ(s.Write(write_buffer1.get(), strlen(kRequest1),
                     write_callback1.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-            static_cast<int>(SbStringGetLength(kRequest1)));
+            static_cast<int>(strlen(kRequest1)));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
 
   // Verify socket can be retagged with a new value and the current process's
@@ -273,12 +273,12 @@
   s.ApplySocketTag(tag1);
   const char kRequest2[] = "\n\n";
   scoped_refptr<IOBufferWithSize> write_buffer2 =
-      base::MakeRefCounted<IOBufferWithSize>(SbStringGetLength(kRequest2));
-  SbMemoryMove(write_buffer2->data(), kRequest2, SbStringGetLength(kRequest2));
+      base::MakeRefCounted<IOBufferWithSize>(strlen(kRequest2));
+  memmmove(write_buffer2->data(), kRequest2, strlen(kRequest2));
   TestCompletionCallback write_callback2;
-  EXPECT_EQ(s.Write(write_buffer2.get(), SbStringGetLength(kRequest2),
+  EXPECT_EQ(s.Write(write_buffer2.get(), strlen(kRequest2),
                     write_callback2.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-            static_cast<int>(SbStringGetLength(kRequest2)));
+            static_cast<int>(strlen(kRequest2)));
   EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
 
   s.Disconnect();
@@ -312,9 +312,9 @@
   scoped_refptr<IOBuffer> write_buffer1 =
       base::MakeRefCounted<StringIOBuffer>(kRequest1);
   TestCompletionCallback write_callback1;
-  EXPECT_EQ(s.Write(write_buffer1.get(), SbStringGetLength(kRequest1),
+  EXPECT_EQ(s.Write(write_buffer1.get(), strlen(kRequest1),
                     write_callback1.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-            static_cast<int>(SbStringGetLength(kRequest1)));
+            static_cast<int>(strlen(kRequest1)));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
 
   // Verify socket can be retagged with a new value and the current process's
@@ -327,9 +327,9 @@
   scoped_refptr<IOBuffer> write_buffer2 =
       base::MakeRefCounted<StringIOBuffer>(kRequest2);
   TestCompletionCallback write_callback2;
-  EXPECT_EQ(s.Write(write_buffer2.get(), SbStringGetLength(kRequest2),
+  EXPECT_EQ(s.Write(write_buffer2.get(), strlen(kRequest2),
                     write_callback2.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-            static_cast<int>(SbStringGetLength(kRequest2)));
+            static_cast<int>(strlen(kRequest2)));
   EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
 
   s.Disconnect();
diff --git a/src/net/socket/tcp_server_socket_unittest.cc b/src/net/socket/tcp_server_socket_unittest.cc
index 55fc0ea..9e4d4e6 100644
--- a/src/net/socket/tcp_server_socket_unittest.cc
+++ b/src/net/socket/tcp_server_socket_unittest.cc
@@ -215,7 +215,7 @@
   while (bytes_written < message.size()) {
     scoped_refptr<IOBufferWithSize> write_buffer =
         base::MakeRefCounted<IOBufferWithSize>(message.size() - bytes_written);
-    SbMemoryMove(write_buffer->data(), message.data(), message.size());
+    memmove(write_buffer->data(), message.data(), message.size());
 
     TestCompletionCallback write_callback;
     int write_result = accepted_socket->Write(
@@ -237,7 +237,7 @@
     read_result = read_callback.GetResult(read_result);
     ASSERT_TRUE(read_result >= 0);
     ASSERT_TRUE(bytes_read + read_result <= message.size());
-    SbMemoryMove(&buffer[bytes_read], read_buffer->data(), read_result);
+    memmove(&buffer[bytes_read], read_buffer->data(), read_result);
     bytes_read += read_result;
   }
 
diff --git a/src/net/socket/tcp_socket_unittest.cc b/src/net/socket/tcp_socket_unittest.cc
index 84cafcb..c38b2e6 100644
--- a/src/net/socket/tcp_socket_unittest.cc
+++ b/src/net/socket/tcp_socket_unittest.cc
@@ -204,7 +204,7 @@
 
       scoped_refptr<IOBufferWithSize> write_buffer =
           base::MakeRefCounted<IOBufferWithSize>(message.size());
-      SbMemoryMove(write_buffer->data(), message.data(), message.size());
+      memmove(write_buffer->data(), message.data(), message.size());
 
       TestCompletionCallback write_callback;
       int write_result = accepted_socket->Write(
@@ -428,7 +428,7 @@
   while (bytes_written < message.size()) {
     scoped_refptr<IOBufferWithSize> write_buffer =
         base::MakeRefCounted<IOBufferWithSize>(message.size() - bytes_written);
-    SbMemoryMove(write_buffer->data(), message.data() + bytes_written,
+    memmove(write_buffer->data(), message.data() + bytes_written,
                  message.size() - bytes_written);
 
     TestCompletionCallback write_callback;
@@ -451,7 +451,7 @@
     read_result = read_callback.GetResult(read_result);
     ASSERT_TRUE(read_result >= 0);
     ASSERT_TRUE(bytes_read + read_result <= message.size());
-    SbMemoryMove(&buffer[bytes_read], read_buffer->data(), read_result);
+    memmove(&buffer[bytes_read], read_buffer->data(), read_result);
     bytes_read += read_result;
   }
 
@@ -531,7 +531,7 @@
   scoped_refptr<IOBufferWithDestructionCallback> write_buffer(
       base::MakeRefCounted<IOBufferWithDestructionCallback>(
           run_loop.QuitClosure()));
-  SbMemorySet(write_buffer->data(), '1', write_buffer->size());
+  memset(write_buffer->data(), '1', write_buffer->size());
   TestCompletionCallback write_callback;
   while (true) {
     int result = connecting_socket->Write(
@@ -591,9 +591,9 @@
 
   TestCompletionCallback write_callback;
   int write_result = accepted_socket->Write(
-      write_buffer.get(), SbStringGetLength(kMsg), write_callback.callback(),
+      write_buffer.get(), strlen(kMsg), write_callback.callback(),
       TRAFFIC_ANNOTATION_FOR_TESTS);
-  const int msg_size = SbStringGetLength(kMsg);
+  const int msg_size = strlen(kMsg);
   ASSERT_EQ(msg_size, write_result);
 
   TestCompletionCallback read_callback2;
@@ -606,7 +606,7 @@
   }
 
   ASSERT_EQ(msg_size, read_result);
-  ASSERT_EQ(0, SbMemoryCompare(&kMsg, read_buffer->data(), msg_size));
+  ASSERT_EQ(0, memcmp(&kMsg, read_buffer->data(), msg_size));
 }
 
 // Starboard does not provide any equivalent of getsockopt.
@@ -748,9 +748,9 @@
       base::MakeRefCounted<StringIOBuffer>(kRequest1);
   TestCompletionCallback write_callback1;
   EXPECT_EQ(
-      socket_.Write(write_buffer1.get(), SbStringGetLength(kRequest1),
+      socket_.Write(write_buffer1.get(), strlen(kRequest1),
                     write_callback1.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-      static_cast<int>(SbStringGetLength(kRequest1)));
+      static_cast<int>(strlen(kRequest1)));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
 
   // Verify socket can be retagged with a new value and the current process's
@@ -762,9 +762,9 @@
       base::MakeRefCounted<StringIOBuffer>(kRequest2);
   TestCompletionCallback write_callback2;
   EXPECT_EQ(
-      socket_.Write(write_buffer2.get(), SbStringGetLength(kRequest2),
+      socket_.Write(write_buffer2.get(), strlen(kRequest2),
                     write_callback2.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-      static_cast<int>(SbStringGetLength(kRequest2)));
+      static_cast<int>(strlen(kRequest2)));
   EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
 
   socket_.Close();
@@ -797,9 +797,9 @@
       base::MakeRefCounted<StringIOBuffer>(kRequest1);
   TestCompletionCallback write_callback1;
   EXPECT_EQ(
-      socket_.Write(write_buffer1.get(), SbStringGetLength(kRequest1),
+      socket_.Write(write_buffer1.get(), strlen(kRequest1),
                     write_callback1.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-      static_cast<int>(SbStringGetLength(kRequest1)));
+      static_cast<int>(strlen(kRequest1)));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
 
   // Verify socket can be retagged with a new value and the current process's
@@ -813,9 +813,9 @@
       base::MakeRefCounted<StringIOBuffer>(kRequest2);
   TestCompletionCallback write_callback2;
   EXPECT_EQ(
-      socket_.Write(write_buffer2.get(), SbStringGetLength(kRequest2),
+      socket_.Write(write_buffer2.get(), strlen(kRequest2),
                     write_callback2.callback(), TRAFFIC_ANNOTATION_FOR_TESTS),
-      static_cast<int>(SbStringGetLength(kRequest2)));
+      static_cast<int>(strlen(kRequest2)));
   EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
 
   socket_.Close();
diff --git a/src/net/socket/tcp_socket_win.cc b/src/net/socket/tcp_socket_win.cc
index c0e6f72..faea37e 100644
--- a/src/net/socket/tcp_socket_win.cc
+++ b/src/net/socket/tcp_socket_win.cc
@@ -189,7 +189,7 @@
       socket_(socket),
       reader_(this),
       writer_(this) {
-  SbMemorySet(&write_overlapped_, 0, sizeof(write_overlapped_));
+  memset(&write_overlapped_, 0, sizeof(write_overlapped_));
   write_overlapped_.hEvent = WSACreateEvent();
 }
 
@@ -201,7 +201,7 @@
   // in Detach().
   write_watcher_.StopWatching();
   WSACloseEvent(write_overlapped_.hEvent);
-  SbMemorySet(&write_overlapped_, 0xaf, sizeof(write_overlapped_));
+  memset(&write_overlapped_, 0xaf, sizeof(write_overlapped_));
 }
 
 void TCPSocketWin::Core::WatchForRead() {
diff --git a/src/net/socket/transport_client_socket_pool_unittest.cc b/src/net/socket/transport_client_socket_pool_unittest.cc
index e8c7543..a09ca19 100644
--- a/src/net/socket/transport_client_socket_pool_unittest.cc
+++ b/src/net/socket/transport_client_socket_pool_unittest.cc
@@ -1204,9 +1204,9 @@
   scoped_refptr<IOBuffer> write_buffer =
       base::MakeRefCounted<StringIOBuffer>(kRequest);
   rv =
-      handle.socket()->Write(write_buffer.get(), SbStringGetLength(kRequest),
+      handle.socket()->Write(write_buffer.get(), strlen(kRequest),
                              callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback.GetResult(rv));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
   // Disconnect socket to prevent reuse.
@@ -1231,9 +1231,9 @@
   // Verify socket has |tag2| applied.
   old_traffic = GetTaggedBytes(tag_val2);
   rv =
-      handle.socket()->Write(write_buffer.get(), SbStringGetLength(kRequest),
+      handle.socket()->Write(write_buffer.get(), strlen(kRequest),
                              callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback.GetResult(rv));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
   // Disconnect socket to prevent reuse.
@@ -1269,17 +1269,17 @@
   // Verify |handle_high_pri| has |tag2| applied.
   old_traffic = GetTaggedBytes(tag_val2);
   rv = handle_high_pri.socket()->Write(
-      write_buffer.get(), SbStringGetLength(kRequest), callback.callback(),
+      write_buffer.get(), strlen(kRequest), callback.callback(),
       TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback.GetResult(rv));
   EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
   // Verify |handle| has |tag1| applied.
   old_traffic = GetTaggedBytes(tag_val1);
   rv =
-      handle.socket()->Write(write_buffer.get(), SbStringGetLength(kRequest),
+      handle.socket()->Write(write_buffer.get(), strlen(kRequest),
                              callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
-  EXPECT_EQ(static_cast<int>(SbStringGetLength(kRequest)),
+  EXPECT_EQ(static_cast<int>(strlen(kRequest)),
             callback.GetResult(rv));
   EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
 }
diff --git a/src/net/socket/transport_client_socket_unittest.cc b/src/net/socket/transport_client_socket_unittest.cc
index beb64dc..5ee43e8 100644
--- a/src/net/socket/transport_client_socket_unittest.cc
+++ b/src/net/socket/transport_client_socket_unittest.cc
@@ -165,11 +165,11 @@
 void TransportClientSocketTest::SendRequestAndResponse() {
   // Send client request.
   const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
-  int request_len = SbStringGetLength(request_text);
+  int request_len = strlen(request_text);
   scoped_refptr<DrainableIOBuffer> request_buffer =
       base::MakeRefCounted<DrainableIOBuffer>(
           base::MakeRefCounted<IOBuffer>(request_len), request_len);
-  SbMemoryCopy(request_buffer->data(), request_text, request_len);
+  memcpy(request_buffer->data(), request_text, request_len);
 
   int bytes_written = 0;
   while (request_buffer->BytesRemaining() > 0) {
@@ -196,11 +196,11 @@
 
 void TransportClientSocketTest::SendServerResponse() {
   // TODO(dkegel): this might not be long enough to tickle some bugs.
-  int reply_len = SbStringGetLength(kServerReply);
+  int reply_len = strlen(kServerReply);
   scoped_refptr<DrainableIOBuffer> write_buffer =
       base::MakeRefCounted<DrainableIOBuffer>(
           base::MakeRefCounted<IOBuffer>(reply_len), reply_len);
-  SbMemoryCopy(write_buffer->data(), kServerReply, reply_len);
+  memcpy(write_buffer->data(), kServerReply, reply_len);
   int bytes_written = 0;
   while (write_buffer->BytesRemaining() > 0) {
     TestCompletionCallback write_callback;
@@ -296,8 +296,8 @@
   EXPECT_FALSE(sock_->IsConnectedAndIdle());
 
   bytes_read = DrainClientSocket(
-      buf.get(), 4096, SbStringGetLength(kServerReply) - 1, &callback);
-  ASSERT_EQ(bytes_read, SbStringGetLength(kServerReply) - 1);
+      buf.get(), 4096, strlen(kServerReply) - 1, &callback);
+  ASSERT_EQ(bytes_read, strlen(kServerReply) - 1);
 
   // After draining the data, the socket should be back to connected
   // and idle.
@@ -316,8 +316,8 @@
   EXPECT_FALSE(sock_->IsConnectedAndIdle());
 
   bytes_read = DrainClientSocket(
-      buf.get(), 4096, SbStringGetLength(kServerReply) - 1, &callback);
-  ASSERT_EQ(bytes_read, SbStringGetLength(kServerReply) - 1);
+      buf.get(), 4096, strlen(kServerReply) - 1, &callback);
+  ASSERT_EQ(bytes_read, strlen(kServerReply) - 1);
 
   // Once the data is drained, the socket should now be seen as not
   // connected.
@@ -339,8 +339,8 @@
 
   scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(4096);
   uint32_t bytes_read = DrainClientSocket(
-      buf.get(), 4096, SbStringGetLength(kServerReply), &callback);
-  ASSERT_EQ(bytes_read, SbStringGetLength(kServerReply));
+      buf.get(), 4096, strlen(kServerReply), &callback);
+  ASSERT_EQ(bytes_read, strlen(kServerReply));
   ASSERT_EQ(std::string(kServerReply), std::string(buf->data(), bytes_read));
 
   // All data has been read now.  Read once more to force an ERR_IO_PENDING, and
@@ -360,7 +360,7 @@
 
   scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(1);
   uint32_t bytes_read = 0;
-  while (bytes_read < SbStringGetLength(kServerReply)) {
+  while (bytes_read < strlen(kServerReply)) {
     int rv = sock_->Read(buf.get(), 1, callback.callback());
     EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
 
@@ -409,7 +409,7 @@
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kWriteBufLen);
   char* request_data = request_buffer->data();
-  SbMemorySet(request_data, 'A', kWriteBufLen);
+  memset(request_data, 'A', kWriteBufLen);
   TestCompletionCallback write_callback;
 
   int bytes_written = 0;
@@ -443,7 +443,7 @@
   scoped_refptr<IOBuffer> request_buffer =
       base::MakeRefCounted<IOBuffer>(kWriteBufLen);
   char* request_data = request_buffer->data();
-  SbMemorySet(request_data, 'A', kWriteBufLen);
+  memset(request_data, 'A', kWriteBufLen);
   TestCompletionCallback write_callback;
 
   int bytes_written = 0;
diff --git a/src/net/socket/udp_socket_perftest.cc b/src/net/socket/udp_socket_perftest.cc
index 0d1ac29..b2d7264 100644
--- a/src/net/socket/udp_socket_perftest.cc
+++ b/src/net/socket/udp_socket_perftest.cc
@@ -73,7 +73,7 @@
                                              base::Closure done_callback) {
   scoped_refptr<IOBufferWithSize> io_buffer =
       base::MakeRefCounted<IOBufferWithSize>(kPacketSize);
-  SbMemorySet(io_buffer->data(), 'G', kPacketSize);
+  memset(io_buffer->data(), 'G', kPacketSize);
 
   while (num_of_packets) {
     int rv =
diff --git a/src/net/socket/udp_socket_posix.cc b/src/net/socket/udp_socket_posix.cc
index 92f467c..16545aa 100644
--- a/src/net/socket/udp_socket_posix.cc
+++ b/src/net/socket/udp_socket_posix.cc
@@ -989,7 +989,7 @@
       mreq.imr_ifindex = multicast_interface_;
       mreq.imr_address.s_addr = htonl(INADDR_ANY);
 #endif
-      SbMemoryCopy(&mreq.imr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                           &mreq, sizeof(mreq));
@@ -1002,7 +1002,7 @@
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = multicast_interface_;
-      SbMemoryCopy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_JOIN_GROUP,
                           &mreq, sizeof(mreq));
@@ -1029,7 +1029,7 @@
       ip_mreqn mreq = {};
       mreq.imr_ifindex = multicast_interface_;
       mreq.imr_address.s_addr = INADDR_ANY;
-      SbMemoryCopy(&mreq.imr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_DROP_MEMBERSHIP,
                           &mreq, sizeof(mreq));
@@ -1046,7 +1046,7 @@
 #else   // defined(OS_FUCHSIA)
       mreq.ipv6mr_interface = 0;  // 0 indicates default multicast interface.
 #endif  // !defined(OS_FUCHSIA)
-      SbMemoryCopy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
                           &mreq, sizeof(mreq));
diff --git a/src/net/socket/udp_socket_win.cc b/src/net/socket/udp_socket_win.cc
index 7749e61..e45dc55 100644
--- a/src/net/socket/udp_socket_win.cc
+++ b/src/net/socket/udp_socket_win.cc
@@ -120,8 +120,8 @@
     : socket_(socket),
       reader_(this),
       writer_(this) {
-  SbMemorySet(&read_overlapped_, 0, sizeof(read_overlapped_));
-  SbMemorySet(&write_overlapped_, 0, sizeof(write_overlapped_));
+  memset(&read_overlapped_, 0, sizeof(read_overlapped_));
+  memset(&write_overlapped_, 0, sizeof(write_overlapped_));
 
   read_overlapped_.hEvent = WSACreateEvent();
   write_overlapped_.hEvent = WSACreateEvent();
@@ -133,9 +133,9 @@
   write_watcher_.StopWatching();
 
   WSACloseEvent(read_overlapped_.hEvent);
-  SbMemorySet(&read_overlapped_, 0xaf, sizeof(read_overlapped_));
+  memset(&read_overlapped_, 0xaf, sizeof(read_overlapped_));
   WSACloseEvent(write_overlapped_.hEvent);
-  SbMemorySet(&write_overlapped_, 0xaf, sizeof(write_overlapped_));
+  memset(&write_overlapped_, 0xaf, sizeof(write_overlapped_));
 }
 
 void UDPSocketWin::Core::WatchForRead() {
@@ -1032,7 +1032,7 @@
         return ERR_ADDRESS_INVALID;
       ip_mreq mreq;
       mreq.imr_interface.s_addr = htonl(multicast_interface_);
-      SbMemoryCopy(&mreq.imr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq),
@@ -1046,7 +1046,7 @@
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = multicast_interface_;
-      SbMemoryCopy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq),
@@ -1072,7 +1072,7 @@
         return ERR_ADDRESS_INVALID;
       ip_mreq mreq;
       mreq.imr_interface.s_addr = htonl(multicast_interface_);
-      SbMemoryCopy(&mreq.imr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_DROP_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq), sizeof(mreq));
@@ -1085,7 +1085,7 @@
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = multicast_interface_;
-      SbMemoryCopy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
                    IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IP_DROP_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq), sizeof(mreq));
diff --git a/src/net/socket/unix_domain_client_socket_posix.cc b/src/net/socket/unix_domain_client_socket_posix.cc
index 3bac5ac..c73dc37 100644
--- a/src/net/socket/unix_domain_client_socket_posix.cc
+++ b/src/net/socket/unix_domain_client_socket_posix.cc
@@ -50,11 +50,11 @@
 
   struct sockaddr_un* socket_addr =
       reinterpret_cast<struct sockaddr_un*>(address->addr);
-  SbMemorySet(socket_addr, 0, address->addr_len);
+  memset(socket_addr, 0, address->addr_len);
   socket_addr->sun_family = AF_UNIX;
   address->addr_len = path_size + offsetof(struct sockaddr_un, sun_path);
   if (!use_abstract_namespace) {
-    SbMemoryCopy(socket_addr->sun_path, socket_path.c_str(),
+    memcpy(socket_addr->sun_path, socket_path.c_str(),
                  socket_path.size());
     return true;
   }
@@ -65,7 +65,7 @@
   // length of the structure exactly, as potentially the socket name may
   // have '\0' characters embedded (although we don't support this).
   // Note that addr.sun_path is already zero initialized.
-  SbMemoryCopy(socket_addr->sun_path + 1, socket_path.c_str(),
+  memcpy(socket_addr->sun_path + 1, socket_path.c_str(),
                socket_path.size());
   return true;
 #else
diff --git a/src/net/spdy/bidirectional_stream_spdy_impl.cc b/src/net/spdy/bidirectional_stream_spdy_impl.cc
index 37cb5a4..7bb91f4 100644
--- a/src/net/spdy/bidirectional_stream_spdy_impl.cc
+++ b/src/net/spdy/bidirectional_stream_spdy_impl.cc
@@ -146,7 +146,7 @@
     int len = 0;
     // TODO(xunjieli): Get rid of extra copy. Coalesce headers and data frames.
     for (size_t i = 0; i < buffers.size(); ++i) {
-      SbMemoryCopy(pending_combined_buffer_->data() + len, buffers[i]->data(),
+      memcpy(pending_combined_buffer_->data() + len, buffers[i]->data(),
                    lengths[i]);
       len += lengths[i];
     }
diff --git a/src/net/spdy/platform/impl/spdy_string_utils_impl.cc b/src/net/spdy/platform/impl/spdy_string_utils_impl.cc
index 478415f..d355192 100644
--- a/src/net/spdy/platform/impl/spdy_string_utils_impl.cc
+++ b/src/net/spdy/platform/impl/spdy_string_utils_impl.cc
@@ -15,7 +15,7 @@
     return false;
   // Pad with leading zeros.
   std::string data_padded(8u, '0');
-  SbMemoryCopy(&data_padded[8u - data.size()], data.data(), data.size());
+  memcpy(&data_padded[8u - data.size()], data.data(), data.size());
   return base::HexStringToUInt(data_padded, out);
 }
 
diff --git a/src/net/spdy/platform/impl/spdy_unsafe_arena_impl.cc b/src/net/spdy/platform/impl/spdy_unsafe_arena_impl.cc
index 91eeab0..24a0908 100644
--- a/src/net/spdy/platform/impl/spdy_unsafe_arena_impl.cc
+++ b/src/net/spdy/platform/impl/spdy_unsafe_arena_impl.cc
@@ -50,13 +50,13 @@
     }
   }
   char* out = Alloc(newsize);
-  SbMemoryCopy(out, original, oldsize);
+  memcpy(out, original, oldsize);
   return out;
 }
 
 char* SpdyUnsafeArenaImpl::Memdup(const char* data, size_t size) {
   char* out = Alloc(size);
-  SbMemoryCopy(out, data, size);
+  memcpy(out, data, size);
   return out;
 }
 
diff --git a/src/net/spdy/platform/impl/spdy_unsafe_arena_impl_test.cc b/src/net/spdy/platform/impl/spdy_unsafe_arena_impl_test.cc
index d4f7b1c..401c803 100644
--- a/src/net/spdy/platform/impl/spdy_unsafe_arena_impl_test.cc
+++ b/src/net/spdy/platform/impl/spdy_unsafe_arena_impl_test.cc
@@ -19,7 +19,7 @@
 
 TEST(SpdyUnsafeArenaImplTest, Memdup) {
   SpdyUnsafeArenaImpl arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c = arena.Memdup(kTestString, length);
   EXPECT_NE(nullptr, c);
   EXPECT_NE(c, kTestString);
@@ -28,7 +28,7 @@
 
 TEST(SpdyUnsafeArenaImplTest, MemdupLargeString) {
   SpdyUnsafeArenaImpl arena(10 /* block size */);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c = arena.Memdup(kTestString, length);
   EXPECT_NE(nullptr, c);
   EXPECT_NE(c, kTestString);
@@ -53,7 +53,7 @@
 
 TEST(SpdyUnsafeArenaImplTest, UseAfterReset) {
   SpdyUnsafeArenaImpl arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c = arena.Memdup(kTestString, length);
   arena.Reset();
   c = arena.Memdup(kTestString, length);
@@ -64,7 +64,7 @@
 
 TEST(SpdyUnsafeArenaImplTest, Free) {
   SpdyUnsafeArenaImpl arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   // Freeing memory not owned by the arena should be a no-op, and freeing
   // before any allocations from the arena should be a no-op.
   arena.Free(const_cast<char*>(kTestString), length);
@@ -90,7 +90,7 @@
 
 TEST(SpdyUnsafeArenaImplTest, Alloc) {
   SpdyUnsafeArenaImpl arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   char* c1 = arena.Alloc(length);
   char* c2 = arena.Alloc(2 * length);
   char* c3 = arena.Alloc(3 * length);
@@ -103,7 +103,7 @@
 
 TEST(SpdyUnsafeArenaImplTest, Realloc) {
   SpdyUnsafeArenaImpl arena(kDefaultBlockSize);
-  const size_t length = SbStringGetLength(kTestString);
+  const size_t length = strlen(kTestString);
   // Simple realloc that fits in the block.
   char* c1 = arena.Memdup(kTestString, length);
   char* c2 = arena.Realloc(c1, length, 2 * length);
diff --git a/src/net/spdy/spdy_network_transaction_unittest.cc b/src/net/spdy/spdy_network_transaction_unittest.cc
index 4599aa5..6353a46 100644
--- a/src/net/spdy/spdy_network_transaction_unittest.cc
+++ b/src/net/spdy/spdy_network_transaction_unittest.cc
@@ -3226,7 +3226,7 @@
   static const char kPushedData[] = "pushed payload for chunked test";
   spdy::SpdySerializedFrame stream2_body_base(
       spdy_util_.ConstructSpdyDataFrame(2, kPushedData, true));
-  const size_t kChunkSize = SbStringGetLength(kPushedData) / 4;
+  const size_t kChunkSize = strlen(kPushedData) / 4;
   spdy::SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize,
                                           false);
   spdy::SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize,
@@ -3280,7 +3280,7 @@
   static const char kPushedData[] = "pushed payload for chunked test";
   spdy::SpdySerializedFrame stream2_body_base(
       spdy_util_.ConstructSpdyDataFrame(2, kPushedData, true));
-  const size_t kChunkSize = SbStringGetLength(kPushedData) / 4;
+  const size_t kChunkSize = strlen(kPushedData) / 4;
   spdy::SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize,
                                           false);
   spdy::SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize,
@@ -4177,7 +4177,7 @@
   // Read HEADERS with corrupted payload.
   spdy::SpdySerializedFrame resp(
       spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
-  SbMemorySet(resp.data() + 12, 0xcf, resp.size() - 12);
+  memset(resp.data() + 12, 0xcf, resp.size() - 12);
   MockRead reads[] = {CreateMockRead(resp, 1)};
 
   SequencedSocketData data(reads, writes);
diff --git a/src/net/spdy/spdy_proxy_client_socket_unittest.cc b/src/net/spdy/spdy_proxy_client_socket_unittest.cc
index 3b7a5b1..e0446fe 100644
--- a/src/net/spdy/spdy_proxy_client_socket_unittest.cc
+++ b/src/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -225,7 +225,7 @@
     const char* data, int size) {
   scoped_refptr<IOBufferWithSize> buf =
       base::MakeRefCounted<IOBufferWithSize>(size);
-  SbMemoryCopy(buf->data(), data, size);
+  memcpy(buf->data(), data, size);
   return buf;
 }
 
diff --git a/src/net/spdy/spdy_read_queue.cc b/src/net/spdy/spdy_read_queue.cc
index 9142876..d93c4fe 100644
--- a/src/net/spdy/spdy_read_queue.cc
+++ b/src/net/spdy/spdy_read_queue.cc
@@ -41,7 +41,7 @@
     SpdyBuffer* buffer = queue_.front().get();
     size_t bytes_to_copy =
         std::min(len - bytes_copied, buffer->GetRemainingSize());
-    SbMemoryCopy(out + bytes_copied, buffer->GetRemainingData(), bytes_to_copy);
+    memcpy(out + bytes_copied, buffer->GetRemainingData(), bytes_to_copy);
     bytes_copied += bytes_to_copy;
     if (bytes_to_copy == buffer->GetRemainingSize())
       queue_.pop_front();
diff --git a/src/net/spdy/spdy_read_queue_unittest.cc b/src/net/spdy/spdy_read_queue_unittest.cc
index 57abc91..90fa6c3 100644
--- a/src/net/spdy/spdy_read_queue_unittest.cc
+++ b/src/net/spdy/spdy_read_queue_unittest.cc
@@ -51,7 +51,7 @@
   size_t padding = std::max(static_cast<size_t>(4096), queue->GetTotalSize());
   size_t buffer_size_with_padding = padding + max_buffer_size + padding;
   auto buffer = std::make_unique<char[]>(buffer_size_with_padding);
-  SbMemorySet(buffer.get(), 0, buffer_size_with_padding);
+  memset(buffer.get(), 0, buffer_size_with_padding);
   char* buffer_data = buffer.get() + padding;
 
   while (!queue->IsEmpty()) {
diff --git a/src/net/spdy/spdy_session.cc b/src/net/spdy/spdy_session.cc
index 5ca72b8..519521d 100644
--- a/src/net/spdy/spdy_session.cc
+++ b/src/net/spdy/spdy_session.cc
@@ -2383,17 +2383,17 @@
 #endif
   size_t offset = 0;
 
-  SbMemoryCopy(initial_frame_data.get() + offset,
+  memcpy(initial_frame_data.get() + offset,
                spdy::kHttp2ConnectionHeaderPrefix,
                spdy::kHttp2ConnectionHeaderPrefixSize);
   offset += spdy::kHttp2ConnectionHeaderPrefixSize;
 
-  SbMemoryCopy(initial_frame_data.get() + offset, settings_frame->data(),
+  memcpy(initial_frame_data.get() + offset, settings_frame->data(),
                settings_frame->size());
   offset += settings_frame->size();
 
   if (send_window_update) {
-    SbMemoryCopy(initial_frame_data.get() + offset, window_update_frame->data(),
+    memcpy(initial_frame_data.get() + offset, window_update_frame->data(),
                  window_update_frame->size());
   }
 
diff --git a/src/net/spdy/spdy_session_unittest.cc b/src/net/spdy/spdy_session_unittest.cc
index 37cfabf..a8e368b 100644
--- a/src/net/spdy/spdy_session_unittest.cc
+++ b/src/net/spdy/spdy_session_unittest.cc
@@ -792,11 +792,11 @@
   auto buffer = std::make_unique<char[]>(joint_size);
   {
     size_t out = 0;
-    SbMemoryCopy(&buffer[out], goaway.data(), goaway.size());
+    memcpy(&buffer[out], goaway.data(), goaway.size());
     out += goaway.size();
-    SbMemoryCopy(&buffer[out], body.data(), body.size());
+    memcpy(&buffer[out], body.data(), body.size());
     out += body.size();
-    SbMemoryCopy(&buffer[out], goaway.data(), goaway.size());
+    memcpy(&buffer[out], goaway.data(), goaway.size());
     out += goaway.size();
     ASSERT_EQ(out, joint_size);
   }
diff --git a/src/net/spdy/spdy_test_util_common.cc b/src/net/spdy/spdy_test_util_common.cc
index 09a2ce6..c535852 100644
--- a/src/net/spdy/spdy_test_util_common.cc
+++ b/src/net/spdy/spdy_test_util_common.cc
@@ -154,7 +154,7 @@
   auto data = std::unique_ptr<char[]>(new char[total_size]);
   char* ptr = data.get();
   for (const auto* frame : frames) {
-    SbMemoryCopy(ptr, frame->data(), frame->size());
+    memcpy(ptr, frame->data(), frame->size());
     ptr += frame->size();
   }
   return spdy::SpdySerializedFrame(data.release(), total_size,
@@ -1075,7 +1075,7 @@
 namespace test {
 HashValue GetTestHashValue(uint8_t label) {
   HashValue hash_value(HASH_VALUE_SHA256);
-  SbMemorySet(hash_value.data(), label, hash_value.size());
+  memset(hash_value.data(), label, hash_value.size());
   return hash_value;
 }
 
diff --git a/src/net/ssl/client_cert_store_win.cc b/src/net/ssl/client_cert_store_win.cc
index 1e2898b..61d6fce 100644
--- a/src/net/ssl/client_cert_store_win.cc
+++ b/src/net/ssl/client_cert_store_win.cc
@@ -127,7 +127,7 @@
 
   // Enumerate the client certificates.
   CERT_CHAIN_FIND_BY_ISSUER_PARA find_by_issuer_para;
-  SbMemorySet(&find_by_issuer_para, 0, sizeof(find_by_issuer_para));
+  memset(&find_by_issuer_para, 0, sizeof(find_by_issuer_para));
   find_by_issuer_para.cbSize = sizeof(find_by_issuer_para);
   find_by_issuer_para.pszUsageIdentifier = szOID_PKIX_KP_CLIENT_AUTH;
   find_by_issuer_para.cIssuer = static_cast<DWORD>(auth_count);
@@ -295,7 +295,7 @@
     // Add dummy private key data to the certificate - otherwise the certificate
     // would be discarded by the filtering routines.
     CRYPT_KEY_PROV_INFO private_key_data;
-    SbMemorySet(&private_key_data, 0, sizeof(private_key_data));
+    memset(&private_key_data, 0, sizeof(private_key_data));
     if (!CertSetCertificateContextProperty(cert,
                                            CERT_KEY_PROV_INFO_PROP_ID,
                                            0, &private_key_data)) {
diff --git a/src/net/ssl/ssl_platform_key_nss_unittest.cc b/src/net/ssl/ssl_platform_key_nss_unittest.cc
index 6dd2725..f1f6317 100644
--- a/src/net/ssl/ssl_platform_key_nss_unittest.cc
+++ b/src/net/ssl/ssl_platform_key_nss_unittest.cc
@@ -87,7 +87,7 @@
     SECItem encrypted_item = {siBuffer, encrypted.data(),
                               static_cast<unsigned>(encrypted.size())};
     SECKEYEncryptedPrivateKeyInfo epki;
-    SbMemorySet(&epki, 0, sizeof(epki));
+    memset(&epki, 0, sizeof(epki));
     crypto::ScopedPLArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE));
     ASSERT_EQ(SECSuccess,
               SEC_QuickDERDecodeItem(
diff --git a/src/net/test/ct_test_util.cc b/src/net/test/ct_test_util.cc
index 56c5a83..957058a 100644
--- a/src/net/test/ct_test_util.cc
+++ b/src/net/test/ct_test_util.cc
@@ -190,7 +190,7 @@
 void GetPrecertSignedEntry(SignedEntryData* entry) {
   entry->type = ct::SignedEntryData::LOG_ENTRY_TYPE_PRECERT;
   std::string issuer_hash(HexToBytes(kDefaultIssuerKeyHash));
-  SbMemoryCopy(entry->issuer_key_hash.data, issuer_hash.data(),
+  memcpy(entry->issuer_key_hash.data, issuer_hash.data(),
                issuer_hash.size());
   entry->tbs_certificate = HexToBytes(kDefaultDerTbsCert);
 }
@@ -278,7 +278,7 @@
                    base::TimeDelta::FromMilliseconds(kTestTimestamp);
   sth->tree_size = kSampleSTHTreeSize;
   std::string sha256_root_hash = GetSampleSTHSHA256RootHash();
-  SbMemoryCopy(sth->sha256_root_hash, sha256_root_hash.c_str(),
+  memcpy(sth->sha256_root_hash, sha256_root_hash.c_str(),
                kSthRootHashLength);
   sth->log_id = GetTestPublicKeyId();
 
@@ -292,7 +292,7 @@
   sth->tree_size = 0;
   std::string empty_root_hash = HexToBytes(
       "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
-  SbMemoryCopy(sth->sha256_root_hash, empty_root_hash.c_str(),
+  memcpy(sth->sha256_root_hash, empty_root_hash.c_str(),
                kSthRootHashLength);
   sth->log_id = GetTestPublicKeyId();
 
@@ -309,7 +309,7 @@
   sth->timestamp = base::Time::UnixEpoch() +
                    base::TimeDelta::FromMilliseconds(INT64_C(1450870952897));
   sth->tree_size = 0;
-  SbMemorySet(sth->sha256_root_hash, 'f', kSthRootHashLength);
+  memset(sth->sha256_root_hash, 'f', kSthRootHashLength);
   sth->log_id = GetTestPublicKeyId();
 
   std::string tree_head_signature = HexToBytes(
diff --git a/src/net/test/url_request/url_request_mock_data_job.cc b/src/net/test/url_request/url_request_mock_data_job.cc
index 670587a..5870a0a 100644
--- a/src/net/test/url_request/url_request_mock_data_job.cc
+++ b/src/net/test/url_request/url_request_mock_data_job.cc
@@ -128,7 +128,7 @@
 int URLRequestMockDataJob::ReadRawData(IOBuffer* buf, int buf_size) {
   int bytes_read =
       std::min(static_cast<size_t>(buf_size), data_.length() - data_offset_);
-  SbMemoryCopy(buf->data(), data_.c_str() + data_offset_, bytes_read);
+  memcpy(buf->data(), data_.c_str() + data_offset_, bytes_read);
   data_offset_ += bytes_read;
   return bytes_read;
 }
diff --git a/src/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp b/src/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
index a4d2793..d56477b 100644
--- a/src/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
+++ b/src/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
@@ -71,7 +71,7 @@
     item->data[2*i+1] = (unsigned char )(uni[i]);
   }
 #else
-  SbMemoryCopy(item->data, uni, item->len);
+  memcpy(item->data, uni, item->len);
 #endif
 }
 
@@ -141,7 +141,7 @@
   CHECK_GE(maxOutBufLen, inBufLen);
   // do a no-op, since I've already got Unicode.  Hah!
   *outBufLen = inBufLen;
-  SbMemoryCopy(outBuf, inBuf, inBufLen);
+  memcpy(outBuf, inBuf, inBufLen);
   return PR_TRUE;
 }
 
diff --git a/src/net/third_party/quic/core/crypto/aead_base_decrypter.cc b/src/net/third_party/quic/core/crypto/aead_base_decrypter.cc
index db46fb9..99515a4 100644
--- a/src/net/third_party/quic/core/crypto/aead_base_decrypter.cc
+++ b/src/net/third_party/quic/core/crypto/aead_base_decrypter.cc
@@ -74,7 +74,7 @@
   if (key.size() != key_size_) {
     return false;
   }
-  SbMemoryCopy(key_, key.data(), key.size());
+  memcpy(key_, key.data(), key.size());
 
   EVP_AEAD_CTX_cleanup(ctx_.get());
   if (!EVP_AEAD_CTX_init(ctx_.get(), aead_alg_, key_, key_size_, auth_tag_size_,
@@ -95,7 +95,7 @@
   if (nonce_prefix.size() != nonce_size_ - sizeof(QuicPacketNumber)) {
     return false;
   }
-  SbMemoryCopy(iv_, nonce_prefix.data(), nonce_prefix.size());
+  memcpy(iv_, nonce_prefix.data(), nonce_prefix.size());
   return true;
 }
 
@@ -108,7 +108,7 @@
   if (iv.size() != nonce_size_) {
     return false;
   }
-  SbMemoryCopy(iv_, iv.data(), iv.size());
+  memcpy(iv_, iv.data(), iv.size());
   return true;
 }
 
@@ -158,7 +158,7 @@
   }
 
   uint8_t nonce[kMaxNonceSize];
-  SbMemoryCopy(nonce, iv_, nonce_size_);
+  memcpy(nonce, iv_, nonce_size_);
   size_t prefix_len = nonce_size_ - sizeof(packet_number);
   if (use_ietf_nonce_construction_) {
     for (size_t i = 0; i < sizeof(packet_number); ++i) {
@@ -166,7 +166,7 @@
           (packet_number >> ((sizeof(packet_number) - i - 1) * 8)) & 0xff;
     }
   } else {
-    SbMemoryCopy(nonce + prefix_len, &packet_number, sizeof(packet_number));
+    memcpy(nonce + prefix_len, &packet_number, sizeof(packet_number));
   }
   if (!EVP_AEAD_CTX_open(
           ctx_.get(), reinterpret_cast<uint8_t*>(output), output_length,
diff --git a/src/net/third_party/quic/core/crypto/aead_base_encrypter.cc b/src/net/third_party/quic/core/crypto/aead_base_encrypter.cc
index d0d20da..a7de8e7 100644
--- a/src/net/third_party/quic/core/crypto/aead_base_encrypter.cc
+++ b/src/net/third_party/quic/core/crypto/aead_base_encrypter.cc
@@ -64,7 +64,7 @@
   if (key.size() != key_size_) {
     return false;
   }
-  SbMemoryCopy(key_, key.data(), key.size());
+  memcpy(key_, key.data(), key.size());
 
   EVP_AEAD_CTX_cleanup(ctx_.get());
 
@@ -86,7 +86,7 @@
   if (nonce_prefix.size() != nonce_size_ - sizeof(QuicPacketNumber)) {
     return false;
   }
-  SbMemoryCopy(iv_, nonce_prefix.data(), nonce_prefix.size());
+  memcpy(iv_, nonce_prefix.data(), nonce_prefix.size());
   return true;
 }
 
@@ -99,7 +99,7 @@
   if (iv.size() != nonce_size_) {
     return false;
   }
-  SbMemoryCopy(iv_, iv.data(), iv.size());
+  memcpy(iv_, iv.data(), iv.size());
   return true;
 }
 
@@ -137,7 +137,7 @@
   // TODO(ianswett): Introduce a check to ensure that we don't encrypt with the
   // same packet number twice.
   QUIC_ALIGNED(4) char nonce_buffer[kMaxNonceSize];
-  SbMemoryCopy(nonce_buffer, iv_, nonce_size_);
+  memcpy(nonce_buffer, iv_, nonce_size_);
   size_t prefix_len = nonce_size_ - sizeof(packet_number);
   if (use_ietf_nonce_construction_) {
     for (size_t i = 0; i < sizeof(packet_number); ++i) {
@@ -145,7 +145,7 @@
           (packet_number >> ((sizeof(packet_number) - i - 1) * 8)) & 0xff;
     }
   } else {
-    SbMemoryCopy(nonce_buffer + prefix_len, &packet_number,
+    memcpy(nonce_buffer + prefix_len, &packet_number,
                  sizeof(packet_number));
   }
 
diff --git a/src/net/third_party/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc b/src/net/third_party/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc
index 9a3aa55..e65818e 100644
--- a/src/net/third_party/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc
+++ b/src/net/third_party/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc
@@ -208,7 +208,7 @@
   QuicStringPiece nonce_prefix(nonce.data(),
                                nonce.size() - sizeof(packet_number));
   decrypter->SetNoncePrefix(nonce_prefix);
-  SbMemoryCopy(&packet_number, nonce.data() + nonce_prefix.size(),
+  memcpy(&packet_number, nonce.data() + nonce_prefix.size(),
                sizeof(packet_number));
   std::unique_ptr<char[]> output(new char[ciphertext.length()]);
   size_t output_length = 0;
diff --git a/src/net/third_party/quic/core/crypto/cert_compressor.cc b/src/net/third_party/quic/core/crypto/cert_compressor.cc
index 386e707..f9a9772 100644
--- a/src/net/third_party/quic/core/crypto/cert_compressor.cc
+++ b/src/net/third_party/quic/core/crypto/cert_compressor.cc
@@ -199,7 +199,7 @@
       for (size_t j = 0; j < client_cached_cert_hashes.size();
            j += sizeof(uint64_t)) {
         uint64_t cached_hash;
-        SbMemoryCopy(&cached_hash, client_cached_cert_hashes.data() + j,
+        memcpy(&cached_hash, client_cached_cert_hashes.data() + j,
                      sizeof(uint64_t));
         if (hash != cached_hash) {
           continue;
@@ -264,14 +264,14 @@
       case CertEntry::COMPRESSED:
         break;
       case CertEntry::CACHED:
-        SbMemoryCopy(out, &i->hash, sizeof(i->hash));
+        memcpy(out, &i->hash, sizeof(i->hash));
         out += sizeof(uint64_t);
         break;
       case CertEntry::COMMON:
         // Assumes a little-endian machine.
-        SbMemoryCopy(out, &i->set_hash, sizeof(i->set_hash));
+        memcpy(out, &i->set_hash, sizeof(i->set_hash));
         out += sizeof(i->set_hash);
-        SbMemoryCopy(out, &i->index, sizeof(uint32_t));
+        memcpy(out, &i->index, sizeof(uint32_t));
         out += sizeof(uint32_t);
         break;
     }
@@ -364,7 +364,7 @@
         if (in.size() < sizeof(uint64_t)) {
           return false;
         }
-        SbMemoryCopy(&entry.hash, in.data(), sizeof(uint64_t));
+        memcpy(&entry.hash, in.data(), sizeof(uint64_t));
         in.remove_prefix(sizeof(uint64_t));
 
         if (cached_hashes.size() != cached_certs.size()) {
@@ -390,9 +390,9 @@
         if (in.size() < sizeof(uint64_t) + sizeof(uint32_t)) {
           return false;
         }
-        SbMemoryCopy(&entry.set_hash, in.data(), sizeof(uint64_t));
+        memcpy(&entry.set_hash, in.data(), sizeof(uint64_t));
         in.remove_prefix(sizeof(uint64_t));
-        SbMemoryCopy(&entry.index, in.data(), sizeof(uint32_t));
+        memcpy(&entry.index, in.data(), sizeof(uint32_t));
         in.remove_prefix(sizeof(uint32_t));
 
         QuicStringPiece cert =
@@ -472,7 +472,7 @@
   ScopedZLib scoped_z(ScopedZLib::DEFLATE);
 
   if (uncompressed_size > 0) {
-    SbMemorySet(&z, 0, sizeof(z));
+    memset(&z, 0, sizeof(z));
     int rv = deflateInit(&z, Z_DEFAULT_COMPRESSION);
     DCHECK_EQ(Z_OK, rv);
     if (rv != Z_OK) {
@@ -507,7 +507,7 @@
   }
 
   uint32_t uncompressed_size_32 = uncompressed_size;
-  SbMemoryCopy(j, &uncompressed_size_32, sizeof(uint32_t));
+  memcpy(j, &uncompressed_size_32, sizeof(uint32_t));
   j += sizeof(uint32_t);
 
   int rv;
@@ -573,7 +573,7 @@
     }
 
     uint32_t uncompressed_size;
-    SbMemoryCopy(&uncompressed_size, in.data(), sizeof(uncompressed_size));
+    memcpy(&uncompressed_size, in.data(), sizeof(uncompressed_size));
     in.remove_prefix(sizeof(uint32_t));
 
     if (uncompressed_size > 128 * 1024) {
@@ -584,7 +584,7 @@
     z_stream z;
     ScopedZLib scoped_z(ScopedZLib::INFLATE);
 
-    SbMemorySet(&z, 0, sizeof(z));
+    memset(&z, 0, sizeof(z));
     z.next_out = uncompressed_data.get();
     z.avail_out = uncompressed_size;
     z.next_in =
@@ -621,7 +621,7 @@
           return false;
         }
         uint32_t cert_len;
-        SbMemoryCopy(&cert_len, uncompressed.data(), sizeof(cert_len));
+        memcpy(&cert_len, uncompressed.data(), sizeof(cert_len));
         uncompressed.remove_prefix(sizeof(uint32_t));
         if (uncompressed.size() < cert_len) {
           return false;
diff --git a/src/net/third_party/quic/core/crypto/chacha20_poly1305_decrypter_test.cc b/src/net/third_party/quic/core/crypto/chacha20_poly1305_decrypter_test.cc
index f366086..aef1b08 100644
--- a/src/net/third_party/quic/core/crypto/chacha20_poly1305_decrypter_test.cc
+++ b/src/net/third_party/quic/core/crypto/chacha20_poly1305_decrypter_test.cc
@@ -121,7 +121,7 @@
   QuicStringPiece nonce_prefix(nonce.data(),
                                nonce.size() - sizeof(packet_number));
   decrypter->SetNoncePrefix(nonce_prefix);
-  SbMemoryCopy(&packet_number, nonce.data() + nonce_prefix.size(),
+  memcpy(&packet_number, nonce.data() + nonce_prefix.size(),
                sizeof(packet_number));
   std::unique_ptr<char[]> output(new char[ciphertext.length()]);
   size_t output_length = 0;
diff --git a/src/net/third_party/quic/core/crypto/channel_id.cc b/src/net/third_party/quic/core/crypto/channel_id.cc
index b5f8a66..428b856 100644
--- a/src/net/third_party/quic/core/crypto/channel_id.cc
+++ b/src/net/third_party/quic/core/crypto/channel_id.cc
@@ -78,9 +78,9 @@
   SHA256_CTX sha256;
   SHA256_Init(&sha256);
   if (is_channel_id_signature) {
-    SHA256_Update(&sha256, kContextStr, SbStringGetLength(kContextStr) + 1);
+    SHA256_Update(&sha256, kContextStr, strlen(kContextStr) + 1);
     SHA256_Update(&sha256, kClientToServerStr,
-                  SbStringGetLength(kClientToServerStr) + 1);
+                  strlen(kClientToServerStr) + 1);
   }
   SHA256_Update(&sha256, signed_data.data(), signed_data.size());
 
diff --git a/src/net/third_party/quic/core/crypto/channel_id_test.cc b/src/net/third_party/quic/core/crypto/channel_id_test.cc
index a25f3b8..0902e39 100644
--- a/src/net/third_party/quic/core/crypto/channel_id_test.cc
+++ b/src/net/third_party/quic/core/crypto/channel_id_test.cc
@@ -304,13 +304,13 @@
   EXPECT_FALSE(ChannelIDVerifier::Verify(key, "a" + signed_data, signature));
 
   std::unique_ptr<char[]> bad_key(new char[key.size()]);
-  SbMemoryCopy(bad_key.get(), key.data(), key.size());
+  memcpy(bad_key.get(), key.data(), key.size());
   bad_key[1] ^= 0x80;
   EXPECT_FALSE(ChannelIDVerifier::Verify(QuicString(bad_key.get(), key.size()),
                                          signed_data, signature));
 
   std::unique_ptr<char[]> bad_signature(new char[signature.size()]);
-  SbMemoryCopy(bad_signature.get(), signature.data(), signature.size());
+  memcpy(bad_signature.get(), signature.data(), signature.size());
   bad_signature[1] ^= 0x80;
   EXPECT_FALSE(ChannelIDVerifier::Verify(
       key, signed_data, QuicString(bad_signature.get(), signature.size())));
diff --git a/src/net/third_party/quic/core/crypto/common_cert_set.cc b/src/net/third_party/quic/core/crypto/common_cert_set.cc
index 38403b9..01608c9 100644
--- a/src/net/third_party/quic/core/crypto/common_cert_set.cc
+++ b/src/net/third_party/quic/core/crypto/common_cert_set.cc
@@ -59,7 +59,7 @@
   if (len > b_len) {
     len = b_len;
   }
-  int n = SbMemoryCompare(a.data(), b, len);
+  int n = memcmp(a.data(), b, len);
   if (n != 0) {
     return n;
   }
@@ -119,7 +119,7 @@
 
     for (size_t i = 0; i < common_set_hashes.size() / sizeof(uint64_t); i++) {
       uint64_t hash;
-      SbMemoryCopy(&hash, common_set_hashes.data() + i * sizeof(uint64_t),
+      memcpy(&hash, common_set_hashes.data() + i * sizeof(uint64_t),
                    sizeof(uint64_t));
 
       for (size_t j = 0; j < QUIC_ARRAYSIZE(kSets); j++) {
diff --git a/src/net/third_party/quic/core/crypto/common_cert_set_test.cc b/src/net/third_party/quic/core/crypto/common_cert_set_test.cc
index 3b6c39e..b05911d 100644
--- a/src/net/third_party/quic/core/crypto/common_cert_set_test.cc
+++ b/src/net/third_party/quic/core/crypto/common_cert_set_test.cc
@@ -211,7 +211,7 @@
   QuicStringPiece gia_copy = sets->GetCert(hash, index);
   EXPECT_FALSE(gia_copy.empty());
   ASSERT_EQ(gia.size(), gia_copy.size());
-  EXPECT_EQ(0, SbMemoryCompare(gia.data(), gia_copy.data(), gia.size()));
+  EXPECT_EQ(0, memcmp(gia.data(), gia_copy.data(), gia.size()));
 }
 
 TEST_F(CommonCertSetsTest, FindGIA_3) {
@@ -232,7 +232,7 @@
   QuicStringPiece gia_copy = sets->GetCert(hash, index);
   EXPECT_FALSE(gia_copy.empty());
   ASSERT_EQ(gia.size(), gia_copy.size());
-  EXPECT_EQ(0, SbMemoryCompare(gia.data(), gia_copy.data(), gia.size()));
+  EXPECT_EQ(0, memcmp(gia.data(), gia_copy.data(), gia.size()));
 }
 #endif  // COMMON_CERT_SET_DISABLED_FOR_STARBOARD
 
diff --git a/src/net/third_party/quic/core/crypto/crypto_handshake_message.cc b/src/net/third_party/quic/core/crypto/crypto_handshake_message.cc
index aed2239..6165929 100644
--- a/src/net/third_party/quic/core/crypto/crypto_handshake_message.cc
+++ b/src/net/third_party/quic/core/crypto/crypto_handshake_message.cc
@@ -114,7 +114,7 @@
   out_tags->resize(num_tags);
   for (size_t i = 0; i < num_tags; ++i) {
     QuicTag tag;
-    SbMemoryCopy(&tag, it->second.data() + i * sizeof(tag), sizeof(tag));
+    memcpy(&tag, it->second.data() + i * sizeof(tag), sizeof(tag));
     (*out_tags)[i] = tag;
   }
   return ret;
@@ -254,11 +254,11 @@
   }
 
   if (ret != QUIC_NO_ERROR) {
-    SbMemorySet(out, 0, len);
+    memset(out, 0, len);
     return ret;
   }
 
-  SbMemoryCopy(out, it->second.data(), len);
+  memcpy(out, it->second.data(), len);
   return ret;
 }
 
@@ -280,7 +280,7 @@
         // uint32_t value
         if (it->second.size() == 4) {
           uint32_t value;
-          SbMemoryCopy(&value, it->second.data(), sizeof(value));
+          memcpy(&value, it->second.data(), sizeof(value));
           ret += QuicTextUtils::Uint64ToString(value);
           done = true;
         }
@@ -289,7 +289,7 @@
         // uint64_t value
         if (it->second.size() == 8) {
           uint64_t value;
-          SbMemoryCopy(&value, it->second.data(), sizeof(value));
+          memcpy(&value, it->second.data(), sizeof(value));
           value = QuicEndian::NetToHost64(value);
           ret += QuicTextUtils::Uint64ToString(value);
           done = true;
@@ -305,7 +305,7 @@
         if (it->second.size() % sizeof(QuicTag) == 0) {
           for (size_t j = 0; j < it->second.size(); j += sizeof(QuicTag)) {
             QuicTag tag;
-            SbMemoryCopy(&tag, it->second.data() + j, sizeof(tag));
+            memcpy(&tag, it->second.data() + j, sizeof(tag));
             if (j > 0) {
               ret += ",";
             }
@@ -319,7 +319,7 @@
         if (it->second.size() % sizeof(uint32_t) == 0) {
           for (size_t j = 0; j < it->second.size(); j += sizeof(uint32_t)) {
             uint32_t value;
-            SbMemoryCopy(&value, it->second.data() + j, sizeof(value));
+            memcpy(&value, it->second.data() + j, sizeof(value));
             if (j > 0) {
               ret += ",";
             }
diff --git a/src/net/third_party/quic/core/crypto/crypto_server_test.cc b/src/net/third_party/quic/core/crypto/crypto_server_test.cc
index 111637c..5ad875d 100644
--- a/src/net/third_party/quic/core/crypto/crypto_server_test.cc
+++ b/src/net/third_party/quic/core/crypto/crypto_server_test.cc
@@ -145,10 +145,10 @@
     QuicStringPiece orbit;
     CHECK(msg->GetStringPiece(kORBT, &orbit));
     CHECK_EQ(sizeof(orbit_), orbit.size());
-    SbMemoryCopy(orbit_, orbit.data(), orbit.size());
+    memcpy(orbit_, orbit.data(), orbit.size());
 
     char public_value[32];
-    SbMemorySet(public_value, 42, sizeof(public_value));
+    memset(public_value, 42, sizeof(public_value));
 
     nonce_hex_ = "#" + QuicTextUtils::HexEncode(GenerateNonce());
     pub_hex_ =
@@ -1098,7 +1098,7 @@
 
   // scid is a SHA-256 hash, truncated to 16 bytes.
   ASSERT_EQ(scid.size(), 16u);
-  EXPECT_EQ(0, SbMemoryCompare(digest, scid_str.c_str(), scid.size()));
+  EXPECT_EQ(0, memcmp(digest, scid_str.c_str(), scid.size()));
 }
 
 class CryptoServerTestNoConfig : public CryptoServerTest {
diff --git a/src/net/third_party/quic/core/crypto/crypto_utils.cc b/src/net/third_party/quic/core/crypto/crypto_utils.cc
index 4a69cc7..9d9c1e3 100644
--- a/src/net/third_party/quic/core/crypto/crypto_utils.cc
+++ b/src/net/third_party/quic/core/crypto/crypto_utils.cc
@@ -156,7 +156,7 @@
   size_t bytes_written = 4;
 
   if (orbit.size() == 8) {
-    SbMemoryCopy(&(*nonce)[bytes_written], orbit.data(), orbit.size());
+    memcpy(&(*nonce)[bytes_written], orbit.data(), orbit.size());
     bytes_written += orbit.size();
   }
 
diff --git a/src/net/third_party/quic/core/crypto/curve25519_key_exchange.cc b/src/net/third_party/quic/core/crypto/curve25519_key_exchange.cc
index 1267689..8d40b03 100644
--- a/src/net/third_party/quic/core/crypto/curve25519_key_exchange.cc
+++ b/src/net/third_party/quic/core/crypto/curve25519_key_exchange.cc
@@ -55,7 +55,7 @@
   }
 
   auto ka = QuicWrapUnique(new Curve25519KeyExchange);
-  SbMemoryCopy(ka->private_key_, private_key.data(), X25519_PRIVATE_KEY_LEN);
+  memcpy(ka->private_key_, private_key.data(), X25519_PRIVATE_KEY_LEN);
   X25519_public_from_private(ka->public_key_, ka->private_key_);
   return ka;
 }
diff --git a/src/net/third_party/quic/core/crypto/null_decrypter.cc b/src/net/third_party/quic/core/crypto/null_decrypter.cc
index 7c33031..6032c4d 100644
--- a/src/net/third_party/quic/core/crypto/null_decrypter.cc
+++ b/src/net/third_party/quic/core/crypto/null_decrypter.cc
@@ -62,7 +62,7 @@
     return false;
   }
   // Copy the plaintext to output.
-  SbMemoryCopy(output, plaintext.data(), plaintext.length());
+  memcpy(output, plaintext.data(), plaintext.length());
   *output_length = plaintext.length();
   return true;
 }
diff --git a/src/net/third_party/quic/core/crypto/null_encrypter.cc b/src/net/third_party/quic/core/crypto/null_encrypter.cc
index a55e877..b97f0b7 100644
--- a/src/net/third_party/quic/core/crypto/null_encrypter.cc
+++ b/src/net/third_party/quic/core/crypto/null_encrypter.cc
@@ -47,7 +47,7 @@
   }
   // TODO(ianswett): memmove required for in place encryption.  Placing the
   // hash at the end would allow use of memcpy, doing nothing for in place.
-  SbMemoryMove(output + GetHashLength(), plaintext.data(), plaintext.length());
+  memmove(output + GetHashLength(), plaintext.data(), plaintext.length());
   QuicUtils::SerializeUint128Short(hash,
                                    reinterpret_cast<unsigned char*>(output));
   *output_length = len;
diff --git a/src/net/third_party/quic/core/crypto/p256_key_exchange.cc b/src/net/third_party/quic/core/crypto/p256_key_exchange.cc
index 0ad132b..1427e45 100644
--- a/src/net/third_party/quic/core/crypto/p256_key_exchange.cc
+++ b/src/net/third_party/quic/core/crypto/p256_key_exchange.cc
@@ -41,7 +41,7 @@
 P256KeyExchange::P256KeyExchange(bssl::UniquePtr<EC_KEY> private_key,
                                  const uint8_t* public_key)
     : private_key_(std::move(private_key)) {
-  SbMemoryCopy(public_key_, public_key, sizeof(public_key_));
+  memcpy(public_key_, public_key, sizeof(public_key_));
 }
 
 P256KeyExchange::~P256KeyExchange() {}
diff --git a/src/net/third_party/quic/core/crypto/quic_crypto_client_config.cc b/src/net/third_party/quic/core/crypto/quic_crypto_client_config.cc
index 453a4f5..1f178d4 100644
--- a/src/net/third_party/quic/core/crypto/quic_crypto_client_config.cc
+++ b/src/net/third_party/quic/core/crypto/quic_crypto_client_config.cc
@@ -657,7 +657,7 @@
     QuicString hkdf_input;
     const QuicData& client_hello_serialized = out->GetSerialized();
     hkdf_input.append(QuicCryptoConfig::kCETVLabel,
-                      SbStringGetLength(QuicCryptoConfig::kCETVLabel) + 1);
+                      strlen(QuicCryptoConfig::kCETVLabel) + 1);
       hkdf_input.append(connection_id.data(), connection_id.length());
     hkdf_input.append(client_hello_serialized.data(),
                       client_hello_serialized.length());
@@ -722,7 +722,7 @@
 
   QuicString hkdf_input;
   const size_t label_len =
-      SbStringGetLength(QuicCryptoConfig::kInitialLabel) + 1;
+      strlen(QuicCryptoConfig::kInitialLabel) + 1;
   hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size());
   hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len);
   hkdf_input.append(out_params->hkdf_input_suffix);
@@ -913,7 +913,7 @@
 
   QuicString hkdf_input;
   const size_t label_len =
-      SbStringGetLength(QuicCryptoConfig::kForwardSecureLabel) + 1;
+      strlen(QuicCryptoConfig::kForwardSecureLabel) + 1;
   hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size());
   hkdf_input.append(QuicCryptoConfig::kForwardSecureLabel, label_len);
   hkdf_input.append(out_params->hkdf_input_suffix);
diff --git a/src/net/third_party/quic/core/crypto/quic_crypto_server_config.cc b/src/net/third_party/quic/core/crypto/quic_crypto_server_config.cc
index 830ee94..e19abfc 100644
--- a/src/net/third_party/quic/core/crypto/quic_crypto_server_config.cc
+++ b/src/net/third_party/quic/core/crypto/quic_crypto_server_config.cc
@@ -309,7 +309,7 @@
 
   char orbit_bytes[kOrbitSize];
   if (options.orbit.size() == sizeof(orbit_bytes)) {
-    SbMemoryCopy(orbit_bytes, options.orbit.data(), sizeof(orbit_bytes));
+    memcpy(orbit_bytes, options.orbit.data(), sizeof(orbit_bytes));
   } else {
     DCHECK(options.orbit.empty());
     rand->RandBytes(orbit_bytes, sizeof(orbit_bytes));
@@ -1044,7 +1044,7 @@
         client_hello_copy.GetSerialized();
     QuicString hkdf_input;
     hkdf_input.append(QuicCryptoConfig::kCETVLabel,
-                      SbStringGetLength(QuicCryptoConfig::kCETVLabel) + 1);
+                      strlen(QuicCryptoConfig::kCETVLabel) + 1);
     hkdf_input.append(connection_id.data(), connection_id.length());
     hkdf_input.append(client_hello_copy_serialized.data(),
                       client_hello_copy_serialized.length());
@@ -1092,7 +1092,7 @@
   }
 
   QuicString hkdf_input;
-  size_t label_len = SbStringGetLength(QuicCryptoConfig::kInitialLabel) + 1;
+  size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1;
   hkdf_input.reserve(label_len + hkdf_suffix.size());
   hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len);
   hkdf_input.append(hkdf_suffix);
@@ -1123,7 +1123,7 @@
   }
 
   QuicString forward_secure_hkdf_input;
-  label_len = SbStringGetLength(QuicCryptoConfig::kForwardSecureLabel) + 1;
+  label_len = strlen(QuicCryptoConfig::kForwardSecureLabel) + 1;
   forward_secure_hkdf_input.reserve(label_len + hkdf_suffix.size());
   forward_secure_hkdf_input.append(QuicCryptoConfig::kForwardSecureLabel,
                                    label_len);
@@ -1784,7 +1784,7 @@
     return nullptr;
   }
   static_assert(sizeof(config->orbit) == kOrbitSize, "incorrect orbit size");
-  SbMemoryCopy(config->orbit, orbit.data(), sizeof(config->orbit));
+  memcpy(config->orbit, orbit.data(), sizeof(config->orbit));
 
   if (kexs_tags.size() != static_cast<size_t>(protobuf->key_size())) {
     QUIC_LOG(WARNING) << "Server config has " << kexs_tags.size()
diff --git a/src/net/third_party/quic/core/crypto/quic_hkdf_test.cc b/src/net/third_party/quic/core/crypto/quic_hkdf_test.cc
index 7b3805f..bf1508e 100644
--- a/src/net/third_party/quic/core/crypto/quic_hkdf_test.cc
+++ b/src/net/third_party/quic/core/crypto/quic_hkdf_test.cc
@@ -79,8 +79,8 @@
 
     ASSERT_EQ(expected.size(), hkdf.client_write_key().size());
     EXPECT_EQ(0,
-              SbMemoryCompare(expected.data(), hkdf.client_write_key().data(),
-                              expected.size()));
+              memcmp(expected.data(), hkdf.client_write_key().data(),
+                     expected.size()));
   }
 }
 
diff --git a/src/net/third_party/quic/core/crypto/quic_random_test.cc b/src/net/third_party/quic/core/crypto/quic_random_test.cc
index 408bdc8..6ea98b9 100644
--- a/src/net/third_party/quic/core/crypto/quic_random_test.cc
+++ b/src/net/third_party/quic/core/crypto/quic_random_test.cc
@@ -15,13 +15,13 @@
 TEST_F(QuicRandomTest, RandBytes) {
   unsigned char buf1[16];
   unsigned char buf2[16];
-  SbMemorySet(buf1, 0xaf, sizeof(buf1));
-  SbMemorySet(buf2, 0xaf, sizeof(buf2));
-  ASSERT_EQ(0, SbMemoryCompare(buf1, buf2, sizeof(buf1)));
+  memset(buf1, 0xaf, sizeof(buf1));
+  memset(buf2, 0xaf, sizeof(buf2));
+  ASSERT_EQ(0, memcmp(buf1, buf2, sizeof(buf1)));
 
   QuicRandom* rng = QuicRandom::GetInstance();
   rng->RandBytes(buf1, sizeof(buf1));
-  EXPECT_NE(0, SbMemoryCompare(buf1, buf2, sizeof(buf1)));
+  EXPECT_NE(0, memcmp(buf1, buf2, sizeof(buf1)));
 }
 
 TEST_F(QuicRandomTest, RandUint64) {
diff --git a/src/net/third_party/quic/core/crypto/transport_parameters.cc b/src/net/third_party/quic/core/crypto/transport_parameters.cc
index 9ce37ba..152b417 100644
--- a/src/net/third_party/quic/core/crypto/transport_parameters.cc
+++ b/src/net/third_party/quic/core/crypto/transport_parameters.cc
@@ -182,7 +182,7 @@
     return false;
   }
   out->resize(CBB_len(cbb.get()));
-  SbMemoryCopy(out->data(), CBB_data(cbb.get()), CBB_len(cbb.get()));
+  memcpy(out->data(), CBB_data(cbb.get()), CBB_len(cbb.get()));
   return true;
 }
 
diff --git a/src/net/third_party/quic/core/frames/quic_path_challenge_frame.cc b/src/net/third_party/quic/core/frames/quic_path_challenge_frame.cc
index a31d221..c07b6b6 100644
--- a/src/net/third_party/quic/core/frames/quic_path_challenge_frame.cc
+++ b/src/net/third_party/quic/core/frames/quic_path_challenge_frame.cc
@@ -18,7 +18,7 @@
     QuicControlFrameId control_frame_id,
     const QuicPathFrameBuffer& data_buff)
     : control_frame_id(control_frame_id) {
-  SbMemoryCopy(data_buffer.data(), data_buff.data(), data_buffer.size());
+  memcpy(data_buffer.data(), data_buff.data(), data_buffer.size());
 }
 
 QuicPathChallengeFrame::~QuicPathChallengeFrame() {}
diff --git a/src/net/third_party/quic/core/frames/quic_path_response_frame.cc b/src/net/third_party/quic/core/frames/quic_path_response_frame.cc
index d8f5db8..723030e 100644
--- a/src/net/third_party/quic/core/frames/quic_path_response_frame.cc
+++ b/src/net/third_party/quic/core/frames/quic_path_response_frame.cc
@@ -18,7 +18,7 @@
     QuicControlFrameId control_frame_id,
     const QuicPathFrameBuffer& data_buff)
     : control_frame_id(control_frame_id) {
-  SbMemoryCopy(data_buffer.data(), data_buff.data(), data_buffer.size());
+  memcpy(data_buffer.data(), data_buff.data(), data_buffer.size());
 }
 
 QuicPathResponseFrame::~QuicPathResponseFrame() {}
diff --git a/src/net/third_party/quic/core/http/quic_headers_stream_test.cc b/src/net/third_party/quic/core/http/quic_headers_stream_test.cc
index f2e1cad..0c88393 100644
--- a/src/net/third_party/quic/core/http/quic_headers_stream_test.cc
+++ b/src/net/third_party/quic/core/http/quic_headers_stream_test.cc
@@ -581,7 +581,7 @@
               CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, _, _))
       .Times(::testing::AnyNumber());
   stream_frame_.data_buffer = kBadData;
-  stream_frame_.data_length = SbStringGetLength(kBadData);
+  stream_frame_.data_length = strlen(kBadData);
   headers_stream_->OnStreamFrame(stream_frame_);
 }
 
diff --git a/src/net/third_party/quic/core/http/quic_spdy_stream_body_buffer.cc b/src/net/third_party/quic/core/http/quic_spdy_stream_body_buffer.cc
index 950554f..07742e0 100644
--- a/src/net/third_party/quic/core/http/quic_spdy_stream_body_buffer.cc
+++ b/src/net/third_party/quic/core/http/quic_spdy_stream_body_buffer.cc
@@ -106,7 +106,7 @@
       auto body = bodies_[index];
       size_t bytes_to_copy =
           std::min<size_t>(body.length() - src_offset, dest_remaining);
-      SbMemoryCopy(dest, body.substr(src_offset, bytes_to_copy).data(),
+      memcpy(dest, body.substr(src_offset, bytes_to_copy).data(),
                    bytes_to_copy);
       dest += bytes_to_copy;
       dest_remaining -= bytes_to_copy;
diff --git a/src/net/third_party/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc b/src/net/third_party/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
index dcead42..1b95b76 100644
--- a/src/net/third_party/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
+++ b/src/net/third_party/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
@@ -92,7 +92,7 @@
   ++it;
   EXPECT_TRUE(it == header_list.end());
 
-  EXPECT_EQ(SbStringGetLength("foo") + SbStringGetLength("bar"),
+  EXPECT_EQ(strlen("foo") + strlen("bar"),
             header_list.uncompressed_header_bytes());
   EXPECT_EQ(encoded_data.size(), header_list.compressed_header_bytes());
 }
diff --git a/src/net/third_party/quic/core/quic_connection_id.cc b/src/net/third_party/quic/core/quic_connection_id.cc
index d3429b8..938246d 100644
--- a/src/net/third_party/quic/core/quic_connection_id.cc
+++ b/src/net/third_party/quic/core/quic_connection_id.cc
@@ -29,7 +29,7 @@
   }
   length_ = length;
   if (length_ > 0) {
-    SbMemoryCopy(data_, data, length_);
+    memcpy(data_, data, length_);
   }
 }
 
@@ -58,7 +58,7 @@
 size_t QuicConnectionId::Hash() const {
   uint64_t data_bytes[3] = {0, 0, 0};
   static_assert(sizeof(data_bytes) >= sizeof(data_), "sizeof(data_) changed");
-  SbMemoryCopy(data_bytes, data_, length_);
+  memcpy(data_bytes, data_, length_);
   // This Hash function is designed to return the same value as the host byte
   // order representation when the connection ID length is 64 bits.
   return QuicEndian::NetToHost64(kQuicDefaultConnectionIdLength ^ length_ ^
@@ -78,7 +78,7 @@
 }
 
 bool QuicConnectionId::operator==(const QuicConnectionId& v) const {
-  return length_ == v.length_ && SbMemoryCompare(data_, v.data_, length_) == 0;
+  return length_ == v.length_ && memcmp(data_, v.data_, length_) == 0;
 }
 
 bool QuicConnectionId::operator!=(const QuicConnectionId& v) const {
@@ -92,7 +92,7 @@
   if (length_ > v.length_) {
     return false;
   }
-  return SbMemoryCompare(data_, v.data_, length_) < 0;
+  return memcmp(data_, v.data_, length_) < 0;
 }
 
 QuicConnectionId EmptyQuicConnectionId() {
diff --git a/src/net/third_party/quic/core/quic_connection_id_test.cc b/src/net/third_party/quic/core/quic_connection_id_test.cc
index 0ef3c62..5f64c31 100644
--- a/src/net/third_party/quic/core/quic_connection_id_test.cc
+++ b/src/net/third_party/quic/core/quic_connection_id_test.cc
@@ -43,7 +43,7 @@
 
 TEST_F(QuicConnectionIdTest, Data) {
   char connection_id_data[kQuicDefaultConnectionIdLength];
-  SbMemorySet(connection_id_data, 0x42, sizeof(connection_id_data));
+  memset(connection_id_data, 0x42, sizeof(connection_id_data));
   QuicConnectionId connection_id1 =
       QuicConnectionId(connection_id_data, sizeof(connection_id_data));
   QuicConnectionId connection_id2 =
@@ -51,10 +51,10 @@
   EXPECT_EQ(connection_id1, connection_id2);
   EXPECT_EQ(connection_id1.length(), kQuicDefaultConnectionIdLength);
   EXPECT_EQ(connection_id1.data(), connection_id1.mutable_data());
-  EXPECT_EQ(0, SbMemoryCompare(connection_id1.data(), connection_id2.data(),
-                               sizeof(connection_id_data)));
-  EXPECT_EQ(0, SbMemoryCompare(connection_id1.data(), connection_id_data,
-                               sizeof(connection_id_data)));
+  EXPECT_EQ(0, memcmp(connection_id1.data(), connection_id2.data(),
+                      sizeof(connection_id_data)));
+  EXPECT_EQ(0, memcmp(connection_id1.data(), connection_id_data,
+                      sizeof(connection_id_data)));
   connection_id2.mutable_data()[0] = 0x33;
   EXPECT_NE(connection_id1, connection_id2);
   static const uint8_t kNewLength = 4;
diff --git a/src/net/third_party/quic/core/quic_connection_test.cc b/src/net/third_party/quic/core/quic_connection_test.cc
index 1ab7070..1b55f08 100644
--- a/src/net/third_party/quic/core/quic_connection_test.cc
+++ b/src/net/third_party/quic/core/quic_connection_test.cc
@@ -118,9 +118,9 @@
       return false;
     }
     // Memmove is safe for inplace encryption.
-    SbMemoryMove(output, plaintext.data(), plaintext.size());
+    memmove(output, plaintext.data(), plaintext.size());
     output += plaintext.size();
-    SbMemorySet(output, tag_, kTagSize);
+    memset(output, tag_, kTagSize);
     *output_length = len;
     return true;
   }
@@ -184,7 +184,7 @@
       return false;
     }
     *output_length = ciphertext.size() - kTagSize;
-    SbMemoryCopy(output, ciphertext.data(), *output_length);
+    memcpy(output, ciphertext.data(), *output_length);
     return true;
   }
 
@@ -320,7 +320,7 @@
 
     if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
       final_bytes_of_previous_packet_ = final_bytes_of_last_packet_;
-      SbMemoryCopy(&final_bytes_of_last_packet_,
+      memcpy(&final_bytes_of_last_packet_,
                    packet.data() + packet.length() - 4,
                    sizeof(final_bytes_of_last_packet_));
     }
@@ -2844,7 +2844,7 @@
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(8);
   size_t len = 10000;
   std::unique_ptr<char[]> data_array(new char[len]);
-  SbMemorySet(data_array.get(), '?', len);
+  memset(data_array.get(), '?', len);
   struct IOVEC iov;
   iov.iov_base = data_array.get();
   iov.iov_len = len;
@@ -6747,7 +6747,7 @@
   EXPECT_FALSE(connection_.IsPathDegrading());
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   for (int i = 0; i < 2; ++i) {
@@ -6830,7 +6830,7 @@
   EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   // Send a packet.
@@ -6892,7 +6892,7 @@
   EXPECT_FALSE(connection_.IsPathDegrading());
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   // Send the first packet. Now there's a retransmittable packet on the wire, so
@@ -6958,7 +6958,7 @@
   EXPECT_FALSE(connection_.IsPathDegrading());
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   // Send the first packet. Now there's a retransmittable packet on the wire, so
@@ -7349,7 +7349,7 @@
       .WillRepeatedly(Return(true));
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   // Advance 5ms, send a retransmittable packet to the peer.
@@ -7441,7 +7441,7 @@
       .WillRepeatedly(Return(true));
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   // Advance 5ms, send a retransmittable packet to the peer.
@@ -7507,7 +7507,7 @@
   EXPECT_TRUE(connection_.connected());
 
   const char data[] = "data";
-  size_t data_size = SbStringGetLength(data);
+  size_t data_size = strlen(data);
   QuicStreamOffset offset = 0;
 
   // Send two packets.
@@ -7655,9 +7655,9 @@
   // The final check is to ensure that the random data in the response matches
   // the random data from the challenge.
   EXPECT_EQ(
-      0, SbMemoryCompare(&challenge_data,
-                         &(writer_->path_response_frames().front().data_buffer),
-                         sizeof(challenge_data)));
+      0, memcmp(&challenge_data,
+                &(writer_->path_response_frames().front().data_buffer),
+                sizeof(challenge_data)));
 }
 
 // Regression test for b/110259444
diff --git a/src/net/third_party/quic/core/quic_data_reader.cc b/src/net/third_party/quic/core/quic_data_reader.cc
index 6e2405c..f4bcc3b 100644
--- a/src/net/third_party/quic/core/quic_data_reader.cc
+++ b/src/net/third_party/quic/core/quic_data_reader.cc
@@ -169,7 +169,7 @@
   }
 
   // Read into result.
-  SbMemoryCopy(result, data_ + pos_, size);
+  memcpy(result, data_ + pos_, size);
 
   // Iterate.
   pos_ += size;
diff --git a/src/net/third_party/quic/core/quic_data_writer.cc b/src/net/third_party/quic/core/quic_data_writer.cc
index 5dd8931..c7dd505 100644
--- a/src/net/third_party/quic/core/quic_data_writer.cc
+++ b/src/net/third_party/quic/core/quic_data_writer.cc
@@ -144,7 +144,7 @@
     return false;
   }
 
-  SbMemoryCopy(dest, data, data_len);
+  memcpy(dest, data, data_len);
 
   length_ += data_len;
   return true;
@@ -156,7 +156,7 @@
     return false;
   }
 
-  SbMemorySet(dest, byte, count);
+  memset(dest, byte, count);
 
   length_ += count;
   return true;
@@ -167,7 +167,7 @@
   if (length_ > capacity_) {
     return;
   }
-  SbMemorySet(buffer_ + length_, 0x00, capacity_ - length_);
+  memset(buffer_ + length_, 0x00, capacity_ - length_);
   length_ = capacity_;
 }
 
diff --git a/src/net/third_party/quic/core/quic_data_writer_test.cc b/src/net/third_party/quic/core/quic_data_writer_test.cc
index 34d729f..6c703e4 100644
--- a/src/net/third_party/quic/core/quic_data_writer_test.cc
+++ b/src/net/third_party/quic/core/quic_data_writer_test.cc
@@ -620,7 +620,7 @@
 bool EncodeDecodeValue(uint64_t value_in, char* buffer, size_t size_of_buffer) {
   // Init the buffer to all 0, just for cleanliness. Makes for better
   // output if, in debugging, we need to dump out the buffer.
-  SbMemorySet(buffer, 0, size_of_buffer);
+  memset(buffer, 0, size_of_buffer);
   // make a writer. Note that for IETF encoding
   // we do not care about endianness... It's always big-endian,
   // but the c'tor expects to be told what endianness is in force...
@@ -669,7 +669,7 @@
 
   // Check that the layout of bytes in the buffer is correct. Bytes
   // are always encoded big endian...
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8)));
@@ -691,7 +691,7 @@
 
   // Check that the layout of bytes in the buffer is correct. Bytes
   // are always encoded big endian...
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   EXPECT_TRUE(writer.WriteVarInt62(0x3243f4e5));
@@ -709,7 +709,7 @@
 
   // Check that the layout of bytes in the buffer is correct. Bytes
   // are always encoded big endian...
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   EXPECT_TRUE(writer.WriteVarInt62(0x3647));
@@ -725,7 +725,7 @@
 
   // Check that the layout of bytes in the buffer
   // is correct. Bytes are always encoded big endian...
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   EXPECT_TRUE(writer.WriteVarInt62(0x3f));
@@ -831,7 +831,7 @@
 TEST_P(QuicDataWriterTest, MultiVarInt8) {
   uint64_t test_val;
   char buffer[8 * kMultiVarCount];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   // Put N values into the buffer. Adding i to the value ensures that
@@ -860,7 +860,7 @@
 TEST_P(QuicDataWriterTest, MultiVarInt4) {
   uint64_t test_val;
   char buffer[4 * kMultiVarCount];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   // Put N values into the buffer. Adding i to the value ensures that
@@ -889,7 +889,7 @@
 TEST_P(QuicDataWriterTest, MultiVarInt2) {
   uint64_t test_val;
   char buffer[2 * kMultiVarCount];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   // Put N values into the buffer. Adding i to the value ensures that
@@ -918,7 +918,7 @@
 TEST_P(QuicDataWriterTest, MultiVarInt1) {
   uint64_t test_val;
   char buffer[1 * kMultiVarCount];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
   // Put N values into the buffer. Adding i to the value ensures that
@@ -947,7 +947,7 @@
 // Test writing varints with a forced length.
 TEST_P(QuicDataWriterTest, VarIntFixedLength) {
   char buffer[90];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
                         Endianness::NETWORK_BYTE_ORDER);
 
@@ -1017,7 +1017,7 @@
 // Test encoding/decoding stream-id values.
 void EncodeDecodeStreamId(uint64_t value_in, bool expected_decode_result) {
   char buffer[1 * kMultiVarCount];
-  SbMemorySet(buffer, 0, sizeof(buffer));
+  memset(buffer, 0, sizeof(buffer));
 
   // Encode the given Stream ID.
   QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
diff --git a/src/net/third_party/quic/core/quic_framer.cc b/src/net/third_party/quic/core/quic_framer.cc
index 0187982..3e0cc9d 100644
--- a/src/net/third_party/quic/core/quic_framer.cc
+++ b/src/net/third_party/quic/core/quic_framer.cc
@@ -1750,7 +1750,7 @@
     QuicStringPiece remaining = encrypted_reader->PeekRemainingPayload();
     if (remaining.length() >= sizeof(header->possible_stateless_reset_token)) {
       header->has_possible_stateless_reset_token = true;
-      SbMemoryCopy(
+      memcpy(
           &header->possible_stateless_reset_token,
           &remaining.data()[remaining.length() -
                             sizeof(header->possible_stateless_reset_token)],
@@ -3917,7 +3917,7 @@
   // Copy in the header, because the encrypter only populates the encrypted
   // plaintext content.
   const size_t ad_len = associated_data.length();
-  SbMemoryMove(buffer, associated_data.data(), ad_len);
+  memmove(buffer, associated_data.data(), ad_len);
   // Encrypt the plaintext into the buffer.
   size_t output_length = 0;
   if (!encrypter_[level]->EncryptPacket(
diff --git a/src/net/third_party/quic/core/quic_framer_test.cc b/src/net/third_party/quic/core/quic_framer_test.cc
index ac9f432..cb44dad 100644
--- a/src/net/third_party/quic/core/quic_framer_test.cc
+++ b/src/net/third_party/quic/core/quic_framer_test.cc
@@ -94,7 +94,7 @@
     packet_number_ = QuicPacketNumber(packet_number);
     associated_data_ = QuicString(associated_data);
     plaintext_ = QuicString(plaintext);
-    SbMemoryCopy(output, plaintext.data(), plaintext.length());
+    memcpy(output, plaintext.data(), plaintext.length());
     *output_length = plaintext.length();
     return true;
   }
@@ -137,7 +137,7 @@
     packet_number_ = QuicPacketNumber(packet_number);
     associated_data_ = QuicString(associated_data);
     ciphertext_ = QuicString(ciphertext);
-    SbMemoryCopy(output, ciphertext.data(), ciphertext.length());
+    memcpy(output, ciphertext.data(), ciphertext.length());
     *output_length = ciphertext.length();
     return true;
   }
@@ -211,7 +211,7 @@
   void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
     size_t coalesced_data_length = packet.length();
     char* coalesced_data = new char[coalesced_data_length];
-    SbMemoryCopy(coalesced_data, packet.data(), coalesced_data_length);
+    memcpy(coalesced_data, packet.data(), coalesced_data_length);
     coalesced_packets_.push_back(QuicMakeUnique<QuicEncryptedPacket>(
         coalesced_data, coalesced_data_length,
         /*owns_buffer=*/true));
@@ -555,7 +555,7 @@
     char* buffer = new char[kMaxPacketSize + 1];
     size_t len = 0;
     for (const auto& fragment : fragments) {
-      SbMemoryCopy(buffer + len, fragment.fragment.data(),
+      memcpy(buffer + len, fragment.fragment.data(),
                    fragment.fragment.size());
       len += fragment.fragment.size();
     }
@@ -830,7 +830,7 @@
       !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
       VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
 
-  SbMemorySet(p + header_size, 0, kMaxPacketSize - header_size);
+  memset(p + header_size, 0, kMaxPacketSize - header_size);
 
   QuicEncryptedPacket encrypted(AsChars(p), p_size, false);
   EXPECT_QUIC_BUG(framer_.ProcessPacket(encrypted), "Packet too large:1");
@@ -5441,7 +5441,7 @@
       PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
       VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
-  SbMemorySet(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+  memset(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
@@ -5673,7 +5673,7 @@
       PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
       VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
-  SbMemorySet(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+  memset(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
@@ -5762,7 +5762,7 @@
       PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
       VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
-  SbMemorySet(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+  memset(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
@@ -5851,7 +5851,7 @@
       PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
       VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
-  SbMemorySet(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+  memset(p + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
@@ -11204,8 +11204,8 @@
 
   EXPECT_EQ(sizeof(expected_token_value), visitor_.new_token_.token.length());
   EXPECT_EQ(
-      0, SbMemoryCompare(expected_token_value, visitor_.new_token_.token.data(),
-                         sizeof(expected_token_value)));
+      0, memcmp(expected_token_value, visitor_.new_token_.token.data(),
+                sizeof(expected_token_value)));
 
   CheckFramingBoundaries(packet, QUIC_INVALID_NEW_TOKEN);
 }
diff --git a/src/net/third_party/quic/core/quic_ietf_framer_test.cc b/src/net/third_party/quic/core/quic_ietf_framer_test.cc
index d7d4285..0cd44af 100644
--- a/src/net/third_party/quic/core/quic_ietf_framer_test.cc
+++ b/src/net/third_party/quic/core/quic_ietf_framer_test.cc
@@ -390,9 +390,9 @@
                                                           &receive_frame));
 
     // Now check that the received frame matches the sent frame.
-    EXPECT_EQ(0, SbMemoryCompare(transmit_frame.data_buffer.data(),
-                                 receive_frame.data_buffer.data(),
-                                 kQuicPathFrameBufferSize));
+    EXPECT_EQ(0, memcmp(transmit_frame.data_buffer.data(),
+                        receive_frame.data_buffer.data(),
+                        kQuicPathFrameBufferSize));
     return true;
   }
 
@@ -423,9 +423,9 @@
                                                          &receive_frame));
 
     // Now check that the received frame matches the sent frame.
-    EXPECT_EQ(0, SbMemoryCompare(transmit_frame.data_buffer.data(),
-                                 receive_frame.data_buffer.data(),
-                                 kQuicPathFrameBufferSize));
+    EXPECT_EQ(0, memcmp(transmit_frame.data_buffer.data(),
+                        receive_frame.data_buffer.data(),
+                        kQuicPathFrameBufferSize));
     return true;
   }
 
@@ -473,7 +473,7 @@
     }
 
     char packet_buffer[kNormalPacketBufferSize];
-    SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+    memset(packet_buffer, 0, sizeof(packet_buffer));
 
     Perspective old_perspective = framer_.perspective();
     // Set up the writer and transmit QuicMaxStreamIdFrame
@@ -535,7 +535,7 @@
     }
 
     char packet_buffer[kNormalPacketBufferSize];
-    SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+    memset(packet_buffer, 0, sizeof(packet_buffer));
 
     Perspective old_perspective = framer_.perspective();
     // Set up the writer and transmit QuicMaxStreamIdFrame
@@ -732,7 +732,7 @@
       "can do a simple strcmp to see if the "
       "input and output are the same!";
 
-  size_t transmit_packet_data_len = SbStringGetLength(transmit_packet_data) + 1;
+  size_t transmit_packet_data_len = strlen(transmit_packet_data) + 1;
   for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
     SCOPED_TRACE(i);
     struct stream_frame_variant* variant = &stream_frame_to_test[i];
@@ -1086,7 +1086,7 @@
   };
   EXPECT_EQ(expected_size, sizeof(packet));
   EXPECT_EQ(sizeof(packet), writer.length());
-  EXPECT_EQ(0, SbMemoryCompare(packet, packet_buffer, writer.length()));
+  EXPECT_EQ(0, memcmp(packet, packet_buffer, writer.length()));
 
   // Now set up a reader to read in the frame.
   QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
@@ -1189,7 +1189,7 @@
                                      20,      50,       100,      200,     500,
                                      1000000, kOffset8, kOffset4, kOffset2};
   for (QuicStreamOffset window_size : window_sizes) {
-    SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+    memset(packet_buffer, 0, sizeof(packet_buffer));
 
     // Set up the writer and transmit QuicWindowUpdateFrame
     QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
@@ -1230,7 +1230,7 @@
 
   for (QuicIetfStreamId stream_id : stream_ids) {
     for (QuicStreamOffset window_size : window_sizes) {
-      SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+      memset(packet_buffer, 0, sizeof(packet_buffer));
 
       // Set up the writer and transmit QuicWindowUpdateFrame
       QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
@@ -1286,7 +1286,7 @@
                                 kOffset0};
 
   for (QuicStreamOffset offset : offsets) {
-    SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+    memset(packet_buffer, 0, sizeof(packet_buffer));
 
     // Set up the writer and transmit QuicBlockedFrame
     QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
@@ -1328,7 +1328,7 @@
 
   for (QuicIetfStreamId stream_id : stream_ids) {
     for (QuicStreamOffset offset : offsets) {
-      SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+      memset(packet_buffer, 0, sizeof(packet_buffer));
 
       // Set up the writer and transmit QuicWindowUpdateFrame
       QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
@@ -1395,10 +1395,10 @@
   unsigned char token_bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
                                  0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
                                  0x0c, 0x0d, 0x0e, 0x0f};
-  SbMemoryCopy(&transmit_frame.stateless_reset_token, token_bytes,
+  memcpy(&transmit_frame.stateless_reset_token, token_bytes,
                sizeof(transmit_frame.stateless_reset_token));
 
-  SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+  memset(packet_buffer, 0, sizeof(packet_buffer));
 
   // Set up the writer and transmit QuicStreamIdBlockedFrame
   QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
@@ -1423,7 +1423,7 @@
   };
 
   // clang-format on
-  EXPECT_EQ(0, SbMemoryCompare(packet_buffer, packet, sizeof(packet)));
+  EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
 
   // Set up reader and empty receive QuicPaddingFrame.
   QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
@@ -1446,7 +1446,7 @@
   QuicRetireConnectionIdFrame transmit_frame;
   transmit_frame.sequence_number = 0x01020304;
 
-  SbMemorySet(packet_buffer, 0, sizeof(packet_buffer));
+  memset(packet_buffer, 0, sizeof(packet_buffer));
 
   // Set up the writer and transmit QuicStreamIdBlockedFrame
   QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
@@ -1464,7 +1464,7 @@
   };
 
   // clang-format on
-  EXPECT_EQ(0, SbMemoryCompare(packet_buffer, packet, sizeof(packet)));
+  EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
 
   // Set up reader and empty receive QuicPaddingFrame.
   QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
diff --git a/src/net/third_party/quic/core/quic_packet_generator_test.cc b/src/net/third_party/quic/core/quic_packet_generator_test.cc
index add998a..98817b1 100644
--- a/src/net/third_party/quic/core/quic_packet_generator_test.cc
+++ b/src/net/third_party/quic/core/quic_packet_generator_test.cc
@@ -308,7 +308,7 @@
 
   void CreateData(size_t len) {
     data_array_.reset(new char[len]);
-    SbMemorySet(data_array_.get(), '?', len);
+    memset(data_array_.get(), '?', len);
     iov_.iov_base = data_array_.get();
     iov_.iov_len = len;
   }
diff --git a/src/net/third_party/quic/core/quic_packet_reader.cc b/src/net/third_party/quic/core/quic_packet_reader.cc
index 781e75d..d1f50c2 100644
--- a/src/net/third_party/quic/core/quic_packet_reader.cc
+++ b/src/net/third_party/quic/core/quic_packet_reader.cc
@@ -38,14 +38,14 @@
 void QuicPacketReader::Initialize() {
 #if MMSG_MORE
   // Zero initialize uninitialized memory.
-  SbMemorySet(mmsg_hdr_, 0, sizeof(mmsg_hdr_));
+  memset(mmsg_hdr_, 0, sizeof(mmsg_hdr_));
 
   for (int i = 0; i < kNumPacketsPerReadMmsgCall; ++i) {
     packets_[i].iov.iov_base = packets_[i].buf;
     packets_[i].iov.iov_len = sizeof(packets_[i].buf);
-    SbMemorySet(&packets_[i].raw_address, 0, sizeof(packets_[i].raw_address));
-    SbMemorySet(packets_[i].cbuf, 0, sizeof(packets_[i].cbuf));
-    SbMemorySet(packets_[i].buf, 0, sizeof(packets_[i].buf));
+    memset(&packets_[i].raw_address, 0, sizeof(packets_[i].raw_address));
+    memset(packets_[i].cbuf, 0, sizeof(packets_[i].cbuf));
+    memset(packets_[i].buf, 0, sizeof(packets_[i].buf));
 
     msghdr* hdr = &mmsg_hdr_[i].msg_hdr;
     hdr->msg_name = &packets_[i].raw_address;
diff --git a/src/net/third_party/quic/core/quic_packets.cc b/src/net/third_party/quic/core/quic_packets.cc
index f26ad2d..7e579f5 100644
--- a/src/net/third_party/quic/core/quic_packets.cc
+++ b/src/net/third_party/quic/core/quic_packets.cc
@@ -260,7 +260,7 @@
 
 std::unique_ptr<QuicEncryptedPacket> QuicEncryptedPacket::Clone() const {
   char* buffer = new char[this->length()];
-  SbMemoryCopy(buffer, this->data(), this->length());
+  memcpy(buffer, this->data(), this->length());
   return QuicMakeUnique<QuicEncryptedPacket>(buffer, this->length(), true);
 }
 
@@ -328,10 +328,10 @@
 
 std::unique_ptr<QuicReceivedPacket> QuicReceivedPacket::Clone() const {
   char* buffer = new char[this->length()];
-  SbMemoryCopy(buffer, this->data(), this->length());
+  memcpy(buffer, this->data(), this->length());
   if (this->packet_headers()) {
     char* headers_buffer = new char[this->headers_length()];
-    SbMemoryCopy(headers_buffer, this->packet_headers(),
+    memcpy(headers_buffer, this->packet_headers(),
                  this->headers_length());
     return QuicMakeUnique<QuicReceivedPacket>(
         buffer, this->length(), receipt_time(), true, ttl(), ttl() >= 0,
@@ -417,7 +417,7 @@
 
 char* CopyBuffer(const SerializedPacket& packet) {
   char* dst_buffer = new char[packet.encrypted_length];
-  SbMemoryCopy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length);
+  memcpy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length);
   return dst_buffer;
 }
 
diff --git a/src/net/third_party/quic/core/quic_socket_address_coder.cc b/src/net/third_party/quic/core/quic_socket_address_coder.cc
index 83f83bc..f513059 100644
--- a/src/net/third_party/quic/core/quic_socket_address_coder.cc
+++ b/src/net/third_party/quic/core/quic_socket_address_coder.cc
@@ -50,7 +50,7 @@
   if (length < sizeof(address_family)) {
     return false;
   }
-  SbMemoryCopy(&address_family, data, sizeof(address_family));
+  memcpy(&address_family, data, sizeof(address_family));
   data += sizeof(address_family);
   length -= sizeof(address_family);
 
@@ -69,7 +69,7 @@
     return false;
   }
   std::vector<uint8_t> ip(ip_length);
-  SbMemoryCopy(&ip[0], data, ip_length);
+  memcpy(&ip[0], data, ip_length);
   data += ip_length;
   length -= ip_length;
 
@@ -77,7 +77,7 @@
   if (length != sizeof(port)) {
     return false;
   }
-  SbMemoryCopy(&port, data, length);
+  memcpy(&port, data, length);
 
   QuicIpAddress ip_address;
   ip_address.FromPackedString(reinterpret_cast<const char*>(&ip[0]), ip_length);
diff --git a/src/net/third_party/quic/core/quic_stream_send_buffer_test.cc b/src/net/third_party/quic/core/quic_stream_send_buffer_test.cc
index 1bacada..16a1462 100644
--- a/src/net/third_party/quic/core/quic_stream_send_buffer_test.cc
+++ b/src/net/third_party/quic/core/quic_stream_send_buffer_test.cc
@@ -38,9 +38,9 @@
     iov[1] = MakeIovec(QuicStringPiece(data2));
 
     QuicMemSlice slice1(&allocator_, 1024);
-    SbMemorySet(const_cast<char*>(slice1.data()), 'c', 1024);
+    memset(const_cast<char*>(slice1.data()), 'c', 1024);
     QuicMemSlice slice2(&allocator_, 768);
-    SbMemorySet(const_cast<char*>(slice2.data()), 'd', 768);
+    memset(const_cast<char*>(slice2.data()), 'd', 768);
 
     // Index starts from not pointing to any slice.
     EXPECT_EQ(nullptr,
@@ -280,7 +280,7 @@
   EXPECT_EQ(nullptr,
             QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_));
   QuicMemSlice slice(&allocator_, 60);
-  SbMemorySet(const_cast<char*>(slice.data()), 'e', 60);
+  memset(const_cast<char*>(slice.data()), 'e', 60);
   send_buffer_.SaveMemSlice(std::move(slice));
   // With new data, index points to the new data.
   EXPECT_EQ(3840u,
diff --git a/src/net/third_party/quic/core/quic_stream_sequencer_buffer.cc b/src/net/third_party/quic/core/quic_stream_sequencer_buffer.cc
index 77a9564..21c3bab 100644
--- a/src/net/third_party/quic/core/quic_stream_sequencer_buffer.cc
+++ b/src/net/third_party/quic/core/quic_stream_sequencer_buffer.cc
@@ -225,7 +225,7 @@
           " total_bytes_read_ = ", total_bytes_read_);
       return false;
     }
-    SbMemoryCopy(dest, source, bytes_to_copy);
+    memcpy(dest, source, bytes_to_copy);
     source += bytes_to_copy;
     source_remaining -= bytes_to_copy;
     offset += bytes_to_copy;
@@ -263,7 +263,7 @@
             " total_bytes_read_ = ", total_bytes_read_);
         return QUIC_STREAM_SEQUENCER_INVALID_STATE;
       }
-      SbMemoryCopy(dest, blocks_[block_idx]->buffer + start_offset_in_block,
+      memcpy(dest, blocks_[block_idx]->buffer + start_offset_in_block,
                    bytes_to_copy);
       dest += bytes_to_copy;
       dest_remaining -= bytes_to_copy;
diff --git a/src/net/third_party/quic/core/quic_stream_sequencer_test.cc b/src/net/third_party/quic/core/quic_stream_sequencer_test.cc
index 1aa635e..17015d3 100644
--- a/src/net/third_party/quic/core/quic_stream_sequencer_test.cc
+++ b/src/net/third_party/quic/core/quic_stream_sequencer_test.cc
@@ -130,7 +130,7 @@
                       << expected.length();
       return false;
     }
-    if (SbMemoryCompare(IOVEC.iov_base, expected.data(), expected.length()) !=
+    if (memcmp(IOVEC.iov_base, expected.data(), expected.length()) !=
         0) {
       QUIC_LOG(ERROR) << "Invalid data: " << static_cast<char*>(IOVEC.iov_base)
                       << " vs " << expected;
@@ -144,7 +144,7 @@
     frame.stream_id = 1;
     frame.offset = byte_offset;
     frame.data_buffer = data;
-    frame.data_length = SbStringGetLength(data);
+    frame.data_length = strlen(data);
     frame.fin = true;
     sequencer_->OnStreamFrame(frame);
   }
@@ -154,7 +154,7 @@
     frame.stream_id = 1;
     frame.offset = byte_offset;
     frame.data_buffer = data;
-    frame.data_length = SbStringGetLength(data);
+    frame.data_length = strlen(data);
     frame.fin = false;
     sequencer_->OnStreamFrame(frame);
   }
diff --git a/src/net/third_party/quic/core/quic_tag_test.cc b/src/net/third_party/quic/core/quic_tag_test.cc
index 420b1c0..4e1ab89 100644
--- a/src/net/third_party/quic/core/quic_tag_test.cc
+++ b/src/net/third_party/quic/core/quic_tag_test.cc
@@ -27,7 +27,7 @@
 TEST_F(QuicTagTest, MakeQuicTag) {
   QuicTag tag = MakeQuicTag('A', 'B', 'C', 'D');
   char bytes[4];
-  SbMemoryCopy(bytes, &tag, 4);
+  memcpy(bytes, &tag, 4);
   EXPECT_EQ('A', bytes[0]);
   EXPECT_EQ('B', bytes[1]);
   EXPECT_EQ('C', bytes[2]);
diff --git a/src/net/third_party/quic/core/quic_utils.cc b/src/net/third_party/quic/core/quic_utils.cc
index 208a504..f57f2f4 100644
--- a/src/net/third_party/quic/core/quic_utils.cc
+++ b/src/net/third_party/quic/core/quic_utils.cc
@@ -132,8 +132,8 @@
   const uint64_t lo = QuicUint128Low64(v);
   const uint64_t hi = QuicUint128High64(v);
   // This assumes that the system is little-endian.
-  SbMemoryCopy(out, &lo, sizeof(lo));
-  SbMemoryCopy(out + sizeof(lo), &hi, sizeof(hi) / 2);
+  memcpy(out, &lo, sizeof(lo));
+  memcpy(out + sizeof(lo), &hi, sizeof(hi) / 2);
 }
 
 #define RETURN_STRING_LITERAL(x) \
@@ -278,7 +278,7 @@
 
   const char* src = static_cast<char*>(iov[iovnum].iov_base) + iov_offset;
   while (true) {
-    SbMemoryCopy(buffer, src, copy_len);
+    memcpy(buffer, src, copy_len);
     buffer_length -= copy_len;
     buffer += copy_len;
     if (buffer_length == 0 || ++iovnum >= iov_count) {
@@ -499,7 +499,7 @@
   uint64_t data_bytes[3] = {0, 0, 0};
   static_assert(sizeof(data_bytes) >= kQuicMaxConnectionIdLength,
                 "kQuicMaxConnectionIdLength changed");
-  SbMemoryCopy(data_bytes, connection_id.data(), connection_id.length());
+  memcpy(data_bytes, connection_id.data(), connection_id.length());
   // This is designed so that the common case of 64bit connection IDs
   // produces a stateless reset token that is equal to the connection ID
   // interpreted as a 64bit unsigned integer, to facilitate debugging.
diff --git a/src/net/third_party/quic/core/quic_write_blocked_list.cc b/src/net/third_party/quic/core/quic_write_blocked_list.cc
index a5239dd..691935a 100644
--- a/src/net/third_party/quic/core/quic_write_blocked_list.cc
+++ b/src/net/third_party/quic/core/quic_write_blocked_list.cc
@@ -11,8 +11,8 @@
 namespace quic {
 
 QuicWriteBlockedList::QuicWriteBlockedList() : last_priority_popped_(0) {
-  SbMemorySet(batch_write_stream_id_, 0, sizeof(batch_write_stream_id_));
-  SbMemorySet(bytes_left_for_batch_write_, 0,
+  memset(batch_write_stream_id_, 0, sizeof(batch_write_stream_id_));
+  memset(bytes_left_for_batch_write_, 0,
               sizeof(bytes_left_for_batch_write_));
 }
 
diff --git a/src/net/third_party/quic/core/stateless_rejector_test.cc b/src/net/third_party/quic/core/stateless_rejector_test.cc
index c353d04..880ecd4 100644
--- a/src/net/third_party/quic/core/stateless_rejector_test.cc
+++ b/src/net/third_party/quic/core/stateless_rejector_test.cc
@@ -118,7 +118,7 @@
 
     // Generate a public value.
     char public_value[32];
-    SbMemorySet(public_value, 42, sizeof(public_value));
+    memset(public_value, 42, sizeof(public_value));
     pubs_hex_ =
         "#" + QuicTextUtils::HexEncode(public_value, sizeof(public_value));
 
diff --git a/src/net/third_party/quic/core/tls_handshaker.cc b/src/net/third_party/quic/core/tls_handshaker.cc
index f492ffb..eeaef17 100644
--- a/src/net/third_party/quic/core/tls_handshaker.cc
+++ b/src/net/third_party/quic/core/tls_handshaker.cc
@@ -181,8 +181,8 @@
   // TODO(nharper): replace these vectors and memcpys with spans (which
   // unfortunately doesn't yet exist in quic/platform/api).
   std::vector<uint8_t> read_secret(secret_len), write_secret(secret_len);
-  SbMemoryCopy(read_secret.data(), read_key, secret_len);
-  SbMemoryCopy(write_secret.data(), write_key, secret_len);
+  memcpy(read_secret.data(), read_key, secret_len);
+  memcpy(write_secret.data(), write_key, secret_len);
   HandshakerFromSsl(ssl)->SetEncryptionSecret(QuicEncryptionLevel(level),
                                               read_secret, write_secret);
   return 1;
diff --git a/src/net/third_party/quic/core/tls_server_handshaker.cc b/src/net/third_party/quic/core/tls_server_handshaker.cc
index 6235a0b..b035b83 100644
--- a/src/net/third_party/quic/core/tls_server_handshaker.cc
+++ b/src/net/third_party/quic/core/tls_server_handshaker.cc
@@ -314,7 +314,7 @@
     return ssl_private_key_failure;
   }
   *out_len = cert_verify_sig_.size();
-  SbMemoryCopy(out, cert_verify_sig_.data(), *out_len);
+  memcpy(out, cert_verify_sig_.data(), *out_len);
   cert_verify_sig_.clear();
   cert_verify_sig_.shrink_to_fit();
   return ssl_private_key_success;
diff --git a/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer.cc b/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer.cc
index 35408f2..fee4545 100644
--- a/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer.cc
+++ b/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer.cc
@@ -11,7 +11,7 @@
 namespace quic {
 
 QuicBatchWriterBuffer::QuicBatchWriterBuffer() {
-  SbMemorySet(buffer_, 0, sizeof(buffer_));
+  memset(buffer_, 0, sizeof(buffer_));
 }
 
 QuicString QuicBatchWriterBuffer::DebugString() const {
@@ -68,9 +68,9 @@
 
   if (buffer != next_write_location) {
     if (IsExternalBuffer(buffer, buf_len)) {
-      SbMemoryCopy(next_write_location, buffer, buf_len);
+      memcpy(next_write_location, buffer, buf_len);
     } else if (IsInternalBuffer(buffer, buf_len)) {
-      SbMemoryMove(next_write_location, buffer, buf_len);
+      memmove(next_write_location, buffer, buf_len);
     } else {
       QUIC_BUG << "Buffer[" << static_cast<const void*>(buffer) << ", "
                << static_cast<const void*>(buffer + buf_len)
@@ -119,7 +119,7 @@
     size_t buffer_len_to_move = buffered_writes_.rbegin()->buffer +
                                 buffered_writes_.rbegin()->buf_len -
                                 buffer_before_move;
-    SbMemoryMove(buffer_, buffer_before_move, buffer_len_to_move);
+    memmove(buffer_, buffer_before_move, buffer_len_to_move);
 
     size_t distance_to_move = buffer_before_move - buffer_;
     for (BufferedWrite& buffered_write : buffered_writes_) {
diff --git a/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer_test.cc b/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer_test.cc
index bb0fcb0..9cca237 100644
--- a/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer_test.cc
+++ b/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer_test.cc
@@ -44,7 +44,7 @@
 
   // Fill |packet_buffer| with |buf_len| bytes of |c|s.
   char* FillPacketBuffer(char c, char* packet_buffer, size_t buf_len) {
-    SbMemorySet(packet_buffer, c, buf_len);
+    memset(packet_buffer, c, buf_len);
     return packet_buffer;
   }
 
diff --git a/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_test.h b/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_test.h
index a0937f9..38149da 100644
--- a/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_test.h
+++ b/src/net/third_party/quic/platform/impl/batch_writer/quic_batch_writer_test.h
@@ -193,7 +193,7 @@
     for (int bytes_sent = 0; bytes_sent < data_size_;
          bytes_sent += this_packet_size, ++this_packet_content) {
       this_packet_size = std::min(packet_size_, data_size_ - bytes_sent);
-      SbMemorySet(&packet_buffer_[0], this_packet_content, this_packet_size);
+      memset(&packet_buffer_[0], this_packet_content, this_packet_size);
 
       result = GetWriter()->WritePacket(&packet_buffer_[0], this_packet_size,
                                         self_address_.host(), peer_address_,
diff --git a/src/net/third_party/quic/platform/impl/quic_flags_impl.cc b/src/net/third_party/quic/platform/impl/quic_flags_impl.cc
index 38292f8..197dab9 100644
--- a/src/net/third_party/quic/platform/impl/quic_flags_impl.cc
+++ b/src/net/third_party/quic/platform/impl/quic_flags_impl.cc
@@ -89,7 +89,7 @@
   static const char kDashes[] = "--";
 
   base::StrAppend(out, {kDashes, name});
-  int col = SbStringGetLength(kDashes) + name.length();
+  int col = strlen(kDashes) + name.length();
   if (col + kMinPadding < kEndCol) {
     // Start help text on same line
     int pad_len = std::max(kMinPadding, kStartCol - col);
diff --git a/src/net/third_party/quic/platform/impl/quic_linux_socket_utils.h b/src/net/third_party/quic/platform/impl/quic_linux_socket_utils.h
index 70fab34..8f75acf 100644
--- a/src/net/third_party/quic/platform/impl/quic_linux_socket_utils.h
+++ b/src/net/third_party/quic/platform/impl/quic_linux_socket_utils.h
@@ -103,7 +103,7 @@
     }
 
     storage_.reset(new char[StorageSize()]);
-    SbMemorySet(&storage_[0], 0, StorageSize());
+    memset(&storage_[0], 0, StorageSize());
 
     int i = -1;
     for (auto it = first; it != last; ++it) {
diff --git a/src/net/third_party/quic/platform/impl/quic_linux_socket_utils_test.cc b/src/net/third_party/quic/platform/impl/quic_linux_socket_utils_test.cc
index d7a612a..f2f332f 100644
--- a/src/net/third_party/quic/platform/impl/quic_linux_socket_utils_test.cc
+++ b/src/net/third_party/quic/platform/impl/quic_linux_socket_utils_test.cc
@@ -54,7 +54,7 @@
       hdr->msg_namelen);
   sockaddr_storage peer_generic_addr = peer_addr.generic_address();
   EXPECT_EQ(
-      0, SbMemoryCompare(hdr->msg_name, &peer_generic_addr, hdr->msg_namelen));
+      0, memcmp(hdr->msg_name, &peer_generic_addr, hdr->msg_namelen));
   EXPECT_EQ(1u, hdr->msg_iovlen);
   EXPECT_EQ(buffer, hdr->msg_iov->iov_base);
   EXPECT_EQ(buf_len, hdr->msg_iov->iov_len);
@@ -82,12 +82,12 @@
   const QuicString& self_addr_str = self_addr.ToPackedString();
   if (is_ipv4) {
     in_pktinfo* pktinfo = reinterpret_cast<in_pktinfo*>(CMSG_DATA(cmsg));
-    EXPECT_EQ(0, SbMemoryCompare(&pktinfo->ipi_spec_dst, self_addr_str.c_str(),
-                                 self_addr_str.length()));
+    EXPECT_EQ(0, memcmp(&pktinfo->ipi_spec_dst, self_addr_str.c_str(),
+                        self_addr_str.length()));
   } else {
     in6_pktinfo* pktinfo = reinterpret_cast<in6_pktinfo*>(CMSG_DATA(cmsg));
-    EXPECT_EQ(0, SbMemoryCompare(&pktinfo->ipi6_addr, self_addr_str.c_str(),
-                                 self_addr_str.length()));
+    EXPECT_EQ(0, memcmp(&pktinfo->ipi6_addr, self_addr_str.c_str(),
+                        self_addr_str.length()));
   }
 
   cmsg = CMSG_NXTHDR(hdr, cmsg);
@@ -229,8 +229,8 @@
             EXPECT_EQ(buffered_write.buf_len, hdr.msg_iov->iov_len);
             sockaddr_storage expected_peer_address =
                 buffered_write.peer_address.generic_address();
-            EXPECT_EQ(0, SbMemoryCompare(&expected_peer_address, hdr.msg_name,
-                                         sizeof(sockaddr_storage)));
+            EXPECT_EQ(0, memcmp(&expected_peer_address, hdr.msg_name,
+                                sizeof(sockaddr_storage)));
             EXPECT_EQ(buffered_write.self_address.IsInitialized(),
                       hdr.msg_control != nullptr);
           }
diff --git a/src/net/third_party/quic/platform/impl/quic_socket_utils.cc b/src/net/third_party/quic/platform/impl/quic_socket_utils.cc
index 3d8c172..e81f6b9 100644
--- a/src/net/third_party/quic/platform/impl/quic_socket_utils.cc
+++ b/src/net/third_party/quic/platform/impl/quic_socket_utils.cc
@@ -81,7 +81,7 @@
 
   if (cmsg_ == nullptr) {
     DCHECK_EQ(nullptr, hdr_.msg_control);
-    SbMemorySet(cbuf_, 0, cbuf_size_);
+    memset(cbuf_, 0, cbuf_size_);
     hdr_.msg_control = cbuf_;
     cmsg_ = CMSG_FIRSTHDR(&hdr_);
   } else {
@@ -272,10 +272,10 @@
     cmsg->cmsg_level = IPPROTO_IP;
     cmsg->cmsg_type = IP_PKTINFO;
     in_pktinfo* pktinfo = reinterpret_cast<in_pktinfo*>(CMSG_DATA(cmsg));
-    SbMemorySet(pktinfo, 0, sizeof(in_pktinfo));
+    memset(pktinfo, 0, sizeof(in_pktinfo));
     pktinfo->ipi_ifindex = 0;
     address_string = self_address.ToPackedString();
-    SbMemoryCopy(&pktinfo->ipi_spec_dst, address_string.c_str(),
+    memcpy(&pktinfo->ipi_spec_dst, address_string.c_str(),
                  address_string.length());
     return sizeof(in_pktinfo);
   } else if (self_address.IsIPv6()) {
@@ -283,9 +283,9 @@
     cmsg->cmsg_level = IPPROTO_IPV6;
     cmsg->cmsg_type = IPV6_PKTINFO;
     in6_pktinfo* pktinfo = reinterpret_cast<in6_pktinfo*>(CMSG_DATA(cmsg));
-    SbMemorySet(pktinfo, 0, sizeof(in6_pktinfo));
+    memset(pktinfo, 0, sizeof(in6_pktinfo));
     address_string = self_address.ToPackedString();
-    SbMemoryCopy(&pktinfo->ipi6_addr, address_string.c_str(),
+    memcpy(&pktinfo->ipi6_addr, address_string.c_str(),
                  address_string.length());
     return sizeof(in6_pktinfo);
   } else {
@@ -365,11 +365,11 @@
   if (self_address.IsIPv4()) {
     in_pktinfo* pktinfo = static_cast<in_pktinfo*>(cmsg_data);
     pktinfo->ipi_ifindex = 0;
-    SbMemoryCopy(&pktinfo->ipi_spec_dst, address_str.c_str(),
+    memcpy(&pktinfo->ipi_spec_dst, address_str.c_str(),
                  address_str.length());
   } else if (self_address.IsIPv6()) {
     in6_pktinfo* pktinfo = static_cast<in6_pktinfo*>(cmsg_data);
-    SbMemoryCopy(&pktinfo->ipi6_addr, address_str.c_str(),
+    memcpy(&pktinfo->ipi6_addr, address_str.c_str(),
                  address_str.length());
   } else {
     QUIC_BUG << "Unrecognized IPAddress";
diff --git a/src/net/third_party/quic/quartc/quartc_session_test.cc b/src/net/third_party/quic/quartc/quartc_session_test.cc
index ae1625c..1a44a93 100644
--- a/src/net/third_party/quic/quartc/quartc_session_test.cc
+++ b/src/net/third_party/quic/quartc/quartc_session_test.cc
@@ -134,7 +134,7 @@
     // Send a test message from peer 1 to peer 2.
     char kTestMessage[] = "Hello";
     test::QuicTestMemSliceVector data(
-        {std::make_pair(kTestMessage, SbStringGetLength(kTestMessage))});
+        {std::make_pair(kTestMessage, strlen(kTestMessage))});
     outgoing_stream->WriteMemSlices(data.span(), /*fin=*/false);
     RunTasks();
 
@@ -150,7 +150,7 @@
     // Send a test message from peer 2 to peer 1.
     char kTestResponse[] = "Response";
     test::QuicTestMemSliceVector response(
-        {std::make_pair(kTestResponse, SbStringGetLength(kTestResponse))});
+        {std::make_pair(kTestResponse, strlen(kTestResponse))});
     incoming->WriteMemSlices(response.span(), /*fin=*/false);
     RunTasks();
     // Wait for peer 1 to receive messages.
@@ -379,7 +379,7 @@
 
   char kClientMessage[] = "Hello";
   test::QuicTestMemSliceVector stream_data(
-      {std::make_pair(kClientMessage, SbStringGetLength(kClientMessage))});
+      {std::make_pair(kClientMessage, strlen(kClientMessage))});
   stream->WriteMemSlices(stream_data.span(), /*fin=*/false);
   RunTasks();
 
@@ -416,7 +416,7 @@
 
   char kClientMessage[] = "Hello";
   test::QuicTestMemSliceVector stream_data(
-      {std::make_pair(kClientMessage, SbStringGetLength(kClientMessage))});
+      {std::make_pair(kClientMessage, strlen(kClientMessage))});
   stream->WriteMemSlices(stream_data.span(), /*fin=*/false);
   RunTasks();
 
@@ -454,7 +454,7 @@
 
   char kMessage[] = "Hello";
   test::QuicTestMemSliceVector stream_data(
-      {std::make_pair(kMessage, SbStringGetLength(kMessage))});
+      {std::make_pair(kMessage, strlen(kMessage))});
   stream->WriteMemSlices(stream_data.span(), /*fin=*/false);
   simulator_.RunFor(QuicTime::Delta::FromMilliseconds(1));
 
@@ -464,7 +464,7 @@
 
   char kMessage1[] = "Second message";
   test::QuicTestMemSliceVector stream_data_1(
-      {std::make_pair(kMessage1, SbStringGetLength(kMessage1))});
+      {std::make_pair(kMessage1, strlen(kMessage1))});
   stream_1->WriteMemSlices(stream_data_1.span(), /*fin=*/false);
   RunTasks();
 
@@ -542,7 +542,7 @@
 
   char message[] = "Hello in 0RTTs!";
   test::QuicTestMemSliceVector data(
-      {std::make_pair(message, SbStringGetLength(message))});
+      {std::make_pair(message, strlen(message))});
   stream->WriteMemSlices(data.span(), /*fin=*/false);
 
   // This will now run the rest of the connection. But the
diff --git a/src/net/third_party/quic/test_tools/crypto_test_utils.cc b/src/net/third_party/quic/test_tools/crypto_test_utils.cc
index d870c57..bd1c51c 100644
--- a/src/net/third_party/quic/test_tools/crypto_test_utils.cc
+++ b/src/net/third_party/quic/test_tools/crypto_test_utils.cc
@@ -58,10 +58,10 @@
   }
 
   EVP_DigestUpdate(md_ctx.get(), ChannelIDVerifier::kContextStr,
-                   SbStringGetLength(ChannelIDVerifier::kContextStr) + 1);
+                   strlen(ChannelIDVerifier::kContextStr) + 1);
   EVP_DigestUpdate(
       md_ctx.get(), ChannelIDVerifier::kClientToServerStr,
-      SbStringGetLength(ChannelIDVerifier::kClientToServerStr) + 1);
+      strlen(ChannelIDVerifier::kClientToServerStr) + 1);
   EVP_DigestUpdate(md_ctx.get(), signed_data.data(), signed_data.size());
 
   size_t sig_len;
@@ -667,7 +667,7 @@
     bool client_has_set = false;
     for (size_t i = 0; i < common_set_hashes.size(); i += sizeof(uint64_t)) {
       uint64_t hash;
-      SbMemoryCopy(&hash, common_set_hashes.data() + i, sizeof(hash));
+      memcpy(&hash, common_set_hashes.data() + i, sizeof(hash));
       if (hash == hash_) {
         client_has_set = true;
         break;
@@ -847,7 +847,7 @@
 }
 
 QuicTag ParseTag(const char* tagstr) {
-  const size_t len = SbStringGetLength(tagstr);
+  const size_t len = strlen(tagstr);
   CHECK_NE(0u, len);
 
   QuicTag tag = 0;
@@ -1023,7 +1023,7 @@
 
 QuicString GenerateClientPublicValuesHex() {
   char public_value[32];
-  SbMemorySet(public_value, 42, sizeof(public_value));
+  memset(public_value, 42, sizeof(public_value));
   return ("#" + QuicTextUtils::HexEncode(public_value, sizeof(public_value)));
 }
 
diff --git a/src/net/third_party/quic/test_tools/crypto_test_utils_test.cc b/src/net/third_party/quic/test_tools/crypto_test_utils_test.cc
index 03caf59..09899cc 100644
--- a/src/net/third_party/quic/test_tools/crypto_test_utils_test.cc
+++ b/src/net/third_party/quic/test_tools/crypto_test_utils_test.cc
@@ -142,7 +142,7 @@
   QuicString nonce_hex = "#" + QuicTextUtils::HexEncode(nonce);
 
   char public_value[32];
-  SbMemorySet(public_value, 42, sizeof(public_value));
+  memset(public_value, 42, sizeof(public_value));
   QuicString pub_hex =
       "#" + QuicTextUtils::HexEncode(public_value, sizeof(public_value));
 
diff --git a/src/net/third_party/quic/test_tools/mock_random.cc b/src/net/third_party/quic/test_tools/mock_random.cc
index d1521cf..b2597dd 100644
--- a/src/net/third_party/quic/test_tools/mock_random.cc
+++ b/src/net/third_party/quic/test_tools/mock_random.cc
@@ -17,7 +17,7 @@
 MockRandom::MockRandom(uint32_t base) : base_(base), increment_(0) {}
 
 void MockRandom::RandBytes(void* data, size_t len) {
-  SbMemorySet(data, increment_ + static_cast<uint8_t>('r'), len);
+  memset(data, increment_ + static_cast<uint8_t>('r'), len);
 }
 
 uint64_t MockRandom::RandUint64() {
diff --git a/src/net/third_party/quic/test_tools/quic_test_utils.cc b/src/net/third_party/quic/test_tools/quic_test_utils.cc
index 0d427a4..a2a50af 100644
--- a/src/net/third_party/quic/test_tools/quic_test_utils.cc
+++ b/src/net/third_party/quic/test_tools/quic_test_utils.cc
@@ -51,7 +51,7 @@
 uint64_t TestConnectionIdToUInt64(QuicConnectionId connection_id) {
   DCHECK_EQ(connection_id.length(), kQuicDefaultConnectionIdLength);
   uint64_t connection_id64_net = 0;
-  SbMemoryCopy(&connection_id64_net, connection_id.data(),
+  memcpy(&connection_id64_net, connection_id.data(),
                std::min<size_t>(static_cast<size_t>(connection_id.length()),
                                 sizeof(connection_id64_net)));
   return QuicEndian::NetToHost64(connection_id64_net);
@@ -143,7 +143,7 @@
   QuicString hash =
       Sha1Hash(QuicStringPiece(reinterpret_cast<char*>(&seed_), sizeof(seed_)));
   DCHECK_EQ(static_cast<size_t>(SHA_DIGEST_LENGTH), hash.length());
-  SbMemoryCopy(&seed_, hash.data(), sizeof(seed_));
+  memcpy(&seed_, hash.data(), sizeof(seed_));
   return seed_;
 }
 
@@ -889,7 +889,7 @@
     const QuicEncryptedPacket& encrypted_packet,
     QuicTime receipt_time) {
   char* buffer = new char[encrypted_packet.length()];
-  SbMemoryCopy(buffer, encrypted_packet.data(), encrypted_packet.length());
+  memcpy(buffer, encrypted_packet.data(), encrypted_packet.length());
   return new QuicReceivedPacket(buffer, encrypted_packet.length(), receipt_time,
                                 true);
 }
diff --git a/src/net/third_party/quic/tools/quic_client_bin.cc b/src/net/third_party/quic/tools/quic_client_bin.cc
index da3375b..ec3b074 100644
--- a/src/net/third_party/quic/tools/quic_client_bin.cc
+++ b/src/net/third_party/quic/tools/quic_client_bin.cc
@@ -101,7 +101,7 @@
 
 QuicSocketAddress LookupAddress(QuicString host, QuicString port) {
   addrinfo hint;
-  SbMemorySet(&hint, 0, sizeof(hint));
+  memset(&hint, 0, sizeof(hint));
   hint.ai_protocol = IPPROTO_UDP;
 
   addrinfo* info_list = nullptr;
diff --git a/src/net/third_party/quic/tools/quic_server_test.cc b/src/net/third_party/quic/tools/quic_server_test.cc
index 5540587..084cabe 100644
--- a/src/net/third_party/quic/tools/quic_server_test.cc
+++ b/src/net/third_party/quic/tools/quic_server_test.cc
@@ -135,7 +135,7 @@
   ASSERT_LT(0, fd);
 
   char buf[1024];
-  SbMemorySet(buf, 0, QUIC_ARRAYSIZE(buf));
+  memset(buf, 0, QUIC_ARRAYSIZE(buf));
   sockaddr_storage storage = server_address_.generic_address();
   int rc = sendto(fd, buf, QUIC_ARRAYSIZE(buf), 0,
                   reinterpret_cast<sockaddr*>(&storage), sizeof(storage));
diff --git a/src/net/third_party/quic/tools/quic_simple_server_stream.cc b/src/net/third_party/quic/tools/quic_simple_server_stream.cc
index b5ccaca..8976498 100644
--- a/src/net/third_party/quic/tools/quic_simple_server_stream.cc
+++ b/src/net/third_party/quic/tools/quic_simple_server_stream.cc
@@ -261,7 +261,7 @@
   SpdyHeaderBlock headers;
   headers[":status"] = "404";
   headers["content-length"] =
-      QuicTextUtils::Uint64ToString(SbStringGetLength(kNotFoundResponseBody));
+      QuicTextUtils::Uint64ToString(strlen(kNotFoundResponseBody));
   SendHeadersAndBody(std::move(headers), kNotFoundResponseBody);
 }
 
@@ -278,7 +278,7 @@
     headers[":status"] = QuicTextUtils::Uint64ToString(resp_code);
   }
   headers["content-length"] =
-      QuicTextUtils::Uint64ToString(SbStringGetLength(kErrorResponseBody));
+      QuicTextUtils::Uint64ToString(strlen(kErrorResponseBody));
   SendHeadersAndBody(std::move(headers), kErrorResponseBody);
 }
 
diff --git a/src/net/third_party/quic/tools/quic_simple_server_stream_test.cc b/src/net/third_party/quic/tools/quic_simple_server_stream_test.cc
index 73665f9..16ee224 100644
--- a/src/net/third_party/quic/tools/quic_simple_server_stream_test.cc
+++ b/src/net/third_party/quic/tools/quic_simple_server_stream_test.cc
@@ -40,7 +40,7 @@
 
 const size_t kFakeFrameLen = 60;
 const size_t kErrorLength =
-    SbStringGetLength(QuicSimpleServerStream::kErrorResponseBody);
+    strlen(QuicSimpleServerStream::kErrorResponseBody);
 const size_t kDataFrameHeaderLength = 2;
 
 class TestStream : public QuicSimpleServerStream {
diff --git a/src/net/third_party/quiche/src/http2/decoder/decode_buffer_test.cc b/src/net/third_party/quiche/src/http2/decoder/decode_buffer_test.cc
index 2990349..8943ed3 100644
--- a/src/net/third_party/quiche/src/http2/decoder/decode_buffer_test.cc
+++ b/src/net/third_party/quiche/src/http2/decoder/decode_buffer_test.cc
@@ -52,7 +52,7 @@
 
 TEST_F(DecodeBufferTest, DecodesFixedInts) {
   const char data[] = "\x01\x12\x23\x34\x45\x56\x67\x78\x89\x9a";
-  DecodeBuffer b1(data, SbStringGetLength(data));
+  DecodeBuffer b1(data, strlen(data));
   EXPECT_EQ(1, b1.DecodeUInt8());
   EXPECT_EQ(0x1223u, b1.DecodeUInt16());
   EXPECT_EQ(0x344556u, b1.DecodeUInt24());
diff --git a/src/net/third_party/quiche/src/http2/decoder/decode_http2_structures.cc b/src/net/third_party/quiche/src/http2/decoder/decode_http2_structures.cc
index 6cbb1ea..67ba820 100644
--- a/src/net/third_party/quiche/src/http2/decoder/decode_http2_structures.cc
+++ b/src/net/third_party/quiche/src/http2/decoder/decode_http2_structures.cc
@@ -78,7 +78,7 @@
   DCHECK_NE(nullptr, out);
   DCHECK_NE(nullptr, b);
   DCHECK_LE(Http2PingFields::EncodedSize(), b->Remaining());
-  SbMemoryCopy(out->opaque_bytes, b->cursor(), Http2PingFields::EncodedSize());
+  memcpy(out->opaque_bytes, b->cursor(), Http2PingFields::EncodedSize());
   b->AdvanceCursor(Http2PingFields::EncodedSize());
 }
 
diff --git a/src/net/third_party/quiche/src/http2/decoder/http2_structure_decoder.cc b/src/net/third_party/quiche/src/http2/decoder/http2_structure_decoder.cc
index def91fd..59e3791 100644
--- a/src/net/third_party/quiche/src/http2/decoder/http2_structure_decoder.cc
+++ b/src/net/third_party/quiche/src/http2/decoder/http2_structure_decoder.cc
@@ -26,7 +26,7 @@
     return 0;
   }
   const uint32_t num_to_copy = db->MinLengthRemaining(target_size);
-  SbMemoryCopy(buffer_, db->cursor(), num_to_copy);
+  memcpy(buffer_, db->cursor(), num_to_copy);
   offset_ = num_to_copy;
   db->AdvanceCursor(num_to_copy);
   return num_to_copy;
@@ -60,7 +60,7 @@
   const uint32_t needed = target_size - offset_;
   const uint32_t num_to_copy = db->MinLengthRemaining(needed);
   DVLOG(2) << "ResumeFillingBuffer num_to_copy=" << num_to_copy;
-  SbMemoryCopy(&buffer_[offset_], db->cursor(), num_to_copy);
+  memcpy(&buffer_[offset_], db->cursor(), num_to_copy);
   db->AdvanceCursor(num_to_copy);
   offset_ += num_to_copy;
   return needed == num_to_copy;
@@ -82,7 +82,7 @@
   const uint32_t num_to_copy =
       db->MinLengthRemaining(std::min(needed, *remaining_payload));
   DVLOG(2) << "ResumeFillingBuffer num_to_copy=" << num_to_copy;
-  SbMemoryCopy(&buffer_[offset_], db->cursor(), num_to_copy);
+  memcpy(&buffer_[offset_], db->cursor(), num_to_copy);
   db->AdvanceCursor(num_to_copy);
   offset_ += num_to_copy;
   *remaining_payload -= num_to_copy;
diff --git a/src/net/third_party/quiche/src/http2/test_tools/http2_random.cc b/src/net/third_party/quiche/src/http2/test_tools/http2_random.cc
index 2583760..9728837 100644
--- a/src/net/third_party/quiche/src/http2/test_tools/http2_random.cc
+++ b/src/net/third_party/quiche/src/http2/test_tools/http2_random.cc
@@ -20,7 +20,7 @@
 Http2Random::Http2Random(Http2StringPiece key) {
   Http2String decoded_key = Http2HexDecode(key);
   CHECK_EQ(sizeof(key_), decoded_key.size());
-  SbMemoryCopy(key_, decoded_key.data(), sizeof(key_));
+  memcpy(key_, decoded_key.data(), sizeof(key_));
 }
 
 Http2String Http2Random::Key() const {
@@ -28,7 +28,7 @@
 }
 
 void Http2Random::FillRandom(void* buffer, size_t buffer_size) {
-  SbMemorySet(buffer, 0, buffer_size);
+  memset(buffer, 0, buffer_size);
   uint8_t* buffer_u8 = reinterpret_cast<uint8_t*>(buffer);
   CRYPTO_chacha_20(buffer_u8, buffer_u8, buffer_size, key_, kZeroNonce,
                    counter_++);
diff --git a/src/net/third_party/quiche/src/spdy/core/array_output_buffer_test.cc b/src/net/third_party/quiche/src/spdy/core/array_output_buffer_test.cc
index 041ce19..2d4234a 100644
--- a/src/net/third_party/quiche/src/spdy/core/array_output_buffer_test.cc
+++ b/src/net/third_party/quiche/src/spdy/core/array_output_buffer_test.cc
@@ -8,6 +8,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "starboard/memory.h"
 
+#include <cstring>
+
 namespace spdy {
 namespace test {
 
@@ -33,7 +35,7 @@
   ASSERT_GT(size, 1);
   ASSERT_NE(nullptr, dst);
   const int64_t written = size / 2;
-  SbMemorySet(dst, 'x', written);
+  memset(dst, 'x', written);
   buffer.AdvanceWritePtr(written);
 
   // The buffer should be partially used.
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder.cc b/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder.cc
index fffa949..6df9954 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder.cc
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder.cc
@@ -136,7 +136,7 @@
 
   if (output_ == nullptr) {
     char* dest = GetWritableBuffer(data_len);
-    SbMemoryCopy(dest, data, data_len);
+    memcpy(dest, data, data_len);
     Seek(data_len);
   } else {
     char* dest = nullptr;
@@ -151,7 +151,7 @@
       }
       uint32_t to_copy = std::min<uint32_t>(data_len, size);
       const char* src = data_ptr + total_written;
-      SbMemoryCopy(dest, src, to_copy);
+      memcpy(dest, src, to_copy);
       Seek(to_copy);
       data_len -= to_copy;
       total_written += to_copy;
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder_test.cc b/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder_test.cc
index 6ad63c7..2e9c2c9 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder_test.cc
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_frame_builder_test.cc
@@ -27,11 +27,11 @@
   const size_t kBuilderSize = 10;
   SpdyFrameBuilder builder(kBuilderSize);
   char* writable_buffer = builder.GetWritableBuffer(kBuilderSize);
-  SbMemorySet(writable_buffer, ~1, kBuilderSize);
+  memset(writable_buffer, ~1, kBuilderSize);
   EXPECT_TRUE(builder.Seek(kBuilderSize));
   SpdySerializedFrame frame(builder.take());
   char expected[kBuilderSize];
-  SbMemorySet(expected, ~1, kBuilderSize);
+  memset(expected, ~1, kBuilderSize);
   EXPECT_EQ(SpdyStringPiece(expected, kBuilderSize),
             SpdyStringPiece(frame.data(), kBuilderSize));
 }
@@ -44,11 +44,11 @@
   SpdyFrameBuilder builder(kBuilderSize, &output);
   size_t actual_size = 0;
   char* writable_buffer = builder.GetWritableOutput(kBuilderSize, &actual_size);
-  SbMemorySet(writable_buffer, ~1, kBuilderSize);
+  memset(writable_buffer, ~1, kBuilderSize);
   EXPECT_TRUE(builder.Seek(kBuilderSize));
   SpdySerializedFrame frame(output.Begin(), kBuilderSize, false);
   char expected[kBuilderSize];
-  SbMemorySet(expected, ~1, kBuilderSize);
+  memset(expected, ~1, kBuilderSize);
   EXPECT_EQ(SpdyStringPiece(expected, kBuilderSize),
             SpdyStringPiece(frame.data(), kBuilderSize));
 }
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_frame_reader.cc b/src/net/third_party/quiche/src/spdy/core/spdy_frame_reader.cc
index c5ed25f..2bb82bf 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_frame_reader.cc
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_frame_reader.cc
@@ -101,7 +101,7 @@
 
   // Read into result.
   *result = 0;
-  SbMemoryCopy(reinterpret_cast<char*>(result) + 1, data_ + ofs_, 3);
+  memcpy(reinterpret_cast<char*>(result) + 1, data_ + ofs_, 3);
   *result = SpdyNetToHost32(*result);
 
   // Iterate.
@@ -164,7 +164,7 @@
   }
 
   // Read into result.
-  SbMemoryCopy(result, data_ + ofs_, size);
+  memcpy(result, data_ + ofs_, size);
 
   // Iterate.
   ofs_ += size;
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_framer_test.cc b/src/net/third_party/quiche/src/spdy/core/spdy_framer_test.cc
index 89d8743..8190cc4 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_framer_test.cc
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_framer_test.cc
@@ -72,8 +72,8 @@
                  << "higher total frame length than non-incremental method.";
       return false;
     }
-    if (SbMemoryCompare(arg.data() + size_verified, frame.data(),
-                        frame.size())) {
+    if (memcmp(arg.data() + size_verified, frame.data(),
+               frame.size())) {
       CompareCharArraysWithHexError(
           "Header serialization methods should be equivalent: ",
           reinterpret_cast<unsigned char*>(arg.data() + size_verified),
@@ -479,7 +479,7 @@
       DLOG(FATAL) << "Attempted to init header streaming with "
                   << "invalid control frame type: " << header_control_type;
     }
-    SbMemorySet(header_buffer_.get(), 0, header_buffer_size_);
+    memset(header_buffer_.get(), 0, header_buffer_size_);
     header_buffer_length_ = 0;
     header_stream_id_ = stream_id;
     header_control_type_ = header_control_type;
@@ -2521,7 +2521,7 @@
   const char kDescription[] = "Unknown frame";
   const uint8_t kType = 0xaf;
   const uint8_t kFlags = 0x11;
-  const uint8_t kLength = SbStringGetLength(kDescription);
+  const uint8_t kLength = strlen(kDescription);
   const unsigned char kFrameData[] = {
       0x00,   0x00, kLength,        // Length: 13
       kType,                        //   Type: undefined
@@ -3131,7 +3131,7 @@
   // Send the frame header.
   EXPECT_CALL(visitor,
               OnDataFrameHeader(
-                  1, kPaddingLen + SbStringGetLength(data_payload), false));
+                  1, kPaddingLen + strlen(data_payload), false));
   CHECK_EQ(kDataFrameMinimumSize,
            deframer_.ProcessInput(frame.data(), kDataFrameMinimumSize));
   CHECK_EQ(deframer_.state(),
@@ -3590,7 +3590,7 @@
 
 TEST_P(SpdyFramerTest, ReadGarbage) {
   unsigned char garbage_frame[256];
-  SbMemorySet(garbage_frame, ~0, sizeof(garbage_frame));
+  memset(garbage_frame, ~0, sizeof(garbage_frame));
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
   visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame));
   EXPECT_EQ(1, visitor.error_count_);
@@ -4663,7 +4663,7 @@
   EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
   EXPECT_EQ(1, visitor->headers_frame_count_);
   EXPECT_EQ(1, visitor->data_frame_count_);
-  EXPECT_EQ(SbStringGetLength(four_score),
+  EXPECT_EQ(strlen(four_score),
             static_cast<unsigned>(visitor->data_bytes_));
 }
 
@@ -4744,7 +4744,7 @@
     // and none of the second frame.
 
     EXPECT_EQ(1, visitor->data_frame_count_);
-    EXPECT_EQ(SbStringGetLength(four_score),
+    EXPECT_EQ(strlen(four_score),
               static_cast<unsigned>(visitor->data_bytes_));
     EXPECT_EQ(0, visitor->headers_frame_count_);
   }
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_header_block.cc b/src/net/third_party/quiche/src/spdy/core/spdy_header_block.cc
index ee97eba..f6e92cd 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_header_block.cc
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_header_block.cc
@@ -389,12 +389,12 @@
   }
   auto* original_dst = dst;
   auto it = fragments.begin();
-  SbMemoryCopy(dst, it->data(), it->size());
+  memcpy(dst, it->data(), it->size());
   dst += it->size();
   for (++it; it != fragments.end(); ++it) {
-    SbMemoryCopy(dst, separator.data(), separator.size());
+    memcpy(dst, separator.data(), separator.size());
     dst += separator.size();
-    SbMemoryCopy(dst, it->data(), it->size());
+    memcpy(dst, it->data(), it->size());
     dst += it->size();
   }
   return dst - original_dst;
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_protocol.h b/src/net/third_party/quiche/src/spdy/core/spdy_protocol.h
index 2d168ba..54ce16d 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_protocol.h
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_protocol.h
@@ -983,7 +983,7 @@
     } else {
       // Otherwise, we need to make a copy to give to the caller.
       buffer = new char[size_];
-      SbMemoryCopy(buffer, frame_, size_);
+      memcpy(buffer, frame_, size_);
     }
     *this = SpdySerializedFrame();
     return buffer;
diff --git a/src/net/third_party/quiche/src/spdy/core/spdy_test_utils.cc b/src/net/third_party/quiche/src/spdy/core/spdy_test_utils.cc
index 5f80659..d057704 100644
--- a/src/net/third_party/quiche/src/spdy/core/spdy_test_utils.cc
+++ b/src/net/third_party/quiche/src/spdy/core/spdy_test_utils.cc
@@ -97,7 +97,7 @@
   CHECK_GT(1u << 14, length);
   {
     int32_t wire_length = SpdyHostToNet32(length);
-    SbMemoryCopy(frame->data(), reinterpret_cast<char*>(&wire_length) + 1, 3);
+    memcpy(frame->data(), reinterpret_cast<char*>(&wire_length) + 1, 3);
   }
 }
 
diff --git a/src/net/tools/dump_cache/dump_files.cc b/src/net/tools/dump_cache/dump_files.cc
index 939db0d..9f12991 100644
--- a/src/net/tools/dump_cache/dump_files.cc
+++ b/src/net/tools/dump_cache/dump_files.cc
@@ -255,7 +255,7 @@
   if (!entry_block.Load())
     return false;
 
-  SbMemoryCopy(entry, entry_block.Data(), sizeof(*entry));
+  memcpy(entry, entry_block.Data(), sizeof(*entry));
   if (!entry_block.VerifyHash())
     printf("Self hash failed at 0x%x\n", addr);
 
@@ -287,7 +287,7 @@
   if (!rank_block.VerifyHash())
     printf("Self hash failed at 0x%x\n", addr);
 
-  SbMemoryCopy(rankings, rank_block.Data(), sizeof(*rankings));
+  memcpy(rankings, rank_block.Data(), sizeof(*rankings));
   return true;
 }
 
diff --git a/src/net/tools/epoll_server/epoll_server.cc b/src/net/tools/epoll_server/epoll_server.cc
index d1b1cd1..fe143d6 100644
--- a/src/net/tools/epoll_server/epoll_server.cc
+++ b/src/net/tools/epoll_server/epoll_server.cc
@@ -534,7 +534,7 @@
 
 void EpollServer::DelFD(int fd) const {
   struct epoll_event ee;
-  SbMemorySet(&ee, 0, sizeof(ee));
+  memset(&ee, 0, sizeof(ee));
 #ifdef EPOLL_SERVER_EVENT_TRACING
   event_recorder_.RecordFDMaskEvent(fd, 0, "DelFD");
 #endif
@@ -550,7 +550,7 @@
 
 void EpollServer::AddFD(int fd, int event_mask) const {
   struct epoll_event ee;
-  SbMemorySet(&ee, 0, sizeof(ee));
+  memset(&ee, 0, sizeof(ee));
   ee.events = event_mask | EPOLLERR | EPOLLHUP;
   ee.data.fd = fd;
 #ifdef EPOLL_SERVER_EVENT_TRACING
@@ -568,7 +568,7 @@
 
 void EpollServer::ModFD(int fd, int event_mask) const {
   struct epoll_event ee;
-  SbMemorySet(&ee, 0, sizeof(ee));
+  memset(&ee, 0, sizeof(ee));
   ee.events = event_mask | EPOLLERR | EPOLLHUP;
   ee.data.fd = fd;
 #ifdef EPOLL_SERVER_EVENT_TRACING
diff --git a/src/net/tools/quic/quic_http_proxy_backend_stream_test.cc b/src/net/tools/quic/quic_http_proxy_backend_stream_test.cc
index 1804a6a..3297f1c 100644
--- a/src/net/tools/quic/quic_http_proxy_backend_stream_test.cc
+++ b/src/net/tools/quic/quic_http_proxy_backend_stream_test.cc
@@ -367,7 +367,7 @@
 TEST_F(QuicHttpProxyBackendStreamTest, SendRequestToBackendHandleGzip) {
   const char kGzipData[] =
       "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!";
-  uint64_t rawBodyLength = SbStringGetLength(kGzipData);
+  uint64_t rawBodyLength = strlen(kGzipData);
   spdy::SpdyHeaderBlock request_headers;
   request_headers[":path"] = std::string("/gzip-body?") + kGzipData;
   request_headers[":authority"] = "www.example.org";
diff --git a/src/net/tools/stress_cache/stress_cache.cc b/src/net/tools/stress_cache/stress_cache.cc
index 1565ac0..c89f74d 100644
--- a/src/net/tools/stress_cache/stress_cache.cc
+++ b/src/net/tools/stress_cache/stress_cache.cc
@@ -125,7 +125,7 @@
  public:
   EntryWrapper() : entry_(nullptr), state_(NONE) {
     buffer_ = base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-    SbMemorySet(buffer_->data(), 'k', kBufferSize);
+    memset(buffer_->data(), 'k', kBufferSize);
   }
 
   Operation state() const { return state_; }
@@ -193,7 +193,7 @@
     return DoWrite();
 
   state_ = READ;
-  SbMemorySet(buffer_->data(), 'k', kReadSize);
+  memset(buffer_->data(), 'k', kReadSize);
   int rv = entry_->ReadData(
       0, 0, buffer_.get(), kReadSize,
       base::Bind(&EntryWrapper::OnReadDone, base::Unretained(this)));
@@ -204,7 +204,7 @@
 void EntryWrapper::OnReadDone(int result) {
   DCHECK_EQ(state_, READ);
   CHECK_EQ(result, kReadSize);
-  CHECK_EQ(0, SbMemoryCompare(buffer_->data(), "Write: ", 7));
+  CHECK_EQ(0, memcmp(buffer_->data(), "Write: ", 7));
   DoWrite();
 }
 
@@ -390,7 +390,7 @@
   char message[kMaxMessageLen];
   size_t len = std::min(str.length() - message_start, kMaxMessageLen - 1);
 
-  SbMemoryCopy(message, str.c_str() + message_start, len);
+  memcpy(message, str.c_str() + message_start, len);
   message[len] = '\0';
 #if !defined(DISK_CACHE_TRACE_TO_LOG)
   disk_cache::Trace("%s", message);
diff --git a/src/net/tools/transport_security_state_generator/spki_hash.cc b/src/net/tools/transport_security_state_generator/spki_hash.cc
index 342e000..5a18578 100644
--- a/src/net/tools/transport_security_state_generator/spki_hash.cc
+++ b/src/net/tools/transport_security_state_generator/spki_hash.cc
@@ -38,7 +38,7 @@
     return false;
   }
 
-  SbMemoryCopy(data_, decoded.data(), decoded.size());
+  memcpy(data_, decoded.data(), decoded.size());
   return true;
 }
 
diff --git a/src/net/url_request/url_fetcher_core.cc b/src/net/url_request/url_fetcher_core.cc
index 749cd00..6cdcfec 100644
--- a/src/net/url_request/url_fetcher_core.cc
+++ b/src/net/url_request/url_fetcher_core.cc
@@ -146,7 +146,7 @@
           SbSystemGetExtension(kCobaltExtensionUrlFetcherObserverName));
   if (command_line.HasSwitch(URL_FETCHER_COMMAND_LINE_SWITCH) &&
       observer_extension &&
-      SbStringCompareAll(observer_extension->name,
+      strcmp(observer_extension->name,
                          kCobaltExtensionUrlFetcherObserverName) == 0 &&
       observer_extension->version >= 1) {
     observer_extension_ = observer_extension;
diff --git a/src/net/url_request/url_fetcher_impl_unittest.cc b/src/net/url_request/url_fetcher_impl_unittest.cc
index 46b9929..84e4535 100644
--- a/src/net/url_request/url_fetcher_impl_unittest.cc
+++ b/src/net/url_request/url_fetcher_impl_unittest.cc
@@ -384,7 +384,7 @@
     ++num_upload_streams_created_;
     std::vector<char> buffer(
         kCreateUploadStreamBody,
-        kCreateUploadStreamBody + SbStringGetLength(kCreateUploadStreamBody));
+        kCreateUploadStreamBody + strlen(kCreateUploadStreamBody));
     return ElementsUploadDataStream::CreateWithReader(
         std::unique_ptr<UploadElementReader>(
             new UploadOwnedBytesElementReader(&buffer)),
@@ -546,13 +546,13 @@
   ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
   EXPECT_EQ(kDefaultResponseBody, data);
 
-  EXPECT_EQ(static_cast<int64_t>(SbStringGetLength(kDefaultResponseBody)),
+  EXPECT_EQ(static_cast<int64_t>(strlen(kDefaultResponseBody)),
             delegate.fetcher()->GetReceivedResponseContentLength());
   std::string parsed_headers;
   base::ReplaceChars(delegate.fetcher()->GetResponseHeaders()->raw_headers(),
                      std::string("\0", 1), "\n\r", &parsed_headers);
   EXPECT_EQ(static_cast<int64_t>(parsed_headers.size() +
-                                 SbStringGetLength(kDefaultResponseBody)),
+                                 strlen(kDefaultResponseBody)),
             delegate.fetcher()->GetTotalReceivedBytes());
   EXPECT_EQ(ProxyServer::SCHEME_DIRECT,
             delegate.fetcher()->ProxyServerUsed().scheme());
diff --git a/src/net/url_request/url_request.cc b/src/net/url_request/url_request.cc
index 0767613..11e37d2 100644
--- a/src/net/url_request/url_request.cc
+++ b/src/net/url_request/url_request.cc
@@ -333,7 +333,7 @@
 
 void URLRequest::LogBlockedBy(const char* blocked_by) {
   DCHECK(blocked_by);
-  DCHECK_GT(SbStringGetLength(blocked_by), 0u);
+  DCHECK_GT(strlen(blocked_by), 0u);
 
   // Only log information to NetLog during startup and certain deferring calls
   // to delegates.  For all reads but the first, do nothing.
diff --git a/src/net/url_request/url_request_file_dir_job.cc b/src/net/url_request/url_request_file_dir_job.cc
index a5700e8..8386f4c 100644
--- a/src/net/url_request/url_request_file_dir_job.cc
+++ b/src/net/url_request/url_request_file_dir_job.cc
@@ -200,7 +200,7 @@
 int URLRequestFileDirJob::ReadBuffer(char* buf, int buf_size) {
   int count = std::min(buf_size, static_cast<int>(data_.size()));
   if (count) {
-    SbMemoryCopy(buf, &data_[0], count);
+    memcpy(buf, &data_[0], count);
     data_.erase(0, count);
     return count;
   }
diff --git a/src/net/url_request/url_request_simple_job.cc b/src/net/url_request/url_request_simple_job.cc
index 97aa650..5f052dc 100644
--- a/src/net/url_request/url_request_simple_job.cc
+++ b/src/net/url_request/url_request_simple_job.cc
@@ -29,7 +29,7 @@
               int buf_size,
               const scoped_refptr<base::RefCountedMemory>& data,
               int64_t data_offset) {
-  SbMemoryCopy(buf->data(), data->front() + data_offset, buf_size);
+  memcpy(buf->data(), data->front() + data_offset, buf_size);
 }
 
 }  // namespace
diff --git a/src/net/url_request/url_request_test_job.cc b/src/net/url_request/url_request_test_job.cc
index 0fae400..346fdfa 100644
--- a/src/net/url_request/url_request_test_job.cc
+++ b/src/net/url_request/url_request_test_job.cc
@@ -257,7 +257,7 @@
     if (bytes_read + offset_ > static_cast<int>(response_data_.length()))
       bytes_read = static_cast<int>(response_data_.length()) - offset_;
 
-    SbMemoryCopy(buf->data(), &response_data_.c_str()[offset_], bytes_read);
+    memcpy(buf->data(), &response_data_.c_str()[offset_], bytes_read);
     offset_ += bytes_read;
   }
   return bytes_read;
diff --git a/src/net/url_request/url_request_unittest.cc b/src/net/url_request/url_request_unittest.cc
index d58d057..5a489ef 100644
--- a/src/net/url_request/url_request_unittest.cc
+++ b/src/net/url_request/url_request_unittest.cc
@@ -371,14 +371,14 @@
 bool ContainsString(const std::string& haystack, const char* needle) {
   std::string::const_iterator it =
       std::search(haystack.begin(), haystack.end(), needle,
-                  needle + SbStringGetLength(needle),
+                  needle + strlen(needle),
                   base::CaseInsensitiveCompareASCII<char>());
   return it != haystack.end();
 }
 
 std::unique_ptr<UploadDataStream> CreateSimpleUploadData(const char* data) {
   std::unique_ptr<UploadElementReader> reader(
-      new UploadBytesElementReader(data, SbStringGetLength(data)));
+      new UploadBytesElementReader(data, strlen(data)));
   return ElementsUploadDataStream::CreateWithReader(std::move(reader), 0);
 }
 
@@ -1373,7 +1373,7 @@
   EXPECT_GT(info.size, 0);
   std::string sentinel_output = GetDirectoryListingEntry(
       base::string16(sentinel_name,
-                     sentinel_name + SbStringGetLength(sentinel_name)),
+                     sentinel_name + strlen(sentinel_name)),
       std::string(sentinel_name), false /* is_dir */, info.size,
 
       info.last_modified);
@@ -4081,7 +4081,7 @@
     char* ptr = uploadBytes;
     char marker = 'a';
     for (int idx = 0; idx < kMsgSize/10; idx++) {
-      SbMemoryCopy(ptr, "----------", 10);
+      memcpy(ptr, "----------", 10);
       ptr += 10;
       if (idx % 100 == 0) {
         ptr--;
@@ -10128,7 +10128,7 @@
   url::Replacements<char> replacements;
   const char kNewScheme[] = "https";
   replacements.SetScheme(kNewScheme,
-                         url::Component(0, SbStringGetLength(kNewScheme)));
+                         url::Component(0, strlen(kNewScheme)));
   GURL hsts_https_url = hsts_http_url.ReplaceComponents(replacements);
 
   TestDelegate d;
diff --git a/src/net/url_request/view_cache_helper_unittest.cc b/src/net/url_request/view_cache_helper_unittest.cc
index c3d3227..a963f4f 100644
--- a/src/net/url_request/view_cache_helper_unittest.cc
+++ b/src/net/url_request/view_cache_helper_unittest.cc
@@ -74,7 +74,7 @@
 
   int len = data.length();
   scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(len);
-  SbMemoryCopy(buf->data(), data.data(), data.length());
+  memcpy(buf->data(), data.data(), data.length());
 
   TestCompletionCallback cb;
   int rv = entry->WriteData(index, 0, buf.get(), len, cb.callback(), true);
diff --git a/src/net/websockets/websocket_basic_stream.cc b/src/net/websockets/websocket_basic_stream.cc
index f21d86e..69b87e3 100644
--- a/src/net/websockets/websocket_basic_stream.cc
+++ b/src/net/websockets/websocket_basic_stream.cc
@@ -381,7 +381,7 @@
       DCHECK_EQ(body_size,
                 static_cast<int>(current_frame_header_->payload_length));
       auto body = base::MakeRefCounted<IOBufferWithSize>(body_size);
-      SbMemoryCopy(body->data(),
+      memcpy(body->data(),
                    incomplete_control_frame_body_->StartOfBuffer(), body_size);
       incomplete_control_frame_body_ = NULL;  // Frame now complete.
       DCHECK(is_final_chunk);
@@ -450,7 +450,7 @@
   CHECK_GE(incomplete_control_frame_body_->capacity(), new_offset)
       << "Control frame body larger than frame header indicates; frame parser "
          "bug?";
-  SbMemoryCopy(incomplete_control_frame_body_->data(), data_buffer->data(),
+  memcpy(incomplete_control_frame_body_->data(), data_buffer->data(),
                data_buffer->size());
   incomplete_control_frame_body_->set_offset(new_offset);
 }
diff --git a/src/net/websockets/websocket_basic_stream_test.cc b/src/net/websockets/websocket_basic_stream_test.cc
index 3b07bd0..8a458a7f 100644
--- a/src/net/websockets/websocket_basic_stream_test.cc
+++ b/src/net/websockets/websocket_basic_stream_test.cc
@@ -133,7 +133,7 @@
   void SetHttpReadBuffer(const char* data, size_t size) {
     http_read_buffer_ = base::MakeRefCounted<GrowableIOBuffer>();
     http_read_buffer_->SetCapacity(size);
-    SbMemoryCopy(http_read_buffer_->data(), data, size);
+    memcpy(http_read_buffer_->data(), data, size);
     http_read_buffer_->set_offset(size);
   }
 
@@ -234,7 +234,7 @@
         kWriteFrameSize - (WebSocketFrameHeader::kBaseHeaderSize +
                            WebSocketFrameHeader::kMaskingKeyLength);
     frame->data = base::MakeRefCounted<IOBuffer>(payload_size);
-    SbMemoryCopy(frame->data->data(),
+    memcpy(frame->data->data(),
                  kWriteFrame + kWriteFrameSize - payload_size, payload_size);
     WebSocketFrameHeader& header = frame->header;
     header.final = true;
@@ -669,8 +669,8 @@
   ASSERT_EQ(1U, frames_.size());
   EXPECT_EQ(WebSocketFrameHeader::kOpCodeClose, frames_[0]->header.opcode);
   EXPECT_EQ(kCloseFrameSize - 2, frames_[0]->header.payload_length);
-  EXPECT_EQ(0, SbMemoryCompare(frames_[0]->data->data(), kCloseFrame + 2,
-                               kCloseFrameSize - 2));
+  EXPECT_EQ(0, memcmp(frames_[0]->data->data(), kCloseFrame + 2,
+                      kCloseFrameSize - 2));
 }
 
 // Check that a control frame which partially arrives at the end of the response
@@ -800,9 +800,9 @@
   const size_t kExpectedFrameCount =
       (kWireSize + kReadBufferSize - 1) / kReadBufferSize;
   std::unique_ptr<char[]> big_frame(new char[kWireSize]);
-  SbMemoryCopy(big_frame.get(), "\x81\x7F", 2);
+  memcpy(big_frame.get(), "\x81\x7F", 2);
   base::WriteBigEndian(big_frame.get() + 2, kPayloadSize);
-  SbMemorySet(big_frame.get() + kLargeFrameHeaderSize, 'A', kPayloadSize);
+  memset(big_frame.get() + kLargeFrameHeaderSize, 'A', kPayloadSize);
 
   CreateChunkedRead(ASYNC,
                     big_frame.get(),
@@ -920,7 +920,7 @@
   const std::string unmasked_payload = "graphics";
   const size_t payload_size = unmasked_payload.size();
   frame->data = base::MakeRefCounted<IOBuffer>(payload_size);
-  SbMemoryCopy(frame->data->data(), unmasked_payload.data(), payload_size);
+  memcpy(frame->data->data(), unmasked_payload.data(), payload_size);
   WebSocketFrameHeader& header = frame->header;
   header.final = true;
   header.masked = true;
diff --git a/src/net/websockets/websocket_channel_test.cc b/src/net/websockets/websocket_channel_test.cc
index 7358b5c..020e50b 100644
--- a/src/net/websockets/websocket_channel_test.cc
+++ b/src/net/websockets/websocket_channel_test.cc
@@ -370,14 +370,14 @@
     const InitFrame& source_frame = source_frames[i];
     auto result_frame = std::make_unique<WebSocketFrame>(source_frame.opcode);
     size_t frame_length =
-        source_frame.data ? SbStringGetLength(source_frame.data) : 0;
+        source_frame.data ? strlen(source_frame.data) : 0;
     WebSocketFrameHeader& result_header = result_frame->header;
     result_header.final = (source_frame.final == FINAL_FRAME);
     result_header.masked = (source_frame.masked == MASKED);
     result_header.payload_length = frame_length;
     if (source_frame.data) {
       result_frame->data = base::MakeRefCounted<IOBuffer>(frame_length);
-      SbMemoryCopy(result_frame->data->data(), source_frame.data, frame_length);
+      memcpy(result_frame->data->data(), source_frame.data, frame_length);
     }
     result_frames.push_back(std::move(result_frame));
   }
@@ -432,15 +432,15 @@
         return false;
       }
       const size_t expected_length =
-          expected_frame.data ? SbStringGetLength(expected_frame.data) : 0;
+          expected_frame.data ? strlen(expected_frame.data) : 0;
       if (actual_frame.header.payload_length != expected_length) {
         *listener << "the payload length is "
                   << actual_frame.header.payload_length;
         return false;
       }
       if (expected_length != 0 &&
-          SbMemoryCompare(actual_frame.data->data(), expected_frame.data,
-                          actual_frame.header.payload_length) != 0) {
+          memcmp(actual_frame.data->data(), expected_frame.data,
+                 actual_frame.header.payload_length) != 0) {
         *listener << "the data content differs";
         return false;
       }
@@ -2537,7 +2537,7 @@
   }
 
   CreateChannelAndConnectSuccessfully();
-  for (size_t i = 0; i < SbStringGetLength(input_letters); ++i) {
+  for (size_t i = 0; i < strlen(input_letters); ++i) {
     channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText,
                         AsIOBuffer(std::string(1, input_letters[i])), 1U);
   }
@@ -2587,8 +2587,8 @@
   const WebSocketFrame* out_frame = (*frames)[0].get();
   EXPECT_EQ(kBinaryBlobSize, out_frame->header.payload_length);
   ASSERT_TRUE(out_frame->data.get());
-  EXPECT_EQ(0, SbMemoryCompare(kBinaryBlob, out_frame->data->data(),
-                               kBinaryBlobSize));
+  EXPECT_EQ(0, memcmp(kBinaryBlob, out_frame->data->data(),
+                      kBinaryBlobSize));
 }
 
 // Test the read path for 8-bit cleanliness as well.
@@ -2599,7 +2599,7 @@
   frame_header.final = true;
   frame_header.payload_length = kBinaryBlobSize;
   frame->data = base::MakeRefCounted<IOBuffer>(kBinaryBlobSize);
-  SbMemoryCopy(frame->data->data(), kBinaryBlob, kBinaryBlobSize);
+  memcpy(frame->data->data(), kBinaryBlob, kBinaryBlobSize);
   std::vector<std::unique_ptr<WebSocketFrame>> frames;
   frames.push_back(std::move(frame));
   auto stream = std::make_unique<ReadableFakeWebSocketStream>();
diff --git a/src/net/websockets/websocket_deflate_stream_test.cc b/src/net/websockets/websocket_deflate_stream_test.cc
index f110006..7bdca51 100644
--- a/src/net/websockets/websocket_deflate_stream_test.cc
+++ b/src/net/websockets/websocket_deflate_stream_test.cc
@@ -55,7 +55,7 @@
 
 scoped_refptr<IOBuffer> ToIOBuffer(const std::string& s) {
   auto buffer = base::MakeRefCounted<IOBuffer>(s.size());
-  SbMemoryCopy(buffer->data(), s.data(), s.size());
+  memcpy(buffer->data(), s.data(), s.size());
   return buffer;
 }
 
diff --git a/src/net/websockets/websocket_deflater.cc b/src/net/websockets/websocket_deflater.cc
index 30b74e4..09d1672 100644
--- a/src/net/websockets/websocket_deflater.cc
+++ b/src/net/websockets/websocket_deflater.cc
@@ -55,7 +55,7 @@
   // See https://crbug.com/691074
   window_bits = -std::max(window_bits, 9);
 
-  SbMemorySet(stream_.get(), 0, sizeof(*stream_));
+  memset(stream_.get(), 0, sizeof(*stream_));
   int result = deflateInit2(stream_.get(),
                             Z_DEFAULT_COMPRESSION,
                             Z_DEFLATED,
diff --git a/src/net/websockets/websocket_frame.cc b/src/net/websockets/websocket_frame.cc
index c38c3ee..1935c46 100644
--- a/src/net/websockets/websocket_frame.cc
+++ b/src/net/websockets/websocket_frame.cc
@@ -228,7 +228,7 @@
 
   for (size_t i = 0; i < kPackedMaskKeySize; i += kMaskingKeyLength) {
     // memcpy() is allegedly blessed by the C++ standard for type-punning.
-    SbMemoryCopy(reinterpret_cast<char*>(&packed_mask_key) + i, realigned_mask,
+    memcpy(reinterpret_cast<char*>(&packed_mask_key) + i, realigned_mask,
                  kMaskingKeyLength);
   }
 
diff --git a/src/net/websockets/websocket_frame_parser.cc b/src/net/websockets/websocket_frame_parser.cc
index 8b9ce4d..2bbb8e4 100644
--- a/src/net/websockets/websocket_frame_parser.cc
+++ b/src/net/websockets/websocket_frame_parser.cc
@@ -186,7 +186,7 @@
     frame_chunk->data =
         base::MakeRefCounted<IOBufferWithSize>(static_cast<int>(next_size));
     char* io_data = frame_chunk->data->data();
-    SbMemoryCopy(io_data, &buffer_.front() + current_read_pos_, next_size);
+    memcpy(io_data, &buffer_.front() + current_read_pos_, next_size);
     if (current_frame_header_->masked) {
       // The masking function is its own inverse, so we use the same function to
       // unmask as to mask.
diff --git a/src/net/websockets/websocket_frame_test.cc b/src/net/websockets/websocket_frame_test.cc
index dee8b23..e7efd6a 100644
--- a/src/net/websockets/websocket_frame_test.cc
+++ b/src/net/websockets/websocket_frame_test.cc
@@ -309,7 +309,7 @@
       const size_t aligned_len = std::min(kScratchBufferSize - alignment,
                                           kTestInputSize - frame_offset);
       for (size_t chunk_size = 1; chunk_size < kMaxVectorSize; ++chunk_size) {
-        SbMemoryCopy(aligned_scratch, kTestInput + frame_offset, aligned_len);
+        memcpy(aligned_scratch, kTestInput + frame_offset, aligned_len);
         for (size_t chunk_start = 0; chunk_start < aligned_len;
              chunk_start += chunk_size) {
           const size_t this_chunk_size =
diff --git a/src/net/websockets/websocket_inflater.cc b/src/net/websockets/websocket_inflater.cc
index ff723d2..e656ddb 100644
--- a/src/net/websockets/websocket_inflater.cc
+++ b/src/net/websockets/websocket_inflater.cc
@@ -48,7 +48,7 @@
   DCHECK_LE(8, window_bits);
   DCHECK_GE(15, window_bits);
   stream_ = std::make_unique<z_stream>();
-  SbMemorySet(stream_.get(), 0, sizeof(*stream_));
+  memset(stream_.get(), 0, sizeof(*stream_));
   int result = inflateInit2(stream_.get(), -window_bits);
   if (result != Z_OK) {
     inflateEnd(stream_.get());
@@ -190,7 +190,7 @@
   if (tail_ < head_) {
     size_t num_bytes_to_copy = std::min(size, buffer_.size() - head_);
     DCHECK_LT(head_, buffer_.size());
-    SbMemoryCopy(&dest[num_bytes_copied], &buffer_[head_], num_bytes_to_copy);
+    memcpy(&dest[num_bytes_copied], &buffer_[head_], num_bytes_to_copy);
     AdvanceHead(num_bytes_to_copy);
     num_bytes_copied += num_bytes_to_copy;
   }
@@ -201,7 +201,7 @@
   size_t num_bytes_to_copy = size - num_bytes_copied;
   DCHECK_LE(num_bytes_to_copy, tail_ - head_);
   DCHECK_LT(head_, buffer_.size());
-  SbMemoryCopy(&dest[num_bytes_copied], &buffer_[head_], num_bytes_to_copy);
+  memcpy(&dest[num_bytes_copied], &buffer_[head_], num_bytes_to_copy);
   AdvanceHead(num_bytes_to_copy);
   num_bytes_copied += num_bytes_to_copy;
   DCHECK_EQ(size, num_bytes_copied);
@@ -274,7 +274,7 @@
   if (!num_bytes_to_copy)
     return 0;
   IOBufferWithSize* buffer = buffers_.back().get();
-  SbMemoryCopy(&buffer->data()[tail_of_last_buffer_], data, num_bytes_to_copy);
+  memcpy(&buffer->data()[tail_of_last_buffer_], data, num_bytes_to_copy);
   tail_of_last_buffer_ += num_bytes_to_copy;
   return num_bytes_to_copy;
 }
diff --git a/src/sql/connection.cc b/src/sql/connection.cc
index b74f293..3a5446d 100644
--- a/src/sql/connection.cc
+++ b/src/sql/connection.cc
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "sql/connection.h"
 
 #include <string.h>
diff --git a/src/sql/statement.cc b/src/sql/statement.cc
index 6da6061..1875b05 100644
--- a/src/sql/statement.cc
+++ b/src/sql/statement.cc
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "sql/statement.h"
 
 #include "base/logging.h"
diff --git a/src/starboard/CHANGELOG.md b/src/starboard/CHANGELOG.md
index 898bb96..450d514 100644
--- a/src/starboard/CHANGELOG.md
+++ b/src/starboard/CHANGELOG.md
@@ -47,7 +47,7 @@
 change), then it should send the new `kSbEventDateTimeConfigurationChanged`
 event.
 
-### Deprected speech recognizer API.
+### Deprecated speech recognizer API.
 
 The `starboard/speech_recognizer.h` APIs have been deprecated -- even for
 platforms that define SB_HAS(SPEECH_RECOGNIZER). Instead, the application is
@@ -90,11 +90,33 @@
 * `SbCharacterIsUpper`
 * `SbCharacterToLower`
 * `SbCharacterToUpper`
+* `SbStringConcat`
+* `SbStringConcatUnsafe`
+* `SbStringConcatWide`
 * `SbDoubleAbsolute`
 * `SbDoubleExponent`
 * `SbDoubleFloor`
 * `SbDoubleIsFinite`
 * `SbDoubleIsNan`
+* `SbMemoryAlignToPageSize`
+* `SbMemoryCompare`
+* `SbMemoryCopy`
+* `SbMemoryFindByte`
+* `SbMemoryIsAligned`
+* `SbMemoryIsZero`
+* `SbMemoryMove`
+* `SbMemorySet`
+* `SbStringCompare`
+* `SbStringCompareAll`
+* `SbStringCompareWide`
+* `SbStringCopy`
+* `SbStringCopyUnsafe`
+* `SbStringCopyWide`
+* `SbStringFindCharacter`
+* `SbStringFindLastCharacter`
+* `SbStringFindString`
+* `SbStringGetLength`
+* `SbStringGetLengthWide`
 * `SbStringParseDouble`
 * `SbStringParseSignedInteger`
 * `SbStringParseUInt64`
@@ -102,6 +124,21 @@
 * `SbSystemBinarySearch`
 * `SbSystemSort`
 
+### Add SbTimeMonotonic timestamp into SbEvent.
+
+### Remove SbTimeMonotonic timestamp from SbInputData.
+
+### Deprecated kSbSystemCapabilitySetsInputTimestamp from SbSystemCapabilityId.
+
+The new timestamp field from `SbEvent` will be used instead of the deprecated
+timestamp in `SbInputData`.
+
+### Moved `SbMediaIsSupported()` from `media.h` to `media_support_internal.h`.
+
+It has never been used by Cobalt.  It is only used inside Starboard by functions
+like `CanPlayMimeAndKeySystem()`, and is no longer exposed as a Starboard
+interface function.
+
 ## Version 12
 ### Add support for platform-based UI navigation.
 
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/apk/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/apk/BUILD.gn
index 97c4786..e0b3819 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/apk/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+action("apk_sources") {
+  script = "//starboard/build/touch.py"
+  sources = [ "cobalt-gradle.sh" ]
+  outputs = [ "$root_out_dir/gradle/apk_sources.stamp" ]
+  args = outputs
 }
diff --git a/src/starboard/android/apk/app/CMakeLists.txt b/src/starboard/android/apk/app/CMakeLists.txt
index 539ef3d..2ac5b87 100644
--- a/src/starboard/android/apk/app/CMakeLists.txt
+++ b/src/starboard/android/apk/app/CMakeLists.txt
@@ -46,6 +46,12 @@
   )
 endif()
 
+# If COBALT_LIBRARY_DIR isn't set for a particular deploy target use the
+# base product directory.
+if(NOT COBALT_LIBRARY_DIR)
+  set(COBALT_LIBRARY_DIR COBALT_PRODUCT_DIR)
+endif()
+
 # For platform deploy builds, use the -n parameter to skip Cobalt ninja and
 # just copy the .so that was already built and waiting in COBALT_PRODUCT_DIR.
 if(COBALT_PLATFORM_DEPLOY)
@@ -58,7 +64,7 @@
     COMMAND ${CMAKE_CURRENT_LIST_DIR}/cobalt-ninja.sh
             ${skip_ninja_arg} -C ${COBALT_PRODUCT_DIR} ${COBALT_TARGET}
     COMMAND ${CMAKE_COMMAND} -E copy
-            ${COBALT_PRODUCT_DIR}/lib/lib${COBALT_TARGET}.so
+            ${COBALT_LIBRARY_DIR}/lib${COBALT_TARGET}.so
             ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libcoat.so
 )
 
@@ -113,4 +119,4 @@
         ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${angle_lib}.so
     )
   endforeach()
-endif()
\ No newline at end of file
+endif()
diff --git a/src/starboard/android/apk/app/build.gradle b/src/starboard/android/apk/app/build.gradle
index cd8149e..7cdb4f1 100644
--- a/src/starboard/android/apk/app/build.gradle
+++ b/src/starboard/android/apk/app/build.gradle
@@ -30,6 +30,7 @@
             project.hasProperty('cobaltProductDir') ? new File(cobaltProductDir).canonicalPath : ''
     cobaltContentDir =
             project.hasProperty('cobaltContentDir') ? new File(cobaltContentDir).canonicalPath : ''
+    cobaltLibraryDir = project.hasProperty('cobaltLibraryDir') ? cobaltLibraryDir : cobaltProductDir
     enableVulkan =
             project.hasProperty('enableVulkan') ? enableVulkan : 0
 
@@ -75,6 +76,7 @@
                 arguments "-DCOBALT_TARGET=${cobaltTarget}"
                 arguments "-DCOBALT_PRODUCT_DIR=${cobaltProductDir}"
                 arguments "-DCOBALT_CONTENT_DIR=${cobaltContentDir}"
+                arguments "-DCOBALT_LIBRARY_DIR=${cobaltLibraryDir}"
                 arguments "-DCOBALT_PLATFORM_DEPLOY=${project.hasProperty('cobaltDeployApk')}"
                 arguments "-DENABLE_VULKAN=${enableVulkan}"
             }
diff --git a/src/starboard/android/apk/app/cobalt-ninja.sh b/src/starboard/android/apk/app/cobalt-ninja.sh
index 6dc1375..f1edba2 100755
--- a/src/starboard/android/apk/app/cobalt-ninja.sh
+++ b/src/starboard/android/apk/app/cobalt-ninja.sh
@@ -19,7 +19,6 @@
 # https://cobalt.googlesource.com/cobalt/+/master/src/#Building-and-Running-the-Code
 
 # Allow for a developer-specific environment setup from .cobaltrc
-# e.g., it may set DEPOT_TOOLS and/or setup some distributed build tools.
 local_rc=$(dirname $0)/.cobaltrc
 global_rc=${HOME}/.cobaltrc
 if [ -r ${local_rc} ]; then
@@ -28,9 +27,6 @@
   source ${global_rc}
 fi
 
-# DEPOT_TOOLS may be set in .cobaltrc, otherwise assume it's in $HOME.
-[ -x ${DEPOT_TOOLS}/ninja ] || DEPOT_TOOLS=${HOME}/depot_tools
-
 # Use Cobalt's clang if it's not anywhere earlier in the PATH.
 SRC_DIR=$(cd $(dirname $0)/../../../..; pwd)
 PATH=$PATH:${SRC_DIR}/third_party/llvm-build/Release+Asserts/bin
@@ -42,6 +38,4 @@
   exit
 fi
 
-# When running in CMake, depot_tools isn't in the path, so we have to be
-# explicit about which ninja to run. Fail if we didn't find depot_tools.
-exec ${DEPOT_TOOLS}/ninja "$@"
+exec ninja "$@"
diff --git a/src/starboard/android/apk/build.id b/src/starboard/android/apk/build.id
index 258e9df..85e1550 100644
--- a/src/starboard/android/apk/build.id
+++ b/src/starboard/android/apk/build.id
@@ -1 +1 @@
-302142
\ No newline at end of file
+302995
\ No newline at end of file
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm/BUILD.gn
index 97c4786..dc694b6 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+static_library("starboard_platform") {
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+
+  public_deps = [ "//starboard/android/shared:starboard_platform" ]
 }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm/platform_configuration/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm/platform_configuration/BUILD.gn
index 97c4786..1b90f25 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm/platform_configuration/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+config("platform_configuration") {
+  configs = [ "//starboard/android/shared/platform_configuration" ]
+  cflags = [ "-march=armv7-a" ]
 }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm/platform_configuration/configuration.gni
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm/platform_configuration/configuration.gni
index 97c4786..92e7a77 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm/platform_configuration/configuration.gni
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
+import("//starboard/android/shared/platform_configuration/configuration.gni")
+
+android_abi = "armeabi-v7a"
+sabi_path = "//starboard/sabi/arm/softfp/sabi-v$sb_api_version.json"
diff --git a/src/starboard/android/arm/toolchain/BUILD.gn b/src/starboard/android/arm/toolchain/BUILD.gn
new file mode 100644
index 0000000..3fd54a6
--- /dev/null
+++ b/src/starboard/android/arm/toolchain/BUILD.gn
@@ -0,0 +1,39 @@
+# Copyright 2021 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.
+
+import("//build/toolchain/gcc_toolchain.gni")
+
+_home_dir = getenv("HOME")
+_clang_base_path = "$_home_dir/starboard-toolchains/x86_64-linux-gnu-clang-chromium-365097-f7e52fbd-8"
+
+clang_toolchain("host") {
+  clang_base_path = _clang_base_path
+}
+
+_android_toolchain_path =
+    "$android_ndk_path/toolchains/llvm/prebuilt/linux-x86_64"
+
+gcc_toolchain("target") {
+  prefix = rebase_path("$_android_toolchain_path/bin", root_build_dir)
+  cc = "$prefix/armv7a-linux-androideabi${android_ndk_api_level}-clang"
+  cxx = "$prefix/armv7a-linux-androideabi${android_ndk_api_level}-clang++"
+  ld = cxx
+  ar = "$prefix/arm-linux-androideabi-readelf"
+  ar = "$prefix/arm-linux-androideabi-ar"
+  nm = "$prefix/arm-linux-androideabi-nm"
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm64/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm64/BUILD.gn
index 97c4786..dc694b6 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm64/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+static_library("starboard_platform") {
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+
+  public_deps = [ "//starboard/android/shared:starboard_platform" ]
 }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm64/platform_configuration/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm64/platform_configuration/BUILD.gn
index 97c4786..6657de1 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm64/platform_configuration/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+config("platform_configuration") {
+  configs = [ "//starboard/android/shared/platform_configuration" ]
 }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm64/platform_configuration/configuration.gni
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm64/platform_configuration/configuration.gni
index 97c4786..13ca22c 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm64/platform_configuration/configuration.gni
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
+import("//starboard/android/shared/platform_configuration/configuration.gni")
+
+android_abi = "arm64-v8a"
+sabi_path = "//starboard/sabi/arm64/sabi-v$sb_api_version.json"
diff --git a/src/starboard/android/arm64/toolchain/BUILD.gn b/src/starboard/android/arm64/toolchain/BUILD.gn
new file mode 100644
index 0000000..8e33c5b
--- /dev/null
+++ b/src/starboard/android/arm64/toolchain/BUILD.gn
@@ -0,0 +1,39 @@
+# Copyright 2021 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.
+
+import("//build/toolchain/gcc_toolchain.gni")
+
+_home_dir = getenv("HOME")
+_clang_base_path = "$_home_dir/starboard-toolchains/x86_64-linux-gnu-clang-chromium-365097-f7e52fbd-8"
+
+clang_toolchain("host") {
+  clang_base_path = _clang_base_path
+}
+
+_android_toolchain_path =
+    "$android_ndk_path/toolchains/llvm/prebuilt/linux-x86_64"
+
+gcc_toolchain("target") {
+  prefix = rebase_path("$_android_toolchain_path/bin", root_build_dir)
+  cc = "$prefix/aarch64-linux-android${android_ndk_api_level}-clang"
+  cxx = "$prefix/aarch64-linux-android${android_ndk_api_level}-clang++"
+  ld = cxx
+  readelf = "$prefix/aarch64-linux-android-readelf"
+  ar = "$prefix/aarch64-linux-android-ar"
+  nm = "$prefix/aarch64-linux-android-nm"
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm64/vulkan/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm64/vulkan/BUILD.gn
index 97c4786..dc694b6 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm64/vulkan/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+static_library("starboard_platform") {
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+
+  public_deps = [ "//starboard/android/shared:starboard_platform" ]
 }
diff --git a/src/starboard/android/arm64/vulkan/platform_configuration/BUILD.gn b/src/starboard/android/arm64/vulkan/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..91aef50
--- /dev/null
+++ b/src/starboard/android/arm64/vulkan/platform_configuration/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright 2021 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.
+
+config("platform_configuration") {
+  configs = [ "//starboard/android/shared/platform_configuration" ]
+
+  if (current_toolchain == host_toolchain) {
+    libs = [
+      "c++_shared",
+      "EGL_angle",
+      "GLESv2_angle",
+      "GLESv1_CM_angle",
+      "feature_support_angle",
+    ]
+  }
+
+  ldflags = [
+    "-Wl",
+    "--verbose",
+    "-Llib",
+  ]
+}
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/arm64/vulkan/platform_configuration/configuration.gni
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/arm64/vulkan/platform_configuration/configuration.gni
index 97c4786..c6d6f73 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/arm64/vulkan/platform_configuration/configuration.gni
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
+import("//starboard/android/shared/platform_configuration/configuration.gni")
+
+android_abi = "arm64-v8a"
+sabi_path = "//starboard/sabi/arm64/sabi-v$sb_api_version.json"
+
+enable_vulkan = true
diff --git a/src/starboard/android/arm64/vulkan/toolchain/BUILD.gn b/src/starboard/android/arm64/vulkan/toolchain/BUILD.gn
new file mode 100644
index 0000000..8e33c5b
--- /dev/null
+++ b/src/starboard/android/arm64/vulkan/toolchain/BUILD.gn
@@ -0,0 +1,39 @@
+# Copyright 2021 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.
+
+import("//build/toolchain/gcc_toolchain.gni")
+
+_home_dir = getenv("HOME")
+_clang_base_path = "$_home_dir/starboard-toolchains/x86_64-linux-gnu-clang-chromium-365097-f7e52fbd-8"
+
+clang_toolchain("host") {
+  clang_base_path = _clang_base_path
+}
+
+_android_toolchain_path =
+    "$android_ndk_path/toolchains/llvm/prebuilt/linux-x86_64"
+
+gcc_toolchain("target") {
+  prefix = rebase_path("$_android_toolchain_path/bin", root_build_dir)
+  cc = "$prefix/aarch64-linux-android${android_ndk_api_level}-clang"
+  cxx = "$prefix/aarch64-linux-android${android_ndk_api_level}-clang++"
+  ld = cxx
+  readelf = "$prefix/aarch64-linux-android-readelf"
+  ar = "$prefix/aarch64-linux-android-ar"
+  nm = "$prefix/aarch64-linux-android-nm"
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/src/starboard/android/shared/BUILD.gn b/src/starboard/android/shared/BUILD.gn
new file mode 100644
index 0000000..76af15f
--- /dev/null
+++ b/src/starboard/android/shared/BUILD.gn
@@ -0,0 +1,475 @@
+# Copyright 2021 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.
+
+import("//starboard/shared/starboard/player/buildfiles.gni")
+
+declare_args() {
+  has_input_events_filter = false
+
+  has_drm_system_extension = false
+}
+
+config("starboard_platform_config") {
+  include_dirs = [ "bionic" ]
+}
+
+static_library("starboard_platform") {
+  sources = [
+    "$target_gen_dir/ndk-sources/cpu-features.c",
+    "//starboard/shared/dlmalloc/memory_map.cc",
+    "//starboard/shared/dlmalloc/memory_protect.cc",
+    "//starboard/shared/dlmalloc/memory_unmap.cc",
+    "//starboard/shared/egl/system_egl.cc",
+    "//starboard/shared/gcc/atomic_gcc_public.h",
+    "//starboard/shared/gles/gl_call.h",
+    "//starboard/shared/gles/system_gles2.cc",
+    "//starboard/shared/internal_only.h",
+    "//starboard/shared/iso/character_is_alphanumeric.cc",
+    "//starboard/shared/iso/character_is_digit.cc",
+    "//starboard/shared/iso/character_is_hex_digit.cc",
+    "//starboard/shared/iso/character_is_space.cc",
+    "//starboard/shared/iso/character_is_upper.cc",
+    "//starboard/shared/iso/character_to_lower.cc",
+    "//starboard/shared/iso/character_to_upper.cc",
+    "//starboard/shared/iso/double_absolute.cc",
+    "//starboard/shared/iso/double_exponent.cc",
+    "//starboard/shared/iso/double_floor.cc",
+    "//starboard/shared/iso/double_is_finite.cc",
+    "//starboard/shared/iso/double_is_nan.cc",
+    "//starboard/shared/iso/impl/directory_close.h",
+    "//starboard/shared/iso/impl/directory_get_next.h",
+    "//starboard/shared/iso/impl/directory_open.h",
+    "//starboard/shared/iso/memory_allocate_unchecked.cc",
+    "//starboard/shared/iso/memory_compare.cc",
+    "//starboard/shared/iso/memory_copy.cc",
+    "//starboard/shared/iso/memory_find_byte.cc",
+    "//starboard/shared/iso/memory_free.cc",
+    "//starboard/shared/iso/memory_move.cc",
+    "//starboard/shared/iso/memory_reallocate_unchecked.cc",
+    "//starboard/shared/iso/memory_set.cc",
+    "//starboard/shared/iso/string_compare.cc",
+    "//starboard/shared/iso/string_compare_all.cc",
+    "//starboard/shared/iso/string_find_character.cc",
+    "//starboard/shared/iso/string_find_last_character.cc",
+    "//starboard/shared/iso/string_find_string.cc",
+    "//starboard/shared/iso/string_get_length.cc",
+    "//starboard/shared/iso/string_get_length_wide.cc",
+    "//starboard/shared/iso/string_parse_double.cc",
+    "//starboard/shared/iso/string_parse_signed_integer.cc",
+    "//starboard/shared/iso/string_parse_uint64.cc",
+    "//starboard/shared/iso/string_parse_unsigned_integer.cc",
+    "//starboard/shared/iso/string_scan.cc",
+    "//starboard/shared/iso/system_binary_search.cc",
+    "//starboard/shared/iso/system_sort.cc",
+    "//starboard/shared/libevent/socket_waiter_add.cc",
+    "//starboard/shared/libevent/socket_waiter_create.cc",
+    "//starboard/shared/libevent/socket_waiter_destroy.cc",
+    "//starboard/shared/libevent/socket_waiter_internal.cc",
+    "//starboard/shared/libevent/socket_waiter_remove.cc",
+    "//starboard/shared/libevent/socket_waiter_wait.cc",
+    "//starboard/shared/libevent/socket_waiter_wait_timed.cc",
+    "//starboard/shared/libevent/socket_waiter_wake_up.cc",
+    "//starboard/shared/linux/byte_swap.cc",
+    "//starboard/shared/linux/cpu_features_get.cc",
+    "//starboard/shared/linux/memory_get_stack_bounds.cc",
+    "//starboard/shared/linux/page_internal.cc",
+    "//starboard/shared/linux/socket_get_interface_address.cc",
+    "//starboard/shared/linux/system_get_random_data.cc",
+    "//starboard/shared/linux/system_get_total_cpu_memory.cc",
+    "//starboard/shared/linux/system_get_used_cpu_memory.cc",
+    "//starboard/shared/linux/system_is_debugger_attached.cc",
+    "//starboard/shared/linux/system_symbolize.cc",
+    "//starboard/shared/linux/thread_get_id.cc",
+    "//starboard/shared/linux/thread_set_name.cc",
+    "//starboard/shared/nouser/user_get_current.cc",
+    "//starboard/shared/nouser/user_get_property.cc",
+    "//starboard/shared/nouser/user_get_signed_in.cc",
+    "//starboard/shared/nouser/user_internal.cc",
+    "//starboard/shared/nouser/user_internal.h",
+    "//starboard/shared/opus/opus_audio_decoder.cc",
+    "//starboard/shared/opus/opus_audio_decoder.h",
+    "//starboard/shared/posix/directory_create.cc",
+    "//starboard/shared/posix/file_atomic_replace.cc",
+    "//starboard/shared/posix/impl/file_can_open.h",
+    "//starboard/shared/posix/impl/file_close.h",
+    "//starboard/shared/posix/impl/file_delete.h",
+    "//starboard/shared/posix/impl/file_flush.h",
+    "//starboard/shared/posix/impl/file_get_info.h",
+    "//starboard/shared/posix/impl/file_get_path_info.h",
+    "//starboard/shared/posix/impl/file_open.h",
+    "//starboard/shared/posix/impl/file_read.h",
+    "//starboard/shared/posix/impl/file_seek.h",
+    "//starboard/shared/posix/impl/file_truncate.h",
+    "//starboard/shared/posix/impl/file_write.h",
+    "//starboard/shared/posix/memory_allocate_aligned_unchecked.cc",
+    "//starboard/shared/posix/memory_flush.cc",
+    "//starboard/shared/posix/memory_free_aligned.cc",
+    "//starboard/shared/posix/set_non_blocking_internal.cc",
+    "//starboard/shared/posix/socket_accept.cc",
+    "//starboard/shared/posix/socket_bind.cc",
+    "//starboard/shared/posix/socket_clear_last_error.cc",
+    "//starboard/shared/posix/socket_connect.cc",
+    "//starboard/shared/posix/socket_create.cc",
+    "//starboard/shared/posix/socket_destroy.cc",
+    "//starboard/shared/posix/socket_free_resolution.cc",
+    "//starboard/shared/posix/socket_get_last_error.cc",
+    "//starboard/shared/posix/socket_get_local_address.cc",
+    "//starboard/shared/posix/socket_internal.cc",
+    "//starboard/shared/posix/socket_is_connected.cc",
+    "//starboard/shared/posix/socket_is_connected_and_idle.cc",
+    "//starboard/shared/posix/socket_is_ipv6_supported.cc",
+    "//starboard/shared/posix/socket_join_multicast_group.cc",
+    "//starboard/shared/posix/socket_listen.cc",
+    "//starboard/shared/posix/socket_receive_from.cc",
+    "//starboard/shared/posix/socket_resolve.cc",
+    "//starboard/shared/posix/socket_send_to.cc",
+    "//starboard/shared/posix/socket_set_broadcast.cc",
+    "//starboard/shared/posix/socket_set_receive_buffer_size.cc",
+    "//starboard/shared/posix/socket_set_reuse_address.cc",
+    "//starboard/shared/posix/socket_set_send_buffer_size.cc",
+    "//starboard/shared/posix/socket_set_tcp_keep_alive.cc",
+    "//starboard/shared/posix/socket_set_tcp_no_delay.cc",
+    "//starboard/shared/posix/socket_set_tcp_window_scaling.cc",
+    "//starboard/shared/posix/storage_write_record.cc",
+    "//starboard/shared/posix/string_compare_no_case.cc",
+    "//starboard/shared/posix/string_compare_no_case_n.cc",
+    "//starboard/shared/posix/string_compare_wide.cc",
+    "//starboard/shared/posix/string_format.cc",
+    "//starboard/shared/posix/string_format_wide.cc",
+    "//starboard/shared/posix/system_break_into_debugger.cc",
+    "//starboard/shared/posix/system_clear_last_error.cc",
+    "//starboard/shared/posix/system_get_error_string.cc",
+    "//starboard/shared/posix/system_get_last_error.cc",
+    "//starboard/shared/posix/system_get_number_of_processors.cc",
+    "//starboard/shared/posix/thread_sleep.cc",
+    "//starboard/shared/posix/time_get_monotonic_now.cc",
+    "//starboard/shared/posix/time_get_monotonic_thread_now.cc",
+    "//starboard/shared/posix/time_get_now.cc",
+    "//starboard/shared/posix/time_is_time_thread_now_supported.cc",
+    "//starboard/shared/posix/time_zone_get_current.cc",
+    "//starboard/shared/pthread/condition_variable_broadcast.cc",
+    "//starboard/shared/pthread/condition_variable_create.cc",
+    "//starboard/shared/pthread/condition_variable_destroy.cc",
+    "//starboard/shared/pthread/condition_variable_signal.cc",
+    "//starboard/shared/pthread/condition_variable_wait.cc",
+    "//starboard/shared/pthread/condition_variable_wait_timed.cc",
+    "//starboard/shared/pthread/mutex_acquire.cc",
+    "//starboard/shared/pthread/mutex_acquire_try.cc",
+    "//starboard/shared/pthread/mutex_create.cc",
+    "//starboard/shared/pthread/mutex_destroy.cc",
+    "//starboard/shared/pthread/mutex_release.cc",
+    "//starboard/shared/pthread/once.cc",
+    "//starboard/shared/pthread/thread_create_local_key.cc",
+    "//starboard/shared/pthread/thread_create_priority.h",
+    "//starboard/shared/pthread/thread_destroy_local_key.cc",
+    "//starboard/shared/pthread/thread_detach.cc",
+    "//starboard/shared/pthread/thread_get_current.cc",
+    "//starboard/shared/pthread/thread_get_local_value.cc",
+    "//starboard/shared/pthread/thread_is_equal.cc",
+    "//starboard/shared/pthread/thread_join.cc",
+    "//starboard/shared/pthread/thread_set_local_value.cc",
+    "//starboard/shared/pthread/thread_yield.cc",
+    "//starboard/shared/pthread/types_public.h",
+    "//starboard/shared/signal/crash_signals.h",
+    "//starboard/shared/signal/crash_signals_sigaction.cc",
+    "//starboard/shared/signal/suspend_signals.cc",
+    "//starboard/shared/signal/suspend_signals.h",
+    "//starboard/shared/signal/system_request_conceal.cc",
+    "//starboard/shared/signal/system_request_freeze_no_freezedone_callback.cc",
+    "//starboard/shared/starboard/application.cc",
+    "//starboard/shared/starboard/application.h",
+    "//starboard/shared/starboard/audio_sink/audio_sink_create.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_destroy.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_internal.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_internal.h",
+    "//starboard/shared/starboard/audio_sink/audio_sink_is_valid.cc",
+    "//starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc",
+    "//starboard/shared/starboard/audio_sink/stub_audio_sink_type.h",
+    "//starboard/shared/starboard/command_line.cc",
+    "//starboard/shared/starboard/command_line.h",
+    "//starboard/shared/starboard/directory_can_open.cc",
+    "//starboard/shared/starboard/drm/drm_close_session.cc",
+    "//starboard/shared/starboard/drm/drm_destroy_system.cc",
+    "//starboard/shared/starboard/drm/drm_generate_session_update_request.cc",
+    "//starboard/shared/starboard/drm/drm_get_metrics.cc",
+    "//starboard/shared/starboard/drm/drm_is_server_certificate_updatable.cc",
+    "//starboard/shared/starboard/drm/drm_system_internal.h",
+    "//starboard/shared/starboard/drm/drm_update_server_certificate.cc",
+    "//starboard/shared/starboard/drm/drm_update_session.cc",
+    "//starboard/shared/starboard/event_cancel.cc",
+    "//starboard/shared/starboard/event_schedule.cc",
+    "//starboard/shared/starboard/file_atomic_replace_write_file.cc",
+    "//starboard/shared/starboard/file_atomic_replace_write_file.h",
+    "//starboard/shared/starboard/file_mode_string_to_flags.cc",
+    "//starboard/shared/starboard/file_storage/storage_close_record.cc",
+    "//starboard/shared/starboard/file_storage/storage_delete_record.cc",
+    "//starboard/shared/starboard/file_storage/storage_get_record_size.cc",
+    "//starboard/shared/starboard/file_storage/storage_open_record.cc",
+    "//starboard/shared/starboard/file_storage/storage_read_record.cc",
+    "//starboard/shared/starboard/log_mutex.cc",
+    "//starboard/shared/starboard/log_mutex.h",
+    "//starboard/shared/starboard/log_raw_dump_stack.cc",
+    "//starboard/shared/starboard/log_raw_format.cc",
+    "//starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc",
+    "//starboard/shared/starboard/media/media_get_audio_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_alignment.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_padding.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_storage_type.cc",
+    "//starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_get_video_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc",
+    "//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
+    "//starboard/shared/starboard/media/mime_type.cc",
+    "//starboard/shared/starboard/media/mime_type.h",
+    "//starboard/shared/starboard/memory.cc",
+    "//starboard/shared/starboard/microphone/microphone_close.cc",
+    "//starboard/shared/starboard/microphone/microphone_create.cc",
+    "//starboard/shared/starboard/microphone/microphone_destroy.cc",
+    "//starboard/shared/starboard/microphone/microphone_get_available.cc",
+    "//starboard/shared/starboard/microphone/microphone_internal.h",
+    "//starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc",
+    "//starboard/shared/starboard/microphone/microphone_open.cc",
+    "//starboard/shared/starboard/microphone/microphone_read.cc",
+    "//starboard/shared/starboard/new.cc",
+    "//starboard/shared/starboard/queue_application.cc",
+    "//starboard/shared/starboard/queue_application.h",
+    "//starboard/shared/starboard/string_concat.cc",
+    "//starboard/shared/starboard/string_concat_wide.cc",
+    "//starboard/shared/starboard/string_copy.cc",
+    "//starboard/shared/starboard/string_copy_wide.cc",
+    "//starboard/shared/starboard/string_duplicate.cc",
+    "//starboard/shared/starboard/system_get_random_uint64.cc",
+    "//starboard/shared/starboard/system_supports_resume.cc",
+    "//starboard/shared/starboard/thread_checker.h",
+    "//starboard/shared/starboard/window_set_default_options.cc",
+    "//starboard/shared/stub/cryptography_create_transformer.cc",
+    "//starboard/shared/stub/cryptography_destroy_transformer.cc",
+    "//starboard/shared/stub/cryptography_get_tag.cc",
+    "//starboard/shared/stub/cryptography_set_authenticated_data.cc",
+    "//starboard/shared/stub/cryptography_set_initialization_vector.cc",
+    "//starboard/shared/stub/cryptography_transform.cc",
+    "//starboard/shared/stub/image_decode.cc",
+    "//starboard/shared/stub/image_is_decode_supported.cc",
+    "//starboard/shared/stub/media_set_audio_write_duration.cc",
+    "//starboard/shared/stub/system_get_total_gpu_memory.cc",
+    "//starboard/shared/stub/system_get_used_gpu_memory.cc",
+    "//starboard/shared/stub/system_hide_splash_screen.cc",
+    "//starboard/shared/stub/system_request_blur.cc",
+    "//starboard/shared/stub/system_request_focus.cc",
+    "//starboard/shared/stub/system_request_pause.cc",
+    "//starboard/shared/stub/system_request_reveal.cc",
+    "//starboard/shared/stub/system_request_unpause.cc",
+    "//starboard/shared/stub/system_sign_with_certification_secret_key.cc",
+    "//starboard/shared/stub/thread_context_get_pointer.cc",
+    "//starboard/shared/stub/thread_sampler_create.cc",
+    "//starboard/shared/stub/thread_sampler_destroy.cc",
+    "//starboard/shared/stub/thread_sampler_freeze.cc",
+    "//starboard/shared/stub/thread_sampler_is_supported.cc",
+    "//starboard/shared/stub/thread_sampler_thaw.cc",
+    "//starboard/shared/stub/ui_nav_get_interface.cc",
+    "accessibility_get_caption_settings.cc",
+    "accessibility_get_display_settings.cc",
+    "accessibility_get_text_to_speech_settings.cc",
+    "accessibility_set_captions_enabled.cc",
+    "android_main.cc",
+    "android_media_session_client.cc",
+    "application_android.cc",
+    "application_android.h",
+    "atomic_public.h",
+    "audio_decoder.cc",
+    "audio_decoder.h",
+    "audio_sink_get_max_channels.cc",
+    "audio_sink_get_min_buffer_size_in_frames.cc",
+    "audio_sink_get_nearest_supported_sample_frequency.cc",
+    "audio_sink_is_audio_frame_storage_type_supported.cc",
+    "audio_sink_is_audio_sample_type_supported.cc",
+    "audio_sink_min_required_frames_tester.cc",
+    "audio_sink_min_required_frames_tester.h",
+    "audio_track_audio_sink_type.cc",
+    "audio_track_audio_sink_type.h",
+    "bionic/bionic_netlink.cpp",
+    "bionic/bionic_netlink.h",
+    "bionic/ifaddrs.cpp",
+    "bionic/ifaddrs.h",
+    "bionic/net_if.cpp",
+    "bionic/private/ErrnoRestorer.h",
+    "bionic/private/bionic_macros.h",
+    "configuration.cc",
+    "configuration.h",
+    "configuration_constants.cc",
+    "configuration_public.h",
+    "decode_target_create.cc",
+    "decode_target_create.h",
+    "decode_target_get_info.cc",
+    "decode_target_internal.cc",
+    "decode_target_internal.h",
+    "decode_target_release.cc",
+    "directory_close.cc",
+    "directory_get_next.cc",
+    "directory_internal.h",
+    "directory_open.cc",
+    "drm_system.cc",
+    "drm_system.h",
+    "egl_swap_buffers.cc",
+    "file_can_open.cc",
+    "file_close.cc",
+    "file_delete.cc",
+    "file_exists.cc",
+    "file_flush.cc",
+    "file_get_info.cc",
+    "file_get_path_info.cc",
+    "file_internal.cc",
+    "file_internal.h",
+    "file_open.cc",
+    "file_read.cc",
+    "file_seek.cc",
+    "file_truncate.cc",
+    "file_write.cc",
+    "get_home_directory.cc",
+    "input_events_generator.cc",
+    "input_events_generator.h",
+    "jni_env_ext.cc",
+    "jni_env_ext.h",
+    "jni_utils.h",
+    "log.cc",
+    "log_flush.cc",
+    "log_format.cc",
+    "log_internal.cc",
+    "log_internal.h",
+    "log_is_tty.cc",
+    "log_raw.cc",
+    "main.cc",
+    "media_codec_bridge.cc",
+    "media_codec_bridge.h",
+    "media_common.h",
+    "media_decoder.cc",
+    "media_decoder.h",
+    "media_get_audio_configuration.cc",
+    "media_get_audio_output_count.cc",
+    "media_get_initial_buffer_capacity.cc",
+    "media_get_max_buffer_capacity.cc",
+    "media_is_audio_supported.cc",
+    "media_is_video_supported.cc",
+    "microphone_impl.cc",
+    "network_status_impl.cc",
+    "platform_service.cc",
+    "player_components_factory.h",
+    "player_create.cc",
+    "player_destroy.cc",
+    "player_get_preferred_output_mode.cc",
+    "player_set_bounds.cc",
+    "player_set_playback_rate.cc",
+    "sanitizer_options.cc",
+    "speech_synthesis_cancel.cc",
+    "speech_synthesis_internal.cc",
+    "speech_synthesis_is_supported.cc",
+    "speech_synthesis_speak.cc",
+    "system_get_connection_type.cc",
+    "system_get_device_type.cc",
+    "system_get_extensions.cc",
+    "system_get_locale_id.cc",
+    "system_get_path.cc",
+    "system_get_property.cc",
+    "system_get_stack.cc",
+    "system_has_capability.cc",
+    "system_network_is_disconnected.cc",
+    "system_platform_error.cc",
+    "system_request_stop.cc",
+    "system_request_suspend.cc",
+    "thread_create.cc",
+    "thread_create_priority.cc",
+    "thread_get_name.cc",
+    "thread_types_public.h",
+    "time_zone_get_name.cc",
+    "trace_util.h",
+    "video_decoder.cc",
+    "video_decoder.h",
+    "video_frame_tracker.cc",
+    "video_frame_tracker.h",
+    "video_render_algorithm.cc",
+    "video_render_algorithm.h",
+    "video_window.cc",
+    "video_window.h",
+    "window_blur_on_screen_keyboard.cc",
+    "window_create.cc",
+    "window_destroy.cc",
+    "window_focus_on_screen_keyboard.cc",
+    "window_get_diagonal_size_in_inches.cc",
+    "window_get_on_screen_keyboard_bounding_rect.cc",
+    "window_get_platform_handle.cc",
+    "window_get_size.cc",
+    "window_hide_on_screen_keyboard.cc",
+    "window_internal.h",
+    "window_is_on_screen_keyboard_shown.cc",
+    "window_on_screen_keyboard_is_supported.cc",
+    "window_on_screen_keyboard_suggestions_supported.cc",
+    "window_set_on_screen_keyboard_keep_focus.cc",
+    "window_show_on_screen_keyboard.cc",
+    "window_update_on_screen_keyboard_suggestions.cc",
+  ]
+
+  sources += common_player_sources
+
+  sources -= [
+    "//starboard/shared/starboard/player/player_create.cc",
+    "//starboard/shared/starboard/player/player_destroy.cc",
+    "//starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc",
+    "//starboard/shared/starboard/player/player_set_bounds.cc",
+    "//starboard/shared/starboard/player/player_set_playback_rate.cc",
+  ]
+
+  if (has_drm_system_extension) {
+    # TODO(andrewsavage)
+  } else {
+    sources += [
+      "drm_create_system.cc",
+      "media_is_supported.cc",
+      "player_components_factory.cc",
+    ]
+  }
+
+  configs += [
+    ":starboard_platform_config",
+    "//starboard/build/config:starboard_implementation",
+  ]
+
+  public_deps = [
+    ":ndk_sources",
+    ":starboard_base_symbolize",
+    "//starboard/common",
+    "//starboard/shared/starboard/media:media_util",
+    "//starboard/shared/starboard/player/filter:filter_based_player_sources",
+  ]
+
+  deps = [
+    "//third_party/libevent",
+    "//third_party/opus",
+  ]
+}
+
+static_library("starboard_base_symbolize") {
+  sources = [
+    "//base/third_party/symbolize/demangle.cc",
+    "//base/third_party/symbolize/symbolize.cc",
+  ]
+
+  public_deps = [ "//starboard/elf_loader:evergreen_info" ]
+}
+
+copy("ndk_sources") {
+  sources = [ "$android_ndk_path/sources/android/cpufeatures/cpu-features.c" ]
+  outputs = [ "$target_gen_dir/ndk-sources/{{source_file_part}}" ]
+}
diff --git a/src/starboard/android/shared/accessibility_get_caption_settings.cc b/src/starboard/android/shared/accessibility_get_caption_settings.cc
index dac3d5d..aef7535 100644
--- a/src/starboard/android/shared/accessibility_get_caption_settings.cc
+++ b/src/starboard/android/shared/accessibility_get_caption_settings.cc
@@ -20,8 +20,8 @@
 #include "starboard/android/shared/jni_env_ext.h"
 #include "starboard/android/shared/jni_utils.h"
 #include "starboard/common/log.h"
+#include "starboard/common/memory.h"
 #include "starboard/configuration.h"
-#include "starboard/memory.h"
 #include "starboard/shared/starboard/accessibility_internal.h"
 
 using starboard::android::shared::JniEnvExt;
@@ -104,8 +104,8 @@
 bool SbAccessibilityGetCaptionSettings(
     SbAccessibilityCaptionSettings* caption_settings) {
   if (!caption_settings ||
-      !SbMemoryIsZero(caption_settings,
-                      sizeof(SbAccessibilityCaptionSettings))) {
+      !starboard::common::MemoryIsZero(
+          caption_settings, sizeof(SbAccessibilityCaptionSettings))) {
     return false;
   }
 
diff --git a/src/starboard/android/shared/accessibility_get_display_settings.cc b/src/starboard/android/shared/accessibility_get_display_settings.cc
index d3d10e7..bc753b1 100644
--- a/src/starboard/android/shared/accessibility_get_display_settings.cc
+++ b/src/starboard/android/shared/accessibility_get_display_settings.cc
@@ -15,15 +15,15 @@
 #include "starboard/accessibility.h"
 
 #include "starboard/android/shared/jni_env_ext.h"
-#include "starboard/memory.h"
+#include "starboard/common/memory.h"
 
 using starboard::android::shared::JniEnvExt;
 
 bool SbAccessibilityGetDisplaySettings(
     SbAccessibilityDisplaySettings* out_setting) {
   if (!out_setting ||
-      !SbMemoryIsZero(out_setting,
-                      sizeof(SbAccessibilityDisplaySettings))) {
+      !starboard::common::MemoryIsZero(
+          out_setting, sizeof(SbAccessibilityDisplaySettings))) {
     return false;
   }
 
diff --git a/src/starboard/android/shared/accessibility_get_text_to_speech_settings.cc b/src/starboard/android/shared/accessibility_get_text_to_speech_settings.cc
index 8f64452..2f476c6 100644
--- a/src/starboard/android/shared/accessibility_get_text_to_speech_settings.cc
+++ b/src/starboard/android/shared/accessibility_get_text_to_speech_settings.cc
@@ -16,7 +16,7 @@
 
 #include "starboard/android/shared/jni_env_ext.h"
 #include "starboard/android/shared/jni_utils.h"
-#include "starboard/memory.h"
+#include "starboard/common/memory.h"
 
 using starboard::android::shared::JniEnvExt;
 using starboard::android::shared::ScopedLocalJavaRef;
@@ -24,8 +24,8 @@
 bool SbAccessibilityGetTextToSpeechSettings(
     SbAccessibilityTextToSpeechSettings* out_setting) {
   if (!out_setting ||
-      !SbMemoryIsZero(out_setting,
-                      sizeof(SbAccessibilityTextToSpeechSettings))) {
+      !starboard::common::MemoryIsZero(
+          out_setting, sizeof(SbAccessibilityTextToSpeechSettings))) {
     return false;
   }
 
@@ -36,9 +36,8 @@
       env->CallStarboardObjectMethodOrAbort(
           "getTextToSpeechHelper",
           "()Ldev/cobalt/coat/CobaltTextToSpeechHelper;"));
-  out_setting->is_text_to_speech_enabled =
-      env->CallBooleanMethodOrAbort(j_tts_helper.Get(),
-          "isScreenReaderEnabled", "()Z");
+  out_setting->is_text_to_speech_enabled = env->CallBooleanMethodOrAbort(
+      j_tts_helper.Get(), "isScreenReaderEnabled", "()Z");
 
   return true;
 }
diff --git a/src/starboard/android/shared/application_android.cc b/src/starboard/android/shared/application_android.cc
index 521402e..2c4cda0 100644
--- a/src/starboard/android/shared/application_android.cc
+++ b/src/starboard/android/shared/application_android.cc
@@ -300,7 +300,7 @@
       // (because the user exits and enters the app) so we check
       // for changes here.
       SbAccessibilityDisplaySettings settings;
-      SbMemorySet(&settings, 0, sizeof(settings));
+      memset(&settings, 0, sizeof(settings));
       if (!SbAccessibilityGetDisplaySettings(&settings)) {
         break;
       }
@@ -537,7 +537,7 @@
                                                 bool is_composing) {
   char* text = SbStringDuplicate(input_text);
   SbInputData* data = new SbInputData();
-  SbMemorySet(data, 0, sizeof(*data));
+  memset(data, 0, sizeof(*data));
   data->window = window_;
   data->type = kSbInputEventTypeInput;
   data->device_type = kSbInputDeviceTypeOnScreenKeyboard;
@@ -553,7 +553,7 @@
 bool ApplicationAndroid::OnSearchRequested() {
   for (int i = 0; i < 2; i++) {
     SbInputData* data = new SbInputData();
-    SbMemorySet(data, 0, sizeof(*data));
+    memset(data, 0, sizeof(*data));
     data->window = window_;
     data->key = kSbKeyBrowserSearch;
     data->type = (i == 0) ? kSbInputEventTypePress : kSbInputEventTypeUnpress;
diff --git a/src/starboard/android/shared/audio_decoder.cc b/src/starboard/android/shared/audio_decoder.cc
index e42874b..2ad0bff 100644
--- a/src/starboard/android/shared/audio_decoder.cc
+++ b/src/starboard/android/shared/audio_decoder.cc
@@ -213,7 +213,7 @@
         kSbMediaAudioFrameStorageTypeInterleaved,
         dequeue_output_result.presentation_time_microseconds, size);
 
-    SbMemoryCopy(decoded_audio->buffer(), data, size);
+    memcpy(decoded_audio->buffer(), data, size);
 
     {
       starboard::ScopedLock lock(decoded_audios_mutex_);
diff --git a/src/starboard/android/shared/cobalt/configuration.py b/src/starboard/android/shared/cobalt/configuration.py
index f9cf7d7..7cc5299 100644
--- a/src/starboard/android/shared/cobalt/configuration.py
+++ b/src/starboard/android/shared/cobalt/configuration.py
@@ -30,8 +30,8 @@
       if os.path.basename(include) == 'configuration.gypi':
         return includes
 
-    shared_gypi_path = os.path.join(os.path.dirname(__file__),
-                                    'configuration.gypi')
+    shared_gypi_path = os.path.join(
+        os.path.dirname(__file__), 'configuration.gypi')
     if os.path.isfile(shared_gypi_path):
       includes.append(shared_gypi_path)
     return includes
@@ -47,13 +47,20 @@
 
   def GetTestEnvVariables(self):
     return {
-        'base_unittests': {'ASAN_OPTIONS': 'detect_leaks=0'},
-        'crypto_unittests': {'ASAN_OPTIONS': 'detect_leaks=0'},
-        'net_unittests': {'ASAN_OPTIONS': 'detect_leaks=0'}
+        'base_unittests': {
+            'ASAN_OPTIONS': 'detect_leaks=0'
+        },
+        'crypto_unittests': {
+            'ASAN_OPTIONS': 'detect_leaks=0'
+        },
+        'net_unittests': {
+            'ASAN_OPTIONS': 'detect_leaks=0'
+        }
     }
 
   def GetWebPlatformTestFilters(self):
-    filters = super(CobaltAndroidConfiguration, self).GetWebPlatformTestFilters()
+    filters = super(CobaltAndroidConfiguration,
+                    self).GetWebPlatformTestFilters()
     filters += [
         # Test Name (content-security-policy/media-src/media-src-allowed.html):
         # Allowed media src
@@ -71,6 +78,7 @@
           # have the update (Emoji 11.0) NotoColorEmoji.ttf installed.
           'CSS3FontsLayoutTests/Layout.Test/color_emojis_should_render_properly'
       ],
+      'crypto_unittests': ['P224.*'],
       'renderer_test': [
           # Instead of returning an error when allocating too much texture
           # memory, Android instead just terminates the process.  Since this
@@ -87,5 +95,6 @@
           #
           # See: starboard/android/shared/file_internal.cc.
           'ZipTest.Zip*',
+          'ZipReaderTest.ExtractToFileAsync_RegularFile',
       ],
   }
diff --git a/src/starboard/android/shared/decode_target_get_info.cc b/src/starboard/android/shared/decode_target_get_info.cc
index 38ded1a..e5f7089 100644
--- a/src/starboard/android/shared/decode_target_get_info.cc
+++ b/src/starboard/android/shared/decode_target_get_info.cc
@@ -13,17 +13,17 @@
 // limitations under the License.
 
 #include "starboard/android/shared/decode_target_internal.h"
+#include "starboard/common/memory.h"
 #include "starboard/decode_target.h"
-#include "starboard/memory.h"
 
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target,
                            SbDecodeTargetInfo* out_info) {
-  if (!SbMemoryIsZero(out_info, sizeof(*out_info))) {
+  if (!starboard::common::MemoryIsZero(out_info, sizeof(*out_info))) {
     SB_DCHECK(false) << "out_info must be zeroed out.";
     return false;
   }
 
-  SbMemoryCopy(out_info, &decode_target->data->info, sizeof(*out_info));
+  memcpy(out_info, &decode_target->data->info, sizeof(*out_info));
 
   return true;
 }
diff --git a/src/starboard/android/shared/directory_get_next.cc b/src/starboard/android/shared/directory_get_next.cc
index 9cab292..2dfc5a0 100644
--- a/src/starboard/android/shared/directory_get_next.cc
+++ b/src/starboard/android/shared/directory_get_next.cc
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "starboard/common/string.h"
 #include "starboard/directory.h"
 
 #include <android/asset_manager.h>
@@ -30,7 +31,7 @@
     if (file_name == NULL) {
       return false;
     }
-    SbStringCopy(out_entry, file_name, out_entry_size);
+    starboard::strlcpy(out_entry, file_name, out_entry_size);
     return true;
   }
 
diff --git a/src/starboard/android/shared/drm_system.cc b/src/starboard/android/shared/drm_system.cc
index e196128..a2edadd 100644
--- a/src/starboard/android/shared/drm_system.cc
+++ b/src/starboard/android/shared/drm_system.cc
@@ -67,8 +67,8 @@
   if (left.identifier_size != right.identifier_size) {
     return false;
   }
-  return SbMemoryCompare(left.identifier, right.identifier,
-                         left.identifier_size) == 0;
+  return memcmp(left.identifier, right.identifier,
+                left.identifier_size) == 0;
 }
 
 extern "C" SB_EXPORT_PLATFORM void
@@ -128,7 +128,7 @@
     SB_DCHECK(key_id_elements);
 
     SB_DCHECK(key_id_size <= sizeof(drm_key_ids[i].identifier));
-    SbMemoryCopy(drm_key_ids[i].identifier, key_id_elements, key_id_size);
+    memcpy(drm_key_ids[i].identifier, key_id_elements, key_id_size);
     env->ReleaseByteArrayElements(j_key_id, key_id_elements, JNI_ABORT);
     drm_key_ids[i].identifier_size = key_id_size;
 
diff --git a/src/starboard/android/shared/file_internal.cc b/src/starboard/android/shared/file_internal.cc
index 1fb84ad..06b10b9 100644
--- a/src/starboard/android/shared/file_internal.cc
+++ b/src/starboard/android/shared/file_internal.cc
@@ -108,9 +108,9 @@
 }
 
 bool IsAndroidAssetPath(const char* path) {
-  size_t prefix_len = SbStringGetLength(g_app_assets_dir);
+  size_t prefix_len = strlen(g_app_assets_dir);
   return path != NULL
-      && SbStringCompare(g_app_assets_dir, path, prefix_len) == 0
+      && strncmp(g_app_assets_dir, path, prefix_len) == 0
       && (path[prefix_len] == '/' || path[prefix_len] == '\0');
 }
 
@@ -118,7 +118,7 @@
   if (!IsAndroidAssetPath(path) || g_asset_manager == NULL) {
     return NULL;
   }
-  const char* asset_path = path + SbStringGetLength(g_app_assets_dir) + 1;
+  const char* asset_path = path + strlen(g_app_assets_dir) + 1;
   return AAssetManager_open(g_asset_manager, asset_path, AASSET_MODE_RANDOM);
 }
 
@@ -128,7 +128,7 @@
   if (!IsAndroidAssetPath(path) || g_asset_manager == NULL) {
     return NULL;
   }
-  const char* asset_path = path + SbStringGetLength(g_app_assets_dir);
+  const char* asset_path = path + strlen(g_app_assets_dir);
   if (*asset_path == '/') {
     asset_path++;
   }
diff --git a/src/starboard/android/shared/get_home_directory.cc b/src/starboard/android/shared/get_home_directory.cc
index 9e3bb90..b9987e9 100644
--- a/src/starboard/android/shared/get_home_directory.cc
+++ b/src/starboard/android/shared/get_home_directory.cc
@@ -34,7 +34,7 @@
 // providing a single cookie store no matter what any particular web app does to
 // present signing in as different users.
 bool GetHomeDirectory(SbUser user, char* out_path, int path_size) {
-  int len = SbStringCopy(out_path, g_app_files_dir, path_size);
+  int len = starboard::strlcpy(out_path, g_app_files_dir, path_size);
   return len < path_size;
 }
 
diff --git a/src/starboard/android/shared/input_events_generator.cc b/src/starboard/android/shared/input_events_generator.cc
index abb28fd..f749a96 100644
--- a/src/starboard/android/shared/input_events_generator.cc
+++ b/src/starboard/android/shared/input_events_generator.cc
@@ -77,7 +77,7 @@
     SbKeyLocation location,
     const SbInputVector& input_vector) {
   std::unique_ptr<SbInputData> data(new SbInputData());
-  SbMemorySet(data.get(), 0, sizeof(*data));
+  memset(data.get(), 0, sizeof(*data));
 
   // window
   data->window = window;
@@ -488,7 +488,7 @@
   }
 
   std::unique_ptr<SbInputData> data(new SbInputData());
-  SbMemorySet(data.get(), 0, sizeof(*data));
+  memset(data.get(), 0, sizeof(*data));
 
   // window
   data->window = window;
@@ -693,7 +693,7 @@
       AMotionEvent_getAxisValue(android_event, AMOTION_EVENT_AXIS_Y, 0);
 
   std::unique_ptr<SbInputData> data(new SbInputData());
-  SbMemorySet(data.get(), 0, sizeof(*data));
+  memset(data.get(), 0, sizeof(*data));
 
   data->window = window_;
   SB_DCHECK(SbWindowIsValid(data->window));
@@ -895,7 +895,7 @@
 
   // Press event
   std::unique_ptr<SbInputData> data(new SbInputData());
-  SbMemorySet(data.get(), 0, sizeof(*data));
+  memset(data.get(), 0, sizeof(*data));
 
   data->window = window_;
   data->type = kSbInputEventTypePress;
@@ -913,7 +913,7 @@
 
   // Unpress event
   data.reset(new SbInputData());
-  SbMemorySet(data.get(), 0, sizeof(*data));
+  memset(data.get(), 0, sizeof(*data));
 
   data->window = window_;
   data->type = kSbInputEventTypeUnpress;
diff --git a/src/starboard/android/shared/install_target.gni b/src/starboard/android/shared/install_target.gni
new file mode 100644
index 0000000..4111a06
--- /dev/null
+++ b/src/starboard/android/shared/install_target.gni
@@ -0,0 +1,98 @@
+# Copyright 2021 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.
+
+template("install_target") {
+  not_needed(invoker, [ "type" ])
+  content_dir = "usr/share/cobalt"
+
+  action("build_${target_name}_apk") {
+    forward_variables_from(invoker,
+                           [
+                             "installable_target_name",
+                             "testonly",
+                           ])
+    deps = [
+      ":$installable_target_name",
+      "//starboard/android/apk:apk_sources",
+    ]
+
+    target_output = "$root_out_dir/lib${installable_target_name}.so"
+    gradle_files_dir = "$root_out_dir/gradle/$installable_target_name"
+    if (is_gold) {
+      gradle_build_type = "release"
+    } else {
+      gradle_build_type = build_type
+    }
+
+    sources = [
+      "$root_out_dir/gradle/apk_sources.stamp",
+      target_output,
+    ]
+
+    outputs = [ "$root_out_dir/${installable_target_name}.apk" ]
+
+    cobalt_project_dir =
+        string_join("/",
+                    [
+                      root_build_dir,
+                      rebase_path("//starboard/android/apk", root_build_dir),
+                    ])
+    cobalt_deploy_apk = string_join("/",
+                                    [
+                                      root_build_dir,
+                                      rebase_path(outputs[0], root_build_dir),
+                                    ])
+    cobalt_content_dir =
+        string_join("/",
+                    [
+                      root_build_dir,
+                      rebase_path("$sb_install_output_dir/$content_dir",
+                                  root_build_dir),
+                    ])
+    cobalt_gradle_dir =
+        string_join("/",
+                    [
+                      root_build_dir,
+                      rebase_path(gradle_files_dir, root_build_dir),
+                    ])
+
+    script = "//starboard/build/run_bash.py"
+    bash_script =
+        rebase_path("//starboard/android/apk/cobalt-gradle.sh", root_build_dir)
+    args = [
+      bash_script,
+      "--sdk",
+      android_sdk_path,
+      "--cache",
+      cobalt_gradle_dir,
+      "--project-dir",
+      cobalt_project_dir,
+      "-P",
+      "cobaltBuildAbi=$android_abi",
+      "-P",
+      "cobaltDeployApk=$cobalt_deploy_apk",
+      "-P",
+      "cobaltContentDir=$cobalt_content_dir",
+      "-P",
+      "cobaltGradleDir=$cobalt_gradle_dir",
+      "-P",
+      "cobaltProductDir=$root_out_dir",
+      "-P",
+      "cobaltTarget=$installable_target_name",
+      "-P",
+      "enableVulkan=$enable_vulkan",
+      "assembleCobalt_$gradle_build_type",
+    ]
+  }
+}
diff --git a/src/starboard/android/shared/jni_utils.h b/src/starboard/android/shared/jni_utils.h
index 2dae0c1..5152801 100644
--- a/src/starboard/android/shared/jni_utils.h
+++ b/src/starboard/android/shared/jni_utils.h
@@ -73,7 +73,7 @@
   void CopyInto(const void* source, jint count) {
     SB_DCHECK(!IsNull());
     SB_DCHECK(count >= 0 && count <= capacity());
-    SbMemoryCopy(address(), source, count);
+    memcpy(address(), source, count);
   }
 
  private:
diff --git a/src/starboard/android/shared/log_format.cc b/src/starboard/android/shared/log_format.cc
index 447a376..bcebdf5 100644
--- a/src/starboard/android/shared/log_format.cc
+++ b/src/starboard/android/shared/log_format.cc
@@ -37,7 +37,7 @@
   char formatted_buffer[kFormatBufferSizeBytes];
   vsprintf(formatted_buffer, format, arguments);
 
-  const char* newline = SbStringFindCharacter(formatted_buffer, '\n');
+  const char* newline = strchr(formatted_buffer, '\n');
 
   SbMutexAcquire(&log_line_mutex);
   std::string buffer_string(formatted_buffer);
diff --git a/src/starboard/android/shared/media_common.h b/src/starboard/android/shared/media_common.h
index b2223e5..02feffb 100644
--- a/src/starboard/android/shared/media_common.h
+++ b/src/starboard/android/shared/media_common.h
@@ -33,12 +33,12 @@
 const int64_t kSecondInMicroseconds = 1000 * 1000;
 
 inline bool IsWidevineL1(const char* key_system) {
-  return SbStringCompareAll(key_system, "com.widevine") == 0 ||
-         SbStringCompareAll(key_system, "com.widevine.alpha") == 0;
+  return strcmp(key_system, "com.widevine") == 0 ||
+         strcmp(key_system, "com.widevine.alpha") == 0;
 }
 
 inline bool IsWidevineL3(const char* key_system) {
-  return SbStringCompareAll(key_system, "com.youtube.widevine.l3") == 0;
+  return strcmp(key_system, "com.youtube.widevine.l3") == 0;
 }
 
 // Map a supported |SbMediaAudioCodec| into its corresponding mime type
diff --git a/src/starboard/android/shared/media_is_supported.cc b/src/starboard/android/shared/media_is_supported.cc
index 42aa227..14db015 100644
--- a/src/starboard/android/shared/media_is_supported.cc
+++ b/src/starboard/android/shared/media_is_supported.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/media.h"
+#include "starboard/shared/starboard/media/media_support_internal.h"
 
 #include "starboard/android/shared/jni_env_ext.h"
 #include "starboard/android/shared/media_common.h"
+#include "starboard/media.h"
 #include "starboard/string.h"
 
 bool SbMediaIsSupported(SbMediaVideoCodec video_codec,
@@ -24,7 +25,7 @@
   using starboard::android::shared::IsWidevineL1;
   using starboard::android::shared::JniEnvExt;
 
-  if (SbStringFindCharacter(key_system, ';')) {
+  if (strchr(key_system, ';')) {
     // TODO: Remove this check and enable key system with attributes support.
     return false;
   }
diff --git a/src/starboard/android/shared/microphone_impl.cc b/src/starboard/android/shared/microphone_impl.cc
index 43314b6..1972d0e 100644
--- a/src/starboard/android/shared/microphone_impl.cc
+++ b/src/starboard/android/shared/microphone_impl.cc
@@ -168,7 +168,7 @@
   // starts as soon as the state is modified.
   for (int i = 0; i < kNumOfOpenSLESBuffers; ++i) {
     int16_t* buffer = new int16_t[kSamplesPerBuffer];
-    SbMemorySet(buffer, 0, kBufferSizeInBytes);
+    memset(buffer, 0, kBufferSizeInBytes);
     delivered_queue_.push(buffer);
     SLresult result =
         (*buffer_object_)->Enqueue(buffer_object_, buffer, kBufferSizeInBytes);
@@ -249,7 +249,7 @@
   while (!ready_queue_.empty() &&
          audio_data_size - read_bytes >= kBufferSizeInBytes) {
     buffer.reset(ready_queue_.front());
-    SbMemoryCopy(static_cast<uint8_t*>(out_audio_data) + read_bytes,
+    memcpy(static_cast<uint8_t*>(out_audio_data) + read_bytes,
                  buffer.get(), kBufferSizeInBytes);
     ready_queue_.pop();
     read_bytes += kBufferSizeInBytes;
@@ -282,7 +282,7 @@
 
   if (state_ == kOpened) {
     int16_t* buffer = new int16_t[kSamplesPerBuffer];
-    SbMemorySet(buffer, 0, kBufferSizeInBytes);
+    memset(buffer, 0, kBufferSizeInBytes);
     delivered_queue_.push(buffer);
     SLresult result =
         (*buffer_object_)->Enqueue(buffer_object_, buffer, kBufferSizeInBytes);
diff --git a/src/starboard/android/shared/model_year_test.cc b/src/starboard/android/shared/model_year_test.cc
index 1197242..1c53a08 100644
--- a/src/starboard/android/shared/model_year_test.cc
+++ b/src/starboard/android/shared/model_year_test.cc
@@ -24,7 +24,7 @@
 TEST(ModelYearTest, YearIsFourDigitsOrUnknown) {
   const size_t kValueSize = 1024;
   char value[kValueSize] = {0};
-  SbMemorySet(value, 0xCD, kValueSize);
+  memset(value, 0xCD, kValueSize);
   bool result =
       SbSystemGetProperty(kSbSystemPropertyModelYear, value, kValueSize);
   SB_DCHECK(result);
diff --git a/src/starboard/android/shared/platform_configuration/BUILD.gn b/src/starboard/android/shared/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..27b0a08
--- /dev/null
+++ b/src/starboard/android/shared/platform_configuration/BUILD.gn
@@ -0,0 +1,208 @@
+# Copyright 2021 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.
+
+config("platform_configuration") {
+  configs = [ "//starboard/build/config/sabi" ]
+  defines = []
+  ldflags = [
+    # The NDK default "ld" is actually the gold linker for all architectures
+    # except arm64 (aarch64) where it"s the bfd linker. Don"t use either of
+    # those, rather use lld everywhere. See release notes for NDK 19:
+    # https://developer.android.com/ndk/downloads/revision_history
+    "-fuse-ld=lld",
+
+    # Mimic build/cmake/android.toolchain.cmake in the Android NDK.
+    "-Wl,--exclude-libs,libunwind.a",
+  ]
+  cflags = []
+
+  if (current_toolchain == host_toolchain) {
+    cflags += [ "-O2" ]
+  }
+  if (is_debug) {
+    cflags += [
+      "-frtti",
+      "-O0",
+    ]
+  } else if (is_devel) {
+    cflags += [
+      "-frtti",
+      "-O2",
+    ]
+  } else {
+    cflags += [
+      "-fno-rtti",
+      "-gline-tables-only",
+    ]
+  }
+
+  libs = [
+    "EGL",
+    "GLESv2",
+    "OpenSLES",
+    "android",
+    "log",
+    "mediandk",
+  ]
+
+  if (!cobalt_fastbuild && (is_debug || is_devel)) {
+    cflags += [ "-g" ]
+  }
+
+  if (sb_pedantic_warnings) {
+    cflags += [
+      "-Wall",
+      "-Wextra",
+      "-Wunreachable-code",
+
+      # Don"t get pedantic about warnings from base macros. These must be
+      # disabled after the -Wall above, so this has to be done here rather
+      # than in the platform"s target toolchain.
+      # TODO: Rebase base and use static_assert instead of COMPILE_ASSERT
+
+      "-Wno-unused-local-typedef",  # COMPILE_ASSERT
+      "-Wno-missing-field-initializers",  # LAZY_INSTANCE_INITIALIZER
+
+      # It"s OK not to use some input parameters. Note that the order
+      # matters: Wall implies Wunused-parameter and Wno-unused-parameter
+      # has no effect if specified before Wall.
+      "-Wno-unused-parameter",
+    ]
+  }
+
+  if (use_asan) {
+    cflags += [
+      "-fsanitize=address",
+      "-fno-omit-frame-pointer",
+    ]
+    ldflags += [
+      "-fsanitize=address",
+
+      # Force linking of the helpers in sanitizer_options.cc
+      "-Wl,-u_sanitizer_options_link_helper",
+    ]
+    defines += [ "ADDRESS_SANITIZER" ]
+  } else if (use_tsan) {
+    cflags += [
+      "-fsanitize=thread",
+      "-fno-omit-frame-pointer",
+    ]
+    ldflags += [ "-fsanitize=thread" ]
+    defines += [ "THREAD_SANITIZER" ]
+  }
+
+  if (current_toolchain != host_toolchain) {
+    cflags_cc = [ "-std=c++14" ]
+    cflags += [
+      # libwebp uses the cpufeatures library to detect ARM NEON support
+      "-I${android_ndk_path}/sources/android/cpufeatures",
+
+      # Mimic build/cmake/android.toolchain.cmake in the Android NDK.
+      "-ffunction-sections",
+      "-funwind-tables",
+      "-fstack-protector-strong",
+      "-no-canonical-prefixes",
+
+      # Other flags
+      "-fsigned-char",
+      "-fno-limit-debug-info",
+      "-fno-exceptions",
+      "-fcolor-diagnostics",
+      "-fno-strict-aliasing",  # See http://crbug.com/32204
+
+      # Default visibility is hidden to enable dead stripping.
+      "-fvisibility=hidden",
+
+      # Any warning will stop the build.
+      "-Werror",
+
+      # Disable errors for the warning till the Android NDK r19 is fixed.
+      # The warning is trigger when compiling .c files and complains for
+      # "-stdlib=libc++" which is added by the NDK.
+      "-Wno-error=unused-command-line-argument",
+
+      # Don"t warn about register variables (in base and net)
+      "-Wno-deprecated-register",
+
+      # Don"t warn about deprecated ICU methods (in googleurl and net)
+      "-Wno-deprecated-declarations",
+
+      # Skia doesn"t use overrides.
+      "-Wno-inconsistent-missing-override",
+
+      # shifting a negative signed value is undefined
+      "-Wno-shift-negative-value",
+
+      # Don"t warn for implicit sign conversions. (in v8 and protobuf)
+      "-Wno-sign-conversion",
+    ]
+    defines += [
+      # Enable compile-time decisions based on the ABI
+      "ANDROID_ABI=$android_abi",
+
+      # -DANDROID is an argument to some ifdefs in the NDK"s eglplatform.h
+      "ANDROID",
+
+      # Cobalt on Linux flag
+      "COBALT_LINUX",
+
+      # So that we get the PRI* macros from inttypes.h
+      "__STDC_FORMAT_MACROS",
+
+      # Enable GNU extensions to get prototypes like ffsl.
+      "_GNU_SOURCE=1",
+
+      # Undefining __linux__ causes the system headers to make wrong
+      # assumptions about which C-library is used on the platform.
+      "__BIONIC__",
+
+      # Undefining __linux__ leaves libc++ without a threads implementation.
+      # TODO: See if there"s a way to make libcpp threading use Starboard.
+      "_LIBCPP_HAS_THREAD_API_PTHREAD",
+    ]
+    ldflags += [
+      # Use the static LLVM libc++.
+      "-static-libstdc++",
+
+      # Mimic build/cmake/android.toolchain.cmake in the Android NDK, but
+      # force build-id to sha1, so that older lldb versions can still find
+      # debugsymbols, see https://github.com/android-ndk/ndk/issues/885
+      "-Wl,--build-id=sha1",
+      "-Wl,--warn-shared-textrel",
+      "-Wl,--fatal-warnings",
+      "-Wl,--gc-sections",
+      "-Wl,-z,nocopyreloc",
+
+      # Wrapper synchronizes punch-out video bounds with the UI frame.
+      "-Wl,--wrap=eglSwapBuffers",
+    ]
+  }
+}
+
+config("size") {
+  cflags = [ "-Os" ]
+}
+
+config("speed") {
+  cflags = [ "-O2" ]
+}
+
+config("executable_config") {
+  cflags = [ "-fPIE" ]
+  ldflags = [ "-pie" ]
+}
+
+config("library_config") {
+  cflags = [ "-fPIC" ]
+}
diff --git a/src/starboard/android/shared/platform_configuration/configuration.gni b/src/starboard/android/shared/platform_configuration/configuration.gni
new file mode 100644
index 0000000..f0e73b2
--- /dev/null
+++ b/src/starboard/android/shared/platform_configuration/configuration.gni
@@ -0,0 +1,49 @@
+# Copyright 2021 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.
+
+import("//starboard/build/config/base_configuration.gni")
+
+declare_args() {
+  android_sdk_path = getenv("ANDROID_HOME")
+  android_ndk_path = ""
+  sb_android_ndk_version = "21.1.6352462"
+  android_ndk_api_level = 21
+
+  enable_vulkan = false
+}
+
+if (android_sdk_path == "") {
+  _home_dir = getenv("HOME")
+  android_sdk_path = "$_home_dir/starboard-toolchains/AndroidSdk"
+}
+
+if (android_ndk_path == "") {
+  android_ndk_path = "$android_sdk_path/ndk/$sb_android_ndk_version"
+}
+
+final_executable_type = "shared_library"
+gtest_target_type = "shared_library"
+sb_enable_benchmark = true
+
+size_config_path = "//starboard/android/shared/platform_configuration:size"
+speed_config_path = "//starboard/android/shared/platform_configuration:speed"
+
+executable_configs +=
+    [ "//starboard/android/shared/platform_configuration:executable_config" ]
+shared_library_configs +=
+    [ "//starboard/android/shared/platform_configuration:library_config" ]
+static_library_configs +=
+    [ "//starboard/android/shared/platform_configuration:library_config" ]
+
+install_target_path = "//starboard/android/shared/install_target.gni"
diff --git a/src/starboard/android/shared/platform_deploy.gypi b/src/starboard/android/shared/platform_deploy.gypi
index d00db17..a95dde2 100644
--- a/src/starboard/android/shared/platform_deploy.gypi
+++ b/src/starboard/android/shared/platform_deploy.gypi
@@ -47,6 +47,7 @@
         '-P', 'cobaltContentDir=$${PWD}/<(content_deploy_dir)',
         '-P', 'cobaltGradleDir=$${PWD}/<(GRADLE_FILES_DIR)',
         '-P', 'cobaltProductDir=$${PWD}/<(PRODUCT_DIR)',
+        '-P', 'cobaltLibraryDir=$${PWD}/<(PRODUCT_DIR)/lib',
         '-P', 'cobaltTarget=<(executable_name)',
         '-P', 'enableVulkan=<(enable_vulkan)',
         'assembleCobalt_<(GRADLE_BUILD_TYPE)',
diff --git a/src/starboard/android/shared/platform_service.cc b/src/starboard/android/shared/platform_service.cc
index 23de46c..7e3a479 100644
--- a/src/starboard/android/shared/platform_service.cc
+++ b/src/starboard/android/shared/platform_service.cc
@@ -137,7 +137,11 @@
                                                       jbyteArray j_data) {
   CobaltExtensionPlatformService service =
       reinterpret_cast<CobaltExtensionPlatformService>(nativeService);
-  SB_DCHECK(CobaltExtensionPlatformServiceIsValid(service));
+  if (!CobaltExtensionPlatformServiceIsValid(service)) {
+    SB_LOG(WARNING) << "Trying to send message through platform service when "
+                       "the service is already closed";
+    return;
+  }
 
   jsize length = env->GetArrayLength(j_data);
   char* data = new char[length];
diff --git a/src/starboard/android/shared/player_create.cc b/src/starboard/android/shared/player_create.cc
index 6553190..3cb64f9 100644
--- a/src/starboard/android/shared/player_create.cc
+++ b/src/starboard/android/shared/player_create.cc
@@ -118,7 +118,7 @@
     return kSbPlayerInvalid;
   }
 
-  if (SbStringGetLength(max_video_capabilities) == 0) {
+  if (strlen(max_video_capabilities) == 0) {
     // Check the availability of hardware video decoder. Main player must use a
     // hardware codec, but Android doesn't support multiple concurrent hardware
     // codecs. Since it's not safe to have multiple hardware codecs, we only
diff --git a/src/starboard/android/shared/player_get_preferred_output_mode.cc b/src/starboard/android/shared/player_get_preferred_output_mode.cc
index 3bca635..95d6728 100644
--- a/src/starboard/android/shared/player_get_preferred_output_mode.cc
+++ b/src/starboard/android/shared/player_get_preferred_output_mode.cc
@@ -56,7 +56,7 @@
       creation_param->video_sample_info.max_video_capabilities;
 
   // Sub players must use decode-to-texture on Android.
-  if (max_video_capabilities && SbStringGetLength(max_video_capabilities) > 0) {
+  if (max_video_capabilities && strlen(max_video_capabilities) > 0) {
     if (VideoDecoder::OutputModeSupported(kSbPlayerOutputModeDecodeToTexture,
                                           codec, drm_system)) {
       return kSbPlayerOutputModeDecodeToTexture;
diff --git a/src/starboard/android/shared/system_get_extensions.cc b/src/starboard/android/shared/system_get_extensions.cc
index 1ffca16..7e661ed 100644
--- a/src/starboard/android/shared/system_get_extensions.cc
+++ b/src/starboard/android/shared/system_get_extensions.cc
@@ -24,13 +24,13 @@
 #include "starboard/common/string.h"
 
 const void* SbSystemGetExtension(const char* name) {
-  if (SbStringCompareAll(name, kCobaltExtensionPlatformServiceName) == 0) {
+  if (strcmp(name, kCobaltExtensionPlatformServiceName) == 0) {
     return starboard::android::shared::GetPlatformServiceApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionConfigurationName) == 0) {
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
     return starboard::android::shared::GetConfigurationApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionMediaSessionName) == 0) {
+  if (strcmp(name, kCobaltExtensionMediaSessionName) == 0) {
     return starboard::android::shared::GetMediaSessionApi();
   }
   return NULL;
diff --git a/src/starboard/android/shared/system_get_path.cc b/src/starboard/android/shared/system_get_path.cc
index 21322e7..a6f157c 100644
--- a/src/starboard/android/shared/system_get_path.cc
+++ b/src/starboard/android/shared/system_get_path.cc
@@ -40,7 +40,7 @@
 
   switch (path_id) {
     case kSbSystemPathContentDirectory: {
-      if (SbStringConcat(path, g_app_assets_dir, kPathSize) >= kPathSize) {
+      if (starboard::strlcat(path, g_app_assets_dir, kPathSize) >= kPathSize) {
         return false;
       }
       break;
@@ -50,7 +50,7 @@
       if (!SbSystemGetPath(kSbSystemPathTempDirectory, path, kPathSize)) {
         return false;
       }
-      if (SbStringConcat(path, "/cache", kPathSize) >= kPathSize) {
+      if (starboard::strlcat(path, "/cache", kPathSize) >= kPathSize) {
         return false;
       }
 
@@ -62,7 +62,7 @@
       if (!SbSystemGetPath(kSbSystemPathTempDirectory, path, kPathSize)) {
         return false;
       }
-      if (SbStringConcat(path, "/log", kPathSize) >= kPathSize) {
+      if (starboard::strlcat(path, "/log", kPathSize) >= kPathSize) {
         return false;
       }
 
@@ -71,7 +71,7 @@
     }
 
     case kSbSystemPathTempDirectory: {
-      if (SbStringCopy(path, g_app_cache_dir, kPathSize) >= kPathSize) {
+      if (starboard::strlcpy(path, g_app_cache_dir, kPathSize) >= kPathSize) {
         return false;
       }
 
@@ -88,7 +88,7 @@
     // a) Unlike the .so itself, it has a valid timestamp of the app install.
     // b) Its parent directory is still a directory within our app package.
     case kSbSystemPathExecutableFile: {
-      if (SbStringCopy(path, g_app_lib_dir, kPathSize) >= kPathSize) {
+      if (starboard::strlcpy(path, g_app_lib_dir, kPathSize) >= kPathSize) {
         return false;
       }
       break;
@@ -104,6 +104,6 @@
     return false;
   }
 
-  SbStringCopy(out_path, path, path_size);
+  starboard::strlcpy(out_path, path, path_size);
   return true;
 }
diff --git a/src/starboard/android/shared/system_get_property.cc b/src/starboard/android/shared/system_get_property.cc
index b77d103..fa9b8ce 100644
--- a/src/starboard/android/shared/system_get_property.cc
+++ b/src/starboard/android/shared/system_get_property.cc
@@ -40,9 +40,9 @@
 bool CopyStringAndTestIfSuccess(char* out_value,
                                 int value_length,
                                 const char* from_value) {
-  if (SbStringGetLength(from_value) + 1 > value_length)
+  if (strlen(from_value) + 1 > value_length)
     return false;
-  SbStringCopy(out_value, from_value, value_length);
+  starboard::strlcpy(out_value, from_value, value_length);
   return true;
 }
 
@@ -56,8 +56,8 @@
   // Note that __system_property_get returns empty string on no value
   __system_property_get(system_property_name, out_value);
 
-  if (SbStringGetLength(out_value) == 0) {
-    SbStringCopy(out_value, default_value, value_length);
+  if (strlen(out_value) == 0) {
+    starboard::strlcpy(out_value, default_value, value_length);
   }
   return true;
 }
@@ -108,8 +108,8 @@
       char key1[PROP_VALUE_MAX] = "";
       SB_DCHECK(GetAndroidSystemProperty("ro.oem.key1", key1, PROP_VALUE_MAX,
                                          kUnknownValue));
-      if (SbStringCompareAll(key1, kUnknownValue) == 0 ||
-          SbStringGetLength(key1) < 10) {
+      if (strcmp(key1, kUnknownValue) == 0 ||
+          strlen(key1) < 10) {
         return CopyStringAndTestIfSuccess(out_value, value_length,
                                           kUnknownValue);
       }
diff --git a/src/starboard/android/shared/system_has_capability.cc b/src/starboard/android/shared/system_has_capability.cc
index 7473825..f5f447a 100644
--- a/src/starboard/android/shared/system_has_capability.cc
+++ b/src/starboard/android/shared/system_has_capability.cc
@@ -22,8 +22,6 @@
       return false;
     case kSbSystemCapabilityCanQueryGPUMemoryStats:
       return false;
-    case kSbSystemCapabilitySetsInputTimestamp:
-      return false;
   }
 
   SB_DLOG(WARNING) << "Unrecognized capability: " << capability_id;
diff --git a/src/starboard/android/shared/thread_create.cc b/src/starboard/android/shared/thread_create.cc
index 6b3ca2d..28e77db 100644
--- a/src/starboard/android/shared/thread_create.cc
+++ b/src/starboard/android/shared/thread_create.cc
@@ -131,7 +131,7 @@
   params->context = context;
 
   if (name) {
-    SbStringCopy(params->name, name, SB_ARRAY_SIZE_INT(params->name));
+    starboard::strlcpy(params->name, name, SB_ARRAY_SIZE_INT(params->name));
   } else {
     params->name[0] = '\0';
   }
diff --git a/src/starboard/android/shared/video_decoder.cc b/src/starboard/android/shared/video_decoder.cc
index 526c707..bdd2226 100644
--- a/src/starboard/android/shared/video_decoder.cc
+++ b/src/starboard/android/shared/video_decoder.cc
@@ -102,12 +102,12 @@
 // Determine if two |SbMediaMasteringMetadata|s are equal.
 bool Equal(const SbMediaMasteringMetadata& lhs,
            const SbMediaMasteringMetadata& rhs) {
-  return SbMemoryCompare(&lhs, &rhs, sizeof(SbMediaMasteringMetadata)) == 0;
+  return memcmp(&lhs, &rhs, sizeof(SbMediaMasteringMetadata)) == 0;
 }
 
 // Determine if two |SbMediaColorMetadata|s are equal.
 bool Equal(const SbMediaColorMetadata& lhs, const SbMediaColorMetadata& rhs) {
-  return SbMemoryCompare(&lhs, &rhs, sizeof(SbMediaMasteringMetadata)) == 0;
+  return memcmp(&lhs, &rhs, sizeof(SbMediaMasteringMetadata)) == 0;
 }
 
 // TODO: For whatever reason, Cobalt will always pass us this us for
@@ -228,7 +228,7 @@
       has_new_texture_available_(false),
       surface_condition_variable_(surface_destroy_mutex_),
       require_software_codec_(max_video_capabilities &&
-                              SbStringGetLength(max_video_capabilities) > 0) {
+                              strlen(max_video_capabilities) > 0) {
   SB_DCHECK(error_message);
 
   if (tunnel_mode_audio_session_id != -1) {
@@ -748,7 +748,7 @@
                              java_array);
 
   jfloat* array_values = env->GetFloatArrayElements(java_array, 0);
-  SbMemoryCopy(matrix4x4, array_values, sizeof(float) * 16);
+  memcpy(matrix4x4, array_values, sizeof(float) * 16);
 
   env->DeleteLocalRef(java_array);
 }
diff --git a/src/starboard/android/shared/video_render_algorithm.cc b/src/starboard/android/shared/video_render_algorithm.cc
index 1b9fcc4..74ed628 100644
--- a/src/starboard/android/shared/video_render_algorithm.cc
+++ b/src/starboard/android/shared/video_render_algorithm.cc
@@ -73,6 +73,23 @@
       video_decoder_->SetPlaybackRate(playback_rate);
     }
 
+    if (is_audio_eos_played) {
+      // If the audio stream has reached end of stream before the video stream,
+      // we should end the video stream immediately by only keeping one frame in
+      // the backlog.
+      bool popped = false;
+      while (frames->size() > 1) {
+        frames->pop_front();
+        popped = true;
+      }
+      if (popped) {
+        // Let the loop process the end of stream frame, if there is one.
+        continue;
+      } else {
+        break;
+      }
+    }
+
     jlong early_us = frames->front()->timestamp() - playback_time;
 
     auto system_time_ns = GetSystemNanoTime();
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/x86/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/x86/BUILD.gn
index 97c4786..dc694b6 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/x86/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+static_library("starboard_platform") {
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+
+  public_deps = [ "//starboard/android/shared:starboard_platform" ]
 }
diff --git a/src/starboard/android/x86/gyp_configuration.py b/src/starboard/android/x86/gyp_configuration.py
index 2caad96..9af8e0c 100644
--- a/src/starboard/android/x86/gyp_configuration.py
+++ b/src/starboard/android/x86/gyp_configuration.py
@@ -43,13 +43,20 @@
           'SbMicrophoneOpenTest.*',
           'SbMicrophoneReadTest.*',
           'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.*',
-          'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest'
-          '.SunnyDaySourceForDestination/*',
           'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
           '.WriteContinuedLimitedInput/*',
       ],
       'player_filter_tests': [
-          'VideoDecoderTests/*',
           'AudioDecoderTests/*',
+          'VideoDecoderTests/*',
+
+          'PlayerComponentsTests/PlayerComponentsTest.*/2',
+          'PlayerComponentsTests/PlayerComponentsTest.*/4',
+          'PlayerComponentsTests/PlayerComponentsTest.*/9',
+          'PlayerComponentsTests/PlayerComponentsTest.*/11',
+          'PlayerComponentsTests/PlayerComponentsTest.*/16',
+          'PlayerComponentsTests/PlayerComponentsTest.*/17',
+          'PlayerComponentsTests/PlayerComponentsTest.*/20',
+          'PlayerComponentsTests/PlayerComponentsTest.*/21',
       ],
   }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/x86/platform_configuration/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/x86/platform_configuration/BUILD.gn
index 97c4786..6657de1 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/x86/platform_configuration/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+config("platform_configuration") {
+  configs = [ "//starboard/android/shared/platform_configuration" ]
 }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/android/x86/platform_configuration/configuration.gni
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/android/x86/platform_configuration/configuration.gni
index 97c4786..aa8ad1a 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/android/x86/platform_configuration/configuration.gni
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
+import("//starboard/android/shared/platform_configuration/configuration.gni")
+
+android_abi = "x86"
+sabi_path = "//starboard/sabi/x86/sabi-v$sb_api_version.json"
+
+sb_disable_opus_sse = false
diff --git a/src/starboard/android/x86/toolchain/BUILD.gn b/src/starboard/android/x86/toolchain/BUILD.gn
new file mode 100644
index 0000000..eb3b006
--- /dev/null
+++ b/src/starboard/android/x86/toolchain/BUILD.gn
@@ -0,0 +1,39 @@
+# Copyright 2021 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.
+
+import("//build/toolchain/gcc_toolchain.gni")
+
+_home_dir = getenv("HOME")
+_clang_base_path = "$_home_dir/starboard-toolchains/x86_64-linux-gnu-clang-chromium-365097-f7e52fbd-8"
+
+clang_toolchain("host") {
+  clang_base_path = _clang_base_path
+}
+
+_android_toolchain_path =
+    "$android_ndk_path/toolchains/llvm/prebuilt/linux-x86_64"
+
+gcc_toolchain("target") {
+  prefix = rebase_path("$_android_toolchain_path/bin", root_build_dir)
+  cc = "$prefix/i686-linux-android${android_ndk_api_level}-clang"
+  cxx = "$prefix/i686-linux-android${android_ndk_api_level}-clang++"
+  ld = cxx
+  readelf = "$prefix/i686-linux-android-readelf"
+  ar = "$prefix/i686-linux-android-ar"
+  nm = "$prefix/i686-linux-android-nm"
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/src/starboard/benchmark/memory_benchmark.cc b/src/starboard/benchmark/memory_benchmark.cc
index 24e3cf1..703e48b 100644
--- a/src/starboard/benchmark/memory_benchmark.cc
+++ b/src/starboard/benchmark/memory_benchmark.cc
@@ -16,6 +16,8 @@
 
 #include "third_party/google_benchmark/include/benchmark/benchmark.h"
 
+#include <cstring>
+
 namespace starboard {
 namespace benchmark {
 namespace {
@@ -25,7 +27,7 @@
   void* memory2 = SbMemoryAllocate(state.range(0));
 
   for (auto _ : state) {
-    SbMemoryCopy(memory1, memory2, state.range(0));
+    memcpy(memory1, memory2, state.range(0));
     ::benchmark::ClobberMemory();
   }
   state.SetBytesProcessed(int64_t(state.iterations()) *
@@ -40,7 +42,7 @@
   void* memory2 = SbMemoryAllocate(state.range(0));
 
   for (auto _ : state) {
-    SbMemoryMove(memory1, memory2, state.range(0));
+    memmove(memory1, memory2, state.range(0));
     ::benchmark::ClobberMemory();
   }
   state.SetBytesProcessed(int64_t(state.iterations()) *
diff --git a/src/starboard/build/base_configuration.gypi b/src/starboard/build/base_configuration.gypi
index 5a27507..aa28f83 100644
--- a/src/starboard/build/base_configuration.gypi
+++ b/src/starboard/build/base_configuration.gypi
@@ -58,8 +58,8 @@
     # requires a 'lib' starboard implementation for the corresponding platform.
     'sb_enable_lib%': '<(sb_enable_lib)',
 
-    # Disables an NPLB audit of C++14 support.
-    'sb_disable_cpp14_audit': 0,
+    # Disables an NPLB audit of C++17 support.
+    'sb_disable_cpp17_audit': 0,
 
     # When this is set to true, the web bindings for the microphone
     # are disabled
diff --git a/src/starboard/build/config/BUILDCONFIG.gn b/src/starboard/build/config/BUILDCONFIG.gn
index 9aca1ef..4b455b3 100644
--- a/src/starboard/build/config/BUILDCONFIG.gn
+++ b/src/starboard/build/config/BUILDCONFIG.gn
@@ -33,9 +33,15 @@
 assert(is_debug || is_devel || is_qa || is_gold)
 
 declare_args() {
-  use_asan = is_debug || is_devel
+  use_tsan = getenv("USE_TSAN") == 1
 }
 
+declare_args() {
+  use_asan = (is_debug || is_devel || getenv("USE_ASAN") == 1) && !use_tsan
+}
+
+assert(!(use_tsan && use_asan), "ASAN and TSAN are mutually exclusive.")
+
 # Set some variables we never want to change.
 sb_allows_memory_tracking = !is_gold
 host_byteorder = "little"
@@ -70,6 +76,9 @@
 _default_toolchain = "//$starboard_path/toolchain:target"
 set_default_toolchain(_default_toolchain)
 
+import("//$starboard_path/platform_configuration/configuration.gni")
+import("//starboard/build/config/build_assertions.gni")
+
 # =============================================================================
 # TARGET DEFAULTS
 # =============================================================================
@@ -102,24 +111,21 @@
 }
 
 set_defaults("static_library") {
-  configs = default_compiler_configs
+  configs = default_compiler_configs + static_library_configs
 }
 set_defaults("source_set") {
-  configs = default_compiler_configs
+  configs = default_compiler_configs + source_set_configs
 }
 set_defaults("loadable_module") {
-  configs = default_compiler_configs
+  configs = default_compiler_configs + loadable_module_configs
 }
 set_defaults("executable") {
-  configs = default_compiler_configs
+  configs = default_compiler_configs + executable_configs
 }
 set_defaults("shared_library") {
-  configs = default_compiler_configs
+  configs = default_compiler_configs + shared_library_configs
 }
 
-import("//$starboard_path/platform_configuration/configuration.gni")
-import("//starboard/build/config/build_assertions.gni")
-
 # Set up the method of generating the install targets as defined by the
 # platform.
 import("$install_target_path")
diff --git a/src/starboard/build/config/base_configuration.gni b/src/starboard/build/config/base_configuration.gni
index 8afb8e2..3b798ea 100644
--- a/src/starboard/build/config/base_configuration.gni
+++ b/src/starboard/build/config/base_configuration.gni
@@ -95,4 +95,11 @@
   # The path to the gni file containing the install_target template which
   # defines how the build should produce the install/ directory.
   install_target_path = "//starboard/build/install/mock_install.gni"
+
+  # Target-specific configurations for each platform.
+  executable_configs = []
+  shared_library_configs = []
+  static_library_configs = []
+  source_set_configs = []
+  loadable_module_configs = []
 }
diff --git a/src/starboard/build/config/migration_changes.md b/src/starboard/build/config/migration_changes.md
deleted file mode 100644
index 3d91910..0000000
--- a/src/starboard/build/config/migration_changes.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# GYP to GN Migration Changes
-This file tracks changes to configuration meta build configuration variables in
-the GYP to GN migration.
-
-## Removed:
-sb_disable_cpp14_audit
-sb_disable_microphone_idl
-starboard_path
-tizen_os
-includes_starboard
-
-## Renamed:
-sb_deploy_output_dir -> sb_install_output_dir
-OS == starboard -> is_starboard
-sb_evergreen -> sb_is_evergreen
-sb_evergreen_compatible -> sb_is_evergreen_compatible
-sb_evergreen_compatible_libunwind -> sb_evergreen_compatible_use_libunwind
-sb_evergreen_compatible_lite -> sb_evergreen_compatible_enable_lite
-
-## Added:
-has_platform_tests
-has_platform_targets
-install_target_path
diff --git a/src/starboard/build/doc/migrating_gyp_to_gn.md b/src/starboard/build/doc/migrating_gyp_to_gn.md
new file mode 100644
index 0000000..2333987
--- /dev/null
+++ b/src/starboard/build/doc/migrating_gyp_to_gn.md
@@ -0,0 +1,232 @@
+# Migrating GYP to GN
+
+Cobalt is currently in the process of migrating from our current build system
+which uses [GYP][gyp_home] to an updated one with
+[Generate Ninja (GN)][gn_home]. This allows us to remove our dependencies on
+Python 2.
+
+## Getting Started with GN
+
+### Getting the Binary
+
+There are a few ways to get a binary. Follow the instructions for whichever way
+you prefer [here][gn_getting_a_binary].
+
+### Read the Docs
+
+Most of the documentation for GN is located [here][gn_doc_home].
+
+*   For a hands-on example with GN, check out the
+    [Quick Start Guide][gn_quick_start] and walk through the example.
+
+*   To learn more about the language and coding in it, read through the
+    [Language page][gn_language] and the [Style Guide][gn_style_guide].
+
+*   For a full reference of the language, run `gn help` or use the
+    [Reference page][gn_reference].
+
+If you're familiar with GYP but not with GN, it may be helpful to read
+Chromium's [GYP->GN Conversion Cookbook][gyp_to_gn_cookbook]. Keep in mind we
+don't want to follow everything that's recommended here—much of the advice is
+specific to Chromium. In particular:
+
+*   Whenever possible, avoid using a `source_set`. Instead, use a
+    `static_library`.
+*   Many of the flags under [Variable Mappings][gyp_to_gn_variable_mappings] do
+    not apply to Cobalt.
+*   Cobalt code is not Chromium code by default, so you can ignore
+    [that section][gyp_to_gn_chromium_code].
+
+### Know the Tools
+
+The flow of GN is fairly similar to that of GYP: you'll configure a build then
+actually build it (using ninja). Here's how to build `nplb` target for
+`stub_debug`:
+
+```
+$ gn gen out/stub_debug --args='target_platform="stub" build_type="debug"'
+$ ninja -C out/stub_debug nplb
+```
+
+You can change the directory argument to `gn gen` (`out/stub_debug`) if you'd
+like; unlike GYP, we can put the build root wherever we want.
+
+There are some additional important tools: `gn format`, which is a code
+formatter for GN, and `gn check`, which checks that build dependencies are
+correctly set. See the documentation for [gn format][gn_format_tool] and
+[gn check][gn_check_tool] for how to use both. The full list of commands GN
+supports can be found on the [reference page][gn_reference].
+
+## Migrating a Single Target
+
+GYP and GN are very similar within the scope of a single target. The GYP->GN
+Conversion Cookbook is a good reference for this, particularly
+[this section][gyp_to_gn_typical_modifications]. The GYP syntax stays very
+similar in general, though configuration will differ: in GN, you should create a
+`config` targets and have your target add that to their list of configs:
+
+```
+config("foo_config") {
+  cflags = ...
+}
+
+static_library("foo") {
+  sources = ...
+  deps = ...
+
+  configs += [ ":foo_config" ]
+}
+```
+
+You also may need to remove default configs. The default configs are listed in
+[BUILDCONFIG.gn](../config/BUILDCONFIG.gn). You remove a config like so:
+
+```
+static_library("foo") {
+  configs -= [ "//full/path/to/config:config_name" ]
+}
+```
+
+## Migrating a Platform
+
+When porting your platform with GYP following
+[the porting guide][cobalt_porting_guide], we expected a few build files to be
+present under your starboard path:
+
+*   `gyp_configuration.py`
+*   `gyp_configuration.gypi`
+*   `starboard_platform.gyp`
+
+These contain your toolchain, your compilation flags, your platform-specific
+build variables, and your definition of the `starboard_platform` target. This
+maps to the GN files needed to port your platform:
+
+*   Your toolchain: `toolchain/BUILD.gn`
+*   Your compilation flags: `platform_configuration/BUILD.gn`
+*   Your platform-specific build variables:
+    `platform_configuration/configuration.gni`
+*   Your definition of the `starboard_platform` target: `BUILD.gn`
+
+Some of these files need to define certain targets:
+
+*   `toolchain/BUILD.gn`
+
+    The toolchain implementation is discussed in more detail
+    [below](#migrating-a-toolchain).
+
+    ```
+    toolchain("host") {
+      ...
+    }
+
+    toolchain("target") {
+      ...
+    }
+    ```
+
+*   `platform_configuration/BUILD.gn`
+
+    ```
+    config("platform_configuration") {
+      # Set the flags that were in gyp_configuration.gypi.
+    }
+    ```
+
+*   `BUILD.gn`
+
+    ```
+    static_library("starboard_platform") {
+      # Largely the same as the current starboard_platform.gyp.
+    }
+    ```
+
+### Adding Your Platform to Starboard
+
+Instead of implicitly searching directories for certain files like GYP did, we
+explicitly enumerate our ports and their locations.
+[platforms.gni](../platforms.gni) contains all of this information, and you'll
+need to add your platform to that list following the same format.
+
+### Migrating a Family of Platforms
+
+Cobalt's reference platforms when implemented in GYP mainly used variables to
+share sources and dependencies. In GN, we prefer putting shared sources and
+dependencies in a static_library that we depend on in the final
+`starboard_platform` `static_library` target. This means that configurations to
+particular files should be in the same `static_library` that files are in.
+
+### Migrating a Toolchain
+
+Cobalt expects you to set a target and a host toolchain for your build like so:
+
+```
+toolchain("host") {
+  ...
+}
+
+toolchain("target") {
+  ...
+}
+```
+
+You may define a toolchain from scratch following the [reference][gn_toolchain],
+or you can use the
+[gcc/clang templates](../../../build/toolchain/gcc_toolchain.gni) provided.
+Almost all of the reference platforms use these templates, so look to those as
+examples for how to use it correctly. Here's the linux-x64x11
+[toolchain/BUILD.gn file](../../linux/x64x11/toolchain/BUILD.gn).
+
+## Checking Your Migration
+
+There are a few different ways to ensure you've migrated a target successfully.
+You'll of course want to make sure you can build things after you've migrated
+them.
+
+### Validating a Target
+
+If you're migrating a single target, it's simple to check: just configure the
+build using the the necessary arguments then build that target with `ninja`,
+i.e.:
+
+```
+static_library("new_target") { ... }
+```
+
+```
+$ gn gen out/stub_debug --args='target_platform="stub" build_type="debug"'
+$ gn check out/stub_debug
+$ ninja -C out/stub_debug new_target
+```
+
+If this was equivalent to a GYP target, you can compare the ninja compilation
+databases by using [format_ninja.py](../../../tools/format_ninja.py) and a
+comparison tool, i.e. [meld](https://meldmerge.org/). This will allow you to see
+any changes in commands, i.e. with flags or otherwise.
+
+### Validating a Platform
+
+Checking that an entire platform has been migrated successfully is slightly more
+involved. It can be easiest to start by copying provided stub implementation and
+continuously migrating it over, checking that it builds as you go along. If you
+don't go this route, you can instead start by building a small target (with few
+dependencies) then work your way up to building the `all` target.
+
+You can use the same comparison method of using `format_ninja.py` as discussed
+[in the section above](#validating-a-target).
+
+[cobalt_porting_guide]: https://cobalt.dev/starboard/porting.html
+[gn_check_tool]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#cmd_check
+[gn_doc_home]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs
+[gn_format_tool]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#cmd_format
+[gn_getting_a_binary]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/#getting-a-binary
+[gn_home]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/
+[gn_language]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/language.md
+[gn_reference]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md
+[gn_style_guide]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/style_guide.md
+[gn_toolchain]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#func_toolchain
+[gn_quick_start]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/quick_start.md
+[gyp_home]: https://gyp.gsrc.io/index.md
+[gyp_to_gn_chromium_code]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/cookbook.md#chromium-code
+[gyp_to_gn_cookbook]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/cookbook.md
+[gyp_to_gn_typical_modifications]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/cookbook.md#typical-sources-and-deps-modifications
+[gyp_to_gn_variable_mappings]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/cookbook.md#variable-mappings
diff --git a/src/starboard/build/doc/migration_changes.md b/src/starboard/build/doc/migration_changes.md
new file mode 100644
index 0000000..6ff5712
--- /dev/null
+++ b/src/starboard/build/doc/migration_changes.md
@@ -0,0 +1,51 @@
+# GYP to GN Migration Changes
+
+This file tracks changes to configuration meta build configuration variables in
+the GYP to GN migration. Reference the table below to find the correct GN
+equivalent to a changed variable, deprecated GYP variables not in GN, and added
+variables.
+
+## Variable Changes
+
+*GYP*                                     | *GN*                                                 | *GN import*
+:---------------------------------------- | :--------------------------------------------------- | :----------
+`OS` ("starboard"/other)                  | `is_starboard` (true/false)                          | (global)
+`clang` (0/1)                             | `is_clang` (true/false)                              | (global)
+`sb_deploy_output_dir`                    | `sb_install_output_dir`                              | `//starboard/build/config/base_configuration.gni`
+`sb_evergreen` (0/1)                      | `sb_is_evergreen` (true/false)                       | `//starboard/build/config/base_configuration.gni`
+`sb_evergreen_compatible` (0/1)           | `sb_is_evergreen_compatible` (true/false)            | `//starboard/build/config/base_configuration.gni`
+`sb_evergreen_compatible_libunwind` (0/1) | `sb_evergreen_compatible_use_libunwind` (true/false) | `//starboard/build/config/base_configuration.gni`
+`sb_evergreen_compatible_lite` (0/1)      | `sb_evergreen_compatible_enable_lite` (true/false)   | `//starboard/build/config/base_configuration.gni`
+`sb_disable_cpp14_audit`                  | (none)                                               |
+`sb_disable_microphone_idl`               | (none)                                               |
+`starboard_path`                          | (none)                                               |
+`tizen_os`                                | (none)                                               |
+`includes_starboard`                      | (none)                                               |
+(none)                                    | `has_platform_tests` (true/false)                    | `//starboard/build/config/base_configuration.gni`
+(none)                                    | `has_platform_targets` (true/false)                  | `//starboard/build/config/base_configuration.gni`
+(none)                                    | `install_target_path` (true/false)                   | `//starboard/build/config/base_configuration.gni`
+
+## Other Changes
+
+*GYP*                           | *GN*                                                  | *Notes* (see below)
+:------------------------------ | :---------------------------------------------------- | :------------------
+`'STARBOARD_IMPLEMENTATION'`    | `"//starboard/build/config:starboard_implementation"` | Starboard Implementation
+`optimize_target_for_speed` (0) | `"//starboard/build/config:size"`                     | Optimizations
+`optimize_target_for_speed` (1) | `"//starboard/build/config:speed"`                    | Optimizations
+`compiler_flags_*_speed`        | `speed_config_path`                                   | Optimizations
+`compiler_flags_*_size`         | `size_config_path`                                    | Optimizations
+
+Notes:
+
+*   *Starboard Implementation:* If your platform defined
+    `STARBOARD_IMPLENTATION` in its implementation, you would now add the above
+    config with `configs +=
+    ["//starboard/build/config:starboard_implementation"]`.
+
+*   *Optimizations:* Cobalt defaults to building targets to optimize for size.
+    If you need to optimize a target for speed, remove the size config and add
+    the speed config with `configs -= [ "//starboard/build/config:size" ]` and
+    `configs += [ "//starboard/build/config:speed" ]`. You can define these
+    configurations for your platform by creating `config`s and pointing to the
+    correct ones for `speed_config_path` and `size_config_path` in your
+    platform's `platform_configuration/configuration.gni` file.
diff --git a/src/starboard/build/platform_configuration.py b/src/starboard/build/platform_configuration.py
index f422011..ad015de 100644
--- a/src/starboard/build/platform_configuration.py
+++ b/src/starboard/build/platform_configuration.py
@@ -271,9 +271,6 @@
         'use_tsan':
             use_tsan,
 
-        # Which JavaScript engine to use.  Currently, both SpiderMonkey 45 and
-        # V8 are supported.  Note that V8 can only be used on platforms that
-        # support JIT.
         'javascript_engine':
             'v8',
 
diff --git a/src/starboard/build/platforms.gni b/src/starboard/build/platforms.gni
index d09b131..6a7adcb 100644
--- a/src/starboard/build/platforms.gni
+++ b/src/starboard/build/platforms.gni
@@ -33,4 +33,24 @@
     name = "linux-x64x11-internal"
     path = "starboard/linux/x64x11/internal"
   },
+  {
+    name = "linux-x64x11-skia"
+    path = "starboard/linux/x64x11/skia"
+  },
+  {
+    name = "android-arm"
+    path = "starboard/android/arm"
+  },
+  {
+    name = "android-arm64"
+    path = "starboard/android/arm64"
+  },
+  {
+    name = "android-arm64-vulkan"
+    path = "starboard/android/arm64/vulkan"
+  },
+  {
+    name = "android-x86"
+    path = "starboard/android/x86"
+  },
 ]
diff --git a/src/starboard/build/run_bash.py b/src/starboard/build/run_bash.py
new file mode 100644
index 0000000..e734063
--- /dev/null
+++ b/src/starboard/build/run_bash.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+#
+# Copyright 2021 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.
+"""Wrapper script to run arbitrary bash files from GN.
+
+This script should be used only when absolutely necessary and never in a
+cross-platform way (that is, it should only be used for an action on a
+particular platform, not an platform-independent target).
+"""
+
+import logging
+import subprocess
+import sys
+
+if __name__ == '__main__':
+  logging_format = '[%(levelname)s:%(filename)s:%(lineno)s] %(message)s'
+  logging.basicConfig(
+      level=logging.INFO, format=logging_format, datefmt='%H:%M:%S')
+  logging.warning('Calling a bash process during GN build. '
+                  'Avoid doing this whenever possible.')
+
+  sys.exit(subprocess.call(sys.argv[1:]))
diff --git a/src/starboard/build/test.gni b/src/starboard/build/test.gni
index 4015b1c..c78aac7 100644
--- a/src/starboard/build/test.gni
+++ b/src/starboard/build/test.gni
@@ -1,10 +1,7 @@
 template("test") {
   executable(target_name) {
     testonly = true
-    forward_variables_from(invoker, "*")
+    forward_variables_from(invoker, "*", [ "configs" ])
+    configs += invoker.configs
   }
 }
-
-set_defaults("test") {
-  configs = default_compiler_configs
-}
diff --git a/src/starboard/client_porting/icu_init/icu_init.cc b/src/starboard/client_porting/icu_init/icu_init.cc
index 8133fc9..c229ca1 100644
--- a/src/starboard/client_porting/icu_init/icu_init.cc
+++ b/src/starboard/client_porting/icu_init/icu_init.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-
 #include "starboard/client_porting/icu_init/icu_init.h"
 
 #include <string>
diff --git a/src/starboard/client_porting/poem/stdio_poem.h b/src/starboard/client_porting/poem/stdio_poem.h
index 8b1643a..c7bbf98 100644
--- a/src/starboard/client_porting/poem/stdio_poem.h
+++ b/src/starboard/client_porting/poem/stdio_poem.h
@@ -24,8 +24,6 @@
 #include "starboard/memory.h"
 #include "starboard/string.h"
 
-#define wcsncmp(s1, s2, c) SbStringCompareWide(s1, s2, c)
-
 // the following functions can have variable number of arguments
 // and, out of compatibility concerns, we chose to not use
 // __VA_ARGS__ functionality.
diff --git a/src/starboard/client_porting/poem/string_leaks_poem.h b/src/starboard/client_porting/poem/string_leaks_poem.h
deleted file mode 100644
index bdb7a6b..0000000
--- a/src/starboard/client_porting/poem/string_leaks_poem.h
+++ /dev/null
@@ -1,87 +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.
-
-// This header removes the Starboard API leaks of namespaced 'string' functions.
-
-#ifndef STARBOARD_CLIENT_PORTING_POEM_STRING_LEAKS_POEM_H_
-#define STARBOARD_CLIENT_PORTING_POEM_STRING_LEAKS_POEM_H_
-
-// Starboard API leaks of 'string' functions can exist in the ::, ::std, and the
-// ::std::INLINE_POEM_NAMESPACE namespaces. To remove these leaks we need to
-// control when <cstring> is included and immediately redefine all of the
-// desired functions.  Unlike traditional poems, we need to handle namespaces
-// and avoid creating ambiguous function calls. The requirements are:
-//
-// 1) Use a different symbol name than the targeted symbol when creating the
-//    functions to drop in, e.g. "SbStringGetLength" when
-//    "SbStringGetLength" is targeted.
-//
-// 2) Define an inline function in the global namespace, and any other namespace
-//    where the symbol needs to be replaced, that redirects directly to the
-//    correct Starboard API.
-//
-// 3) Use macros to redefine the targeted symbol to the *globally namespaced*
-//    replacement function. Do not include any namespacing in the macro.
-//
-// IMPORTANT: This header MUST be included at the top of any file with the
-// appropriate leaks or the leaks will not be replaced.
-
-#if defined(STARBOARD)
-
-#include <cstring>
-
-#include "starboard/common/string.h"
-
-// We need three functions to appropriately remove Starboard API leaks for of
-// our platforms. We need the ::, ::std, and ::std::INLINE_POEM_NAMESPACE
-// namespaced symbols with a name different than the final, targeted symbol in
-// order to remove the leaks across multiple namespaces while avoiding ambiguous
-// function calls.
-
-#if defined(INLINE_POEM_NAMESPACE)
-inline size_t SbStringGetLengthRedirect(const char* str) {
-  return ::SbStringGetLength(str);
-}
-namespace std {
-inline size_t SbStringGetLengthRedirect(const char* str) {
-  return ::SbStringGetLength(str);
-}
-inline namespace INLINE_POEM_NAMESPACE {
-inline size_t SbStringGetLengthRedirect(const char* str) {
-  return ::SbStringGetLength(str);
-}
-}  // namespace INLINE_POEM_NAMESPACE
-}  // namespace std
-#else   // defined(INLINE_POEM_NAMESPACE)
-namespace std {
-inline size_t SbStringGetLength(const char* str) {
-  return ::SbStringGetLength(str);
-}
-}  // namespace std
-#endif  // defined(INLINE_POEM_NAMESPACE)
-
-#undef __builtin_strlen
-#undef strlen
-
-#if defined(INLINE_POEM_NAMESPACE)
-#define __builtin_strlen SbStringGetLengthRedirect
-#define strlen SbStringGetLengthRedirect
-#else  // defined(INLINE_POEM_NAMESPACE)
-#define __builtin_strlen std::SbStringGetLength
-#define strlen std::SbStringGetLength
-#endif  // defined(INLINE_POEM_NAMESPACE)
-
-#endif  // STARBOARD
-
-#endif  // STARBOARD_CLIENT_PORTING_POEM_STRING_LEAKS_POEM_H_
diff --git a/src/starboard/client_porting/poem/string_poem.h b/src/starboard/client_porting/poem/string_poem.h
index 1d5733f..4af6cff 100644
--- a/src/starboard/client_porting/poem/string_poem.h
+++ b/src/starboard/client_porting/poem/string_poem.h
@@ -23,194 +23,10 @@
 #include "starboard/memory.h"
 #include "starboard/string.h"
 
-#ifdef __cplusplus
-
-// declaring the following 4 functions static inline is not necessary in C++
-// see:
-// http://stackoverflow.com/questions/10847176/should-i-define-static-inline-methods-in-header-file
-
-// Finds the last occurrence of |character| in |str|, returning a pointer to
-// the found character in the given string, or NULL if not found.
-// Meant to be a drop-in replacement for strchr, C++ signature
-inline char* PoemFindLastCharacterInString(char* str, int character) {
-  const char* const_str = static_cast<const char*>(str);
-  const char c = static_cast<char>(character);
-  return const_cast<char*>(SbStringFindLastCharacter(const_str, c));
-}
-
-// Finds the last occurrence of |character| in |str|, returning a pointer to
-// the found character in the given string, or NULL if not found.
-// Meant to be a drop-in replacement for strchr, C++ signature
-inline const char* PoemFindLastCharacterInString(const char* str,
-                                                 int character) {
-  const char c = static_cast<char>(character);
-  return SbStringFindLastCharacter(str, c);
-}
-
-// Finds the first occurrence of |character| in |str|, returning a pointer to
-// the found character in the given string, or NULL if not found.
-// Meant to be a drop-in replacement for strchr
-inline char* PoemFindCharacterInString(char* str, int character) {
-  const char* const_str = static_cast<const char*>(str);
-  const char c = static_cast<char>(character);
-  return const_cast<char*>(SbStringFindCharacter(const_str, c));
-}
-
-// Finds the first occurrence of |character| in |str|, returning a pointer to
-// the found character in the given string, or NULL if not found.
-// Meant to be a drop-in replacement for strchr
-inline const char* PoemFindCharacterInString(const char* str, int character) {
-  const char c = static_cast<char>(character);
-  return SbStringFindCharacter(str, c);
-}
-
-#else
-
-// Finds the first occurrence of |character| in |str|, returning a pointer to
-// the found character in the given string, or NULL if not found.
-// Meant to be a drop-in replacement for strchr
-static SB_C_INLINE char* PoemFindCharacterInString(const char* str,
-                                                   int character) {
-  // C-style cast used for C code
-  return (char*)(SbStringFindCharacter(str, character));
-}
-
-// Finds the last occurrence of |character| in |str|, returning a pointer to
-// the found character in the given string, or NULL if not found.
-// Meant to be a drop-in replacement for strchr
-static SB_C_INLINE char* PoemFindLastCharacterInString(const char* str,
-                                                       int character) {
-  // C-style cast used for C code
-  return (char*)(SbStringFindLastCharacter(str, character));
-}
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Concatenates |source| onto the end of |out_destination|, presuming it has
-// atleast strlen(out_destination) + |num_chars_to_copy| + 1 total characters of
-// storage available. Returns |out_destination|.  This method is a drop-in
-// replacement for strncat.
-// Note: even if num_chars_to_copy == 0, we will still write a NULL character.
-// This is consistent with the language of linux's strncat man page:
-// "Therefore, the size of dest must be at least strlen(dest)+n+1."
-static SB_C_INLINE char* PoemStringConcat(char* out_destination,
-                                          const char* source,
-                                          int num_chars_to_copy) {
-  if (num_chars_to_copy <= 0)
-    return out_destination;
-
-  int destination_length = (int)(SbStringGetLength(out_destination));
-
-  int destination_size = destination_length + num_chars_to_copy + 1;
-  if (destination_size < 0) {  // Did we accidentally overflow?
-    destination_size = INT_MAX;
-  }
-  SbStringConcat(out_destination, source, destination_size);
-  return out_destination;
-}
-
-// Inline wrapper for an unsafe PoemStringConcat that assumes |out_destination|
-// is big enough. Returns |out_destination|.  Meant to be a drop-in replacement
-// for strcat.
-static SB_C_INLINE char* PoemStringConcatUnsafe(char* out_destination,
-                                                const char* source) {
-  return PoemStringConcat(out_destination, source,
-                          (int)SbStringGetLength(source));
-}
-
-// Inline wrapper for a drop-in replacement for |strncpy|.  This function
-// copies the null terminated string from src to dest.  If the src string is
-// shorter than num_chars_to_copy, then null padding is used.
-// Warning: As with strncpy spec, if there is no null character within the first
-// num_chars_to_copy in src, this function will write a null character at the
-// end.
-static SB_C_INLINE char* PoemStringCopyN(char* dest,
-                                         const char* src,
-                                         int num_chars_to_copy) {
-  SB_DCHECK(num_chars_to_copy >= 0);
-  if (num_chars_to_copy < 0) {
-    return dest;
-  }
-
-  char* dest_write_iterator = dest;
-  char* dest_write_iterator_end = dest + num_chars_to_copy;
-  const char* src_iterator = src;
-
-  while ((*src_iterator != '\0') &&
-         (dest_write_iterator != dest_write_iterator_end)) {
-    *dest_write_iterator = *src_iterator;
-
-    ++src_iterator;
-    ++dest_write_iterator;
-  }
-
-  SB_DCHECK(dest_write_iterator_end >= dest_write_iterator);
-  SbMemorySet(dest_write_iterator, '\0',
-              dest_write_iterator_end - dest_write_iterator);
-
-  return dest;
-}
-
-// Inline wrapper for a drop-in replacement for |strcspn|. This function scans
-// str1 for the first occurrence of any character that is in str2. If a
-// character from str2 is found in str1, this function returns the number of
-// characters in str1 checked before the first occurrence of the str2 character.
-// If none of the str2 characters are found in str1, then the function returns
-// the length of str1.
-static SB_C_INLINE size_t PoemGetSpanUntilCharacter(const char* str1,
-                                                    const char* str2) {
-  size_t length = SbStringGetLength(str1);
-  for (size_t i = 0; i < length; ++i) {
-    const char* result = SbStringFindCharacter(str2, str1[i]);
-    if (result) {
-      return i;
-    }
-  }
-  return length;
-}
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
 #if !defined(POEM_NO_EMULATION)
 
-#undef strlen
-#define strlen(s) SbStringGetLength(s)
-#undef strcpy
-#define strcpy(o, s) SbStringCopyUnsafe(o, s)
-#undef strncpy
-#define strncpy(o, s, ds) PoemStringCopyN(o, s, ds)
-#undef strcat
-#define strcat(o, s) PoemStringConcatUnsafe(o, s)
-#undef strncat
-#define strncat(o, s, ds) PoemStringConcat(o, s, ds)
 #undef strdup
 #define strdup(s) SbStringDuplicate(s)
-#undef strchr
-#define strchr(s, c) PoemFindCharacterInString(s, c)
-#undef strrchr
-#define strrchr(s, c) PoemFindLastCharacterInString(s, c)
-#undef strstr
-#define strstr(s, c) SbStringFindString(s, c)
-#undef strncmp
-#define strncmp(s1, s2, c) SbStringCompare(s1, s2, c)
-#undef strcmp
-#define strcmp(s1, s2) SbStringCompareAll(s1, s2)
-#undef strcspn
-#define strcspn(s1, s2) PoemGetSpanUntilCharacter(s1, s2)
-
-#undef memset
-#define memset(s, c, n) SbMemorySet(s, c, n)
-#undef memcpy
-#define memcpy(d, s, c) SbMemoryCopy(d, s, c)
-#undef memcmp
-#define memcmp(s1, s2, n) SbMemoryCompare(s1, s2, n)
-#undef memmove
-#define memmove(d, s, n) SbMemoryMove(d, s, n)
 
 #endif  // POEM_NO_EMULATION
 
diff --git a/src/starboard/client_porting/poem/wchar_poem.h b/src/starboard/client_porting/poem/wchar_poem.h
index 7a68a88..41ca028 100644
--- a/src/starboard/client_porting/poem/wchar_poem.h
+++ b/src/starboard/client_porting/poem/wchar_poem.h
@@ -25,8 +25,6 @@
 
 #undef vswprintf
 #define vswprintf SbStringFormatWide
-#undef wcsncmp
-#define wcsncmp(s1, s2, c) SbStringCompareWide(s1, s2, c)
 
 #endif  // POEM_NO_EMULATION
 
diff --git a/src/starboard/client_porting/walk_dir.py b/src/starboard/client_porting/walk_dir.py
index 68214dc..4e18e0c 100644
--- a/src/starboard/client_porting/walk_dir.py
+++ b/src/starboard/client_porting/walk_dir.py
@@ -128,19 +128,11 @@
 SB_MEMORY_REPLACEMENT_DICT = {
     'free': 'SbMemoryFree',
     'malloc': 'SbMemoryAllocate',
-    'memchr': 'SbMemoryFindByte',
-    'memcmp': 'SbMemoryCompare',
-    'memcpy': 'SbMemoryCopy',
-    'memmove': 'SbMemoryMove',
-    'memset': 'SbMemorySet',
     'realloc': 'SbMemoryReallocate'
 }
 
 SB_STRING_REPLACEMENT_DICT = {
     'atoi': 'SbStringAToI',
-    'strcpy': 'SbStringCopyUnsafe',
-    'strlen': 'SbStringGetLength',
-    'strncpy': 'SbStringCopy',
 }
 
 c_function_list = []
diff --git a/src/starboard/common/common_test.gyp b/src/starboard/common/common_test.gyp
index 0fcd931..06d9b47 100644
--- a/src/starboard/common/common_test.gyp
+++ b/src/starboard/common/common_test.gyp
@@ -18,6 +18,7 @@
       'target_name': 'common_test',
       'type': '<(gtest_target_type)',
       'sources': [
+        'memory_test.cc',
         'socket_test.cc',
         '<(DEPTH)/starboard/common/test_main.cc',
       ],
diff --git a/src/starboard/common/configuration_defaults.h b/src/starboard/common/configuration_defaults.h
index 06114f9..c828562 100644
--- a/src/starboard/common/configuration_defaults.h
+++ b/src/starboard/common/configuration_defaults.h
@@ -52,6 +52,7 @@
 
 int CobaltSkiaGlyphAtlasHeightDefault();
 
+// Deprecated.
 int CobaltJsGarbageCollectionThresholdInBytesDefault();
 
 int CobaltReduceCpuMemoryByDefault();
diff --git a/src/starboard/common/file.cc b/src/starboard/common/file.cc
index b44ede8..c12b398 100644
--- a/src/starboard/common/file.cc
+++ b/src/starboard/common/file.cc
@@ -14,6 +14,7 @@
 
 #include "starboard/common/file.h"
 
+#include <cstring>
 #include <string>
 #include <vector>
 
@@ -58,8 +59,8 @@
   std::vector<char> entry(kSbFileMaxName);
 
   while (SbDirectoryGetNext(dir, entry.data(), kSbFileMaxName)) {
-    if (!SbStringCompareAll(entry.data(), ".") ||
-        !SbStringCompareAll(entry.data(), "..")) {
+    if (!strcmp(entry.data(), ".") ||
+        !strcmp(entry.data(), "..")) {
       continue;
     }
 
@@ -70,8 +71,8 @@
   SbDirectoryEntry entry;
 
   while (SbDirectoryGetNext(dir, &entry)) {
-    if (!SbStringCompareAll(entry.name, ".") ||
-        !SbStringCompareAll(entry.name, "..")) {
+    if (!strcmp(entry.name, ".") ||
+        !strcmp(entry.name, "..")) {
       continue;
     }
 
diff --git a/src/starboard/common/log.cc b/src/starboard/common/log.cc
index b8ded29..c0e4307 100644
--- a/src/starboard/common/log.cc
+++ b/src/starboard/common/log.cc
@@ -15,13 +15,13 @@
 #include "starboard/common/log.h"
 
 #include <algorithm>
+#include <cstring>
 #include <iomanip>
 #include <sstream>
-#include <string>
 
 #include "starboard/client_porting/eztime/eztime.h"
 #include "starboard/client_porting/poem/string_poem.h"
-#include "starboard/configuration.h"
+#include "starboard/common/string.h"
 #include "starboard/system.h"
 #include "starboard/thread.h"
 #include "starboard/time.h"
@@ -150,10 +150,7 @@
     // Ensure the first characters of the string are on the stack so they
     // are contained in minidumps for diagnostic purposes.
     char str_stack[1024];
-    const size_t copy_bytes =
-        std::min(SB_ARRAY_SIZE(str_stack), str_newline.length() + 1);
-    PoemStringCopyN(str_stack, str_newline.c_str(),
-                    static_cast<int>(copy_bytes));
+    starboard::strlcpy(str_stack, str_newline.c_str(), 1024);
 
     Alias(str_stack);
     Break();
diff --git a/src/starboard/common/memory.h b/src/starboard/common/memory.h
new file mode 100644
index 0000000..6d74d9a
--- /dev/null
+++ b/src/starboard/common/memory.h
@@ -0,0 +1,47 @@
+// Copyright 2021 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/memory.h"
+
+#ifndef STARBOARD_COMMON_MEMORY_H_
+#define STARBOARD_COMMON_MEMORY_H_
+
+namespace starboard {
+namespace common {
+
+// Checks whether |memory| is aligned to |alignment| bytes.
+static SB_C_FORCE_INLINE bool MemoryIsAligned(const void* memory,
+                                              size_t alignment) {
+  return ((uintptr_t)memory) % alignment == 0;
+}
+
+// Rounds |size| up to kSbMemoryPageSize.
+static SB_C_FORCE_INLINE size_t MemoryAlignToPageSize(size_t size) {
+  return (size + kSbMemoryPageSize - 1) & ~(kSbMemoryPageSize - 1);
+}
+
+// Returns true if the first |count| bytes of |buffer| are set to zero.
+static SB_C_FORCE_INLINE bool MemoryIsZero(const void* buffer, size_t count) {
+  if (count == 0) {
+    return true;
+  }
+  const char* char_buffer = (const char*)(buffer);
+  return char_buffer[0] == 0 &&
+         memcmp(char_buffer, char_buffer + 1, count - 1) == 0;
+}
+
+}  // namespace common
+}  // namespace starboard
+
+#endif  // STARBOARD_COMMON_MEMORY_H_
diff --git a/src/starboard/common/memory_test.cc b/src/starboard/common/memory_test.cc
new file mode 100644
index 0000000..c0b3743
--- /dev/null
+++ b/src/starboard/common/memory_test.cc
@@ -0,0 +1,43 @@
+// Copyright 2021 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/common/memory.h"
+
+#include "starboard/common/log.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace starboard {
+namespace common {
+namespace {
+
+TEST(MemoryIsAlignedTest, CheckAlignmentVariousSizes) {
+  uint64_t dummy = {0};  // 64-bit aligned
+  uint8_t* ptr = reinterpret_cast<uint8_t*>(dummy);
+  EXPECT_TRUE(MemoryIsAligned(ptr, 8));
+  EXPECT_TRUE(MemoryIsAligned(ptr + 4, 4));
+  EXPECT_FALSE(MemoryIsAligned(ptr + 4, 8));
+}
+
+TEST(MemoryAlignToPageSizeTest, AlignsVariousSizes) {
+  EXPECT_EQ(0, MemoryAlignToPageSize(0));
+  EXPECT_EQ(kSbMemoryPageSize, MemoryAlignToPageSize(1));
+  EXPECT_EQ(kSbMemoryPageSize, MemoryAlignToPageSize(kSbMemoryPageSize - 1));
+  EXPECT_EQ(kSbMemoryPageSize, MemoryAlignToPageSize(kSbMemoryPageSize));
+  EXPECT_EQ(100 * kSbMemoryPageSize,
+            MemoryAlignToPageSize(100 * kSbMemoryPageSize));
+}
+
+}  // namespace
+}  // namespace common
+}  // namespace starboard
diff --git a/src/starboard/common/murmurhash2.cc b/src/starboard/common/murmurhash2.cc
index eda6c09..9e183c0 100644
--- a/src/starboard/common/murmurhash2.cc
+++ b/src/starboard/common/murmurhash2.cc
@@ -25,11 +25,11 @@
     enum { kInlineSize = 1024 };
     if (size <= kInlineSize) {
       uint32_t aligned_src[kInlineSize / 4];
-      SbMemoryCopy(aligned_src, src, size);
+      memcpy(aligned_src, src, size);
       return MurmurHash2_32_Aligned(aligned_src, size, prev_hash);
     } else {
       scoped_array<char> aligned_src(new char[size]);
-      SbMemoryCopy(aligned_src.get(), src, size);
+      memcpy(aligned_src.get(), src, size);
       return MurmurHash2_32_Aligned(aligned_src.get(), size, prev_hash);
     }
   }
diff --git a/src/starboard/common/string.h b/src/starboard/common/string.h
index d22a774..3e80e46 100644
--- a/src/starboard/common/string.h
+++ b/src/starboard/common/string.h
@@ -20,7 +20,7 @@
 #define STARBOARD_COMMON_STRING_H_
 
 #include <stdarg.h>
-
+#include <cstring>
 #include <string>
 #include <vector>
 
@@ -56,7 +56,7 @@
   const char kDecToHex[] = "0123456789abcdef";
 
   std::string result;
-  auto delimiter_size = delimiter ? SbStringGetLength(delimiter) : 0;
+  auto delimiter_size = delimiter ? std::strlen(delimiter) : 0;
   result.reserve((delimiter_size + 2) * size);
 
   const uint8_t* data_in_uint8 = static_cast<const uint8_t*>(data);
@@ -72,6 +72,35 @@
   return result;
 }
 
+template <typename CHAR>
+static SB_C_FORCE_INLINE int strlcpy(CHAR* dst, const CHAR* src, int dst_size) {
+  for (int i = 0; i < dst_size; ++i) {
+    if ((dst[i] = src[i]) == 0)  // We hit and copied the terminating NULL.
+      return i;
+  }
+
+  // We were left off at dst_size.  We over copied 1 byte.  Null terminate.
+  if (dst_size != 0)
+    dst[dst_size - 1] = 0;
+
+  // Count the rest of the |src|, and return its length in characters.
+  while (src[dst_size])
+    ++dst_size;
+  return dst_size;
+}
+
+template <typename CHAR>
+static SB_C_FORCE_INLINE int strlcat(CHAR* dst, const CHAR* src, int dst_size) {
+  int dst_length = 0;
+  for (; dst_length < dst_size; ++dst_length) {
+    if (dst[dst_length] == 0)
+      break;
+  }
+
+  return strlcpy<CHAR>(dst + dst_length, src, dst_size - dst_length) +
+         dst_length;
+}
+
 }  // namespace starboard
 
 #endif  // STARBOARD_COMMON_STRING_H_
diff --git a/src/starboard/configuration_constants.h b/src/starboard/configuration_constants.h
index 1a1aac4..63ed478 100644
--- a/src/starboard/configuration_constants.h
+++ b/src/starboard/configuration_constants.h
@@ -25,7 +25,7 @@
 
 #if SB_API_VERSION >= 12
 
-// Determines the threshhold of allocation size that should be done with mmap
+// Determines the threshold of allocation size that should be done with mmap
 // (if available), rather than allocated within the core heap.
 extern const size_t kSbDefaultMmapThreshold;
 
diff --git a/src/starboard/decode_target.h b/src/starboard/decode_target.h
index 083215c..ce00b88 100644
--- a/src/starboard/decode_target.h
+++ b/src/starboard/decode_target.h
@@ -83,7 +83,7 @@
 //
 //     // If the decode works, you can get the texture out and render it.
 //     SbDecodeTargetInfo info;
-//     SbMemorySet(&info, 0, sizeof(info));
+//     memset(&info, 0, sizeof(info));
 //     SbDecodeTargetGetInfo(target, &info);
 //     GLuint texture =
 //         info.planes[kSbDecodeTargetPlaneRGBA].texture;
@@ -139,7 +139,7 @@
   // order.
   kSbDecodeTargetFormat3Plane10BitYUVI420,
 
-  // A decoder target format consisting of a single plane with pixels layed out
+  // A decoder target format consisting of a single plane with pixels laid out
   // in the format UYVY.  Since there are two Y values per sample, but only one
   // U value and only one V value, horizontally the Y resolution is twice the
   // size of both the U and V resolutions.  Vertically, they Y, U and V all
diff --git a/src/starboard/doc/c99.md b/src/starboard/doc/c99.md
index 8bdf3ac..0030329 100644
--- a/src/starboard/doc/c99.md
+++ b/src/starboard/doc/c99.md
@@ -36,11 +36,14 @@
 * isfinite
 * isnan
 * pow
+* sqrt
+* sqrtf
 ### <stdlib.h>
 * abs
 * atoi
 * atol
 * bsearch
+* strtof
 * strtod
 * strtol
 * strtoll
@@ -53,3 +56,23 @@
 * memcpy
 * memmove
 * memset
+* strcat
+* strchr
+* strcmp
+* strcspn
+* strlen
+* strncmp
+* strncat
+* strrchr
+* strstr
+* strspn
+### <wchar.h>
+* wcscat
+* wcschr
+* wcslen
+* wmemchr
+* wmemcmp
+* wmemcpy
+* wmemmove
+* wmemset
+* wcsncmp
diff --git a/src/starboard/doc/evergreen/cobalt_evergreen_lite.md b/src/starboard/doc/evergreen/cobalt_evergreen_lite.md
new file mode 100644
index 0000000..1dcbbc1
--- /dev/null
+++ b/src/starboard/doc/evergreen/cobalt_evergreen_lite.md
@@ -0,0 +1,178 @@
+Evergreen Lite Partner Doc
+
+
+## What is Cobalt Evergreen Lite?
+
+Evergreen Lite is a Cobalt configuration similar to Evergreen Full. Evergreen
+Lite takes advantage of the same Evergreen software architecture, but removes
+the need for additional storage and is missing the defining cloud-based Cobalt
+Updater feature used in Evergreen Full.
+
+Evergreen Lite relies on separating the Starboard (platform) and Cobalt (core)
+components of a Cobalt implementation into the following discrete components:
+
+![Evergreen Lite Overvew](resources/evergreen_lite_overview.png)
+
+## Components
+
+Google-built (on Google toolchain)
+
+
+*   Cobalt Core
+    *   Pre-built shared library available for all supported architectures
+*   Cobalt Updater - disabled
+
+Partner-built (on Partner toolchain)
+
+
+
+*   Starboard
+    *   Platform-specific implementation
+    *   Contains system dependencies (e.g. libpthread.so, libEGL.so)
+*   Cobalt Loader (Loader App)
+    *   Loads the Cobalt core shared library
+    *   An ELF loader is used to load the Cobalt core and resolves symbols with
+        Starboard APIs when Cobalt starts up in Evergreen mode
+*   Crash handler
+    *   Uploads crash reports to Google server when crash happens
+
+With this new Cobalt Evergreen platform architecture, less engineering effort is
+ necessary for a full Cobalt integration/deployment.
+
+**The idea here is you should only need to implement Starboard one time (as
+long as the Starboard API version is supported by Cobalt), and any Cobalt
+Core-level binary updates are provided by Google with pre-built
+configurations/symbols via our open-source releases
+([GitHub](https://github.com/youtube/cobalt/releases))**. These pre-built
+Cobalt Core Evergreen binaries should be a direct replacement to update Cobalt
+without any engineering work required. As Cobalt Core binaries are pre-built,
+they should only require platform testing. NOTE that certain new Cobalt
+features may require Starboard changes, so if you want to take advantage of
+some of these new features, Starboard changes may be necessary.
+
+### Benefits compared to non-Evergreen
+
+*   Less engineering work/accelerated timeline for Cobalt
+integration/deployment as Google builds Cobalt core code and partners only need
+to build and maintain the Starboard layer
+*   Performance enhancements as the Cobalt core is built with modern toolchain
+*   Crash reports are uploaded to Google backend and monitored by Google, so
+they can be acted on and addressed more quickly
+
+### New in Evergreen Lite compared to non-Evergreen
+
+*   New `loader_app` and `crashpad_handler` components required to be built
+on platform toolchains
+*   No Cobalt Core customization is allowed because the vanilla Cobalt Core
+binary is provided by Google.
+
+### Differences compared to Evergreen Full
+
+*   The Google-control cloud-based automatic updates are disabled. Instead,
+Cobalt provides the update binary to partners, and partners control the release
+process
+*   No extra storage required comparing to the existing software requirements
+
+## How is Evergreen different from porting Cobalt previously?
+
+Same as the [Evergreen full doc](https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/starboard/doc/evergreen/cobalt_evergreen_overview.md).
+
+## Building Cobalt Evergreen Components
+
+`kSbSystemPathStorageDirectory` is not required to implement. Set both
+`sb_evergreen_compatible` and `sb_evergreen_compatible_lite` to `1`s in the `gyp`
+platform config. The remaining is the same as the Evergreen full doc.
+
+## How does the update work with Evergreen Lite?
+
+Cobalt will release the Cobalt Core binary to partners for each Cobalt LTS
+major and minor release, and partners decide whether to update their devices
+with the latest Cobalt Core code via firmware OTA update. To update, partners
+only need to put the new Cobalt Core binary at the system image location under
+`<kSbSystemPathContentDirectory>/app/cobalt`. More about the system image slot
+is explained below.
+
+## Platform Requirements
+
+Cobalt Evergreen currently supports the following
+
+Target Architectures:
+
+*   `x86_32`
+*   `x86_64`
+*   `armv7 32`
+*   `armv8 64`
+
+Supported Javascript Engines
+
+*   V8
+
+## Building and Running Tests
+
+Same as the Evergreen Full doc -
+[cobalt_evergreen_overview.md](cobalt_evergreen_overview.md).
+
+## System Design
+
+### Cobalt Evergreen Components
+
+Cobalt updater is disabled. The binary will not check for updates by sending
+requests to the Google update server, nor download updates from the Google
+Download server.
+
+### Cobalt Evergreen Interfaces
+
+Same as the Evergreen Full doc -
+[cobalt_evergreen_overview.md](cobalt_evergreen_overview.md).
+
+### System Image Slot
+
+Evergreen Lite will have only one system image slot.  This is stored in the
+directory specified by `kSbSystemPathContentDirectory` under the
+`app/cobalt` subdirectory.
+
+```
+.
+├── content <--(kSbSystemPathContentDirectory)
+│   └── fonts <--(kSbSystemPathFontDirectory, `standard` or `limit` configuration)
+│   └── app
+│       └── cobalt <--(System image, provided by Google)
+│           ├── content <--(relative path defined in kSystemImageContentPath)
+│           │   ├── fonts <--(`empty` configuration)
+│           │   ├── icu
+│           │   ├── licenses
+│           │   ├── ssl
+│           ├── lib
+│           │   └── libcobalt.so
+│           └── manifest.json
+└── loader_app <--(Cobalt loader binary)
+└── crashpad_handler <--(Cobalt crash handler binary)
+```
+
+### Fonts
+
+Same as the Evergreen Full doc -
+[cobalt_evergreen_overview.md](cobalt_evergreen_overview.md).
+
+## How to run Evergreen Lite
+
+Launch Cobalt with the loader app binary with the `evergreen_lite` flag
+
+```
+$ ./loader_app --evergreen_lite
+```
+## FAQ
+
+### What’s the path from Evergreen Lite to Evergreen Full?
+
+*   Provision storage for the installation slots to contain downloaded update
+binaries - `kSbSystemPathStorageDirectory `and configure the slots as instructed
+in the Evergreen full doc
+*   Configure icu table under `kSbSystemPathStorageDirectory` to be shared
+    among slots
+*   Set `sb_evergreen_compatible_lite` to 0
+*   Implement the handling of pending updates
+*   Rebuild and rerun `nplb_evergreen_compat_tests`
+*   Launch Cobalt with loader app without the `evergreen_lite` flag
+
+More details can be found in the Evergreen Full doc.
diff --git a/src/starboard/doc/evergreen/cobalt_evergreen_overview.md b/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
index 247d19f..93bcde0 100644
--- a/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
+++ b/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -9,6 +9,16 @@
 updates without the need for supplemental Cobalt integration work on device
 platforms.
 
+There are two configurations available:
+*   Evergreen-Lite
+    *   Please read this document for general Evergreen details then see
+        Evergreen-Lite specific configuration details in
+        [cobalt_evergreen_lite.md](cobalt_evergreen_lite.md)
+*   Evergreen Full
+    *   Please continue reading below documentation for configuration details
+
+![Cobalt Evergreen Configurations](resources/cobalt_evergreen_configurations.png)
+
 For a bit of background context, as the number of Cobalt devices in the field
 increases there is a growing proliferation of version fragmentation. Many of
 these devices are unable to take advantage of the benefits of Cobalt
@@ -120,7 +130,7 @@
 Evergreen:
 
 *   `kSbSystemPathStorageDirectory`
-    *   Dedidated location for storing Cobalt Evergreen-related binaries
+    *   Dedicated location for storing Cobalt Evergreen-related binaries
     *   This path must be writable and have at least 96MB of reserved space for
         Evergreen updates. Please see the “Platforms Requirements” section below
         for more details.
@@ -399,17 +409,17 @@
 ```
 .
 ├── content <--(kSbSystemPathContentDirectory)
-│   └── fonts <--(kSbSystemPathFontDirectory, `standard` or `limit` configuration, to be explained below)
-│   └── app
-│       └── cobalt <--(SLOT_0)
-│           ├── content <--(relative path defined in kSystemImageContentPath)
-│           │   ├── fonts <--(`minimal` configuration)
-│           │   ├── (icu) <--(only present when it needs to be updated by Cobalt Update)
-│           │   ├── licenses
-│           │   ├── ssl
-│           ├── lib
-│           │   └── libcobalt.so <--(System image version of libcobalt.so)
-│           └── manifest.json
+│   └── fonts <--(kSbSystemPathFontDirectory, `standard` or `limit` configuration, to be explained below)
+│   └── app
+│       └── cobalt <--(SLOT_0)
+│           ├── content <--(relative path defined in kSystemImageContentPath)
+│           │   ├── fonts <--(`empty` configuration)
+│           │   ├── (icu) <--(only present when it needs to be updated by Cobalt Update)
+│           │   ├── licenses
+│           │   ├── ssl
+│           ├── lib
+│           │   └── libcobalt.so <--(System image version of libcobalt.so)
+│           └── manifest.json
 └── loader_app <--(Cobalt launcher binary)
 └── crashpad_handler <--(Cobalt crash handler)
 ```
@@ -420,18 +430,18 @@
 ```
 ├── .cobalt_storage <--(kSbSystemPathStorageDirectory)
     ├── cobalt_updater
-    │   └── prefs_<APP_KEY>.json
+    │   └── prefs_<APP_KEY>.json
     ├── installation_1 <--(SLOT_1 - currently unused)
     ├── installation_2 <--(SLOT_2 - contains new Cobalt version)
-    │   ├── content
-    │   │   ├── fonts <--(`minimal` configuration)
-    │   │   ├── (icu) <--(only present when it needs to be updated by Cobalt Update)
-    │   │   ├── licenses
-    │   │   ├── ssl
-    │   ├── lib
-    │   │   └── libcobalt.so <--(SLOT_2 version of libcobalt.so)
-    │   ├── manifest.fingerprint
-    │   └── manifest.json <-- (Evergreen version information of libcobalt.so under SLOT_2)
+    │   ├── content
+    │   │   ├── fonts <--(`empty` configuration)
+    │   │   ├── (icu) <--(only present when it needs to be updated by Cobalt Update)
+    │   │   ├── licenses
+    │   │   ├── ssl
+    │   ├── lib
+    │   │   └── libcobalt.so <--(SLOT_2 version of libcobalt.so)
+    │   ├── manifest.fingerprint
+    │   └── manifest.json <-- (Evergreen version information of libcobalt.so under SLOT_2)
     ├── installation_store_<APP_KEY>.pb
     └── icu (default location shared by installation slots, to be explained below)
 ```
@@ -460,13 +470,13 @@
 the system font directory and setting the `cobalt_font_package` to `standard` or
 `limited` in your port.
 
-Cobalt Evergreen (built by Google), will by default use the `minimal` font
-package which is around 16KB to minimize storage requirements. A separate
-`cobalt_font_package` variable is set to `minimal` in the Evergreen platform.
+Cobalt Evergreen (built by Google), will by default use the `empty` font
+package to minimize storage requirements. A separate
+`cobalt_font_package` variable is set to `empty` in the Evergreen platform.
 
 On Raspberry Pi this is:
 
-`minimal` set of fonts under:
+`empty` set of fonts under:
 ```
 <kSbSystemPathContentDirectory>/app/cobalt/content/fonts
 ```
@@ -508,13 +518,15 @@
 Evergreen can support multiple apps that share a Cobalt binary. This is a very
 common way to save space and keep all your Cobalt apps using the latest version
 of Cobalt. We understand that there are situations where updates are only needed
-for certain apps, so we have provided a way where Cobalt Updater behavior can be
-easily configured on a per-app basis with simple loader_app command-line flags.
+for certain apps, so we have provided a way where Cobalt Updater and loader_app
+behavior can be easily configured on a per-app basis with simple command-line flags.
 
-Currently, the only configurable option for Cobalt Updater configuration is:
-* --disable_updates *Turns off updates for the specified application. Note that
-  apps disabling updates will use the Cobalt version available in the System
-  Image.*
+The configurable options for Cobalt Updater configuration are:
+* `--evergreen_lite` *Use the System Image version of Cobalt under Slot_0 and turn
+  off the updater for the specified application.*
+* `--disable_updater_module` *Stay on the current version of Cobalt that might be the
+  system image or an installed update, and turn off the updater for the
+  specified application.*
 
 Each app’s Cobalt Updater will perform an independent, regular check for new
 Cobalt Evergreen updates. Note that all apps will share the same set of slots,
@@ -543,8 +555,8 @@
 binaries in SLOT_2.
 
 If `APP_3` has not been launched, not run through a regular Cobalt Updater
-check, or launched with the `--disable_updates` flag, it stays with its current
-configuration.
+check, or launched with the `--evergreen_lite`/`--disable_updater_module` flag,
+it stays with its current configuration.
 
 #### AFTER COBALT UPDATE
 ```
@@ -570,26 +582,27 @@
 loader_app --url="<YOUR_APP_3_URL>"
 
 
-# Only APP_1 gets Evergreen Updates, APP_2 wants to use an alternate splash screen
+# Only APP_1 gets Evergreen Updates, APP_2 disables the updater and uses an alternate splash screen, APP_3 uses
+# the system image and disables the updater
 [APP_1] (Cobalt Updater ENABLED)
 [APP_2] (Cobalt Updater DISABLED)
-[APP_3] (Cobalt Updater DISABLED)
+[APP_3] (System Image loaded, Cobalt Updater DISABLED)
 
 loader_app --url="<YOUR_APP_1_URL>"
-loader_app --url="<YOUR_APP_2_URL>" --disable_updates \
+loader_app --url="<YOUR_APP_2_URL>" --disable_updater_module \
 --fallback_splash_screen_url="/<PATH_TO_APP_2>/app_2_splash_screen.html"
-loader_app --url="<YOUR_APP_3_URL>" --disable_updates
+loader_app --url="<YOUR_APP_3_URL>" --evergreen_lite
 
 
-# APP_3 is a local app, wants Cobalt Updater disabled, and uses an alternate content directory
-# (This configuration is common for System UI apps. APP_3 in this example.)
+# APP_3 is a local app, wants Cobalt Updater disabled and stays on the system image, and uses an alternate content
+# directory (This configuration is common for System UI apps. APP_3 in this example.)
 [APP_1] (Cobalt Updater ENABLED)
 [APP_2] (Cobalt Updater ENABLED)
-[APP_3] (Cobalt Updater DISABLED)
+[APP_3] (System Image loaded, Cobalt Updater DISABLED)
 
 loader_app --url="<YOUR_APP_1_URL>"
 loader_app --url="<YOUR_APP_2_URL>"
-loader_app --csp_mode=disable --allow_http --url="file:///<PATH_TO_APP_3>/index.html" --content="/<PATH_TO_APP_3>/content" --disable_updates
+loader_app --csp_mode=disable --allow_http --url="file:///<PATH_TO_APP_3>/index.html" --content="/<PATH_TO_APP_3>/content" --evergreen_lite
 ```
 
 Please see
diff --git a/src/starboard/doc/evergreen/resources/cobalt_evergreen_configurations.png b/src/starboard/doc/evergreen/resources/cobalt_evergreen_configurations.png
new file mode 100644
index 0000000..8b3721c
--- /dev/null
+++ b/src/starboard/doc/evergreen/resources/cobalt_evergreen_configurations.png
Binary files differ
diff --git a/src/starboard/doc/evergreen/resources/evergreen_lite_overview.png b/src/starboard/doc/evergreen/resources/evergreen_lite_overview.png
new file mode 100644
index 0000000..fa338d9
--- /dev/null
+++ b/src/starboard/doc/evergreen/resources/evergreen_lite_overview.png
Binary files differ
diff --git a/src/starboard/elf_loader/dynamic_section_test.cc b/src/starboard/elf_loader/dynamic_section_test.cc
index 3a8d55c..258a417 100644
--- a/src/starboard/elf_loader/dynamic_section_test.cc
+++ b/src/starboard/elf_loader/dynamic_section_test.cc
@@ -183,7 +183,7 @@
   dynamic_section_memory.dynamic_table_[1].d_un.d_ptr =
       reinterpret_cast<Addr>(dynamic_section_memory.string_table_) - base_addr;
 
-  SbMemoryCopy(dynamic_section_memory.string_table_, "test1\x00test2\x00", 12);
+  memcpy(dynamic_section_memory.string_table_, "test1\x00test2\x00", 12);
 
   dynamic_section_memory.symbol_table_[0].st_name = 0;  // the offset of test1
   dynamic_section_memory.symbol_table_[1].st_name = 6;  // the offset of test2
@@ -195,8 +195,8 @@
   ASSERT_EQ(dynamic_section_memory.dynamic_table_, d.GetDynamicTable());
   ASSERT_EQ(2, d.GetDynamicTableSize());
 
-  ASSERT_EQ(0, SbStringCompareAll("test1", d.LookupNameById(0)));
-  ASSERT_EQ(0, SbStringCompareAll("test2", d.LookupNameById(1)));
+  ASSERT_EQ(0, strcmp("test1", d.LookupNameById(0)));
+  ASSERT_EQ(0, strcmp("test2", d.LookupNameById(1)));
 }
 
 }  // namespace
diff --git a/src/starboard/elf_loader/elf_hash_table.cc b/src/starboard/elf_loader/elf_hash_table.cc
index b6b6c70..11580e0 100644
--- a/src/starboard/elf_loader/elf_hash_table.cc
+++ b/src/starboard/elf_loader/elf_hash_table.cc
@@ -13,6 +13,9 @@
 // limitations under the License.
 
 #include "starboard/elf_loader/elf_hash_table.h"
+
+#include <cstring>
+
 #include "starboard/string.h"
 
 namespace starboard {
@@ -59,7 +62,7 @@
        n = hash_chain_[n]) {
     const Sym* symbol = &symbol_table[n];
     // Check that the symbol has the appropriate name.
-    if (!SbStringCompareAll(string_table + symbol->st_name, symbol_name))
+    if (!strcmp(string_table + symbol->st_name, symbol_name))
       return symbol;
   }
   return NULL;
diff --git a/src/starboard/elf_loader/elf_header.cc b/src/starboard/elf_loader/elf_header.cc
index 74695ca..c13acf4 100644
--- a/src/starboard/elf_loader/elf_header.cc
+++ b/src/starboard/elf_loader/elf_header.cc
@@ -33,7 +33,7 @@
     return false;
   }
 
-  if (SbMemoryCompare(elf_header_->e_ident, ELFMAG, SELFMAG) != 0) {
+  if (memcmp(elf_header_->e_ident, ELFMAG, SELFMAG) != 0) {
     SB_LOG(ERROR) << "Bad ELF magic: " << elf_header_->e_ident;
     return false;
   }
diff --git a/src/starboard/elf_loader/elf_header_test.cc b/src/starboard/elf_loader/elf_header_test.cc
index b58c2a9..a00805b 100644
--- a/src/starboard/elf_loader/elf_header_test.cc
+++ b/src/starboard/elf_loader/elf_header_test.cc
@@ -41,7 +41,7 @@
       SB_LOG(ERROR) << "ReadFromOffset: Invalid size " << size;
       return false;
     }
-    SbMemoryCopy(buffer, buffer_, size);
+    memcpy(buffer, buffer_, size);
     return true;
   }
   void Close() {}
@@ -55,7 +55,7 @@
  protected:
   ElfHeaderTest() {
     elf_header_.reset(new ElfHeader());
-    SbMemorySet(reinterpret_cast<char*>(&ehdr_data_), 0, sizeof(ehdr_data_));
+    memset(reinterpret_cast<char*>(&ehdr_data_), 0, sizeof(ehdr_data_));
     ehdr_data_.e_machine = ELF_MACHINE;
     ehdr_data_.e_ident[0] = 0x7F;
     ehdr_data_.e_ident[1] = 'E';
diff --git a/src/starboard/elf_loader/elf_loader_impl.cc b/src/starboard/elf_loader/elf_loader_impl.cc
index 71b1da0..7445332 100644
--- a/src/starboard/elf_loader/elf_loader_impl.cc
+++ b/src/starboard/elf_loader/elf_loader_impl.cc
@@ -34,7 +34,7 @@
   if (s.size() < suffix.size()) {
     return false;
   }
-  return SbStringCompareAll(s.c_str() + (s.size() - suffix.size()),
+  return strcmp(s.c_str() + (s.size() - suffix.size()),
                             suffix.c_str()) == 0;
 }
 
diff --git a/src/starboard/elf_loader/evergreen_info.cc b/src/starboard/elf_loader/evergreen_info.cc
index 875d215..553d820 100644
--- a/src/starboard/elf_loader/evergreen_info.cc
+++ b/src/starboard/elf_loader/evergreen_info.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/elf_loader/evergreen_info.h"
 
+#include <cstring>
+
 #include "starboard/atomic.h"
 #include "starboard/common/log.h"
 #include "starboard/memory.h"
@@ -32,7 +34,7 @@
     return false;
   }
   if (evergreen_info != NULL && evergreen_info->base_address != 0 &&
-      SbStringGetLength(evergreen_info->file_path_buf) != 0) {
+      strlen(evergreen_info->file_path_buf) != 0) {
     g_evergreen_info = *evergreen_info;
     g_valid_info = true;
   } else {
diff --git a/src/starboard/elf_loader/exported_symbols.cc b/src/starboard/elf_loader/exported_symbols.cc
index 75c8128..c6b56f6 100644
--- a/src/starboard/elf_loader/exported_symbols.cc
+++ b/src/starboard/elf_loader/exported_symbols.cc
@@ -131,7 +131,9 @@
   REGISTER_SYMBOL(SbFileWrite);
   REGISTER_SYMBOL(SbMediaGetAudioConfiguration);
   REGISTER_SYMBOL(SbMediaGetAudioOutputCount);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbMediaIsSupported);
+#endif  // SB_API_VERSION < 13
   REGISTER_SYMBOL(SbMemoryAllocate);
   REGISTER_SYMBOL(SbMemoryAllocateAligned);
   REGISTER_SYMBOL(SbMemoryAllocateNoReport);
@@ -152,15 +154,21 @@
   REGISTER_SYMBOL(SbMediaCanPlayMimeAndKeySystem);
   REGISTER_SYMBOL(SbMemoryAllocateAlignedUnchecked);
   REGISTER_SYMBOL(SbMemoryAllocateUnchecked);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbMemoryCompare);
   REGISTER_SYMBOL(SbMemoryCopy);
   REGISTER_SYMBOL(SbMemoryFindByte);
+#endif
   REGISTER_SYMBOL(SbMemoryFree);
   REGISTER_SYMBOL(SbMemoryFreeAligned);
   REGISTER_SYMBOL(SbMemoryGetStackBounds);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbMemoryMove);
+#endif
   REGISTER_SYMBOL(SbMemoryReallocateUnchecked);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbMemorySet);
+#endif
   REGISTER_SYMBOL(SbMutexAcquire);
   REGISTER_SYMBOL(SbMutexAcquireTry);
   REGISTER_SYMBOL(SbMutexCreate);
@@ -211,24 +219,30 @@
   REGISTER_SYMBOL(SbStorageOpenRecord);
   REGISTER_SYMBOL(SbStorageReadRecord);
   REGISTER_SYMBOL(SbStorageWriteRecord);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbStringCompare);
   REGISTER_SYMBOL(SbStringCompareAll);
+#endif
   REGISTER_SYMBOL(SbStringCompareNoCase);
   REGISTER_SYMBOL(SbStringCompareNoCaseN);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbStringCompareWide);
   REGISTER_SYMBOL(SbStringConcat);
   REGISTER_SYMBOL(SbStringConcatWide);
   REGISTER_SYMBOL(SbStringCopy);
   REGISTER_SYMBOL(SbStringCopyWide);
+#endif  // SB_API_VERSION >= 13
   REGISTER_SYMBOL(SbStringDuplicate);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbStringFindCharacter);
   REGISTER_SYMBOL(SbStringFindLastCharacter);
   REGISTER_SYMBOL(SbStringFindString);
+#endif
   REGISTER_SYMBOL(SbStringFormat);
   REGISTER_SYMBOL(SbStringFormatWide);
+#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbStringGetLength);
   REGISTER_SYMBOL(SbStringGetLengthWide);
-#if SB_API_VERSION < 13
   REGISTER_SYMBOL(SbStringParseDouble);
   REGISTER_SYMBOL(SbStringParseSignedInteger);
   REGISTER_SYMBOL(SbStringParseUInt64);
diff --git a/src/starboard/elf_loader/gnu_hash_table.cc b/src/starboard/elf_loader/gnu_hash_table.cc
index 9e413db..3d7b529 100644
--- a/src/starboard/elf_loader/gnu_hash_table.cc
+++ b/src/starboard/elf_loader/gnu_hash_table.cc
@@ -13,6 +13,9 @@
 // limitations under the License.
 
 #include "starboard/elf_loader/gnu_hash_table.h"
+
+#include <cstring>
+
 #include "starboard/common/log.h"
 #include "starboard/elf_loader/log.h"
 #include "starboard/string.h"
@@ -125,8 +128,7 @@
     const uint32_t sym_hash = chain_[sym_index - sym_offset_];
     const char* sym_name = string_table + sym->st_name;
 
-    if ((sym_hash | 1) == (hash | 1) &&
-        !SbStringCompareAll(sym_name, symbol_name)) {
+    if ((sym_hash | 1) == (hash | 1) && !strcmp(sym_name, symbol_name)) {
       return sym;
     }
 
diff --git a/src/starboard/elf_loader/lz4_file_impl.cc b/src/starboard/elf_loader/lz4_file_impl.cc
index 9231c8c..e464251 100644
--- a/src/starboard/elf_loader/lz4_file_impl.cc
+++ b/src/starboard/elf_loader/lz4_file_impl.cc
@@ -145,7 +145,7 @@
   if ((offset < 0) || (offset + size >= decompressed_data_.size())) {
     return false;
   }
-  SbMemoryCopy(buffer, decompressed_data_.data() + offset, size);
+  memcpy(buffer, decompressed_data_.data() + offset, size);
   return true;
 }
 
diff --git a/src/starboard/elf_loader/lz4_file_impl_test.cc b/src/starboard/elf_loader/lz4_file_impl_test.cc
index fa83e2e..21c5858 100644
--- a/src/starboard/elf_loader/lz4_file_impl_test.cc
+++ b/src/starboard/elf_loader/lz4_file_impl_test.cc
@@ -66,7 +66,7 @@
 
   EXPECT_TRUE(file.ReadFromOffset(0, decompressed,
                                   SB_ARRAY_SIZE(kUncompressedData) - 1));
-  EXPECT_EQ(SbStringCompareAll(decompressed, kUncompressedData), 0);
+  EXPECT_EQ(strcmp(decompressed, kUncompressedData), 0);
 }
 
 }  // namespace
diff --git a/src/starboard/elf_loader/program_table.cc b/src/starboard/elf_loader/program_table.cc
index bab921d..2684338 100644
--- a/src/starboard/elf_loader/program_table.cc
+++ b/src/starboard/elf_loader/program_table.cc
@@ -15,6 +15,7 @@
 #include "starboard/elf_loader/program_table.h"
 
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/elf_loader/evergreen_info.h"
 #include "starboard/elf_loader/log.h"
 #include "starboard/memory.h"
@@ -65,7 +66,8 @@
   SB_DLOG(INFO) << "elf_header->e_phnum=" << elf_header->e_phnum;
 
   Addr page_min = PAGE_START(elf_header->e_phoff);
-  Addr page_max = PAGE_END(elf_header->e_phoff + (phdr_num_ * elf_header->e_phentsize));
+  Addr page_max =
+      PAGE_END(elf_header->e_phoff + (phdr_num_ * elf_header->e_phentsize));
   Addr page_offset = PAGE_OFFSET(elf_header->e_phoff);
 
   SB_DLOG(INFO) << "page_min=" << page_min;
@@ -217,8 +219,8 @@
     // if the segment is writable, and does not end on a page boundary,
     // zero-fill it until the page limit.
     if ((phdr->p_flags & PF_W) != 0 && PAGE_OFFSET(seg_file_end) > 0) {
-      SbMemorySet(reinterpret_cast<void*>(seg_file_end), 0,
-                  PAGE_SIZE - PAGE_OFFSET(seg_file_end));
+      memset(reinterpret_cast<void*>(seg_file_end), 0,
+             PAGE_SIZE - PAGE_OFFSET(seg_file_end));
     }
 
     seg_file_end = PAGE_END(seg_file_end);
@@ -241,8 +243,8 @@
       SB_CHECK(false);
 #endif
 
-      SbMemorySet(reinterpret_cast<void*>(seg_file_end), 0,
-                  seg_page_end - seg_file_end);
+      memset(reinterpret_cast<void*>(seg_file_end), 0,
+             seg_page_end - seg_file_end);
 #if (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
       SbMemoryProtect(reinterpret_cast<void*>(seg_file_end),
                       seg_page_end - seg_file_end,
@@ -379,9 +381,9 @@
 
 void ProgramTable::PublishEvergreenInfo(const char* file_path) {
   EvergreenInfo evergreen_info;
-  SbMemorySet(&evergreen_info, sizeof(EvergreenInfo), 0);
-  SbStringCopy(evergreen_info.file_path_buf, file_path,
-               EVERGREEN_FILE_PATH_MAX_SIZE);
+  memset(&evergreen_info, 0, sizeof(EvergreenInfo));
+  starboard::strlcpy(evergreen_info.file_path_buf, file_path,
+                     EVERGREEN_FILE_PATH_MAX_SIZE);
   evergreen_info.base_address = base_memory_address_;
   evergreen_info.load_size = load_size_;
   evergreen_info.phdr_table = (uint64_t)phdr_table_;
@@ -389,8 +391,8 @@
 
   std::vector<char> tmp(build_id_.begin(), build_id_.end());
   tmp.push_back('\0');
-  SbStringCopy(evergreen_info.build_id, tmp.data(),
-               EVERGREEN_BUILD_ID_MAX_SIZE);
+  starboard::strlcpy(evergreen_info.build_id, tmp.data(),
+                     EVERGREEN_BUILD_ID_MAX_SIZE);
   evergreen_info.build_id_length = build_id_.size();
 
   SetEvergreenInfo(&evergreen_info);
diff --git a/src/starboard/elf_loader/program_table_test.cc b/src/starboard/elf_loader/program_table_test.cc
index 31604ee..4e56dd7 100644
--- a/src/starboard/elf_loader/program_table_test.cc
+++ b/src/starboard/elf_loader/program_table_test.cc
@@ -60,7 +60,7 @@
                     << file_chunk.size_;
       return false;
     }
-    SbMemoryCopy(buffer, file_chunk.buffer_, size);
+    memcpy(buffer, file_chunk.buffer_, size);
     return true;
   }
   void Close() {}
@@ -99,9 +99,9 @@
   Phdr ent1;
   Phdr ent2;
   Phdr ent3;
-  SbMemorySet(&ent1, 0, sizeof(Phdr));
-  SbMemorySet(&ent2, 0, sizeof(Phdr));
-  SbMemorySet(&ent3, 0, sizeof(Phdr));
+  memset(&ent1, 0, sizeof(Phdr));
+  memset(&ent2, 0, sizeof(Phdr));
+  memset(&ent3, 0, sizeof(Phdr));
 
   ent1.p_type = PT_LOAD;
   ent1.p_vaddr = 0;
@@ -135,14 +135,14 @@
   dynamic_table_data[2].d_tag = DT_DEBUG;
 
   char program_table_page[PAGE_SIZE];
-  SbMemorySet(program_table_page, 0, sizeof(program_table_page));
-  SbMemoryCopy(program_table_page, program_table_data,
+  memset(program_table_page, 0, sizeof(program_table_page));
+  memcpy(program_table_page, program_table_data,
                sizeof(program_table_data));
 
   char segment_file_data1[2 * PAGE_SIZE];
   char segment_file_data2[3 * PAGE_SIZE];
 
-  SbMemoryCopy(segment_file_data1 + 250, dynamic_table_data,
+  memcpy(segment_file_data1 + 250, dynamic_table_data,
                sizeof(dynamic_table_data));
 
   std::vector<DummyFile::FileChunk> file_chunks;
diff --git a/src/starboard/elf_loader/relocations_test.cc b/src/starboard/elf_loader/relocations_test.cc
index 20010e5..71d0d12 100644
--- a/src/starboard/elf_loader/relocations_test.cc
+++ b/src/starboard/elf_loader/relocations_test.cc
@@ -34,7 +34,7 @@
 class RelocationsTest : public ::testing::Test {
  protected:
   RelocationsTest() {
-    SbMemorySet(buf_, 'A', sizeof(buf_));
+    memset(buf_, 'A', sizeof(buf_));
     base_addr_ = reinterpret_cast<Addr>(&buf_);
     dynamic_table_[0].d_tag = DT_REL;
 
diff --git a/src/starboard/elf_loader/sabi_string.cc b/src/starboard/elf_loader/sabi_string.cc
index fd0f29a..d80ebf5 100644
--- a/src/starboard/elf_loader/sabi_string.cc
+++ b/src/starboard/elf_loader/sabi_string.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/elf_loader/sabi_string.h"
 
+#include <cstring>
+
 #include "starboard/common/log.h"
 #include "starboard/string.h"
 
@@ -36,7 +38,7 @@
     return false;
   }
   SB_DLOG(INFO) << "sabi_function result: " << sabi_function();
-  if (SbStringCompareAll(sabi_function(), SB_SABI_JSON_ID) != 0) {
+  if (strcmp(sabi_function(), SB_SABI_JSON_ID) != 0) {
     SB_LOG(ERROR) << "Expected SB_SABI_JSON_ID=" << SB_SABI_JSON_ID;
     SB_LOG(ERROR) << "Actual   SB_SABI_JSON_ID=" << sabi_function();
     return false;
diff --git a/src/starboard/elf_loader/sandbox.cc b/src/starboard/elf_loader/sandbox.cc
index 491577f..9f4e044 100644
--- a/src/starboard/elf_loader/sandbox.cc
+++ b/src/starboard/elf_loader/sandbox.cc
@@ -15,6 +15,7 @@
 #include <string>
 
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/elf_loader/elf_loader.h"
 #include "starboard/elf_loader/elf_loader_constants.h"
 #include "starboard/elf_loader/evergreen_info.h"
@@ -80,9 +81,9 @@
     SB_LOG(ERROR) << "Failed to get user agent string";
   } else {
     CrashpadAnnotations cobalt_version_info;
-    SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0);
-    SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(),
-                 USER_AGENT_STRING_MAX_SIZE);
+    memset(&cobalt_version_info, 0, sizeof(CrashpadAnnotations));
+    starboard::strlcpy(cobalt_version_info.user_agent_string,
+                       get_user_agent_func(), USER_AGENT_STRING_MAX_SIZE);
     third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
         cobalt_version_info);
     SB_DLOG(INFO) << "Added user agent string to Crashpad.";
diff --git a/src/starboard/event.h b/src/starboard/event.h
index 3649d12..3cd5dd8 100644
--- a/src/starboard/event.h
+++ b/src/starboard/event.h
@@ -457,6 +457,9 @@
 // Structure representing a Starboard event and its data.
 typedef struct SbEvent {
   SbEventType type;
+#if SB_API_VERSION >= 13
+  SbTimeMonotonic timestamp;
+#endif  // SB_API_VERSION >= 13
   void* data;
 } SbEvent;
 
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/evergreen/arm/hardfp/sbversion/13/atomic_public.h
similarity index 63%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/evergreen/arm/hardfp/sbversion/13/atomic_public.h
index 9031c7b..af45085 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/evergreen/arm/hardfp/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_ATOMIC_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/evergreen/arm/hardfp/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/evergreen/arm/hardfp/sbversion/13/configuration_public.h b/src/starboard/evergreen/arm/hardfp/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..3287655
--- /dev/null
+++ b/src/starboard/evergreen/arm/hardfp/sbversion/13/configuration_public.h
@@ -0,0 +1,26 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for X86_64. Other devices will have
+// specific Starboard implementations.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/evergreen/arm/hardfp/configuration_public.h"
+
+#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.gypi b/src/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.gypi
new file mode 100644
index 0000000..64ff1ab
--- /dev/null
+++ b/src/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.gypi
@@ -0,0 +1,42 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'variables': {
+    'sb_target_platform': 'evergreen-arm-hardfp',
+  },
+  'target_defaults': {
+    'default_configuration': 'evergreen-arm-hardfp-sbversion-13_debug',
+    'configurations': {
+      'evergreen-arm-hardfp-sbversion-13_debug': {
+        'inherit_from': ['debug_base'],
+      },
+      'evergreen-arm-hardfp-sbversion-13_devel': {
+        'inherit_from': ['devel_base'],
+      },
+      'evergreen-arm-hardfp-sbversion-13_qa': {
+        'inherit_from': ['qa_base'],
+      },
+      'evergreen-arm-hardfp-sbversion-13_gold': {
+        'inherit_from': ['gold_base'],
+      },
+    }, # end of configurations
+  },
+  'includes': [
+    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
+  ],
+}
diff --git a/src/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.py b/src/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..3cfa91a
--- /dev/null
+++ b/src/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.py
@@ -0,0 +1,25 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+"""Starboard evergreen-arm-hardfp platform configuration for gyp_cobalt."""
+
+from starboard.evergreen.arm.shared import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+  return parent_configuration.EvergreenArmConfiguration(
+      'evergreen-arm-hardfp-sbversion-13',
+      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v13.json')
diff --git a/src/starboard/evergreen/arm/hardfp/sbversion/13/starboard_platform.gyp b/src/starboard/evergreen/arm/hardfp/sbversion/13/starboard_platform.gyp
new file mode 100644
index 0000000..b7ff227
--- /dev/null
+++ b/src/starboard/evergreen/arm/hardfp/sbversion/13/starboard_platform.gyp
@@ -0,0 +1,24 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/evergreen/arm/hardfp/starboard_platform.gyp',
+  ],
+}
diff --git a/src/starboard/evergreen/arm/hardfp/sbversion/13/thread_types_public.h b/src/starboard/evergreen/arm/hardfp/sbversion/13/thread_types_public.h
new file mode 100644
index 0000000..e83e2b5
--- /dev/null
+++ b/src/starboard/evergreen/arm/hardfp/sbversion/13/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2021 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/evergreen/arm/hardfp/thread_types_public.h"
+
+#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/evergreen/arm/softfp/sbversion/13/atomic_public.h
similarity index 63%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/evergreen/arm/softfp/sbversion/13/atomic_public.h
index 9031c7b..b67fc64 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/evergreen/arm/softfp/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_ATOMIC_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/evergreen/arm/softfp/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/evergreen/arm/softfp/sbversion/13/configuration_public.h b/src/starboard/evergreen/arm/softfp/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..d717491
--- /dev/null
+++ b/src/starboard/evergreen/arm/softfp/sbversion/13/configuration_public.h
@@ -0,0 +1,26 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for X86_64. Other devices will have
+// specific Starboard implementations.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/evergreen/arm/softfp/configuration_public.h"
+
+#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.gypi b/src/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.gypi
new file mode 100644
index 0000000..8ecb4de
--- /dev/null
+++ b/src/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.gypi
@@ -0,0 +1,42 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'variables': {
+    'sb_target_platform': 'evergreen-arm-softfp',
+  },
+  'target_defaults': {
+    'default_configuration': 'evergreen-arm-softfp-sbversion-13_debug',
+    'configurations': {
+      'evergreen-arm-softfp-sbversion-13_debug': {
+        'inherit_from': ['debug_base'],
+      },
+      'evergreen-arm-softfp-sbversion-13_devel': {
+        'inherit_from': ['devel_base'],
+      },
+      'evergreen-arm-softfp-sbversion-13_qa': {
+        'inherit_from': ['qa_base'],
+      },
+      'evergreen-arm-softfp-sbversion-13_gold': {
+        'inherit_from': ['gold_base'],
+      },
+    }, # end of configurations
+  },
+  'includes': [
+    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
+  ],
+}
diff --git a/src/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.py b/src/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..6bfdced
--- /dev/null
+++ b/src/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.py
@@ -0,0 +1,25 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+"""Starboard evergreen-arm-softfp platform configuration for gyp_cobalt."""
+
+from starboard.evergreen.arm.shared import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+  return parent_configuration.EvergreenArmConfiguration(
+      'evergreen-arm-softfp-sbversion-13',
+      sabi_json_path='starboard/sabi/arm/softfp/sabi-v13.json')
diff --git a/src/starboard/evergreen/arm/softfp/sbversion/13/starboard_platform.gyp b/src/starboard/evergreen/arm/softfp/sbversion/13/starboard_platform.gyp
new file mode 100644
index 0000000..5abba9c
--- /dev/null
+++ b/src/starboard/evergreen/arm/softfp/sbversion/13/starboard_platform.gyp
@@ -0,0 +1,24 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/evergreen/arm/softfp/starboard_platform.gyp',
+  ],
+}
diff --git a/src/starboard/evergreen/arm/softfp/sbversion/13/thread_types_public.h b/src/starboard/evergreen/arm/softfp/sbversion/13/thread_types_public.h
new file mode 100644
index 0000000..555151a
--- /dev/null
+++ b/src/starboard/evergreen/arm/softfp/sbversion/13/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2021 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/evergreen/arm/softfp/thread_types_public.h"
+
+#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/evergreen/arm64/sbversion/13/atomic_public.h
similarity index 64%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/evergreen/arm64/sbversion/13/atomic_public.h
index 9031c7b..e67d7af 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/evergreen/arm64/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM64_SBVERSION_13_ATOMIC_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/evergreen/arm64/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/evergreen/arm64/sbversion/13/configuration_public.h b/src/starboard/evergreen/arm64/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..10bd72d
--- /dev/null
+++ b/src/starboard/evergreen/arm64/sbversion/13/configuration_public.h
@@ -0,0 +1,26 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for X86_64. Other devices will have
+// specific Starboard implementations.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/evergreen/arm64/configuration_public.h"
+
+#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/evergreen/arm64/sbversion/13/gyp_configuration.gypi b/src/starboard/evergreen/arm64/sbversion/13/gyp_configuration.gypi
new file mode 100644
index 0000000..b7e7007
--- /dev/null
+++ b/src/starboard/evergreen/arm64/sbversion/13/gyp_configuration.gypi
@@ -0,0 +1,58 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'variables': {
+    'yasm_exists': 1,
+    'sb_target_platform': 'evergreen-arm64',
+
+    'compiler_flags': [
+      '-isystem<(cobalt_repo_root)/third_party/musl/arch/aarch64',
+    ],
+  },
+
+  'target_defaults': {
+    'defines' : [
+      # Ensure that the Starboardized __external_threading file is included.
+      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
+      # Ensure that only the forward declarations and type definitions are included
+      # in __external_threading.
+      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
+      # Enable GNU extensions to get prototypes like ffsl.
+      '_GNU_SOURCE=1',
+    ],
+    'default_configuration': 'evergreen-arm64-sbversion-13_debug',
+    'configurations': {
+      'evergreen-arm64-sbversion-13_debug': {
+        'inherit_from': ['debug_base'],
+      },
+      'evergreen-arm64-sbversion-13_devel': {
+        'inherit_from': ['devel_base'],
+      },
+      'evergreen-arm64-sbversion-13_qa': {
+        'inherit_from': ['qa_base'],
+      },
+      'evergreen-arm64-sbversion-13_gold': {
+        'inherit_from': ['gold_base'],
+      },
+    }, # end of configurations
+  },
+  'includes': [
+    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
+    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
+  ],
+}
diff --git a/src/starboard/evergreen/arm64/sbversion/13/gyp_configuration.py b/src/starboard/evergreen/arm64/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..6fc96e2
--- /dev/null
+++ b/src/starboard/evergreen/arm64/sbversion/13/gyp_configuration.py
@@ -0,0 +1,22 @@
+# Copyright 2021 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.
+"""Starboard evergreen-arm64 platform configuration for gyp_cobalt."""
+
+from starboard.evergreen.arm64 import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+  return parent_configuration.EvergreenArm64Configuration(
+      'evergreen-arm64-sbversion-13',
+      sabi_json_path='starboard/sabi/arm64/sabi-v13.json')
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/evergreen/arm64/sbversion/13/starboard_platform.gyp
similarity index 62%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/evergreen/arm64/sbversion/13/starboard_platform.gyp
index 97c4786..fbeb29d 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/evergreen/arm64/sbversion/13/starboard_platform.gyp
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -13,17 +13,9 @@
 # limitations under the License.
 
 {
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/evergreen/arm64/starboard_platform.gyp',
   ],
 }
diff --git a/src/starboard/evergreen/arm64/sbversion/13/thread_types_public.h b/src/starboard/evergreen/arm64/sbversion/13/thread_types_public.h
new file mode 100644
index 0000000..313f24a
--- /dev/null
+++ b/src/starboard/evergreen/arm64/sbversion/13/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2021 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_EVERGREEN_ARM64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/evergreen/arm64/thread_types_public.h"
+
+#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/evergreen/testing/README.md b/src/starboard/evergreen/testing/README.md
index df5a7af5..69a7590 100644
--- a/src/starboard/evergreen/testing/README.md
+++ b/src/starboard/evergreen/testing/README.md
@@ -65,7 +65,7 @@
 * `tests/continuous_updates_test.sh`
 * `tests/crashing_binary_test.sh`
 * `tests/crashpad_runs_test.sh`
-* `tests/disabled_updater_test.sh`
+* `tests/evergreen_lite_test.sh`
 * `tests/load_slot_being_updated_test.sh`
 * `tests/mismatched_architecture_test.sh`
 * `tests/noop_binary_test.sh`
diff --git a/src/starboard/evergreen/testing/run_all_tests.sh b/src/starboard/evergreen/testing/run_all_tests.sh
index c59ef84..9114777 100755
--- a/src/starboard/evergreen/testing/run_all_tests.sh
+++ b/src/starboard/evergreen/testing/run_all_tests.sh
@@ -47,9 +47,8 @@
 
   log "info" " [ RUN      ] ${TEST_NAME}"
 
-  run_test
-
-  RESULT=$?
+  # Temporarily disable all tests until Omaha config handles SB14.
+  RESULT=2
 
   if [[ "${RESULT}" -eq 0 ]]; then
     log "info"  " [   PASSED ] ${TEST_NAME}"
diff --git a/src/starboard/evergreen/testing/tests/disabled_updater_test.sh b/src/starboard/evergreen/testing/tests/evergreen_lite_test.sh
similarity index 94%
rename from src/starboard/evergreen/testing/tests/disabled_updater_test.sh
rename to src/starboard/evergreen/testing/tests/evergreen_lite_test.sh
index 7bcb49e..42d37a3 100755
--- a/src/starboard/evergreen/testing/tests/disabled_updater_test.sh
+++ b/src/starboard/evergreen/testing/tests/evergreen_lite_test.sh
@@ -19,7 +19,7 @@
 unset TEST_FILE
 unset -f run_test
 
-TEST_NAME="DisabledUpdater"
+TEST_NAME="EvergreenLite"
 TEST_FILE="test.html"
 
 function run_test() {
@@ -39,7 +39,7 @@
     return 1
   fi
 
-  cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.2.log" "disable_updates=1" "--disable_updates"
+  cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.2.log" "evergreen_lite=1" "--evergreen_lite"
 
   if [[ $? -ne 0 ]]; then
     log "error" "Failed to run system installation"
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/evergreen/x64/sbversion/13/atomic_public.h
similarity index 65%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/evergreen/x64/sbversion/13/atomic_public.h
index 9031c7b..f7a23d3 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/evergreen/x64/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_EVERGREEN_X64_SBVERSION_13_ATOMIC_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/evergreen/x64/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/evergreen/x64/sbversion/13/configuration_public.h b/src/starboard/evergreen/x64/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..feb9e8d
--- /dev/null
+++ b/src/starboard/evergreen/x64/sbversion/13/configuration_public.h
@@ -0,0 +1,26 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for x64. Other devices will have
+// specific Starboard implementations.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_EVERGREEN_X64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/evergreen/x64/configuration_public.h"
+
+#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/evergreen/x64/sbversion/13/gyp_configuration.gypi b/src/starboard/evergreen/x64/sbversion/13/gyp_configuration.gypi
new file mode 100644
index 0000000..46858d1
--- /dev/null
+++ b/src/starboard/evergreen/x64/sbversion/13/gyp_configuration.gypi
@@ -0,0 +1,58 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'variables': {
+    'yasm_exists': 1,
+    'sb_target_platform': 'evergreen-x64',
+
+    'compiler_flags': [
+      '-isystem<(cobalt_repo_root)/third_party/musl/arch/x86_64',
+    ],
+  },
+
+  'target_defaults': {
+    'defines' : [
+      # Ensure that the Starboardized __external_threading file is included.
+      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
+      # Ensure that only the forward declarations and type definitions are included
+      # in __external_threading.
+      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
+      # Enable GNU extensions to get prototypes like ffsl.
+      '_GNU_SOURCE=1',
+    ],
+    'default_configuration': 'evergreen-x64-sbversion-13_debug',
+    'configurations': {
+      'evergreen-x64-sbversion-13_debug': {
+        'inherit_from': ['debug_base'],
+      },
+      'evergreen-x64-sbversion-13_devel': {
+        'inherit_from': ['devel_base'],
+      },
+      'evergreen-x64-sbversion-13_qa': {
+        'inherit_from': ['qa_base'],
+      },
+      'evergreen-x64-sbversion-13_gold': {
+        'inherit_from': ['gold_base'],
+      },
+    }, # end of configurations
+  },
+  'includes': [
+    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
+    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
+  ],
+}
diff --git a/src/starboard/evergreen/x64/sbversion/13/gyp_configuration.py b/src/starboard/evergreen/x64/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..8e8a2dc
--- /dev/null
+++ b/src/starboard/evergreen/x64/sbversion/13/gyp_configuration.py
@@ -0,0 +1,22 @@
+# Copyright 2021 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.
+"""Starboard evergreen-x64 platform configuration for gyp_cobalt."""
+
+from starboard.evergreen.x64 import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+  return parent_configuration.EvergreenX64Configuration(
+      'evergreen-x64-sbversion-13',
+      sabi_json_path='starboard/sabi/x64/sysv/sabi-v13.json')
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/evergreen/x64/sbversion/13/starboard_platform.gyp
similarity index 62%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/evergreen/x64/sbversion/13/starboard_platform.gyp
index 97c4786..87190b6 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/evergreen/x64/sbversion/13/starboard_platform.gyp
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -13,17 +13,9 @@
 # limitations under the License.
 
 {
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/evergreen/x64/starboard_platform.gyp',
   ],
 }
diff --git a/src/starboard/evergreen/x64/sbversion/13/thread_types_public.h b/src/starboard/evergreen/x64/sbversion/13/thread_types_public.h
new file mode 100644
index 0000000..e9d5399
--- /dev/null
+++ b/src/starboard/evergreen/x64/sbversion/13/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2021 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_EVERGREEN_X64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/evergreen/x64/thread_types_public.h"
+
+#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/evergreen/x86/sbversion/13/atomic_public.h
similarity index 65%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/evergreen/x86/sbversion/13/atomic_public.h
index 9031c7b..95735e6 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/evergreen/x86/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_EVERGREEN_X86_SBVERSION_13_ATOMIC_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/evergreen/x86/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/evergreen/x86/sbversion/13/configuration_public.h b/src/starboard/evergreen/x86/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..0295a19
--- /dev/null
+++ b/src/starboard/evergreen/x86/sbversion/13/configuration_public.h
@@ -0,0 +1,26 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for x86. Other devices will have
+// specific Starboard implementations.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_EVERGREEN_X86_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/evergreen/x86/configuration_public.h"
+
+#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/evergreen/x86/sbversion/13/gyp_configuration.gypi b/src/starboard/evergreen/x86/sbversion/13/gyp_configuration.gypi
new file mode 100644
index 0000000..c8fcb60
--- /dev/null
+++ b/src/starboard/evergreen/x86/sbversion/13/gyp_configuration.gypi
@@ -0,0 +1,58 @@
+# Copyright 2021 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+  'variables': {
+    'yasm_exists': 1,
+    'sb_target_platform': 'evergreen-x86',
+
+    'compiler_flags': [
+      '-isystem<(cobalt_repo_root)/third_party/musl/arch/i386',
+    ],
+  },
+
+  'target_defaults': {
+    'defines' : [
+      # Ensure that the Starboardized __external_threading file is included.
+      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
+      # Ensure that only the forward declarations and type definitions are included
+      # in __external_threading.
+      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
+      # Enable GNU extensions to get prototypes like ffsl.
+      '_GNU_SOURCE=1',
+    ],
+    'default_configuration': 'evergreen-x86-sbversion-13_debug',
+    'configurations': {
+      'evergreen-x86-sbversion-13_debug': {
+        'inherit_from': ['debug_base'],
+      },
+      'evergreen-x86-sbversion-13_devel': {
+        'inherit_from': ['devel_base'],
+      },
+      'evergreen-x86-sbversion-13_qa': {
+        'inherit_from': ['qa_base'],
+      },
+      'evergreen-x86-sbversion-13_gold': {
+        'inherit_from': ['gold_base'],
+      },
+    }, # end of configurations
+  },
+  'includes': [
+    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
+    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
+  ],
+}
diff --git a/src/starboard/evergreen/x86/sbversion/13/gyp_configuration.py b/src/starboard/evergreen/x86/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..6837487
--- /dev/null
+++ b/src/starboard/evergreen/x86/sbversion/13/gyp_configuration.py
@@ -0,0 +1,22 @@
+# Copyright 2021 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.
+"""Starboard evergreen-x86 platform configuration for gyp_cobalt."""
+
+from starboard.evergreen.x86 import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+  return parent_configuration.EvergreenX86Configuration(
+      'evergreen-x86-sbversion-13',
+      sabi_json_path='starboard/sabi/x86/sabi-v13.json')
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/evergreen/x86/sbversion/13/starboard_platform.gyp
similarity index 62%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/evergreen/x86/sbversion/13/starboard_platform.gyp
index 97c4786..1ba29f7 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/evergreen/x86/sbversion/13/starboard_platform.gyp
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -13,17 +13,9 @@
 # limitations under the License.
 
 {
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
   ],
 }
diff --git a/src/starboard/evergreen/x86/sbversion/13/thread_types_public.h b/src/starboard/evergreen/x86/sbversion/13/thread_types_public.h
new file mode 100644
index 0000000..b7cd8e3
--- /dev/null
+++ b/src/starboard/evergreen/x86/sbversion/13/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2021 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_EVERGREEN_X86_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/evergreen/x86/thread_types_public.h"
+
+#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/input.h b/src/starboard/input.h
index 68c60ce..c5b6378 100644
--- a/src/starboard/input.h
+++ b/src/starboard/input.h
@@ -115,13 +115,14 @@
 
 // Event data for |kSbEventTypeInput| events.
 typedef struct SbInputData {
+#if SB_API_VERSION < 13
   // The time that should be reported for this event. This is intended to
   // facilitate calculation of time-sensitive information (e.g. velocity for
   // kSbInputEventTypeMove). This may be set to 0 to have the relevant systems
   // automatically set the timestamp. However, this may happen at a later time,
   // so the relative time between events may not be preserved.
   SbTimeMonotonic timestamp;
-
+#endif  // SB_API_VERSION < 13
   // The window in which the input was generated.
   SbWindow window;
 
diff --git a/src/starboard/linux/shared/BUILD.gn b/src/starboard/linux/shared/BUILD.gn
index 16214db..c45fdac 100644
--- a/src/starboard/linux/shared/BUILD.gn
+++ b/src/starboard/linux/shared/BUILD.gn
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//starboard/shared/starboard/player/buildfiles.gni")
+
 declare_args() {
   has_cdm = false
 }
@@ -23,7 +25,6 @@
     "//starboard/common",
     "//starboard/shared/ffmpeg:ffmpeg_dynamic_load",
     "//starboard/shared/starboard/media:media_util",
-    "//starboard/shared/starboard/player",
   ]
 
   deps = [
@@ -382,6 +383,9 @@
     "//starboard/shared/stub/window_show_on_screen_keyboard.cc",
     "//starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc",
   ]
+
+  sources += common_player_sources
+
   if (has_cdm) {
     # TODO(andrewsavage)
   } else {
diff --git a/src/starboard/linux/shared/compiler_flags.gypi b/src/starboard/linux/shared/compiler_flags.gypi
index db7c718..82e4bea 100644
--- a/src/starboard/linux/shared/compiler_flags.gypi
+++ b/src/starboard/linux/shared/compiler_flags.gypi
@@ -74,9 +74,6 @@
           '-fvisibility=hidden',
           # Warn for implicit type conversions that may change a value.
           '-Wconversion',
-          '-Wno-c++14-compat',
-          # This complains about 'override', which we use heavily.
-          '-Wno-c++14-extensions',
           # Warns on switches on enums that cover all enum values but
           # also contain a default: branch. Chrome is full of that.
           '-Wno-covered-switch-default',
diff --git a/src/starboard/linux/shared/decode_target_get_info.cc b/src/starboard/linux/shared/decode_target_get_info.cc
index b9252ae..05fda27 100644
--- a/src/starboard/linux/shared/decode_target_get_info.cc
+++ b/src/starboard/linux/shared/decode_target_get_info.cc
@@ -12,20 +12,20 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "starboard/common/memory.h"
 #include "starboard/decode_target.h"
 #include "starboard/linux/shared/decode_target_internal.h"
-#include "starboard/memory.h"
 
 // TODO: Consider unifying this with that of raspi/open_max and android, since
 // the only part that changes is the info struct size.
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target,
                            SbDecodeTargetInfo* out_info) {
-  if (!SbMemoryIsZero(out_info, sizeof(*out_info))) {
+  if (!starboard::common::MemoryIsZero(out_info, sizeof(*out_info))) {
     SB_DCHECK(false) << "out_info must be zeroed out.";
     return false;
   }
 
-  SbMemoryCopy(out_info, &decode_target->data->info, sizeof(*out_info));
+  memcpy(out_info, &decode_target->data->info, sizeof(*out_info));
 
   return true;
 }
diff --git a/src/starboard/linux/shared/gyp_configuration.py b/src/starboard/linux/shared/gyp_configuration.py
index b8f0949..e8a7a9f 100644
--- a/src/starboard/linux/shared/gyp_configuration.py
+++ b/src/starboard/linux/shared/gyp_configuration.py
@@ -121,3 +121,10 @@
           'VideoDecoderTests/VideoDecoderTest.*Invalid*',
       ],
   }
+  # Conditionally disables tests that require ipv6
+  if os.getenv('IPV6_NOT_AVAILABLE', False):
+    __FILTERED_TESTS['nplb'] = [
+        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDayDestination/1',
+        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceForDestination/1',
+        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceNotLoopback/1',
+    ]
diff --git a/src/starboard/linux/shared/platform_configuration/BUILD.gn b/src/starboard/linux/shared/platform_configuration/BUILD.gn
index 674105a..e6bfc37 100644
--- a/src/starboard/linux/shared/platform_configuration/BUILD.gn
+++ b/src/starboard/linux/shared/platform_configuration/BUILD.gn
@@ -47,10 +47,6 @@
 
       # Warn for implicit type conversions that may change a value.
       "-Wconversion",
-      "-Wno-c++14-compat",
-
-      # This complains about 'override', which we use heavily.
-      "-Wno-c++14-extensions",
 
       # Warns on switches on enums that cover all enum values but
       # also contain a default: branch. Chrome is full of that.
@@ -142,6 +138,13 @@
       "-Wl,-u_sanitizer_options_link_helper",
     ]
     defines += [ "ADDRESS_SANITIZER" ]
+  } else if (use_tsan) {
+    cflags += [
+      "-fsanitize=thread",
+      "-fno-omit-frame-pointer",
+    ]
+    ldflags += [ "-fsanitize=thread" ]
+    defines += [ "THREAD_SANITIZER" ]
   }
 }
 
diff --git a/src/starboard/linux/shared/system_get_extensions.cc b/src/starboard/linux/shared/system_get_extensions.cc
index 390aa38..5c7ac86 100644
--- a/src/starboard/linux/shared/system_get_extensions.cc
+++ b/src/starboard/linux/shared/system_get_extensions.cc
@@ -35,10 +35,10 @@
     }
   }
 #endif
-  if (SbStringCompareAll(name, kCobaltExtensionConfigurationName) == 0) {
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
     return starboard::shared::GetConfigurationApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionCrashHandlerName) == 0) {
+  if (strcmp(name, kCobaltExtensionCrashHandlerName) == 0) {
     return starboard::common::GetCrashHandlerApi();
   }
   return NULL;
diff --git a/src/starboard/linux/shared/system_get_path.cc b/src/starboard/linux/shared/system_get_path.cc
index 3f1e7d0..f32a68a 100644
--- a/src/starboard/linux/shared/system_get_path.cc
+++ b/src/starboard/linux/shared/system_get_path.cc
@@ -86,7 +86,7 @@
     return false;
   }
 
-  SbStringCopy(out_path, path.data(), path_size);
+  starboard::strlcpy(out_path, path.data(), path_size);
   return true;
 }
 
@@ -105,8 +105,8 @@
     return true;
   }
 
-  if (SbStringCopy(out_path, evergreen_config->content_path_.c_str(),
-                   path_size) >= path_size) {
+  if (starboard::strlcpy(out_path, evergreen_config->content_path_.c_str(),
+                         path_size) >= path_size) {
     return false;
   }
   return true;
@@ -124,7 +124,7 @@
   }
 
   char* last_slash =
-      const_cast<char *>(SbStringFindLastCharacter(out_path, '/'));
+      const_cast<char *>(strrchr(out_path, '/'));
   if (!last_slash) {
     return false;
   }
@@ -140,8 +140,8 @@
     return false;
   }
 
-  const char* last_slash = SbStringFindLastCharacter(path.data(), '/');
-  if (SbStringCopy(out_path, last_slash + 1, path_size) >= path_size) {
+  const char* last_slash = strrchr(path.data(), '/');
+  if (starboard::strlcpy(out_path, last_slash + 1, path_size) >= path_size) {
     return false;
   }
   return true;
@@ -169,7 +169,7 @@
   if (!GetExecutableDirectory(out_path, path_size)) {
     return false;
   }
-  if (SbStringConcat(out_path, "/content", path_size) >= path_size) {
+  if (starboard::strlcat(out_path, "/content", path_size) >= path_size) {
     return false;
   }
   return true;
@@ -202,7 +202,7 @@
       if (!GetCacheDirectory(path.data(), kPathSize)) {
         return false;
       }
-      if (SbStringConcat(path.data(), "/cobalt", kPathSize) >= kPathSize) {
+      if (starboard::strlcat(path.data(), "/cobalt", kPathSize) >= kPathSize) {
         return false;
       }
       if (!SbDirectoryCreate(path.data())) {
@@ -215,7 +215,7 @@
                            kPathSize)) {
         return false;
       }
-      if (SbStringConcat(path.data(), "/log", kPathSize) >= kPathSize) {
+      if (starboard::strlcat(path.data(), "/log", kPathSize) >= kPathSize) {
         return false;
       }
       SbDirectoryCreate(path.data());
@@ -241,7 +241,7 @@
       if (!GetContentDirectory(path.data(), kPathSize)) {
         return false;
       }
-      if (SbStringConcat(path.data(), "/fonts", kPathSize) >= kPathSize) {
+      if (starboard::strlcat(path.data(), "/fonts", kPathSize) >= kPathSize) {
         return false;
       }
       break;
@@ -263,11 +263,11 @@
       return false;
   }
 
-  int length = SbStringGetLength(path.data());
+  int length = strlen(path.data());
   if (length < 1 || length > path_size) {
     return false;
   }
 
-  SbStringCopy(out_path, path.data(), path_size);
+  starboard::strlcpy(out_path, path.data(), path_size);
   return true;
 }
diff --git a/src/starboard/linux/shared/system_has_capability.cc b/src/starboard/linux/shared/system_has_capability.cc
index 7473825..6f367a6 100644
--- a/src/starboard/linux/shared/system_has_capability.cc
+++ b/src/starboard/linux/shared/system_has_capability.cc
@@ -22,10 +22,12 @@
       return false;
     case kSbSystemCapabilityCanQueryGPUMemoryStats:
       return false;
+#if SB_API_VERSION < 13
     case kSbSystemCapabilitySetsInputTimestamp:
       return false;
+#endif  // SB_API_VERSION < 13
   }
 
   SB_DLOG(WARNING) << "Unrecognized capability: " << capability_id;
   return false;
-}
+}
\ No newline at end of file
diff --git a/src/starboard/linux/x64x11/clang/3.6/download_clang.sh b/src/starboard/linux/x64x11/clang/3.6/download_clang.sh
deleted file mode 100755
index 2d8587c..0000000
--- a/src/starboard/linux/x64x11/clang/3.6/download_clang.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-# Copyright 2018 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.
-
-# This script downloads and compiles clang version 3.6.
-
-set -e
-
-toolchain_name="clang"
-version="3.6"
-toolchain_folder="x86_64-linux-gnu-${toolchain_name}-${version}"
-branch="release_36"
-
-binary_path="llvm/Release+Asserts/bin/clang++"
-
-# This version of clang depends on libstdc++-7, version 7.5.0.
-# The package "libstdc++-7-dev" provides that version.
-libstdcxx_version="7.5.0"
-libstdcxx_path="libstdc++-7"
-libstdcxx_symlink_folder="${libstdcxx_path}/lib/gcc/x86_64-linux-gnu"
-symlink_path="${libstdcxx_symlink_folder}/${libstdcxx_version}"
-
-build_duration="about 20 minutes"
-
-scriptfolder=$(dirname $(realpath $0))
-cd ${scriptfolder}
-source ../../toolchain_paths.sh
-
-(
-  # Build a small symlink forest for the clang compiler to point to with the
-  # '--gcc-toolchain' parameter to allow it to build against a non-default version
-  # of libstdc++.
-  mkdir -p "${libstdcxx_symlink_folder}"
-  ln -s /usr/include "${libstdcxx_path}"
-  ln -s "/usr/lib/gcc/x86_64-linux-gnu/${libstdcxx_version}" ${libstdcxx_symlink_folder}
-
-  git clone --branch ${branch} https://git.llvm.org/git/llvm.git/
-  cd llvm/tools/
-  git clone --branch ${branch} https://git.llvm.org/git/clang.git/
-  cd ../projects/
-  git clone --branch ${branch} https://git.llvm.org/git/compiler-rt.git/
-  cd ${toolchain_path}
-
-  # Patch for compiling with gcc newer than version 7.
-  patch -p1 <${scriptfolder}/hasmd.patch
-  patch -p1 <${scriptfolder}/ustat_size.patch
-  patch -d llvm/projects/compiler-rt/ -p0 <${scriptfolder}/sigaltstack.patch
-
-  cd llvm
-  # Specify a bootstrap compiler that is known to be available.
-  CC=gcc CXX=g++ \
-  ./configure --enable-optimized --disable-doxygen --prefix=${PWD}/bin
-  make -j"$(nproc)"
-  cd ${toolchain_path}
-
-  ls -l ${toolchain_binary}
-  ${toolchain_binary} --version
-) >${logfile} 2>&1
diff --git a/src/starboard/linux/x64x11/clang/3.6/hasmd.patch b/src/starboard/linux/x64x11/clang/3.6/hasmd.patch
deleted file mode 100644
index f4ddf53..0000000
--- a/src/starboard/linux/x64x11/clang/3.6/hasmd.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- x86_64-linux-gnu-clang-3.6.orig/llvm/include/llvm/IR/ValueMap.h	2019-08-21 11:38:34.282434856 -0700
-+++ x86_64-linux-gnu-clang-3.6/llvm/include/llvm/IR/ValueMap.h	2019-08-21 11:33:41.327987115 -0700
-@@ -101,7 +101,7 @@
- 
-   ~ValueMap() {}
- 
--  bool hasMD() const { return MDMap; }
-+  bool hasMD() const { return static_cast<bool>(MDMap); }
-   MDMapT &MD() {
-     if (!MDMap)
-       MDMap.reset(new MDMapT);
diff --git a/src/starboard/linux/x64x11/clang/3.6/sigaltstack.patch b/src/starboard/linux/x64x11/clang/3.6/sigaltstack.patch
deleted file mode 100644
index d8ce752..0000000
--- a/src/starboard/linux/x64x11/clang/3.6/sigaltstack.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-Index: lib/sanitizer_common/sanitizer_linux.h
-===================================================================
---- lib/sanitizer_common/sanitizer_linux.h
-+++ lib/sanitizer_common/sanitizer_linux.h
-@@ -21,7 +21,6 @@
- #include "sanitizer_platform_limits_posix.h"
- 
- struct link_map;  // Opaque type returned by dlopen().
--struct sigaltstack;
- 
- namespace __sanitizer {
- // Dirent structure for getdents(). Note that this structure is different from
-@@ -30,8 +29,7 @@
- 
- // Syscall wrappers.
- uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
--uptr internal_sigaltstack(const struct sigaltstack* ss,
--                          struct sigaltstack* oss);
-+uptr internal_sigaltstack(const void* ss, void* oss);
- uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
-     __sanitizer_sigset_t *oldset);
- 
-Index: lib/sanitizer_common/sanitizer_linux.cc
-===================================================================
---- lib/sanitizer_common/sanitizer_linux.cc
-+++ lib/sanitizer_common/sanitizer_linux.cc
-@@ -631,8 +631,7 @@
- }
- #endif
- 
--uptr internal_sigaltstack(const struct sigaltstack *ss,
--                         struct sigaltstack *oss) {
-+uptr internal_sigaltstack(const void *ss, void *oss) {
-   return internal_syscall(SYSCALL(sigaltstack), (uptr)ss, (uptr)oss);
- }
- 
-Index: lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
-===================================================================
---- lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
-+++ lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
-@@ -287,7 +287,7 @@
- 
-   // Alternate stack for signal handling.
-   InternalScopedBuffer<char> handler_stack_memory(kHandlerStackSize);
--  struct sigaltstack handler_stack;
-+  stack_t handler_stack;
-   internal_memset(&handler_stack, 0, sizeof(handler_stack));
-   handler_stack.ss_sp = handler_stack_memory.data();
-   handler_stack.ss_size = kHandlerStackSize;
-Index: lib/tsan/rtl/tsan_platform_linux.cc
-===================================================================
---- lib/tsan/rtl/tsan_platform_linux.cc
-+++ lib/tsan/rtl/tsan_platform_linux.cc
-@@ -288,7 +288,7 @@
- int ExtractResolvFDs(void *state, int *fds, int nfd) {
- #if SANITIZER_LINUX && !SANITIZER_ANDROID
-   int cnt = 0;
--  __res_state *statp = (__res_state*)state;
-+  struct __res_state *statp = (struct __res_state*)state;
-   for (int i = 0; i < MAXNS && cnt < nfd; i++) {
-     if (statp->_u._ext.nsaddrs[i] && statp->_u._ext.nssocks[i] != -1)
-       fds[cnt++] = statp->_u._ext.nssocks[i];
diff --git a/src/starboard/linux/x64x11/clang/3.6/ustat_size.patch b/src/starboard/linux/x64x11/clang/3.6/ustat_size.patch
deleted file mode 100644
index e2c7f23..0000000
--- a/src/starboard/linux/x64x11/clang/3.6/ustat_size.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- x86_64-linux-gnu-clang-3.6.orig/llvm/projects/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc     2019-08-21 11:38:34.282434856 -0700
-+++ x86_64-linux-gnu-clang-3.6/llvm/projects/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc  2019-08-21 11:33:41.327987115 -0700
-@@ -159,7 +159,6 @@
- # include <sys/procfs.h>
- #endif
- #include <sys/user.h>
--#include <sys/ustat.h>
- #include <linux/cyclades.h>
- #include <linux/if_eql.h>
- #include <linux/if_plip.h>
-@@ -251,7 +251,19 @@
- #endif // SANITIZER_LINUX || SANITIZER_FREEBSD
-
- #if SANITIZER_LINUX && !SANITIZER_ANDROID
--  unsigned struct_ustat_sz = sizeof(struct ustat);
-+// Use pre-computed size of struct ustat to avoid <sys/ustat.h> which
-+// has been removed from glibc 2.28.
-+#if defined(__aarch64__) || defined(__s390x__) || defined (__mips64) \
-+  || defined(__powerpc64__) || defined(__arch64__) || defined(__sparcv9) \
-+  || defined(__x86_64__)
-+#define SIZEOF_STRUCT_USTAT 32
-+#elif defined(__arm__) || defined(__i386__) || defined(__mips__) \
-+  || defined(__powerpc__) || defined(__s390__)
-+#define SIZEOF_STRUCT_USTAT 20
-+#else
-+#error Unknown size of struct ustat
-+#endif
-+  unsigned struct_ustat_sz = SIZEOF_STRUCT_USTAT;
-   unsigned struct_rlimit64_sz = sizeof(struct rlimit64);
-   unsigned struct_statvfs64_sz = sizeof(struct statvfs64);
- #endif // SANITIZER_LINUX && !SANITIZER_ANDROID
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/linux/x64x11/clang/3.9/atomic_public.h
similarity index 79%
rename from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
rename to src/starboard/linux/x64x11/clang/3.9/atomic_public.h
index 9031c7b..fed9186 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/linux/x64x11/clang/3.9/atomic_public.h
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_LINUX_X64X11_CLANG_3_9_ATOMIC_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_CLANG_3_9_ATOMIC_PUBLIC_H_
 
 #include "starboard/linux/x64x11/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_LINUX_X64X11_CLANG_3_9_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/cobalt/configuration.py b/src/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py
similarity index 77%
rename from src/starboard/linux/x64x11/clang/3.6/cobalt/configuration.py
rename to src/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py
index b8098ae..60bfdab 100644
--- a/src/starboard/linux/x64x11/clang/3.6/cobalt/configuration.py
+++ b/src/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py
@@ -11,18 +11,21 @@
 # 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.
-"""Starboard Linux x64x11 Clang 3.6 Cobalt configuration."""
+"""Starboard Linux x64x11 Clang 3.9 Cobalt configuration."""
 
 import os
 
 from starboard.linux.shared.cobalt import configuration as shared_configuration
 from starboard.tools.testing import test_filter
 
-class CobaltLinuxX64X11Clang36Configuration(shared_configuration.CobaltLinuxConfiguration):
-  """Starboard Linux x64x11 Clang 3.6 Cobalt configuration."""
+
+class CobaltLinuxX64X11Clang39Configuration(
+    shared_configuration.CobaltLinuxConfiguration):
+  """Starboard Linux x64x11 Clang 3.9 Cobalt configuration."""
 
   def GetTestFilters(self):
-    filters = super(CobaltLinuxX64X11Clang36Configuration, self).GetTestFilters()
+    filters = super(CobaltLinuxX64X11Clang39Configuration,
+                    self).GetTestFilters()
     for target, tests in self.__FILTERED_TESTS.iteritems():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
diff --git a/src/starboard/linux/x64x11/clang/3.6/compiler_flags.gypi b/src/starboard/linux/x64x11/clang/3.9/compiler_flags.gypi
similarity index 98%
rename from src/starboard/linux/x64x11/clang/3.6/compiler_flags.gypi
rename to src/starboard/linux/x64x11/clang/3.9/compiler_flags.gypi
index 8db77fd..6e5255e 100644
--- a/src/starboard/linux/x64x11/clang/3.6/compiler_flags.gypi
+++ b/src/starboard/linux/x64x11/clang/3.9/compiler_flags.gypi
@@ -98,6 +98,8 @@
           '-Wno-unused-value',
           # Suppress warnings related to unused compilation flags in clang.
           '-Wno-unused-command-line-argument',
+          # Suppress warnings in libjpeg
+          '-Wno-shift-negative-value',
         ],
       }],
       ['cobalt_fastbuild==0', {
diff --git a/src/starboard/linux/x64x11/clang/3.6/configuration_public.h b/src/starboard/linux/x64x11/clang/3.9/configuration_public.h
similarity index 78%
rename from src/starboard/linux/x64x11/clang/3.6/configuration_public.h
rename to src/starboard/linux/x64x11/clang/3.9/configuration_public.h
index 4f626bf..718fcdd 100644
--- a/src/starboard/linux/x64x11/clang/3.6/configuration_public.h
+++ b/src/starboard/linux/x64x11/clang/3.9/configuration_public.h
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_CONFIGURATION_PUBLIC_H_
+#ifndef STARBOARD_LINUX_X64X11_CLANG_3_9_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_CLANG_3_9_CONFIGURATION_PUBLIC_H_
 
 #include "starboard/linux/x64x11/configuration_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_CONFIGURATION_PUBLIC_H_
+#endif  // STARBOARD_LINUX_X64X11_CLANG_3_9_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi b/src/starboard/linux/x64x11/clang/3.9/gyp_configuration.gypi
similarity index 73%
rename from src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi
rename to src/starboard/linux/x64x11/clang/3.9/gyp_configuration.gypi
index b5e201c..b5d5811 100644
--- a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi
+++ b/src/starboard/linux/x64x11/clang/3.9/gyp_configuration.gypi
@@ -14,24 +14,25 @@
 
 {
   'variables': {
-    'sb_target_platform': 'linux-x64x11-clang-3-6',
+    'sb_target_platform': 'linux-x64x11-clang-3-9',
     'cobalt_v8_emit_builtins_as_inline_asm': 1,
-    'sb_disable_cpp14_audit': 1,
+    # Required C++17 features are available in Clang-4.0 and newer
+    'sb_disable_cpp17_audit': 1,
   },
 
   'target_defaults': {
-    'default_configuration': 'linux-x64x11-clang-3-6_debug',
+    'default_configuration': 'linux-x64x11-clang-3-9_debug',
     'configurations': {
-      'linux-x64x11-clang-3-6_debug': {
+      'linux-x64x11-clang-3-9_debug': {
         'inherit_from': ['debug_base'],
       },
-      'linux-x64x11-clang-3-6_devel': {
+      'linux-x64x11-clang-3-9_devel': {
         'inherit_from': ['devel_base'],
       },
-      'linux-x64x11-clang-3-6_qa': {
+      'linux-x64x11-clang-3-9_qa': {
         'inherit_from': ['qa_base'],
       },
-      'linux-x64x11-clang-3-6_gold': {
+      'linux-x64x11-clang-3-9_gold': {
         'inherit_from': ['gold_base'],
       },
     }, # end of configurations
diff --git a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.py b/src/starboard/linux/x64x11/clang/3.9/gyp_configuration.py
similarity index 84%
rename from src/starboard/linux/x64x11/clang/3.6/gyp_configuration.py
rename to src/starboard/linux/x64x11/clang/3.9/gyp_configuration.py
index 8bb0020..40979bb 100644
--- a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.py
+++ b/src/starboard/linux/x64x11/clang/3.9/gyp_configuration.py
@@ -11,7 +11,7 @@
 # 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.
-"""Starboard Linux X64 X11 Clang 3.6 platform configuration."""
+"""Starboard Linux X64 X11 Clang 3.9 platform configuration."""
 
 import logging
 import os
@@ -26,27 +26,27 @@
 from starboard.tools.toolchain import touch
 
 
-class LinuxX64X11Clang36Configuration(shared_configuration.LinuxConfiguration):
-  """Starboard Linux X64 X11 Clang 3.6 platform configuration."""
+class LinuxX64X11Clang39Configuration(shared_configuration.LinuxConfiguration):
+  """Starboard Linux X64 X11 Clang 3.9 platform configuration."""
 
   def __init__(self,
-               platform='linux-x64x11-clang-3-6',
+               platform='linux-x64x11-clang-3-9',
                asan_enabled_by_default=False,
                sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(LinuxX64X11Clang36Configuration,
+    super(LinuxX64X11Clang39Configuration,
           self).__init__(platform, asan_enabled_by_default, sabi_json_path)
 
-    self.toolchain_dir = '/usr/lib/llvm-3.6'
+    self.toolchain_dir = '/usr/lib/llvm-3.9'
 
   def SetupPlatformTools(self, build_number):
-    ret = subprocess.call('/usr/bin/clang-3.6 --version', shell=True)
+    ret = subprocess.call('/usr/bin/clang-3.9 --version', shell=True)
     if ret != 0:
-      raise Exception('clang-3.6 is not installed.')
+      raise Exception('clang-3.9 is not installed.')
 
   def GetEnvironmentVariables(self):
     toolchain_bin_dir = os.path.join(self.toolchain_dir, 'bin')
 
-    env_variables = super(LinuxX64X11Clang36Configuration,
+    env_variables = super(LinuxX64X11Clang39Configuration,
                           self).GetEnvironmentVariables()
     env_variables.update({
         'CC':
@@ -59,7 +59,7 @@
     return env_variables
 
   def GetVariables(self, config_name):
-    variables = super(LinuxX64X11Clang36Configuration,
+    variables = super(LinuxX64X11Clang39Configuration,
                       self).GetVariables(config_name)
     return variables
 
@@ -102,7 +102,7 @@
 
 def CreatePlatformConfig():
   try:
-    return LinuxX64X11Clang36Configuration(
+    return LinuxX64X11Clang39Configuration(
         sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
   except RuntimeError as e:
     logging.critical(e)
diff --git a/src/starboard/linux/x64x11/clang/3.6/starboard_platform.gyp b/src/starboard/linux/x64x11/clang/3.9/starboard_platform.gyp
similarity index 100%
rename from src/starboard/linux/x64x11/clang/3.6/starboard_platform.gyp
rename to src/starboard/linux/x64x11/clang/3.9/starboard_platform.gyp
diff --git a/src/starboard/linux/x64x11/clang/3.6/starboard_platform_tests.gyp b/src/starboard/linux/x64x11/clang/3.9/starboard_platform_tests.gyp
similarity index 100%
rename from src/starboard/linux/x64x11/clang/3.6/starboard_platform_tests.gyp
rename to src/starboard/linux/x64x11/clang/3.9/starboard_platform_tests.gyp
diff --git a/src/starboard/linux/x64x11/clang/3.6/thread_types_public.h b/src/starboard/linux/x64x11/clang/3.9/thread_types_public.h
similarity index 77%
rename from src/starboard/linux/x64x11/clang/3.6/thread_types_public.h
rename to src/starboard/linux/x64x11/clang/3.9/thread_types_public.h
index 69c4458..71fd470 100644
--- a/src/starboard/linux/x64x11/clang/3.6/thread_types_public.h
+++ b/src/starboard/linux/x64x11/clang/3.9/thread_types_public.h
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_THREAD_TYPES_PUBLIC_H_
+#ifndef STARBOARD_LINUX_X64X11_CLANG_3_9_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_CLANG_3_9_THREAD_TYPES_PUBLIC_H_
 
 #include "starboard/linux/x64x11/thread_types_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_THREAD_TYPES_PUBLIC_H_
+#endif  // STARBOARD_LINUX_X64X11_CLANG_3_9_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi b/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi
index 9154133..0f36749 100644
--- a/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi
+++ b/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi
@@ -13,6 +13,10 @@
 # limitations under the License.
 
 {
+  'variables' : {
+    # Required C++17 features are available in GCC-7 and newer
+    'sb_disable_cpp17_audit': 1,
+  },
   'target_defaults': {
     'default_configuration': 'linux-x64x11-gcc-6-3_debug',
     'configurations': {
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/linux/x64x11/sbversion/13/atomic_public.h
similarity index 71%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/linux/x64x11/sbversion/13/atomic_public.h
index 9031c7b..d85cdb8 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/linux/x64x11/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_LINUX_X64X11_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_SBVERSION_13_ATOMIC_PUBLIC_H_
 
 #include "starboard/linux/x64x11/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_LINUX_X64X11_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/sbversion/13/configuration_public.h b/src/starboard/linux/x64x11/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..d6b543f
--- /dev/null
+++ b/src/starboard/linux/x64x11/sbversion/13/configuration_public.h
@@ -0,0 +1,43 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for Desktop x64 Linux. Other devices will have
+// specific Starboard implementations, even if they ultimately are running some
+// version of Linux.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_LINUX_X64X11_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+// --- Graphics Configuration ------------------------------------------------
+
+// Indicates whether or not the given platform supports rendering of NV12
+// textures. These textures typically originate from video decoders.
+#define SB_HAS_NV12_TEXTURE_SUPPORT 1
+
+// --- Shared Configuration and Overrides ------------------------------------
+
+// Include the Linux configuration that's common between all Desktop Linuxes.
+#include "starboard/linux/shared/configuration_public.h"
+
+// Whether the current platform implements the on screen keyboard interface.
+#define SB_HAS_ON_SCREEN_KEYBOARD 0
+
+// Whether the current platform has speech synthesis.
+#undef SB_HAS_SPEECH_SYNTHESIS
+#define SB_HAS_SPEECH_SYNTHESIS 0
+
+#endif  // STARBOARD_LINUX_X64X11_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi b/src/starboard/linux/x64x11/sbversion/13/gyp_configuration.gypi
similarity index 63%
copy from src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi
copy to src/starboard/linux/x64x11/sbversion/13/gyp_configuration.gypi
index b5e201c..045aa06 100644
--- a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi
+++ b/src/starboard/linux/x64x11/sbversion/13/gyp_configuration.gypi
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -14,31 +14,31 @@
 
 {
   'variables': {
-    'sb_target_platform': 'linux-x64x11-clang-3-6',
-    'cobalt_v8_emit_builtins_as_inline_asm': 1,
-    'sb_disable_cpp14_audit': 1,
+    'variables': {
+      'sb_evergreen_compatible': 1,
+      'sb_evergreen_compatible_libunwind': 1,
+    }
   },
-
   'target_defaults': {
-    'default_configuration': 'linux-x64x11-clang-3-6_debug',
+    'default_configuration': 'linux-x64x11-sbversion-13_debug',
     'configurations': {
-      'linux-x64x11-clang-3-6_debug': {
+      'linux-x64x11-sbversion-13_debug': {
         'inherit_from': ['debug_base'],
       },
-      'linux-x64x11-clang-3-6_devel': {
+      'linux-x64x11-sbversion-13_devel': {
         'inherit_from': ['devel_base'],
       },
-      'linux-x64x11-clang-3-6_qa': {
+      'linux-x64x11-sbversion-13_qa': {
         'inherit_from': ['qa_base'],
       },
-      'linux-x64x11-clang-3-6_gold': {
+      'linux-x64x11-sbversion-13_gold': {
         'inherit_from': ['gold_base'],
       },
     }, # end of configurations
   },
 
   'includes': [
-    'compiler_flags.gypi',
-    '../gyp_configuration.gypi',
+    '<(DEPTH)/starboard/linux/x64x11/shared/gyp_configuration.gypi',
+    '<(DEPTH)/starboard/sabi/sabi.gypi',
   ],
 }
diff --git a/src/starboard/linux/x64x11/sbversion/13/gyp_configuration.py b/src/starboard/linux/x64x11/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..6100f32
--- /dev/null
+++ b/src/starboard/linux/x64x11/sbversion/13/gyp_configuration.py
@@ -0,0 +1,22 @@
+# Copyright 2021 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.
+"""Starboard Linux X64 X11 platform configuration."""
+
+from starboard.linux.x64x11 import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+  return parent_configuration.LinuxX64X11Configuration(
+      'linux-x64x11-sbversion-13',
+      sabi_json_path='starboard/sabi/x64/sysv/sabi-v13.json')
diff --git a/src/starboard/linux/x64x11/sbversion/13/starboard_platform.gyp b/src/starboard/linux/x64x11/sbversion/13/starboard_platform.gyp
new file mode 100644
index 0000000..8623c13
--- /dev/null
+++ b/src/starboard/linux/x64x11/sbversion/13/starboard_platform.gyp
@@ -0,0 +1,24 @@
+# Copyright 2021 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.
+
+# Note, that despite the file extension ".gyp", this file is included by several
+# platform variants of linux-x64x11, like a ".gypi" file, since those platforms
+# have no need to modify this code.
+{
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/linux/x64x11/starboard_platform.gyp',
+  ],
+}
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/linux/x64x11/sbversion/13/starboard_platform_tests.gyp
similarity index 62%
rename from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
rename to src/starboard/linux/x64x11/sbversion/13/starboard_platform_tests.gyp
index 97c4786..96f005e 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/linux/x64x11/sbversion/13/starboard_platform_tests.gyp
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -11,19 +11,10 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
 {
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/linux/x64x11/starboard_platform_tests.gyp',
   ],
 }
diff --git a/src/starboard/linux/x64x11/clang/3.6/thread_types_public.h b/src/starboard/linux/x64x11/sbversion/13/thread_types_public.h
similarity index 70%
copy from src/starboard/linux/x64x11/clang/3.6/thread_types_public.h
copy to src/starboard/linux/x64x11/sbversion/13/thread_types_public.h
index 69c4458..02676e6 100644
--- a/src/starboard/linux/x64x11/clang/3.6/thread_types_public.h
+++ b/src/starboard/linux/x64x11/sbversion/13/thread_types_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_THREAD_TYPES_PUBLIC_H_
+#ifndef STARBOARD_LINUX_X64X11_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
 
 #include "starboard/linux/x64x11/thread_types_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_THREAD_TYPES_PUBLIC_H_
+#endif  // STARBOARD_LINUX_X64X11_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/skia/BUILD.gn b/src/starboard/linux/x64x11/skia/BUILD.gn
new file mode 100644
index 0000000..cf08201
--- /dev/null
+++ b/src/starboard/linux/x64x11/skia/BUILD.gn
@@ -0,0 +1,35 @@
+# Copyright 2021 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.
+
+static_library("starboard_platform") {
+  check_includes = false
+
+  sources = [
+    "//starboard/linux/x64x11/main.cc",
+    "//starboard/linux/x64x11/skia/configuration.cc",
+    "//starboard/linux/x64x11/skia/configuration.h",
+    "//starboard/linux/x64x11/skia/system_get_extensions.cc",
+    "//starboard/shared/starboard/player/video_dmp_common.cc",
+    "//starboard/shared/starboard/player/video_dmp_common.h",
+    "//starboard/shared/starboard/player/video_dmp_writer.cc",
+    "//starboard/shared/starboard/player/video_dmp_writer.h",
+  ]
+
+  public_deps = [
+    "//starboard/linux/x64x11/shared:starboard_platform",
+    "//starboard/shared/starboard/player:video_dmp",
+  ]
+
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+}
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/linux/x64x11/skia/platform_configuration/BUILD.gn
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/linux/x64x11/skia/platform_configuration/BUILD.gn
index 97c4786..edff3cc 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/linux/x64x11/skia/platform_configuration/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
+config("platform_configuration") {
+  configs = [ "//starboard/linux/x64x11/platform_configuration" ]
 }
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/linux/x64x11/skia/platform_configuration/configuration.gni
similarity index 61%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/linux/x64x11/skia/platform_configuration/configuration.gni
index 97c4786..b95a6d5 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/linux/x64x11/skia/platform_configuration/configuration.gni
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -12,18 +12,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
+import("//starboard/linux/x64x11/platform_configuration/configuration.gni")
diff --git a/src/starboard/linux/x64x11/skia/system_get_extensions.cc b/src/starboard/linux/x64x11/skia/system_get_extensions.cc
index 4743dab..1bbc6f5 100644
--- a/src/starboard/linux/x64x11/skia/system_get_extensions.cc
+++ b/src/starboard/linux/x64x11/skia/system_get_extensions.cc
@@ -19,7 +19,7 @@
 #include "starboard/linux/x64x11/skia/configuration.h"
 
 const void* SbSystemGetExtension(const char* name) {
-  if (SbStringCompareAll(name, kCobaltExtensionConfigurationName) == 0) {
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
     return starboard::x64x11::skia::GetConfigurationApi();
   }
   return NULL;
diff --git a/src/starboard/linux/x64x11/skia/toolchain/BUILD.gn b/src/starboard/linux/x64x11/skia/toolchain/BUILD.gn
new file mode 100644
index 0000000..2a91e84
--- /dev/null
+++ b/src/starboard/linux/x64x11/skia/toolchain/BUILD.gn
@@ -0,0 +1,26 @@
+# Copyright 2021 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.
+
+import("//build/toolchain/gcc_toolchain.gni")
+
+_home_dir = getenv("HOME")
+_clang_base_path = "$_home_dir/starboard-toolchains/x86_64-linux-gnu-clang-chromium-365097-f7e52fbd-8"
+
+clang_toolchain("host") {
+  clang_base_path = _clang_base_path
+}
+
+clang_toolchain("target") {
+  clang_base_path = _clang_base_path
+}
diff --git a/src/starboard/linux/x64x11/system_get_property_impl.cc b/src/starboard/linux/x64x11/system_get_property_impl.cc
index ef405ed..37de482 100644
--- a/src/starboard/linux/x64x11/system_get_property_impl.cc
+++ b/src/starboard/linux/x64x11/system_get_property_impl.cc
@@ -37,9 +37,9 @@
 bool CopyStringAndTestIfSuccess(char* out_value,
                                 int value_length,
                                 const char* from_value) {
-  if (SbStringGetLength(from_value) + 1 > value_length)
+  if (strlen(from_value) + 1 > value_length)
     return false;
-  SbStringCopy(out_value, from_value, value_length);
+  starboard::strlcpy(out_value, from_value, value_length);
   return true;
 }
 
diff --git a/src/starboard/loader_app/app_key_files.cc b/src/starboard/loader_app/app_key_files.cc
index 68631e5..1b204a6 100644
--- a/src/starboard/loader_app/app_key_files.cc
+++ b/src/starboard/loader_app/app_key_files.cc
@@ -14,6 +14,7 @@
 
 #include "starboard/loader_app/app_key_files.h"
 
+#include <cstring>
 #include <vector>
 
 #include "starboard/common/file.h"
@@ -29,7 +30,7 @@
 const char kFilePrefix[] = "app_key_";
 const char kGoodFileSuffix[] = ".good";
 const char kBadFileSuffix[] = ".bad";
-}
+}  // namespace
 
 std::string GetAppKeyFilePathWithSuffix(const std::string& dir,
                                         const std::string& app_key,
@@ -77,8 +78,7 @@
   if (s.size() < suffix.size()) {
     return false;
   }
-  return SbStringCompareAll(s.c_str() + (s.size() - suffix.size()),
-                            suffix.c_str()) == 0;
+  return strcmp(s.c_str() + (s.size() - suffix.size()), suffix.c_str()) == 0;
 }
 }  // namespace
 
@@ -94,8 +94,7 @@
 #if SB_API_VERSION >= 12
   std::vector<char> filename(kSbFileMaxName);
   while (SbDirectoryGetNext(directory, filename.data(), filename.size())) {
-    if (!SbStringCompare(kFilePrefix, filename.data(),
-                         sizeof(kFilePrefix) - 1) &&
+    if (!strncmp(kFilePrefix, filename.data(), sizeof(kFilePrefix) - 1) &&
         EndsWith(filename.data(), kGoodFileSuffix)) {
       found = true;
       break;
@@ -104,7 +103,7 @@
 #else
   SbDirectoryEntry entry;
   while (SbDirectoryGetNext(directory, &entry)) {
-    if (!SbStringCompare(kFilePrefix, entry.name, sizeof(kFilePrefix) - 1) &&
+    if (!strncmp(kFilePrefix, entry.name, sizeof(kFilePrefix) - 1) &&
         EndsWith(entry.name, kGoodFileSuffix)) {
       found = true;
       break;
diff --git a/src/starboard/loader_app/drain_file.cc b/src/starboard/loader_app/drain_file.cc
index 0fbf45b..b2a5e50 100644
--- a/src/starboard/loader_app/drain_file.cc
+++ b/src/starboard/loader_app/drain_file.cc
@@ -15,11 +15,13 @@
 #include "starboard/loader_app/drain_file.h"
 
 #include <algorithm>
+#include <cstring>
 #include <string>
 #include <vector>
 
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/directory.h"
 #include "starboard/string.h"
@@ -82,20 +84,18 @@
   std::vector<char> filename(kSbFileMaxName);
 
   while (SbDirectoryGetNext(slot, filename.data(), filename.size())) {
-    if (!SbStringCompareAll(filename.data(), ".") ||
-        !SbStringCompareAll(filename.data(), ".."))
+    if (!strcmp(filename.data(), ".") || !strcmp(filename.data(), ".."))
       continue;
-    if (!SbStringCompare(prefix.data(), filename.data(), prefix.size()))
+    if (!strncmp(prefix.data(), filename.data(), prefix.size()))
       filenames.push_back(std::string(filename.data()));
   }
 #else
   SbDirectoryEntry entry;
 
   while (SbDirectoryGetNext(slot, &entry)) {
-    if (!SbStringCompareAll(entry.name, ".") ||
-        !SbStringCompareAll(entry.name, ".."))
+    if (!strcmp(entry.name, ".") || !strcmp(entry.name, ".."))
       continue;
-    if (!SbStringCompare(prefix.data(), entry.name, prefix.size()))
+    if (!strncmp(prefix.data(), entry.name, prefix.size()))
       filenames.push_back(std::string(entry.name));
   }
 #endif
@@ -130,15 +130,15 @@
     const std::string left_app_key = ExtractAppKey(left);
     const std::string right_app_key = ExtractAppKey(right);
 
-    return SbStringCompare(left_app_key.c_str(), right_app_key.c_str(),
-                           right_app_key.size()) < 0;
+    return strncmp(left_app_key.c_str(), right_app_key.c_str(),
+                   right_app_key.size()) < 0;
   };
 
   std::sort(filenames.begin(), filenames.end(), compare_filenames);
 
   const std::string& ranking_app_key = ExtractAppKey(filenames.front());
 
-  if (SbStringCopy(app_key, ranking_app_key.c_str(), len) >= len)
+  if (starboard::strlcpy(app_key, ranking_app_key.c_str(), len) >= len)
     SB_LOG(ERROR) << "Returned value was truncated";
 }
 
@@ -192,7 +192,7 @@
 
   Rank(dir, ranking_app_key.data(), ranking_app_key.size());
 
-  return !SbStringCompareAll(ranking_app_key.data(), app_key);
+  return !strcmp(ranking_app_key.data(), app_key);
 }
 
 bool Remove(const char* dir, const char* app_key) {
@@ -239,7 +239,7 @@
   const std::vector<std::string> entries = FindAllWithPrefix(dir, "");
 
   for (const auto& entry : entries) {
-    if (!SbStringCompare(entry.c_str(), prefix.c_str(), prefix.size()))
+    if (!strncmp(entry.c_str(), prefix.c_str(), prefix.size()))
       continue;
 
     std::string path(dir);
diff --git a/src/starboard/loader_app/installation_manager.cc b/src/starboard/loader_app/installation_manager.cc
index 6f7286e..c004621 100644
--- a/src/starboard/loader_app/installation_manager.cc
+++ b/src/starboard/loader_app/installation_manager.cc
@@ -22,6 +22,7 @@
 #include "starboard/common/log.h"
 #include "starboard/common/mutex.h"
 #include "starboard/common/scoped_ptr.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/directory.h"
 #include "starboard/file.h"
@@ -150,7 +151,7 @@
     SB_LOG(ERROR) << "GetAppKey: not initialized";
     return IM_ERROR;
   }
-  SbStringCopy(app_key, app_key_.c_str(), app_key_length);
+  starboard::strlcpy(app_key, app_key_.c_str(), app_key_length);
   return IM_SUCCESS;
 }
 
diff --git a/src/starboard/loader_app/installation_manager_test.cc b/src/starboard/loader_app/installation_manager_test.cc
index 53cc009..2d558f7 100644
--- a/src/starboard/loader_app/installation_manager_test.cc
+++ b/src/starboard/loader_app/installation_manager_test.cc
@@ -260,7 +260,7 @@
   char app_key[MAX_APP_KEY_LENGTH];
   ASSERT_EQ(IM_SUCCESS, ImInitialize(GetParam(), kAppKey));
   ASSERT_EQ(IM_SUCCESS, ImGetAppKey(app_key, MAX_APP_KEY_LENGTH));
-  ASSERT_EQ(0, SbStringCompare(kAppKey, app_key, MAX_APP_KEY_LENGTH));
+  ASSERT_EQ(0, strncmp(kAppKey, app_key, MAX_APP_KEY_LENGTH));
 }
 
 TEST_P(InstallationManagerTest, GetMaxNumInstallations) {
diff --git a/src/starboard/loader_app/loader_app.cc b/src/starboard/loader_app/loader_app.cc
index 1286e2f..c1834af 100644
--- a/src/starboard/loader_app/loader_app.cc
+++ b/src/starboard/loader_app/loader_app.cc
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/elf_loader/elf_loader.h"
@@ -131,9 +132,9 @@
     SB_LOG(ERROR) << "Failed to get user agent string";
   } else {
     CrashpadAnnotations cobalt_version_info;
-    SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0);
-    SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(),
-                 USER_AGENT_STRING_MAX_SIZE);
+    memset(&cobalt_version_info, 0, sizeof(CrashpadAnnotations));
+    starboard::strlcpy(cobalt_version_info.user_agent_string,
+                       get_user_agent_func(), USER_AGENT_STRING_MAX_SIZE);
     third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
         cobalt_version_info);
     SB_DLOG(INFO) << "Added user agent string to Crashpad.";
@@ -164,15 +165,15 @@
     const starboard::shared::starboard::CommandLine command_line(
         data->argument_count, const_cast<const char**>(data->argument_values));
 
-    bool disable_updates =
-        command_line.HasSwitch(starboard::loader_app::kDisableUpdates);
-    SB_LOG(INFO) << "disable_updates=" << disable_updates;
+    bool is_evergreen_lite =
+        command_line.HasSwitch(starboard::loader_app::kEvergreenLite);
+    SB_LOG(INFO) << "is_evergreen_lite=" << is_evergreen_lite;
 
     std::string alternative_content =
         command_line.GetSwitchValue(starboard::loader_app::kContent);
     SB_LOG(INFO) << "alternative_content=" << alternative_content;
 
-    if (disable_updates) {
+    if (is_evergreen_lite) {
       LoadLibraryAndInitialize(alternative_content);
     } else {
       std::string url =
diff --git a/src/starboard/loader_app/loader_app_switches.cc b/src/starboard/loader_app/loader_app_switches.cc
index c48da31..36b6f8f 100644
--- a/src/starboard/loader_app/loader_app_switches.cc
+++ b/src/starboard/loader_app/loader_app_switches.cc
@@ -19,7 +19,7 @@
 
 const char kContent[] = "content";
 const char kURL[] = "url";
-const char kDisableUpdates[] = "disable_updates";
+const char kEvergreenLite[] = "evergreen_lite";
 
 }  // namespace loader_app
 }  // namespace starboard
diff --git a/src/starboard/loader_app/loader_app_switches.h b/src/starboard/loader_app/loader_app_switches.h
index c051ba4..45cbf01 100644
--- a/src/starboard/loader_app/loader_app_switches.h
+++ b/src/starboard/loader_app/loader_app_switches.h
@@ -29,8 +29,8 @@
 // If not specified the default is to load the YouTube main app.
 extern const char kURL[];
 
-// Disables Cobalt updates for the app.
-extern const char kDisableUpdates[];
+// Run Evergreen Lite by loading the system image and disabling the updater.
+extern const char kEvergreenLite[];
 
 }  // namespace loader_app
 }  // namespace starboard
diff --git a/src/starboard/loader_app/slot_management.cc b/src/starboard/loader_app/slot_management.cc
index b7399e1e..0d8cf3f 100644
--- a/src/starboard/loader_app/slot_management.cc
+++ b/src/starboard/loader_app/slot_management.cc
@@ -17,6 +17,7 @@
 #include <vector>
 
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/elf_loader/elf_loader_constants.h"
 #include "starboard/elf_loader/sabi_string.h"
@@ -208,8 +209,9 @@
                     kCobaltLibraryPath, kSbFileSepString, kCobaltLibraryName);
     if (!SbFileExists(lib_path.data())) {
       // Try the compressed path if the binary doesn't exits.
-      SbStringConcat(lib_path.data(), starboard::elf_loader::kCompressionSuffix,
-                     kSbFileMaxPath);
+      starboard::strlcat(lib_path.data(),
+                         starboard::elf_loader::kCompressionSuffix,
+                         kSbFileMaxPath);
     }
     SB_LOG(INFO) << "lib_path=" << lib_path.data();
 
@@ -273,9 +275,9 @@
       SB_LOG(ERROR) << "Failed to get user agent string";
     } else {
       CrashpadAnnotations cobalt_version_info;
-      SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0);
-      SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(),
-                   USER_AGENT_STRING_MAX_SIZE);
+      memset(&cobalt_version_info, 0, sizeof(CrashpadAnnotations));
+      starboard::strlcpy(cobalt_version_info.user_agent_string,
+                         get_user_agent_func(), USER_AGENT_STRING_MAX_SIZE);
       third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
           cobalt_version_info);
       SB_DLOG(INFO) << "Added user agent string to Crashpad.";
diff --git a/src/starboard/loader_app/system_get_extension_shim.cc b/src/starboard/loader_app/system_get_extension_shim.cc
index 51553bd..2389c20 100644
--- a/src/starboard/loader_app/system_get_extension_shim.cc
+++ b/src/starboard/loader_app/system_get_extension_shim.cc
@@ -14,6 +14,7 @@
 
 #include "starboard/loader_app/system_get_extension_shim.h"
 
+#include <cstring>
 #include <string>
 
 #include "cobalt/extension/installation_manager.h"
@@ -41,7 +42,7 @@
 namespace loader_app {
 
 const void* SbSystemGetExtensionShim(const char* name) {
-  if (SbStringCompareAll(name, kCobaltExtensionInstallationManagerName) == 0) {
+  if (strcmp(name, kCobaltExtensionInstallationManagerName) == 0) {
     return &kInstallationManagerApi;
   }
   return NULL;
diff --git a/src/starboard/media.h b/src/starboard/media.h
index 35249ad..aff144f 100644
--- a/src/starboard/media.h
+++ b/src/starboard/media.h
@@ -409,14 +409,14 @@
   // key frames, but may change on any key frame.
   int frame_height;
 
-// HDR metadata common for HDR10 and WebM/VP9-based HDR formats as
-// well as the Color Space, and Color elements: MatrixCoefficients,
-// BitsPerChannel, ChromaSubsamplingHorz, ChromaSubsamplingVert,
-// CbSubsamplingHorz, CbSubsamplingVert, ChromaSitingHorz,
-// ChromaSitingVert, Range, TransferCharacteristics, and Primaries
-// described here: https://matroska.org/technical/specs/index.html .
-// This will only be specified on frames where the HDR metadata and
-// color / color space might have changed (e.g. keyframes).
+  // HDR metadata common for HDR10 and WebM/VP9-based HDR formats as
+  // well as the Color Space, and Color elements: MatrixCoefficients,
+  // BitsPerChannel, ChromaSubsamplingHorz, ChromaSubsamplingVert,
+  // CbSubsamplingHorz, CbSubsamplingVert, ChromaSitingHorz,
+  // ChromaSitingVert, Range, TransferCharacteristics, and Primaries
+  // described here: https://matroska.org/technical/specs/index.html .
+  // This will only be specified on frames where the HDR metadata and
+  // color / color space might have changed (e.g. keyframes).
   SbMediaColorMetadata color_metadata;
 } SbMediaVideoSampleInfo;
 
@@ -489,6 +489,7 @@
 
 // --- Functions -------------------------------------------------------------
 
+#if SB_API_VERSION < 13
 // Indicates whether this platform supports decoding |video_codec| and
 // |audio_codec| along with decrypting using |key_system|. If |video_codec| is
 // |kSbMediaVideoCodecNone| or if |audio_codec| is |kSbMediaAudioCodecNone|,
@@ -503,6 +504,7 @@
 SB_EXPORT bool SbMediaIsSupported(SbMediaVideoCodec video_codec,
                                   SbMediaAudioCodec audio_codec,
                                   const char* key_system);
+#endif  // SB_API_VERSION < 13
 
 // Returns information about whether the playback of the specific media
 // described by |mime| and encrypted using |key_system| can be played.
diff --git a/src/starboard/memory.h b/src/starboard/memory.h
index b250a7f..1c537b9 100644
--- a/src/starboard/memory.h
+++ b/src/starboard/memory.h
@@ -45,6 +45,8 @@
 #include "starboard/system.h"
 #include "starboard/types.h"
 
+#include <string.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -54,8 +56,8 @@
 // The bitwise OR of these flags should be passed to SbMemoryMap to indicate
 // how the mapped memory can be used.
 typedef enum SbMemoryMapFlags {
-// No flags set: Reserves virtual address space. SbMemoryProtect() can later
-// make it accessible.
+  // No flags set: Reserves virtual address space. SbMemoryProtect() can later
+  // make it accessible.
   kSbMemoryMapProtectReserved = 0,
   kSbMemoryMapProtectRead = 1 << 0,   // Mapped memory can be read.
   kSbMemoryMapProtectWrite = 1 << 1,  // Mapped memory can be written to.
@@ -66,6 +68,8 @@
       kSbMemoryMapProtectRead | kSbMemoryMapProtectWrite,
 } SbMemoryMapFlags;
 
+#if SB_API_VERSION < 13
+
 // Checks whether |memory| is aligned to |alignment| bytes.
 static SB_C_FORCE_INLINE bool SbMemoryIsAligned(const void* memory,
                                                 size_t alignment) {
@@ -77,6 +81,8 @@
   return (size + kSbMemoryPageSize - 1) & ~(kSbMemoryPageSize - 1);
 }
 
+#endif  // SB_API_VERSION < 13
+
 static SB_C_FORCE_INLINE void SbAbortIfAllocationFailed(size_t requested_bytes,
                                                         void* address) {
   if (SB_UNLIKELY(requested_bytes > 0 && address == NULL)) {
@@ -240,6 +246,8 @@
 // |out_low|: The lowest addressable byte for the current thread.
 SB_EXPORT void SbMemoryGetStackBounds(void** out_high, void** out_low);
 
+#if SB_API_VERSION < 13
+
 // Copies |count| sequential bytes from |source| to |destination|, without
 // support for the |source| and |destination| regions overlapping. This
 // function is meant to be a drop-in replacement for |memcpy|.
@@ -304,17 +312,21 @@
                                        int value,
                                        size_t count);
 
+#endif  // SB_API_VERSION < 13
+
 // A wrapper that implements a drop-in replacement for |calloc|, which is used
 // in some packages.
 static SB_C_INLINE void* SbMemoryCalloc(size_t count, size_t size) {
   size_t total = count * size;
   void* result = SbMemoryAllocate(total);
   if (result) {
-    SbMemorySet(result, 0, total);
+    memset(result, 0, total);
   }
   return result;
 }
 
+#if SB_API_VERSION < 13
+
 // Returns true if the first |count| bytes of |buffer| are set to zero.
 static SB_C_INLINE bool SbMemoryIsZero(const void* buffer, size_t count) {
   if (count == 0) {
@@ -322,9 +334,11 @@
   }
   const char* char_buffer = (const char*)(buffer);
   return char_buffer[0] == 0 &&
-         SbMemoryCompare(char_buffer, char_buffer + 1, count - 1) == 0;
+         memcmp(char_buffer, char_buffer + 1, count - 1) == 0;
 }
 
+#endif  // SB_API_VERSION < 13
+
 /////////////////////////////////////////////////////////////////
 // Deprecated. Do not use.
 /////////////////////////////////////////////////////////////////
diff --git a/src/starboard/nplb/accessibility_test.cc b/src/starboard/nplb/accessibility_test.cc
index b182b79..01d6a26 100644
--- a/src/starboard/nplb/accessibility_test.cc
+++ b/src/starboard/nplb/accessibility_test.cc
@@ -53,7 +53,7 @@
   // |settings| should be zero-initialized.
   const int kInvalidValue = 0xFE;
   SbAccessibilityCaptionSettings settings;
-  SbMemorySet(&settings, kInvalidValue, sizeof(settings));
+  memset(&settings, kInvalidValue, sizeof(settings));
   EXPECT_FALSE(SbAccessibilityGetCaptionSettings(&settings));
 
   // Argument should not be NULL.
@@ -64,7 +64,7 @@
   // |settings| should be zero-initialized.
   SbAccessibilityCaptionSettings settings;
   const int kValidInitialValue = 0;
-  SbMemorySet(&settings, kValidInitialValue, sizeof(settings));
+  memset(&settings, kValidInitialValue, sizeof(settings));
   EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings));
 
   if (settings.background_color_state !=
@@ -135,7 +135,7 @@
 TEST(SbAccessibilityTest, CallSetCaptionsEnabled) {
   SbAccessibilityCaptionSettings settings;
   const int kValidInitialValue = 0;
-  SbMemorySet(&settings, kValidInitialValue, sizeof(settings));
+  memset(&settings, kValidInitialValue, sizeof(settings));
   EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings));
 
   if (settings.supports_is_enabled && settings.supports_set_enabled) {
@@ -143,7 +143,7 @@
     EXPECT_TRUE(SbAccessibilitySetCaptionsEnabled(!settings.is_enabled));
 
     SbAccessibilityCaptionSettings settings2;
-    SbMemorySet(&settings2, kValidInitialValue, sizeof(settings2));
+    memset(&settings2, kValidInitialValue, sizeof(settings2));
     EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings2));
     EXPECT_NE(settings.is_enabled, settings2.is_enabled);
 
@@ -151,7 +151,7 @@
     EXPECT_TRUE(SbAccessibilitySetCaptionsEnabled(settings.is_enabled));
 
     SbAccessibilityCaptionSettings settings3;
-    SbMemorySet(&settings3, kValidInitialValue, sizeof(settings3));
+    memset(&settings3, kValidInitialValue, sizeof(settings3));
     EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings3));
     EXPECT_EQ(settings.is_enabled, settings3.is_enabled);
   }
diff --git a/src/starboard/nplb/atomic_test.cc b/src/starboard/nplb/atomic_test.cc
index 16fd789..99cdc0b 100644
--- a/src/starboard/nplb/atomic_test.cc
+++ b/src/starboard/nplb/atomic_test.cc
@@ -67,7 +67,7 @@
 template <class SbAtomicType>
 SbAtomicType TestFillValue() {
   SbAtomicType val = 0;
-  SbMemorySet(&val, 0xa5, sizeof(SbAtomicType));
+  memset(&val, 0xa5, sizeof(SbAtomicType));
   return val;
 }
 
@@ -145,8 +145,8 @@
   } s;
 
   TypeParam prev_word_value, next_word_value;
-  SbMemorySet(&prev_word_value, 0xFF, sizeof(TypeParam));
-  SbMemorySet(&next_word_value, 0xEE, sizeof(TypeParam));
+  memset(&prev_word_value, 0xFF, sizeof(TypeParam));
+  memset(&next_word_value, 0xEE, sizeof(TypeParam));
 
   s.prev_word = prev_word_value;
   s.count = 0;
@@ -310,7 +310,7 @@
   if (atomic::NoBarrier_CompareAndSwap(state, kUninitialized, kInitializing) ==
       kUninitialized) {
     // We've locked the state, now we will initialize the data.
-    SbMemoryCopy(out_data, data, data_size);
+    memcpy(out_data, data, data_size);
     // Signal the initialization has completed.
     atomic::Release_Store(state, kInitialized);
     return;
@@ -364,7 +364,7 @@
 
     // The target buffer to store the data.
     char* target_data = new char[kDataPerThread];
-    SbMemorySet(target_data, 0, kDataPerThread);
+    memset(target_data, 0, kDataPerThread);
 
     // Each thread has a different set of data that it will try to set.
     char* data = new char[kTotalData];
@@ -394,8 +394,8 @@
     // Ensure that exactly one thread initialized the data.
     bool match = false;
     for (int i = 0; i < kNumThreads; ++i) {
-      if (SbMemoryCompare(target_data, data + i * kDataPerThread,
-                          kDataPerThread) == 0) {
+      if (memcmp(target_data, data + i * kDataPerThread,
+                 kDataPerThread) == 0) {
         match = true;
         break;
       }
diff --git a/src/starboard/nplb/compiler_compliance/compiler_compliance.gyp b/src/starboard/nplb/compiler_compliance/compiler_compliance.gyp
index b115147..88cea25 100644
--- a/src/starboard/nplb/compiler_compliance/compiler_compliance.gyp
+++ b/src/starboard/nplb/compiler_compliance/compiler_compliance.gyp
@@ -28,5 +28,18 @@
         '<(DEPTH)/starboard/starboard.gyp:starboard',
       ],
     },
+    {
+      'target_name': 'cpp17_supported',
+      'type': 'static_library',
+      'cflags_cc': [
+        '-std=c++17',
+      ],
+      'sources': [
+        'cpp17_support.cc',
+      ],
+      'dependencies': [
+        '<(DEPTH)/starboard/starboard.gyp:starboard',
+      ],
+    },
   ],
 }
diff --git a/src/starboard/nplb/compiler_compliance/cpp14_constexpr.cc b/src/starboard/nplb/compiler_compliance/cpp14_constexpr.cc
index 3a07f42..3d1ec32 100644
--- a/src/starboard/nplb/compiler_compliance/cpp14_constexpr.cc
+++ b/src/starboard/nplb/compiler_compliance/cpp14_constexpr.cc
@@ -32,7 +32,6 @@
 
 SB_COMPILE_ASSERT(CompileTimeStringLength(kPangram) == sizeof(kPangram),
                   CompileTimeStringLength_does_not_return_correct_length);
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/src/starboard/nplb/compiler_compliance/cpp14_initialization.cc b/src/starboard/nplb/compiler_compliance/cpp14_initialization.cc
index 9bca5f0..40724d0 100644
--- a/src/starboard/nplb/compiler_compliance/cpp14_initialization.cc
+++ b/src/starboard/nplb/compiler_compliance/cpp14_initialization.cc
@@ -21,7 +21,7 @@
 namespace {
 
 struct DummyClass {
-  DummyClass(int a) : a_(a) {}
+  explicit DummyClass(int a) : a_(a) {}
   int a_;
 };
 typedef std::vector<DummyClass> DummyClasses;
@@ -32,6 +32,11 @@
   const DummyClasses dummy_classes;
 }
 
+// Verify constexpr initialization. Supported from Clang 3.9, GCC 4.6, VS2017
+// See: http://open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#253
+struct CheckInitializerTag {};
+static constexpr CheckInitializerTag kEmptyTag;
+
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/src/starboard/nplb/compiler_compliance/cpp17_support.cc b/src/starboard/nplb/compiler_compliance/cpp17_support.cc
new file mode 100644
index 0000000..443f054
--- /dev/null
+++ b/src/starboard/nplb/compiler_compliance/cpp17_support.cc
@@ -0,0 +1,56 @@
+// Copyright 2021 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 aLicense 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 <utility>
+
+#include "starboard/configuration.h"
+#include "starboard/types.h"
+
+namespace starboard {
+namespace nplb {
+namespace {
+
+// Test Structured bindings support, P0217R3
+
+#ifndef __cpp_structured_bindings
+#error "Structured bindings support is required"
+#endif
+
+constexpr char test_structured_bindings() {
+  auto[a, b] = std::pair<int, char>(42, 'A');
+  return b;
+}
+
+static_assert(test_structured_bindings() == 'A',
+              "Structured bindings support is required");
+
+// Test UTF-8 literal support, N4267
+
+#ifndef __cpp_unicode_literals
+#error "Unicode literal support is required"
+#endif
+
+static_assert('A' == u8'A', "Unicode literal support is required");
+
+// Test constexpr lambda support, P0170R1
+
+constexpr int add_one(int n) {
+  return [n] { return n + 1; }();
+}
+
+static_assert(add_one(1) == 2, "Constexpr lambdas support is required");
+
+}  // namespace
+}  // namespace nplb
+}  // namespace starboard
diff --git a/src/starboard/nplb/cryptography_helpers.cc b/src/starboard/nplb/cryptography_helpers.cc
index 88c606e..d8c8a38 100644
--- a/src/starboard/nplb/cryptography_helpers.cc
+++ b/src/starboard/nplb/cryptography_helpers.cc
@@ -105,7 +105,7 @@
     return;
   }
 
-  size_t len = SbStringGetLength(in);
+  size_t len = strlen(in);
   if (len & 1) {
     ADD_FAILURE() << description << ": Odd length.";
     return;
diff --git a/src/starboard/nplb/cryptography_transform_gcm_test.cc b/src/starboard/nplb/cryptography_transform_gcm_test.cc
index f9e3616..6858eca 100644
--- a/src/starboard/nplb/cryptography_transform_gcm_test.cc
+++ b/src/starboard/nplb/cryptography_transform_gcm_test.cc
@@ -376,7 +376,7 @@
   }
 
   SbCryptographySetInitializationVector(encrypter, nonce.get(), nonce_len);
-  SbMemorySet(out.get(), 0, plaintext_len);
+  memset(out.get(), 0, plaintext_len);
   if (additional_data) {
     SbCryptographySetAuthenticatedData(encrypter, additional_data.get(),
                                        additional_data_len);
@@ -389,7 +389,7 @@
   }
 
   scoped_array<uint8_t> actual_tag(new uint8_t[tag_len]);
-  SbMemorySet(actual_tag.get(), 0, tag_len);
+  memset(actual_tag.get(), 0, tag_len);
   SbCryptographyGetTag(encrypter, actual_tag.get(), tag_len);
   if (tag) {
     EXPECT_STREQ(HexDump(tag.get(), tag_len).c_str(),
@@ -412,7 +412,7 @@
   ASSERT_THAT(decrypter, NotNull());
 
   SbCryptographySetInitializationVector(decrypter, nonce.get(), nonce_len);
-  SbMemorySet(out.get(), 0, plaintext_len);
+  memset(out.get(), 0, plaintext_len);
   if (additional_data) {
     SbCryptographySetAuthenticatedData(decrypter, additional_data.get(),
                                        additional_data_len);
@@ -425,7 +425,7 @@
   }
 
   actual_tag.reset(new uint8_t[tag_len]);
-  SbMemorySet(actual_tag.get(), 0, tag_len);
+  memset(actual_tag.get(), 0, tag_len);
   SbCryptographyGetTag(decrypter, actual_tag.get(), tag_len);
   if (tag) {
     EXPECT_STREQ(HexDump(tag.get(), tag_len).c_str(),
diff --git a/src/starboard/nplb/cryptography_transform_test.cc b/src/starboard/nplb/cryptography_transform_test.cc
index 00d4887..0d16d4f 100644
--- a/src/starboard/nplb/cryptography_transform_test.cc
+++ b/src/starboard/nplb/cryptography_transform_test.cc
@@ -166,14 +166,14 @@
     SbCryptographySetAuthenticatedData(encrypter, aad.get(), aad_len);
   }
 
-  const int kInputSize = static_cast<int>(SbStringGetLength(kClearText));
+  const int kInputSize = static_cast<int>(strlen(kClearText));
   const int kBufferSize = static_cast<int>(sizeof(kClearText));
   char* cipher_text = new char[kBufferSize];
-  SbMemorySet(cipher_text, 0, kBufferSize);
+  memset(cipher_text, 0, kBufferSize);
   int count =
       SbCryptographyTransform(encrypter, kClearText, kInputSize, cipher_text);
   EXPECT_EQ(kInputSize, count);
-  EXPECT_NE(0, SbStringCompare(kClearText, cipher_text, kBufferSize));
+  EXPECT_NE(0, strncmp(kClearText, cipher_text, kBufferSize));
 
   EXPECT_STREQ(GetExpectedEncryptedValueHex(),
                HexDump(cipher_text, kBufferSize).c_str());
@@ -201,12 +201,12 @@
   }
 
   char* decrypted_text = new char[kBufferSize];
-  SbMemorySet(decrypted_text, 0, kBufferSize);
+  memset(decrypted_text, 0, kBufferSize);
   count = SbCryptographyTransform(decrypter, cipher_text, kInputSize,
                                   decrypted_text);
 
   EXPECT_EQ(kInputSize, count);
-  EXPECT_EQ(kInputSize, SbStringGetLength(decrypted_text));
+  EXPECT_EQ(kInputSize, strlen(decrypted_text));
   EXPECT_STREQ(kClearText, decrypted_text);
 
   delete[] decrypted_text;
diff --git a/src/starboard/nplb/directory_create_test.cc b/src/starboard/nplb/directory_create_test.cc
index 2b828db..ea593cc 100644
--- a/src/starboard/nplb/directory_create_test.cc
+++ b/src/starboard/nplb/directory_create_test.cc
@@ -72,7 +72,7 @@
   bool system_path_success = SbSystemGetPath(
       kSbSystemPathTempDirectory, temp_path.data(), temp_path.size());
   ASSERT_TRUE(system_path_success);
-  const int new_size = SbStringConcat(
+  const int new_size = starboard::strlcat(
       temp_path.data(), kManyFileSeparators.c_str(), kSbFileMaxPath);
   ASSERT_LT(new_size, kSbFileMaxPath);
 
diff --git a/src/starboard/nplb/drm_update_server_certificate_test.cc b/src/starboard/nplb/drm_update_server_certificate_test.cc
index 25dc341..f31de8f 100644
--- a/src/starboard/nplb/drm_update_server_certificate_test.cc
+++ b/src/starboard/nplb/drm_update_server_certificate_test.cc
@@ -34,7 +34,7 @@
     if (SbDrmIsServerCertificateUpdatable(drm_system)) {
       SbDrmUpdateServerCertificate(drm_system, kSbDrmTicketInvalid + 1,
                                    kInvalidCertificate,
-                                   SbStringGetLength(kInvalidCertificate));
+                                   strlen(kInvalidCertificate));
     }
     SbDrmDestroySystem(drm_system);
   }
diff --git a/src/starboard/nplb/file_atomic_replace_test.cc b/src/starboard/nplb/file_atomic_replace_test.cc
index b14b117..dff2499 100644
--- a/src/starboard/nplb/file_atomic_replace_test.cc
+++ b/src/starboard/nplb/file_atomic_replace_test.cc
@@ -43,7 +43,7 @@
   EXPECT_EQ(size, SbFileReadAll(file, result, kTestContentsLength));
   EXPECT_TRUE(SbFileClose(file));
 
-  return SbStringCompare(str, result, kTestContentsLength) == 0;
+  return strncmp(str, result, kTestContentsLength) == 0;
 }
 
 TEST(SbFileAtomicReplaceTest, ReplacesValidFile) {
diff --git a/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc b/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc
index a56c91b..a117f3c 100644
--- a/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc
+++ b/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc
@@ -188,12 +188,6 @@
   ASSERT_EQ(result, kSbMediaSupportTypeProbably);
 
   result = SbMediaCanPlayMimeAndKeySystem(
-      "video/mp4; codecs=\"avc1.4d402a\"; width=1920; height=1080; "
-      "framerate=60;",
-      "");
-  ASSERT_EQ(result, kSbMediaSupportTypeProbably);
-
-  result = SbMediaCanPlayMimeAndKeySystem(
       "video/mp4; codecs=\"avc1.4d402a\"; width=0; height=0; "
       "framerate=0; bitrate=0",
       "");
diff --git a/src/starboard/nplb/memory_align_to_page_size_test.cc b/src/starboard/nplb/memory_align_to_page_size_test.cc
index 57c6bf9..cf890b8 100644
--- a/src/starboard/nplb/memory_align_to_page_size_test.cc
+++ b/src/starboard/nplb/memory_align_to_page_size_test.cc
@@ -16,6 +16,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -32,3 +34,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/memory_allocate_aligned_test.cc b/src/starboard/nplb/memory_allocate_aligned_test.cc
index 10be63d4..e0fb564 100644
--- a/src/starboard/nplb/memory_allocate_aligned_test.cc
+++ b/src/starboard/nplb/memory_allocate_aligned_test.cc
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "starboard/common/memory.h"
 #include "starboard/configuration.h"
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -28,7 +29,7 @@
   for (size_t align = 2; align < kMaxAlign; align <<= 1) {
     void* memory = SbMemoryAllocateAligned(align, kSize);
     ASSERT_NE(static_cast<void*>(NULL), memory);
-    EXPECT_TRUE(SbMemoryIsAligned(memory, align));
+    EXPECT_TRUE(starboard::common::MemoryIsAligned(memory, align));
     SbMemoryDeallocateAligned(memory);
   }
 }
@@ -41,7 +42,7 @@
     // allocated zero-size memory block, and some implementations may return
     // NULL.
     if (memory) {
-      EXPECT_TRUE(SbMemoryIsAligned(memory, align));
+      EXPECT_TRUE(starboard::common::MemoryIsAligned(memory, align));
     }
     SbMemoryDeallocateAligned(memory);
   }
diff --git a/src/starboard/nplb/memory_compare_test.cc b/src/starboard/nplb/memory_compare_test.cc
index 08c4767..d89a5f8 100644
--- a/src/starboard/nplb/memory_compare_test.cc
+++ b/src/starboard/nplb/memory_compare_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -69,3 +71,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/memory_copy_test.cc b/src/starboard/nplb/memory_copy_test.cc
index 4cf3474..4bca446 100644
--- a/src/starboard/nplb/memory_copy_test.cc
+++ b/src/starboard/nplb/memory_copy_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -72,3 +74,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif
diff --git a/src/starboard/nplb/memory_find_byte_test.cc b/src/starboard/nplb/memory_find_byte_test.cc
index 11154d2..bd8b826 100644
--- a/src/starboard/nplb/memory_find_byte_test.cc
+++ b/src/starboard/nplb/memory_find_byte_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -38,3 +40,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/memory_is_zero_test.cc b/src/starboard/nplb/memory_is_zero_test.cc
index f286f5a..3764da6 100644
--- a/src/starboard/nplb/memory_is_zero_test.cc
+++ b/src/starboard/nplb/memory_is_zero_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -50,3 +52,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/memory_map_test.cc b/src/starboard/nplb/memory_map_test.cc
index 24fdf6f..3c401f4 100644
--- a/src/starboard/nplb/memory_map_test.cc
+++ b/src/starboard/nplb/memory_map_test.cc
@@ -14,6 +14,7 @@
 
 #include <algorithm>
 
+#include "starboard/common/memory.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -165,7 +166,8 @@
       (reinterpret_cast<uintptr_t>(sum_function_start) / kSbMemoryPageSize) *
           kSbMemoryPageSize +
       kSbMemoryPageSize);
-  if (!SbMemoryIsAligned(sum_function_page_end, kSbMemoryPageSize)) {
+  if (!starboard::common::MemoryIsAligned(sum_function_page_end,
+                                          kSbMemoryPageSize)) {
     return std::make_tuple(::testing::AssertionFailure()
                                << "Expected |Sum| page end ("
                                << static_cast<void*>(sum_function_page_end)
@@ -191,7 +193,7 @@
         nullptr, nullptr);
   }
 
-  SbMemoryCopy(memory, sum_function_start, bytes_to_copy);
+  memcpy(memory, sum_function_start, bytes_to_copy);
   SbMemoryFlush(memory, bytes_to_copy);
 
   SumFunction mapped_function = reinterpret_cast<SumFunction>(
diff --git a/src/starboard/nplb/memory_move_test.cc b/src/starboard/nplb/memory_move_test.cc
index 0047ed3..b0bf868 100644
--- a/src/starboard/nplb/memory_move_test.cc
+++ b/src/starboard/nplb/memory_move_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -108,3 +110,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif
\ No newline at end of file
diff --git a/src/starboard/nplb/memory_set_test.cc b/src/starboard/nplb/memory_set_test.cc
index e8e6b51..49c37cb 100644
--- a/src/starboard/nplb/memory_set_test.cc
+++ b/src/starboard/nplb/memory_set_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -72,3 +74,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/microphone_get_available_test.cc b/src/starboard/nplb/microphone_get_available_test.cc
index d7383cf..a77af97 100644
--- a/src/starboard/nplb/microphone_get_available_test.cc
+++ b/src/starboard/nplb/microphone_get_available_test.cc
@@ -76,12 +76,12 @@
 TEST(SbMicrophoneGetAvailableTest, LabelIsValid) {
   const char* kPoisonLabel = "BadLabel";
   SbMicrophoneInfo info;
-  SbStringCopy(info.label, kPoisonLabel, SB_ARRAY_SIZE(info.label));
+  starboard::strlcpy(info.label, kPoisonLabel, SB_ARRAY_SIZE(info.label));
 
   if (SbMicrophoneGetAvailable(&info, 1) > 0) {
     ASSERT_TRUE(IsNullTerminated(info.label));
-    size_t count = static_cast<size_t>(SbStringGetLength(kPoisonLabel));
-    EXPECT_NE(0, SbStringCompare(info.label, kPoisonLabel, count));
+    size_t count = static_cast<size_t>(strlen(kPoisonLabel));
+    EXPECT_NE(0, strncmp(info.label, kPoisonLabel, count));
   }
 }
 
diff --git a/src/starboard/nplb/murmurhash2_test.cc b/src/starboard/nplb/murmurhash2_test.cc
index 276f8d7..d9bd5ce 100644
--- a/src/starboard/nplb/murmurhash2_test.cc
+++ b/src/starboard/nplb/murmurhash2_test.cc
@@ -28,7 +28,7 @@
   uint32_t hash_aligned = MurmurHash2_32_Aligned(&val, sizeof(val));
   EXPECT_EQ(hash_aligned, hash_unaligned);
   char data[sizeof(uint32_t)*2];
-  SbMemoryCopy(data+1, &val, sizeof(val));
+  memcpy(data+1, &val, sizeof(val));
   EXPECT_EQ(hash_aligned, MurmurHash2_32(data + 1, sizeof(val)));
 }
 
diff --git a/src/starboard/nplb/nplb.gyp b/src/starboard/nplb/nplb.gyp
index 35c48ba..5d44daa 100644
--- a/src/starboard/nplb/nplb.gyp
+++ b/src/starboard/nplb/nplb.gyp
@@ -315,6 +315,7 @@
       'dependencies': [
         '<@(cobalt_platform_dependencies)',
         '<(DEPTH)/starboard/common/common.gyp:common',
+        '<(DEPTH)/starboard/nplb/compiler_compliance/compiler_compliance.gyp:cpp14_supported',
         '<(DEPTH)/starboard/shared/starboard/media/media.gyp:media_util',
         '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player_copy_test_data',
         '<(DEPTH)/starboard/shared/starboard/player/player.gyp:video_dmp',
@@ -330,9 +331,9 @@
             'media_set_audio_write_duration_test.cc',
           ],
         }],
-        ['sb_disable_cpp14_audit == 0', {
+        ['sb_disable_cpp17_audit == 0', {
           'dependencies': [
-            '<(DEPTH)/starboard/nplb/compiler_compliance/compiler_compliance.gyp:cpp14_supported',
+            '<(DEPTH)/starboard/nplb/compiler_compliance/compiler_compliance.gyp:cpp17_supported',
           ],
         }],
         ['gl_type != "none"', {
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/crashpad_config_test.cc b/src/starboard/nplb/nplb_evergreen_compat_tests/crashpad_config_test.cc
new file mode 100644
index 0000000..ca4ee47
--- /dev/null
+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/crashpad_config_test.cc
@@ -0,0 +1,61 @@
+// Copyright 2021 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 <string>
+#include <vector>
+
+#include "cobalt/extension/crash_handler.h"
+#include "starboard/nplb/nplb_evergreen_compat_tests/checks.h"
+#include "starboard/system.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if SB_IS(EVERGREEN_COMPATIBLE)
+
+namespace starboard {
+namespace nplb {
+namespace nplb_evergreen_compat_tests {
+
+namespace {
+
+class CrashpadConfigTest : public ::testing::Test {
+ protected:
+  CrashpadConfigTest() {}
+  ~CrashpadConfigTest() {}
+};
+
+TEST_F(CrashpadConfigTest, VerifyUploadCert) {
+  std::vector<char> buffer(kSbFileMaxPath);
+  ASSERT_TRUE(SbSystemGetPath(kSbSystemPathContentDirectory, buffer.data(),
+                              buffer.size()));
+
+  std::string cert_location(buffer.data());
+  cert_location.append(std::string(kSbFileSepString) + "app" +
+                       kSbFileSepString + "cobalt" + kSbFileSepString +
+                       "content" + kSbFileSepString + "ssl" + kSbFileSepString +
+                       "certs");
+  ASSERT_TRUE(SbFileExists(cert_location.c_str()));
+}
+
+TEST_F(CrashpadConfigTest, VerifyCrashHandlerExtension) {
+  auto crash_handler_extension =
+      SbSystemGetExtension(kCobaltExtensionCrashHandlerName);
+  ASSERT_TRUE(crash_handler_extension != nullptr);
+}
+
+}  // namespace
+}  // namespace nplb_evergreen_compat_tests
+}  // namespace nplb
+}  // namespace starboard
+
+#endif  // SB_IS(EVERGREEN_COMPATIBLE)
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/executable_memory_test.cc b/src/starboard/nplb/nplb_evergreen_compat_tests/executable_memory_test.cc
index ece5aa3..c2fab51 100644
--- a/src/starboard/nplb/nplb_evergreen_compat_tests/executable_memory_test.cc
+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/executable_memory_test.cc
@@ -37,7 +37,7 @@
   void* memory =
       SbMemoryMap(kSize, kSbMemoryMapProtectWrite, "evergreen_buffer");
   ASSERT_NE(SB_MEMORY_MAP_FAILED, memory);
-  SbMemorySet(memory, 0, kSize);
+  memset(memory, 0, kSize);
   ASSERT_TRUE(SbMemoryProtect(
       memory, kSmallerSize, kSbMemoryMapProtectRead | kSbMemoryMapProtectExec));
   SbMemoryUnmap(memory, kSize);
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc b/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
index df9ba2b..091a496 100644
--- a/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
@@ -36,9 +36,15 @@
   std::vector<char> system_fonts_dir(kSbFileMaxPath);
   ASSERT_TRUE(SbSystemGetPath(kSbSystemPathFontDirectory,
                               system_fonts_dir.data(), kSbFileMaxPath));
-
   ASSERT_TRUE(SbFileExists(system_fonts_dir.data()));
-  std::string fonts_descriptor_file = system_fonts_dir.data();
+}
+
+TEST(FontsTest, VerifySystemFontsConfigDirectory) {
+  std::vector<char> system_fonts_conf_dir(kSbFileMaxPath);
+  ASSERT_TRUE(SbSystemGetPath(kSbSystemPathFontConfigurationDirectory,
+                              system_fonts_conf_dir.data(), kSbFileMaxPath));
+  ASSERT_TRUE(SbFileExists(system_fonts_conf_dir.data()));
+  std::string fonts_descriptor_file = system_fonts_conf_dir.data();
   fonts_descriptor_file += kSbFileSepString;
   fonts_descriptor_file += kFileName;
   ASSERT_TRUE(SbFileExists(fonts_descriptor_file.c_str()));
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp b/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
index 4e292f8..1f2b9a73 100644
--- a/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
@@ -19,6 +19,7 @@
       'type': '<(gtest_target_type)',
       'sources': [
         'checks.h',
+        'crashpad_config_test.cc',
         'executable_memory_test.cc',
         'fonts_test.cc',
         'sabi_test.cc',
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc b/src/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc
index 4cd5584..218cfb3 100644
--- a/src/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc
+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc
@@ -69,11 +69,11 @@
   SB_LOG(INFO) << "file: " << file_path;
 
   std::vector<char> buf(kBufSize);
-  SbMemorySet(buf.data(), 'A', kBufSize);
+  memset(buf.data(), 'A', kBufSize);
 
   WriteBuffer(file_path.c_str(), buf.data(), kBufSize);
 
-  SbMemorySet(buf.data(), 0, kBufSize);
+  memset(buf.data(), 0, kBufSize);
 
   ReadBuffer(file_path.c_str(), buf.data(), kBufSize);
 
diff --git a/src/starboard/nplb/socket_get_interface_address_test.cc b/src/starboard/nplb/socket_get_interface_address_test.cc
index 4515331..6ea2e81 100644
--- a/src/starboard/nplb/socket_get_interface_address_test.cc
+++ b/src/starboard/nplb/socket_get_interface_address_test.cc
@@ -33,15 +33,15 @@
   SbSocketAddress address;
 
   // Initialize to something invalid.
-  SbMemorySet(&address, kInvalidByte, sizeof(address));
-  SbMemorySet(&invalid_address, kInvalidByte, sizeof(invalid_address));
+  memset(&address, kInvalidByte, sizeof(address));
+  memset(&invalid_address, kInvalidByte, sizeof(invalid_address));
 
   EXPECT_TRUE(SbSocketGetInterfaceAddress(NULL, &address, NULL));
   EXPECT_EQ(0, address.port);
   EXPECT_FALSE(IsUnspecified(&address));
   EXPECT_FALSE(IsLocalhost(&address));
-  EXPECT_NE(0, SbMemoryCompare(address.address, invalid_address.address,
-                               SB_ARRAY_SIZE(address.address)));
+  EXPECT_NE(0, memcmp(address.address, invalid_address.address,
+                      SB_ARRAY_SIZE(address.address)));
 }
 
 TEST(SbSocketGetInterfaceAddressTest, RainyDayNull) {
@@ -52,8 +52,8 @@
   SbSocketAddress netmask;
   SbSocketAddress source;
 
-  SbMemorySet(&netmask, kInvalidByte, sizeof(netmask));
-  SbMemorySet(&source, kInvalidByte, sizeof(source));
+  memset(&netmask, kInvalidByte, sizeof(netmask));
+  memset(&source, kInvalidByte, sizeof(source));
 
   // If destination address is NULL, then any IP address that is valid for
   // |destination| set to 0.0.0.0 (IPv4) or :: (IPv6) can be returned.
@@ -79,8 +79,8 @@
   SbSocketAddress source;
 
   // Initialize to something invalid.
-  SbMemorySet(&netmask, kInvalidByte, sizeof(netmask));
-  SbMemorySet(&source, kInvalidByte, sizeof(source));
+  memset(&netmask, kInvalidByte, sizeof(netmask));
+  memset(&source, kInvalidByte, sizeof(source));
 
   EXPECT_TRUE(SbSocketGetInterfaceAddress(&destination, &source, NULL));
   EXPECT_EQ(GetAddressType(), source.type);
@@ -120,9 +120,9 @@
   SbSocketAddress source;
   SbSocketAddress netmask;
   SbSocketAddress invalid_address;
-  SbMemorySet(&netmask, kInvalidByte, sizeof(netmask));
-  SbMemorySet(&source, kInvalidByte, sizeof(source));
-  SbMemorySet(&invalid_address, kInvalidByte, sizeof(source));
+  memset(&netmask, kInvalidByte, sizeof(netmask));
+  memset(&source, kInvalidByte, sizeof(source));
+  memset(&invalid_address, kInvalidByte, sizeof(source));
   SbSocketGetInterfaceAddress(&destination_address, &source, &netmask);
 
   EXPECT_EQ(GetAddressType(), source.type);
@@ -130,10 +130,10 @@
   // A netmask that starts with 0 is likely incorrect.
   EXPECT_TRUE(netmask.address[0] & 0x80);
   EXPECT_EQ(GetAddressType(), netmask.type);
-  EXPECT_NE(0, SbMemoryCompare(source.address, invalid_address.address,
-                               SB_ARRAY_SIZE(source.address)));
-  EXPECT_NE(0, SbMemoryCompare(netmask.address, invalid_address.address,
-                               SB_ARRAY_SIZE(netmask.address)));
+  EXPECT_NE(0, memcmp(source.address, invalid_address.address,
+                      SB_ARRAY_SIZE(source.address)));
+  EXPECT_NE(0, memcmp(netmask.address, invalid_address.address,
+                      SB_ARRAY_SIZE(netmask.address)));
 
   SbSocketFreeResolution(resolution);
 }
@@ -158,9 +158,9 @@
   SbSocketAddress invalid_address;
 
   // Initialize to something invalid.
-  SbMemorySet(&netmask, kInvalidByte, sizeof(netmask));
-  SbMemorySet(&source, kInvalidByte, sizeof(source));
-  SbMemorySet(&invalid_address, kInvalidByte, sizeof(invalid_address));
+  memset(&netmask, kInvalidByte, sizeof(netmask));
+  memset(&source, kInvalidByte, sizeof(source));
+  memset(&invalid_address, kInvalidByte, sizeof(invalid_address));
 
   EXPECT_TRUE(SbSocketGetInterfaceAddress(&destination, &source, NULL));
   EXPECT_EQ(GetAddressType(), source.type);
@@ -168,10 +168,10 @@
   EXPECT_FALSE(IsLocalhost(&source));
   EXPECT_FALSE(IsUnspecified(&source));
 
-  EXPECT_NE(0, SbMemoryCompare(netmask.address, invalid_address.address,
-                               SB_ARRAY_SIZE(netmask.address)));
-  EXPECT_NE(0, SbMemoryCompare(source.address, invalid_address.address,
-                               SB_ARRAY_SIZE(source.address)));
+  EXPECT_NE(0, memcmp(netmask.address, invalid_address.address,
+                      SB_ARRAY_SIZE(netmask.address)));
+  EXPECT_NE(0, memcmp(source.address, invalid_address.address,
+                      SB_ARRAY_SIZE(source.address)));
 }
 
 #if SB_HAS(IPV6)
diff --git a/src/starboard/nplb/socket_send_to_test.cc b/src/starboard/nplb/socket_send_to_test.cc
index 22de722..b20f816 100644
--- a/src/starboard/nplb/socket_send_to_test.cc
+++ b/src/starboard/nplb/socket_send_to_test.cc
@@ -43,7 +43,7 @@
   // The contents of this buffer are inconsequential.
   const size_t kBufSize = 1024;
   char* send_buf = new char[kBufSize];
-  SbMemorySet(send_buf, 0, kBufSize);
+  memset(send_buf, 0, kBufSize);
 
   // Continue sending to the socket until it fails to send. It's expected that
   // SbSocketSendTo will fail when the server socket closes, but the application
diff --git a/src/starboard/nplb/storage_helpers.h b/src/starboard/nplb/storage_helpers.h
index ecfa8b8..5ae6f04 100644
--- a/src/starboard/nplb/storage_helpers.h
+++ b/src/starboard/nplb/storage_helpers.h
@@ -109,7 +109,7 @@
                                             int64_t total,
                                             int64_t pattern_offset = 0) {
   char* data = new char[total];
-  SbMemorySet(data, 0, total);
+  memset(data, 0, total);
   EXPECT_EQ(expected_length,
             SbStorageReadRecord(record, data + offset, length));
   CheckStorageBuffer(data, offset, expected_length, total, pattern_offset);
diff --git a/src/starboard/nplb/string_compare_all_test.cc b/src/starboard/nplb/string_compare_all_test.cc
index 898ad62..392d475 100644
--- a/src/starboard/nplb/string_compare_all_test.cc
+++ b/src/starboard/nplb/string_compare_all_test.cc
@@ -18,6 +18,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -33,3 +35,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_compare_no_case_n_test.cc b/src/starboard/nplb/string_compare_no_case_n_test.cc
index a3991ae..59f1d1b 100644
--- a/src/starboard/nplb/string_compare_no_case_n_test.cc
+++ b/src/starboard/nplb/string_compare_no_case_n_test.cc
@@ -22,13 +22,13 @@
 TEST(SbStringCompareNoCaseNTest, SunnyDaySelf) {
   const char kString[] = "0123456789";
   EXPECT_EQ(
-      0, SbStringCompareNoCaseN(kString, kString, SbStringGetLength(kString)));
+      0, SbStringCompareNoCaseN(kString, kString, strlen(kString)));
   EXPECT_EQ(0, SbStringCompareNoCaseN("", "", 0));
 }
 
 TEST(SbStringCompareNoCaseNTest, SunnyDayEmptyLessThanNotEmpty) {
   const char kString[] = "0123456789";
-  EXPECT_GT(0, SbStringCompareNoCaseN("", kString, SbStringGetLength(kString)));
+  EXPECT_GT(0, SbStringCompareNoCaseN("", kString, strlen(kString)));
 }
 
 TEST(SbStringCompareNoCaseNTest, SunnyDayEmptyZeroNEqual) {
@@ -39,27 +39,27 @@
 TEST(SbStringCompareNoCaseNTest, SunnyDayBigN) {
   const char kString[] = "0123456789";
   EXPECT_EQ(0, SbStringCompareNoCaseN(kString, kString,
-                                      SbStringGetLength(kString) * 2));
+                                      strlen(kString) * 2));
 }
 
 TEST(SbStringCompareNoCaseNTest, SunnyDayCase) {
   const char kString1[] = "aBcDeFgHiJkLmNoPqRsTuVwXyZ";
   const char kString2[] = "AbCdEfGhIjKlMnOpQrStUvWxYz";
   EXPECT_EQ(0, SbStringCompareNoCaseN(kString1, kString2,
-                                      SbStringGetLength(kString1)));
+                                      strlen(kString1)));
   EXPECT_EQ(0, SbStringCompareNoCaseN(kString2, kString1,
-                                      SbStringGetLength(kString2)));
+                                      strlen(kString2)));
 
   const char kString3[] = "aBcDeFgHiJkLmaBcDeFgHiJkLm";
   const char kString4[] = "AbCdEfGhIjKlMnOpQrStUvWxYz";
   EXPECT_GT(0, SbStringCompareNoCaseN(kString3, kString4,
-                                      SbStringGetLength(kString3)));
+                                      strlen(kString3)));
   EXPECT_LT(0, SbStringCompareNoCaseN(kString4, kString3,
-                                      SbStringGetLength(kString4)));
+                                      strlen(kString4)));
   EXPECT_EQ(0, SbStringCompareNoCaseN(kString3, kString4,
-                                      SbStringGetLength(kString3) / 2));
+                                      strlen(kString3) / 2));
   EXPECT_EQ(0, SbStringCompareNoCaseN(kString4, kString3,
-                                      SbStringGetLength(kString4) / 2));
+                                      strlen(kString4) / 2));
 }
 
 }  // namespace
diff --git a/src/starboard/nplb/string_compare_test.cc b/src/starboard/nplb/string_compare_test.cc
index 3b0c1b8..0dc79f7 100644
--- a/src/starboard/nplb/string_compare_test.cc
+++ b/src/starboard/nplb/string_compare_test.cc
@@ -18,6 +18,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -26,13 +28,15 @@
   const char kString1[] = "0123456788";
   const char kString2[] = "0123456789";
   EXPECT_EQ(0,
-            SbStringCompare(kString1, kString1, SbStringGetLength(kString1)));
+            SbStringCompare(kString1, kString1, strlen(kString1)));
   EXPECT_GT(0,
-            SbStringCompare(kString1, kString2, SbStringGetLength(kString1)));
+            SbStringCompare(kString1, kString2, strlen(kString1)));
   EXPECT_LT(0,
-            SbStringCompare(kString2, kString1, SbStringGetLength(kString2)));
+            SbStringCompare(kString2, kString1, strlen(kString2)));
 }
 
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_compare_wide_test.cc b/src/starboard/nplb/string_compare_wide_test.cc
index 034ece7..e56619a 100644
--- a/src/starboard/nplb/string_compare_wide_test.cc
+++ b/src/starboard/nplb/string_compare_wide_test.cc
@@ -18,6 +18,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -25,14 +27,13 @@
 TEST(SbStringCompareWideTest, SunnyDay) {
   const wchar_t kString1[] = L"0123456788";
   const wchar_t kString2[] = L"0123456789";
-  EXPECT_EQ(0, SbStringCompareWide(kString1, kString1,
-                                   SbStringGetLengthWide(kString1)));
-  EXPECT_GT(0, SbStringCompareWide(kString1, kString2,
-                                   SbStringGetLengthWide(kString1)));
-  EXPECT_LT(0, SbStringCompareWide(kString2, kString1,
-                                   SbStringGetLengthWide(kString2)));
+  EXPECT_EQ(0, SbStringCompareWide(kString1, kString1, wcslen(kString1)));
+  EXPECT_GT(0, SbStringCompareWide(kString1, kString2, wcslen(kString1)));
+  EXPECT_LT(0, SbStringCompareWide(kString2, kString1, wcslen(kString2)));
 }
 
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_concat_test.cc b/src/starboard/nplb/string_concat_test.cc
index 1b7f577..e2d7d90 100644
--- a/src/starboard/nplb/string_concat_test.cc
+++ b/src/starboard/nplb/string_concat_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -24,8 +26,8 @@
 
 void TestConcat(const char* initial, const char* source, bool is_short) {
   const int kDestinationOffset = 16;
-  int initial_length = static_cast<int>(SbStringGetLength(initial));
-  int source_length = static_cast<int>(SbStringGetLength(source));
+  int initial_length = static_cast<int>(strlen(initial));
+  int source_length = static_cast<int>(strlen(source));
   int destination_size =
       initial_length + source_length + kDestinationOffset * 2;
   int destination_limit = initial_length + source_length + 1;
@@ -36,14 +38,14 @@
   ASSERT_GT(1024, destination_size);
   char destination[1024] = {0};
   char* dest = destination + kDestinationOffset;
-  SbStringCopy(dest, initial, destination_limit);
+  starboard::strlcpy(dest, initial, destination_limit);
   int result = SbStringConcat(dest, source, destination_limit);
 
   EXPECT_EQ(initial_length + source_length, result);
 
   // Expected to be one less than the limit due to the null terminator.
   int expected_length = destination_limit - 1;
-  EXPECT_EQ(expected_length, SbStringGetLength(dest));
+  EXPECT_EQ(expected_length, strlen(dest));
 
   // Validate the memory before the destination isn't touched.
   for (int i = 0; i < kDestinationOffset; ++i) {
@@ -84,3 +86,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_concat_wide_test.cc b/src/starboard/nplb/string_concat_wide_test.cc
index 4e6686d..b1e8923 100644
--- a/src/starboard/nplb/string_concat_wide_test.cc
+++ b/src/starboard/nplb/string_concat_wide_test.cc
@@ -12,9 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <cwchar>
+
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace {
 
 const wchar_t kSource[] = L"0123456789";
@@ -22,8 +26,8 @@
 
 void TestConcat(const wchar_t* initial, const wchar_t* source, bool is_short) {
   const int kDestinationOffset = 16;
-  int initial_length = static_cast<int>(SbStringGetLengthWide(initial));
-  int source_length = static_cast<int>(SbStringGetLengthWide(source));
+  int initial_length = static_cast<int>(wcslen(initial));
+  int source_length = static_cast<int>(wcslen(source));
   int destination_size =
       initial_length + source_length + kDestinationOffset * 2;
   int destination_limit = initial_length + source_length + 1;
@@ -41,7 +45,7 @@
 
   // Expected to be one less than the limit due to the null terminator.
   int expected_length = destination_limit - 1;
-  EXPECT_EQ(expected_length, SbStringGetLengthWide(dest));
+  EXPECT_EQ(expected_length, wcslen(dest));
 
   // Validate the memory before the destination isn't touched.
   for (int i = 0; i < kDestinationOffset; ++i) {
@@ -80,3 +84,5 @@
 }
 
 }  // namespace
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_copy_test.cc b/src/starboard/nplb/string_copy_test.cc
index 0544376..f4839a4 100644
--- a/src/starboard/nplb/string_copy_test.cc
+++ b/src/starboard/nplb/string_copy_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -23,7 +25,7 @@
 
 void TestCopy(const char* source, bool is_short) {
   const int kDestinationOffset = 16;
-  int source_length = static_cast<int>(SbStringGetLength(source));
+  int source_length = static_cast<int>(strlen(source));
   int destination_size = source_length + kDestinationOffset * 2;
   int destination_limit = source_length + 1;
   if (is_short) {
@@ -39,7 +41,7 @@
 
   // Expected to be one less than the limit due to the null terminator.
   int expected_length = destination_limit - 1;
-  EXPECT_EQ(expected_length, SbStringGetLength(dest));
+  EXPECT_EQ(expected_length, strlen(dest));
 
   // Validate the memory before the destination isn't touched.
   for (int i = 0; i < kDestinationOffset; ++i) {
@@ -72,3 +74,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION >= 13
diff --git a/src/starboard/nplb/string_copy_wide_test.cc b/src/starboard/nplb/string_copy_wide_test.cc
index 3c6120a..3f7e270 100644
--- a/src/starboard/nplb/string_copy_wide_test.cc
+++ b/src/starboard/nplb/string_copy_wide_test.cc
@@ -12,16 +12,20 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <cwchar>
+
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace {
 
 const wchar_t kSource[] = L"01234567890123456789";
 
 void TestCopy(const wchar_t* source, bool is_short) {
   const int kDestinationOffset = 16;
-  int source_length = static_cast<int>(SbStringGetLengthWide(source));
+  int source_length = static_cast<int>(wcslen(source));
   int destination_size = source_length + kDestinationOffset * 2;
   int destination_limit = source_length + 1;
   if (is_short) {
@@ -37,7 +41,7 @@
 
   // Expected to be one less than the limit due to the null terminator.
   int expected_length = destination_limit - 1;
-  EXPECT_EQ(expected_length, SbStringGetLengthWide(dest));
+  EXPECT_EQ(expected_length, wcslen(dest));
 
   // Validate the memory before the destination isn't touched.
   for (int i = 0; i < kDestinationOffset; ++i) {
@@ -68,3 +72,5 @@
 }
 
 }  // namespace
+
+#endif  // SB_API_VERSION >= 13
diff --git a/src/starboard/nplb/string_duplicate_test.cc b/src/starboard/nplb/string_duplicate_test.cc
index bd007c2..f3defb3 100644
--- a/src/starboard/nplb/string_duplicate_test.cc
+++ b/src/starboard/nplb/string_duplicate_test.cc
@@ -25,7 +25,7 @@
   const char* kNull = NULL;
   EXPECT_NE(kNull, dupe);
   EXPECT_EQ(0, SbStringCompareNoCase(input, dupe));
-  EXPECT_EQ(SbStringGetLength(input), SbStringGetLength(dupe));
+  EXPECT_EQ(strlen(input), strlen(dupe));
   SbMemoryDeallocate(dupe);
 }
 
diff --git a/src/starboard/nplb/string_find_character_test.cc b/src/starboard/nplb/string_find_character_test.cc
index 646b456..746423d 100644
--- a/src/starboard/nplb/string_find_character_test.cc
+++ b/src/starboard/nplb/string_find_character_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -35,3 +37,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_find_last_character_test.cc b/src/starboard/nplb/string_find_last_character_test.cc
index 863f1c3..0f551e0 100644
--- a/src/starboard/nplb/string_find_last_character_test.cc
+++ b/src/starboard/nplb/string_find_last_character_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -24,7 +26,7 @@
 
 TEST(SbStringFindLastCharacterTest, SunnyDay) {
   for (int i = 0; i < 10; ++i) {
-    EXPECT_EQ(kTestString + SbStringGetLength(kTestString) - 10 + i,
+    EXPECT_EQ(kTestString + strlen(kTestString) - 10 + i,
               SbStringFindLastCharacter(kTestString, '0' + i));
   }
 }
@@ -36,3 +38,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_find_string_test.cc b/src/starboard/nplb/string_find_string_test.cc
index 11517bd..bccb7c8 100644
--- a/src/starboard/nplb/string_find_string_test.cc
+++ b/src/starboard/nplb/string_find_string_test.cc
@@ -15,6 +15,8 @@
 #include "starboard/common/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -53,3 +55,5 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/nplb/string_format_test.cc b/src/starboard/nplb/string_format_test.cc
index c22438e..7505d64 100644
--- a/src/starboard/nplb/string_format_test.cc
+++ b/src/starboard/nplb/string_format_test.cc
@@ -35,7 +35,7 @@
   char destination[1024] = {0};
   int result = Format(destination, SB_ARRAY_SIZE(destination), "a%db%dc%d%s", 1,
                       2, 3, "test");
-  size_t expected_length = SbStringGetLength(kExpected);
+  size_t expected_length = strlen(kExpected);
   EXPECT_EQ(expected_length, result);
   for (size_t i = 0; i <= expected_length; ++i) {
     EXPECT_EQ(kExpected[i], destination[i]);
diff --git a/src/starboard/nplb/string_format_wide_test.cc b/src/starboard/nplb/string_format_wide_test.cc
index 3ca9840..b2f6b28 100644
--- a/src/starboard/nplb/string_format_wide_test.cc
+++ b/src/starboard/nplb/string_format_wide_test.cc
@@ -38,7 +38,7 @@
   wchar_t destination[1024] = {0};
   int result = Format(destination, SB_ARRAY_SIZE(destination), L"a%db%dc%d%s",
                       1, 2, 3, "test");
-  size_t expected_length = SbStringGetLengthWide(kExpected);
+  size_t expected_length = wcslen(kExpected);
   EXPECT_EQ(expected_length, result);
   for (size_t i = 0; i <= expected_length; ++i) {
     EXPECT_EQ(kExpected[i], destination[i]);
diff --git a/src/starboard/nplb/system_binary_search_test.cc b/src/starboard/nplb/system_binary_search_test.cc
index 871609c..874d60f 100644
--- a/src/starboard/nplb/system_binary_search_test.cc
+++ b/src/starboard/nplb/system_binary_search_test.cc
@@ -35,7 +35,7 @@
 
 TEST(SbSystemBinarySearchTest, SunnyDayLetters) {
   char buf[SB_ARRAY_SIZE(kSorted)] = {0};
-  SbStringCopy(buf, kSorted, SB_ARRAY_SIZE(buf));
+  starboard::strlcpy(buf, kSorted, SB_ARRAY_SIZE(buf));
   void* result = SbSystemBinarySearch("k", kSorted, SB_ARRAY_SIZE(kSorted) - 1,
                                       1, CharComparator);
   EXPECT_EQ(result, kSorted + ('k' - 'a'));
diff --git a/src/starboard/nplb/system_get_error_string_test.cc b/src/starboard/nplb/system_get_error_string_test.cc
index 0502e33..1fb6aa5 100644
--- a/src/starboard/nplb/system_get_error_string_test.cc
+++ b/src/starboard/nplb/system_get_error_string_test.cc
@@ -34,9 +34,9 @@
     char name[128] = {0};
     int len = SbSystemGetErrorString(error, name, SB_ARRAY_SIZE_INT(name));
     EXPECT_LT(0, len);
-    EXPECT_LT(0, SbStringGetLength(name));
+    EXPECT_LT(0, strlen(name));
     if (len < SB_ARRAY_SIZE_INT(name)) {
-      EXPECT_EQ(len, SbStringGetLength(name));
+      EXPECT_EQ(len, strlen(name));
     }
   }
 
@@ -44,7 +44,7 @@
     char name[128] = {0};
     int len = SbSystemGetErrorString(error, name, 0);
     EXPECT_LT(0, len);
-    EXPECT_EQ(0, SbStringGetLength(name));
+    EXPECT_EQ(0, strlen(name));
   }
 
   {
diff --git a/src/starboard/nplb/system_get_path_test.cc b/src/starboard/nplb/system_get_path_test.cc
index 55ca991..44138ac 100644
--- a/src/starboard/nplb/system_get_path_test.cc
+++ b/src/starboard/nplb/system_get_path_test.cc
@@ -38,14 +38,14 @@
                int line) {
 #define LOCAL_CONTEXT "Context : id=" << id << ", line=" << line;
   std::vector<char> path(kPathSize);
-  SbMemorySet(path.data(), 0xCD, kPathSize);
+  memset(path.data(), 0xCD, kPathSize);
   bool result = SbSystemGetPath(id, path.data(), kPathSize);
   if (expect_result) {
     EXPECT_EQ(expected_result, result) << LOCAL_CONTEXT;
   }
   if (result) {
     EXPECT_NE('\xCD', path[0]) << LOCAL_CONTEXT;
-    int len = static_cast<int>(SbStringGetLength(path.data()));
+    int len = static_cast<int>(strlen(path.data()));
     EXPECT_GT(len, 0) << LOCAL_CONTEXT;
   } else {
     EXPECT_EQ('\xCD', path[0]) << LOCAL_CONTEXT;
@@ -55,7 +55,7 @@
 
 void UnmodifiedOnFailureTest(SbSystemPathId id, int line) {
   std::vector<char> path(kPathSize);
-  SbMemorySet(path.data(), 0xCD, kPathSize);
+  memset(path.data(), 0xCD, kPathSize);
   for (size_t i = 0; i <= kPathSize; ++i) {
     if (SbSystemGetPath(id, path.data(), i)) {
       return;
@@ -111,7 +111,7 @@
 
 TEST(SbSystemGetPathTest, CanCreateAndRemoveDirectoryInCache) {
   std::vector<char> path(kPathSize);
-  SbMemorySet(path.data(), 0xCD, kPathSize);
+  memset(path.data(), 0xCD, kPathSize);
   bool result =
       SbSystemGetPath(kSbSystemPathCacheDirectory, path.data(), kPathSize);
   EXPECT_TRUE(result);
@@ -120,7 +120,7 @@
     // Delete a directory and confirm that it does not exist.
     std::string sub_path =
         kSbFileSepString + ScopedRandomFile::MakeRandomFilename();
-    EXPECT_GT(SbStringConcat(path.data(), sub_path.c_str(), kPathSize), 0);
+    EXPECT_GT(starboard::strlcat(path.data(), sub_path.c_str(), kPathSize), 0);
     EXPECT_TRUE(SbFileDelete(path.data()));
     EXPECT_FALSE(SbFileExists(path.data()));
 
@@ -140,18 +140,18 @@
 
 TEST(SbSystemGetPathTest, CanWriteAndReadCache) {
   std::vector<char> path(kPathSize);
-  SbMemorySet(path.data(), 0xCD, kPathSize);
+  memset(path.data(), 0xCD, kPathSize);
   bool result =
       SbSystemGetPath(kSbSystemPathCacheDirectory, path.data(), kPathSize);
   EXPECT_TRUE(result);
   if (result) {
     EXPECT_NE('\xCD', path[0]);
-    int len = static_cast<int>(SbStringGetLength(path.data()));
+    int len = static_cast<int>(strlen(path.data()));
     EXPECT_GT(len, 0);
     // Delete a file and confirm that it does not exist.
     std::string sub_path =
         kSbFileSepString + ScopedRandomFile::MakeRandomFilename();
-    EXPECT_GT(SbStringConcat(path.data(), sub_path.c_str(), kPathSize), 0);
+    EXPECT_GT(starboard::strlcat(path.data(), sub_path.c_str(), kPathSize), 0);
     EXPECT_TRUE(SbFileDelete(path.data()));
     EXPECT_FALSE(SbFileExists(path.data()));
 
@@ -189,13 +189,13 @@
   // Verify that the creation time of the current executable file is not
   // greater than the current time.
   std::vector<char> path(kPathSize);
-  SbMemorySet(path.data(), 0xCD, kPathSize);
+  memset(path.data(), 0xCD, kPathSize);
   bool result =
       SbSystemGetPath(kSbSystemPathExecutableFile, path.data(), kPathSize);
   ASSERT_TRUE(result);
 
   EXPECT_NE('\xCD', path[0]);
-  int len = static_cast<int>(SbStringGetLength(path.data()));
+  int len = static_cast<int>(strlen(path.data()));
   EXPECT_GT(len, 0);
 
   SbFileInfo executable_file_info;
diff --git a/src/starboard/nplb/system_get_property_test.cc b/src/starboard/nplb/system_get_property_test.cc
index e9c68ff..7f55fc9 100644
--- a/src/starboard/nplb/system_get_property_test.cc
+++ b/src/starboard/nplb/system_get_property_test.cc
@@ -47,14 +47,14 @@
                int line) {
 #define LOCAL_CONTEXT "Context : id=" << id << ", line=" << line;
   char value[kValueSize] = {0};
-  SbMemorySet(value, 0xCD, kValueSize);
+  memset(value, 0xCD, kValueSize);
   bool result = SbSystemGetProperty(id, value, kValueSize);
   if (expect_result) {
     EXPECT_EQ(expected_result, result) << LOCAL_CONTEXT;
   }
   if (result) {
     EXPECT_NE('\xCD', value[0]) << LOCAL_CONTEXT;
-    int len = static_cast<int>(SbStringGetLength(value));
+    int len = static_cast<int>(strlen(value));
     EXPECT_GT(len, 0) << LOCAL_CONTEXT;
   } else {
     EXPECT_EQ('\xCD', value[0]) << LOCAL_CONTEXT;
@@ -64,7 +64,7 @@
 
 void UnmodifiedOnFailureTest(SbSystemPropertyId id, int line) {
   char value[kValueSize] = {0};
-  SbMemorySet(value, 0xCD, kValueSize);
+  memset(value, 0xCD, kValueSize);
   for (size_t i = 0; i <= kValueSize; ++i) {
     if (SbSystemGetProperty(id, value, i)) {
       return;
@@ -144,7 +144,7 @@
       SbSystemGetProperty(kSbSystemPropertySpeechApiKey, speech_api_key, kSize);
 
   if (!has_speech_key) {
-    EXPECT_EQ(0, SbStringGetLength(speech_api_key));
+    EXPECT_EQ(0, strlen(speech_api_key));
     return;
   }
 
@@ -167,7 +167,7 @@
     char value[kSize] = {0};
 
     if (SbSystemGetProperty(val, value, kSize)) {
-      ASSERT_FALSE(SbStringFindString(value, speech_api_key));
+      ASSERT_FALSE(strstr(value, speech_api_key));
     }
   }
 }
diff --git a/src/starboard/nplb/system_sort_test.cc b/src/starboard/nplb/system_sort_test.cc
index a2b71a0..0defcc3 100644
--- a/src/starboard/nplb/system_sort_test.cc
+++ b/src/starboard/nplb/system_sort_test.cc
@@ -40,7 +40,7 @@
   char buf[SB_ARRAY_SIZE(kSorted)] = {0};
   SbStringCopy(buf, kScrambled, SB_ARRAY_SIZE(buf));
   SbSystemSort(buf, SB_ARRAY_SIZE(buf) - 1, 1, &CharComparator);
-  EXPECT_TRUE(SbStringCompareAll(kSorted, kScrambled));
+  EXPECT_TRUE(strcmp(kSorted, kScrambled));
 }
 
 }  // namespace
diff --git a/src/starboard/nplb/system_symbolize_test.cc b/src/starboard/nplb/system_symbolize_test.cc
index d66d8dc..c556442 100644
--- a/src/starboard/nplb/system_symbolize_test.cc
+++ b/src/starboard/nplb/system_symbolize_test.cc
@@ -27,7 +27,7 @@
   char buffer[1024] = {0};
   bool result = SbSystemSymbolize(stack[0], buffer, SB_ARRAY_SIZE_INT(buffer));
   if (result) {
-    EXPECT_LT(0, SbStringGetLength(buffer));
+    EXPECT_LT(0, strlen(buffer));
   }
 }
 
@@ -35,12 +35,12 @@
   char buffer[1024] = {0};
   bool result = SbSystemSymbolize(NULL, buffer, SB_ARRAY_SIZE_INT(buffer));
   EXPECT_FALSE(result);
-  EXPECT_EQ(0, SbStringGetLength(buffer));
+  EXPECT_EQ(0, strlen(buffer));
 
   // This stack pointer shouldn't have a symbol either.
   result = SbSystemSymbolize(buffer, buffer, SB_ARRAY_SIZE_INT(buffer));
   EXPECT_FALSE(result);
-  EXPECT_EQ(0, SbStringGetLength(buffer));
+  EXPECT_EQ(0, strlen(buffer));
 }
 
 }  // namespace
diff --git a/src/starboard/nplb/user_get_property_test.cc b/src/starboard/nplb/user_get_property_test.cc
index 01fa378..009d6a0 100644
--- a/src/starboard/nplb/user_get_property_test.cc
+++ b/src/starboard/nplb/user_get_property_test.cc
@@ -26,7 +26,7 @@
 
   if (size > 0) {
     char* property = new char[size + 10];
-    SbMemorySet(property, 0, size + 10);
+    memset(property, 0, size + 10);
     EXPECT_TRUE(SbUserGetProperty(user, property_id, property, size));
     for (int i = 0; i < size - 1; ++i) {
       EXPECT_NE(property[i], '\0') << "position " << i;
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/raspi/2/sbversion/13/atomic_public.h
similarity index 66%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/raspi/2/sbversion/13/atomic_public.h
index 9031c7b..27e44ca 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/raspi/2/sbversion/13/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_RASPI_2_SBVERSION_13_ATOMIC_PUBLIC_H_
+#define STARBOARD_RASPI_2_SBVERSION_13_ATOMIC_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/raspi/2/atomic_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_RASPI_2_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/raspi/2/sbversion/13/configuration_public.h b/src/starboard/raspi/2/sbversion/13/configuration_public.h
new file mode 100644
index 0000000..a6fa8a0
--- /dev/null
+++ b/src/starboard/raspi/2/sbversion/13/configuration_public.h
@@ -0,0 +1,140 @@
+// Copyright 2021 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.
+
+// The Starboard configuration for Raspberry PI 2 Raspbian.
+
+#ifndef STARBOARD_RASPI_2_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_RASPI_2_SBVERSION_13_CONFIGURATION_PUBLIC_H_
+
+// --- System Header Configuration -------------------------------------------
+
+// Any system headers listed here that are not provided by the platform will be
+// emulated in starboard/types.h.
+
+// Whether the current platform provides the standard header sys/types.h.
+#define SB_HAS_SYS_TYPES_H 1
+
+// Whether the current platform provides ssize_t.
+#define SB_HAS_SSIZE_T 1
+
+// Type detection for wchar_t.
+#define SB_IS_WCHAR_T_UTF32 1
+
+// Chrome has an exclusion for iOS here, we should too when we support iOS.
+#define SB_IS_WCHAR_T_UNSIGNED 1
+
+// --- Attribute Configuration -----------------------------------------------
+
+// The platform's annotation for forcing a C function to be inlined.
+#define SB_C_FORCE_INLINE __inline__ __attribute__((always_inline))
+
+// The platform's annotation for marking a C function as suggested to be
+// inlined.
+#define SB_C_INLINE inline
+
+// The platform's annotation for marking a C function as forcibly not
+// inlined.
+#define SB_C_NOINLINE __attribute__((noinline))
+
+// The platform's annotation for marking a symbol as exported outside of the
+// current shared library.
+#define SB_EXPORT_PLATFORM __attribute__((visibility("default")))
+
+// The platform's annotation for marking a symbol as imported from outside of
+// the current linking unit.
+#define SB_IMPORT_PLATFORM
+
+// --- Extensions Configuration ----------------------------------------------
+
+// Do not use <unordered_map> and <unordered_set> for the hash table types.
+#define SB_HAS_STD_UNORDERED_HASH 0
+
+// GCC/Clang doesn't define a long long hash function, except for Android and
+// Game consoles.
+#define SB_HAS_LONG_LONG_HASH 0
+
+// GCC/Clang doesn't define a string hash function, except for Game Consoles.
+#define SB_HAS_STRING_HASH 0
+
+// Desktop Linux needs a using statement for the hash functions.
+#define SB_HAS_HASH_USING 0
+
+// Set this to 1 if hash functions for custom types can be defined as a
+// hash_value() function. Otherwise, they need to be placed inside a
+// partially-specified hash struct template with an operator().
+#define SB_HAS_HASH_VALUE 0
+
+// Set this to 1 if use of hash_map or hash_set causes a deprecation warning
+// (which then breaks the build).
+#define SB_HAS_HASH_WARNING 1
+
+// The location to include hash_map on this platform.
+#define SB_HASH_MAP_INCLUDE <ext/hash_map>
+
+// C++'s hash_map and hash_set are often found in different namespaces depending
+// on the compiler.
+#define SB_HASH_NAMESPACE __gnu_cxx
+
+// The location to include hash_set on this platform.
+#define SB_HASH_SET_INCLUDE <ext/hash_set>
+
+// --- Graphics Configuration ------------------------------------------------
+
+// Indicates whether or not the given platform supports bilinear filtering.
+// This can be checked to enable/disable renderer tests that verify that this is
+// working properly.
+#define SB_HAS_BILINEAR_FILTERING_SUPPORT 1
+
+// Indicates whether or not the given platform supports rendering of NV12
+// textures. These textures typically originate from video decoders.
+#define SB_HAS_NV12_TEXTURE_SUPPORT 1
+
+// --- I/O Configuration -----------------------------------------------------
+
+// Whether the current platform implements the on screen keyboard interface.
+#define SB_HAS_ON_SCREEN_KEYBOARD 0
+
+// Whether the current platform has speech recognizer.
+#define SB_HAS_SPEECH_RECOGNIZER 0
+
+// Whether the current platform has speech synthesis.
+#define SB_HAS_SPEECH_SYNTHESIS 0
+
+// --- Memory Configuration --------------------------------------------------
+
+// Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
+// required for platforms that want to JIT.
+#define SB_CAN_MAP_EXECUTABLE_MEMORY 1
+
+// --- Network Configuration -------------------------------------------------
+
+// Specifies whether this platform supports IPV6.
+#define SB_HAS_IPV6 1
+
+// Specifies whether this platform supports pipe.
+#define SB_HAS_PIPE 1
+
+// --- Timing API ------------------------------------------------------------
+
+// Whether this platform has an API to retrieve how long the current thread
+// has spent in the executing state.
+#define SB_HAS_TIME_THREAD_NOW 1
+
+// --- Platform Specific Audits ----------------------------------------------
+
+#if !defined(__GNUC__)
+#error "RasPi builds need a GCC-like compiler (for the moment)."
+#endif
+
+#endif  // STARBOARD_RASPI_2_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi b/src/starboard/raspi/2/sbversion/13/gyp_configuration.gypi
similarity index 64%
copy from src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi
copy to src/starboard/raspi/2/sbversion/13/gyp_configuration.gypi
index b5e201c..535a1de 100644
--- a/src/starboard/linux/x64x11/clang/3.6/gyp_configuration.gypi
+++ b/src/starboard/raspi/2/sbversion/13/gyp_configuration.gypi
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -14,31 +14,32 @@
 
 {
   'variables': {
-    'sb_target_platform': 'linux-x64x11-clang-3-6',
-    'cobalt_v8_emit_builtins_as_inline_asm': 1,
-    'sb_disable_cpp14_audit': 1,
+    'variables': {
+      'sb_evergreen_compatible': 1,
+      'sb_evergreen_compatible_libunwind': 1,
+    },
   },
 
   'target_defaults': {
-    'default_configuration': 'linux-x64x11-clang-3-6_debug',
+    'default_configuration': 'raspi-2-sbversion-13_debug',
     'configurations': {
-      'linux-x64x11-clang-3-6_debug': {
+      'raspi-2-sbversion-13_debug': {
         'inherit_from': ['debug_base'],
       },
-      'linux-x64x11-clang-3-6_devel': {
+      'raspi-2-sbversion-13_devel': {
         'inherit_from': ['devel_base'],
       },
-      'linux-x64x11-clang-3-6_qa': {
+      'raspi-2-sbversion-13_qa': {
         'inherit_from': ['qa_base'],
       },
-      'linux-x64x11-clang-3-6_gold': {
+      'raspi-2-sbversion-13_gold': {
         'inherit_from': ['gold_base'],
       },
     }, # end of configurations
   },
 
   'includes': [
-    'compiler_flags.gypi',
-    '../gyp_configuration.gypi',
+    '<(DEPTH)/starboard/raspi/2/architecture.gypi',
+    '<(DEPTH)/starboard/raspi/shared/gyp_configuration.gypi',
   ],
 }
diff --git a/src/starboard/raspi/2/sbversion/13/gyp_configuration.py b/src/starboard/raspi/2/sbversion/13/gyp_configuration.py
new file mode 100644
index 0000000..b4bafff
--- /dev/null
+++ b/src/starboard/raspi/2/sbversion/13/gyp_configuration.py
@@ -0,0 +1,26 @@
+# Copyright 2021 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.
+"""Starboard Raspberry Pi 2 platform configuration."""
+
+import importlib
+
+# Dynamically imported to get around the number in the path.
+_PARENT_CONFIGURATION = importlib.import_module(
+    'starboard.raspi.2.gyp_configuration')
+
+
+def CreatePlatformConfig():
+  return _PARENT_CONFIGURATION.Raspi2PlatformConfig(
+      'raspi-2-sbversion-13',
+      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v13.json')
diff --git a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp b/src/starboard/raspi/2/sbversion/13/starboard_platform.gyp
similarity index 62%
copy from src/starboard/client_porting/pr_starboard/pr_starboard.gyp
copy to src/starboard/raspi/2/sbversion/13/starboard_platform.gyp
index 97c4786..039b4c6 100644
--- a/src/starboard/client_porting/pr_starboard/pr_starboard.gyp
+++ b/src/starboard/raspi/2/sbversion/13/starboard_platform.gyp
@@ -1,4 +1,4 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+# Copyright 2021 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.
@@ -13,17 +13,9 @@
 # limitations under the License.
 
 {
-  'targets': [
-    {
-      'target_name': 'pr_starboard',
-      'type': 'static_library',
-      'sources': [
-        'pr_starboard.cc',
-        'pr_starboard.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
+  'includes': [
+    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
+    # is that we just want this file to *be* the parent gyp file.
+    '<(DEPTH)/starboard/raspi/2/starboard_platform.gyp',
   ],
 }
diff --git a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h b/src/starboard/raspi/2/sbversion/13/thread_types_public.h
similarity index 64%
copy from src/starboard/linux/x64x11/clang/3.6/atomic_public.h
copy to src/starboard/raspi/2/sbversion/13/thread_types_public.h
index 9031c7b..021ba44 100644
--- a/src/starboard/linux/x64x11/clang/3.6/atomic_public.h
+++ b/src/starboard/raspi/2/sbversion/13/thread_types_public.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2021 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.
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#ifndef STARBOARD_RASPI_2_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_RASPI_2_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
 
-#include "starboard/linux/x64x11/atomic_public.h"
+#include "starboard/raspi/2/thread_types_public.h"
 
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_6_ATOMIC_PUBLIC_H_
+#endif  // STARBOARD_RASPI_2_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/raspi/2/skia/system_get_extensions.cc b/src/starboard/raspi/2/skia/system_get_extensions.cc
index 01e50ba..568d321 100644
--- a/src/starboard/raspi/2/skia/system_get_extensions.cc
+++ b/src/starboard/raspi/2/skia/system_get_extensions.cc
@@ -19,7 +19,7 @@
 #include "starboard/raspi/2/skia/configuration.h"
 
 const void* SbSystemGetExtension(const char* name) {
-  if (SbStringCompareAll(name, kCobaltExtensionConfigurationName) == 0) {
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
     return starboard::raspi::skia::GetConfigurationApi();
   }
   return NULL;
diff --git a/src/starboard/raspi/shared/dispmanx_util.cc b/src/starboard/raspi/shared/dispmanx_util.cc
index 076c1a5..34cf973 100644
--- a/src/starboard/raspi/shared/dispmanx_util.cc
+++ b/src/starboard/raspi/shared/dispmanx_util.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/raspi/shared/dispmanx_util.h"
 
+#include <utility>
+
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/memory.h"
 
@@ -92,8 +94,8 @@
 
 void DispmanxYUV420Resource::ClearWithBlack() {
   scoped_array<uint8_t> data(new uint8_t[width() * height() * 3 / 2]);
-  SbMemorySet(data.get(), width() * height(), 0);
-  SbMemorySet(data.get() + width() * height(), width() * height() / 2, 0x80);
+  memset(data.get(), 0, width() * height());
+  memset(data.get() + width() * height(), 0x80, width() * height() / 2);
   WriteData(data.get());
 }
 
@@ -109,7 +111,7 @@
 
 void DispmanxRGB565Resource::ClearWithBlack() {
   scoped_array<uint8_t> data(new uint8_t[width() * height() * 2]);
-  SbMemorySet(data.get(), width() * height() * 2, 0);
+  memset(data.get(), 0, width() * height() * 2);
   WriteData(data.get());
 }
 
diff --git a/src/starboard/raspi/shared/gyp_configuration.py b/src/starboard/raspi/shared/gyp_configuration.py
index a178635..158f126 100644
--- a/src/starboard/raspi/shared/gyp_configuration.py
+++ b/src/starboard/raspi/shared/gyp_configuration.py
@@ -98,7 +98,7 @@
       raise RuntimeError('RasPi builds require the "RASPI_HOME" '
                          'environment variable to be set.')
     if not os.path.isdir(self.sysroot):
-      raise RuntimeError('RasPi builds require $RASPI_HOME/sysroot '
+      raise RuntimeError('RasPi builds require $RASPI_HOME/busterroot '
                          'to be a valid directory.')
 
   def GetTargetToolchain(self, **kwargs):
diff --git a/src/starboard/raspi/shared/open_max/decode_target_get_info.cc b/src/starboard/raspi/shared/open_max/decode_target_get_info.cc
index 5957b6f..fc721cc 100644
--- a/src/starboard/raspi/shared/open_max/decode_target_get_info.cc
+++ b/src/starboard/raspi/shared/open_max/decode_target_get_info.cc
@@ -13,18 +13,18 @@
 // limitations under the License.
 
 #include "starboard/common/log.h"
+#include "starboard/common/memory.h"
 #include "starboard/decode_target.h"
-#include "starboard/memory.h"
 #include "starboard/raspi/shared/open_max/decode_target_internal.h"
 
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target,
                            SbDecodeTargetInfo* out_info) {
-  if (!SbMemoryIsZero(out_info, sizeof(*out_info))) {
+  if (!starboard::common::MemoryIsZero(out_info, sizeof(*out_info))) {
     SB_DCHECK(false) << "out_info must be zeroed out.";
     return false;
   }
 
-  SbMemoryCopy(out_info, &decode_target->info, sizeof(*out_info));
+  memcpy(out_info, &decode_target->info, sizeof(*out_info));
 
   return true;
 }
diff --git a/src/starboard/raspi/shared/system_get_extensions.cc b/src/starboard/raspi/shared/system_get_extensions.cc
index 90c7f00..cf9419f 100644
--- a/src/starboard/raspi/shared/system_get_extensions.cc
+++ b/src/starboard/raspi/shared/system_get_extensions.cc
@@ -39,13 +39,13 @@
   }
 #endif
 
-  if (SbStringCompareAll(name, kCobaltExtensionConfigurationName) == 0) {
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
     return starboard::raspi::shared::GetConfigurationApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionGraphicsName) == 0) {
+  if (strcmp(name, kCobaltExtensionGraphicsName) == 0) {
     return starboard::raspi::shared::GetGraphicsApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionCrashHandlerName) == 0) {
+  if (strcmp(name, kCobaltExtensionCrashHandlerName) == 0) {
     return starboard::common::GetCrashHandlerApi();
   }
   return NULL;
diff --git a/src/starboard/raspi/shared/system_get_property.cc b/src/starboard/raspi/shared/system_get_property.cc
index 6847a8a..3cddd0f 100644
--- a/src/starboard/raspi/shared/system_get_property.cc
+++ b/src/starboard/raspi/shared/system_get_property.cc
@@ -114,9 +114,9 @@
 bool CopyStringAndTestIfSuccess(char* out_value,
                                 int value_length,
                                 const char* from_value) {
-  if (SbStringGetLength(from_value) + 1 > value_length)
+  if (strlen(from_value) + 1 > value_length)
     return false;
-  SbStringCopy(out_value, from_value, value_length);
+  starboard::strlcpy(out_value, from_value, value_length);
   return true;
 }
 
diff --git a/src/starboard/sabi/sabi.gypi b/src/starboard/sabi/sabi.gypi
index 7c6174d..cc7a2c2 100644
--- a/src/starboard/sabi/sabi.gypi
+++ b/src/starboard/sabi/sabi.gypi
@@ -74,6 +74,9 @@
 
       'SB_API_VERSION=<(sb_api_version)',
 
+      'SB_SABI_TARGET_ARCH="<(target_arch)"',
+      'SB_SABI_WORD_SIZE="<(word_size)"',
+
       # Inlined Python used to capitalize the variable values.
       'SB_IS_ARCH_<!pymod_do_main(starboard.build.gyp_functions str_upper <(target_arch))=1',
       'SB_HAS_<!pymod_do_main(starboard.build.gyp_functions str_upper <(calling_convention))_CALLING=1',
diff --git a/src/starboard/shared/alsa/alsa_audio_sink_type.cc b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
index bea8991..7d0048d 100644
--- a/src/starboard/shared/alsa/alsa_audio_sink_type.cc
+++ b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
@@ -190,7 +190,7 @@
   SB_DCHECK(frame_buffer_);
   SB_DCHECK(SbAudioSinkIsAudioSampleTypeSupported(sample_type_));
 
-  SbMemorySet(silence_frames_, 0,
+  memset(silence_frames_, 0,
               channels * kFramesPerRequest * GetSampleSize(sample_type));
 
   ScopedLock lock(mutex_);
@@ -384,7 +384,7 @@
       const uint8_t* source_addr = static_cast<uint8_t*>(frame_buffer_);
       source_addr += static_cast<int>(offset_in_frames + source_frames) %
                      frames_per_channel_ * bytes_per_frame;
-      SbMemoryCopy(&resample_buffer_[0] + bytes_per_frame * target_frames,
+      memcpy(&resample_buffer_[0] + bytes_per_frame * target_frames,
                    source_addr, bytes_per_frame);
       ++target_frames;
       source_frames += playback_rate;
diff --git a/src/starboard/shared/blittergles/blitter_internal.cc b/src/starboard/shared/blittergles/blitter_internal.cc
index 6661cbc..9dc7654 100644
--- a/src/starboard/shared/blittergles/blitter_internal.cc
+++ b/src/starboard/shared/blittergles/blitter_internal.cc
@@ -136,9 +136,9 @@
   for (int i = 0; i < height / 2; ++i) {
     uint8_t* current_row = data_bytes + i * pitch_in_bytes;
     uint8_t* flip_row = data_bytes + pitch_in_bytes * (height - 1 - i);
-    SbMemoryCopy(temp_array.get(), current_row, pitch_in_bytes);
-    SbMemoryCopy(current_row, flip_row, pitch_in_bytes);
-    SbMemoryCopy(flip_row, temp_array.get(), pitch_in_bytes);
+    memcpy(temp_array.get(), current_row, pitch_in_bytes);
+    memcpy(current_row, flip_row, pitch_in_bytes);
+    memcpy(flip_row, temp_array.get(), pitch_in_bytes);
   }
 
   if (in_format != out_format && in_format != kSbBlitterPixelDataFormatA8) {
diff --git a/src/starboard/shared/blittergles/shader_program.cc b/src/starboard/shared/blittergles/shader_program.cc
index 1a44e3d..e32d303 100644
--- a/src/starboard/shared/blittergles/shader_program.cc
+++ b/src/starboard/shared/blittergles/shader_program.cc
@@ -44,7 +44,7 @@
                   lower_left_coords.first,  upper_right_coords.second,
                   upper_right_coords.first, lower_left_coords.second,
                   upper_right_coords.first, upper_right_coords.second};
-  SbMemoryCopy(vertex_data, temp, sizeof(float) * 8);
+  memcpy(vertex_data, temp, sizeof(float) * 8);
 }
 
 }  // namespace
@@ -57,7 +57,7 @@
 
 void ShaderProgram::InitializeShader(GLuint shader_handle,
                                      const char* shader_source) {
-  int shader_source_length = SbStringGetLength(shader_source);
+  int shader_source_length = strlen(shader_source);
   int compile_status;
   GL_CALL(
       glShaderSource(shader_handle, 1, &shader_source, &shader_source_length));
diff --git a/src/starboard/shared/directfb/application_directfb.cc b/src/starboard/shared/directfb/application_directfb.cc
index c8c7a83..d99c2a3 100644
--- a/src/starboard/shared/directfb/application_directfb.cc
+++ b/src/starboard/shared/directfb/application_directfb.cc
@@ -453,7 +453,7 @@
       _exit(0);
     } else {
       struct sigaction sigaction_config;
-      SbMemorySet(&sigaction_config, 0, sizeof(sigaction_config));
+      memset(&sigaction_config, 0, sizeof(sigaction_config));
 
       sigaction_config.sa_handler = on_segv;
       sigemptyset(&sigaction_config.sa_mask);
@@ -523,7 +523,7 @@
     SB_DCHECK(event.flags & DIEF_KEYID);
 
     SbInputData* data = new SbInputData();
-    SbMemorySet(data, 0, sizeof(*data));
+    memset(data, 0, sizeof(*data));
     data->timestamp = SbTimeGetMonotonicNow();
     data->window = window_;
     SB_DCHECK(SbWindowIsValid(data->window));
diff --git a/src/starboard/shared/directfb/blitter_download_surface_pixels.cc b/src/starboard/shared/directfb/blitter_download_surface_pixels.cc
index 58f132f..4eb164b 100644
--- a/src/starboard/shared/directfb/blitter_download_surface_pixels.cc
+++ b/src/starboard/shared/directfb/blitter_download_surface_pixels.cc
@@ -74,7 +74,7 @@
       in_data_bytes += in_pitch_in_bytes - width * in_bytes_per_pixel;
       out_data_bytes += out_pitch_in_bytes - width * 4;
     } else {
-      SbMemoryCopy(out_data_bytes, in_data_bytes, width * 4);
+      memcpy(out_data_bytes, in_data_bytes, width * 4);
       in_data_bytes += in_pitch_in_bytes;
       out_data_bytes += out_pitch_in_bytes;
     }
diff --git a/src/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc b/src/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
index 1acf595..f4cb327 100644
--- a/src/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
+++ b/src/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
@@ -159,14 +159,14 @@
         codec_context_->channels * av_frame_->nb_samples *
             starboard::media::GetBytesPerSample(GetSampleType()));
     if (GetStorageType() == kSbMediaAudioFrameStorageTypeInterleaved) {
-      SbMemoryCopy(decoded_audio->buffer(), *av_frame_->extended_data,
+      memcpy(decoded_audio->buffer(), *av_frame_->extended_data,
                    decoded_audio->size());
     } else {
       SB_DCHECK(GetStorageType() == kSbMediaAudioFrameStorageTypePlanar);
       const int per_channel_size_in_bytes =
           decoded_audio->size() / decoded_audio->channels();
       for (int i = 0; i < decoded_audio->channels(); ++i) {
-        SbMemoryCopy(decoded_audio->buffer() + per_channel_size_in_bytes * i,
+        memcpy(decoded_audio->buffer() + per_channel_size_in_bytes * i,
                      av_frame_->extended_data[i], per_channel_size_in_bytes);
       }
     }
@@ -285,10 +285,10 @@
     codec_context_->extradata = static_cast<uint8_t*>(ffmpeg_->av_malloc(
         codec_context_->extradata_size + kAvInputBufferPaddingSize));
     SB_DCHECK(codec_context_->extradata);
-    SbMemoryCopy(codec_context_->extradata,
+    memcpy(codec_context_->extradata,
                  audio_sample_info_.audio_specific_config,
                  codec_context_->extradata_size);
-    SbMemorySet(codec_context_->extradata + codec_context_->extradata_size, 0,
+    memset(codec_context_->extradata + codec_context_->extradata_size, 0,
                 kAvInputBufferPaddingSize);
   }
 
diff --git a/src/starboard/shared/ffmpeg/ffmpeg_dynamic_load_dispatch_impl.cc b/src/starboard/shared/ffmpeg/ffmpeg_dynamic_load_dispatch_impl.cc
index 12bedd9..4f8aec4 100644
--- a/src/starboard/shared/ffmpeg/ffmpeg_dynamic_load_dispatch_impl.cc
+++ b/src/starboard/shared/ffmpeg/ffmpeg_dynamic_load_dispatch_impl.cc
@@ -15,8 +15,6 @@
 // This file implements the FFMPEGDispatch interface with dynamic loading of
 // the libraries.
 
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-
 #include <dlfcn.h>
 
 #include <map>
diff --git a/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.cc b/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.cc
index 44bf310..ee46ce8 100644
--- a/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.cc
+++ b/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.cc
@@ -70,7 +70,7 @@
   frame->opaque = NULL;
 
   // The FFmpeg API expects us to zero the data pointers in this callback.
-  SbMemorySet(frame->data, 0, sizeof(frame->data));
+  memset(frame->data, 0, sizeof(frame->data));
 }
 #endif  // LIBAVUTIL_VERSION_INT >= LIBAVUTIL_VERSION_52_8
 
diff --git a/src/starboard/shared/iso/impl/directory_get_next.h b/src/starboard/shared/iso/impl/directory_get_next.h
index 5954b93..21e6847 100644
--- a/src/starboard/shared/iso/impl/directory_get_next.h
+++ b/src/starboard/shared/iso/impl/directory_get_next.h
@@ -54,7 +54,7 @@
   }
 
 #if SB_API_VERSION >= 12
-  SbStringCopy(out_entry, dirent->d_name, out_entry_size);
+  starboard::strlcpy(out_entry, dirent->d_name, out_entry_size);
 #else   // SB_API_VERSION >= 12
   SbStringCopy(out_entry->name, dirent->d_name,
                SB_ARRAY_SIZE_INT(out_entry->name));
diff --git a/src/starboard/shared/iso/memory_compare.cc b/src/starboard/shared/iso/memory_compare.cc
index 6b6d21c..d05a365 100644
--- a/src/starboard/shared/iso/memory_compare.cc
+++ b/src/starboard/shared/iso/memory_compare.cc
@@ -16,6 +16,8 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
 int SbMemoryCompare(const void* buffer1, const void* buffer2, size_t count) {
   return memcmp(buffer1, buffer2, count);
 }
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/memory_copy.cc b/src/starboard/shared/iso/memory_copy.cc
index 6e62b4e..9cb1f47 100644
--- a/src/starboard/shared/iso/memory_copy.cc
+++ b/src/starboard/shared/iso/memory_copy.cc
@@ -16,6 +16,8 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
 void* SbMemoryCopy(void* destination, const void* source, size_t count) {
   return memcpy(destination, source, count);
 }
+#endif
\ No newline at end of file
diff --git a/src/starboard/shared/iso/memory_find_byte.cc b/src/starboard/shared/iso/memory_find_byte.cc
index 9ff40e3..ee042f0 100644
--- a/src/starboard/shared/iso/memory_find_byte.cc
+++ b/src/starboard/shared/iso/memory_find_byte.cc
@@ -16,6 +16,8 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
 const void* SbMemoryFindByte(const void* buffer, int value, size_t count) {
   return memchr(buffer, value, count);
 }
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/memory_move.cc b/src/starboard/shared/iso/memory_move.cc
index ea47187..76520b3 100644
--- a/src/starboard/shared/iso/memory_move.cc
+++ b/src/starboard/shared/iso/memory_move.cc
@@ -16,6 +16,8 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
 void* SbMemoryMove(void* destination, const void* source, size_t count) {
   return memmove(destination, source, count);
 }
+#endif
diff --git a/src/starboard/shared/iso/memory_set.cc b/src/starboard/shared/iso/memory_set.cc
index ab23f2e..f794350 100644
--- a/src/starboard/shared/iso/memory_set.cc
+++ b/src/starboard/shared/iso/memory_set.cc
@@ -16,6 +16,8 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
 void* SbMemorySet(void* destination, int byte_value, size_t count) {
   return memset(destination, byte_value, count);
 }
+#endif
diff --git a/src/starboard/shared/iso/string_compare.cc b/src/starboard/shared/iso/string_compare.cc
index 4291ab6..6e97b1e 100644
--- a/src/starboard/shared/iso/string_compare.cc
+++ b/src/starboard/shared/iso/string_compare.cc
@@ -16,6 +16,10 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
+
 int SbStringCompare(const char* string1, const char* string2, size_t count) {
   return strncmp(string1, string2, count);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/string_compare_all.cc b/src/starboard/shared/iso/string_compare_all.cc
index c289a99..a358ee2 100644
--- a/src/starboard/shared/iso/string_compare_all.cc
+++ b/src/starboard/shared/iso/string_compare_all.cc
@@ -16,6 +16,10 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
+
 int SbStringCompareAll(const char* string1, const char* string2) {
   return strcmp(string1, string2);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/string_find_character.cc b/src/starboard/shared/iso/string_find_character.cc
index 6783a94..ff196de 100644
--- a/src/starboard/shared/iso/string_find_character.cc
+++ b/src/starboard/shared/iso/string_find_character.cc
@@ -16,6 +16,10 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
+
 const char* SbStringFindCharacter(const char* str, char character) {
   return strchr(str, character);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/string_find_last_character.cc b/src/starboard/shared/iso/string_find_last_character.cc
index 3d25e14..6f0ab3c 100644
--- a/src/starboard/shared/iso/string_find_last_character.cc
+++ b/src/starboard/shared/iso/string_find_last_character.cc
@@ -16,6 +16,10 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
+
 const char* SbStringFindLastCharacter(const char* str, char character) {
   return strrchr(str, character);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/string_find_string.cc b/src/starboard/shared/iso/string_find_string.cc
index 6847d65..01b5df5 100644
--- a/src/starboard/shared/iso/string_find_string.cc
+++ b/src/starboard/shared/iso/string_find_string.cc
@@ -16,6 +16,10 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
+
 const char* SbStringFindString(const char* str1, const char* str2) {
   return strstr(str1, str2);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/string_get_length.cc b/src/starboard/shared/iso/string_get_length.cc
index ac7f454..1b3c6c9 100644
--- a/src/starboard/shared/iso/string_get_length.cc
+++ b/src/starboard/shared/iso/string_get_length.cc
@@ -16,6 +16,10 @@
 
 #include <string.h>
 
+#if SB_API_VERSION < 13
+
 size_t SbStringGetLength(const char* str) {
   return strlen(str);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/iso/string_get_length_wide.cc b/src/starboard/shared/iso/string_get_length_wide.cc
index eeb9046..2e2cd22 100644
--- a/src/starboard/shared/iso/string_get_length_wide.cc
+++ b/src/starboard/shared/iso/string_get_length_wide.cc
@@ -16,6 +16,10 @@
 
 #include <wchar.h>
 
+#if SB_API_VERSION < 13
+
 size_t SbStringGetLengthWide(const wchar_t* str) {
   return wcslen(str);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/libjpeg/image_is_decode_supported.cc b/src/starboard/shared/libjpeg/image_is_decode_supported.cc
index c20288b..db2384f 100644
--- a/src/starboard/shared/libjpeg/image_is_decode_supported.cc
+++ b/src/starboard/shared/libjpeg/image_is_decode_supported.cc
@@ -29,7 +29,7 @@
         format != kSbDecodeTargetFormat1PlaneBGRA) {
       return false;
     }
-    return SbStringCompareAll(mime_type, "image/jpeg") == 0;
+    return strcmp(mime_type, "image/jpeg") == 0;
   } else {
     return false;
   }
diff --git a/src/starboard/shared/linux/dev_input/dev_input.cc b/src/starboard/shared/linux/dev_input/dev_input.cc
index 19155c7..a984377 100644
--- a/src/starboard/shared/linux/dev_input/dev_input.cc
+++ b/src/starboard/shared/linux/dev_input/dev_input.cc
@@ -1050,8 +1050,10 @@
   }
 
   SbInputData* data = new SbInputData();
-  SbMemorySet(data, 0, sizeof(*data));
+  memset(data, 0, sizeof(*data));
+#if SB_API_VERSION < 13
   data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
   data->window = window;
   data->type = type;
   data->device_type = kSbInputDeviceTypeGamepad;
@@ -1070,9 +1072,10 @@
                                         int modifiers,
                                         const SbInputVector& input_vector) {
   SbInputData* data = new SbInputData();
-  SbMemorySet(data, 0, sizeof(*data));
-
+  memset(data, 0, sizeof(*data));
+#if SB_API_VERSION < 13
   data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
   data->window = window;
   data->type = kSbInputEventTypeMove;
   data->device_type = kSbInputDeviceTypeGamepad;
@@ -1097,9 +1100,10 @@
                                      int modifiers,
                                      const SbInputVector& input_vector) {
   SbInputData* data = new SbInputData();
-  SbMemorySet(data, 0, sizeof(*data));
-
+  memset(data, 0, sizeof(*data));
+#if SB_API_VERSION < 13
   data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
   data->window = window;
   data->type = type;
   data->device_type = kSbInputDeviceTypeTouchPad;
@@ -1288,8 +1292,10 @@
   }
 
   SbInputData* data = new SbInputData();
-  SbMemorySet(data, 0, sizeof(*data));
+  memset(data, 0, sizeof(*data));
+#if SB_API_VERSION < 13
   data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
   data->window = window_;
   data->type =
       (event.value == 0 ? kSbInputEventTypeUnpress : kSbInputEventTypePress);
diff --git a/src/starboard/shared/linux/get_home_directory.cc b/src/starboard/shared/linux/get_home_directory.cc
index 796e178..cbfe95d 100644
--- a/src/starboard/shared/linux/get_home_directory.cc
+++ b/src/starboard/shared/linux/get_home_directory.cc
@@ -34,7 +34,7 @@
 
   const char* home_directory = getenv("HOME");
   if (home_directory) {
-    SbStringCopy(out_path, home_directory, path_size);
+    starboard::strlcpy(out_path, home_directory, path_size);
     return true;
   }
 
@@ -51,7 +51,7 @@
     return false;
   }
 
-  SbStringCopy(out_path, passwd.pw_dir, path_size);
+  starboard::strlcpy(out_path, passwd.pw_dir, path_size);
   return true;
 }
 
diff --git a/src/starboard/shared/linux/page_internal.cc b/src/starboard/shared/linux/page_internal.cc
index bd8c444..de2ff6f 100644
--- a/src/starboard/shared/linux/page_internal.cc
+++ b/src/starboard/shared/linux/page_internal.cc
@@ -22,6 +22,7 @@
 
 #include "starboard/atomic.h"
 #include "starboard/common/log.h"
+#include "starboard/common/memory.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/memory.h"
 
@@ -30,8 +31,8 @@
 int32_t s_tracked_page_count = 0;
 
 int32_t GetPageCount(size_t byte_count) {
-  return static_cast<int32_t>(SbMemoryAlignToPageSize(byte_count) /
-                              kSbMemoryPageSize);
+  return static_cast<int32_t>(
+      starboard::common::MemoryAlignToPageSize(byte_count) / kSbMemoryPageSize);
 }
 
 int SbMemoryMapFlagsToMmapProtect(int sb_flags) {
diff --git a/src/starboard/shared/linux/socket_get_interface_address.cc b/src/starboard/shared/linux/socket_get_interface_address.cc
index ddf9821..3ff1c1c 100644
--- a/src/starboard/shared/linux/socket_get_interface_address.cc
+++ b/src/starboard/shared/linux/socket_get_interface_address.cc
@@ -72,7 +72,7 @@
 void CopyIntoObjectFromArray(T* out_destination,
                              const unsigned char(&source)[source_size]) {
   SB_COMPILE_ASSERT(sizeof(T) <= source_size, destination_is_too_small);
-  SbMemoryCopy(out_destination, source, sizeof(T));
+  memcpy(out_destination, source, sizeof(T));
 }
 
 bool GetPotentialMatch(const sockaddr* input_addr,
@@ -128,7 +128,7 @@
     if (!GetPotentialMatch(interface->ifa_addr, &potential_match))
       continue;
 
-    if (SbMemoryCompare(&to_match, potential_match, sizeof(in_addr_type)) !=
+    if (memcmp(&to_match, potential_match, sizeof(in_addr_type)) !=
         0) {
       continue;
     }
@@ -305,9 +305,9 @@
     return false;
   }
 
-  SbMemoryCopy(out_interface_ip, &temp_interface_ip, sizeof(SbSocketAddress));
+  memcpy(out_interface_ip, &temp_interface_ip, sizeof(SbSocketAddress));
   if (out_netmask != NULL) {
-    SbMemoryCopy(out_netmask, &temp_netmask, sizeof(SbSocketAddress));
+    memcpy(out_netmask, &temp_netmask, sizeof(SbSocketAddress));
   }
 
   return true;
diff --git a/src/starboard/shared/linux/system_get_used_cpu_memory.cc b/src/starboard/shared/linux/system_get_used_cpu_memory.cc
index 3a7ad2e..210c390 100644
--- a/src/starboard/shared/linux/system_get_used_cpu_memory.cc
+++ b/src/starboard/shared/linux/system_get_used_cpu_memory.cc
@@ -45,7 +45,7 @@
 // value in bytes (not kilobytes as it is presented in /proc/self/status).
 int64_t SearchForMemoryValue(
     const char* search_key, const char* buffer) {
-  const char* found = SbStringFindString(buffer, search_key);
+  const char* found = strstr(buffer, search_key);
   if (!found) {
     SB_LOG(ERROR) << "Could not find '" << search_key << "' in "
                   << "/proc/self/status.";
diff --git a/src/starboard/shared/linux/thread_set_name.cc b/src/starboard/shared/linux/thread_set_name.cc
index 825379a..ab975fd 100644
--- a/src/starboard/shared/linux/thread_set_name.cc
+++ b/src/starboard/shared/linux/thread_set_name.cc
@@ -32,8 +32,8 @@
 
   char buffer[kSbMaxThreadNameLength];
 
-  if (SbStringGetLength(name) >= SB_ARRAY_SIZE_INT(buffer)) {
-    SbStringCopy(buffer, name, SB_ARRAY_SIZE_INT(buffer));
+  if (strlen(name) >= SB_ARRAY_SIZE_INT(buffer)) {
+    starboard::strlcpy(buffer, name, SB_ARRAY_SIZE_INT(buffer));
     name = buffer;
   }
 
diff --git a/src/starboard/shared/media_session/playback_state.cc b/src/starboard/shared/media_session/playback_state.cc
index ddf6509..47da0d5 100644
--- a/src/starboard/shared/media_session/playback_state.cc
+++ b/src/starboard/shared/media_session/playback_state.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/shared/media_session/playback_state.h"
 
+#include <cstring>
+
 #include "cobalt/extension/media_session.h"
 #include "starboard/common/log.h"
 #include "starboard/string.h"
@@ -53,7 +55,7 @@
         SbSystemGetExtension(kCobaltExtensionMediaSessionName));
   }
   if (g_extension &&
-      SbStringCompareAll(g_extension->name, kCobaltExtensionMediaSessionName) ==
+      strcmp(g_extension->name, kCobaltExtensionMediaSessionName) ==
           0 &&
       g_extension->version >= 1) {
     CobaltExtensionMediaSessionPlaybackState ext_state =
diff --git a/src/starboard/shared/nouser/user_get_property.cc b/src/starboard/shared/nouser/user_get_property.cc
index fa991c1..265a336 100644
--- a/src/starboard/shared/nouser/user_get_property.cc
+++ b/src/starboard/shared/nouser/user_get_property.cc
@@ -27,10 +27,10 @@
 
   switch (property_id) {
     case kSbUserPropertyUserName:
-      return static_cast<int>(SbStringGetLength(user->name) + 1);
+      return static_cast<int>(strlen(user->name) + 1);
 
     case kSbUserPropertyUserId:
-      return static_cast<int>(SbStringGetLength(user->id) + 1);
+      return static_cast<int>(strlen(user->id) + 1);
 
     case kSbUserPropertyHomeDirectory: {
       std::vector<char> path(kSbFileMaxPath);
@@ -39,7 +39,7 @@
                                                        path_size)) {
         return 0;
       }
-      return static_cast<int>(SbStringGetLength(path.data()));
+      return static_cast<int>(strlen(path.data()));
     }
 
     case kSbUserPropertyAvatarUrl:
@@ -63,11 +63,11 @@
                                                          value_size);
 
     case kSbUserPropertyUserName:
-      SbStringCopy(out_value, user->name, value_size);
+      starboard::strlcpy(out_value, user->name, value_size);
       return true;
 
     case kSbUserPropertyUserId:
-      SbStringCopy(out_value, user->id, value_size);
+      starboard::strlcpy(out_value, user->id, value_size);
       return true;
 
     case kSbUserPropertyAvatarUrl:
diff --git a/src/starboard/shared/posix/file_atomic_replace.cc b/src/starboard/shared/posix/file_atomic_replace.cc
index b59e785..b452f84 100644
--- a/src/starboard/shared/posix/file_atomic_replace.cc
+++ b/src/starboard/shared/posix/file_atomic_replace.cc
@@ -38,10 +38,10 @@
   }
 
   const bool file_exists = SbFileExists(path);
-  std::vector<char> temp_path(kSbFileMaxPath);
+  std::vector<char> temp_path(kSbFileMaxPath + 1, 0);
 
-  SbStringCopy(temp_path.data(), path, kSbFileMaxPath);
-  SbStringConcat(temp_path.data(), kTempFileSuffix, kSbFileMaxPath);
+  starboard::strlcpy(temp_path.data(), path, kSbFileMaxPath);
+  starboard::strlcat(temp_path.data(), kTempFileSuffix, kSbFileMaxPath);
 
   if (!::starboard::shared::starboard::SbFileAtomicReplaceWriteFile(
           temp_path.data(), data, data_size)) {
diff --git a/src/starboard/shared/posix/socket_bind.cc b/src/starboard/shared/posix/socket_bind.cc
index ce282fa..fcb5869 100644
--- a/src/starboard/shared/posix/socket_bind.cc
+++ b/src/starboard/shared/posix/socket_bind.cc
@@ -18,7 +18,7 @@
 #include <sys/socket.h>
 
 #include "starboard/common/log.h"
-#include "starboard/memory.h"
+#include "starboard/common/memory.h"
 #include "starboard/shared/posix/handle_eintr.h"
 #include "starboard/shared/posix/socket_internal.h"
 
@@ -51,7 +51,7 @@
   // off to allow incoming IPV4 connections on the same socket.
   // See https://www.ietf.org/rfc/rfc3493.txt for details.
   if (local_address && (local_address->type == kSbSocketAddressTypeIpv6) &&
-      SbMemoryIsZero(local_address->address, 16)) {
+      starboard::common::MemoryIsZero(local_address->address, 16)) {
     if (!sbposix::SetBooleanSocketOption(socket, IPPROTO_IPV6, IPV6_V6ONLY,
                                          "IPV6_V6ONLY", false)) {
       // Silently ignore errors, assume the default behavior is as expected.
diff --git a/src/starboard/shared/posix/socket_internal.cc b/src/starboard/shared/posix/socket_internal.cc
index 967c1b1..1b18007 100644
--- a/src/starboard/shared/posix/socket_internal.cc
+++ b/src/starboard/shared/posix/socket_internal.cc
@@ -117,20 +117,20 @@
     case kSbSocketAddressTypeIpv4: {
       struct sockaddr_in* addr = sockaddr_in();
       length = kAddressStructLengthIpv4;
-      SbMemorySet(addr, 0, length);
+      memset(addr, 0, length);
       addr->sin_family = AF_INET;
       addr->sin_port = htons(address->port);
-      SbMemoryCopy(&addr->sin_addr, address->address, kAddressLengthIpv4);
+      memcpy(&addr->sin_addr, address->address, kAddressLengthIpv4);
       break;
     }
 #if SB_HAS(IPV6)
     case kSbSocketAddressTypeIpv6: {
       struct sockaddr_in6* addr6 = sockaddr_in6();
       length = kAddressStructLengthIpv6;
-      SbMemorySet(addr6, 0, length);
+      memset(addr6, 0, length);
       addr6->sin6_family = AF_INET6;
       addr6->sin6_port = htons(address->port);
-      SbMemoryCopy(&addr6->sin6_addr, address->address, kAddressLengthIpv6);
+      memcpy(&addr6->sin6_addr, address->address, kAddressLengthIpv6);
       break;
     }
 #endif
@@ -162,7 +162,7 @@
       return false;
     }
 
-    SbMemoryCopy(out_address->address, &addr->sin_addr, kAddressLengthIpv4);
+    memcpy(out_address->address, &addr->sin_addr, kAddressLengthIpv4);
     out_address->port = ntohs(addr->sin_port);
     out_address->type = kSbSocketAddressTypeIpv4;
     return true;
@@ -176,7 +176,7 @@
       return false;
     }
 
-    SbMemoryCopy(out_address->address, &addr6->sin6_addr, kAddressLengthIpv6);
+    memcpy(out_address->address, &addr6->sin6_addr, kAddressLengthIpv6);
     out_address->port = ntohs(addr6->sin6_port);
     out_address->type = kSbSocketAddressTypeIpv6;
     return true;
diff --git a/src/starboard/shared/posix/storage_write_record.cc b/src/starboard/shared/posix/storage_write_record.cc
index 99b22bb..2010e27 100644
--- a/src/starboard/shared/posix/storage_write_record.cc
+++ b/src/starboard/shared/posix/storage_write_record.cc
@@ -38,10 +38,11 @@
           record->user, name, original_file_path.data(), kSbFileMaxPath)) {
     return false;
   }
-  std::vector<char> temp_file_path(kSbFileMaxPath);
-  SbStringCopy(temp_file_path.data(), original_file_path.data(),
-               kSbFileMaxPath);
-  SbStringConcat(temp_file_path.data(), kTempFileSuffix, kSbFileMaxPath);
+
+  std::vector<char> temp_file_path(kSbFileMaxPath + 1, 0);
+  starboard::strlcpy(temp_file_path.data(), original_file_path.data(),
+                     kSbFileMaxPath);
+  starboard::strlcat(temp_file_path.data(), kTempFileSuffix, kSbFileMaxPath);
 
   SbFileError error;
   SbFile temp_file = SbFileOpen(
diff --git a/src/starboard/shared/posix/string_compare_wide.cc b/src/starboard/shared/posix/string_compare_wide.cc
index 820871f..f6fb38e 100644
--- a/src/starboard/shared/posix/string_compare_wide.cc
+++ b/src/starboard/shared/posix/string_compare_wide.cc
@@ -16,8 +16,12 @@
 
 #include <wchar.h>
 
+#if SB_API_VERSION < 13
+
 int SbStringCompareWide(const wchar_t* string1,
                         const wchar_t* string2,
                         size_t count) {
   return wcsncmp(string1, string2, count);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/posix/system_get_error_string.cc b/src/starboard/shared/posix/system_get_error_string.cc
index cd29451..ff690c4 100644
--- a/src/starboard/shared/posix/system_get_error_string.cc
+++ b/src/starboard/shared/posix/system_get_error_string.cc
@@ -41,5 +41,5 @@
     return strlen(result);
   }
 
-  return SbStringCopy(out_string, result, string_length);
+  return starboard::strlcpy(out_string, result, string_length);
 }
diff --git a/src/starboard/shared/posix/system_get_locale_id.cc b/src/starboard/shared/posix/system_get_locale_id.cc
index 91283bc..1eac1f2 100644
--- a/src/starboard/shared/posix/system_get_locale_id.cc
+++ b/src/starboard/shared/posix/system_get_locale_id.cc
@@ -21,8 +21,8 @@
 
 namespace {
 bool IsValidId(const char* posix_id) {
-  return !((posix_id == NULL) || (SbStringCompare("C", posix_id, 1) == 0) ||
-           (SbStringCompare("POSIX", posix_id, 5) == 0));
+  return !((posix_id == NULL) || (strncmp("C", posix_id, 1) == 0) ||
+           (strncmp("POSIX", posix_id, 5) == 0));
 }
 }
 
diff --git a/src/starboard/shared/pthread/thread_create.cc b/src/starboard/shared/pthread/thread_create.cc
index 96c53f7..5db5a21 100644
--- a/src/starboard/shared/pthread/thread_create.cc
+++ b/src/starboard/shared/pthread/thread_create.cc
@@ -43,7 +43,7 @@
 struct ThreadParams {
   SbThreadAffinity affinity;
   SbThreadEntryPoint entry_point;
-  char name[128];
+  char name[128] = {};
   void* context;
   SbThreadPriority priority;
 };
@@ -114,7 +114,7 @@
   params->context = context;
 
   if (name) {
-    SbStringCopy(params->name, name, SB_ARRAY_SIZE_INT(params->name));
+    starboard::strlcpy(params->name, name, SB_ARRAY_SIZE_INT(params->name));
   } else {
     params->name[0] = '\0';
   }
diff --git a/src/starboard/shared/starboard/application.cc b/src/starboard/shared/starboard/application.cc
index 765dda7..1500f42 100644
--- a/src/starboard/shared/starboard/application.cc
+++ b/src/starboard/shared/starboard/application.cc
@@ -263,6 +263,7 @@
   scoped_ptr<Event> scoped_event(event);
 
 #if SB_API_VERSION >= 13
+  SbTimeMonotonic timestamp = scoped_event->event->timestamp;
   // Ensure that we go through the the appropriate lifecycle events based on the
   // current state.
   switch (scoped_event->event->type) {
@@ -273,7 +274,7 @@
       break;
     case kSbEventTypeStart:
       if (state() != kStateUnstarted && state() != kStateStarted) {
-        Inject(new Event(kSbEventTypeFocus, NULL, NULL));
+        Inject(new Event(kSbEventTypeFocus, timestamp, NULL, NULL));
         return true;
       }
       break;
@@ -287,10 +288,10 @@
         case kStateStopped:
           return true;
         case kStateFrozen:
-          Inject(new Event(kSbEventTypeUnfreeze, NULL, NULL));
+          Inject(new Event(kSbEventTypeUnfreeze, timestamp, NULL, NULL));
         // The fall-through is intentional.
         case kStateConcealed:
-          Inject(new Event(kSbEventTypeReveal, NULL, NULL));
+          Inject(new Event(kSbEventTypeReveal, timestamp, NULL, NULL));
           Inject(scoped_event.release());
           return true;
         case kStateBlurred:
@@ -305,7 +306,7 @@
         case kStateUnstarted:
           return true;
         case kStateStarted:
-          Inject(new Event(kSbEventTypeBlur, NULL, NULL));
+          Inject(new Event(kSbEventTypeBlur, timestamp, NULL, NULL));
           Inject(scoped_event.release());
           return true;
         case kStateBlurred:
@@ -322,7 +323,7 @@
           return true;
         case kStateFrozen:
           OnResume();
-          Inject(new Event(kSbEventTypeUnfreeze, NULL, NULL));
+          Inject(new Event(kSbEventTypeUnfreeze, timestamp, NULL, NULL));
           Inject(scoped_event.release());
           return true;
         case kStateConcealed:
@@ -338,10 +339,10 @@
         case kStateUnstarted:
           return true;
         case kStateStarted:
-          Inject(new Event(kSbEventTypeBlur, NULL, NULL));
+          Inject(new Event(kSbEventTypeBlur, timestamp, NULL, NULL));
         // The fall-through is intentional
         case kStateBlurred:
-          Inject(new Event(kSbEventTypeConceal, NULL, NULL));
+          Inject(new Event(kSbEventTypeConceal, timestamp, NULL, NULL));
           Inject(scoped_event.release());
           return true;
         case kStateConcealed:
@@ -370,13 +371,13 @@
         case kStateUnstarted:
           return true;
         case kStateStarted:
-          Inject(new Event(kSbEventTypeBlur, NULL, NULL));
+          Inject(new Event(kSbEventTypeBlur, timestamp, NULL, NULL));
         // The fall-through is intentional.
         case kStateBlurred:
-          Inject(new Event(kSbEventTypeConceal, NULL, NULL));
+          Inject(new Event(kSbEventTypeConceal, timestamp, NULL, NULL));
         // The fall-through is intentional.
         case kStateConcealed:
-          Inject(new Event(kSbEventTypeFreeze, NULL, NULL));
+          Inject(new Event(kSbEventTypeFreeze, timestamp, NULL, NULL));
           Inject(scoped_event.release());
           return true;
         case kStateFrozen:
@@ -572,7 +573,7 @@
 Application::Event* Application::CreateInitialEvent(SbEventType type) {
   SB_DCHECK(type == kSbEventTypePreload || type == kSbEventTypeStart);
   SbEventStartData* start_data = new SbEventStartData();
-  SbMemorySet(start_data, 0, sizeof(SbEventStartData));
+  memset(start_data, 0, sizeof(SbEventStartData));
   const CommandLine::StringVector& args = command_line_->argv();
   start_data->argument_count = static_cast<int>(args.size());
   // Cobalt web_platform_tests expect an extra argv[argc] set to NULL.
diff --git a/src/starboard/shared/starboard/application.h b/src/starboard/shared/starboard/application.h
index 534ee37..4e332b4 100644
--- a/src/starboard/shared/starboard/application.h
+++ b/src/starboard/shared/starboard/application.h
@@ -144,6 +144,31 @@
   // deleting the event and calling the destructor on its data when it is
   // deleted.
   struct Event {
+#if SB_API_VERSION >= 13
+     Event(SbEventType type, SbTimeMonotonic timestamp,
+           void* data, SbEventDataDestructor destructor)
+        : event(new SbEvent()), destructor(destructor), error_level(0) {
+      event->type = type;
+      event->timestamp = timestamp;
+      event->data = data;
+    }
+
+    Event(SbEventType type, void* data, SbEventDataDestructor destructor)
+        : event(new SbEvent()), destructor(destructor), error_level(0) {
+      event->type = type;
+      event->timestamp = SbTimeGetMonotonicNow();
+      event->data = data;
+    }
+
+    explicit Event(TimedEvent* data)
+        : event(new SbEvent()),
+          destructor(&DeleteDestructor<TimedEvent>),
+          error_level(0) {
+      event->type = kSbEventTypeScheduled;
+      event->timestamp = SbTimeGetMonotonicNow();
+      event->data = data;
+    }
+#else  // SB_API_VERSION >= 13
     Event(SbEventType type, void* data, SbEventDataDestructor destructor)
         : event(new SbEvent()), destructor(destructor), error_level(0) {
       event->type = type;
@@ -156,6 +181,7 @@
       event->type = kSbEventTypeScheduled;
       event->data = data;
     }
+#endif  // SB_API_VERSION >= 13
     ~Event() {
       if (destructor) {
         destructor(event->data);
diff --git a/src/starboard/shared/starboard/crash_handler.cc b/src/starboard/shared/starboard/crash_handler.cc
index c866384..572a022 100644
--- a/src/starboard/shared/starboard/crash_handler.cc
+++ b/src/starboard/shared/starboard/crash_handler.cc
@@ -26,8 +26,8 @@
 
 bool OverrideCrashpadAnnotations(CrashpadAnnotations* crashpad_annotations) {
   CrashpadAnnotations annotations;
-  SbMemorySet(&annotations, 0, sizeof(CrashpadAnnotations));
-  SbMemoryCopy(&annotations, crashpad_annotations, sizeof(CrashpadAnnotations));
+  memset(&annotations, 0, sizeof(CrashpadAnnotations));
+  memcpy(&annotations, crashpad_annotations, sizeof(CrashpadAnnotations));
   return third_party::crashpad::wrapper::AddAnnotationsToCrashpad(annotations);
 }
 
diff --git a/src/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc b/src/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc
index 900678a..11e0b71 100644
--- a/src/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc
+++ b/src/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc
@@ -40,7 +40,7 @@
     int initialization_vector_size,
     const void* key,
     int key_size) {
-  if (SbStringCompareAll(algorithm, kSbCryptographyAlgorithmAes) != 0) {
+  if (strcmp(algorithm, kSbCryptographyAlgorithmAes) != 0) {
     SB_DLOG(WARNING) << "Unsupported algorithm: " << algorithm;
     return kSbCryptographyInvalidTransformer;
   }
@@ -106,12 +106,12 @@
 
   SbCryptographyTransformer transformer =
       new SbCryptographyTransformerPrivate();
-  SbMemorySet(transformer, 0, sizeof(transformer));
+  memset(transformer, 0, sizeof(transformer));
   transformer->key = aeskey;
   transformer->algorithm = combined_algorithm;
   transformer->direction = direction;
   if (initialization_vector_size) {
-    SbMemoryCopy(transformer->ivec, initialization_vector,
+    memcpy(transformer->ivec, initialization_vector,
                  initialization_vector_size);
   }
 
diff --git a/src/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc b/src/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc
index f700be9..42de9ba 100644
--- a/src/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc
+++ b/src/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc
@@ -36,7 +36,7 @@
     AES_gcm128_setiv(&transformer->gcm_context, &transformer->key,
                      initialization_vector, initialization_vector_size);
   } else {
-    SbMemoryCopy(transformer->ivec, initialization_vector,
+    memcpy(transformer->ivec, initialization_vector,
                  std::min(initialization_vector_size,
                           static_cast<int>(sizeof(transformer->ivec))));
   }
diff --git a/src/starboard/shared/starboard/cryptography/software_aes.cc b/src/starboard/shared/starboard/cryptography/software_aes.cc
index 8678850..c901791 100644
--- a/src/starboard/shared/starboard/cryptography/software_aes.cc
+++ b/src/starboard/shared/starboard/cryptography/software_aes.cc
@@ -82,13 +82,13 @@
 namespace {
 inline uint32_t GETU32(const void* in) {
   uint32_t value;
-  SbMemoryCopy(&value, in, sizeof(value));
+  memcpy(&value, in, sizeof(value));
   return SbByteSwapU32(value);
 }
 
 inline void PUTU32(void* out, uint32_t value) {
   value = SbByteSwapU32(value);
-  SbMemoryCopy(out, &value, sizeof(value));
+  memcpy(out, &value, sizeof(value));
 }
 
 inline uint32_t GETU32_aligned(const void* in) {
@@ -730,7 +730,7 @@
     in += 16;
     out += 16;
   }
-  SbMemoryCopy(ivec, iv, 16);
+  memcpy(ivec, iv, 16);
 }
 
 void CRYPTO_cbc128_decrypt(const void* in_pointer,
@@ -766,7 +766,7 @@
         out += 16;
       }
     }
-    SbMemoryCopy(ivec, iv, 16);
+    memcpy(ivec, iv, 16);
   } else {
     if (16 % sizeof(size_t) == 0) { /* always true */
       while (len >= 16) {
@@ -1283,13 +1283,13 @@
     uint8_t c[16];
   } H;
 
-  SbMemoryCopy(H.c, gcm_key, 16);
+  memcpy(H.c, gcm_key, 16);
 
   /* H is stored in host byte order */
   H.u[0] = SbByteSwapU64(H.u[0]);
   H.u[1] = SbByteSwapU64(H.u[1]);
 
-  SbMemoryCopy(out_key, H.c, 16);
+  memcpy(out_key, H.c, 16);
 
   gcm_init_4bit(out_table, H.u);
   *out_mult = gcm_gmult_4bit;
@@ -1297,11 +1297,11 @@
 }
 
 void AES_gcm128_init(GCM128_CONTEXT* ctx, const AES_KEY* aes_key, int enc) {
-  SbMemorySet(ctx, 0, sizeof(*ctx));
+  memset(ctx, 0, sizeof(*ctx));
   ctx->block = AES_encrypt;
 
   uint8_t gcm_key[16];
-  SbMemorySet(gcm_key, 0, sizeof(gcm_key));
+  memset(gcm_key, 0, sizeof(gcm_key));
   (*ctx->block)(gcm_key, gcm_key, aes_key);
 
   int is_avx;
@@ -1326,7 +1326,7 @@
   ctx->mres = 0;
 
   if (len == 12) {
-    SbMemoryCopy(ctx->Yi.c, iv, 12);
+    memcpy(ctx->Yi.c, iv, 12);
     ctx->Yi.c[15] = 1;
     ctr = 1;
   } else {
@@ -1574,7 +1574,7 @@
   ctx->Xi.u[0] ^= ctx->EK0.u[0];
   ctx->Xi.u[1] ^= ctx->EK0.u[1];
 
-  SbMemoryCopy(tag, ctx->Xi.c,
+  memcpy(tag, ctx->Xi.c,
                len <= sizeof(ctx->Xi.c) ? len : sizeof(ctx->Xi.c));
 }
 
diff --git a/src/starboard/shared/starboard/file_mode_string_to_flags.cc b/src/starboard/shared/starboard/file_mode_string_to_flags.cc
index fcb7f63..b69d974 100644
--- a/src/starboard/shared/starboard/file_mode_string_to_flags.cc
+++ b/src/starboard/shared/starboard/file_mode_string_to_flags.cc
@@ -33,7 +33,7 @@
     return 0;
   }
 
-  int length = static_cast<int>(SbStringGetLength(mode));
+  int length = static_cast<int>(strlen(mode));
   if (length < 1) {
     return 0;
   }
diff --git a/src/starboard/shared/starboard/file_storage/storage_internal.h b/src/starboard/shared/starboard/file_storage/storage_internal.h
index f7bfaaa..7ea949f 100644
--- a/src/starboard/shared/starboard/file_storage/storage_internal.h
+++ b/src/starboard/shared/starboard/file_storage/storage_internal.h
@@ -53,24 +53,24 @@
     return false;
   }
 
-  const size_t n = name ? SbStringGetLength(name) : 0;
-  SbStringConcat(out_path, "/.starboard", path_size);
+  const size_t n = name ? strlen(name) : 0;
+  ::starboard::strlcat(out_path, "/.starboard", path_size);
   if (n > 0) {
-    SbStringConcat(out_path, ".", path_size);
+    ::starboard::strlcat(out_path, ".", path_size);
 #if SB_HAS_QUIRK(HASH_FILE_NAME)
-    size_t n = SbStringGetLength(name);
+    size_t n = strlen(name);
     // Two 32 bit hashes will create a 64 bit hash with extremely low
     // probability of collisions. The seed term was chosen arbitrary.
     uint32_t hash1 = MurmurHash2_32(name, n, 0x8df88a67);
     uint32_t hash2 = MurmurHash2_32(name, n, 0x5bdac960);
     std::stringstream name_stringstream;
     name_stringstream << std::hex << hash1 << hash2;
-    SbStringConcat(out_path, name_stringstream.str().c_str(), path_size);
+    ::starboard::strlcat(out_path, name_stringstream.str().c_str(), path_size);
 #else
-    SbStringConcat(out_path, name, path_size);
+    ::starboard::strlcat(out_path, name, path_size);
 #endif
   }
-  SbStringConcat(out_path, ".storage", path_size);
+  ::starboard::strlcat(out_path, ".storage", path_size);
   return true;
 }
 }  // namespace starboard
diff --git a/src/starboard/shared/starboard/lcat.h b/src/starboard/shared/starboard/lcat.h
index cb0eae5..71a8722 100644
--- a/src/starboard/shared/starboard/lcat.h
+++ b/src/starboard/shared/starboard/lcat.h
@@ -22,6 +22,8 @@
 #include "starboard/shared/starboard/lcpy.h"
 #include "starboard/types.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace shared {
 namespace starboard {
@@ -41,4 +43,6 @@
 }  // namespace shared
 }  // namespace starboard
 
+#endif  // SB_API_VERSION < 13
+
 #endif  // STARBOARD_SHARED_STARBOARD_LCAT_H_
diff --git a/src/starboard/shared/starboard/lcpy.h b/src/starboard/shared/starboard/lcpy.h
index 8f09284..fbfe3d8 100644
--- a/src/starboard/shared/starboard/lcpy.h
+++ b/src/starboard/shared/starboard/lcpy.h
@@ -21,6 +21,8 @@
 #include "starboard/shared/internal_only.h"
 #include "starboard/types.h"
 
+#if SB_API_VERSION < 13
+
 namespace starboard {
 namespace shared {
 namespace starboard {
@@ -46,4 +48,6 @@
 }  // namespace shared
 }  // namespace starboard
 
+#endif  // SB_API_VERSION < 13
+
 #endif  // STARBOARD_SHARED_STARBOARD_LCPY_H_
diff --git a/src/starboard/shared/starboard/link_receiver.cc b/src/starboard/shared/starboard/link_receiver.cc
index a7e8208..befd32c 100644
--- a/src/starboard/shared/starboard/link_receiver.cc
+++ b/src/starboard/shared/starboard/link_receiver.cc
@@ -295,7 +295,7 @@
   char port_string[32] = {0};
   SbStringFormatF(port_string, SB_ARRAY_SIZE(port_string), "%d", actual_port_);
   CreateTemporaryFile("link_receiver_port", port_string,
-                      SbStringGetLength(port_string));
+                      strlen(port_string));
 
   if (!AddForAccept(listen_socket_.get())) {
     quit_.store(true);
diff --git a/src/starboard/shared/starboard/media/avc_util.cc b/src/starboard/shared/starboard/media/avc_util.cc
index 15b5ba9..aaa677e 100644
--- a/src/starboard/shared/starboard/media/avc_util.cc
+++ b/src/starboard/shared/starboard/media/avc_util.cc
@@ -38,7 +38,7 @@
   if (annex_b_data_size < sizeof(kAnnexBHeader)) {
     return false;
   }
-  return SbMemoryCompare(annex_b_data, kAnnexBHeader, sizeof(kAnnexBHeader)) ==
+  return memcmp(annex_b_data, kAnnexBHeader, sizeof(kAnnexBHeader)) ==
          0;
 }
 
@@ -203,7 +203,7 @@
     avcc_destination[1] = static_cast<uint8_t>((payload_size & 0xff0000) >> 16);
     avcc_destination[2] = static_cast<uint8_t>((payload_size & 0xff00) >> 8);
     avcc_destination[3] = static_cast<uint8_t>(payload_size & 0xff);
-    SbMemoryCopy(avcc_destination + kAvccLengthInBytes,
+    memcpy(avcc_destination + kAvccLengthInBytes,
                  last_source + kAnnexBHeaderSizeInBytes, payload_size);
     avcc_destination += annex_b_source - last_source;
     last_source = annex_b_source;
diff --git a/src/starboard/shared/starboard/media/codec_util.cc b/src/starboard/shared/starboard/media/codec_util.cc
index a1dc1b4..a6b090b 100644
--- a/src/starboard/shared/starboard/media/codec_util.cc
+++ b/src/starboard/shared/starboard/media/codec_util.cc
@@ -112,8 +112,8 @@
 // "av01.0.05?.08", but "vp09.0.05M.08" or "vp09.0.05M.08." don't.
 // The function returns true when |format| matches |reference|.
 bool VerifyFormat(const char* format, const char* reference) {
-  auto format_size = SbStringGetLength(format);
-  auto reference_size = SbStringGetLength(reference);
+  auto format_size = strlen(format);
+  auto reference_size = strlen(reference);
   if (format_size < reference_size) {
     return false;
   }
@@ -143,7 +143,7 @@
 // It works exactly the same as the above function, except that the size of
 // |format| has to be exactly the same as the size of |reference|.
 bool VerifyFormatStrictly(const char* format, const char* reference) {
-  if (SbStringGetLength(format) != SbStringGetLength(reference)) {
+  if (strlen(format) != strlen(reference)) {
     return false;
   }
   return VerifyFormat(format, reference);
@@ -172,11 +172,11 @@
   // expected sizes are known.
   const char kShortFormReference[] = "av01.0.05M.08";
   const char kLongFormReference[] = "av01.0.04M.10.0.110.09.16.09.0";
-  const size_t kShortFormSize = SbStringGetLength(kShortFormReference);
-  const size_t kLongFormSize = SbStringGetLength(kLongFormReference);
+  const size_t kShortFormSize = strlen(kShortFormReference);
+  const size_t kLongFormSize = strlen(kLongFormReference);
 
   // 1. Sanity check the format.
-  if (SbStringCompare(codec.c_str(), "av01.", 5) != 0) {
+  if (strncmp(codec.c_str(), "av01.", 5) != 0) {
     return false;
   }
   if (VerifyFormat(codec.c_str(), kLongFormReference)) {
@@ -236,7 +236,7 @@
 
   // 8. Parse chroma subsampling, which we only support 110.
   // Note that this value is not returned.
-  if (SbStringCompare(codec.c_str() + 16, "110", 3) != 0) {
+  if (strncmp(codec.c_str() + 16, "110", 3) != 0) {
     return false;
   }
 
@@ -285,12 +285,12 @@
 // spec but this function only parses "avc1" and "avc3".  This function returns
 // false when |codec| doesn't contain a valid codec string.
 bool ParseH264Info(const char* codec, int* profile, int* level) {
-  if (SbStringCompare(codec, "avc1.", 5) != 0 &&
-      SbStringCompare(codec, "avc3.", 5) != 0) {
+  if (strncmp(codec, "avc1.", 5) != 0 &&
+      strncmp(codec, "avc3.", 5) != 0) {
     return false;
   }
 
-  if (SbStringGetLength(codec) != 11 || !isxdigit(codec[9]) ||
+  if (strlen(codec) != 11 || !isxdigit(codec[9]) ||
       !isxdigit(codec[10])) {
     return false;
   }
@@ -313,8 +313,8 @@
 // Please see the comment in the code for interactions between the various
 // parts.
 bool ParseH265Info(const char* codec, int* profile, int* level) {
-  if (SbStringCompare(codec, "hev1.", 5) != 0 &&
-      SbStringCompare(codec, "hvc1.", 5) != 0) {
+  if (strncmp(codec, "hev1.", 5) != 0 &&
+      strncmp(codec, "hvc1.", 5) != 0) {
     return false;
   }
 
@@ -325,7 +325,7 @@
     ++codec;
   }
 
-  if (SbStringGetLength(codec) < 3) {
+  if (strlen(codec) < 3) {
     return false;
   }
 
@@ -346,7 +346,7 @@
   }
 
   // Read profile compatibility, up to 32 bits hex.
-  const char* dot = SbStringFindCharacter(codec, '.');
+  const char* dot = strchr(codec, '.');
   if (dot == NULL || dot - codec == 0 || dot - codec > 8) {
     return false;
   }
@@ -387,7 +387,7 @@
   ++codec;
 
   // Parse level in 2 or 3 digits decimal.
-  if (SbStringGetLength(codec) < 2) {
+  if (strlen(codec) < 2) {
     return false;
   }
   if (!ReadDecimalUntilDot(codec, level)) {
@@ -446,12 +446,12 @@
   const char kShortFormReference[] = "vp09.00.41.08";
   const char kMediumFormReference[] = "vp09.02.10.10.01.09.16.09";
   const char kLongFormReference[] = "vp09.02.10.10.01.09.16.09.01";
-  const size_t kShortFormSize = SbStringGetLength(kShortFormReference);
-  const size_t kMediumFormSize = SbStringGetLength(kMediumFormReference);
-  const size_t kLongFormSize = SbStringGetLength(kLongFormReference);
+  const size_t kShortFormSize = strlen(kShortFormReference);
+  const size_t kMediumFormSize = strlen(kMediumFormReference);
+  const size_t kLongFormSize = strlen(kLongFormReference);
 
   // 1. Sanity check the format.
-  if (SbStringCompare(codec, "vp09.", 5) != 0) {
+  if (strncmp(codec, "vp09.", 5) != 0) {
     return false;
   }
   if (!VerifyFormatStrictly(codec, kLongFormReference) &&
@@ -492,7 +492,7 @@
   *transfer_id = kSbMediaTransferIdBt709;
   *matrix_id = kSbMediaMatrixIdBt709;
 
-  if (SbStringGetLength(codec) == kShortFormSize) {
+  if (strlen(codec) == kShortFormSize) {
     return true;
   }
 
@@ -531,7 +531,7 @@
   }
 
   // 10. Return now if it is a well-formed medium form codec string.
-  if (SbStringGetLength(codec) == kMediumFormSize) {
+  if (strlen(codec) == kMediumFormSize) {
     return true;
   }
 
@@ -553,19 +553,19 @@
 bool ParseVp9Info(const char* codec, int* profile) {
   SB_DCHECK(profile);
 
-  if (SbStringCompareAll(codec, "vp9") == 0) {
+  if (strcmp(codec, "vp9") == 0) {
     *profile = -1;
     return true;
   }
-  if (SbStringCompareAll(codec, "vp9.0") == 0) {
+  if (strcmp(codec, "vp9.0") == 0) {
     *profile = 0;
     return true;
   }
-  if (SbStringCompareAll(codec, "vp9.1") == 0) {
+  if (strcmp(codec, "vp9.1") == 0) {
     *profile = 1;
     return true;
   }
-  if (SbStringCompareAll(codec, "vp9.2") == 0) {
+  if (strcmp(codec, "vp9.2") == 0) {
     *profile = 2;
     return true;
   }
@@ -621,24 +621,24 @@
 }
 
 SbMediaAudioCodec GetAudioCodecFromString(const char* codec) {
-  if (SbStringCompare(codec, "mp4a.40.", 8) == 0) {
+  if (strncmp(codec, "mp4a.40.", 8) == 0) {
     return kSbMediaAudioCodecAac;
   }
 #if SB_API_VERSION >= 12 || defined(SB_HAS_AC3_AUDIO)
   if (kSbHasAc3Audio) {
-    if (SbStringCompareAll(codec, "ac-3") == 0) {
+    if (strcmp(codec, "ac-3") == 0) {
       return kSbMediaAudioCodecAc3;
     }
-    if (SbStringCompareAll(codec, "ec-3") == 0) {
+    if (strcmp(codec, "ec-3") == 0) {
       return kSbMediaAudioCodecEac3;
     }
   }
 #endif  // SB_API_VERSION >= 12 ||
         // defined(SB_HAS_AC3_AUDIO)
-  if (SbStringCompare(codec, "opus", 4) == 0) {
+  if (strncmp(codec, "opus", 4) == 0) {
     return kSbMediaAudioCodecOpus;
   }
-  if (SbStringCompare(codec, "vorbis", 6) == 0) {
+  if (strncmp(codec, "vorbis", 6) == 0) {
     return kSbMediaAudioCodecVorbis;
   }
   return kSbMediaAudioCodecNone;
@@ -669,31 +669,31 @@
   *transfer_id = kSbMediaTransferIdUnspecified;
   *matrix_id = kSbMediaMatrixIdUnspecified;
 
-  if (SbStringCompare(codec_string, "av01.", 5) == 0) {
+  if (strncmp(codec_string, "av01.", 5) == 0) {
     *codec = kSbMediaVideoCodecAv1;
     return ParseAv1Info(codec_string, profile, level, bit_depth, primary_id,
                         transfer_id, matrix_id);
   }
-  if (SbStringCompare(codec_string, "avc1.", 5) == 0 ||
-      SbStringCompare(codec_string, "avc3.", 5) == 0) {
+  if (strncmp(codec_string, "avc1.", 5) == 0 ||
+      strncmp(codec_string, "avc3.", 5) == 0) {
     *codec = kSbMediaVideoCodecH264;
     return ParseH264Info(codec_string, profile, level);
   }
-  if (SbStringCompare(codec_string, "hev1.", 5) == 0 ||
-      SbStringCompare(codec_string, "hvc1.", 5) == 0) {
+  if (strncmp(codec_string, "hev1.", 5) == 0 ||
+      strncmp(codec_string, "hvc1.", 5) == 0) {
     *codec = kSbMediaVideoCodecH265;
     return ParseH265Info(codec_string, profile, level);
   }
-  if (SbStringCompare(codec_string, "vp09.", 5) == 0) {
+  if (strncmp(codec_string, "vp09.", 5) == 0) {
     *codec = kSbMediaVideoCodecVp9;
     return ParseVp09Info(codec_string, profile, level, bit_depth, primary_id,
                          transfer_id, matrix_id);
   }
-  if (SbStringCompare(codec_string, "vp8", 3) == 0) {
+  if (strncmp(codec_string, "vp8", 3) == 0) {
     *codec = kSbMediaVideoCodecVp8;
     return true;
   }
-  if (SbStringCompare(codec_string, "vp9", 3) == 0) {
+  if (strncmp(codec_string, "vp9", 3) == 0) {
     *codec = kSbMediaVideoCodecVp9;
     return ParseVp9Info(codec_string, profile);
   }
diff --git a/src/starboard/shared/starboard/media/media_support_internal.h b/src/starboard/shared/starboard/media/media_support_internal.h
index c450a3c..13f9900 100644
--- a/src/starboard/shared/starboard/media/media_support_internal.h
+++ b/src/starboard/shared/starboard/media/media_support_internal.h
@@ -23,6 +23,23 @@
 extern "C" {
 #endif
 
+#if SB_API_VERSION >= 13
+// Indicates whether this platform supports decoding |video_codec| and
+// |audio_codec| along with decrypting using |key_system|. If |video_codec| is
+// |kSbMediaVideoCodecNone| or if |audio_codec| is |kSbMediaAudioCodecNone|,
+// this function should return |true| as long as |key_system| is supported on
+// the platform to decode any supported input formats.
+//
+// |video_codec|: The |SbMediaVideoCodec| being checked for platform
+//   compatibility.
+// |audio_codec|: The |SbMediaAudioCodec| being checked for platform
+//   compatibility.
+// |key_system|: The key system being checked for platform compatibility.
+SB_EXPORT bool SbMediaIsSupported(SbMediaVideoCodec video_codec,
+                                  SbMediaAudioCodec audio_codec,
+                                  const char* key_system);
+#endif  // SB_API_VERSION >= 13
+
 // Indicates whether a given combination of (|frame_width| x |frame_height|)
 // frames at |bitrate| and |fps| is supported on this platform with
 // |video_codec|. If |video_codec| is not supported under any condition, this
diff --git a/src/starboard/shared/starboard/media/media_util.cc b/src/starboard/shared/starboard/media/media_util.cc
index 7372983..ab3db04 100644
--- a/src/starboard/shared/starboard/media/media_util.cc
+++ b/src/starboard/shared/starboard/media/media_util.cc
@@ -47,7 +47,7 @@
   // number of channels, by passing channels to SbMediaAudioIsSupported and /
   // or SbMediaIsSupported.
 
-  if (SbStringGetLength(key_system) != 0) {
+  if (strlen(key_system) != 0) {
     if (!SbMediaIsSupported(kSbMediaVideoCodecNone, audio_codec, key_system)) {
       return false;
     }
@@ -118,7 +118,7 @@
   }
   SB_DCHECK(video_codec != kSbMediaVideoCodecNone);
 
-  if (SbStringGetLength(key_system) != 0) {
+  if (strlen(key_system) != 0) {
     if (!SbMediaIsSupported(video_codec, kSbMediaAudioCodecNone, key_system)) {
       return false;
     }
@@ -207,7 +207,7 @@
 }  // namespace
 
 AudioSampleInfo::AudioSampleInfo() {
-  SbMemorySet(this, 0, sizeof(SbMediaAudioSampleInfo));
+  memset(this, 0, sizeof(SbMediaAudioSampleInfo));
   codec = kSbMediaAudioCodecNone;
 }
 
@@ -220,7 +220,7 @@
   *static_cast<SbMediaAudioSampleInfo*>(this) = that;
   if (audio_specific_config_size > 0) {
     audio_specific_config_storage.resize(audio_specific_config_size);
-    SbMemoryCopy(audio_specific_config_storage.data(), audio_specific_config,
+    memcpy(audio_specific_config_storage.data(), audio_specific_config,
                  audio_specific_config_size);
     audio_specific_config = audio_specific_config_storage.data();
   }
@@ -237,7 +237,7 @@
 }
 
 VideoSampleInfo::VideoSampleInfo() {
-  SbMemorySet(this, 0, sizeof(SbMediaAudioSampleInfo));
+  memset(this, 0, sizeof(SbMediaAudioSampleInfo));
   codec = kSbMediaVideoCodecNone;
 }
 
@@ -344,7 +344,7 @@
   auto codecs = mime_type.GetCodecs();
 
   // Pre-filter for |key_system|.
-  if (SbStringGetLength(key_system) != 0) {
+  if (strlen(key_system) != 0) {
     if (!SbMediaIsSupported(kSbMediaVideoCodecNone, kSbMediaAudioCodecNone,
                             key_system)) {
       return kSbMediaSupportTypeNotSupported;
@@ -411,7 +411,7 @@
   return kSbMediaSupportTypeNotSupported;
 }
 
-std::string GetStringRepresentation(const uint8_t* data, int size) {
+std::string GetStringRepresentation(const uint8_t* data, const int size) {
   std::string result;
 
   for (int i = 0; i < size; ++i) {
@@ -428,20 +428,20 @@
 }
 
 std::string GetMixedRepresentation(const uint8_t* data,
-                                   int size,
-                                   int bytes_per_line) {
+                                   const int size,
+                                   const int bytes_per_line) {
   std::string result;
 
   for (int i = 0; i < size; i += bytes_per_line) {
     if (i + bytes_per_line <= size) {
-      result += ::starboard::HexEncode(data + i, bytes_per_line);
+      result += HexEncode(data + i, bytes_per_line);
       result += " | ";
       result += GetStringRepresentation(data + i, bytes_per_line);
       result += '\n';
     } else {
       int bytes_left = size - i;
-      result += ::starboard::HexEncode(data + i, bytes_left);
-      result += std::string((bytes_per_line - bytes_left) * 3, ' ');
+      result += HexEncode(data + i, bytes_left);
+      result += std::string((bytes_per_line - bytes_left) * 2, ' ');
       result += " | ";
       result += GetStringRepresentation(data + i, bytes_left);
       result += std::string(bytes_per_line - bytes_left, ' ');
@@ -459,9 +459,9 @@
          left.samples_per_second != right.samples_per_second ||
          left.number_of_channels != right.number_of_channels ||
          left.audio_specific_config_size != right.audio_specific_config_size ||
-         SbMemoryCompare(left.audio_specific_config,
-                         right.audio_specific_config,
-                         left.audio_specific_config_size) != 0;
+         memcmp(left.audio_specific_config,
+                right.audio_specific_config,
+                left.audio_specific_config_size) != 0;
 }
 
 }  // namespace media
@@ -471,8 +471,8 @@
 
 bool operator==(const SbMediaColorMetadata& metadata_1,
                 const SbMediaColorMetadata& metadata_2) {
-  return SbMemoryCompare(&metadata_1, &metadata_2,
-                         sizeof(SbMediaColorMetadata)) == 0;
+  return memcmp(&metadata_1, &metadata_2,
+                sizeof(SbMediaColorMetadata)) == 0;
 }
 
 bool operator==(const SbMediaVideoSampleInfo& sample_info_1,
@@ -485,10 +485,10 @@
   }
 
 #if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  if (SbStringCompareAll(sample_info_1.mime, sample_info_2.mime) != 0) {
+  if (strcmp(sample_info_1.mime, sample_info_2.mime) != 0) {
     return false;
   }
-  if (SbStringCompareAll(sample_info_1.max_video_capabilities,
+  if (strcmp(sample_info_1.max_video_capabilities,
                          sample_info_2.max_video_capabilities) != 0) {
     return false;
   }
diff --git a/src/starboard/shared/starboard/media/media_util.h b/src/starboard/shared/starboard/media/media_util.h
index f008037..3f43cd5 100644
--- a/src/starboard/shared/starboard/media/media_util.h
+++ b/src/starboard/shared/starboard/media/media_util.h
@@ -94,10 +94,10 @@
 SbMediaSupportType CanPlayMimeAndKeySystem(const MimeType& mime_type,
                                            const char* key_system);
 
-std::string GetStringRepresentation(const uint8_t* data, int size);
+std::string GetStringRepresentation(const uint8_t* data, const int size);
 std::string GetMixedRepresentation(const uint8_t* data,
-                                   int size,
-                                   int bytes_per_line);
+                                   const int size,
+                                   const int bytes_per_line);
 
 //  When this function returns true, usually indicates that the two sample info
 //  cannot be processed by the same audio decoder.
diff --git a/src/starboard/shared/starboard/microphone/microphone_get_available.cc b/src/starboard/shared/starboard/microphone/microphone_get_available.cc
index 83ff861..1af00f8 100644
--- a/src/starboard/shared/starboard/microphone/microphone_get_available.cc
+++ b/src/starboard/shared/starboard/microphone/microphone_get_available.cc
@@ -25,7 +25,7 @@
 int SbMicrophoneGetAvailable(SbMicrophoneInfo* out_info_array,
                              int info_array_size) {
   if (out_info_array && info_array_size > 0) {
-    SbMemorySet(out_info_array, 0, sizeof(SbMicrophoneInfo) * info_array_size);
+    memset(out_info_array, 0, sizeof(SbMicrophoneInfo) * info_array_size);
   }
   return SbMicrophonePrivate::GetAvailableMicrophones(out_info_array,
                                                       info_array_size);
diff --git a/src/starboard/shared/starboard/net_args.cc b/src/starboard/shared/starboard/net_args.cc
index e4e255b..22ab94f 100644
--- a/src/starboard/shared/starboard/net_args.cc
+++ b/src/starboard/shared/starboard/net_args.cc
@@ -43,7 +43,7 @@
   socket->SetReuseAddress(true);
   SbSocketAddress sock_addr;
   // Ip address will be set to 0.0.0.0 so that it will bind to all sockets.
-  SbMemorySet(&sock_addr, 0, sizeof(SbSocketAddress));
+  memset(&sock_addr, 0, sizeof(SbSocketAddress));
   sock_addr.type = NET_ARGS_IP_VERSION;
   sock_addr.port = NET_ARGS_PORT;
   SbSocketError sock_err = socket->Bind(&sock_addr);
diff --git a/src/starboard/shared/starboard/net_log.cc b/src/starboard/shared/starboard/net_log.cc
index 3affc14..f71427a 100644
--- a/src/starboard/shared/starboard/net_log.cc
+++ b/src/starboard/shared/starboard/net_log.cc
@@ -109,7 +109,7 @@
   socket->SetReuseAddress(true);
   SbSocketAddress sock_addr;
   // Ip address will be set to 0.0.0.0 so that it will bind to all sockets.
-  SbMemorySet(&sock_addr, 0, sizeof(SbSocketAddress));
+  memset(&sock_addr, 0, sizeof(SbSocketAddress));
   sock_addr.type = NET_LOG_IP_VERSION;
   sock_addr.port = NET_LOG_PORT;
   SbSocketError sock_err = socket->Bind(&sock_addr);
@@ -324,7 +324,7 @@
   }
 
   void OnLog(const char* msg) {
-    buffered_socket_writer_.Append(msg, SbStringGetLength(msg));
+    buffered_socket_writer_.Append(msg, strlen(msg));
     writer_thread_sema_.Put();
   }
 
diff --git a/src/starboard/shared/starboard/player/BUILD.gn b/src/starboard/shared/starboard/player/BUILD.gn
index d76c25e..161834f 100644
--- a/src/starboard/shared/starboard/player/BUILD.gn
+++ b/src/starboard/shared/starboard/player/BUILD.gn
@@ -14,38 +14,8 @@
 
 import("//starboard/shared/starboard/player/testdata/sha_files.gni")
 
-static_library("player") {
-  check_includes = false
-  sources = [
-    "//starboard/shared/starboard/player/decoded_audio_internal.cc",
-    "//starboard/shared/starboard/player/decoded_audio_internal.h",
-    "//starboard/shared/starboard/player/input_buffer_internal.cc",
-    "//starboard/shared/starboard/player/input_buffer_internal.h",
-    "//starboard/shared/starboard/player/job_queue.cc",
-    "//starboard/shared/starboard/player/job_queue.h",
-    "//starboard/shared/starboard/player/job_thread.cc",
-    "//starboard/shared/starboard/player/job_thread.h",
-    "//starboard/shared/starboard/player/player_create.cc",
-    "//starboard/shared/starboard/player/player_destroy.cc",
-    "//starboard/shared/starboard/player/player_get_current_frame.cc",
-    "//starboard/shared/starboard/player/player_get_info2.cc",
-    "//starboard/shared/starboard/player/player_get_maximum_number_of_samples_per_write.cc",
-    "//starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc",
-    "//starboard/shared/starboard/player/player_internal.cc",
-    "//starboard/shared/starboard/player/player_internal.h",
-    "//starboard/shared/starboard/player/player_seek2.cc",
-    "//starboard/shared/starboard/player/player_set_bounds.cc",
-    "//starboard/shared/starboard/player/player_set_playback_rate.cc",
-    "//starboard/shared/starboard/player/player_set_volume.cc",
-    "//starboard/shared/starboard/player/player_worker.cc",
-    "//starboard/shared/starboard/player/player_worker.h",
-    "//starboard/shared/starboard/player/player_write_end_of_stream.cc",
-    "//starboard/shared/starboard/player/player_write_sample2.cc",
-  ]
-  configs += [ "//starboard/build/config:starboard_implementation" ]
-}
-
 static_library("video_dmp") {
+  check_includes = false
   sources = [
     "//starboard/shared/starboard/player/file_cache_reader.cc",
     "//starboard/shared/starboard/player/file_cache_reader.h",
diff --git a/src/starboard/shared/starboard/player/buildfiles.gni b/src/starboard/shared/starboard/player/buildfiles.gni
new file mode 100644
index 0000000..7ce4e60
--- /dev/null
+++ b/src/starboard/shared/starboard/player/buildfiles.gni
@@ -0,0 +1,40 @@
+# Copyright 2021 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.
+
+common_player_sources = [
+  "//starboard/shared/starboard/player/decoded_audio_internal.cc",
+  "//starboard/shared/starboard/player/decoded_audio_internal.h",
+  "//starboard/shared/starboard/player/input_buffer_internal.cc",
+  "//starboard/shared/starboard/player/input_buffer_internal.h",
+  "//starboard/shared/starboard/player/job_queue.cc",
+  "//starboard/shared/starboard/player/job_queue.h",
+  "//starboard/shared/starboard/player/job_thread.cc",
+  "//starboard/shared/starboard/player/job_thread.h",
+  "//starboard/shared/starboard/player/player_create.cc",
+  "//starboard/shared/starboard/player/player_destroy.cc",
+  "//starboard/shared/starboard/player/player_get_current_frame.cc",
+  "//starboard/shared/starboard/player/player_get_info2.cc",
+  "//starboard/shared/starboard/player/player_get_maximum_number_of_samples_per_write.cc",
+  "//starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc",
+  "//starboard/shared/starboard/player/player_internal.cc",
+  "//starboard/shared/starboard/player/player_internal.h",
+  "//starboard/shared/starboard/player/player_seek2.cc",
+  "//starboard/shared/starboard/player/player_set_bounds.cc",
+  "//starboard/shared/starboard/player/player_set_playback_rate.cc",
+  "//starboard/shared/starboard/player/player_set_volume.cc",
+  "//starboard/shared/starboard/player/player_worker.cc",
+  "//starboard/shared/starboard/player/player_worker.h",
+  "//starboard/shared/starboard/player/player_write_end_of_stream.cc",
+  "//starboard/shared/starboard/player/player_write_sample2.cc",
+]
diff --git a/src/starboard/shared/starboard/player/decoded_audio_internal.cc b/src/starboard/shared/starboard/player/decoded_audio_internal.cc
index aca60f5..b8d0192 100644
--- a/src/starboard/shared/starboard/player/decoded_audio_internal.cc
+++ b/src/starboard/shared/starboard/player/decoded_audio_internal.cc
@@ -20,6 +20,8 @@
 #include "starboard/memory.h"
 #include "starboard/shared/starboard/media/media_util.h"
 
+#include <cstring>
+
 namespace starboard {
 namespace shared {
 namespace starboard {
@@ -93,14 +95,14 @@
   auto bytes_per_frame = bytes_per_sample * channels();
 
   if (storage_type_ == kSbMediaAudioFrameStorageTypeInterleaved) {
-    SbMemoryMove(buffer(), buffer() + bytes_per_frame * frames_to_remove,
+    memmove(buffer(), buffer() + bytes_per_frame * frames_to_remove,
                  (frames() - frames_to_remove) * bytes_per_frame);
   } else {
     SB_DCHECK(storage_type_ == kSbMediaAudioFrameStorageTypePlanar);
     const uint8_t* source_addr = buffer();
     uint8_t* dest_addr = buffer();
     for (int channel = 0; channel < channels(); ++channel) {
-      SbMemoryMove(dest_addr, source_addr + bytes_per_sample * frames_to_remove,
+      memmove(dest_addr, source_addr + bytes_per_sample * frames_to_remove,
                    (frames() - frames_to_remove) * bytes_per_sample);
       source_addr += frames() * bytes_per_sample;
       dest_addr += (frames() - frames_to_remove) * bytes_per_sample;
@@ -229,7 +231,7 @@
             old_samples + (frame * channels() + channel) * bytes_per_sample;
         uint8_t* new_sample =
             new_samples + (channel * frames() + frame) * bytes_per_sample;
-        SbMemoryCopy(new_sample, old_sample, bytes_per_sample);
+        memcpy(new_sample, old_sample, bytes_per_sample);
       }
     }
   } else if (storage_type_ == kSbMediaAudioFrameStorageTypePlanar &&
@@ -240,7 +242,7 @@
             old_samples + (channel * frames() + frame) * bytes_per_sample;
         uint8_t* new_sample =
             new_samples + (frame * channels() + channel) * bytes_per_sample;
-        SbMemoryCopy(new_sample, old_sample, bytes_per_sample);
+        memcpy(new_sample, old_sample, bytes_per_sample);
       }
     }
   }
diff --git a/src/starboard/shared/starboard/player/file_cache_reader.cc b/src/starboard/shared/starboard/player/file_cache_reader.cc
index e79fc25..4e36b8c 100644
--- a/src/starboard/shared/starboard/player/file_cache_reader.cc
+++ b/src/starboard/shared/starboard/player/file_cache_reader.cc
@@ -66,7 +66,7 @@
   SB_CHECK(file_cache_offset_ <= file_cache_.size());
   bytes_to_read = std::min(
       static_cast<int>(file_cache_.size()) - file_cache_offset_, bytes_to_read);
-  SbMemoryCopy(out_buffer, file_cache_.data() + file_cache_offset_,
+  memcpy(out_buffer, file_cache_.data() + file_cache_offset_,
                bytes_to_read);
   file_cache_offset_ += bytes_to_read;
   return bytes_to_read;
diff --git a/src/starboard/shared/starboard/player/filter/audio_channel_layout_mixer_impl.cc b/src/starboard/shared/starboard/player/filter/audio_channel_layout_mixer_impl.cc
index a052408..6a7bd14 100644
--- a/src/starboard/shared/starboard/player/filter/audio_channel_layout_mixer_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/audio_channel_layout_mixer_impl.cc
@@ -336,17 +336,17 @@
     const uint8_t* src_buffer_ptr = input->buffer();
     uint8_t* dest_buffer_ptr = output->buffer();
     while (frames_left > 0) {
-      SbMemoryCopy(dest_buffer_ptr, src_buffer_ptr, bytes_per_sample);
+      memcpy(dest_buffer_ptr, src_buffer_ptr, bytes_per_sample);
       dest_buffer_ptr += bytes_per_sample;
-      SbMemoryCopy(dest_buffer_ptr, src_buffer_ptr, bytes_per_sample);
+      memcpy(dest_buffer_ptr, src_buffer_ptr, bytes_per_sample);
       dest_buffer_ptr += bytes_per_sample;
       src_buffer_ptr += bytes_per_sample;
       frames_left--;
     }
   } else {
     SB_DCHECK(storage_type_ == kSbMediaAudioFrameStorageTypePlanar);
-    SbMemoryCopy(output->buffer(), input->buffer(), input->size());
-    SbMemoryCopy(output->buffer() + input->size(), input->buffer(),
+    memcpy(output->buffer(), input->buffer(), input->size());
+    memcpy(output->buffer() + input->size(), input->buffer(),
                  input->size());
   }
   return output;
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
index 4a518cc..4368a45 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
@@ -26,6 +26,12 @@
 
 class AudioRenderer {
  public:
+  typedef ::starboard::shared::starboard::player::filter::EndedCB EndedCB;
+  typedef ::starboard::shared::starboard::player::filter::ErrorCB ErrorCB;
+  typedef ::starboard::shared::starboard::player::filter::PrerolledCB
+      PrerolledCB;
+  typedef ::starboard::shared::starboard::player::InputBuffer InputBuffer;
+
   virtual ~AudioRenderer() {}
 
   virtual void Initialize(const ErrorCB& error_cb,
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_internal_impl.cc b/src/starboard/shared/starboard/player/filter/audio_renderer_internal_impl.cc
index 12ce929..5e0536b 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_internal_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_internal_impl.cc
@@ -405,12 +405,12 @@
                           max_cached_frames_;
 
       if (silence_frames_to_write <= max_cached_frames_ - start_offset) {
-        SbMemorySet(frame_buffer_.data() + start_offset * bytes_per_frame_, 0,
+        memset(frame_buffer_.data() + start_offset * bytes_per_frame_, 0,
                     silence_frames_to_write * bytes_per_frame_);
       } else {
-        SbMemorySet(frame_buffer_.data() + start_offset * bytes_per_frame_, 0,
+        memset(frame_buffer_.data() + start_offset * bytes_per_frame_, 0,
                     (max_cached_frames_ - start_offset) * bytes_per_frame_);
-        SbMemorySet(
+        memset(
             frame_buffer_.data(), 0,
             (silence_frames_to_write - max_cached_frames_ + start_offset) *
                 bytes_per_frame_);
@@ -722,7 +722,7 @@
   int frames_appended = 0;
 
   if (frames_to_append > max_cached_frames_ - offset_to_append) {
-    SbMemoryCopy(&frame_buffer_[offset_to_append * bytes_per_frame_],
+    memcpy(&frame_buffer_[offset_to_append * bytes_per_frame_],
                  source_buffer,
                  (max_cached_frames_ - offset_to_append) * bytes_per_frame_);
     source_buffer += (max_cached_frames_ - offset_to_append) * bytes_per_frame_;
@@ -731,7 +731,7 @@
     offset_to_append = 0;
   }
 
-  SbMemoryCopy(&frame_buffer_[offset_to_append * bytes_per_frame_],
+  memcpy(&frame_buffer_[offset_to_append * bytes_per_frame_],
                source_buffer, frames_to_append * bytes_per_frame_);
   frames_appended += frames_to_append;
 
diff --git a/src/starboard/shared/starboard/player/filter/audio_time_stretcher.cc b/src/starboard/shared/starboard/player/filter/audio_time_stretcher.cc
index 7a5c5b4..f451f5b 100644
--- a/src/starboard/shared/starboard/player/filter/audio_time_stretcher.cc
+++ b/src/starboard/shared/starboard/player/filter/audio_time_stretcher.cc
@@ -26,6 +26,8 @@
 #include "starboard/shared/starboard/media/media_util.h"
 #include "starboard/shared/starboard/player/filter/wsola_internal.h"
 
+#include <cstring>
+
 namespace starboard {
 namespace shared {
 namespace starboard {
@@ -155,7 +157,7 @@
       channels_, sample_type_, kSbMediaAudioFrameStorageTypeInterleaved, 0,
       (ola_window_size_ + ola_hop_size_) * bytes_per_frame_);
   // Initialize for overlap-and-add of the first block.
-  SbMemorySet(wsola_output_->buffer(), 0, wsola_output_->size());
+  memset(wsola_output_->buffer(), 0, wsola_output_->size());
 
   // Auxiliary containers.
   optimal_block_ = new DecodedAudio(channels_, sample_type_,
@@ -199,7 +201,7 @@
     // audio_buffer_.frames()+1.
     int seek_frames = std::min(static_cast<int>(muted_partial_frame_),
                                audio_buffer_.frames());
-    SbMemorySet(dest->buffer(), 0, frames_to_render * bytes_per_frame_);
+    memset(dest->buffer(), 0, frames_to_render * bytes_per_frame_);
     audio_buffer_.SeekFrames(seek_frames);
 
     // Determine the partial frame that remains to be skipped for next call. If
@@ -242,7 +244,7 @@
   output_time_ = 0.0;
   search_block_index_ = 0;
   target_block_index_ = 0;
-  SbMemorySet(wsola_output_->buffer(), 0, wsola_output_->size());
+  memset(wsola_output_->buffer(), 0, wsola_output_->size());
   num_complete_frames_ = 0;
 
   // Reset |capacity_| so growth triggered by underflows doesn't penalize seek
@@ -299,7 +301,7 @@
       reinterpret_cast<const float*>(optimal_block_->buffer());
   float* ch_output = reinterpret_cast<float*>(wsola_output_->buffer()) +
                      num_complete_frames_ * sizeof(float);
-  SbMemoryCopy(&ch_output[ola_hop_size_ * channels_],
+  memcpy(&ch_output[ola_hop_size_ * channels_],
                &ch_opt_frame[ola_hop_size_ * channels_],
                sizeof(*ch_opt_frame) * ola_hop_size_ * channels_);
 
@@ -345,12 +347,12 @@
   if (rendered_frames == 0)
     return 0;  // There is nothing to read from |wsola_output_|, return.
 
-  SbMemoryCopy(dest->buffer() + bytes_per_frame_ * dest_offset,
+  memcpy(dest->buffer() + bytes_per_frame_ * dest_offset,
                wsola_output_->buffer(), rendered_frames * bytes_per_frame_);
 
   // Remove the frames which are read.
   int frames_to_move = wsola_output_->frames() - rendered_frames;
-  SbMemoryMove(wsola_output_->buffer(),
+  memmove(wsola_output_->buffer(),
                wsola_output_->buffer() + rendered_frames * bytes_per_frame_,
                frames_to_move * bytes_per_frame_);
   num_complete_frames_ -= rendered_frames;
@@ -432,7 +434,7 @@
     read_offset_frames = 0;
     num_frames_to_read -= num_zero_frames_appended;
     write_offset = num_zero_frames_appended;
-    SbMemorySet(dest->buffer(), 0, num_zero_frames_appended * bytes_per_frame_);
+    memset(dest->buffer(), 0, num_zero_frames_appended * bytes_per_frame_);
   }
   audio_buffer_.PeekFrames(num_frames_to_read, read_offset_frames, write_offset,
                            dest);
diff --git a/src/starboard/shared/starboard/player/filter/cpu_video_frame.cc b/src/starboard/shared/starboard/player/filter/cpu_video_frame.cc
index c3e379b..28e1585 100644
--- a/src/starboard/shared/starboard/player/filter/cpu_video_frame.cc
+++ b/src/starboard/shared/starboard/player/filter/cpu_video_frame.cc
@@ -53,8 +53,8 @@
   // The minimum value of |v| can be 2.112f * (-128) = -271, the maximum value
   // of |v| can be 1.164f * 255 + 2.112f * 127 = 565.  So we need 512 bytes at
   // each side of the clamp buffer.
-  SbMemorySet(s_clamp_table, 0, 512);
-  SbMemorySet(s_clamp_table + 768, 0xff, 512);
+  memset(s_clamp_table, 0, 512);
+  memset(s_clamp_table + 768, 0xff, 512);
 
   uint8_t i = 0;
   while (true) {
@@ -82,7 +82,7 @@
                const uint8_t* source,
                int pixels) {
   if (bit_depth == 8) {
-    SbMemoryCopy(destination, source, pixels);
+    memcpy(destination, source, pixels);
     return;
   }
   SB_DCHECK(bit_depth == 10 || bit_depth == 12);
diff --git a/src/starboard/shared/starboard/player/filter/decoded_audio_queue.cc b/src/starboard/shared/starboard/player/filter/decoded_audio_queue.cc
index 5626bd8..9508cf6 100644
--- a/src/starboard/shared/starboard/player/filter/decoded_audio_queue.cc
+++ b/src/starboard/shared/starboard/player/filter/decoded_audio_queue.cc
@@ -121,14 +121,14 @@
               buffer->channels() * current_buffer_offset;
           float* destination = reinterpret_cast<float*>(dest->buffer()) +
                                dest->channels() * (dest_frame_offset + taken);
-          SbMemoryCopy(destination, source, copied * dest->channels() * 4);
+          memcpy(destination, source, copied * dest->channels() * 4);
         } else {
           const int16_t* source =
               reinterpret_cast<const int16_t*>(buffer->buffer()) +
               buffer->channels() * current_buffer_offset;
           int16_t* destination = reinterpret_cast<int16_t*>(dest->buffer()) +
                                  dest->channels() * (dest_frame_offset + taken);
-          SbMemoryCopy(destination, source, copied * dest->channels() * 2);
+          memcpy(destination, source, copied * dest->channels() * 2);
         }
       }
 
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
index c931500..64f94ab 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
@@ -391,17 +391,16 @@
   }
 }
 
-bool FilterBasedPlayerWorkerHandler::SetBounds(
-    const PlayerWorker::Bounds& bounds) {
+bool FilterBasedPlayerWorkerHandler::SetBounds(const Bounds& bounds) {
   SB_DCHECK(BelongsToCurrentThread());
 
-  if (SbMemoryCompare(&bounds_, &bounds, sizeof(bounds_)) != 0) {
+  if (memcmp(&bounds_, &bounds, sizeof(bounds_)) != 0) {
     // |z_index| is changed quite frequently.  Assign |z_index| first, so we
     // only log when the other members of |bounds| have been changed to avoid
     // spamming the log.
     bounds_.z_index = bounds.z_index;
     bool bounds_changed =
-        SbMemoryCompare(&bounds_, &bounds, sizeof(bounds_)) != 0;
+        memcmp(&bounds_, &bounds, sizeof(bounds_)) != 0;
     SB_LOG_IF(INFO, bounds_changed)
         << "Set bounds to "
         << "x: " << bounds.x << ", y: " << bounds.y
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
index f0082b0..00853a1 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
@@ -71,7 +71,7 @@
   bool SetPause(bool pause) override;
   bool SetPlaybackRate(double playback_rate) override;
   void SetVolume(double volume) override;
-  bool SetBounds(const PlayerWorker::Bounds& bounds) override;
+  bool SetBounds(const Bounds& bounds) override;
   void Stop() override;
 
   void Update();
diff --git a/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.cc b/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.cc
index 9ed7d6d..86f21eb 100644
--- a/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.cc
+++ b/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.cc
@@ -212,8 +212,8 @@
 
     // Step (3) Copy r3_ to r1_ and r4_ to r2_.
     // This wraps the last input frames back to the start of the buffer.
-    SbMemoryCopy(r1_, r3_, frame_size_in_bytes_ * (kKernelSize / 2));
-    SbMemoryCopy(r2_, r4_, frame_size_in_bytes_ * (kKernelSize / 2));
+    memcpy(r1_, r3_, frame_size_in_bytes_ * (kKernelSize / 2));
+    memcpy(r2_, r4_, frame_size_in_bytes_ * (kKernelSize / 2));
 
     // Step (4)
     // Refresh the buffer with more input.
@@ -262,7 +262,7 @@
     scoped_refptr<Buffer> buffer = pending_buffers_.front();
     if (buffer->IsEndOfStream()) {
       // Zero fill the buffer after EOS has reached.
-      SbMemorySet(destination, 0, frame_size_in_bytes_ * frames);
+      memset(destination, 0, frame_size_in_bytes_ * frames);
       return;
     }
     // Copy the data over.
@@ -270,7 +270,7 @@
     int frames_to_copy = std::min(frames_in_buffer - offset_in_frames_, frames);
     const float* source = buffer->GetData();
     source += offset_in_frames_ * channel_count_;
-    SbMemoryCopy(destination, source, frame_size_in_bytes_ * frames_to_copy);
+    memcpy(destination, source, frame_size_in_bytes_ * frames_to_copy);
     offset_in_frames_ += frames_to_copy;
     // Pop the first buffer if all its content has been read.
     if (offset_in_frames_ == frames_in_buffer) {
diff --git a/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.h b/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.h
index 7b28fd5..29974b0 100644
--- a/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.h
+++ b/src/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.h
@@ -70,7 +70,7 @@
     Buffer() {}
     Buffer(const float* data, int frames, int channel_count) : frames_(frames) {
       data_.reset(new float[frames * channel_count]);
-      SbMemoryCopy(data_.get(), data, frames * channel_count * sizeof(float));
+      memcpy(data_.get(), data, frames * channel_count * sizeof(float));
     }
     Buffer(scoped_array<float> data, int frames)
         : data_(data.Pass()), frames_(frames) {}
diff --git a/src/starboard/shared/starboard/player/filter/player_components.h b/src/starboard/shared/starboard/player/filter/player_components.h
index 543ca34..76d9bff 100644
--- a/src/starboard/shared/starboard/player/filter/player_components.h
+++ b/src/starboard/shared/starboard/player/filter/player_components.h
@@ -48,6 +48,13 @@
 // object, so it is safe to cache the returned objects.
 class PlayerComponents {
  public:
+  typedef ::starboard::shared::starboard::player::filter::AudioRenderer
+      AudioRenderer;
+  typedef ::starboard::shared::starboard::player::filter::MediaTimeProvider
+      MediaTimeProvider;
+  typedef ::starboard::shared::starboard::player::filter::VideoRenderer
+      VideoRenderer;
+
   // This class creates PlayerComponents.
   class Factory {
    public:
diff --git a/src/starboard/shared/starboard/player/filter/stub_audio_decoder.cc b/src/starboard/shared/starboard/player/filter/stub_audio_decoder.cc
index d02cd53..3bad2d9 100644
--- a/src/starboard/shared/starboard/player/filter/stub_audio_decoder.cc
+++ b/src/starboard/shared/starboard/player/filter/stub_audio_decoder.cc
@@ -158,7 +158,7 @@
                            output_byte_size));
 
       if (fill_type == kSilence) {
-        SbMemorySet(decoded_audio.get()->buffer(), 0, output_byte_size);
+        memset(decoded_audio.get()->buffer(), 0, output_byte_size);
       } else {
         SB_DCHECK(fill_type == kWave);
         for (int j = 0; j < output_byte_size / sample_size; ++j) {
diff --git a/src/starboard/shared/starboard/player/filter/testing/BUILD.gn b/src/starboard/shared/starboard/player/filter/testing/BUILD.gn
index 0c1e81b..18111f2 100644
--- a/src/starboard/shared/starboard/player/filter/testing/BUILD.gn
+++ b/src/starboard/shared/starboard/player/filter/testing/BUILD.gn
@@ -58,7 +58,6 @@
   testonly = true
 
   sources = [
-    "//starboard/common/benchmark_main.cc",
     "test_util.cc",
     "test_util.h",
   ]
diff --git a/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc b/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc
index be7f363..39fb11d 100644
--- a/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc
@@ -454,7 +454,7 @@
        i < original_audio_sample_info.audio_specific_config_size; ++i) {
     std::vector<uint8_t> config(
         original_audio_sample_info.audio_specific_config_size);
-    SbMemoryCopy(config.data(),
+    memcpy(config.data(),
                  original_audio_sample_info.audio_specific_config,
                  original_audio_sample_info.audio_specific_config_size);
     auto audio_sample_info = original_audio_sample_info;
@@ -478,7 +478,7 @@
   for (uint16_t i = 0;
        i < original_audio_sample_info.audio_specific_config_size; ++i) {
     std::vector<uint8_t> config(i);
-    SbMemoryCopy(config.data(),
+    memcpy(config.data(),
                  original_audio_sample_info.audio_specific_config, i);
     auto audio_sample_info = original_audio_sample_info;
     audio_sample_info.audio_specific_config = config.data();
diff --git a/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc b/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
index d1a05c8..0facea7 100644
--- a/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
@@ -210,7 +210,7 @@
         kDefaultNumberOfChannels, sample_type_, storage_type_, timestamp,
         frames * kDefaultNumberOfChannels *
             media::GetBytesPerSample(sample_type_));
-    SbMemorySet(decoded_audio->buffer(), 0, decoded_audio->size());
+    memset(decoded_audio->buffer(), 0, decoded_audio->size());
     return decoded_audio;
   }
 
diff --git a/src/starboard/shared/starboard/player/filter/testing/file_cache_reader_test.cc b/src/starboard/shared/starboard/player/filter/testing/file_cache_reader_test.cc
index c8ac858..4c668f0 100644
--- a/src/starboard/shared/starboard/player/filter/testing/file_cache_reader_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/file_cache_reader_test.cc
@@ -76,7 +76,7 @@
     ASSERT_EQ(bytes_read, size_to_read);
     // Compare the true content of these files, with the chunked contents of
     // these files to ensure that file I/O is working as expected.
-    int result = SbMemoryCompare(
+    int result = memcmp(
         read_contents.data(), true_contents.data() + true_offset, bytes_read);
     ASSERT_EQ(0, result);
     true_offset += bytes_read;
diff --git a/src/starboard/shared/starboard/player/filter/testing/test_util.cc b/src/starboard/shared/starboard/player/filter/testing/test_util.cc
index f135417..3c71cd3 100644
--- a/src/starboard/shared/starboard/player/filter/testing/test_util.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/test_util.cc
@@ -130,7 +130,7 @@
   for (auto filename :
        (ignore_channels ? supported_filenames_channels_unchecked
                         : supported_filenames_channels_checked)) {
-    if (SbStringFindString(filename, "heaac") != nullptr) {
+    if (strstr(filename, "heaac") != nullptr) {
       continue;
     }
     test_params.push_back(filename);
diff --git a/src/starboard/shared/starboard/player/filter/wsola_internal.cc b/src/starboard/shared/starboard/player/filter/wsola_internal.cc
index 4233f87..a62517c 100644
--- a/src/starboard/shared/starboard/player/filter/wsola_internal.cc
+++ b/src/starboard/shared/starboard/player/filter/wsola_internal.cc
@@ -32,6 +32,8 @@
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/memory.h"
 
+#include <cstring>
+
 // TODO: Detect Neon on ARM platform and enable SIMD.
 #if SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
 #define USE_SIMD 1
@@ -117,7 +119,7 @@
   frame_offset_a += last_index;
   frame_offset_b += last_index;
 #else   // defined(USE_SIMD)
-  SbMemorySet(dot_product, 0, sizeof(*dot_product) * a->channels());
+  memset(dot_product, 0, sizeof(*dot_product) * a->channels());
 #endif  // defined(USE_SIMD)
 
   for (int k = 0; k < a->channels(); ++k) {
@@ -254,7 +256,7 @@
       optimal_index = n;
       best_similarity = similarity[2];
     }
-    SbMemoryMove(similarity, &similarity[1], 2 * sizeof(*similarity));
+    memmove(similarity, &similarity[1], 2 * sizeof(*similarity));
   }
   return optimal_index;
 }
diff --git a/src/starboard/shared/starboard/player/input_buffer_internal.cc b/src/starboard/shared/starboard/player/input_buffer_internal.cc
index f88eda0..7296f00 100644
--- a/src/starboard/shared/starboard/player/input_buffer_internal.cc
+++ b/src/starboard/shared/starboard/player/input_buffer_internal.cc
@@ -15,6 +15,7 @@
 #include "starboard/shared/starboard/player/input_buffer_internal.h"
 
 #include <cctype>
+#include <cstring>
 #include <numeric>
 #include <sstream>
 
diff --git a/src/starboard/shared/starboard/player/job_queue.cc b/src/starboard/shared/starboard/player/job_queue.cc
index 9eec80c..614535e 100644
--- a/src/starboard/shared/starboard/player/job_queue.cc
+++ b/src/starboard/shared/starboard/player/job_queue.cc
@@ -74,10 +74,40 @@
   ResetCurrentThreadJobQueue();
 }
 
-JobQueue::JobToken JobQueue::Schedule(Job job, SbTimeMonotonic delay /*= 0*/) {
+JobQueue::JobToken JobQueue::Schedule(const Job& job,
+                                      SbTimeMonotonic delay /*= 0*/) {
   return Schedule(job, NULL, delay);
 }
 
+JobQueue::JobToken JobQueue::Schedule(Job&& job,
+                                      SbTimeMonotonic delay /*= 0*/) {
+  return Schedule(std::move(job), NULL, delay);
+}
+
+void JobQueue::ScheduleAndWait(const Job& job) {
+  ScheduleAndWait(Job(job));
+}
+
+void JobQueue::ScheduleAndWait(Job&& job) {
+  // TODO: Allow calling from the JobQueue thread.
+  SB_DCHECK(!BelongsToCurrentThread());
+
+  Schedule(std::move(job));
+
+  bool job_finished = false;
+
+  Schedule(std::bind([&]() {
+    ScopedLock lock(mutex_);
+    job_finished = true;
+    condition_.Broadcast();
+  }));
+
+  ScopedLock lock(mutex_);
+  while (!job_finished && !stopped_) {
+    condition_.Wait();
+  }
+}
+
 void JobQueue::RemoveJobByToken(JobToken job_token) {
   SB_DCHECK(BelongsToCurrentThread());
 
@@ -96,12 +126,10 @@
 }
 
 void JobQueue::StopSoon() {
-  {
-    ScopedLock scoped_lock(mutex_);
-    stopped_ = true;
-    time_to_job_record_map_.clear();
-    condition_.Signal();
-  }
+  ScopedLock scoped_lock(mutex_);
+  stopped_ = true;
+  time_to_job_record_map_.clear();
+  condition_.Broadcast();
 }
 
 void JobQueue::RunUntilStopped() {
@@ -137,7 +165,13 @@
   return GetCurrentThreadJobQueue();
 }
 
-JobQueue::JobToken JobQueue::Schedule(Job job,
+JobQueue::JobToken JobQueue::Schedule(const Job& job,
+                                      JobOwner* owner,
+                                      SbTimeMonotonic delay) {
+  return Schedule(Job(job), owner, delay);
+}
+
+JobQueue::JobToken JobQueue::Schedule(Job&& job,
                                       JobOwner* owner,
                                       SbTimeMonotonic delay) {
   SB_DCHECK(job);
@@ -151,7 +185,7 @@
   ++current_job_token_;
 
   JobToken job_token(current_job_token_);
-  JobRecord job_record = {job_token, job, owner};
+  JobRecord job_record = {job_token, std::move(job), owner};
 #if ENABLE_JOB_QUEUE_PROFILING
   if (kProfileStackDepth > 0) {
     job_record.stack_size =
@@ -165,7 +199,7 @@
 
   time_to_job_record_map_.insert(std::make_pair(time_to_run_job, job_record));
   if (is_first_job) {
-    condition_.Signal();
+    condition_.Broadcast();
   }
   return job_token;
 }
diff --git a/src/starboard/shared/starboard/player/job_queue.h b/src/starboard/shared/starboard/player/job_queue.h
index d05f67e..1494872 100644
--- a/src/starboard/shared/starboard/player/job_queue.h
+++ b/src/starboard/shared/starboard/player/job_queue.h
@@ -15,8 +15,11 @@
 #ifndef STARBOARD_SHARED_STARBOARD_PLAYER_JOB_QUEUE_H_
 #define STARBOARD_SHARED_STARBOARD_PLAYER_JOB_QUEUE_H_
 
+// TODO: We need unit tests for JobQueue and JobThread.
+
 #include <functional>
 #include <map>
+#include <utility>
 
 #include "starboard/common/condition_variable.h"
 #include "starboard/common/log.h"
@@ -79,9 +82,12 @@
       return job_queue_->BelongsToCurrentThread();
     }
 
-    JobToken Schedule(Job job, SbTimeMonotonic delay = 0) {
+    JobToken Schedule(const Job& job, SbTimeMonotonic delay = 0) {
       return job_queue_->Schedule(job, this, delay);
     }
+    JobToken Schedule(Job&& job, SbTimeMonotonic delay = 0) {
+      return job_queue_->Schedule(std::move(job), this, delay);
+    }
 
     void RemoveJobByToken(JobToken job_token) {
       return job_queue_->RemoveJobByToken(job_token);
@@ -111,7 +117,10 @@
   JobQueue();
   ~JobQueue();
 
-  JobToken Schedule(Job job, SbTimeMonotonic delay = 0);
+  JobToken Schedule(const Job& job, SbTimeMonotonic delay = 0);
+  JobToken Schedule(Job&& job, SbTimeMonotonic delay = 0);
+  void ScheduleAndWait(const Job& job);
+  void ScheduleAndWait(Job&& job);
   void RemoveJobByToken(JobToken job_token);
 
   // The processing of jobs may not be stopped when this function returns, but
@@ -143,7 +152,8 @@
   };
   typedef std::multimap<SbTimeMonotonic, JobRecord> TimeToJobRecordMap;
 
-  JobToken Schedule(Job job, JobOwner* owner, SbTimeMonotonic delay);
+  JobToken Schedule(const Job& job, JobOwner* owner, SbTimeMonotonic delay);
+  JobToken Schedule(Job&& job, JobOwner* owner, SbTimeMonotonic delay);
   void RemoveJobsByOwner(JobOwner* owner);
   // Return true if a job is run, otherwise return false.  When there is no job
   // ready to run currently and |wait_for_next_job| is true, the function will
diff --git a/src/starboard/shared/starboard/player/job_thread.cc b/src/starboard/shared/starboard/player/job_thread.cc
index 54a6fb7..bf22fcf 100644
--- a/src/starboard/shared/starboard/player/job_thread.cc
+++ b/src/starboard/shared/starboard/player/job_thread.cc
@@ -14,7 +14,7 @@
 
 #include "starboard/shared/starboard/player/job_thread.h"
 
-#include "starboard/common/log.h"
+#include "starboard/common/condition_variable.h"
 
 namespace starboard {
 namespace shared {
diff --git a/src/starboard/shared/starboard/player/job_thread.h b/src/starboard/shared/starboard/player/job_thread.h
index f4a5263..4c9b66f 100644
--- a/src/starboard/shared/starboard/player/job_thread.h
+++ b/src/starboard/shared/starboard/player/job_thread.h
@@ -15,6 +15,9 @@
 #ifndef STARBOARD_SHARED_STARBOARD_PLAYER_JOB_THREAD_H_
 #define STARBOARD_SHARED_STARBOARD_PLAYER_JOB_THREAD_H_
 
+#include <utility>
+
+#include "starboard/common/log.h"
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/shared/internal_only.h"
 #include "starboard/shared/starboard/player/job_queue.h"
@@ -38,6 +41,41 @@
   ~JobThread();
 
   JobQueue* job_queue() { return job_queue_.get(); }
+  const JobQueue* job_queue() const { return job_queue_.get(); }
+
+  bool BelongsToCurrentThread() const {
+    SB_DCHECK(job_queue_);
+
+    return job_queue_->BelongsToCurrentThread();
+  }
+
+  JobQueue::JobToken Schedule(const JobQueue::Job& job,
+                              SbTimeMonotonic delay = 0) {
+    SB_DCHECK(job_queue_);
+
+    return job_queue_->Schedule(job, delay);
+  }
+  JobQueue::JobToken Schedule(JobQueue::Job&& job, SbTimeMonotonic delay = 0) {
+    SB_DCHECK(job_queue_);
+
+    return job_queue_->Schedule(std::move(job), delay);
+  }
+  void ScheduleAndWait(const JobQueue::Job& job) {
+    SB_DCHECK(job_queue_);
+
+    job_queue_->ScheduleAndWait(job);
+  }
+  void ScheduleAndWait(JobQueue::Job&& job) {
+    SB_DCHECK(job_queue_);
+
+    job_queue_->ScheduleAndWait(std::move(job));
+  }
+
+  void RemoveJobByToken(JobQueue::JobToken job_token) {
+    SB_DCHECK(job_queue_);
+
+    return job_queue_->RemoveJobByToken(job_token);
+  }
 
  private:
   static void* ThreadEntryPoint(void* context);
diff --git a/src/starboard/shared/starboard/player/player_worker.cc b/src/starboard/shared/starboard/player/player_worker.cc
index 1a1a557..a17ab85 100644
--- a/src/starboard/shared/starboard/player/player_worker.cc
+++ b/src/starboard/shared/starboard/player/player_worker.cc
@@ -138,8 +138,9 @@
 void PlayerWorker::UpdateMediaInfo(SbTime time,
                                    int dropped_video_frames,
                                    bool is_progressing) {
-  SB_DCHECK(player_state_ == kSbPlayerStatePresenting);
-  update_media_info_cb_(time, dropped_video_frames, ticket_, is_progressing);
+  if (player_state_ == kSbPlayerStatePresenting) {
+    update_media_info_cb_(time, dropped_video_frames, ticket_, is_progressing);
+  }
 }
 
 void PlayerWorker::UpdatePlayerState(SbPlayerState player_state) {
diff --git a/src/starboard/shared/starboard/player/player_worker.h b/src/starboard/shared/starboard/player/player_worker.h
index 4958471..a1565a7 100644
--- a/src/starboard/shared/starboard/player/player_worker.h
+++ b/src/starboard/shared/starboard/player/player_worker.h
@@ -60,6 +60,9 @@
   // All functions of this class will be called from the JobQueue thread.
   class Handler {
    public:
+    typedef PlayerWorker::Bounds Bounds;
+    typedef ::starboard::shared::starboard::player::InputBuffer InputBuffer;
+
     typedef std::function<
         void(SbTime media_time, int dropped_video_frames, bool is_progressing)>
         UpdateMediaInfoCB;
diff --git a/src/starboard/shared/starboard/player/video_dmp_common.h b/src/starboard/shared/starboard/player/video_dmp_common.h
index 24ddc22..8d357e0 100644
--- a/src/starboard/shared/starboard/player/video_dmp_common.h
+++ b/src/starboard/shared/starboard/player/video_dmp_common.h
@@ -79,7 +79,7 @@
     audio_specific_config = stored_audio_specific_config.data();
   }
   void operator=(const SbMediaAudioSampleInfoWithConfig& that) {
-    SbMemoryCopy(this, &that, sizeof(SbMediaAudioSampleInfo));
+    memcpy(this, &that, sizeof(SbMediaAudioSampleInfo));
     stored_audio_specific_config = that.stored_audio_specific_config;
     audio_specific_config = stored_audio_specific_config.data();
   }
@@ -109,7 +109,7 @@
         stored_color_metadata(that.stored_color_metadata) {
   }
   void operator=(const SbMediaVideoSampleInfoWithOptionalColorMetadata& that) {
-    SbMemoryCopy(this, &that, sizeof(SbMediaVideoSampleInfo));
+    memcpy(this, &that, sizeof(SbMediaVideoSampleInfo));
   }
 
   SbMediaColorMetadata stored_color_metadata;
diff --git a/src/starboard/shared/starboard/socket/socket_tracker.h b/src/starboard/shared/starboard/socket/socket_tracker.h
index e5b0915..d5475c4 100644
--- a/src/starboard/shared/starboard/socket/socket_tracker.h
+++ b/src/starboard/shared/starboard/socket/socket_tracker.h
@@ -39,7 +39,7 @@
   }
 
   int bytes_to_compare = left.type == kSbSocketAddressTypeIpv4 ? 4 : 16;
-  int result = SbMemoryCompare(left.address, right.address, bytes_to_compare);
+  int result = memcmp(left.address, right.address, bytes_to_compare);
   if (result < 0) {
     return true;
   }
diff --git a/src/starboard/shared/starboard/string_concat.cc b/src/starboard/shared/starboard/string_concat.cc
index 6e29763..b9879e2 100644
--- a/src/starboard/shared/starboard/string_concat.cc
+++ b/src/starboard/shared/starboard/string_concat.cc
@@ -14,11 +14,12 @@
 
 #include "starboard/common/string.h"
 
-#include "starboard/shared/starboard/lcat.h"
+#if SB_API_VERSION < 13
 
 int SbStringConcat(char* out_destination,
                    const char* source,
                    int destination_size) {
-  return starboard::shared::starboard::lcatT<char>(out_destination, source,
-                                                   destination_size);
+  return starboard::strlcat<char>(out_destination, source, destination_size);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/starboard/string_concat_wide.cc b/src/starboard/shared/starboard/string_concat_wide.cc
index 167a4ec..23a7b11 100644
--- a/src/starboard/shared/starboard/string_concat_wide.cc
+++ b/src/starboard/shared/starboard/string_concat_wide.cc
@@ -14,11 +14,12 @@
 
 #include "starboard/common/string.h"
 
-#include "starboard/shared/starboard/lcat.h"
+#if SB_API_VERSION < 13
 
 int SbStringConcatWide(wchar_t* out_destination,
                        const wchar_t* source,
                        int destination_size) {
-  return starboard::shared::starboard::lcatT<wchar_t>(out_destination, source,
-                                                      destination_size);
+  return starboard::strlcat<wchar_t>(out_destination, source, destination_size);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/starboard/string_copy.cc b/src/starboard/shared/starboard/string_copy.cc
index 4bf8e61..fbdc09e 100644
--- a/src/starboard/shared/starboard/string_copy.cc
+++ b/src/starboard/shared/starboard/string_copy.cc
@@ -14,11 +14,12 @@
 
 #include "starboard/common/string.h"
 
-#include "starboard/shared/starboard/lcpy.h"
+#if SB_API_VERSION < 13
 
 int SbStringCopy(char* out_destination,
                  const char* source,
                  int destination_size) {
-  return starboard::shared::starboard::lcpyT<char>(out_destination, source,
-                                                   destination_size);
+  return starboard::strlcpy<char>(out_destination, source, destination_size);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/starboard/string_copy_wide.cc b/src/starboard/shared/starboard/string_copy_wide.cc
index 5748821..b821b7c 100644
--- a/src/starboard/shared/starboard/string_copy_wide.cc
+++ b/src/starboard/shared/starboard/string_copy_wide.cc
@@ -14,11 +14,12 @@
 
 #include "starboard/common/string.h"
 
-#include "starboard/shared/starboard/lcpy.h"
+#if SB_API_VERSION < 13
 
 int SbStringCopyWide(wchar_t* out_destination,
                      const wchar_t* source,
                      int destination_size) {
-  return starboard::shared::starboard::lcpyT<wchar_t>(out_destination, source,
-                                                      destination_size);
+  return starboard::strlcpy<wchar_t>(out_destination, source, destination_size);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/starboard/string_duplicate.cc b/src/starboard/shared/starboard/string_duplicate.cc
index d23dbd7..16660d9 100644
--- a/src/starboard/shared/starboard/string_duplicate.cc
+++ b/src/starboard/shared/starboard/string_duplicate.cc
@@ -18,11 +18,11 @@
 #include "starboard/memory.h"
 
 char* SbStringDuplicate(const char* source) {
-  size_t length = SbStringGetLength(source);
+  size_t length = strlen(source);
   char* result = static_cast<char*>(SbMemoryAllocate(length + 1));
   SB_DCHECK(length < kSbInt32Max);
   int int_length = static_cast<int>(length + 1);
-  SbStringCopy(result, source, int_length);
+  starboard::strlcpy(result, source, int_length);
 
   return result;
 }
diff --git a/src/starboard/shared/starboard/thread_get_name.cc b/src/starboard/shared/starboard/thread_get_name.cc
index bc7da7e..f9a4ec7 100644
--- a/src/starboard/shared/starboard/thread_get_name.cc
+++ b/src/starboard/shared/starboard/thread_get_name.cc
@@ -18,5 +18,5 @@
 #include "starboard/shared/starboard/thread_name_internal.h"
 
 void SbThreadGetName(char* buffer, int buffer_size) {
-  SbStringCopy(buffer, starboard::shared::GetThreadName(), buffer_size);
+  starboard::strlcpy(buffer, starboard::shared::GetThreadName(), buffer_size);
 }
diff --git a/src/starboard/shared/starboard/thread_local_storage_internal.cc b/src/starboard/shared/starboard/thread_local_storage_internal.cc
index a22a4b3..50711b4 100644
--- a/src/starboard/shared/starboard/thread_local_storage_internal.cc
+++ b/src/starboard/shared/starboard/thread_local_storage_internal.cc
@@ -230,10 +230,10 @@
 
   record->destructor = destructor;
 #if SB_API_VERSION >= 12
-  SbMemorySet(record->values.data(), 0,
+  memset(record->values.data(), 0,
               record->values.size() * sizeof(record->values[0]));
 #else   // SB_API_VERSION >= 12
-  SbMemorySet(record->values, 0, sizeof(record->values));
+  memset(record->values, 0, sizeof(record->values));
 #endif  // SB_API_VERSION >= 12
   record->valid = true;
 
diff --git a/src/starboard/shared/starboard/thread_set_name.cc b/src/starboard/shared/starboard/thread_set_name.cc
index 199b0fc..63d0481 100644
--- a/src/starboard/shared/starboard/thread_set_name.cc
+++ b/src/starboard/shared/starboard/thread_set_name.cc
@@ -18,6 +18,6 @@
 #include "starboard/shared/starboard/thread_name_internal.h"
 
 void SbThreadSetName(const char* name) {
-  SbStringCopy(starboard::shared::GetThreadName(), name,
-               starboard::shared::kMaxThreadName);
+  starboard::strlcpy(starboard::shared::GetThreadName(), name,
+                     starboard::shared::kMaxThreadName);
 }
diff --git a/src/starboard/shared/starboard/window_set_default_options.cc b/src/starboard/shared/starboard/window_set_default_options.cc
index 5931650..3df8a9e 100644
--- a/src/starboard/shared/starboard/window_set_default_options.cc
+++ b/src/starboard/shared/starboard/window_set_default_options.cc
@@ -17,5 +17,5 @@
 #include "starboard/memory.h"
 
 void SbWindowSetDefaultOptions(SbWindowOptions* options) {
-  SbMemorySet(options, 0, sizeof(*options));
+  memset(options, 0, sizeof(*options));
 }
diff --git a/src/starboard/shared/stub/accessibility_get_caption_settings.cc b/src/starboard/shared/stub/accessibility_get_caption_settings.cc
index 382b3ab..ac3be68 100644
--- a/src/starboard/shared/stub/accessibility_get_caption_settings.cc
+++ b/src/starboard/shared/stub/accessibility_get_caption_settings.cc
@@ -15,14 +15,14 @@
 #include "base/compiler_specific.h"
 
 #include "starboard/accessibility.h"
-#include "starboard/memory.h"
+#include "starboard/common/memory.h"
 
 #if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 bool SbAccessibilityGetCaptionSettings(
     SbAccessibilityCaptionSettings* caption_settings) {
   if (!caption_settings ||
-      !SbMemoryIsZero(caption_settings,
-                      sizeof(SbAccessibilityCaptionSettings))) {
+      !starboard::common::MemoryIsZero(
+          caption_settings, sizeof(SbAccessibilityCaptionSettings))) {
     return false;
   }
 
diff --git a/src/starboard/shared/stub/accessibility_get_display_settings.cc b/src/starboard/shared/stub/accessibility_get_display_settings.cc
index a1f5cdd..6e91106 100644
--- a/src/starboard/shared/stub/accessibility_get_display_settings.cc
+++ b/src/starboard/shared/stub/accessibility_get_display_settings.cc
@@ -14,13 +14,13 @@
 
 #include "starboard/accessibility.h"
 
-#include "starboard/memory.h"
+#include "starboard/common/memory.h"
 
 bool SbAccessibilityGetDisplaySettings(
     SbAccessibilityDisplaySettings* out_setting) {
   if (!out_setting ||
-      !SbMemoryIsZero(out_setting,
-                      sizeof(SbAccessibilityDisplaySettings))) {
+      !starboard::common::MemoryIsZero(
+          out_setting, sizeof(SbAccessibilityDisplaySettings))) {
     return false;
   }
   out_setting->has_high_contrast_text_setting = false;
diff --git a/src/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc b/src/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc
index 403e408..5333ad6 100644
--- a/src/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc
+++ b/src/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc
@@ -14,13 +14,13 @@
 
 #include "starboard/accessibility.h"
 
-#include "starboard/memory.h"
+#include "starboard/common/memory.h"
 
 bool SbAccessibilityGetTextToSpeechSettings(
     SbAccessibilityTextToSpeechSettings* out_setting) {
   if (!out_setting ||
-      !SbMemoryIsZero(out_setting,
-                      sizeof(SbAccessibilityTextToSpeechSettings))) {
+      !starboard::common::MemoryIsZero(
+          out_setting, sizeof(SbAccessibilityTextToSpeechSettings))) {
     return false;
   }
   out_setting->has_text_to_speech_setting = false;
diff --git a/src/starboard/shared/stub/media_is_supported.cc b/src/starboard/shared/stub/media_is_supported.cc
index accde4b..fd53e2e 100644
--- a/src/starboard/shared/stub/media_is_supported.cc
+++ b/src/starboard/shared/stub/media_is_supported.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "starboard/shared/starboard/media/media_support_internal.h"
+
 #include "starboard/media.h"
 
 bool SbMediaIsSupported(SbMediaVideoCodec video_codec,
diff --git a/src/starboard/shared/stub/memory_compare.cc b/src/starboard/shared/stub/memory_compare.cc
index 6f8c3a4..e72fa29 100644
--- a/src/starboard/shared/stub/memory_compare.cc
+++ b/src/starboard/shared/stub/memory_compare.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/memory.h"
 
+#if SB_API_VERSION < 13
 int SbMemoryCompare(const void* buffer1, const void* buffer2, size_t count) {
   return 0;
 }
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/memory_copy.cc b/src/starboard/shared/stub/memory_copy.cc
index 2101911..d7294b5 100644
--- a/src/starboard/shared/stub/memory_copy.cc
+++ b/src/starboard/shared/stub/memory_copy.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/memory.h"
 
+#if SB_API_VERSION < 13
 void* SbMemoryCopy(void* destination, const void* source, size_t count) {
   return NULL;
 }
+#endif
\ No newline at end of file
diff --git a/src/starboard/shared/stub/memory_find_byte.cc b/src/starboard/shared/stub/memory_find_byte.cc
index 3587394..9712f9b 100644
--- a/src/starboard/shared/stub/memory_find_byte.cc
+++ b/src/starboard/shared/stub/memory_find_byte.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/memory.h"
 
+#if SB_API_VERSION < 13
 const void* SbMemoryFindByte(const void* buffer, int value, size_t count) {
   return 0;
 }
+#endif // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/memory_move.cc b/src/starboard/shared/stub/memory_move.cc
index 277fc11..ed5ac7d 100644
--- a/src/starboard/shared/stub/memory_move.cc
+++ b/src/starboard/shared/stub/memory_move.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/memory.h"
 
+#if SB_API_VERSION < 13
 void* SbMemoryMove(void* destination, const void* source, size_t count) {
   return NULL;
 }
+#endif
\ No newline at end of file
diff --git a/src/starboard/shared/stub/memory_set.cc b/src/starboard/shared/stub/memory_set.cc
index 7c21bef..c20d07b 100644
--- a/src/starboard/shared/stub/memory_set.cc
+++ b/src/starboard/shared/stub/memory_set.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/memory.h"
 
+#if SB_API_VERSION < 13
 void* SbMemorySet(void* destination, int byte_value, size_t count) {
   return NULL;
 }
+#endif
diff --git a/src/starboard/shared/stub/string_compare.cc b/src/starboard/shared/stub/string_compare.cc
index ac5fcc9..8dd9496 100644
--- a/src/starboard/shared/stub/string_compare.cc
+++ b/src/starboard/shared/stub/string_compare.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 int SbStringCompare(const char* string1, const char* string2, size_t count) {
   return 0;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_compare_all.cc b/src/starboard/shared/stub/string_compare_all.cc
index 3c445c1..3de1a2d 100644
--- a/src/starboard/shared/stub/string_compare_all.cc
+++ b/src/starboard/shared/stub/string_compare_all.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 int SbStringCompareAll(const char* string1, const char* string2) {
   return 0;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_concat.cc b/src/starboard/shared/stub/string_concat.cc
index f9158d0..eb2d540 100644
--- a/src/starboard/shared/stub/string_concat.cc
+++ b/src/starboard/shared/stub/string_concat.cc
@@ -14,8 +14,12 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 int SbStringConcat(char* out_destination,
                    const char* source,
                    int destination_size) {
   return 0;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_concat_wide.cc b/src/starboard/shared/stub/string_concat_wide.cc
index 0ef185a..aa7f1fc 100644
--- a/src/starboard/shared/stub/string_concat_wide.cc
+++ b/src/starboard/shared/stub/string_concat_wide.cc
@@ -14,8 +14,12 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 int SbStringConcatWide(wchar_t* out_destination,
                        const wchar_t* source,
                        int destination_size) {
   return 0;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_copy.cc b/src/starboard/shared/stub/string_copy.cc
index 07f63dc..23fa9af 100644
--- a/src/starboard/shared/stub/string_copy.cc
+++ b/src/starboard/shared/stub/string_copy.cc
@@ -14,8 +14,12 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 int SbStringCopy(char* out_destination,
                  const char* source,
                  int destination_size) {
   return 0;
 }
+
+#endif  // SB_API_VERSION >= 13
diff --git a/src/starboard/shared/stub/string_copy_wide.cc b/src/starboard/shared/stub/string_copy_wide.cc
index 63e92d6..f101c46 100644
--- a/src/starboard/shared/stub/string_copy_wide.cc
+++ b/src/starboard/shared/stub/string_copy_wide.cc
@@ -14,8 +14,12 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 int SbStringCopyWide(wchar_t* out_destination,
                      const wchar_t* source,
                      int destination_size) {
   return 0;
 }
+
+#endif  // SB_API_VERSION >= 13
diff --git a/src/starboard/shared/stub/string_find_character.cc b/src/starboard/shared/stub/string_find_character.cc
index 01c7b6b..3e04d08 100644
--- a/src/starboard/shared/stub/string_find_character.cc
+++ b/src/starboard/shared/stub/string_find_character.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 const char* SbStringFindCharacter(const char* str, char character) {
   return NULL;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_find_last_character.cc b/src/starboard/shared/stub/string_find_last_character.cc
index 5d963aa..906d83f 100644
--- a/src/starboard/shared/stub/string_find_last_character.cc
+++ b/src/starboard/shared/stub/string_find_last_character.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 const char* SbStringFindLastCharacter(const char* str, char character) {
   return NULL;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_find_string.cc b/src/starboard/shared/stub/string_find_string.cc
index 3dd13cc..ef9601e 100644
--- a/src/starboard/shared/stub/string_find_string.cc
+++ b/src/starboard/shared/stub/string_find_string.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 const char* SbStringFindString(const char* str1, const char* str2) {
   return NULL;
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_get_length.cc b/src/starboard/shared/stub/string_get_length.cc
index a1f6b38..263cc78 100644
--- a/src/starboard/shared/stub/string_get_length.cc
+++ b/src/starboard/shared/stub/string_get_length.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 size_t SbStringGetLength(const char* str) {
   return static_cast<size_t>(0);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/stub/string_get_length_wide.cc b/src/starboard/shared/stub/string_get_length_wide.cc
index 4f76f1f..8ee10dd 100644
--- a/src/starboard/shared/stub/string_get_length_wide.cc
+++ b/src/starboard/shared/stub/string_get_length_wide.cc
@@ -14,6 +14,10 @@
 
 #include "starboard/common/string.h"
 
+#if SB_API_VERSION < 13
+
 size_t SbStringGetLengthWide(const wchar_t* str) {
   return static_cast<size_t>(0);
 }
+
+#endif  // SB_API_VERSION < 13
diff --git a/src/starboard/shared/widevine/drm_system_widevine.cc b/src/starboard/shared/widevine/drm_system_widevine.cc
index 9169bc6..03bd477 100644
--- a/src/starboard/shared/widevine/drm_system_widevine.cc
+++ b/src/starboard/shared/widevine/drm_system_widevine.cc
@@ -95,8 +95,8 @@
   auto path_size = path.size();
   SB_CHECK(
       SbSystemGetPath(kSbSystemPathCacheDirectory, path.data(), path_size) &&
-      SbStringConcat(path.data(), kSbFileSepString, path_size) &&
-      SbStringConcat(path.data(), kWidevineStorageFileName, path_size));
+      ::starboard::strlcat(path.data(), kSbFileSepString, path_size) &&
+      ::starboard::strlcat(path.data(), kWidevineStorageFileName, path_size));
   return std::string(path.data());
 }
 
@@ -205,7 +205,7 @@
     void* context,
     SbDrmSessionUpdateRequestFunc session_update_request_callback,
     SbDrmSessionUpdatedFunc session_updated_callback,
-    SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback,
+    SbDrmSessionKeyStatusesChangedFunc session_key_statuses_changed_callback,
     SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
     SbDrmSessionClosedFunc session_closed_callback,
     const std::string& company_name,
@@ -213,7 +213,8 @@
     : context_(context),
       session_update_request_callback_(session_update_request_callback),
       session_updated_callback_(session_updated_callback),
-      key_statuses_changed_callback_(key_statuses_changed_callback),
+      session_key_statuses_changed_callback_(
+          session_key_statuses_changed_callback),
       server_certificate_updated_callback_(server_certificate_updated_callback),
       session_closed_callback_(session_closed_callback),
       ticket_thread_id_(SbThreadGetId()) {
@@ -306,9 +307,9 @@
   const std::string init_str(static_cast<const char*>(initialization_data),
                              initialization_data_size);
   wv3cdm::InitDataType init_type = wv3cdm::kWebM;
-  if (SbStringCompareAll("cenc", type) == 0) {
+  if (strcmp("cenc", type) == 0) {
     init_type = wv3cdm::kCenc;
-  } else if (SbStringCompareAll("webm", type) == 0) {
+  } else if (strcmp("webm", type) == 0) {
     init_type = wv3cdm::kWebM;
   } else {
     SB_NOTREACHED();
@@ -591,7 +592,7 @@
     const char* session_id =
         SbDrmTicketIsValid(ticket) ? NULL : kFirstSbDrmSessionId;
     int session_id_size =
-        session_id ? static_cast<int>(SbStringGetLength(session_id)) : 0;
+        session_id ? static_cast<int>(strlen(session_id)) : 0;
     session_update_request_callback_(
         this, context_, ticket, CdmStatusToSbDrmStatus(status),
         kSbDrmSessionRequestTypeLicenseRequest, "", session_id, session_id_size,
@@ -650,7 +651,7 @@
   for (auto& key_status : key_statuses) {
     SbDrmKeyId sb_key_id;
     SB_DCHECK(key_status.first.size() <= sizeof(sb_key_id.identifier));
-    SbMemoryCopy(sb_key_id.identifier, key_status.first.c_str(),
+    memcpy(sb_key_id.identifier, key_status.first.c_str(),
                  key_status.first.size());
     sb_key_id.identifier_size = static_cast<int>(key_status.first.size());
     sb_key_ids.push_back(sb_key_id);
@@ -659,9 +660,9 @@
 
   const std::string sb_drm_session_id =
       WvdmSessionIdToSbDrmSessionId(wvcdm_session_id);
-  key_statuses_changed_callback_(this, context_, sb_drm_session_id.c_str(),
-                                 sb_drm_session_id.size(), sb_key_ids.size(),
-                                 sb_key_ids.data(), sb_key_statuses.data());
+  session_key_statuses_changed_callback_(
+      this, context_, sb_drm_session_id.c_str(), sb_drm_session_id.size(),
+      sb_key_ids.size(), sb_key_ids.data(), sb_key_statuses.data());
 }
 
 void DrmSystemWidevine::onRemoveComplete(const std::string& wvcdm_session_id) {
diff --git a/src/starboard/shared/widevine/drm_system_widevine.h b/src/starboard/shared/widevine/drm_system_widevine.h
index 29ce8b0..e67ca30 100644
--- a/src/starboard/shared/widevine/drm_system_widevine.h
+++ b/src/starboard/shared/widevine/drm_system_widevine.h
@@ -43,9 +43,9 @@
  public:
   DrmSystemWidevine(
       void* context,
-      SbDrmSessionUpdateRequestFunc update_request_callback,
+      SbDrmSessionUpdateRequestFunc session_update_request_callback,
       SbDrmSessionUpdatedFunc session_updated_callback,
-      SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback,
+      SbDrmSessionKeyStatusesChangedFunc session_key_statuses_changed_callback,
       SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
       SbDrmSessionClosedFunc session_closed_callback,
       const std::string& company_name,
@@ -156,7 +156,8 @@
   void* const context_;
   const SbDrmSessionUpdateRequestFunc session_update_request_callback_;
   const SbDrmSessionUpdatedFunc session_updated_callback_;
-  const SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback_;
+  const SbDrmSessionKeyStatusesChangedFunc
+      session_key_statuses_changed_callback_;
   const SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback_;
   const SbDrmSessionClosedFunc session_closed_callback_;
 
diff --git a/src/starboard/shared/widevine/media_is_supported.cc b/src/starboard/shared/widevine/media_is_supported.cc
index 2c5afbb..413fd22 100644
--- a/src/starboard/shared/widevine/media_is_supported.cc
+++ b/src/starboard/shared/widevine/media_is_supported.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "starboard/shared/starboard/media/media_support_internal.h"
+
 #include "starboard/media.h"
 #include "starboard/shared/widevine/drm_system_widevine.h"
 
diff --git a/src/starboard/shared/x11/application_x11.cc b/src/starboard/shared/x11/application_x11.cc
index c0b5e79..a91bab6 100644
--- a/src/starboard/shared/x11/application_x11.cc
+++ b/src/starboard/shared/x11/application_x11.cc
@@ -1161,8 +1161,10 @@
   }
 
   scoped_ptr<SbInputData> data(new SbInputData());
-  SbMemorySet(data.get(), 0, sizeof(*data));
+  memset(data.get(), 0, sizeof(*data));
+#if SB_API_VERSION < 13
   data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
   data->window = windows_[0];
   SB_DCHECK(SbWindowIsValid(data->window));
   data->type = paste_buffer_key_release_pending_ ? kSbInputEventTypeUnpress
@@ -1241,8 +1243,10 @@
       }
 
       scoped_ptr<SbInputData> data(new SbInputData());
-      SbMemorySet(data.get(), 0, sizeof(*data));
+      memset(data.get(), 0, sizeof(*data));
+#if SB_API_VERSION < 13
       data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
       data->window = FindWindow(x_key_event->window);
       SB_DCHECK(SbWindowIsValid(data->window));
       data->type = x_event->type == KeyPress ? kSbInputEventTypePress
@@ -1267,8 +1271,10 @@
         return NULL;
       }
       scoped_ptr<SbInputData> data(new SbInputData());
-      SbMemorySet(data.get(), 0, sizeof(*data));
+      memset(data.get(), 0, sizeof(*data));
+#if SB_API_VERSION < 13
       data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
       data->window = FindWindow(x_button_event->window);
       SB_DCHECK(SbWindowIsValid(data->window));
       data->key = XButtonEventToSbKey(x_button_event);
@@ -1293,8 +1299,10 @@
     case MotionNotify: {
       XMotionEvent* x_motion_event = reinterpret_cast<XMotionEvent*>(x_event);
       scoped_ptr<SbInputData> data(new SbInputData());
-      SbMemorySet(data.get(), 0, sizeof(*data));
+      memset(data.get(), 0, sizeof(*data));
+#if SB_API_VERSION < 13
       data->timestamp = SbTimeGetMonotonicNow();
+#endif  // SB_API_VERSION < 13
       data->window = FindWindow(x_motion_event->window);
       SB_DCHECK(SbWindowIsValid(data->window));
       data->pressure = NAN;
diff --git a/src/starboard/string.h b/src/starboard/string.h
index b94d199..6cfb581 100644
--- a/src/starboard/string.h
+++ b/src/starboard/string.h
@@ -29,6 +29,8 @@
 extern "C" {
 #endif
 
+#if SB_API_VERSION < 13
+
 // Returns the length, in characters, of |str|.
 //
 // |str|: A zero-terminated ASCII string.
@@ -111,6 +113,8 @@
                                  const wchar_t* source,
                                  int destination_size);
 
+#endif  // SB_API_VERSION < 13
+
 // Copies |source| into a buffer that is allocated by this function and that
 // can be freed with SbMemoryDeallocate. This function is meant to be a drop-in
 // replacement for |strdup|.
@@ -118,6 +122,8 @@
 // |source|: The string to be copied.
 SB_EXPORT char* SbStringDuplicate(const char* source);
 
+#if SB_API_VERSION < 13
+
 // Finds the first occurrence of a |character| in |str|. The return value is a
 // pointer to the found character in the given string or |NULL| if the
 // character is not found. Note that this function's signature does NOT match
@@ -145,6 +151,8 @@
 // |str2|: The string to locate in |str1|.
 SB_EXPORT const char* SbStringFindString(const char* str1, const char* str2);
 
+#endif  // SB_API_VERSION < 13
+
 // Compares two strings, ignoring differences in case. The return value is:
 // - |< 0| if |string1| is ASCII-betically lower than |string2|.
 // - |0| if the two strings are equal.
@@ -258,6 +266,9 @@
   return result;
 }
 
+
+#if SB_API_VERSION < 13
+
 // Compares the first |count| characters of two 16-bit character strings.
 // The return value is:
 // - |< 0| if |string1| is ASCII-betically lower than |string2|.
@@ -299,6 +310,8 @@
 // |string2|: The second 8-bit character string to compare.
 SB_EXPORT int SbStringCompareAll(const char* string1, const char* string2);
 
+#endif  // SB_API_VERSION < 13
+
 // Scans |buffer| for |pattern|, placing the extracted values in |arguments|.
 // The return value specifies the number of successfully matched items, which
 // may be |0|.
diff --git a/src/starboard/stub/system_get_extensions.cc b/src/starboard/stub/system_get_extensions.cc
index f3f9783..ca1fe9e 100644
--- a/src/starboard/stub/system_get_extensions.cc
+++ b/src/starboard/stub/system_get_extensions.cc
@@ -23,13 +23,13 @@
 #include "starboard/stub/javascript_cache.h"
 
 const void* SbSystemGetExtension(const char* name) {
-  if (SbStringCompareAll(name, kCobaltExtensionConfigurationName) == 0) {
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
     return starboard::stub::GetConfigurationApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionFontName) == 0) {
+  if (strcmp(name, kCobaltExtensionFontName) == 0) {
     return starboard::stub::GetFontApi();
   }
-  if (SbStringCompareAll(name, kCobaltExtensionJavaScriptCacheName) == 0) {
+  if (strcmp(name, kCobaltExtensionJavaScriptCacheName) == 0) {
     return starboard::stub::GetJavaScriptCacheApi();
   }
   return NULL;
diff --git a/src/starboard/system.h b/src/starboard/system.h
index 973aa7d..59efced 100644
--- a/src/starboard/system.h
+++ b/src/starboard/system.h
@@ -190,12 +190,14 @@
   // call.
   kSbSystemCapabilityCanQueryGPUMemoryStats,
 
+#if SB_API_VERSION < 13
   // Whether this system sets the |timestamp| field of SbInputData. If the
   // system does not set this field, then it will automatically be set; however,
   // the relative time between input events likely will not be preserved, so
   // time-related calculations (e.g. velocity for move events) will be
   // incorrect.
   kSbSystemCapabilitySetsInputTimestamp,
+#endif  // SB_API_VERSION < 13
 
   // ATTENTION: Do not add more to this enum. Instead add an "IsSupported"
   // function in the relevant module.
diff --git a/src/testing/gtest.gyp b/src/testing/gtest.gyp
index 86ec54b..4891083 100644
--- a/src/testing/gtest.gyp
+++ b/src/testing/gtest.gyp
@@ -179,11 +179,6 @@
                   '_POSIX_PATH_MAX=255',
                 ],
               }],
-              ['sb_target_platform=="ps4"', {
-                'gtest_defines!' : [
-                  'GTEST_USE_OWN_TR1_TUPLE=1',
-                ],
-              }],
               ['target_os=="win"', {
                 'gtest_defines!' : [
                   'GTEST_USE_OWN_TR1_TUPLE=1',
diff --git a/src/testing/gtest/include/gtest/internal/gtest-port.h b/src/testing/gtest/include/gtest/internal/gtest-port.h
index 2f88ab2..ece398a 100644
--- a/src/testing/gtest/include/gtest/internal/gtest-port.h
+++ b/src/testing/gtest/include/gtest/internal/gtest-port.h
@@ -2464,7 +2464,7 @@
 inline bool IsDir(const StatStruct& st) { return st.is_directory; }
 
 inline const char* StrNCpy(char* dest, const char* src, size_t n) {
-  SbStringCopy(dest, src, static_cast<int>(n));
+  strncpy(dest, src, static_cast<int>(n));
   return dest;
 }
 
@@ -2481,23 +2481,23 @@
 }
 
 inline size_t StrLen(const char *str) {
-  return SbStringGetLength(str);
+  return strlen(str);
 }
 
 inline const char *StrChr(const char *str, char c) {
-  return SbStringFindCharacter(str, c);
+  return strchr(str, c);
 }
 
 inline const char *StrRChr(const char *str, char c) {
-  return SbStringFindLastCharacter(str, c);
+  return strrchr(str, c);
 }
 
 inline int StrNCmp(const char *s1, const char *s2, size_t n) {
-  return SbStringCompare(s1, s2, n);
+  return strncmp(s1, s2, n);
 }
 
 inline void *MemSet(void *s, int c, size_t n) {
-  return SbMemorySet(s, c, n);
+  return memset(s, c, n);
 }
 
 inline void Assert(bool b) { SB_CHECK(b); }
@@ -2845,4 +2845,3 @@
 }  // namespace testing
 
 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-
diff --git a/src/third_party/angle/src/common/mathutil.h b/src/third_party/angle/src/common/mathutil.h
index acd968f..469a25d 100644
--- a/src/third_party/angle/src/common/mathutil.h
+++ b/src/third_party/angle/src/common/mathutil.h
@@ -20,7 +20,6 @@
 
 #include "common/debug.h"
 #include "common/platform.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace angle
 {
@@ -1263,7 +1262,7 @@
     return roundUp(checkedValue, checkedAlignment);
 }
 
-inline CONSTEXPR unsigned int UnsignedCeilDivide(unsigned int value, unsigned int divisor)
+inline constexpr unsigned int UnsignedCeilDivide(unsigned int value, unsigned int divisor)
 {
     unsigned int divided = value / divisor;
     return (divided + ((value % divisor == 0) ? 0 : 1));
diff --git a/src/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp b/src/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp
index f8e1991..b900bc4 100644
--- a/src/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp
+++ b/src/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp
@@ -13,17 +13,16 @@
 #include "compiler/translator/ImmutableStringBuilder.h"
 #include "compiler/translator/InfoSink.h"
 #include "compiler/translator/IntermNode.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 
 namespace
 {
-CONSTEXPR ImmutableString kAtomicCounter("atomicCounter");
-CONSTEXPR ImmutableString kAtomicCounterIncrement("atomicCounterIncrement");
-CONSTEXPR ImmutableString kAtomicCounterDecrement("atomicCounterDecrement");
-CONSTEXPR ImmutableString kAtomicCounterBaseName("_acbase_");
+constexpr ImmutableString kAtomicCounter("atomicCounter");
+constexpr ImmutableString kAtomicCounterIncrement("atomicCounterIncrement");
+constexpr ImmutableString kAtomicCounterDecrement("atomicCounterDecrement");
+constexpr ImmutableString kAtomicCounterBaseName("_acbase_");
 }  // namespace
 
 AtomicCounterFunctionHLSL::AtomicCounterFunctionHLSL(bool forceResolution)
diff --git a/src/third_party/angle/src/compiler/translator/BaseTypes.h b/src/third_party/angle/src/compiler/translator/BaseTypes.h
index 55d6e3c..445653e 100644
--- a/src/third_party/angle/src/compiler/translator/BaseTypes.h
+++ b/src/third_party/angle/src/compiler/translator/BaseTypes.h
@@ -13,7 +13,6 @@
 #include "GLSLANG/ShaderLang.h"
 #include "common/debug.h"
 #include "compiler/translator/ImmutableString.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -167,7 +166,7 @@
 class TBasicMangledName
 {
   public:
-    CONSTEXPR TBasicMangledName(TBasicType t) : mName{'\0', '\0'}
+    constexpr TBasicMangledName(TBasicType t) : mName{'\0', '\0'}
     {
         if (t > EbtLastSimpleType)
         {
@@ -196,7 +195,7 @@
         }
     }
 
-    CONSTEXPR char *getName() { return mName; }
+    constexpr char *getName() { return mName; }
 
     static constexpr int mangledNameSize = 2;
 
diff --git a/src/third_party/angle/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp b/src/third_party/angle/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp
index 9211114..4daf739 100644
--- a/src/third_party/angle/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp
+++ b/src/third_party/angle/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp
@@ -11,15 +11,14 @@
 #include "compiler/translator/Symbol.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 
 namespace
 {
-CONSTEXPR const ImmutableString kGlInstanceIDString("gl_InstanceID");
-CONSTEXPR const ImmutableString kGlVertexIDString("gl_VertexID");
+constexpr const ImmutableString kGlInstanceIDString("gl_InstanceID");
+constexpr const ImmutableString kGlVertexIDString("gl_VertexID");
 
 class TBuiltinsWorkaroundGLSL : public TIntermTraverser
 {
diff --git a/src/third_party/angle/src/compiler/translator/FunctionLookup.cpp b/src/third_party/angle/src/compiler/translator/FunctionLookup.cpp
index 1bf88fb..9f4743a 100644
--- a/src/third_party/angle/src/compiler/translator/FunctionLookup.cpp
+++ b/src/third_party/angle/src/compiler/translator/FunctionLookup.cpp
@@ -10,7 +10,6 @@
 #include "compiler/translator/FunctionLookup.h"
 
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -20,7 +19,7 @@
 
 const char kFunctionMangledNameSeparator = '(';
 
-CONSTEXPR const ImmutableString kEmptyName("");
+constexpr const ImmutableString kEmptyName("");
 
 // Helper function for GetMangledNames
 // Gets all ordered combinations of elements in list[currentIndex, end]
diff --git a/src/third_party/angle/src/compiler/translator/HashNames.cpp b/src/third_party/angle/src/compiler/translator/HashNames.cpp
index 081e423..5601100 100644
--- a/src/third_party/angle/src/compiler/translator/HashNames.cpp
+++ b/src/third_party/angle/src/compiler/translator/HashNames.cpp
@@ -10,19 +10,18 @@
 #include "compiler/translator/ImmutableStringBuilder.h"
 #include "compiler/translator/IntermNode.h"
 #include "compiler/translator/Symbol.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 
 namespace
 {
-CONSTEXPR const ImmutableString kHashedNamePrefix("webgl_");
+constexpr const ImmutableString kHashedNamePrefix("webgl_");
 
 // Can't prefix with just _ because then we might introduce a double underscore, which is not safe
 // in GLSL (ESSL 3.00.6 section 3.8: All identifiers containing a double underscore are reserved for
 // use by the underlying implementation). u is short for user-defined.
-CONSTEXPR const ImmutableString kUnhashedNamePrefix("_u");
+constexpr const ImmutableString kUnhashedNamePrefix("_u");
 
 ImmutableString HashName(const ImmutableString &name, ShHashFunction64 hashFunction)
 {
diff --git a/src/third_party/angle/src/compiler/translator/QualifierTypes.cpp b/src/third_party/angle/src/compiler/translator/QualifierTypes.cpp
index ab7ae7b..af703f2 100644
--- a/src/third_party/angle/src/compiler/translator/QualifierTypes.cpp
+++ b/src/third_party/angle/src/compiler/translator/QualifierTypes.cpp
@@ -8,7 +8,6 @@
 
 #include "compiler/translator/Diagnostics.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "nb/cpp14oncpp11.h"
 
 #include <algorithm>
 
@@ -18,33 +17,33 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kSpecifiedMultipleTimes(" specified multiple times");
-CONSTEXPR const ImmutableString kInvariantMultipleTimes(
+constexpr const ImmutableString kSpecifiedMultipleTimes(" specified multiple times");
+constexpr const ImmutableString kInvariantMultipleTimes(
     "The invariant qualifier specified multiple times.");
-CONSTEXPR const ImmutableString kPrecisionMultipleTimes(
+constexpr const ImmutableString kPrecisionMultipleTimes(
     "The precision qualifier specified multiple times.");
-CONSTEXPR const ImmutableString kLayoutMultipleTimes(
+constexpr const ImmutableString kLayoutMultipleTimes(
     "The layout qualifier specified multiple times.");
-CONSTEXPR const ImmutableString kLayoutAndInvariantDisallowed(
+constexpr const ImmutableString kLayoutAndInvariantDisallowed(
     "The layout qualifier and invariant qualifier cannot coexist in the same "
     "declaration according to the grammar.");
-CONSTEXPR const ImmutableString kInterpolationMultipleTimes(
+constexpr const ImmutableString kInterpolationMultipleTimes(
     "The interpolation qualifier specified multiple times.");
-CONSTEXPR const ImmutableString kOutputLayoutMultipleTimes(
+constexpr const ImmutableString kOutputLayoutMultipleTimes(
     "Output layout location specified multiple times.");
-CONSTEXPR const ImmutableString kInvariantQualifierFirst(
+constexpr const ImmutableString kInvariantQualifierFirst(
     "The invariant qualifier has to be first in the expression.");
-CONSTEXPR const ImmutableString kStorageAfterInterpolation(
+constexpr const ImmutableString kStorageAfterInterpolation(
     "Storage qualifiers have to be after interpolation qualifiers.");
-CONSTEXPR const ImmutableString kPrecisionAfterInterpolation(
+constexpr const ImmutableString kPrecisionAfterInterpolation(
     "Precision qualifiers have to be after interpolation qualifiers.");
-CONSTEXPR const ImmutableString kStorageAfterLayout(
+constexpr const ImmutableString kStorageAfterLayout(
     "Storage qualifiers have to be after layout qualifiers.");
-CONSTEXPR const ImmutableString kPrecisionAfterLayout(
+constexpr const ImmutableString kPrecisionAfterLayout(
     "Precision qualifiers have to be after layout qualifiers.");
-CONSTEXPR const ImmutableString kPrecisionAfterStorage(
+constexpr const ImmutableString kPrecisionAfterStorage(
     "Precision qualifiers have to be after storage qualifiers.");
-CONSTEXPR const ImmutableString kPrecisionAfterMemory(
+constexpr const ImmutableString kPrecisionAfterMemory(
     "Precision qualifiers have to be after memory qualifiers.");
 
 // GLSL ES 3.10 does not impose a strict order on type qualifiers and allows multiple layout
diff --git a/src/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp b/src/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp
index 97bc88c..33d7b70 100644
--- a/src/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp
+++ b/src/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp
@@ -16,7 +16,6 @@
 #include "compiler/translator/UtilsHLSL.h"
 #include "compiler/translator/blocklayoutHLSL.h"
 #include "compiler/translator/util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -24,7 +23,7 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kAngleDecorString("angle_");
+constexpr const ImmutableString kAngleDecorString("angle_");
 
 static const char *UniformRegisterPrefix(const TType &type)
 {
diff --git a/src/third_party/angle/src/compiler/translator/Symbol.cpp b/src/third_party/angle/src/compiler/translator/Symbol.cpp
index be972fb..d0389af 100644
--- a/src/third_party/angle/src/compiler/translator/Symbol.cpp
+++ b/src/third_party/angle/src/compiler/translator/Symbol.cpp
@@ -14,7 +14,6 @@
 
 #include "compiler/translator/ImmutableStringBuilder.h"
 #include "compiler/translator/SymbolTable.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -22,11 +21,11 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kMainName("main");
-CONSTEXPR const ImmutableString kImageLoadName("imageLoad");
-CONSTEXPR const ImmutableString kImageStoreName("imageStore");
-CONSTEXPR const ImmutableString kImageSizeName("imageSize");
-CONSTEXPR const ImmutableString kAtomicCounterName("atomicCounter");
+constexpr const ImmutableString kMainName("main");
+constexpr const ImmutableString kImageLoadName("imageLoad");
+constexpr const ImmutableString kImageStoreName("imageStore");
+constexpr const ImmutableString kImageSizeName("imageSize");
+constexpr const ImmutableString kAtomicCounterName("atomicCounter");
 
 static const char kFunctionMangledNameSeparator = '(';
 
diff --git a/src/third_party/angle/src/compiler/translator/Symbol.h b/src/third_party/angle/src/compiler/translator/Symbol.h
index 34e4ccd..b9cf908 100644
--- a/src/third_party/angle/src/compiler/translator/Symbol.h
+++ b/src/third_party/angle/src/compiler/translator/Symbol.h
@@ -14,7 +14,6 @@
 #include "compiler/translator/ImmutableString.h"
 #include "compiler/translator/IntermNode.h"
 #include "compiler/translator/SymbolUniqueId.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -239,7 +238,7 @@
     bool hasSamplerInStructOrArrayOfArrayParams() const;
 
     // Note: Only to be used for static built-in functions!
-    CONSTEXPR TFunction(const TSymbolUniqueId &id,
+    constexpr TFunction(const TSymbolUniqueId &id,
                         const ImmutableString &name,
                         TExtension extension,
                         const TVariable *const *parameters,
diff --git a/src/third_party/angle/src/compiler/translator/TranslatorVulkan.cpp b/src/third_party/angle/src/compiler/translator/TranslatorVulkan.cpp
index 51e8868..98ba3b1 100644
--- a/src/third_party/angle/src/compiler/translator/TranslatorVulkan.cpp
+++ b/src/third_party/angle/src/compiler/translator/TranslatorVulkan.cpp
@@ -31,7 +31,6 @@
 #include "compiler/translator/tree_util/ReplaceVariable.h"
 #include "compiler/translator/tree_util/RunAtTheEndOfShader.h"
 #include "compiler/translator/util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -157,11 +156,11 @@
     bool mInDefaultUniform;
 };
 
-CONSTEXPR ImmutableString kFlippedPointCoordName    = ImmutableString("flippedPointCoord");
-CONSTEXPR ImmutableString kFlippedFragCoordName     = ImmutableString("flippedFragCoord");
-CONSTEXPR ImmutableString kEmulatedDepthRangeParams = ImmutableString("ANGLEDepthRangeParams");
-CONSTEXPR ImmutableString kUniformsBlockName        = ImmutableString("ANGLEUniformBlock");
-CONSTEXPR ImmutableString kUniformsVarName          = ImmutableString("ANGLEUniforms");
+constexpr ImmutableString kFlippedPointCoordName    = ImmutableString("flippedPointCoord");
+constexpr ImmutableString kFlippedFragCoordName     = ImmutableString("flippedFragCoord");
+constexpr ImmutableString kEmulatedDepthRangeParams = ImmutableString("ANGLEDepthRangeParams");
+constexpr ImmutableString kUniformsBlockName        = ImmutableString("ANGLEUniformBlock");
+constexpr ImmutableString kUniformsVarName          = ImmutableString("ANGLEUniforms");
 
 constexpr const char kViewport[]             = "viewport";
 constexpr const char kHalfRenderAreaHeight[] = "halfRenderAreaHeight";
diff --git a/src/third_party/angle/src/compiler/translator/Types.h b/src/third_party/angle/src/compiler/translator/Types.h
index 9c1584e..7fa52aa 100644
--- a/src/third_party/angle/src/compiler/translator/Types.h
+++ b/src/third_party/angle/src/compiler/translator/Types.h
@@ -9,7 +9,6 @@
 
 #include "common/angleutils.h"
 #include "common/debug.h"
-#include "nb/cpp14oncpp11.h"
 
 #include "compiler/translator/BaseTypes.h"
 #include "compiler/translator/Common.h"
@@ -234,7 +233,7 @@
 
     const TStructure *getStruct() const { return mStructure; }
 
-    static CONSTEXPR char GetSizeMangledName(unsigned char primarySize, unsigned char secondarySize)
+    static constexpr char GetSizeMangledName(unsigned char primarySize, unsigned char secondarySize)
     {
         unsigned int sizeKey = (secondarySize - 1u) * 4u + primarySize - 1u;
         if (sizeKey < 10u)
diff --git a/src/third_party/angle/src/compiler/translator/VersionGLSL.cpp b/src/third_party/angle/src/compiler/translator/VersionGLSL.cpp
index 115259b..4f1c08f 100644
--- a/src/third_party/angle/src/compiler/translator/VersionGLSL.cpp
+++ b/src/third_party/angle/src/compiler/translator/VersionGLSL.cpp
@@ -8,14 +8,13 @@
 
 #include "angle_gl.h"
 #include "compiler/translator/Symbol.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 
 namespace
 {
-CONSTEXPR const ImmutableString kGlPointCoordString("gl_PointCoord");
+constexpr const ImmutableString kGlPointCoordString("gl_PointCoord");
 }  // anonymous namespace
 
 int ShaderOutputTypeToGLSLVersion(ShShaderOutput output)
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp
index 9a55f12..7896439 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp
@@ -14,7 +14,6 @@
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -22,7 +21,7 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kReturnValueVariableName("angle_return");
+constexpr const ImmutableString kReturnValueVariableName("angle_return");
 
 class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser
 {
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp
index 85397c7..0e5fdf2 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp
@@ -19,7 +19,6 @@
 #include "compiler/translator/tree_util/IntermTraverse.h"
 #include "compiler/translator/tree_util/ReplaceVariable.h"
 #include "compiler/translator/util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -27,9 +26,9 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kViewIDVariableName("ViewID_OVR");
-CONSTEXPR const ImmutableString kInstanceIDVariableName("InstanceID");
-CONSTEXPR const ImmutableString kMultiviewBaseViewLayerIndexVariableName(
+constexpr const ImmutableString kViewIDVariableName("ViewID_OVR");
+constexpr const ImmutableString kInstanceIDVariableName("InstanceID");
+constexpr const ImmutableString kMultiviewBaseViewLayerIndexVariableName(
     "multiviewBaseViewLayerIndex");
 
 // Adds the InstanceID and ViewID_OVR initializers to the end of the initializers' sequence.
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp
index e1c5969..dfa23aa 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp
@@ -25,7 +25,6 @@
 #include "compiler/translator/tree_util/FindMain.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/ReplaceVariable.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -33,7 +32,7 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kInitGlobalsString("initGlobals");
+constexpr const ImmutableString kInitGlobalsString("initGlobals");
 
 void GetDeferredInitializers(TIntermDeclaration *declaration,
                              bool initializeUninitializedGlobals,
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp
index 14c0a6d..2f388c7 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp
@@ -18,7 +18,6 @@
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 #include "compiler/translator/tree_util/RunAtTheEndOfShader.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -26,7 +25,7 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kGlFragDataString("gl_FragData");
+constexpr const ImmutableString kGlFragDataString("gl_FragData");
 
 class GLFragColorBroadcastTraverser : public TIntermTraverser
 {
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp
index ffdbaea..dd5a486 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp
@@ -23,7 +23,6 @@
 #include "compiler/translator/tree_util/IntermTraverse.h"
 #include "compiler/translator/tree_util/ReplaceVariable.h"
 #include "compiler/translator/util.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -31,7 +30,7 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kEmulatedGLDrawIDName("angle_DrawID");
+constexpr const ImmutableString kEmulatedGLDrawIDName("angle_DrawID");
 
 class FindGLDrawIDTraverser : public TIntermTraverser
 {
@@ -72,7 +71,7 @@
     }
 };
 
-CONSTEXPR const ImmutableString kEmulatedGLBaseVertexName("angle_BaseVertex");
+constexpr const ImmutableString kEmulatedGLBaseVertexName("angle_BaseVertex");
 
 class FindGLBaseVertexTraverser : public TIntermTraverser
 {
@@ -94,7 +93,7 @@
     const TVariable *mVariable;
 };
 
-CONSTEXPR const ImmutableString kEmulatedGLBaseInstanceName("angle_BaseInstance");
+constexpr const ImmutableString kEmulatedGLBaseInstanceName("angle_BaseInstance");
 
 class FindGLBaseInstanceTraverser : public TIntermTraverser
 {
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp
index 5a5856d..129956e 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp
@@ -7,7 +7,6 @@
 #include "compiler/translator/tree_ops/EmulatePrecision.h"
 
 #include "compiler/translator/FunctionLookup.h"
-#include "nb/cpp14oncpp11.h"
 
 #include <memory>
 
@@ -17,10 +16,10 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kParamXName("x");
-CONSTEXPR const ImmutableString kParamYName("y");
-CONSTEXPR const ImmutableString kAngleFrmString("angle_frm");
-CONSTEXPR const ImmutableString kAngleFrlString("angle_frl");
+constexpr const ImmutableString kParamXName("x");
+constexpr const ImmutableString kParamYName("y");
+constexpr const ImmutableString kAngleFrmString("angle_frm");
+constexpr const ImmutableString kAngleFrlString("angle_frl");
 
 class RoundingHelperWriter : angle::NonCopyable
 {
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/RegenerateStructNames.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/RegenerateStructNames.cpp
index 09f2eb1..530cccb 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/RegenerateStructNames.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/RegenerateStructNames.cpp
@@ -8,14 +8,13 @@
 
 #include "common/debug.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 
 namespace
 {
-CONSTEXPR const ImmutableString kPrefix("_webgl_struct_");
+constexpr const ImmutableString kPrefix("_webgl_struct_");
 }  // anonymous namespace
 
 void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol)
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp
index a0d9655..3c88fa3 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp
@@ -19,7 +19,6 @@
 #include "compiler/translator/tree_util/IntermNodePatternMatcher.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -31,9 +30,9 @@
 
 const TType *kIndexType = StaticType::Get<EbtInt, EbpHigh, EvqIn, 1, 1>();
 
-CONSTEXPR const ImmutableString kBaseName("base");
-CONSTEXPR const ImmutableString kIndexName("index");
-CONSTEXPR const ImmutableString kValueName("value");
+constexpr const ImmutableString kBaseName("base");
+constexpr const ImmutableString kIndexName("index");
+constexpr const ImmutableString kValueName("value");
 
 std::string GetIndexFunctionName(const TType &type, bool write)
 {
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp
index 77e8408..8cf513a 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp
@@ -15,16 +15,15 @@
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 #include "compiler/translator/tree_util/ReplaceVariable.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 namespace
 {
-CONSTEXPR ImmutableString kAtomicCounterTypeName  = ImmutableString("ANGLE_atomic_uint");
-CONSTEXPR ImmutableString kAtomicCounterBlockName = ImmutableString("ANGLEAtomicCounters");
-CONSTEXPR ImmutableString kAtomicCounterVarName   = ImmutableString("atomicCounters");
-CONSTEXPR ImmutableString kAtomicCounterFieldName = ImmutableString("counters");
+constexpr ImmutableString kAtomicCounterTypeName  = ImmutableString("ANGLE_atomic_uint");
+constexpr ImmutableString kAtomicCounterBlockName = ImmutableString("ANGLEAtomicCounters");
+constexpr ImmutableString kAtomicCounterVarName   = ImmutableString("atomicCounters");
+constexpr ImmutableString kAtomicCounterFieldName = ImmutableString("counters");
 
 // DeclareAtomicCountersBuffer adds a storage buffer array that's used with atomic counters.
 const TVariable *DeclareAtomicCountersBuffers(TIntermBlock *root, TSymbolTable *symbolTable)
diff --git a/src/third_party/angle/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp b/src/third_party/angle/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp
index f73faaa..2435502 100644
--- a/src/third_party/angle/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp
@@ -16,14 +16,13 @@
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 #include "compiler/translator/tree_util/ReplaceVariable.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
 namespace
 {
-CONSTEXPR ImmutableString kCoordTransformFuncName("ANGLECubeMapCoordTransform");
-CONSTEXPR ImmutableString kCoordTransformFuncNameImplicit("ANGLECubeMapCoordTransformImplicit");
+constexpr ImmutableString kCoordTransformFuncName("ANGLECubeMapCoordTransform");
+constexpr ImmutableString kCoordTransformFuncNameImplicit("ANGLECubeMapCoordTransformImplicit");
 
 TIntermTyped *DerivativeQuotient(TIntermTyped *u,
                                  TIntermTyped *du,
diff --git a/src/third_party/angle/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp b/src/third_party/angle/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp
index 7684d3f..1af04c8 100644
--- a/src/third_party/angle/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp
+++ b/src/third_party/angle/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp
@@ -28,7 +28,6 @@
 #include "compiler/translator/tree_util/FindMain.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace sh
 {
@@ -36,7 +35,7 @@
 namespace
 {
 
-CONSTEXPR const ImmutableString kMainString("main");
+constexpr const ImmutableString kMainString("main");
 
 class ContainsReturnTraverser : public TIntermTraverser
 {
diff --git a/src/third_party/angle/src/libANGLE/Context.cpp b/src/third_party/angle/src/libANGLE/Context.cpp
index df7eff1..90e80d9 100644
--- a/src/third_party/angle/src/libANGLE/Context.cpp
+++ b/src/third_party/angle/src/libANGLE/Context.cpp
@@ -46,7 +46,6 @@
 #include "libANGLE/renderer/DisplayImpl.h"
 #include "libANGLE/renderer/Format.h"
 #include "libANGLE/validationES.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace gl
 {
@@ -266,7 +265,7 @@
 }
 
 // The rest default to false.
-CONSTEXPR angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
+constexpr angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
     kValidBasicDrawModes = {{
         {PrimitiveMode::Points, true},
         {PrimitiveMode::Lines, true},
diff --git a/src/third_party/angle/src/libANGLE/Context.inl.h b/src/third_party/angle/src/libANGLE/Context.inl.h
index 3062a95..43fa3fe 100644
--- a/src/third_party/angle/src/libANGLE/Context.inl.h
+++ b/src/third_party/angle/src/libANGLE/Context.inl.h
@@ -13,7 +13,6 @@
 
 #include "libANGLE/GLES1Renderer.h"
 #include "libANGLE/renderer/ContextImpl.h"
-#include "nb/cpp14oncpp11.h"
 
 #define ANGLE_HANDLE_ERR(X) \
     (void)(X);              \
diff --git a/src/third_party/angle/src/libANGLE/OverlayWidgets.cpp b/src/third_party/angle/src/libANGLE/OverlayWidgets.cpp
index d13655a..50cfcc1 100644
--- a/src/third_party/angle/src/libANGLE/OverlayWidgets.cpp
+++ b/src/third_party/angle/src/libANGLE/OverlayWidgets.cpp
@@ -27,7 +27,7 @@
 };
 
 // A map that says how the API-facing widget types map to internal types.
-CONSTEXPR angle::PackedEnumMap<WidgetType, WidgetInternalType> kWidgetTypeToInternalMap = {
+constexpr angle::PackedEnumMap<WidgetType, WidgetInternalType> kWidgetTypeToInternalMap = {
     {WidgetType::Count, WidgetInternalType::Text},
     {WidgetType::Text, WidgetInternalType::Text},
     {WidgetType::PerSecond, WidgetInternalType::Text},
@@ -43,12 +43,12 @@
 constexpr size_t kMaxTextLength             = 256;
 constexpr size_t kMaxGraphDataSize          = 64;
 
-CONSTEXPR angle::PackedEnumMap<WidgetInternalType, size_t> kWidgetInternalTypeMaxWidgets = {
+constexpr angle::PackedEnumMap<WidgetInternalType, size_t> kWidgetInternalTypeMaxWidgets = {
     {WidgetInternalType::Text, kMaxRenderableTextWidgets},
     {WidgetInternalType::Graph, kMaxRenderableGraphWidgets},
 };
 
-CONSTEXPR angle::PackedEnumMap<WidgetInternalType, size_t> kWidgetInternalTypeWidgetOffsets = {
+constexpr angle::PackedEnumMap<WidgetInternalType, size_t> kWidgetInternalTypeWidgetOffsets = {
     {WidgetInternalType::Text, 0},
     {WidgetInternalType::Graph, kMaxRenderableTextWidgets},
 };
@@ -385,7 +385,7 @@
 
 namespace
 {
-CONSTEXPR angle::PackedEnumMap<WidgetId, AppendWidgetDataFunc> kWidgetIdToAppendDataFuncMap = {
+constexpr angle::PackedEnumMap<WidgetId, AppendWidgetDataFunc> kWidgetIdToAppendDataFuncMap = {
     {WidgetId::FPS, overlay_impl::AppendWidgetDataHelper::AppendFPS},
     {WidgetId::VulkanLastValidationMessage,
      overlay_impl::AppendWidgetDataHelper::AppendVulkanLastValidationMessage},
diff --git a/src/third_party/angle/src/libANGLE/State.cpp b/src/third_party/angle/src/libANGLE/State.cpp
index cac2334..3fab840 100644
--- a/src/third_party/angle/src/libANGLE/State.cpp
+++ b/src/third_party/angle/src/libANGLE/State.cpp
@@ -27,7 +27,6 @@
 #include "libANGLE/queryutils.h"
 #include "libANGLE/renderer/ContextImpl.h"
 #include "libANGLE/renderer/TextureImpl.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace gl
 {
@@ -50,7 +49,7 @@
 }
 
 // Mapping from a buffer binding type to a dirty bit type.
-CONSTEXPR angle::PackedEnumMap<BufferBinding, size_t> kBufferBindingDirtyBits = {{
+constexpr angle::PackedEnumMap<BufferBinding, size_t> kBufferBindingDirtyBits = {{
     {BufferBinding::AtomicCounter, State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING},
     {BufferBinding::DispatchIndirect, State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING},
     {BufferBinding::DrawIndirect, State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING},
diff --git a/src/third_party/angle/src/libANGLE/angletypes.h b/src/third_party/angle/src/libANGLE/angletypes.h
index 9b19792..d24430d 100644
--- a/src/third_party/angle/src/libANGLE/angletypes.h
+++ b/src/third_party/angle/src/libANGLE/angletypes.h
@@ -17,7 +17,6 @@
 #include "libANGLE/Constants.h"
 #include "libANGLE/Error.h"
 #include "libANGLE/RefCountObject.h"
-#include "nb/cpp14oncpp11.h"
 
 #include <inttypes.h>
 #include <stdint.h>
@@ -404,7 +403,7 @@
     InvalidEnum = 4,
 };
 
-CONSTEXPR_OR_INLINE ComponentType GLenumToComponentType(GLenum componentType)
+constexpr ComponentType GLenumToComponentType(GLenum componentType)
 {
     switch (componentType)
     {
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 3176038..f708a16 100644
--- a/src/third_party/boringssl/src/config/starboard/openssl/opensslconf.h
+++ b/src/third_party/boringssl/src/config/starboard/openssl/opensslconf.h
@@ -238,31 +238,16 @@
 #define OPENSSL_port_gettimeofday EzTimeValueGetNow
 #define OPENSSL_port_gmtime_r EzTimeTExplodeUTC
 #define OPENSSL_port_malloc SbMemoryAllocate
-#define OPENSSL_port_memcmp SbMemoryCompare
-#define OPENSSL_port_memcpy SbMemoryCopy
-#define OPENSSL_port_memmove SbMemoryMove
-#define OPENSSL_port_memset SbMemorySet
 #define OPENSSL_port_printf SbLogFormatF
 #define OPENSSL_port_printferr SbLogFormatF
 #define OPENSSL_port_realloc SbMemoryReallocate
 #define OPENSSL_port_sscanf SbStringScanF
 #define OPENSSL_port_strcasecmp SbStringCompareNoCase
-#define OPENSSL_port_strcat(d, s) SbStringConcat((d), (s), INT_MAX)
-#define OPENSSL_port_strchr (char *)SbStringFindCharacter
-#define OPENSSL_port_strcmp SbStringCompareAll
-#define OPENSSL_port_strcpy(d, s) SbStringCopy((d), (s), INT_MAX)
 #define OPENSSL_port_strdup SbStringDuplicate
 #define OPENSSL_port_strerror(x) ""
-#define OPENSSL_port_strlen SbStringGetLength
 #define OPENSSL_port_strncasecmp SbStringCompareNoCaseN
-#define OPENSSL_port_strncmp SbStringCompare
-#define OPENSSL_port_strncpy SbStringCopy
-#define OPENSSL_port_strrchr (char *)SbStringFindLastCharacter
 #define OPENSSL_port_time EzTimeTGetNow
 
-// OPENSSL wrapper functions that aren't defined globally.
-#define OPENSSL_strcmp OPENSSL_port_strcmp
-
 // Variables that need to be ported.
 #define OPENSSL_port_errno SbSystemGetLastError()
 
diff --git a/src/third_party/boringssl/src/crypto/asn1/a_gentm.c b/src/third_party/boringssl/src/crypto/asn1/a_gentm.c
index 6d576c0..cb7849c 100644
--- a/src/third_party/boringssl/src/crypto/asn1/a_gentm.c
+++ b/src/third_party/boringssl/src/crypto/asn1/a_gentm.c
@@ -192,7 +192,7 @@
     ASN1_GENERALIZEDTIME t;
 
     t.type = V_ASN1_GENERALIZEDTIME;
-    t.length = OPENSSL_port_strlen(str);
+    t.length = strlen(str);
     t.data = (unsigned char *)str;
     if (ASN1_GENERALIZEDTIME_check(&t)) {
         if (s != NULL) {
@@ -252,7 +252,7 @@
     BIO_snprintf(p, len, "%04d%02d%02d%02d%02d%02dZ", ts->tm_year + 1900,
                  ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
                  ts->tm_sec);
-    tmps->length = OPENSSL_port_strlen(p);
+    tmps->length = strlen(p);
     tmps->type = V_ASN1_GENERALIZEDTIME;
     return tmps;
  err:
diff --git a/src/third_party/boringssl/src/crypto/asn1/a_mbstr.c b/src/third_party/boringssl/src/crypto/asn1/a_mbstr.c
index 47900a5..1bbcd1b 100644
--- a/src/third_party/boringssl/src/crypto/asn1/a_mbstr.c
+++ b/src/third_party/boringssl/src/crypto/asn1/a_mbstr.c
@@ -97,7 +97,7 @@
     size_t nchar = 0;
     char strbuf[32];
     if (len == -1)
-        len = OPENSSL_port_strlen((const char *)in);
+        len = strlen((const char *)in);
     if (!mask)
         mask = DIRSTRING_TYPE;
 
diff --git a/src/third_party/boringssl/src/crypto/asn1/a_strnid.c b/src/third_party/boringssl/src/crypto/asn1/a_strnid.c
index b0775d2..efbf0fa 100644
--- a/src/third_party/boringssl/src/crypto/asn1/a_strnid.c
+++ b/src/third_party/boringssl/src/crypto/asn1/a_strnid.c
@@ -99,19 +99,19 @@
 {
     unsigned long mask;
     char *end;
-    if (!OPENSSL_port_strncmp(p, "MASK:", 5)) {
+    if (!strncmp(p, "MASK:", 5)) {
         if (!p[5])
             return 0;
         mask = strtoul(p + 5, &end, 0);
         if (*end)
             return 0;
-    } else if (!OPENSSL_port_strcmp(p, "nombstr"))
+    } else if (!strcmp(p, "nombstr"))
         mask = ~((unsigned long)(B_ASN1_BMPSTRING | B_ASN1_UTF8STRING));
-    else if (!OPENSSL_port_strcmp(p, "pkix"))
+    else if (!strcmp(p, "pkix"))
         mask = ~((unsigned long)B_ASN1_T61STRING);
-    else if (!OPENSSL_port_strcmp(p, "utf8only"))
+    else if (!strcmp(p, "utf8only"))
         mask = B_ASN1_UTF8STRING;
-    else if (!OPENSSL_port_strcmp(p, "default"))
+    else if (!strcmp(p, "default"))
         mask = 0xFFFFFFFFL;
     else
         return 0;
diff --git a/src/third_party/boringssl/src/crypto/asn1/a_time.c b/src/third_party/boringssl/src/crypto/asn1/a_time.c
index 85d143c..d94d1f2 100644
--- a/src/third_party/boringssl/src/crypto/asn1/a_time.c
+++ b/src/third_party/boringssl/src/crypto/asn1/a_time.c
@@ -166,7 +166,7 @@
 {
     ASN1_TIME t;
 
-    t.length = OPENSSL_port_strlen(str);
+    t.length = strlen(str);
     t.data = (unsigned char *)str;
     t.flags = 0;
 
diff --git a/src/third_party/boringssl/src/crypto/asn1/a_utctm.c b/src/third_party/boringssl/src/crypto/asn1/a_utctm.c
index 4452f7b..c5e119f 100644
--- a/src/third_party/boringssl/src/crypto/asn1/a_utctm.c
+++ b/src/third_party/boringssl/src/crypto/asn1/a_utctm.c
@@ -168,7 +168,7 @@
     ASN1_UTCTIME t;
 
     t.type = V_ASN1_UTCTIME;
-    t.length = OPENSSL_port_strlen(str);
+    t.length = strlen(str);
     t.data = (unsigned char *)str;
     if (ASN1_UTCTIME_check(&t)) {
         if (s != NULL) {
@@ -230,7 +230,7 @@
     BIO_snprintf(p, len, "%02d%02d%02d%02d%02d%02dZ", ts->tm_year % 100,
                  ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
                  ts->tm_sec);
-    s->length = OPENSSL_port_strlen(p);
+    s->length = strlen(p);
     s->type = V_ASN1_UTCTIME;
     return (s);
  err:
diff --git a/src/third_party/boringssl/src/crypto/asn1/asn1_lib.c b/src/third_party/boringssl/src/crypto/asn1/asn1_lib.c
index 269ae6d..ea727f3 100644
--- a/src/third_party/boringssl/src/crypto/asn1/asn1_lib.c
+++ b/src/third_party/boringssl/src/crypto/asn1/asn1_lib.c
@@ -338,7 +338,7 @@
         if (data == NULL)
             return (0);
         else
-            len = OPENSSL_port_strlen(data);
+            len = strlen(data);
     }
     if ((str->length <= len) || (str->data == NULL)) {
         c = str->data;
diff --git a/src/third_party/boringssl/src/crypto/bio/bio.c b/src/third_party/boringssl/src/crypto/bio/bio.c
index 361ec57..3e788b8 100644
--- a/src/third_party/boringssl/src/crypto/bio/bio.c
+++ b/src/third_party/boringssl/src/crypto/bio/bio.c
@@ -178,7 +178,7 @@
 }
 
 int BIO_puts(BIO *bio, const char *in) {
-  return BIO_write(bio, in, OPENSSL_port_strlen(in));
+  return BIO_write(bio, in, strlen(in));
 }
 
 int BIO_flush(BIO *bio) {
diff --git a/src/third_party/boringssl/src/crypto/bio/bio_mem.c b/src/third_party/boringssl/src/crypto/bio/bio_mem.c
index e0144c3..08dd6e9 100644
--- a/src/third_party/boringssl/src/crypto/bio/bio_mem.c
+++ b/src/third_party/boringssl/src/crypto/bio/bio_mem.c
@@ -69,7 +69,7 @@
 BIO *BIO_new_mem_buf(const void *buf, int len) {
   BIO *ret;
   BUF_MEM *b;
-  const size_t size = len < 0 ? OPENSSL_port_strlen((char *)buf) : (size_t)len;
+  const size_t size = len < 0 ? strlen((char *)buf) : (size_t)len;
 
   if (!buf && len != 0) {
     OPENSSL_PUT_ERROR(BIO, BIO_R_NULL_PARAMETER);
diff --git a/src/third_party/boringssl/src/crypto/bio/connect.c b/src/third_party/boringssl/src/crypto/bio/connect.c
index 01646c8..604803a 100644
--- a/src/third_party/boringssl/src/crypto/bio/connect.c
+++ b/src/third_party/boringssl/src/crypto/bio/connect.c
@@ -126,7 +126,7 @@
   *out_port = NULL;
 
   if (name[0] == '[') {  // bracketed IPv6 address
-    const char *close = OPENSSL_port_strchr(name, ']');
+    const char *close = strchr(name, ']');
     if (close == NULL) {
       return 0;
     }
@@ -138,10 +138,10 @@
       return 0;
     }
   } else {
-    const char *colon = OPENSSL_port_strchr(name, ':');
-    if (colon == NULL || OPENSSL_port_strchr(colon + 1, ':') != NULL) {  // IPv6 address
+    const char *colon = strchr(name, ':');
+    if (colon == NULL || strchr(colon + 1, ':') != NULL) {  // IPv6 address
       host = name;
-      host_len = OPENSSL_port_strlen(name);
+      host_len = strlen(name);
     } else {  // host:port
       host = name;
       host_len = colon - name;
diff --git a/src/third_party/boringssl/src/crypto/bio/file.c b/src/third_party/boringssl/src/crypto/bio/file.c
index a5c34d3..3c7c08d 100644
--- a/src/third_party/boringssl/src/crypto/bio/file.c
+++ b/src/third_party/boringssl/src/crypto/bio/file.c
@@ -91,7 +91,7 @@
 #define BIO_FLAGS_UPLINK 0
 #endif
 
-
+#include <string.h>
 
 #include <openssl/opensslconf.h>
 #if !defined(OPENSSL_SYS_STARBOARD)
@@ -138,7 +138,7 @@
   FILE *file = NULL;
 
 #if defined(_WIN32) && defined(CP_UTF8)
-  int sz, len_0 = (int)OPENSSL_port_strlen(filename) + 1;
+  int sz, len_0 = (int)strlen(filename) + 1;
   DWORD flags;
 
   /*
@@ -162,7 +162,7 @@
     WCHAR *wfilename = _alloca(sz * sizeof(WCHAR));
 
     if (MultiByteToWideChar(CP_UTF8, flags, filename, len_0, wfilename, sz) &&
-        MultiByteToWideChar(CP_UTF8, 0, mode, OPENSSL_port_strlen(mode) + 1,
+        MultiByteToWideChar(CP_UTF8, 0, mode, strlen(mode) + 1,
                             wmode, sizeof(wmode) / sizeof(wmode[0])) &&
         (file = _wfopen(wfilename, wmode)) == NULL &&
         (OPENSSL_errno == ENOENT || OPENSSL_errno == EBADF)) {
@@ -456,15 +456,15 @@
 #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \
     defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN)
       if (!(num & BIO_FP_TEXT))
-        OPENSSL_port_strcat(p, "b");
+        strcat(p, "b");
       else
-        OPENSSL_port_strcat(p, "t");
+        strcat(p, "t");
 #endif
 #if defined(OPENSSL_SYS_NETWARE)
       if (!(num & BIO_FP_TEXT))
-        OPENSSL_port_strcat(p, "b");
+        strcat(p, "b");
       else
-        OPENSSL_port_strcat(p, "t");
+        strcat(p, "t");
 #endif
 #if defined(OPENSSL_SYS_STARBOARD)
       {
@@ -583,7 +583,7 @@
   }
 #endif  // defined(OPENSSL_SYS_STARBOARD)
   if (buf[0] != '\0')
-    ret = OPENSSL_port_strlen(buf);
+    ret = strlen(buf);
 err:
   return (ret);
 }
@@ -591,7 +591,7 @@
 static int MS_CALLBACK file_puts(BIO *bp, const char *str) {
   int n, ret;
 
-  n = OPENSSL_port_strlen(str);
+  n = strlen(str);
   ret = file_write(bp, str, n);
   return (ret);
 }
diff --git a/src/third_party/boringssl/src/crypto/buf/buf.c b/src/third_party/boringssl/src/crypto/buf/buf.c
index af8d9c9..36f3271 100644
--- a/src/third_party/boringssl/src/crypto/buf/buf.c
+++ b/src/third_party/boringssl/src/crypto/buf/buf.c
@@ -152,7 +152,7 @@
     return NULL;
   }
 
-  return BUF_strndup(str, OPENSSL_port_strlen(str));
+  return BUF_strndup(str, strlen(str));
 }
 
 size_t BUF_strnlen(const char *str, size_t max_len) {
@@ -206,7 +206,7 @@
     *dst = 0;
   }
 
-  return l + OPENSSL_port_strlen(src);
+  return l + strlen(src);
 }
 
 size_t BUF_strlcat(char *dst, const char *src, size_t dst_size) {
diff --git a/src/third_party/boringssl/src/crypto/bytestring/cbs.c b/src/third_party/boringssl/src/crypto/bytestring/cbs.c
index f044a54..458af38 100644
--- a/src/third_party/boringssl/src/crypto/bytestring/cbs.c
+++ b/src/third_party/boringssl/src/crypto/bytestring/cbs.c
@@ -568,7 +568,7 @@
 static int add_decimal(CBB *out, uint64_t v) {
   char buf[DECIMAL_SIZE(uint64_t) + 1];
   BIO_snprintf(buf, sizeof(buf), "%" PRIu64, v);
-  return CBB_add_bytes(out, (const uint8_t *)buf, OPENSSL_port_strlen(buf));
+  return CBB_add_bytes(out, (const uint8_t *)buf, strlen(buf));
 }
 
 char *CBS_asn1_oid_to_text(const CBS *cbs) {
diff --git a/src/third_party/boringssl/src/crypto/conf/conf.c b/src/third_party/boringssl/src/crypto/conf/conf.c
index 98c8f62..b1982f8 100644
--- a/src/third_party/boringssl/src/crypto/conf/conf.c
+++ b/src/third_party/boringssl/src/crypto/conf/conf.c
@@ -81,14 +81,14 @@
   int i;
 
   if (a->section != b->section) {
-    i = OPENSSL_port_strcmp(a->section, b->section);
+    i = strcmp(a->section, b->section);
     if (i) {
       return i;
     }
   }
 
   if (a->name != NULL && b->name != NULL) {
-    return OPENSSL_port_strcmp(a->name, b->name);
+    return strcmp(a->name, b->name);
   } else if (a->name == b->name) {
     return 0;
   } else {
@@ -208,7 +208,7 @@
     return 0;
   }
 
-  len = OPENSSL_port_strlen(from) + 1;
+  len = strlen(from) + 1;
   if (!BUF_MEM_grow(buf, len)) {
     goto err;
   }
@@ -320,7 +320,7 @@
         OPENSSL_PUT_ERROR(CONF, CONF_R_VARIABLE_HAS_NO_VALUE);
         goto err;
       }
-      size_t newsize = OPENSSL_port_strlen(p) + buf->length - (e - from);
+      size_t newsize = strlen(p) + buf->length - (e - from);
       if (newsize > MAX_CONF_VALUE_LENGTH) {
         OPENSSL_PUT_ERROR(CONF, CONF_R_VARIABLE_EXPANSION_TOO_LONG);
         goto err;
@@ -554,7 +554,7 @@
     *p = '\0';
     BIO_gets(in, p, CONFBUFSIZE - 1);
     p[CONFBUFSIZE - 1] = '\0';
-    ii = i = OPENSSL_port_strlen(p);
+    ii = i = strlen(p);
     if (i == 0 && !again) {
       break;
     }
@@ -675,7 +675,7 @@
         goto err;
       }
 
-      if (OPENSSL_port_strcmp(psection, section) != 0) {
+      if (strcmp(psection, section) != 0) {
         if ((tv = get_section(conf, psection)) == NULL) {
           tv = NCONF_new_section(conf, psection);
         }
@@ -765,14 +765,14 @@
         lstart++;
       }
     }
-    p = OPENSSL_port_strchr(lstart, sep);
+    p = strchr(lstart, sep);
     if (p == lstart || !*lstart) {
       ret = list_cb(NULL, 0, arg);
     } else {
       if (p) {
         tmpend = p - 1;
       } else {
-        tmpend = lstart + OPENSSL_port_strlen(lstart) - 1;
+        tmpend = lstart + strlen(lstart) - 1;
       }
       if (remove_whitespace) {
         while (isspace((unsigned char)*tmpend)) {
diff --git a/src/third_party/boringssl/src/crypto/cpu-starboard.c b/src/third_party/boringssl/src/crypto/cpu-starboard.c
index b707e26..4979d40 100644
--- a/src/third_party/boringssl/src/crypto/cpu-starboard.c
+++ b/src/third_party/boringssl/src/crypto/cpu-starboard.c
@@ -51,7 +51,7 @@
     // OpenSSL has optimized AVX codepath enabled only on Intel CPUs
     // The flag is passed as a "synthetic" value in reserved bit, i.e. CPUID
     // never returns it. See https://github.com/openssl/openssl/commit/0c14980
-    if (!SbStringCompareAll(features.x86.vendor,"GenuineIntel"))  {
+    if (!strcmp(features.x86.vendor,"GenuineIntel"))  {
         OPENSSL_ia32cap_P[CPUID_01_REG_EDX] |= (1 << ID_01_EDX_IS_INTEL_BIT);
     }
 
diff --git a/src/third_party/boringssl/src/crypto/digest_extra/digest_extra.c b/src/third_party/boringssl/src/crypto/digest_extra/digest_extra.c
index de41889..43d09cf 100644
--- a/src/third_party/boringssl/src/crypto/digest_extra/digest_extra.c
+++ b/src/third_party/boringssl/src/crypto/digest_extra/digest_extra.c
@@ -232,8 +232,8 @@
   for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(nid_to_digest_mapping); i++) {
     const char *short_name = nid_to_digest_mapping[i].short_name;
     const char *long_name = nid_to_digest_mapping[i].long_name;
-    if ((short_name && OPENSSL_port_strcmp(short_name, name) == 0) ||
-        (long_name && OPENSSL_port_strcmp(long_name, name) == 0)) {
+    if ((short_name && strcmp(short_name, name) == 0) ||
+        (long_name && strcmp(long_name, name) == 0)) {
       return nid_to_digest_mapping[i].md_func();
     }
   }
diff --git a/src/third_party/boringssl/src/crypto/err/err.c b/src/third_party/boringssl/src/crypto/err/err.c
index bd24d27..305e1b0 100644
--- a/src/third_party/boringssl/src/crypto/err/err.c
+++ b/src/third_party/boringssl/src/crypto/err/err.c
@@ -424,7 +424,7 @@
   BIO_snprintf(buf, len, "error:%08" PRIx32 ":%s:OPENSSL_internal:%s",
                packed_error, lib_str, reason_str);
 
-  if (OPENSSL_port_strlen(buf) == len - 1) {
+  if (strlen(buf) == len - 1) {
     // output may be truncated; make sure we always have 5 colon-separated
     // fields, i.e. 4 colons.
     static const unsigned num_colons = 4;
@@ -438,7 +438,7 @@
     }
 
     for (i = 0; i < num_colons; i++) {
-      char *colon = OPENSSL_port_strchr(s, ':');
+      char *colon = strchr(s, ':');
       char *last_pos = &buf[len - 1] - num_colons + i;
 
       if (colon == NULL || colon > last_pos) {
@@ -607,7 +607,7 @@
     ERR_error_string_n(packed_error, buf, sizeof(buf));
     BIO_snprintf(buf2, sizeof(buf2), "%lu:%s:%s:%d:%s\n", thread_hash, buf,
                  file, line, (flags & ERR_FLAG_STRING) ? data : "");
-    if (callback(buf2, OPENSSL_port_strlen(buf2), ctx) <= 0) {
+    if (callback(buf2, strlen(buf2), ctx) <= 0) {
       break;
     }
   }
@@ -702,7 +702,7 @@
       continue;
     }
 
-    substr_len = OPENSSL_port_strlen(substr);
+    substr_len = strlen(substr);
     new_len = len + substr_len;
     if (new_len > alloced) {
       char *new_buf;
diff --git a/src/third_party/boringssl/src/crypto/lhash/lhash.c b/src/third_party/boringssl/src/crypto/lhash/lhash.c
index 43d833f..e4fc3fd 100644
--- a/src/third_party/boringssl/src/crypto/lhash/lhash.c
+++ b/src/third_party/boringssl/src/crypto/lhash/lhash.c
@@ -346,5 +346,5 @@
     return 0;
   }
 
-  return OPENSSL_hash32(c, OPENSSL_port_strlen(c));
+  return OPENSSL_hash32(c, strlen(c));
 }
diff --git a/src/third_party/boringssl/src/crypto/mem_starboard.c b/src/third_party/boringssl/src/crypto/mem_starboard.c
index 57da207..6a884e4 100644
--- a/src/third_party/boringssl/src/crypto/mem_starboard.c
+++ b/src/third_party/boringssl/src/crypto/mem_starboard.c
@@ -65,7 +65,7 @@
     to_copy = old_size;
   }
 
-  SbMemoryCopy(ret, orig_ptr, to_copy);
+  memcpy(ret, orig_ptr, to_copy);
   OPENSSL_free(orig_ptr);
 
   return ret;
@@ -111,7 +111,7 @@
     return 0;
   }
 
-  return SbMemoryCompare(s1, s2, n);
+  return memcmp(s1, s2, n);
 }
 
 void *OPENSSL_memcpy(void *dst, const void *src, size_t n) {
@@ -119,7 +119,7 @@
     return dst;
   }
 
-  return SbMemoryCopy(dst, src, n);
+  return memcpy(dst, src, n);
 }
 
 void *OPENSSL_memmove(void *dst, const void *src, size_t n) {
@@ -127,7 +127,7 @@
     return dst;
   }
 
-  return SbMemoryMove(dst, src, n);
+  return memmove(dst, src, n);
 }
 
 void *OPENSSL_memset(void *dst, int c, size_t n) {
@@ -135,7 +135,7 @@
     return dst;
   }
 
-  return SbMemorySet(dst, c, n);
+  return memset(dst, c, n);
 }
 
 uint32_t OPENSSL_hash32(const void *ptr, size_t len) {
@@ -165,7 +165,7 @@
 }
 
 char *OPENSSL_strdup(const char *s) {
-  const size_t len = SbStringGetLength(s) + 1;
+  const size_t len = strlen(s) + 1;
   char *ret = OPENSSL_malloc(len);
   if (ret == NULL) {
     return NULL;
diff --git a/src/third_party/boringssl/src/crypto/obj/obj.c b/src/third_party/boringssl/src/crypto/obj/obj.c
index 6d1a4ea..a8f219f 100644
--- a/src/third_party/boringssl/src/crypto/obj/obj.c
+++ b/src/third_party/boringssl/src/crypto/obj/obj.c
@@ -255,7 +255,7 @@
   const char *name = (const char *) key;
   unsigned nid = *((unsigned*) element);
 
-  return OPENSSL_port_strcmp(name, kObjects[nid].sn);
+  return strcmp(name, kObjects[nid].sn);
 }
 
 int OBJ_sn2nid(const char *short_name) {
@@ -291,7 +291,7 @@
   const char *name = (const char *) key;
   unsigned nid = *((unsigned*) element);
 
-  return OPENSSL_port_strcmp(name, kObjects[nid].ln);
+  return strcmp(name, kObjects[nid].ln);
 }
 
 int OBJ_ln2nid(const char *long_name) {
@@ -396,7 +396,7 @@
   size_t len;
   CBB cbb;
   if (!CBB_init(&cbb, 32) ||
-      !CBB_add_asn1_oid_from_text(&cbb, oid, OPENSSL_port_strlen(oid)) ||
+      !CBB_add_asn1_oid_from_text(&cbb, oid, strlen(oid)) ||
       !CBB_finish(&cbb, &buf, &len)) {
     OPENSSL_PUT_ERROR(OBJ, OBJ_R_INVALID_OID_STRING);
     CBB_cleanup(&cbb);
@@ -494,7 +494,7 @@
 }
 
 static int cmp_short_name(const ASN1_OBJECT *a, const ASN1_OBJECT *b) {
-  return OPENSSL_port_strcmp(a->sn, b->sn);
+  return strcmp(a->sn, b->sn);
 }
 
 static uint32_t hash_long_name(const ASN1_OBJECT *obj) {
@@ -502,7 +502,7 @@
 }
 
 static int cmp_long_name(const ASN1_OBJECT *a, const ASN1_OBJECT *b) {
-  return OPENSSL_port_strcmp(a->ln, b->ln);
+  return strcmp(a->ln, b->ln);
 }
 
 // obj_add_object inserts |obj| into the various global hashes for run-time
diff --git a/src/third_party/boringssl/src/crypto/pem/pem_info.c b/src/third_party/boringssl/src/crypto/pem/pem_info.c
index 147a6d0..d707e42 100644
--- a/src/third_party/boringssl/src/crypto/pem/pem_info.c
+++ b/src/third_party/boringssl/src/crypto/pem/pem_info.c
@@ -126,8 +126,8 @@
             goto err;
         }
  start:
-        if ((OPENSSL_port_strcmp(name, PEM_STRING_X509) == 0) ||
-            (OPENSSL_port_strcmp(name, PEM_STRING_X509_OLD) == 0)) {
+        if ((strcmp(name, PEM_STRING_X509) == 0) ||
+            (strcmp(name, PEM_STRING_X509_OLD) == 0)) {
             d2i = (D2I_OF(void)) d2i_X509;
             if (xi->x509 != NULL) {
                 if (!sk_X509_INFO_push(ret, xi))
@@ -137,7 +137,7 @@
                 goto start;
             }
             pp = &(xi->x509);
-        } else if ((OPENSSL_port_strcmp(name, PEM_STRING_X509_TRUSTED) == 0)) {
+        } else if ((strcmp(name, PEM_STRING_X509_TRUSTED) == 0)) {
             d2i = (D2I_OF(void)) d2i_X509_AUX;
             if (xi->x509 != NULL) {
                 if (!sk_X509_INFO_push(ret, xi))
@@ -147,7 +147,7 @@
                 goto start;
             }
             pp = &(xi->x509);
-        } else if (OPENSSL_port_strcmp(name, PEM_STRING_X509_CRL) == 0) {
+        } else if (strcmp(name, PEM_STRING_X509_CRL) == 0) {
             d2i = (D2I_OF(void)) d2i_X509_CRL;
             if (xi->crl != NULL) {
                 if (!sk_X509_INFO_push(ret, xi))
@@ -157,7 +157,7 @@
                 goto start;
             }
             pp = &(xi->crl);
-        } else if (OPENSSL_port_strcmp(name, PEM_STRING_RSA) == 0) {
+        } else if (strcmp(name, PEM_STRING_RSA) == 0) {
             d2i = (D2I_OF(void)) d2i_RSAPrivateKey;
             if (xi->x_pkey != NULL) {
                 if (!sk_X509_INFO_push(ret, xi))
@@ -173,11 +173,11 @@
             xi->x_pkey = X509_PKEY_new();
             ptype = EVP_PKEY_RSA;
             pp = &xi->x_pkey->dec_pkey;
-            if ((int)OPENSSL_port_strlen(header) > 10) /* assume encrypted */
+            if ((int)strlen(header) > 10) /* assume encrypted */
                 raw = 1;
         } else
 #ifndef OPENSSL_NO_DSA
-        if (OPENSSL_port_strcmp(name, PEM_STRING_DSA) == 0) {
+        if (strcmp(name, PEM_STRING_DSA) == 0) {
             d2i = (D2I_OF(void)) d2i_DSAPrivateKey;
             if (xi->x_pkey != NULL) {
                 if (!sk_X509_INFO_push(ret, xi))
@@ -193,11 +193,11 @@
             xi->x_pkey = X509_PKEY_new();
             ptype = EVP_PKEY_DSA;
             pp = &xi->x_pkey->dec_pkey;
-            if ((int)OPENSSL_port_strlen(header) > 10) /* assume encrypted */
+            if ((int)strlen(header) > 10) /* assume encrypted */
                 raw = 1;
         } else
 #endif
-        if (OPENSSL_port_strcmp(name, PEM_STRING_ECPRIVATEKEY) == 0) {
+        if (strcmp(name, PEM_STRING_ECPRIVATEKEY) == 0) {
             d2i = (D2I_OF(void)) d2i_ECPrivateKey;
             if (xi->x_pkey != NULL) {
                 if (!sk_X509_INFO_push(ret, xi))
@@ -213,7 +213,7 @@
             xi->x_pkey = X509_PKEY_new();
             ptype = EVP_PKEY_EC;
             pp = &xi->x_pkey->dec_pkey;
-            if ((int)OPENSSL_port_strlen(header) > 10) /* assume encrypted */
+            if ((int)strlen(header) > 10) /* assume encrypted */
                 raw = 1;
         } else {
             d2i = NULL;
@@ -342,7 +342,7 @@
             }
 
             /* create the right magic header stuff */
-            assert(OPENSSL_port_strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
+            assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
             buf[0] = '\0';
             PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
             PEM_dek_info(buf, objstr, iv_len, (char *)iv);
diff --git a/src/third_party/boringssl/src/crypto/pem/pem_lib.c b/src/third_party/boringssl/src/crypto/pem/pem_lib.c
index 5b85071..13c9fb4 100644
--- a/src/third_party/boringssl/src/crypto/pem/pem_lib.c
+++ b/src/third_party/boringssl/src/crypto/pem/pem_lib.c
@@ -109,7 +109,7 @@
     BUF_strlcat(buf, "DEK-Info: ", PEM_BUFSIZE);
     BUF_strlcat(buf, type, PEM_BUFSIZE);
     BUF_strlcat(buf, ",", PEM_BUFSIZE);
-    j = OPENSSL_port_strlen(buf);
+    j = strlen(buf);
     if (j + (len * 2) + 1 > PEM_BUFSIZE)
         return;
     for (i = 0; i < len; i++) {
@@ -141,50 +141,50 @@
 static int check_pem(const char *nm, const char *name)
 {
     /* Normal matching nm and name */
-    if (!OPENSSL_port_strcmp(nm, name))
+    if (!strcmp(nm, name))
         return 1;
 
     /* Make PEM_STRING_EVP_PKEY match any private key */
 
-    if (!OPENSSL_port_strcmp(name, PEM_STRING_EVP_PKEY)) {
-        return !OPENSSL_port_strcmp(nm, PEM_STRING_PKCS8) ||
-               !OPENSSL_port_strcmp(nm, PEM_STRING_PKCS8INF) ||
-               !OPENSSL_port_strcmp(nm, PEM_STRING_RSA) ||
-               !OPENSSL_port_strcmp(nm, PEM_STRING_EC) ||
-               !OPENSSL_port_strcmp(nm, PEM_STRING_DSA);
+    if (!strcmp(name, PEM_STRING_EVP_PKEY)) {
+        return !strcmp(nm, PEM_STRING_PKCS8) ||
+               !strcmp(nm, PEM_STRING_PKCS8INF) ||
+               !strcmp(nm, PEM_STRING_RSA) ||
+               !strcmp(nm, PEM_STRING_EC) ||
+               !strcmp(nm, PEM_STRING_DSA);
     }
 
     /* Permit older strings */
 
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_X509_OLD) && !OPENSSL_port_strcmp(name, PEM_STRING_X509))
+    if (!strcmp(nm, PEM_STRING_X509_OLD) && !strcmp(name, PEM_STRING_X509))
         return 1;
 
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_X509_REQ_OLD) &&
-        !OPENSSL_port_strcmp(name, PEM_STRING_X509_REQ))
+    if (!strcmp(nm, PEM_STRING_X509_REQ_OLD) &&
+        !strcmp(name, PEM_STRING_X509_REQ))
         return 1;
 
     /* Allow normal certs to be read as trusted certs */
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_X509) &&
-        !OPENSSL_port_strcmp(name, PEM_STRING_X509_TRUSTED))
+    if (!strcmp(nm, PEM_STRING_X509) &&
+        !strcmp(name, PEM_STRING_X509_TRUSTED))
         return 1;
 
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_X509_OLD) &&
-        !OPENSSL_port_strcmp(name, PEM_STRING_X509_TRUSTED))
+    if (!strcmp(nm, PEM_STRING_X509_OLD) &&
+        !strcmp(name, PEM_STRING_X509_TRUSTED))
         return 1;
 
     /* Some CAs use PKCS#7 with CERTIFICATE headers */
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_X509) && !OPENSSL_port_strcmp(name, PEM_STRING_PKCS7))
+    if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_PKCS7))
         return 1;
 
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_PKCS7_SIGNED) &&
-        !OPENSSL_port_strcmp(name, PEM_STRING_PKCS7))
+    if (!strcmp(nm, PEM_STRING_PKCS7_SIGNED) &&
+        !strcmp(name, PEM_STRING_PKCS7))
         return 1;
 
 #ifndef OPENSSL_NO_CMS
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_X509) && !OPENSSL_port_strcmp(name, PEM_STRING_CMS))
+    if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_CMS))
         return 1;
     /* Allow CMS to be read from PKCS#7 headers */
-    if (!OPENSSL_port_strcmp(nm, PEM_STRING_PKCS7) && !OPENSSL_port_strcmp(name, PEM_STRING_CMS))
+    if (!strcmp(nm, PEM_STRING_PKCS7) && !strcmp(name, PEM_STRING_CMS))
         return 1;
 #endif
 
@@ -196,15 +196,15 @@
     /* This is similar to the (deprecated) function |EVP_get_cipherbyname|. Note
      * the PEM code assumes that ciphers have at least 8 bytes of IV, at most 20
      * bytes of overhead and generally behave like CBC mode. */
-    if (0 == OPENSSL_port_strcmp(name, SN_des_cbc)) {
+    if (0 == strcmp(name, SN_des_cbc)) {
         return EVP_des_cbc();
-    } else if (0 == OPENSSL_port_strcmp(name, SN_des_ede3_cbc)) {
+    } else if (0 == strcmp(name, SN_des_ede3_cbc)) {
         return EVP_des_ede3_cbc();
-    } else if (0 == OPENSSL_port_strcmp(name, SN_aes_128_cbc)) {
+    } else if (0 == strcmp(name, SN_aes_128_cbc)) {
         return EVP_aes_128_cbc();
-    } else if (0 == OPENSSL_port_strcmp(name, SN_aes_192_cbc)) {
+    } else if (0 == strcmp(name, SN_aes_192_cbc)) {
         return EVP_aes_192_cbc();
-    } else if (0 == OPENSSL_port_strcmp(name, SN_aes_256_cbc)) {
+    } else if (0 == strcmp(name, SN_aes_256_cbc)) {
         return EVP_aes_256_cbc();
     } else {
         return NULL;
@@ -338,7 +338,7 @@
         if (kstr == (unsigned char *)buf)
             OPENSSL_cleanse(buf, PEM_BUFSIZE);
 
-        assert(OPENSSL_port_strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
+        assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
 
         buf[0] = '\0';
         PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
@@ -428,7 +428,7 @@
     OPENSSL_memset(cipher->iv, 0, sizeof(cipher->iv));
     if ((header == NULL) || (*header == '\0') || (*header == '\n'))
         return (1);
-    if (OPENSSL_port_strncmp(header, "Proc-Type: ", 11) != 0) {
+    if (strncmp(header, "Proc-Type: ", 11) != 0) {
         OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_PROC_TYPE);
         return (0);
     }
@@ -439,7 +439,7 @@
     if (*header != ',')
         return (0);
     header++;
-    if (OPENSSL_port_strncmp(header, "ENCRYPTED", 9) != 0) {
+    if (strncmp(header, "ENCRYPTED", 9) != 0) {
         OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_ENCRYPTED);
         return (0);
     }
@@ -449,7 +449,7 @@
         return (0);
     }
     header++;
-    if (OPENSSL_port_strncmp(header, "DEK-Info: ", 10) != 0) {
+    if (strncmp(header, "DEK-Info: ", 10) != 0) {
         OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_DEK_INFO);
         return (0);
     }
@@ -540,14 +540,14 @@
     int reason = ERR_R_BUF_LIB;
 
     EVP_EncodeInit(&ctx);
-    nlen = OPENSSL_port_strlen(name);
+    nlen = strlen(name);
 
     if ((BIO_write(bp, "-----BEGIN ", 11) != 11) ||
         (BIO_write(bp, name, nlen) != nlen) ||
         (BIO_write(bp, "-----\n", 6) != 6))
         goto err;
 
-    i = OPENSSL_port_strlen(header);
+    i = strlen(header);
     if (i > 0) {
         if ((BIO_write(bp, header, i) != i) || (BIO_write(bp, "\n", 1) != 1))
             goto err;
@@ -640,10 +640,10 @@
         buf[++i] = '\n';
         buf[++i] = '\0';
 
-        if (OPENSSL_port_strncmp(buf, "-----BEGIN ", 11) == 0) {
-            i = OPENSSL_port_strlen(&(buf[11]));
+        if (strncmp(buf, "-----BEGIN ", 11) == 0) {
+            i = strlen(&(buf[11]));
 
-            if (OPENSSL_port_strncmp(&(buf[11 + i - 6]), "-----\n", 6) != 0)
+            if (strncmp(&(buf[11 + i - 6]), "-----\n", 6) != 0)
                 continue;
             if (!BUF_MEM_grow(nameB, i + 9)) {
                 OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
@@ -676,7 +676,7 @@
             OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
             goto err;
         }
-        if (OPENSSL_port_strncmp(buf, "-----END ", 9) == 0) {
+        if (strncmp(buf, "-----END ", 9) == 0) {
             nohead = 1;
             break;
         }
@@ -704,7 +704,7 @@
 
             if (i != 65)
                 end = 1;
-            if (OPENSSL_port_strncmp(buf, "-----END ", 9) == 0)
+            if (strncmp(buf, "-----END ", 9) == 0)
                 break;
             if (i > 65)
                 break;
@@ -735,10 +735,10 @@
         dataB = tmpB;
         bl = hl;
     }
-    i = OPENSSL_port_strlen(nameB->data);
-    if ((OPENSSL_port_strncmp(buf, "-----END ", 9) != 0) ||
-        (OPENSSL_port_strncmp(nameB->data, &(buf[9]), i) != 0) ||
-        (OPENSSL_port_strncmp(&(buf[9 + i]), "-----\n", 6) != 0)) {
+    i = strlen(nameB->data);
+    if ((strncmp(buf, "-----END ", 9) != 0) ||
+        (strncmp(nameB->data, &(buf[9]), i) != 0) ||
+        (strncmp(&(buf[9 + i]), "-----\n", 6) != 0)) {
         OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_END_LINE);
         goto err;
     }
@@ -780,7 +780,7 @@
     if (!buf || !userdata || size < 0) {
         return 0;
     }
-    size_t len = OPENSSL_port_strlen((char *)userdata);
+    size_t len = strlen((char *)userdata);
     if (len >= (size_t)size) {
         return 0;
     }
diff --git a/src/third_party/boringssl/src/crypto/pem/pem_pkey.c b/src/third_party/boringssl/src/crypto/pem/pem_pkey.c
index b13bbf9..f95692e 100644
--- a/src/third_party/boringssl/src/crypto/pem/pem_pkey.c
+++ b/src/third_party/boringssl/src/crypto/pem/pem_pkey.c
@@ -85,7 +85,7 @@
         return NULL;
     p = data;
 
-    if (OPENSSL_port_strcmp(nm, PEM_STRING_PKCS8INF) == 0) {
+    if (strcmp(nm, PEM_STRING_PKCS8INF) == 0) {
         PKCS8_PRIV_KEY_INFO *p8inf;
         p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len);
         if (!p8inf)
@@ -97,7 +97,7 @@
             *x = ret;
         }
         PKCS8_PRIV_KEY_INFO_free(p8inf);
-    } else if (OPENSSL_port_strcmp(nm, PEM_STRING_PKCS8) == 0) {
+    } else if (strcmp(nm, PEM_STRING_PKCS8) == 0) {
         PKCS8_PRIV_KEY_INFO *p8inf;
         X509_SIG *p8;
         int klen;
@@ -127,14 +127,14 @@
             *x = ret;
         }
         PKCS8_PRIV_KEY_INFO_free(p8inf);
-    } else if (OPENSSL_port_strcmp(nm, PEM_STRING_RSA) == 0) {
+    } else if (strcmp(nm, PEM_STRING_RSA) == 0) {
         /* TODO(davidben): d2i_PrivateKey parses PKCS#8 along with the
          * standalone format. This and the cases below probably should not
          * accept PKCS#8. */
         ret = d2i_PrivateKey(EVP_PKEY_RSA, x, &p, len);
-    } else if (OPENSSL_port_strcmp(nm, PEM_STRING_EC) == 0) {
+    } else if (strcmp(nm, PEM_STRING_EC) == 0) {
         ret = d2i_PrivateKey(EVP_PKEY_EC, x, &p, len);
-    } else if (OPENSSL_port_strcmp(nm, PEM_STRING_DSA) == 0) {
+    } else if (strcmp(nm, PEM_STRING_DSA) == 0) {
         ret = d2i_PrivateKey(EVP_PKEY_DSA, x, &p, len);
     }
  p8err:
diff --git a/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c b/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c
index cbc1494..4527aab 100644
--- a/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c
+++ b/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c
@@ -168,7 +168,7 @@
                                    int pass_len_in) {
   size_t pass_len;
   if (pass_len_in == -1 && pass != NULL) {
-    pass_len = OPENSSL_port_strlen(pass);
+    pass_len = strlen(pass);
   } else {
     pass_len = (size_t)pass_len_in;
   }
@@ -203,7 +203,7 @@
                         int iterations, PKCS8_PRIV_KEY_INFO *p8inf) {
   size_t pass_len;
   if (pass_len_in == -1 && pass != NULL) {
-    pass_len = OPENSSL_port_strlen(pass);
+    pass_len = strlen(pass);
   } else {
     pass_len = (size_t)pass_len_in;
   }
@@ -663,7 +663,7 @@
   ctx.out_key = out_key;
   ctx.out_certs = out_certs;
   ctx.password = password;
-  ctx.password_len = password != NULL ? OPENSSL_port_strlen(password) : 0;
+  ctx.password_len = password != NULL ? strlen(password) : 0;
 
   // Verify the MAC.
   {
@@ -977,7 +977,7 @@
     }
     // Convert the friendly name to a BMPString.
     CBS name_cbs;
-    CBS_init(&name_cbs, (const uint8_t *)name, OPENSSL_port_strlen(name));
+    CBS_init(&name_cbs, (const uint8_t *)name, strlen(name));
     while (CBS_len(&name_cbs) != 0) {
       uint32_t c;
       if (!cbs_get_utf8(&name_cbs, &c) ||
@@ -1155,7 +1155,7 @@
   // Note that |password| may be NULL to specify no password, rather than the
   // empty string. They are encoded differently in PKCS#12. (One is the empty
   // byte array and the other is NUL-terminated UCS-2.)
-  size_t password_len = password != NULL ? OPENSSL_port_strlen(password) : 0;
+  size_t password_len = password != NULL ? strlen(password) : 0;
 
   uint8_t key_id[EVP_MAX_MD_SIZE];
   unsigned key_id_len = 0;
diff --git a/src/third_party/boringssl/src/crypto/x509/a_strex.c b/src/third_party/boringssl/src/crypto/x509/a_strex.c
index b342cc5..6dc183a 100644
--- a/src/third_party/boringssl/src/crypto/x509/a_strex.c
+++ b/src/third_party/boringssl/src/crypto/x509/a_strex.c
@@ -371,7 +371,7 @@
     if (lflags & ASN1_STRFLGS_SHOW_TYPE) {
         const char *tagname;
         tagname = ASN1_tag2str(type);
-        outlen += OPENSSL_port_strlen(tagname);
+        outlen += strlen(tagname);
         if (!io_ch(arg, tagname, outlen) || !io_ch(arg, ":", 1))
             return -1;
         outlen++;
@@ -552,7 +552,7 @@
                     objbuf = "";
                 }
             }
-            objlen = OPENSSL_port_strlen(objbuf);
+            objlen = strlen(objbuf);
             if (!io_ch(arg, objbuf, objlen))
                 return -1;
             if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) {
diff --git a/src/third_party/boringssl/src/crypto/x509/asn1_gen.c b/src/third_party/boringssl/src/crypto/x509/asn1_gen.c
index 85abfb0..5b74cd1 100644
--- a/src/third_party/boringssl/src/crypto/x509/asn1_gen.c
+++ b/src/third_party/boringssl/src/crypto/x509/asn1_gen.c
@@ -387,13 +387,13 @@
             OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
             return -1;
         }
-        if (!OPENSSL_port_strncmp(vstart, "ASCII", 5))
+        if (!strncmp(vstart, "ASCII", 5))
             arg->format = ASN1_GEN_FORMAT_ASCII;
-        else if (!OPENSSL_port_strncmp(vstart, "UTF8", 4))
+        else if (!strncmp(vstart, "UTF8", 4))
             arg->format = ASN1_GEN_FORMAT_UTF8;
-        else if (!OPENSSL_port_strncmp(vstart, "HEX", 3))
+        else if (!strncmp(vstart, "HEX", 3))
             arg->format = ASN1_GEN_FORMAT_HEX;
-        else if (!OPENSSL_port_strncmp(vstart, "BITLIST", 7))
+        else if (!strncmp(vstart, "BITLIST", 7))
             arg->format = ASN1_GEN_FORMAT_BITLIST;
         else {
             OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
@@ -633,11 +633,11 @@
     };
 
     if (len == -1)
-        len = OPENSSL_port_strlen(tagstr);
+        len = strlen(tagstr);
 
     tntmp = tnst;
     for (i = 0; i < sizeof(tnst) / sizeof(struct tag_name_st); i++, tntmp++) {
-        if ((len == tntmp->len) && !OPENSSL_port_strncmp(tntmp->strnam, tagstr, len))
+        if ((len == tntmp->len) && !strncmp(tntmp->strnam, tagstr, len))
             return tntmp->tag;
     }
 
diff --git a/src/third_party/boringssl/src/crypto/x509/by_dir.c b/src/third_party/boringssl/src/crypto/x509/by_dir.c
index 7b6cb32..59f879c 100644
--- a/src/third_party/boringssl/src/crypto/x509/by_dir.c
+++ b/src/third_party/boringssl/src/crypto/x509/by_dir.c
@@ -229,8 +229,8 @@
                 continue;
             for (j = 0; j < sk_BY_DIR_ENTRY_num(ctx->dirs); j++) {
                 ent = sk_BY_DIR_ENTRY_value(ctx->dirs, j);
-                if (OPENSSL_port_strlen(ent->dir) == len &&
-                    OPENSSL_port_strncmp(ent->dir, ss, len) == 0)
+                if (strlen(ent->dir) == len &&
+                    strncmp(ent->dir, ss, len) == 0)
                     break;
             }
             if (j < sk_BY_DIR_ENTRY_num(ctx->dirs))
@@ -328,7 +328,7 @@
             size_t idx;
             BY_DIR_HASH htmp, *hent;
             ent = sk_BY_DIR_ENTRY_value(ctx->dirs, i);
-            j = OPENSSL_port_strlen(ent->dir) + 1 + 8 + 6 + 1 + 1;
+            j = strlen(ent->dir) + 1 + 8 + 6 + 1 + 1;
             if (!BUF_MEM_grow(b, j)) {
                 OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
                 goto finish;
@@ -351,7 +351,7 @@
             for (;;) {
                 char c = '/';
 #ifdef OPENSSL_SYS_VMS
-                c = ent->dir[OPENSSL_port_strlen(ent->dir) - 1];
+                c = ent->dir[strlen(ent->dir) - 1];
                 if (c != ':' && c != '>' && c != ']') {
                     /*
                      * If no separator is present, we assume the directory
diff --git a/src/third_party/boringssl/src/crypto/x509/x509_cmp.c b/src/third_party/boringssl/src/crypto/x509/x509_cmp.c
index 200c557..17314af 100644
--- a/src/third_party/boringssl/src/crypto/x509/x509_cmp.c
+++ b/src/third_party/boringssl/src/crypto/x509/x509_cmp.c
@@ -94,7 +94,7 @@
     f = X509_NAME_oneline(a->cert_info->issuer, NULL, 0);
     if (!EVP_DigestInit_ex(&ctx, EVP_md5(), NULL))
         goto err;
-    if (!EVP_DigestUpdate(&ctx, (unsigned char *)f, OPENSSL_port_strlen(f)))
+    if (!EVP_DigestUpdate(&ctx, (unsigned char *)f, strlen(f)))
         goto err;
     OPENSSL_free(f);
     if (!EVP_DigestUpdate
diff --git a/src/third_party/boringssl/src/crypto/x509/x509_obj.c b/src/third_party/boringssl/src/crypto/x509/x509_obj.c
index 2f5e65b..8acd914 100644
--- a/src/third_party/boringssl/src/crypto/x509/x509_obj.c
+++ b/src/third_party/boringssl/src/crypto/x509/x509_obj.c
@@ -117,7 +117,7 @@
             i2t_ASN1_OBJECT(tmp_buf, sizeof(tmp_buf), ne->object);
             s = tmp_buf;
         }
-        l1 = OPENSSL_port_strlen(s);
+        l1 = strlen(s);
 
         type = ne->value->type;
         num = ne->value->length;
diff --git a/src/third_party/boringssl/src/crypto/x509/x509_vfy.c b/src/third_party/boringssl/src/crypto/x509/x509_vfy.c
index bcec909..f329945 100644
--- a/src/third_party/boringssl/src/crypto/x509/x509_vfy.c
+++ b/src/third_party/boringssl/src/crypto/x509/x509_vfy.c
@@ -750,7 +750,7 @@
   }
   for (i = 0; i < n; ++i) {
     name = sk_OPENSSL_STRING_value(id->hosts, i);
-    if (X509_check_host(x, name, OPENSSL_port_strlen(name), id->hostflags, &id->peername) >
+    if (X509_check_host(x, name, strlen(name), id->hostflags, &id->peername) >
         0)
       return 1;
   }
@@ -1806,7 +1806,7 @@
     int max_length = sizeof("YYMMDDHHMMSS+hhmm") - 1;
     if (remaining < min_length || remaining > max_length)
       return 0;
-    OPENSSL_port_memcpy(p, str, 10);
+    memcpy(p, str, 10);
     p += 10;
     str += 10;
     remaining -= 10;
@@ -1816,7 +1816,7 @@
     int max_length = sizeof("YYYYMMDDHHMMSS.fff+hhmm") - 1;
     if (remaining < min_length || remaining > max_length)
       return 0;
-    OPENSSL_port_memcpy(p, str, 12);
+    memcpy(p, str, 12);
     p += 12;
     str += 12;
     remaining -= 12;
@@ -1892,7 +1892,7 @@
     if (i > j)
       return 1;
   }
-  i = OPENSSL_port_strcmp(buff1, buff2);
+  i = strcmp(buff1, buff2);
   if (i == 0) /* wait a second then return younger :-) */
     return -1;
   else
diff --git a/src/third_party/boringssl/src/crypto/x509/x509_vpm.c b/src/third_party/boringssl/src/crypto/x509/x509_vpm.c
index 55a139a..0da8635 100644
--- a/src/third_party/boringssl/src/crypto/x509/x509_vpm.c
+++ b/src/third_party/boringssl/src/crypto/x509/x509_vpm.c
@@ -601,7 +601,7 @@
 
 static int param_cmp(const X509_VERIFY_PARAM **a, const X509_VERIFY_PARAM **b)
 {
-    return OPENSSL_port_strcmp((*a)->name, (*b)->name);
+    return strcmp((*a)->name, (*b)->name);
 }
 
 int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
@@ -657,7 +657,7 @@
 
     limit = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
     for (i = 0; i < limit; i++) {
-        if (OPENSSL_port_strcmp(default_table[i].name, name) == 0) {
+        if (strcmp(default_table[i].name, name) == 0) {
             return &default_table[i];
         }
     }
diff --git a/src/third_party/boringssl/src/crypto/x509/x509name.c b/src/third_party/boringssl/src/crypto/x509/x509name.c
index 2c58238..d6683f6 100644
--- a/src/third_party/boringssl/src/crypto/x509/x509name.c
+++ b/src/third_party/boringssl/src/crypto/x509/x509name.c
@@ -363,7 +363,7 @@
                                       len, type,
                                       OBJ_obj2nid(ne->object)) ? 1 : 0;
     if (len < 0)
-        len = OPENSSL_port_strlen((const char *)bytes);
+        len = strlen((const char *)bytes);
     i = ASN1_STRING_set(ne->value, bytes, len);
     if (!i)
         return (0);
diff --git a/src/third_party/boringssl/src/crypto/x509/x509spki.c b/src/third_party/boringssl/src/crypto/x509/x509spki.c
index 6f5f890..4a9b95e 100644
--- a/src/third_party/boringssl/src/crypto/x509/x509spki.c
+++ b/src/third_party/boringssl/src/crypto/x509/x509spki.c
@@ -84,7 +84,7 @@
     size_t spki_len;
     NETSCAPE_SPKI *spki;
     if (len <= 0)
-        len = OPENSSL_port_strlen(str);
+        len = strlen(str);
     if (!EVP_DecodedLength(&spki_len, len)) {
         OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR);
         return NULL;
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_akey.c b/src/third_party/boringssl/src/crypto/x509v3/v3_akey.c
index b470724..4503e61 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_akey.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_akey.c
@@ -133,13 +133,13 @@
 
     for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
         cnf = sk_CONF_VALUE_value(values, i);
-        if (!OPENSSL_port_strcmp(cnf->name, "keyid")) {
+        if (!strcmp(cnf->name, "keyid")) {
             keyid = 1;
-            if (cnf->value && !OPENSSL_port_strcmp(cnf->value, "always"))
+            if (cnf->value && !strcmp(cnf->value, "always"))
                 keyid = 2;
-        } else if (!OPENSSL_port_strcmp(cnf->name, "issuer")) {
+        } else if (!strcmp(cnf->name, "issuer")) {
             issuer = 1;
-            if (cnf->value && !OPENSSL_port_strcmp(cnf->value, "always"))
+            if (cnf->value && !strcmp(cnf->value, "always"))
                 issuer = 2;
         } else {
             OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_OPTION);
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_alt.c b/src/third_party/boringssl/src/crypto/x509v3/v3_alt.c
index 92f6d77..b78a410 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_alt.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_alt.c
@@ -262,7 +262,7 @@
     for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
         cnf = sk_CONF_VALUE_value(nval, i);
         if (!name_cmp(cnf->name, "issuer") && cnf->value &&
-            !OPENSSL_port_strcmp(cnf->value, "copy")) {
+            !strcmp(cnf->value, "copy")) {
             if (!copy_issuer(ctx, gens))
                 goto err;
         } else {
@@ -332,11 +332,11 @@
     for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
         cnf = sk_CONF_VALUE_value(nval, i);
         if (!name_cmp(cnf->name, "email") && cnf->value &&
-            !OPENSSL_port_strcmp(cnf->value, "copy")) {
+            !strcmp(cnf->value, "copy")) {
             if (!copy_email(ctx, gens, 0))
                 goto err;
         } else if (!name_cmp(cnf->name, "email") && cnf->value &&
-                   !OPENSSL_port_strcmp(cnf->value, "move")) {
+                   !strcmp(cnf->value, "move")) {
             if (!copy_email(ctx, gens, 1))
                 goto err;
         } else {
@@ -513,7 +513,7 @@
     if (is_string) {
         if (!(gen->d.ia5 = M_ASN1_IA5STRING_new()) ||
             !ASN1_STRING_set(gen->d.ia5, (unsigned char *)value,
-                             OPENSSL_port_strlen(value))) {
+                             strlen(value))) {
             OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
             goto err;
         }
@@ -573,7 +573,7 @@
 {
     char *objtmp = NULL, *p;
     int objlen;
-    if (!(p = OPENSSL_port_strchr(value, ';')))
+    if (!(p = strchr(value, ';')))
         return 0;
     if (!(gen->d.otherName = OTHERNAME_new()))
         return 0;
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_bcons.c b/src/third_party/boringssl/src/crypto/x509v3/v3_bcons.c
index 1abec2a..aefefdf 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_bcons.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_bcons.c
@@ -114,10 +114,10 @@
     }
     for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
         val = sk_CONF_VALUE_value(values, i);
-        if (!OPENSSL_port_strcmp(val->name, "CA")) {
+        if (!strcmp(val->name, "CA")) {
             if (!X509V3_get_value_bool(val, &bcons->ca))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(val->name, "pathlen")) {
+        } else if (!strcmp(val->name, "pathlen")) {
             if (!X509V3_get_value_int(val, &bcons->pathlen))
                 goto err;
         } else {
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_bitst.c b/src/third_party/boringssl/src/crypto/x509v3/v3_bitst.c
index 05917a9..86a8c36 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_bitst.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_bitst.c
@@ -120,8 +120,8 @@
     for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
         val = sk_CONF_VALUE_value(nval, i);
         for (bnam = method->usr_data; bnam->lname; bnam++) {
-            if (!OPENSSL_port_strcmp(bnam->sname, val->name) ||
-                !OPENSSL_port_strcmp(bnam->lname, val->name)) {
+            if (!strcmp(bnam->sname, val->name) ||
+                !strcmp(bnam->lname, val->name)) {
                 if (!ASN1_BIT_STRING_set_bit(bs, bnam->bitnum, 1)) {
                     OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
                     M_ASN1_BIT_STRING_free(bs);
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_conf.c b/src/third_party/boringssl/src/crypto/x509v3/v3_conf.c
index 6543cd7..ff2eae1 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_conf.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_conf.c
@@ -232,7 +232,7 @@
 static int v3_check_critical(char **value)
 {
     char *p = *value;
-    if ((OPENSSL_port_strlen(p) < 9) || OPENSSL_port_strncmp(p, "critical,", 9))
+    if ((strlen(p) < 9) || strncmp(p, "critical,", 9))
         return 0;
     p += 9;
     while (isspace((unsigned char)*p))
@@ -246,10 +246,10 @@
 {
     int gen_type = 0;
     char *p = *value;
-    if ((OPENSSL_port_strlen(p) >= 4) && !OPENSSL_port_strncmp(p, "DER:", 4)) {
+    if ((strlen(p) >= 4) && !strncmp(p, "DER:", 4)) {
         p += 4;
         gen_type = 1;
-    } else if ((OPENSSL_port_strlen(p) >= 5) && !OPENSSL_port_strncmp(p, "ASN1:", 5)) {
+    } else if ((strlen(p) >= 5) && !strncmp(p, "ASN1:", 5)) {
         p += 5;
         gen_type = 2;
     } else
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_cpols.c b/src/third_party/boringssl/src/crypto/x509v3/v3_cpols.c
index c06a895..4def530 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_cpols.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_cpols.c
@@ -167,7 +167,7 @@
             goto err;
         }
         pstr = cnf->name;
-        if (!OPENSSL_port_strcmp(pstr, "ia5org")) {
+        if (!strcmp(pstr, "ia5org")) {
             ia5org = 1;
             continue;
         } else if (*pstr == '@') {
@@ -222,7 +222,7 @@
         goto merr;
     for (i = 0; i < sk_CONF_VALUE_num(polstrs); i++) {
         cnf = sk_CONF_VALUE_value(polstrs, i);
-        if (!OPENSSL_port_strcmp(cnf->name, "policyIdentifier")) {
+        if (!strcmp(cnf->name, "policyIdentifier")) {
             ASN1_OBJECT *pobj;
             if (!(pobj = OBJ_txt2obj(cnf->value, 0))) {
                 OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
@@ -249,7 +249,7 @@
                 goto err;
             }
             if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value,
-                                 OPENSSL_port_strlen(cnf->value)))
+                                 strlen(cnf->value)))
                 goto merr;
         } else if (!name_cmp(cnf->name, "userNotice")) {
             STACK_OF(CONF_VALUE) *unot;
@@ -317,14 +317,14 @@
     qual->d.usernotice = not;
     for (i = 0; i < sk_CONF_VALUE_num(unot); i++) {
         cnf = sk_CONF_VALUE_value(unot, i);
-        if (!OPENSSL_port_strcmp(cnf->name, "explicitText")) {
+        if (!strcmp(cnf->name, "explicitText")) {
             not->exptext = M_ASN1_VISIBLESTRING_new();
             if (not->exptext == NULL)
                 goto merr;
             if (!ASN1_STRING_set(not->exptext, cnf->value,
-                                 OPENSSL_port_strlen(cnf->value)))
+                                 strlen(cnf->value)))
                 goto merr;
-        } else if (!OPENSSL_port_strcmp(cnf->name, "organization")) {
+        } else if (!strcmp(cnf->name, "organization")) {
             NOTICEREF *nref;
             if (!not->noticeref) {
                 if (!(nref = NOTICEREF_new()))
@@ -337,9 +337,9 @@
             else
                 nref->organization->type = V_ASN1_VISIBLESTRING;
             if (!ASN1_STRING_set(nref->organization, cnf->value,
-                                 OPENSSL_port_strlen(cnf->value)))
+                                 strlen(cnf->value)))
                 goto merr;
-        } else if (!OPENSSL_port_strcmp(cnf->name, "noticeNumbers")) {
+        } else if (!strcmp(cnf->name, "noticeNumbers")) {
             NOTICEREF *nref;
             STACK_OF(CONF_VALUE) *nos;
             if (!not->noticeref) {
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_crld.c b/src/third_party/boringssl/src/crypto/x509v3/v3_crld.c
index 77fd84f..c93c449 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_crld.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_crld.c
@@ -117,11 +117,11 @@
 {
     STACK_OF(GENERAL_NAME) *fnm = NULL;
     STACK_OF(X509_NAME_ENTRY) *rnm = NULL;
-    if (!OPENSSL_port_strncmp(cnf->name, "fullname", 9)) {
+    if (!strncmp(cnf->name, "fullname", 9)) {
         fnm = gnames_from_sectname(ctx, cnf->value);
         if (!fnm)
             goto err;
-    } else if (!OPENSSL_port_strcmp(cnf->name, "relativename")) {
+    } else if (!strcmp(cnf->name, "relativename")) {
         int ret;
         STACK_OF(CONF_VALUE) *dnsect;
         X509_NAME *nm;
@@ -210,7 +210,7 @@
                 goto err;
         }
         for (pbn = reason_flags; pbn->lname; pbn++) {
-            if (!OPENSSL_port_strcmp(pbn->sname, bnam)) {
+            if (!strcmp(pbn->sname, bnam)) {
                 if (!ASN1_BIT_STRING_set_bit(*preas, pbn->bitnum, 1))
                     goto err;
                 break;
@@ -265,10 +265,10 @@
             continue;
         if (ret < 0)
             goto err;
-        if (!OPENSSL_port_strcmp(cnf->name, "reasons")) {
+        if (!strcmp(cnf->name, "reasons")) {
             if (!set_reasons(&point->reasons, cnf->value))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(cnf->name, "CRLissuer")) {
+        } else if (!strcmp(cnf->name, "CRLissuer")) {
             point->CRLissuer = gnames_from_sectname(ctx, cnf->value);
             if (!point->CRLissuer)
                 goto err;
@@ -431,19 +431,19 @@
             continue;
         if (ret < 0)
             goto err;
-        if (!OPENSSL_port_strcmp(name, "onlyuser")) {
+        if (!strcmp(name, "onlyuser")) {
             if (!X509V3_get_value_bool(cnf, &idp->onlyuser))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(name, "onlyCA")) {
+        } else if (!strcmp(name, "onlyCA")) {
             if (!X509V3_get_value_bool(cnf, &idp->onlyCA))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(name, "onlyAA")) {
+        } else if (!strcmp(name, "onlyAA")) {
             if (!X509V3_get_value_bool(cnf, &idp->onlyattr))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(name, "indirectCRL")) {
+        } else if (!strcmp(name, "indirectCRL")) {
             if (!X509V3_get_value_bool(cnf, &idp->indirectCRL))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(name, "onlysomereasons")) {
+        } else if (!strcmp(name, "onlysomereasons")) {
             if (!set_reasons(&idp->onlysomereasons, val))
                 goto err;
         } else {
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_ia5.c b/src/third_party/boringssl/src/crypto/x509v3/v3_ia5.c
index a46d3fd..6b2056d 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_ia5.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_ia5.c
@@ -111,7 +111,7 @@
     if (!(ia5 = M_ASN1_IA5STRING_new()))
         goto err;
     if (!ASN1_STRING_set((ASN1_STRING *)ia5, (unsigned char *)str,
-                         OPENSSL_port_strlen(str))) {
+                         strlen(str))) {
         M_ASN1_IA5STRING_free(ia5);
         goto err;
     }
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_info.c b/src/third_party/boringssl/src/crypto/x509v3/v3_info.c
index 84055ba..ff96489 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_info.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_info.c
@@ -133,7 +133,7 @@
         tret = tmp;
         vtmp = sk_CONF_VALUE_value(tret, i);
         i2t_ASN1_OBJECT(objtmp, sizeof objtmp, desc->method);
-        nlen = OPENSSL_port_strlen(objtmp) + OPENSSL_port_strlen(vtmp->name) + 5;
+        nlen = strlen(objtmp) + strlen(vtmp->name) + 5;
         ntmp = OPENSSL_malloc(nlen);
         if (ntmp == NULL)
             goto err;
@@ -178,7 +178,7 @@
             OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
             goto err;
         }
-        ptmp = OPENSSL_port_strchr(cnf->name, ';');
+        ptmp = strchr(cnf->name, ';');
         if (!ptmp) {
             OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX);
             goto err;
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_ncons.c b/src/third_party/boringssl/src/crypto/x509v3/v3_ncons.c
index a8859ca..593a520 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_ncons.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_ncons.c
@@ -125,10 +125,10 @@
         goto memerr;
     for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
         val = sk_CONF_VALUE_value(nval, i);
-        if (!OPENSSL_port_strncmp(val->name, "permitted", 9) && val->name[9]) {
+        if (!strncmp(val->name, "permitted", 9) && val->name[9]) {
             ptree = &ncons->permittedSubtrees;
             tval.name = val->name + 10;
-        } else if (!OPENSSL_port_strncmp(val->name, "excluded", 8) && val->name[8]) {
+        } else if (!strncmp(val->name, "excluded", 8) && val->name[8]) {
             ptree = &ncons->excludedSubtrees;
             tval.name = val->name + 9;
         } else {
@@ -418,8 +418,8 @@
     const char *baseptr = (char *)base->data;
     const char *emlptr = (char *)eml->data;
 
-    const char *baseat = OPENSSL_port_strchr(baseptr, '@');
-    const char *emlat = OPENSSL_port_strchr(emlptr, '@');
+    const char *baseat = strchr(baseptr, '@');
+    const char *emlat = strchr(emlptr, '@');
     if (!emlat)
         return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
     /* Special case: inital '.' is RHS match */
@@ -439,7 +439,7 @@
             if ((baseat - baseptr) != (emlat - emlptr))
                 return X509_V_ERR_PERMITTED_VIOLATION;
             /* Case sensitive match of local part */
-            if (OPENSSL_port_strncmp(baseptr, emlptr, emlat - emlptr))
+            if (strncmp(baseptr, emlptr, emlat - emlptr))
                 return X509_V_ERR_PERMITTED_VIOLATION;
         }
         /* Position base after '@' */
@@ -458,7 +458,7 @@
 {
     const char *baseptr = (char *)base->data;
     const char *hostptr = (char *)uri->data;
-    const char *p = OPENSSL_port_strchr(hostptr, ':');
+    const char *p = strchr(hostptr, ':');
     int hostlen;
     /* Check for foo:// and skip past it */
     if (!p || (p[1] != '/') || (p[2] != '/'))
@@ -469,13 +469,13 @@
 
     /* Look for a port indicator as end of hostname first */
 
-    p = OPENSSL_port_strchr(hostptr, ':');
+    p = strchr(hostptr, ':');
     /* Otherwise look for trailing slash */
     if (!p)
-        p = OPENSSL_port_strchr(hostptr, '/');
+        p = strchr(hostptr, '/');
 
     if (!p)
-        hostlen = OPENSSL_port_strlen(hostptr);
+        hostlen = strlen(hostptr);
     else
         hostlen = p - hostptr;
 
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_pci.c b/src/third_party/boringssl/src/crypto/x509v3/v3_pci.c
index cf7bf003..4352abe 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_pci.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_pci.c
@@ -85,7 +85,7 @@
 {
     int free_policy = 0;
 
-    if (OPENSSL_port_strcmp(val->name, "language") == 0) {
+    if (strcmp(val->name, "language") == 0) {
         if (*language) {
             OPENSSL_PUT_ERROR(X509V3,
                               X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED);
@@ -97,7 +97,7 @@
             X509V3_conf_err(val);
             return 0;
         }
-    } else if (OPENSSL_port_strcmp(val->name, "pathlen") == 0) {
+    } else if (strcmp(val->name, "pathlen") == 0) {
         if (*pathlen) {
             OPENSSL_PUT_ERROR(X509V3,
                               X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED);
@@ -109,7 +109,7 @@
             X509V3_conf_err(val);
             return 0;
         }
-    } else if (OPENSSL_port_strcmp(val->name, "policy") == 0) {
+    } else if (strcmp(val->name, "policy") == 0) {
         unsigned char *tmp_data = NULL;
         long val_len;
         if (!*policy) {
@@ -121,7 +121,7 @@
             }
             free_policy = 1;
         }
-        if (OPENSSL_port_strncmp(val->value, "hex:", 4) == 0) {
+        if (strncmp(val->value, "hex:", 4) == 0) {
             unsigned char *tmp_data2 =
                 string_to_hex(val->value + 4, &val_len);
 
@@ -152,8 +152,8 @@
                 goto err;
             }
             OPENSSL_free(tmp_data2);
-        } else if (OPENSSL_port_strncmp(val->value, "text:", 5) == 0) {
-            val_len = OPENSSL_port_strlen(val->value + 5);
+        } else if (strncmp(val->value, "text:", 5) == 0) {
+            val_len = strlen(val->value + 5);
             tmp_data = OPENSSL_realloc((*policy)->data,
                                        (*policy)->length + val_len + 1);
             if (tmp_data) {
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_pcons.c b/src/third_party/boringssl/src/crypto/x509v3/v3_pcons.c
index 17331c0..1a46314 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_pcons.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_pcons.c
@@ -115,10 +115,10 @@
     }
     for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
         val = sk_CONF_VALUE_value(values, i);
-        if (!OPENSSL_port_strcmp(val->name, "requireExplicitPolicy")) {
+        if (!strcmp(val->name, "requireExplicitPolicy")) {
             if (!X509V3_get_value_int(val, &pcons->requireExplicitPolicy))
                 goto err;
-        } else if (!OPENSSL_port_strcmp(val->name, "inhibitPolicyMapping")) {
+        } else if (!strcmp(val->name, "inhibitPolicyMapping")) {
             if (!X509V3_get_value_int(val, &pcons->inhibitPolicyMapping))
                 goto err;
         } else {
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_purp.c b/src/third_party/boringssl/src/crypto/x509v3/v3_purp.c
index b5367cc..5e1f641 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_purp.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_purp.c
@@ -187,7 +187,7 @@
     X509_PURPOSE *xptmp;
     for (i = 0; i < X509_PURPOSE_get_count(); i++) {
         xptmp = X509_PURPOSE_get0(i);
-        if (!OPENSSL_port_strcmp(xptmp->sname, sname))
+        if (!strcmp(xptmp->sname, sname))
             return i;
     }
     return -1;
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_skey.c b/src/third_party/boringssl/src/crypto/x509v3/v3_skey.c
index e427be0..65f8287 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_skey.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_skey.c
@@ -109,7 +109,7 @@
     unsigned char pkey_dig[EVP_MAX_MD_SIZE];
     unsigned int diglen;
 
-    if (OPENSSL_port_strcmp(str, "hash"))
+    if (strcmp(str, "hash"))
         return s2i_ASN1_OCTET_STRING(method, ctx, str);
 
     if (!(oct = M_ASN1_OCTET_STRING_new())) {
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_sxnet.c b/src/third_party/boringssl/src/crypto/x509v3/v3_sxnet.c
index 3a50cb0..51c5a67 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_sxnet.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_sxnet.c
@@ -194,7 +194,7 @@
         return 0;
     }
     if (userlen == -1)
-        userlen = OPENSSL_port_strlen(user);
+        userlen = strlen(user);
     if (userlen > 64) {
         OPENSSL_PUT_ERROR(X509V3, X509V3_R_USER_TOO_LONG);
         return 0;
@@ -215,7 +215,7 @@
     if (!(id = SXNETID_new()))
         goto err;
     if (userlen == -1)
-        userlen = OPENSSL_port_strlen(user);
+        userlen = strlen(user);
 
     if (!M_ASN1_OCTET_STRING_set(id->user, user, userlen))
         goto err;
diff --git a/src/third_party/boringssl/src/crypto/x509v3/v3_utl.c b/src/third_party/boringssl/src/crypto/x509v3/v3_utl.c
index 4937321..7b93e45 100644
--- a/src/third_party/boringssl/src/crypto/x509v3/v3_utl.c
+++ b/src/third_party/boringssl/src/crypto/x509v3/v3_utl.c
@@ -174,7 +174,7 @@
         return NULL;
     }
 
-    len = OPENSSL_port_strlen(tmp) + 3;
+    len = strlen(tmp) + 3;
     ret = OPENSSL_malloc(len);
     if (ret == NULL) {
         OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
@@ -287,14 +287,14 @@
     char *btmp;
     if (!(btmp = value->value))
         goto err;
-    if (!OPENSSL_port_strcmp(btmp, "TRUE") || !OPENSSL_port_strcmp(btmp, "true")
-        || !OPENSSL_port_strcmp(btmp, "Y") || !OPENSSL_port_strcmp(btmp, "y")
-        || !OPENSSL_port_strcmp(btmp, "YES") || !OPENSSL_port_strcmp(btmp, "yes")) {
+    if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
+        || !strcmp(btmp, "Y") || !strcmp(btmp, "y")
+        || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
         *asn1_bool = 0xff;
         return 1;
-    } else if (!OPENSSL_port_strcmp(btmp, "FALSE") || !OPENSSL_port_strcmp(btmp, "false")
-               || !OPENSSL_port_strcmp(btmp, "N") || !OPENSSL_port_strcmp(btmp, "n")
-               || !OPENSSL_port_strcmp(btmp, "NO") || !OPENSSL_port_strcmp(btmp, "no")) {
+    } else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
+               || !strcmp(btmp, "N") || !strcmp(btmp, "n")
+               || !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
         *asn1_bool = 0;
         return 1;
     }
@@ -428,7 +428,7 @@
         p++;
     if (!*p)
         return NULL;
-    q = p + OPENSSL_port_strlen(p) - 1;
+    q = p + strlen(p) - 1;
     while ((q != p) && isspace((unsigned char)*q))
         q--;
     if (p != q)
@@ -481,7 +481,7 @@
         OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
         return NULL;
     }
-    if (!(hexbuf = OPENSSL_malloc(OPENSSL_port_strlen(str) >> 1)))
+    if (!(hexbuf = OPENSSL_malloc(strlen(str) >> 1)))
         goto err;
     for (p = (unsigned char *)str, q = hexbuf; *p;) {
         ch = *p++;
@@ -541,8 +541,8 @@
 {
     int len, ret;
     char c;
-    len = OPENSSL_port_strlen(cmp);
-    if ((ret = OPENSSL_port_strncmp(name, cmp, len)))
+    len = strlen(cmp);
+    if ((ret = strncmp(name, cmp, len)))
         return ret;
     c = name[len];
     if (!c || (c == '.'))
@@ -552,7 +552,7 @@
 
 static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b)
 {
-    return OPENSSL_port_strcmp(*a, *b);
+    return strcmp(*a, *b);
 }
 
 STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x)
@@ -1110,7 +1110,7 @@
     unsigned char ipout[32];
     char *iptmp = NULL, *p;
     int iplen1, iplen2;
-    p = OPENSSL_port_strchr(ipasc, '/');
+    p = strchr(ipasc, '/');
     if (!p)
         return NULL;
     iptmp = BUF_strdup(ipasc);
@@ -1152,7 +1152,7 @@
 {
     /* If string contains a ':' assume IPv6 */
 
-    if (OPENSSL_port_strchr(ipasc, ':')) {
+    if (strchr(ipasc, ':')) {
         if (!ipv6_from_asc(ipout, ipasc))
             return 0;
         return 16;
diff --git a/src/third_party/boringssl/src/ssl/d1_srtp.cc b/src/third_party/boringssl/src/ssl/d1_srtp.cc
index 1e26152..1ccc849 100644
--- a/src/third_party/boringssl/src/ssl/d1_srtp.cc
+++ b/src/third_party/boringssl/src/ssl/d1_srtp.cc
@@ -147,8 +147,8 @@
                                 size_t len) {
   const SRTP_PROTECTION_PROFILE *p = kSRTPProfiles;
   while (p->name) {
-    if (len == OPENSSL_port_strlen(p->name) &&
-        !OPENSSL_port_strncmp(p->name, profile_name, len)) {
+    if (len == strlen(p->name) &&
+        !strncmp(p->name, profile_name, len)) {
       *pptr = p;
       return 1;
     }
@@ -172,12 +172,12 @@
   const char *col;
   const char *ptr = profiles_string;
   do {
-    col = OPENSSL_port_strchr(ptr, ':');
+    col = strchr(ptr, ':');
 
     const SRTP_PROTECTION_PROFILE *profile;
     if (!find_profile_by_name(
             ptr, &profile,
-            col ? (size_t)(col - ptr) : OPENSSL_port_strlen(ptr))) {
+            col ? (size_t)(col - ptr) : strlen(ptr))) {
       OPENSSL_PUT_ERROR(SSL, SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE);
       return 0;
     }
diff --git a/src/third_party/boringssl/src/ssl/handshake_server.cc b/src/third_party/boringssl/src/ssl/handshake_server.cc
index 8126321..df1c2f3 100644
--- a/src/third_party/boringssl/src/ssl/handshake_server.cc
+++ b/src/third_party/boringssl/src/ssl/handshake_server.cc
@@ -794,7 +794,7 @@
       size_t len =
           hs->config->psk_identity_hint == nullptr
               ? 0
-              : OPENSSL_port_strlen(hs->config->psk_identity_hint.get());
+              : strlen(hs->config->psk_identity_hint.get());
       if (!CBB_add_u16_length_prefixed(cbb.get(), &child) ||
           !CBB_add_bytes(&child,
                          (const uint8_t *)hs->config->psk_identity_hint.get(),
diff --git a/src/third_party/boringssl/src/ssl/s3_both.cc b/src/third_party/boringssl/src/ssl/s3_both.cc
index a169fc4..98896a3 100644
--- a/src/third_party/boringssl/src/ssl/s3_both.cc
+++ b/src/third_party/boringssl/src/ssl/s3_both.cc
@@ -551,15 +551,15 @@
     // wish to interpret them differently. (These do not overlap with
     // ClientHello or V2ClientHello.)
     const char *str = reinterpret_cast<const char*>(in.data());
-    if (OPENSSL_port_strncmp("GET ", str, 4) == 0 ||
-        OPENSSL_port_strncmp("POST ", str, 5) == 0 ||
-        OPENSSL_port_strncmp("HEAD ", str, 5) == 0 ||
-        OPENSSL_port_strncmp("PUT ", str, 4) == 0) {
+    if (strncmp("GET ", str, 4) == 0 ||
+        strncmp("POST ", str, 5) == 0 ||
+        strncmp("HEAD ", str, 5) == 0 ||
+        strncmp("PUT ", str, 4) == 0) {
       OPENSSL_PUT_ERROR(SSL, SSL_R_HTTP_REQUEST);
       *out_alert = 0;
       return ssl_open_record_error;
     }
-    if (OPENSSL_port_strncmp("CONNE", str, 5) == 0) {
+    if (strncmp("CONNE", str, 5) == 0) {
       OPENSSL_PUT_ERROR(SSL, SSL_R_HTTPS_PROXY_REQUEST);
       *out_alert = 0;
       return ssl_open_record_error;
diff --git a/src/third_party/boringssl/src/ssl/ssl_asn1.cc b/src/third_party/boringssl/src/ssl/ssl_asn1.cc
index 86b2b0a..f5c6492 100644
--- a/src/third_party/boringssl/src/ssl/ssl_asn1.cc
+++ b/src/third_party/boringssl/src/ssl/ssl_asn1.cc
@@ -254,7 +254,7 @@
     if (!CBB_add_asn1(&session, &child, kPSKIdentityTag) ||
         !CBB_add_asn1_octet_string(
             &child, (const uint8_t *)in->psk_identity.get(),
-            OPENSSL_port_strlen(in->psk_identity.get()))) {
+            strlen(in->psk_identity.get()))) {
       OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
       return 0;
     }
@@ -764,7 +764,7 @@
     // one.
     static const char kNotResumableSession[] = "NOT RESUMABLE";
 
-    *out_len = OPENSSL_port_strlen(kNotResumableSession);
+    *out_len = strlen(kNotResumableSession);
     *out_data = (uint8_t *)BUF_memdup(kNotResumableSession, *out_len);
     if (*out_data == NULL) {
       return 0;
diff --git a/src/third_party/boringssl/src/ssl/ssl_cipher.cc b/src/third_party/boringssl/src/ssl/ssl_cipher.cc
index a12c9ff..83f9e2b 100644
--- a/src/third_party/boringssl/src/ssl/ssl_cipher.cc
+++ b/src/third_party/boringssl/src/ssl/ssl_cipher.cc
@@ -662,8 +662,8 @@
 // rule_equals returns whether the NUL-terminated string |rule| is equal to the
 // |buf_len| bytes at |buf|.
 static bool rule_equals(const char *rule, const char *buf, size_t buf_len) {
-  // |OPENSSL_port_strncmp| alone only checks that |buf| is a prefix of |rule|.
-  return OPENSSL_port_strncmp(rule, buf, buf_len) == 0 && rule[buf_len] == '\0';
+  // |strncmp| alone only checks that |buf| is a prefix of |rule|.
+  return strncmp(rule, buf, buf_len) == 0 && rule[buf_len] == '\0';
 }
 
 static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr,
@@ -1100,7 +1100,7 @@
 
     // Ok, we have the rule, now apply it.
     if (rule == CIPHER_SPECIAL) {
-      if (buf_len != 8 || OPENSSL_port_strncmp(buf, "STRENGTH", 8) != 0) {
+      if (buf_len != 8 || strncmp(buf, "STRENGTH", 8) != 0) {
         OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMMAND);
         return false;
       }
@@ -1199,7 +1199,7 @@
   // If the rule_string begins with DEFAULT, apply the default rule before
   // using the (possibly available) additional rules.
   const char *rule_p = rule_str;
-  if (OPENSSL_port_strncmp(rule_str, "DEFAULT", 7) == 0) {
+  if (strncmp(rule_str, "DEFAULT", 7) == 0) {
     if (!ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST, &head, &tail,
                                     strict)) {
       return false;
diff --git a/src/third_party/boringssl/src/ssl/ssl_key_share.cc b/src/third_party/boringssl/src/ssl/ssl_key_share.cc
index a70fd86..c7f6f88 100644
--- a/src/third_party/boringssl/src/ssl/ssl_key_share.cc
+++ b/src/third_party/boringssl/src/ssl/ssl_key_share.cc
@@ -278,13 +278,13 @@
 
 int ssl_name_to_group_id(uint16_t *out_group_id, const char *name, size_t len) {
   for (const auto &group : kNamedGroups) {
-    if (len == OPENSSL_port_strlen(group.name) &&
-        !OPENSSL_port_strncmp(group.name, name, len)) {
+    if (len == strlen(group.name) &&
+        !strncmp(group.name, name, len)) {
       *out_group_id = group.group_id;
       return 1;
     }
-    if (len == OPENSSL_port_strlen(group.alias) &&
-        !OPENSSL_port_strncmp(group.alias, name, len)) {
+    if (len == strlen(group.alias) &&
+        !strncmp(group.alias, name, len)) {
       *out_group_id = group.group_id;
       return 1;
     }
diff --git a/src/third_party/boringssl/src/ssl/ssl_lib.cc b/src/third_party/boringssl/src/ssl/ssl_lib.cc
index c39e708..b8e6945 100644
--- a/src/third_party/boringssl/src/ssl/ssl_lib.cc
+++ b/src/third_party/boringssl/src/ssl/ssl_lib.cc
@@ -348,10 +348,9 @@
   ScopedCBB cbb;
   uint8_t *out;
   size_t out_len;
-  if (!CBB_init(cbb.get(), OPENSSL_port_strlen(label) + 1 +
+  if (!CBB_init(cbb.get(), strlen(label) + 1 +
                                SSL3_RANDOM_SIZE * 2 + 1 + secret_len * 2 + 1) ||
-      !CBB_add_bytes(cbb.get(), (const uint8_t *)label,
-                     OPENSSL_port_strlen(label)) ||
+      !CBB_add_bytes(cbb.get(), (const uint8_t *)label, strlen(label)) ||
       !CBB_add_bytes(cbb.get(), (const uint8_t *)" ", 1) ||
       !cbb_add_hex(cbb.get(), ssl->s3->client_random, SSL3_RANDOM_SIZE) ||
       !CBB_add_bytes(cbb.get(), (const uint8_t *)" ", 1) ||
@@ -1909,7 +1908,7 @@
     return 1;
   }
 
-  size_t len = OPENSSL_port_strlen(name);
+  size_t len = strlen(name);
   if (len == 0 || len > TLSEXT_MAXLEN_host_name) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME);
     return 0;
@@ -2354,8 +2353,7 @@
 
 static int use_psk_identity_hint(UniquePtr<char> *out,
                                  const char *identity_hint) {
-  if (identity_hint != NULL &&
-      OPENSSL_port_strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) {
+  if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_DATA_LENGTH_TOO_LONG);
     return 0;
   }
diff --git a/src/third_party/boringssl/src/ssl/ssl_privkey.cc b/src/third_party/boringssl/src/ssl/ssl_privkey.cc
index 49b32c5..0e42810 100644
--- a/src/third_party/boringssl/src/ssl/ssl_privkey.cc
+++ b/src/third_party/boringssl/src/ssl/ssl_privkey.cc
@@ -654,12 +654,12 @@
         }
         buf[buf_used] = 0;
 
-        if (OPENSSL_port_strcmp(buf, "RSA") == 0) {
+        if (strcmp(buf, "RSA") == 0) {
           pkey_type = EVP_PKEY_RSA;
-        } else if (OPENSSL_port_strcmp(buf, "RSA-PSS") == 0 ||
-                   OPENSSL_port_strcmp(buf, "PSS") == 0) {
+        } else if (strcmp(buf, "RSA-PSS") == 0 ||
+                   strcmp(buf, "PSS") == 0) {
           pkey_type = EVP_PKEY_RSA_PSS;
-        } else if (OPENSSL_port_strcmp(buf, "ECDSA") == 0) {
+        } else if (strcmp(buf, "ECDSA") == 0) {
           pkey_type = EVP_PKEY_EC;
         } else {
           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
@@ -686,7 +686,7 @@
           // No '+' was seen thus this is a TLS 1.3-style name.
           bool found = false;
           for (const auto &candidate : kSignatureAlgorithmNames) {
-            if (OPENSSL_port_strcmp(candidate.name, buf) == 0) {
+            if (strcmp(candidate.name, buf) == 0) {
               assert(out_i < num_elements);
               (*out)[out_i++] = candidate.signature_algorithm;
               found = true;
@@ -700,13 +700,13 @@
             return false;
           }
         } else {
-          if (OPENSSL_port_strcmp(buf, "SHA1") == 0) {
+          if (strcmp(buf, "SHA1") == 0) {
             hash_nid = NID_sha1;
-          } else if (OPENSSL_port_strcmp(buf, "SHA256") == 0) {
+          } else if (strcmp(buf, "SHA256") == 0) {
             hash_nid = NID_sha256;
-          } else if (OPENSSL_port_strcmp(buf, "SHA384") == 0) {
+          } else if (strcmp(buf, "SHA384") == 0) {
             hash_nid = NID_sha384;
-          } else if (OPENSSL_port_strcmp(buf, "SHA512") == 0) {
+          } else if (strcmp(buf, "SHA512") == 0) {
             hash_nid = NID_sha512;
           } else {
             OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
diff --git a/src/third_party/boringssl/src/ssl/t1_lib.cc b/src/third_party/boringssl/src/ssl/t1_lib.cc
index 4449733..ee796d0 100644
--- a/src/third_party/boringssl/src/ssl/t1_lib.cc
+++ b/src/third_party/boringssl/src/ssl/t1_lib.cc
@@ -355,7 +355,7 @@
   size_t count = 0;
   const char *ptr = curves, *col;
   do {
-    col = OPENSSL_port_strchr(ptr, ':');
+    col = strchr(ptr, ':');
     count++;
     if (col) {
       ptr = col + 1;
@@ -370,10 +370,10 @@
   size_t i = 0;
   ptr = curves;
   do {
-    col = OPENSSL_port_strchr(ptr, ':');
+    col = strchr(ptr, ':');
     if (!ssl_name_to_group_id(
             &group_ids[i++], ptr,
-            col ? (size_t)(col - ptr) : OPENSSL_port_strlen(ptr))) {
+            col ? (size_t)(col - ptr) : strlen(ptr))) {
       return false;
     }
     if (col) {
@@ -603,7 +603,7 @@
       !CBB_add_u8(&server_name_list, TLSEXT_NAMETYPE_host_name) ||
       !CBB_add_u16_length_prefixed(&server_name_list, &name) ||
       !CBB_add_bytes(&name, (const uint8_t *)ssl->hostname.get(),
-                     OPENSSL_port_strlen(ssl->hostname.get())) ||
+                     strlen(ssl->hostname.get())) ||
       !CBB_flush(out)) {
     return false;
   }
diff --git a/src/third_party/brotli/c/common/platform.h b/src/third_party/brotli/c/common/platform.h
index 203fc27..9a88230 100755
--- a/src/third_party/brotli/c/common/platform.h
+++ b/src/third_party/brotli/c/common/platform.h
@@ -9,13 +9,8 @@
 #ifndef BROTLI_COMMON_PLATFORM_H_
 #define BROTLI_COMMON_PLATFORM_H_
 
-#if !defined(STARBOARD)
 #include <string.h>  /* memcpy*/
 #define MEMCPY_PLATFORM memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_PLATFORM SbMemoryCopy
-#endif
 
 #include <brotli/port.h>
 #include <brotli/types.h>
diff --git a/src/third_party/brotli/c/dec/bit_reader.h b/src/third_party/brotli/c/dec/bit_reader.h
index b5a19c9..d16d85f 100644
--- a/src/third_party/brotli/c/dec/bit_reader.h
+++ b/src/third_party/brotli/c/dec/bit_reader.h
@@ -9,13 +9,8 @@
 #ifndef BROTLI_DEC_BIT_READER_H_
 #define BROTLI_DEC_BIT_READER_H_
 
-#if !defined(STARBOARD)
 #include <string.h>  /* memcpy*/
 #define MEMCPY_BIT_READER memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_BIT_READER SbMemoryCopy
-#endif
 
 #include "../common/platform.h"
 #include <brotli/types.h>
diff --git a/src/third_party/brotli/c/enc/memory.h b/src/third_party/brotli/c/enc/memory.h
index e7bd330..1fffc38 100644
--- a/src/third_party/brotli/c/enc/memory.h
+++ b/src/third_party/brotli/c/enc/memory.h
@@ -9,13 +9,8 @@
 #ifndef BROTLI_ENC_MEMORY_H_
 #define BROTLI_ENC_MEMORY_H_
 
-#if !defined(STARBOARD)
 #include <string.h>  /* memcpy*/
 #define MEMCPY_MEMORY memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_MEMORY SbMemoryCopy
-#endif
 
 #include "../common/platform.h"
 #include <brotli/types.h>
diff --git a/src/third_party/brotli/c/enc/ringbuffer.h b/src/third_party/brotli/c/enc/ringbuffer.h
index 138e011..dad4fc6 100644
--- a/src/third_party/brotli/c/enc/ringbuffer.h
+++ b/src/third_party/brotli/c/enc/ringbuffer.h
@@ -9,13 +9,8 @@
 #ifndef BROTLI_ENC_RINGBUFFER_H_
 #define BROTLI_ENC_RINGBUFFER_H_
 
-#if !defined(STARBOARD)
 #include <string.h>  /* memcpy*/
 #define MEMCPY_RINGBUFFER memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_RINGBUFFER SbMemoryCopy
-#endif
 
 #include "../common/platform.h"
 #include <brotli/types.h>
diff --git a/src/third_party/crashpad/client/annotation.h b/src/third_party/crashpad/client/annotation.h
index 6bf1d2c..46cde62 100644
--- a/src/third_party/crashpad/client/annotation.h
+++ b/src/third_party/crashpad/client/annotation.h
@@ -27,7 +27,6 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_piece.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace crashpad {
 
@@ -98,7 +97,7 @@
   //! \param[in] value A value used to create a user-defined type.
   //!
   //! \returns The value added to Type::kUserDefinedStart and casted.
-  CONSTEXPR static Type UserDefinedType(uint16_t value) {
+  constexpr static Type UserDefinedType(uint16_t value) {
     using UnderlyingType = std::underlying_type<Type>::type;
     // MSVS 2015 doesn't have full C++14 support and complains about local
     // variables defined in a constexpr function, which is valid. Avoid them
@@ -129,7 +128,7 @@
   //! \param[in] value_ptr A pointer to the value for the annotation. The
   //!     pointer may not be changed once associated with an annotation, but
   //!     the data may be mutated.
-  CONSTEXPR Annotation(Type type, const char name[], void* const value_ptr)
+  constexpr Annotation(Type type, const char name[], void* const value_ptr)
       : link_node_(nullptr),
         name_(name),
         value_ptr_(value_ptr),
@@ -205,7 +204,7 @@
   //! \brief Constructs a new StringAnnotation with the given \a name.
   //!
   //! \param[in] name The Annotation name.
-  CONSTEXPR explicit StringAnnotation(const char name[])
+  constexpr explicit StringAnnotation(const char name[])
       : Annotation(Type::kString, name, value_), value_() {}
 
   //! \brief Constructs a new StringAnnotation with the given \a name.
@@ -224,7 +223,7 @@
   //!
   //! \param[in] name The Annotation name.
   //! \param[in] tag A constructor tag.
-  CONSTEXPR StringAnnotation(const char name[], Tag tag)
+  constexpr StringAnnotation(const char name[], Tag tag)
       : StringAnnotation(name) {}
 
   //! \brief Sets the Annotation's string value.
diff --git a/src/third_party/crashpad/client/crash_report_database.cc b/src/third_party/crashpad/client/crash_report_database.cc
index 32be91c..eda0ef4 100644
--- a/src/third_party/crashpad/client/crash_report_database.cc
+++ b/src/third_party/crashpad/client/crash_report_database.cc
@@ -16,7 +16,6 @@
 
 #include "base/logging.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace crashpad {
 
diff --git a/src/third_party/crashpad/client/crash_report_database_generic.cc b/src/third_party/crashpad/client/crash_report_database_generic.cc
index e807f17..eec0db4 100644
--- a/src/third_party/crashpad/client/crash_report_database_generic.cc
+++ b/src/third_party/crashpad/client/crash_report_database_generic.cc
@@ -25,7 +25,6 @@
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "client/settings.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/directory_reader.h"
 #include "util/file/filesystem.h"
 #include "util/misc/initialization_state_dcheck.h"
diff --git a/src/third_party/crashpad/client/prune_crash_reports.cc b/src/third_party/crashpad/client/prune_crash_reports.cc
index 6a7bc13..8eed18d 100644
--- a/src/third_party/crashpad/client/prune_crash_reports.cc
+++ b/src/third_party/crashpad/client/prune_crash_reports.cc
@@ -22,7 +22,6 @@
 
 #include "base/logging.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace crashpad {
 
diff --git a/src/third_party/crashpad/compat/BUILD.gn b/src/third_party/crashpad/compat/BUILD.gn
index d4452f4..56a675a 100644
--- a/src/third_party/crashpad/compat/BUILD.gn
+++ b/src/third_party/crashpad/compat/BUILD.gn
@@ -90,7 +90,7 @@
     ]
   }
 
-  if (crashpad_is_android) {
+  if (!crashpad_is_in_starboard && crashpad_is_android) {
     sources += [
       "android/android/api-level.cc",
       "android/android/api-level.h",
diff --git a/src/third_party/crashpad/handler/linux/exception_handler_server.cc b/src/third_party/crashpad/handler/linux/exception_handler_server.cc
index 63215d5..3c62e40 100644
--- a/src/third_party/crashpad/handler/linux/exception_handler_server.cc
+++ b/src/third_party/crashpad/handler/linux/exception_handler_server.cc
@@ -30,7 +30,6 @@
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_number_conversions.h"
 #include "build/build_config.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_io.h"
 #include "util/file/filesystem.h"
 #include "util/linux/proc_task_reader.h"
diff --git a/src/third_party/crashpad/minidump/minidump_annotation_writer.cc b/src/third_party/crashpad/minidump/minidump_annotation_writer.cc
index 1f12309..54a3ecb 100644
--- a/src/third_party/crashpad/minidump/minidump_annotation_writer.cc
+++ b/src/third_party/crashpad/minidump/minidump_annotation_writer.cc
@@ -17,7 +17,6 @@
 #include <memory>
 
 #include "base/logging.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_writer.h"
 #include "util/numeric/safe_assignment.h"
 
diff --git a/src/third_party/crashpad/minidump/minidump_context_writer.cc b/src/third_party/crashpad/minidump/minidump_context_writer.cc
index fb4bdfe..d7e53a4 100644
--- a/src/third_party/crashpad/minidump/minidump_context_writer.cc
+++ b/src/third_party/crashpad/minidump/minidump_context_writer.cc
@@ -21,7 +21,6 @@
 
 #include "base/compiler_specific.h"
 #include "base/logging.h"
-#include "nb/cpp14oncpp11.h"
 #include "snapshot/cpu_context.h"
 #include "util/file/file_writer.h"
 #include "util/stdlib/aligned_allocator.h"
diff --git a/src/third_party/crashpad/minidump/minidump_crashpad_info_writer.cc b/src/third_party/crashpad/minidump/minidump_crashpad_info_writer.cc
index 1bd3398..93be421 100644
--- a/src/third_party/crashpad/minidump/minidump_crashpad_info_writer.cc
+++ b/src/third_party/crashpad/minidump/minidump_crashpad_info_writer.cc
@@ -19,7 +19,6 @@
 #include "base/logging.h"
 #include "minidump/minidump_module_crashpad_info_writer.h"
 #include "minidump/minidump_simple_string_dictionary_writer.h"
-#include "nb/cpp14oncpp11.h"
 #include "snapshot/process_snapshot.h"
 #include "util/file/file_writer.h"
 
diff --git a/src/third_party/crashpad/minidump/minidump_simple_string_dictionary_writer.cc b/src/third_party/crashpad/minidump/minidump_simple_string_dictionary_writer.cc
index 2b51605..90f9430 100644
--- a/src/third_party/crashpad/minidump/minidump_simple_string_dictionary_writer.cc
+++ b/src/third_party/crashpad/minidump/minidump_simple_string_dictionary_writer.cc
@@ -17,7 +17,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_writer.h"
 #include "util/numeric/safe_assignment.h"
 
diff --git a/src/third_party/crashpad/minidump/minidump_string_writer.cc b/src/third_party/crashpad/minidump/minidump_string_writer.cc
index 74c3389..f01fc84 100644
--- a/src/third_party/crashpad/minidump/minidump_string_writer.cc
+++ b/src/third_party/crashpad/minidump/minidump_string_writer.cc
@@ -18,7 +18,6 @@
 
 #include "base/logging.h"
 #include "minidump/minidump_writer_util.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_writer.h"
 #include "util/numeric/safe_assignment.h"
 
diff --git a/src/third_party/crashpad/minidump/minidump_unloaded_module_writer.cc b/src/third_party/crashpad/minidump/minidump_unloaded_module_writer.cc
index 3f5a4f9..855e196 100644
--- a/src/third_party/crashpad/minidump/minidump_unloaded_module_writer.cc
+++ b/src/third_party/crashpad/minidump/minidump_unloaded_module_writer.cc
@@ -18,7 +18,6 @@
 #include <utility>
 
 #include "minidump/minidump_writer_util.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_writer.h"
 #include "util/numeric/in_range_cast.h"
 #include "util/numeric/safe_assignment.h"
diff --git a/src/third_party/crashpad/test/linux/fake_ptrace_connection.cc b/src/third_party/crashpad/test/linux/fake_ptrace_connection.cc
index 564b9ef..b03228a 100644
--- a/src/third_party/crashpad/test/linux/fake_ptrace_connection.cc
+++ b/src/third_party/crashpad/test/linux/fake_ptrace_connection.cc
@@ -18,7 +18,6 @@
 
 #include "build/build_config.h"
 #include "gtest/gtest.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_io.h"
 
 namespace crashpad {
diff --git a/src/third_party/crashpad/util/linux/ptrace_client.cc b/src/third_party/crashpad/util/linux/ptrace_client.cc
index 9872596..f097ad9 100644
--- a/src/third_party/crashpad/util/linux/ptrace_client.cc
+++ b/src/third_party/crashpad/util/linux/ptrace_client.cc
@@ -22,7 +22,6 @@
 #include "base/logging.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_io.h"
 #include "util/linux/ptrace_broker.h"
 #include "util/process/process_memory_linux.h"
diff --git a/src/third_party/crashpad/util/net/http_transport_socket.cc b/src/third_party/crashpad/util/net/http_transport_socket.cc
index 278a8b8..a2870cc 100644
--- a/src/third_party/crashpad/util/net/http_transport_socket.cc
+++ b/src/third_party/crashpad/util/net/http_transport_socket.cc
@@ -29,7 +29,6 @@
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_io.h"
 #include "util/net/http_body.h"
 #include "util/net/url.h"
diff --git a/src/third_party/crashpad/util/stream/file_encoder.cc b/src/third_party/crashpad/util/stream/file_encoder.cc
index 51d2e1d..bb2c41a 100644
--- a/src/third_party/crashpad/util/stream/file_encoder.cc
+++ b/src/third_party/crashpad/util/stream/file_encoder.cc
@@ -18,7 +18,6 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "nb/cpp14oncpp11.h"
 #include "util/file/file_io.h"
 #include "util/file/file_reader.h"
 #include "util/file/scoped_remove_file.h"
diff --git a/src/third_party/freetype2/include/freetype/config/ftstdlib.h b/src/third_party/freetype2/include/freetype/config/ftstdlib.h
index 6cbbcca..88fb9cf 100644
--- a/src/third_party/freetype2/include/freetype/config/ftstdlib.h
+++ b/src/third_party/freetype2/include/freetype/config/ftstdlib.h
@@ -76,22 +76,6 @@
 #include <string.h>
 
 #define ft_memchr memchr
-
-#if defined(STARBOARD)
-#include "starboard/string.h"
-#include "starboard/memory.h"
-#define ft_memcmp   SbMemoryCompare
-#define ft_memcpy   SbMemoryCopy
-#define ft_memmove  SbMemoryMove
-#define ft_memset   SbMemorySet
-#define ft_strcat   SbStringConcatUnsafe
-#define ft_strcmp   SbStringCompareAll
-#define ft_strcpy   SbStringCopyUnsafe
-#define ft_strlen   SbStringGetLength
-#define ft_strncmp  SbStringCompare
-#define ft_strncpy  SbStringCopy
-#define ft_strrchr  SbStringFindLastCharacter
-#else
 #define ft_memcmp   memcmp
 #define ft_memcpy   memcpy
 #define ft_memmove  memmove
@@ -103,8 +87,8 @@
 #define ft_strncmp  strncmp
 #define ft_strncpy  strncpy
 #define ft_strrchr  strrchr
-#endif
 #define ft_strstr   strstr
+
   /**************************************************************************
    *
    *                          file handling
@@ -164,7 +148,7 @@
     return NULL;
   }
 
-  SbMemorySet(memory, 0, size);
+  memset(memory, 0, size);
   return memory;
 }
 #define ft_sfree     SbMemoryDeallocate
diff --git a/src/third_party/harfbuzz-ng/src/hb-starboard.hh b/src/third_party/harfbuzz-ng/src/hb-starboard.hh
index 0a9995e..755a77f 100644
--- a/src/third_party/harfbuzz-ng/src/hb-starboard.hh
+++ b/src/third_party/harfbuzz-ng/src/hb-starboard.hh
@@ -15,6 +15,8 @@
 #ifndef HB_STARBOARD_HH
 #define HB_STARBOARD_HH
 
+#include <string.h>
+
 #include "starboard/memory.h"
 #include "starboard/common/string.h"
 #include "starboard/system.h"
@@ -29,17 +31,7 @@
 #undef assert
 #define assert SB_DCHECK
 #define getenv(x) NULL
-#define memcpy SbMemoryCopy
-#define memmove SbMemoryMove
-#define memset SbMemorySet
 #define snprintf SbStringFormatF
-#define strchr (char *)SbStringFindCharacter
-#define strcmp SbStringCompareAll
-#define strcpy SbStringCopyUnsafe
 #define strdup SbStringDuplicate
-#define strlen SbStringGetLength
-#define strncmp SbStringCompare
-#define strncpy SbStringCopy
-#define strstr SbStringFindString
 
 #endif  // HB_STARBOARD_HH
diff --git a/src/third_party/icu/source/common/cwchar.h b/src/third_party/icu/source/common/cwchar.h
index e166480..482b759 100644
--- a/src/third_party/icu/source/common/cwchar.h
+++ b/src/third_party/icu/source/common/cwchar.h
@@ -42,10 +42,9 @@
 
 /* The following are not available on all systems, defined in wchar.h or string.h. */
 #if defined(STARBOARD)
-#   include "starboard/string.h"
-#   define uprv_wcscpy SbStringCopyWide
-#   define uprv_wcscat SbStringConcatWide
-#   define uprv_wcslen SbStringGetLengthWide
+#   define uprv_wcscpy wcscpy
+#   define uprv_wcscat wcscat
+#   define uprv_wcslen wcslen
 #elif U_HAVE_WCSCPY
 #   define uprv_wcscpy wcscpy
 #   define uprv_wcscat wcscat
diff --git a/src/third_party/icu/source/i18n/upluralrules.cpp b/src/third_party/icu/source/i18n/upluralrules.cpp
index 73e59a7..c543590 100644
--- a/src/third_party/icu/source/i18n/upluralrules.cpp
+++ b/src/third_party/icu/source/i18n/upluralrules.cpp
@@ -9,6 +9,8 @@
 
 #include "unicode/utypes.h"
 
+#include <cstring>
+
 #if !UCONFIG_NO_FORMATTING
 
 #include "unicode/upluralrules.h"
diff --git a/src/third_party/libdav1d/include/common/starboard_memory.h b/src/third_party/libdav1d/include/common/starboard_memory.h
index 07a162c..146ce6b 100644
--- a/src/third_party/libdav1d/include/common/starboard_memory.h
+++ b/src/third_party/libdav1d/include/common/starboard_memory.h
@@ -26,16 +26,6 @@
 #endif
 #define realloc SbMemoryReallocate
 
-#ifdef memcpy
-#undef memcpy
-#endif
-#define memcpy SbMemoryCopy
-
-#ifdef memset
-#undef memset
-#endif
-#define memset SbMemorySet
-
 #ifdef free
 #undef free
 #endif
diff --git a/src/third_party/libevent/BUILD.gn b/src/third_party/libevent/BUILD.gn
index 597d42c..7d1fb6b 100644
--- a/src/third_party/libevent/BUILD.gn
+++ b/src/third_party/libevent/BUILD.gn
@@ -65,7 +65,9 @@
     }
     if (is_android) {
       include_dirs += [ "starboard/linux" ]
-      libs = [ "rt" ]
+      if (current_toolchain == host_toolchain) {
+        libs = [ "rt" ]
+      }
     }
     cflags_c = [ "-Wno-unused-function" ]
     public_deps = [ "//starboard/common" ]
diff --git a/src/third_party/libjpeg-turbo/jinclude.h b/src/third_party/libjpeg-turbo/jinclude.h
index 572d835..3a1b3fe 100644
--- a/src/third_party/libjpeg-turbo/jinclude.h
+++ b/src/third_party/libjpeg-turbo/jinclude.h
@@ -66,8 +66,8 @@
 #if defined(NEED_STARBOARD_MEMORY)
 
 #include "starboard/memory.h"
-#define MEMZERO(target,size)	SbMemorySet((void *)(target), 0, (size_t)(size))
-#define MEMCOPY(dest,src,size)	SbMemoryCopy((void *)(dest), (const void *)(src), (size_t)(size))
+#define MEMZERO(target,size)	memset((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size)	memcpy((void *)(dest), (const void *)(src), (size_t)(size))
 
 #elif NEED_BSD_STRINGS
 
diff --git a/src/third_party/libjpeg-turbo/turbojpeg.c b/src/third_party/libjpeg-turbo/turbojpeg.c
index 00d3521..5a9f366 100644
--- a/src/third_party/libjpeg-turbo/turbojpeg.c
+++ b/src/third_party/libjpeg-turbo/turbojpeg.c
@@ -30,6 +30,7 @@
    libjpeg-turbo */
 
 #include <stdlib.h>
+#include <string.h>
 
 #include <jinclude.h>
 
diff --git a/src/third_party/libjpeg/jinclude.h b/src/third_party/libjpeg/jinclude.h
index 7954e8d..90f5b6e 100644
--- a/src/third_party/libjpeg/jinclude.h
+++ b/src/third_party/libjpeg/jinclude.h
@@ -66,8 +66,8 @@
 #elif defined(NEED_STARBOARD_MEMORY)
 
 #include "starboard/memory.h"
-#define MEMZERO(target,size)	SbMemorySet((void *)(target), 0, (size_t)(size))
-#define MEMCOPY(dest,src,size)	SbMemoryCopy((void *)(dest), (const void *)(src), (size_t)(size))
+#define MEMZERO(target,size)	memset((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size)	memcpy((void *)(dest), (const void *)(src), (size_t)(size))
 
 #else /* not BSD, assume ANSI/SysV string lib */
 
diff --git a/src/third_party/libwebp/examples/stopwatch.h b/src/third_party/libwebp/examples/stopwatch.h
index 6ce3827..f9e799c 100644
--- a/src/third_party/libwebp/examples/stopwatch.h
+++ b/src/third_party/libwebp/examples/stopwatch.h
@@ -51,7 +51,7 @@
 static WEBP_INLINE double StopwatchReadAndReset(Stopwatch* watch) {
   struct timeval old_value;
   double delta_sec, delta_usec;
-  SbMemoryCopy(&old_value, watch, sizeof(old_value));
+  memcpy(&old_value, watch, sizeof(old_value));
   gettimeofday(watch, NULL);
   delta_sec = (double)watch->tv_sec - old_value.tv_sec;
   delta_usec = (double)watch->tv_usec - old_value.tv_usec;
diff --git a/src/third_party/libwebp/src/utils/bit_reader_inl_utils.h b/src/third_party/libwebp/src/utils/bit_reader_inl_utils.h
index 5b50a3c..bf11a07 100644
--- a/src/third_party/libwebp/src/utils/bit_reader_inl_utils.h
+++ b/src/third_party/libwebp/src/utils/bit_reader_inl_utils.h
@@ -79,7 +79,7 @@
     );
 #else
     lbit_t in_bits;
-    SbMemoryCopy(&in_bits, br->buf_, sizeof(in_bits));
+    memcpy(&in_bits, br->buf_, sizeof(in_bits));
 #endif
     br->buf_ += BITS >> 3;
 #if !defined(WORDS_BIGENDIAN)
diff --git a/src/third_party/libwebp/src/utils/utils.h b/src/third_party/libwebp/src/utils/utils.h
index 7d430da..4b2bf1c 100644
--- a/src/third_party/libwebp/src/utils/utils.h
+++ b/src/third_party/libwebp/src/utils/utils.h
@@ -74,11 +74,11 @@
 // memcpy() is the safe way of moving potentially unaligned 32b memory.
 static WEBP_INLINE uint32_t WebPMemToUint32(const uint8_t* const ptr) {
   uint32_t A;
-  SbMemoryCopy(&A, ptr, sizeof(A));
+  memcpy(&A, ptr, sizeof(A));
   return A;
 }
 static WEBP_INLINE void WebPUint32ToMem(uint8_t* const ptr, uint32_t val) {
-  SbMemoryCopy(ptr, &val, sizeof(val));
+  memcpy(ptr, &val, sizeof(val));
 }
 
 //------------------------------------------------------------------------------
diff --git a/src/third_party/libwebp/src/webp/mux_types.h b/src/third_party/libwebp/src/webp/mux_types.h
index d11a4d1..fcc9304 100644
--- a/src/third_party/libwebp/src/webp/mux_types.h
+++ b/src/third_party/libwebp/src/webp/mux_types.h
@@ -69,7 +69,7 @@
 // Initializes the contents of the 'webp_data' object with default values.
 static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {
   if (webp_data != NULL) {
-    SbMemorySet(webp_data, 0, sizeof(*webp_data));
+    memset(webp_data, 0, sizeof(*webp_data));
   }
 }
 
@@ -90,7 +90,7 @@
   if (src->bytes != NULL && src->size != 0) {
     dst->bytes = (uint8_t*)SbMemoryAllocate(src->size);
     if (dst->bytes == NULL) return 0;
-    SbMemoryCopy((void*)dst->bytes, src->bytes, src->size);
+    memcpy((void*)dst->bytes, src->bytes, src->size);
     dst->size = src->size;
   }
   return 1;
diff --git a/src/third_party/mini_chromium/base/numerics/checked_math.h b/src/third_party/mini_chromium/base/numerics/checked_math.h
index 4a2b37d..6b918c4 100644
--- a/src/third_party/mini_chromium/base/numerics/checked_math.h
+++ b/src/third_party/mini_chromium/base/numerics/checked_math.h
@@ -11,7 +11,6 @@
 #include <type_traits>
 
 #include "base/numerics/checked_math_impl.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 namespace internal {
@@ -24,11 +23,11 @@
  public:
   using type = T;
 
-  CONSTEXPR CheckedNumeric() = default;
+  constexpr CheckedNumeric() = default;
 
   // Copy constructor.
   template <typename Src>
-  CONSTEXPR CheckedNumeric(const CheckedNumeric<Src>& rhs)
+  constexpr CheckedNumeric(const CheckedNumeric<Src>& rhs)
       : state_(rhs.state_.value(), rhs.IsValid()) {}
 
   template <typename Src>
@@ -37,7 +36,7 @@
   // This is not an explicit constructor because we implicitly upgrade regular
   // numerics to CheckedNumerics to make them easier to use.
   template <typename Src>
-  CONSTEXPR CheckedNumeric(Src value)  // NOLINT(runtime/explicit)
+  constexpr CheckedNumeric(Src value)  // NOLINT(runtime/explicit)
       : state_(value) {
     static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric.");
   }
@@ -45,7 +44,7 @@
   // This is not an explicit constructor because we want a seamless conversion
   // from StrictNumeric types.
   template <typename Src>
-  CONSTEXPR CheckedNumeric(
+  constexpr CheckedNumeric(
       StrictNumeric<Src> value)  // NOLINT(runtime/explicit)
       : state_(static_cast<Src>(value)) {}
 
@@ -53,7 +52,7 @@
   // A range checked destination type can be supplied using the Dst template
   // parameter.
   template <typename Dst = T>
-  CONSTEXPR bool IsValid() const {
+  constexpr bool IsValid() const {
     return state_.is_valid() &&
            IsValueInRangeForNumericType<Dst>(state_.value());
   }
@@ -67,7 +66,7 @@
 #elif defined(_MSC_VER)
   _Check_return_
 #endif
-  CONSTEXPR bool
+  constexpr bool
   AssignIfValid(Dst* result) const {
     return BASE_NUMERICS_LIKELY(IsValid<Dst>())
                ? ((*result = static_cast<Dst>(state_.value())), true)
@@ -83,7 +82,7 @@
   // template parameter, for test code, etc. However, the handler cannot access
   // the underlying value, and it is not available through other means.
   template <typename Dst = T, class CheckHandler = CheckOnFailure>
-  CONSTEXPR StrictNumeric<Dst> ValueOrDie() const {
+  constexpr StrictNumeric<Dst> ValueOrDie() const {
     return BASE_NUMERICS_LIKELY(IsValid<Dst>())
                ? static_cast<Dst>(state_.value())
                : CheckHandler::template HandleFailure<Dst>();
@@ -96,7 +95,7 @@
   // parameter. WARNING: This function may fail to compile or CHECK at runtime
   // if the supplied default_value is not within range of the destination type.
   template <typename Dst = T, typename Src>
-  CONSTEXPR StrictNumeric<Dst> ValueOrDefault(const Src default_value) const {
+  constexpr StrictNumeric<Dst> ValueOrDefault(const Src default_value) const {
     return BASE_NUMERICS_LIKELY(IsValid<Dst>())
                ? static_cast<Dst>(state_.value())
                : checked_cast<Dst>(default_value);
@@ -106,7 +105,7 @@
   // CheckedNumeric. If the current state is invalid or the destination cannot
   // represent the result then the returned CheckedNumeric will be invalid.
   template <typename Dst>
-  CONSTEXPR CheckedNumeric<typename UnderlyingType<Dst>::type> Cast() const {
+  constexpr CheckedNumeric<typename UnderlyingType<Dst>::type> Cast() const {
     return *this;
   }
 
@@ -118,27 +117,27 @@
 
   // Prototypes for the supported arithmetic operator overloads.
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator+=(const Src rhs);
+  constexpr CheckedNumeric& operator+=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator-=(const Src rhs);
+  constexpr CheckedNumeric& operator-=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator*=(const Src rhs);
+  constexpr CheckedNumeric& operator*=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator/=(const Src rhs);
+  constexpr CheckedNumeric& operator/=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator%=(const Src rhs);
+  constexpr CheckedNumeric& operator%=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator<<=(const Src rhs);
+  constexpr CheckedNumeric& operator<<=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator>>=(const Src rhs);
+  constexpr CheckedNumeric& operator>>=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator&=(const Src rhs);
+  constexpr CheckedNumeric& operator&=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator|=(const Src rhs);
+  constexpr CheckedNumeric& operator|=(const Src rhs);
   template <typename Src>
-  CONSTEXPR CheckedNumeric& operator^=(const Src rhs);
+  constexpr CheckedNumeric& operator^=(const Src rhs);
 
-  CONSTEXPR CheckedNumeric operator-() const {
+  constexpr CheckedNumeric operator-() const {
     // The negation of two's complement int min is int min, so we simply
     // check for that in the constexpr case.
     // We use an optimized code path for a known run-time variable.
@@ -153,17 +152,17 @@
                : FastRuntimeNegate();
   }
 
-  CONSTEXPR CheckedNumeric operator~() const {
+  constexpr CheckedNumeric operator~() const {
     return CheckedNumeric<decltype(InvertWrapper(T()))>(
         InvertWrapper(state_.value()), IsValid());
   }
 
-  CONSTEXPR CheckedNumeric Abs() const {
+  constexpr CheckedNumeric Abs() const {
     return !IsValueNegative(state_.value()) ? *this : -*this;
   }
 
   template <typename U>
-  CONSTEXPR CheckedNumeric<typename MathWrapper<CheckedMaxOp, T, U>::type> Max(
+  constexpr CheckedNumeric<typename MathWrapper<CheckedMaxOp, T, U>::type> Max(
       const U rhs) const {
     using R = typename UnderlyingType<U>::type;
     using result_type = typename MathWrapper<CheckedMaxOp, T, U>::type;
@@ -178,7 +177,7 @@
   }
 
   template <typename U>
-  CONSTEXPR CheckedNumeric<typename MathWrapper<CheckedMinOp, T, U>::type> Min(
+  constexpr CheckedNumeric<typename MathWrapper<CheckedMinOp, T, U>::type> Min(
       const U rhs) const {
     using R = typename UnderlyingType<U>::type;
     using result_type = typename MathWrapper<CheckedMinOp, T, U>::type;
@@ -195,29 +194,29 @@
   // This function is available only for integral types. It returns an unsigned
   // integer of the same width as the source type, containing the absolute value
   // of the source, and properly handling signed min.
-  CONSTEXPR CheckedNumeric<typename UnsignedOrFloatForSize<T>::type>
+  constexpr CheckedNumeric<typename UnsignedOrFloatForSize<T>::type>
   UnsignedAbs() const {
     return CheckedNumeric<typename UnsignedOrFloatForSize<T>::type>(
         SafeUnsignedAbs(state_.value()), state_.is_valid());
   }
 
-  CONSTEXPR CheckedNumeric& operator++() {
+  constexpr CheckedNumeric& operator++() {
     *this += 1;
     return *this;
   }
 
-  CONSTEXPR CheckedNumeric operator++(int) {
+  constexpr CheckedNumeric operator++(int) {
     CheckedNumeric value = *this;
     *this += 1;
     return value;
   }
 
-  CONSTEXPR CheckedNumeric& operator--() {
+  constexpr CheckedNumeric& operator--() {
     *this -= 1;
     return *this;
   }
 
-  CONSTEXPR CheckedNumeric operator--(int) {
+  constexpr CheckedNumeric operator--(int) {
     CheckedNumeric value = *this;
     *this -= 1;
     return value;
@@ -228,7 +227,7 @@
   template <template <typename, typename, typename> class M,
             typename L,
             typename R>
-  static CONSTEXPR CheckedNumeric MathOp(const L lhs, const R rhs) {
+  static constexpr CheckedNumeric MathOp(const L lhs, const R rhs) {
     using Math = typename MathWrapper<M, L, R>::math;
     T result = 0;
     bool is_valid =
@@ -239,7 +238,7 @@
 
   // Assignment arithmetic operations.
   template <template <typename, typename, typename> class M, typename R>
-  CONSTEXPR CheckedNumeric& MathOp(const R rhs) {
+  constexpr CheckedNumeric& MathOp(const R rhs) {
     using Math = typename MathWrapper<M, T, R>::math;
     T result = 0;  // Using T as the destination saves a range check.
     bool is_valid = state_.is_valid() && Wrapper<R>::is_valid(rhs) &&
@@ -258,31 +257,31 @@
   }
 
   template <typename Src>
-  CONSTEXPR CheckedNumeric(Src value, bool is_valid)
+  constexpr CheckedNumeric(Src value, bool is_valid)
       : state_(value, is_valid) {}
 
   // These wrappers allow us to handle state the same way for both
   // CheckedNumeric and POD arithmetic types.
   template <typename Src>
   struct Wrapper {
-    static CONSTEXPR bool is_valid(Src) { return true; }
-    static CONSTEXPR Src value(Src value) { return value; }
+    static constexpr bool is_valid(Src) { return true; }
+    static constexpr Src value(Src value) { return value; }
   };
 
   template <typename Src>
   struct Wrapper<CheckedNumeric<Src>> {
-    static CONSTEXPR bool is_valid(const CheckedNumeric<Src> v) {
+    static constexpr bool is_valid(const CheckedNumeric<Src> v) {
       return v.IsValid();
     }
-    static CONSTEXPR Src value(const CheckedNumeric<Src> v) {
+    static constexpr Src value(const CheckedNumeric<Src> v) {
       return v.state_.value();
     }
   };
 
   template <typename Src>
   struct Wrapper<StrictNumeric<Src>> {
-    static CONSTEXPR bool is_valid(const StrictNumeric<Src>) { return true; }
-    static CONSTEXPR Src value(const StrictNumeric<Src> v) {
+    static constexpr bool is_valid(const StrictNumeric<Src>) { return true; }
+    static constexpr Src value(const StrictNumeric<Src> v) {
       return static_cast<Src>(v);
     }
   };
@@ -290,18 +289,18 @@
 
 // Convenience functions to avoid the ugly template disambiguator syntax.
 template <typename Dst, typename Src>
-CONSTEXPR bool IsValidForType(const CheckedNumeric<Src> value) {
+constexpr bool IsValidForType(const CheckedNumeric<Src> value) {
   return value.template IsValid<Dst>();
 }
 
 template <typename Dst, typename Src>
-CONSTEXPR StrictNumeric<Dst> ValueOrDieForType(
+constexpr StrictNumeric<Dst> ValueOrDieForType(
     const CheckedNumeric<Src> value) {
   return value.template ValueOrDie<Dst>();
 }
 
 template <typename Dst, typename Src, typename Default>
-CONSTEXPR StrictNumeric<Dst> ValueOrDefaultForType(
+constexpr StrictNumeric<Dst> ValueOrDefaultForType(
     const CheckedNumeric<Src> value,
     const Default default_value) {
   return value.template ValueOrDefault<Dst>(default_value);
@@ -310,7 +309,7 @@
 // Convience wrapper to return a new CheckedNumeric from the provided arithmetic
 // or CheckedNumericType.
 template <typename T>
-CONSTEXPR CheckedNumeric<typename UnderlyingType<T>::type> MakeCheckedNum(
+constexpr CheckedNumeric<typename UnderlyingType<T>::type> MakeCheckedNum(
     const T value) {
   return value;
 }
@@ -319,7 +318,7 @@
 template <template <typename, typename, typename> class M,
           typename L,
           typename R>
-CONSTEXPR CheckedNumeric<typename MathWrapper<M, L, R>::type> CheckMathOp(
+constexpr CheckedNumeric<typename MathWrapper<M, L, R>::type> CheckMathOp(
     const L lhs,
     const R rhs) {
   using Math = typename MathWrapper<M, L, R>::math;
@@ -332,7 +331,7 @@
           typename L,
           typename R,
           typename... Args>
-CONSTEXPR CheckedNumeric<typename ResultType<M, L, R, Args...>::type>
+constexpr CheckedNumeric<typename ResultType<M, L, R, Args...>::type>
 CheckMathOp(const L lhs, const R rhs, const Args... args) {
   return CheckMathOp<M>(CheckMathOp<M>(lhs, rhs), args...);
 }
diff --git a/src/third_party/mini_chromium/base/numerics/checked_math_impl.h b/src/third_party/mini_chromium/base/numerics/checked_math_impl.h
index dc7e0cb..6aab501 100644
--- a/src/third_party/mini_chromium/base/numerics/checked_math_impl.h
+++ b/src/third_party/mini_chromium/base/numerics/checked_math_impl.h
@@ -16,13 +16,12 @@
 
 #include "base/numerics/safe_conversions.h"
 #include "base/numerics/safe_math_shared_impl.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 namespace internal {
 
 template <typename T>
-CONSTEXPR bool CheckedAddImpl(T x, T y, T* result) {
+constexpr bool CheckedAddImpl(T x, T y, T* result) {
   static_assert(std::is_integral<T>::value, "Type must be integral");
   // Since the value of x+y is undefined if we have a signed type, we compute
   // it using the unsigned type of the same size.
@@ -49,7 +48,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (CheckedAddFastOp<T, U>::is_supported)
       return CheckedAddFastOp<T, U>::Do(x, y, result);
@@ -82,7 +81,7 @@
 };
 
 template <typename T>
-CONSTEXPR bool CheckedSubImpl(T x, T y, T* result) {
+constexpr bool CheckedSubImpl(T x, T y, T* result) {
   static_assert(std::is_integral<T>::value, "Type must be integral");
   // Since the value of x+y is undefined if we have a signed type, we compute
   // it using the unsigned type of the same size.
@@ -109,7 +108,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (CheckedSubFastOp<T, U>::is_supported)
       return CheckedSubFastOp<T, U>::Do(x, y, result);
@@ -142,7 +141,7 @@
 };
 
 template <typename T>
-CONSTEXPR bool CheckedMulImpl(T x, T y, T* result) {
+constexpr bool CheckedMulImpl(T x, T y, T* result) {
   static_assert(std::is_integral<T>::value, "Type must be integral");
   // Since the value of x*y is potentially undefined if we have a signed type,
   // we compute it using the unsigned type of the same size.
@@ -171,7 +170,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (CheckedMulFastOp<T, U>::is_supported)
       return CheckedMulFastOp<T, U>::Do(x, y, result);
@@ -212,7 +211,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     if (BASE_NUMERICS_UNLIKELY(!y))
       return false;
 
@@ -251,7 +250,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     using Promotion = typename BigEnoughPromotion<T, U>::type;
     if (BASE_NUMERICS_LIKELY(y)) {
       Promotion presult = static_cast<Promotion>(x) % static_cast<Promotion>(y);
@@ -275,7 +274,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = T;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U shift, V* result) {
+  static constexpr bool Do(T x, U shift, V* result) {
     // Disallow negative numbers and verify the shift is in bounds.
     if (BASE_NUMERICS_LIKELY(!IsValueNegative(x) &&
                              as_unsigned(shift) <
@@ -329,7 +328,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = static_cast<result_type>(x) & static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
     return IsValueInRangeForNumericType<V>(tmp);
@@ -348,7 +347,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = static_cast<result_type>(x) | static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
     return IsValueInRangeForNumericType<V>(tmp);
@@ -367,7 +366,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = static_cast<result_type>(x) ^ static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
     return IsValueInRangeForNumericType<V>(tmp);
@@ -387,7 +386,7 @@
                             std::is_arithmetic<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = IsGreater<T, U>::Test(x, y) ? static_cast<result_type>(x)
                                                   : static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
@@ -408,7 +407,7 @@
                             std::is_arithmetic<U>::value>::type> {
   using result_type = typename LowestValuePromotion<T, U>::type;
   template <typename V>
-  static CONSTEXPR bool Do(T x, U y, V* result) {
+  static constexpr bool Do(T x, U y, V* result) {
     result_type tmp = IsLess<T, U>::Test(x, y) ? static_cast<result_type>(x)
                                                : static_cast<result_type>(y);
     *result = static_cast<V>(tmp);
@@ -426,7 +425,7 @@
                               std::is_floating_point<U>::value>::type> { \
     using result_type = typename MaxExponentPromotion<T, U>::type;       \
     template <typename V>                                                \
-    static CONSTEXPR bool Do(T x, U y, V* result) {                      \
+    static constexpr bool Do(T x, U y, V* result) {                      \
       using Promotion = typename MaxExponentPromotion<T, U>::type;       \
       Promotion presult = x OP y;                                        \
       *result = static_cast<V>(presult);                                 \
@@ -475,7 +474,7 @@
 
   // Ensures that a type conversion does not trigger undefined behavior.
   template <typename Src>
-  static CONSTEXPR T WellDefinedConversionOrZero(const Src value,
+  static constexpr T WellDefinedConversionOrZero(const Src value,
                                                  const bool is_valid) {
     using SrcType = typename internal::UnderlyingType<Src>::type;
     return (std::is_integral<SrcType>::value || is_valid)
@@ -487,10 +486,10 @@
   template <typename Src, NumericRepresentation type>
   friend class CheckedNumericState;
 
-  CONSTEXPR CheckedNumericState() : is_valid_(true), value_(0) {}
+  constexpr CheckedNumericState() : is_valid_(true), value_(0) {}
 
   template <typename Src>
-  CONSTEXPR CheckedNumericState(Src value, bool is_valid)
+  constexpr CheckedNumericState(Src value, bool is_valid)
       : is_valid_(is_valid && IsValueInRangeForNumericType<T>(value)),
         value_(WellDefinedConversionOrZero(value, is_valid_)) {
     static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric.");
@@ -498,17 +497,17 @@
 
   // Copy constructor.
   template <typename Src>
-  CONSTEXPR CheckedNumericState(const CheckedNumericState<Src>& rhs)
+  constexpr CheckedNumericState(const CheckedNumericState<Src>& rhs)
       : is_valid_(rhs.IsValid()),
         value_(WellDefinedConversionOrZero(rhs.value(), is_valid_)) {}
 
   template <typename Src>
-  CONSTEXPR explicit CheckedNumericState(Src value)
+  constexpr explicit CheckedNumericState(Src value)
       : is_valid_(IsValueInRangeForNumericType<T>(value)),
         value_(WellDefinedConversionOrZero(value, is_valid_)) {}
 
-  CONSTEXPR bool is_valid() const { return is_valid_; }
-  CONSTEXPR T value() const { return value_; }
+  constexpr bool is_valid() const { return is_valid_; }
+  constexpr T value() const { return value_; }
 };
 
 // Floating points maintain their own validity, but need translation wrappers.
@@ -519,7 +518,7 @@
 
   // Ensures that a type conversion does not trigger undefined behavior.
   template <typename Src>
-  static CONSTEXPR T WellDefinedConversionOrNaN(const Src value,
+  static constexpr T WellDefinedConversionOrNaN(const Src value,
                                                 const bool is_valid) {
     using SrcType = typename internal::UnderlyingType<Src>::type;
     return (StaticDstRangeRelationToSrcRange<T, SrcType>::value ==
@@ -533,33 +532,33 @@
   template <typename Src, NumericRepresentation type>
   friend class CheckedNumericState;
 
-  CONSTEXPR CheckedNumericState() : value_(0.0) {}
+  constexpr CheckedNumericState() : value_(0.0) {}
 
   template <typename Src>
-  CONSTEXPR CheckedNumericState(Src value, bool is_valid)
+  constexpr CheckedNumericState(Src value, bool is_valid)
       : value_(WellDefinedConversionOrNaN(value, is_valid)) {}
 
   template <typename Src>
-  CONSTEXPR explicit CheckedNumericState(Src value)
+  constexpr explicit CheckedNumericState(Src value)
       : value_(WellDefinedConversionOrNaN(
             value,
             IsValueInRangeForNumericType<T>(value))) {}
 
   // Copy constructor.
   template <typename Src>
-  CONSTEXPR CheckedNumericState(const CheckedNumericState<Src>& rhs)
+  constexpr CheckedNumericState(const CheckedNumericState<Src>& rhs)
       : value_(WellDefinedConversionOrNaN(
             rhs.value(),
             rhs.is_valid() && IsValueInRangeForNumericType<T>(rhs.value()))) {}
 
-  CONSTEXPR bool is_valid() const {
+  constexpr bool is_valid() const {
     // Written this way because std::isfinite is not reliably constexpr.
     return MustTreatAsConstexpr(value_)
                ? value_ <= std::numeric_limits<T>::max() &&
                      value_ >= std::numeric_limits<T>::lowest()
                : std::isfinite(value_);
   }
-  CONSTEXPR T value() const { return value_; }
+  constexpr T value() const { return value_; }
 };
 
 }  // namespace internal
diff --git a/src/third_party/mini_chromium/base/numerics/clamped_math.h b/src/third_party/mini_chromium/base/numerics/clamped_math.h
index e1335af..9a90c4f 100644
--- a/src/third_party/mini_chromium/base/numerics/clamped_math.h
+++ b/src/third_party/mini_chromium/base/numerics/clamped_math.h
@@ -11,7 +11,6 @@
 #include <type_traits>
 
 #include "base/numerics/clamped_math_impl.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 namespace internal {
@@ -24,11 +23,11 @@
  public:
   using type = T;
 
-  CONSTEXPR ClampedNumeric() : value_(0) {}
+  constexpr ClampedNumeric() : value_(0) {}
 
   // Copy constructor.
   template <typename Src>
-  CONSTEXPR ClampedNumeric(const ClampedNumeric<Src>& rhs)
+  constexpr ClampedNumeric(const ClampedNumeric<Src>& rhs)
       : value_(saturated_cast<T>(rhs.value_)) {}
 
   template <typename Src>
@@ -37,7 +36,7 @@
   // This is not an explicit constructor because we implicitly upgrade regular
   // numerics to ClampedNumerics to make them easier to use.
   template <typename Src>
-  CONSTEXPR ClampedNumeric(Src value)  // NOLINT(runtime/explicit)
+  constexpr ClampedNumeric(Src value)  // NOLINT(runtime/explicit)
       : value_(saturated_cast<T>(value)) {
     static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric.");
   }
@@ -45,57 +44,57 @@
   // This is not an explicit constructor because we want a seamless conversion
   // from StrictNumeric types.
   template <typename Src>
-  CONSTEXPR ClampedNumeric(
+  constexpr ClampedNumeric(
       StrictNumeric<Src> value)  // NOLINT(runtime/explicit)
       : value_(saturated_cast<T>(static_cast<Src>(value))) {}
 
   // Returns a ClampedNumeric of the specified type, cast from the current
   // ClampedNumeric, and saturated to the destination type.
   template <typename Dst>
-  CONSTEXPR ClampedNumeric<typename UnderlyingType<Dst>::type> Cast() const {
+  constexpr ClampedNumeric<typename UnderlyingType<Dst>::type> Cast() const {
     return *this;
   }
 
   // Prototypes for the supported arithmetic operator overloads.
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator+=(const Src rhs);
+  constexpr ClampedNumeric& operator+=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator-=(const Src rhs);
+  constexpr ClampedNumeric& operator-=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator*=(const Src rhs);
+  constexpr ClampedNumeric& operator*=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator/=(const Src rhs);
+  constexpr ClampedNumeric& operator/=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator%=(const Src rhs);
+  constexpr ClampedNumeric& operator%=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator<<=(const Src rhs);
+  constexpr ClampedNumeric& operator<<=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator>>=(const Src rhs);
+  constexpr ClampedNumeric& operator>>=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator&=(const Src rhs);
+  constexpr ClampedNumeric& operator&=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator|=(const Src rhs);
+  constexpr ClampedNumeric& operator|=(const Src rhs);
   template <typename Src>
-  CONSTEXPR ClampedNumeric& operator^=(const Src rhs);
+  constexpr ClampedNumeric& operator^=(const Src rhs);
 
-  CONSTEXPR ClampedNumeric operator-() const {
+  constexpr ClampedNumeric operator-() const {
     // The negation of two's complement int min is int min, so that's the
     // only overflow case where we will saturate.
     return ClampedNumeric<T>(SaturatedNegWrapper(value_));
   }
 
-  CONSTEXPR ClampedNumeric operator~() const {
+  constexpr ClampedNumeric operator~() const {
     return ClampedNumeric<decltype(InvertWrapper(T()))>(InvertWrapper(value_));
   }
 
-  CONSTEXPR ClampedNumeric Abs() const {
+  constexpr ClampedNumeric Abs() const {
     // The negation of two's complement int min is int min, so that's the
     // only overflow case where we will saturate.
     return ClampedNumeric<T>(SaturatedAbsWrapper(value_));
   }
 
   template <typename U>
-  CONSTEXPR ClampedNumeric<typename MathWrapper<ClampedMaxOp, T, U>::type> Max(
+  constexpr ClampedNumeric<typename MathWrapper<ClampedMaxOp, T, U>::type> Max(
       const U rhs) const {
     using result_type = typename MathWrapper<ClampedMaxOp, T, U>::type;
     return ClampedNumeric<result_type>(
@@ -103,7 +102,7 @@
   }
 
   template <typename U>
-  CONSTEXPR ClampedNumeric<typename MathWrapper<ClampedMinOp, T, U>::type> Min(
+  constexpr ClampedNumeric<typename MathWrapper<ClampedMinOp, T, U>::type> Min(
       const U rhs) const {
     using result_type = typename MathWrapper<ClampedMinOp, T, U>::type;
     return ClampedNumeric<result_type>(
@@ -113,29 +112,29 @@
   // This function is available only for integral types. It returns an unsigned
   // integer of the same width as the source type, containing the absolute value
   // of the source, and properly handling signed min.
-  CONSTEXPR ClampedNumeric<typename UnsignedOrFloatForSize<T>::type>
+  constexpr ClampedNumeric<typename UnsignedOrFloatForSize<T>::type>
   UnsignedAbs() const {
     return ClampedNumeric<typename UnsignedOrFloatForSize<T>::type>(
         SafeUnsignedAbs(value_));
   }
 
-  CONSTEXPR ClampedNumeric& operator++() {
+  constexpr ClampedNumeric& operator++() {
     *this += 1;
     return *this;
   }
 
-  CONSTEXPR ClampedNumeric operator++(int) {
+  constexpr ClampedNumeric operator++(int) {
     ClampedNumeric value = *this;
     *this += 1;
     return value;
   }
 
-  CONSTEXPR ClampedNumeric& operator--() {
+  constexpr ClampedNumeric& operator--() {
     *this -= 1;
     return *this;
   }
 
-  CONSTEXPR ClampedNumeric operator--(int) {
+  constexpr ClampedNumeric operator--(int) {
     ClampedNumeric value = *this;
     *this -= 1;
     return value;
@@ -146,7 +145,7 @@
   template <template <typename, typename, typename> class M,
             typename L,
             typename R>
-  static CONSTEXPR ClampedNumeric MathOp(const L lhs, const R rhs) {
+  static constexpr ClampedNumeric MathOp(const L lhs, const R rhs) {
     using Math = typename MathWrapper<M, L, R>::math;
     return ClampedNumeric<T>(
         Math::template Do<T>(Wrapper<L>::value(lhs), Wrapper<R>::value(rhs)));
@@ -154,7 +153,7 @@
 
   // Assignment arithmetic operations.
   template <template <typename, typename, typename> class M, typename R>
-  CONSTEXPR ClampedNumeric& MathOp(const R rhs) {
+  constexpr ClampedNumeric& MathOp(const R rhs) {
     using Math = typename MathWrapper<M, T, R>::math;
     *this =
         ClampedNumeric<T>(Math::template Do<T>(value_, Wrapper<R>::value(rhs)));
@@ -162,7 +161,7 @@
   }
 
   template <typename Dst>
-  CONSTEXPR operator Dst() const {
+  constexpr operator Dst() const {
     return saturated_cast<typename ArithmeticOrUnderlyingEnum<Dst>::type>(
         value_);
   }
@@ -170,7 +169,7 @@
   // This method extracts the raw integer value without saturating it to the
   // destination type as the conversion operator does. This is useful when
   // e.g. assigning to an auto type or passing as a deduced template parameter.
-  CONSTEXPR T RawValue() const { return value_; }
+  constexpr T RawValue() const { return value_; }
 
  private:
   T value_;
@@ -179,7 +178,7 @@
   // ClampedNumeric and POD arithmetic types.
   template <typename Src>
   struct Wrapper {
-    static CONSTEXPR Src value(Src value) {
+    static constexpr Src value(Src value) {
       return static_cast<typename UnderlyingType<Src>::type>(value);
     }
   };
@@ -188,7 +187,7 @@
 // Convience wrapper to return a new ClampedNumeric from the provided arithmetic
 // or ClampedNumericType.
 template <typename T>
-CONSTEXPR ClampedNumeric<typename UnderlyingType<T>::type> MakeClampedNum(
+constexpr ClampedNumeric<typename UnderlyingType<T>::type> MakeClampedNum(
     const T value) {
   return value;
 }
@@ -204,7 +203,7 @@
 template <template <typename, typename, typename> class M,
           typename L,
           typename R>
-CONSTEXPR ClampedNumeric<typename MathWrapper<M, L, R>::type> ClampMathOp(
+constexpr ClampedNumeric<typename MathWrapper<M, L, R>::type> ClampMathOp(
     const L lhs,
     const R rhs) {
   using Math = typename MathWrapper<M, L, R>::math;
@@ -217,7 +216,7 @@
           typename L,
           typename R,
           typename... Args>
-CONSTEXPR ClampedNumeric<typename ResultType<M, L, R, Args...>::type>
+constexpr ClampedNumeric<typename ResultType<M, L, R, Args...>::type>
 ClampMathOp(const L lhs, const R rhs, const Args... args) {
   return ClampMathOp<M>(ClampMathOp<M>(lhs, rhs), args...);
 }
diff --git a/src/third_party/mini_chromium/base/numerics/clamped_math_impl.h b/src/third_party/mini_chromium/base/numerics/clamped_math_impl.h
index b2dbaa5c..7472283 100644
--- a/src/third_party/mini_chromium/base/numerics/clamped_math_impl.h
+++ b/src/third_party/mini_chromium/base/numerics/clamped_math_impl.h
@@ -17,7 +17,6 @@
 #include "base/numerics/checked_math.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/numerics/safe_math_shared_impl.h"
-#include "nb/cpp14oncpp11.h"
 
 namespace base {
 namespace internal {
@@ -25,7 +24,7 @@
 template <typename T,
           typename std::enable_if<std::is_integral<T>::value &&
                                   std::is_signed<T>::value>::type* = nullptr>
-CONSTEXPR T SaturatedNegWrapper(T value) {
+constexpr T SaturatedNegWrapper(T value) {
   return MustTreatAsConstexpr(value) || !ClampedNegFastOp<T>::is_supported
              ? (NegateWrapper(value) != std::numeric_limits<T>::lowest()
                     ? NegateWrapper(value)
@@ -36,20 +35,20 @@
 template <typename T,
           typename std::enable_if<std::is_integral<T>::value &&
                                   !std::is_signed<T>::value>::type* = nullptr>
-CONSTEXPR T SaturatedNegWrapper(T value) {
+constexpr T SaturatedNegWrapper(T value) {
   return T(0);
 }
 
 template <
     typename T,
     typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
-CONSTEXPR T SaturatedNegWrapper(T value) {
+constexpr T SaturatedNegWrapper(T value) {
   return -value;
 }
 
 template <typename T,
           typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
-CONSTEXPR T SaturatedAbsWrapper(T value) {
+constexpr T SaturatedAbsWrapper(T value) {
   // The calculation below is a static identity for unsigned types, but for
   // signed integer types it provides a non-branching, saturated absolute value.
   // This works because SafeUnsignedAbs() returns an unsigned type, which can
@@ -65,7 +64,7 @@
 template <
     typename T,
     typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
-CONSTEXPR T SaturatedAbsWrapper(T value) {
+constexpr T SaturatedAbsWrapper(T value) {
   return value < 0 ? -value : value;
 }
 
@@ -79,7 +78,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     if (ClampedAddFastOp<T, U>::is_supported)
       return ClampedAddFastOp<T, U>::template Do<V>(x, y);
 
@@ -105,7 +104,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (ClampedSubFastOp<T, U>::is_supported)
       return ClampedSubFastOp<T, U>::template Do<V>(x, y);
@@ -132,7 +131,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     // TODO(jschuh) Make this "constexpr if" once we're C++17.
     if (ClampedMulFastOp<T, U>::is_supported)
       return ClampedMulFastOp<T, U>::template Do<V>(x, y);
@@ -156,7 +155,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     V result = {};
     if (BASE_NUMERICS_LIKELY((CheckedDivOp<T, U>::Do(x, y, &result))))
       return result;
@@ -176,7 +175,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     V result = {};
     return BASE_NUMERICS_LIKELY((CheckedModOp<T, U>::Do(x, y, &result)))
                ? result
@@ -196,7 +195,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = T;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U shift) {
+  static constexpr V Do(T x, U shift) {
     static_assert(!std::is_signed<U>::value, "Shift value must be unsigned.");
     if (BASE_NUMERICS_LIKELY(shift < std::numeric_limits<T>::digits)) {
       // Shift as unsigned to avoid undefined behavior.
@@ -220,7 +219,7 @@
                                             std::is_integral<U>::value>::type> {
   using result_type = T;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U shift) {
+  static constexpr V Do(T x, U shift) {
     static_assert(!std::is_signed<U>::value, "Shift value must be unsigned.");
     // Signed right shift is odd, because it saturates to -1 or 0.
     const V saturated = as_unsigned(V(0)) - IsValueNegative(x);
@@ -241,7 +240,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     return static_cast<result_type>(x) & static_cast<result_type>(y);
   }
 };
@@ -258,7 +257,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     return static_cast<result_type>(x) | static_cast<result_type>(y);
   }
 };
@@ -275,7 +274,7 @@
   using result_type = typename std::make_unsigned<
       typename MaxExponentPromotion<T, U>::type>::type;
   template <typename V>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     return static_cast<result_type>(x) ^ static_cast<result_type>(y);
   }
 };
@@ -291,7 +290,7 @@
                             std::is_arithmetic<U>::value>::type> {
   using result_type = typename MaxExponentPromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     return IsGreater<T, U>::Test(x, y) ? saturated_cast<V>(x)
                                        : saturated_cast<V>(y);
   }
@@ -308,7 +307,7 @@
                             std::is_arithmetic<U>::value>::type> {
   using result_type = typename LowestValuePromotion<T, U>::type;
   template <typename V = result_type>
-  static CONSTEXPR V Do(T x, U y) {
+  static constexpr V Do(T x, U y) {
     return IsLess<T, U>::Test(x, y) ? saturated_cast<V>(x)
                                     : saturated_cast<V>(y);
   }
@@ -324,7 +323,7 @@
                               std::is_floating_point<U>::value>::type> { \
     using result_type = typename MaxExponentPromotion<T, U>::type;       \
     template <typename V = result_type>                                  \
-    static CONSTEXPR V Do(T x, U y) {                                    \
+    static constexpr V Do(T x, U y) {                                    \
       return saturated_cast<V>(x OP y);                                  \
     }                                                                    \
   };
diff --git a/src/third_party/mini_chromium/base/numerics/safe_math_shared_impl.h b/src/third_party/mini_chromium/base/numerics/safe_math_shared_impl.h
index 853fa65..3ee9f25 100644
--- a/src/third_party/mini_chromium/base/numerics/safe_math_shared_impl.h
+++ b/src/third_party/mini_chromium/base/numerics/safe_math_shared_impl.h
@@ -15,7 +15,6 @@
 #include <type_traits>
 
 #include "base/numerics/safe_conversions.h"
-#include "nb/cpp14oncpp11.h"
 
 // Where available use builtin math overflow support on Clang and GCC.
 #if ((defined(__clang__) &&                                \
@@ -38,7 +37,7 @@
 struct CheckedAddFastOp {
   static const bool is_supported = false;
   template <typename V>
-  static CONSTEXPR bool Do(T, U, V*) {
+  static constexpr bool Do(T, U, V*) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<bool>();
   }
@@ -48,7 +47,7 @@
 struct CheckedSubFastOp {
   static const bool is_supported = false;
   template <typename V>
-  static CONSTEXPR bool Do(T, U, V*) {
+  static constexpr bool Do(T, U, V*) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<bool>();
   }
@@ -58,7 +57,7 @@
 struct CheckedMulFastOp {
   static const bool is_supported = false;
   template <typename V>
-  static CONSTEXPR bool Do(T, U, V*) {
+  static constexpr bool Do(T, U, V*) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<bool>();
   }
@@ -68,7 +67,7 @@
 struct ClampedAddFastOp {
   static const bool is_supported = false;
   template <typename V>
-  static CONSTEXPR V Do(T, U) {
+  static constexpr V Do(T, U) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<V>();
   }
@@ -78,7 +77,7 @@
 struct ClampedSubFastOp {
   static const bool is_supported = false;
   template <typename V>
-  static CONSTEXPR V Do(T, U) {
+  static constexpr V Do(T, U) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<V>();
   }
@@ -88,7 +87,7 @@
 struct ClampedMulFastOp {
   static const bool is_supported = false;
   template <typename V>
-  static CONSTEXPR V Do(T, U) {
+  static constexpr V Do(T, U) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<V>();
   }
@@ -97,7 +96,7 @@
 template <typename T>
 struct ClampedNegFastOp {
   static const bool is_supported = false;
-  static CONSTEXPR T Do(T) {
+  static constexpr T Do(T) {
     // Force a compile failure if instantiated.
     return CheckOnFailure::template HandleFailure<T>();
   }
@@ -131,7 +130,7 @@
 
 template <typename T,
           typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
-CONSTEXPR T NegateWrapper(T value) {
+constexpr T NegateWrapper(T value) {
   using UnsignedT = typename std::make_unsigned<T>::type;
   // This will compile to a NEG on Intel, and is normal negation on ARM.
   return static_cast<T>(UnsignedT(0) - static_cast<UnsignedT>(value));
@@ -140,26 +139,26 @@
 template <
     typename T,
     typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
-CONSTEXPR T NegateWrapper(T value) {
+constexpr T NegateWrapper(T value) {
   return -value;
 }
 
 template <typename T,
           typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
-CONSTEXPR typename std::make_unsigned<T>::type InvertWrapper(T value) {
+constexpr typename std::make_unsigned<T>::type InvertWrapper(T value) {
   return ~value;
 }
 
 template <typename T,
           typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
-CONSTEXPR T AbsWrapper(T value) {
+constexpr T AbsWrapper(T value) {
   return static_cast<T>(SafeUnsignedAbs(value));
 }
 
 template <
     typename T,
     typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
-CONSTEXPR T AbsWrapper(T value) {
+constexpr T AbsWrapper(T value) {
   return value < 0 ? -value : value;
 }
 
@@ -202,7 +201,7 @@
 // solution, but it beats rewriting these over and over again.
 #define BASE_NUMERIC_ARITHMETIC_VARIADIC(CLASS, CL_ABBR, OP_NAME)       \
   template <typename L, typename R, typename... Args>                   \
-  CONSTEXPR CLASS##Numeric<                                             \
+  constexpr CLASS##Numeric<                                             \
       typename ResultType<CLASS##OP_NAME##Op, L, R, Args...>::type>     \
       CL_ABBR##OP_NAME(const L lhs, const R rhs, const Args... args) {  \
     return CL_ABBR##MathOp<CLASS##OP_NAME##Op, L, R, Args...>(lhs, rhs, \
@@ -214,7 +213,7 @@
   template <typename L, typename R,                                            \
             typename std::enable_if<Is##CLASS##Op<L, R>::value>::type* =       \
                 nullptr>                                                       \
-  CONSTEXPR                                                                    \
+  constexpr                                                                    \
       CLASS##Numeric<typename MathWrapper<CLASS##OP_NAME##Op, L, R>::type>     \
       operator OP(const L lhs, const R rhs) {                                  \
     return decltype(lhs OP rhs)::template MathOp<CLASS##OP_NAME##Op>(lhs,      \
@@ -223,7 +222,7 @@
   /* Assignment arithmetic operator implementation from CLASS##Numeric. */     \
   template <typename L>                                                        \
   template <typename R>                                                        \
-  CONSTEXPR CLASS##Numeric<L>& CLASS##Numeric<L>::operator CMP_OP(             \
+  constexpr CLASS##Numeric<L>& CLASS##Numeric<L>::operator CMP_OP(             \
       const R rhs) {                                                           \
     return MathOp<CLASS##OP_NAME##Op>(rhs);                                    \
   }                                                                            \
diff --git a/src/third_party/ots/include/opentype-sanitiser.h b/src/third_party/ots/include/opentype-sanitiser.h
index abaf495..bf8fbe6 100644
--- a/src/third_party/ots/include/opentype-sanitiser.h
+++ b/src/third_party/ots/include/opentype-sanitiser.h
@@ -5,13 +5,8 @@
 #ifndef OPENTYPE_SANITISER_H_
 #define OPENTYPE_SANITISER_H_
 
-#if !defined(STARBOARD)
 #include <cstring>
 #define MEMCPY_OPENTYPE_SANITISER std::memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_OPENTYPE_SANITISER SbMemoryCopy
-#endif
 
 #if defined(STARBOARD)
 #include "starboard/common/byte_swap.h"
diff --git a/src/third_party/ots/include/ots-memory-stream.h b/src/third_party/ots/include/ots-memory-stream.h
index 5080f8c..f5c43db 100644
--- a/src/third_party/ots/include/ots-memory-stream.h
+++ b/src/third_party/ots/include/ots-memory-stream.h
@@ -5,13 +5,8 @@
 #ifndef OTS_MEMORY_STREAM_H_
 #define OTS_MEMORY_STREAM_H_
 
-#if !defined(STARBOARD)
 #include <cstring>
 #define MEMCPY_OTS_MEMORY_STREAM std::memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_OTS_MEMORY_STREAM SbMemoryCopy
-#endif
 
 #include <limits>
 
diff --git a/src/third_party/ots/src/cff.cc b/src/third_party/ots/src/cff.cc
index 392f5cf..62aeb37 100644
--- a/src/third_party/ots/src/cff.cc
+++ b/src/third_party/ots/src/cff.cc
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "cff.h"
 
 #include <cstring>
diff --git a/src/third_party/ots/src/cmap.cc b/src/third_party/ots/src/cmap.cc
index 18c4d4b..b07d543 100644
--- a/src/third_party/ots/src/cmap.cc
+++ b/src/third_party/ots/src/cmap.cc
@@ -9,13 +9,8 @@
 #include <utility>
 #include <vector>
 
-#if !defined(STARBOARD)
 #include <cstring>
 #define MEMCPY_CMAP std::memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_CMAP SbMemoryCopy
-#endif
 
 #if defined(STARBOARD)
 #include "starboard/common/byte_swap.h"
diff --git a/src/third_party/ots/src/name.cc b/src/third_party/ots/src/name.cc
index e257de4..0a932a4 100644
--- a/src/third_party/ots/src/name.cc
+++ b/src/third_party/ots/src/name.cc
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#if defined(STARBOARD)
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // defined(STARBOARD)
-
 #include "name.h"
 
 #include <algorithm>
diff --git a/src/third_party/ots/src/ots.h b/src/third_party/ots/src/ots.h
index 5b7974b..e5360cb 100644
--- a/src/third_party/ots/src/ots.h
+++ b/src/third_party/ots/src/ots.h
@@ -13,13 +13,8 @@
 #include <cstdarg>
 #include <cstddef>
 
-#if !defined(STARBOARD)
 #include <cstring>
 #define MEMCPY_OTS std::memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_OTS SbMemoryCopy
-#endif
 
 #if defined(STARBOARD)
 #include "starboard/common/byte_swap.h"
diff --git a/src/third_party/protobuf/src/google/protobuf/io/coded_stream.cc b/src/third_party/protobuf/src/google/protobuf/io/coded_stream.cc
index 30e3126..deea55a 100644
--- a/src/third_party/protobuf/src/google/protobuf/io/coded_stream.cc
+++ b/src/third_party/protobuf/src/google/protobuf/io/coded_stream.cc
@@ -42,6 +42,7 @@
 
 #include <google/protobuf/io/coded_stream_inl.h>
 #include <algorithm>
+#include <cstring>
 #include <utility>
 #include <limits.h>
 #include <google/protobuf/io/zero_copy_stream.h>
diff --git a/src/third_party/protobuf/src/google/protobuf/io/coded_stream.h b/src/third_party/protobuf/src/google/protobuf/io/coded_stream.h
index 6aa158a..3eaecd6 100644
--- a/src/third_party/protobuf/src/google/protobuf/io/coded_stream.h
+++ b/src/third_party/protobuf/src/google/protobuf/io/coded_stream.h
@@ -882,11 +882,7 @@
     const uint8* buffer,
     uint32* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
-#ifndef STARBOARD
   memcpy(value, buffer, sizeof(*value));
-#else
-  SbMemoryCopy(value, buffer, sizeof(*value));
-#endif  // STARBOARD
   return buffer + sizeof(*value);
 #else
   *value = (static_cast<uint32>(buffer[0])      ) |
@@ -901,11 +897,7 @@
     const uint8* buffer,
     uint64* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
-#ifndef STARBOARD
   memcpy(value, buffer, sizeof(*value));
-#else
-  SbMemoryCopy(value, buffer, sizeof(*value));
-#endif  // STARBOARD
   return buffer + sizeof(*value);
 #else
   uint32 part0 = (static_cast<uint32>(buffer[0])      ) |
@@ -925,11 +917,7 @@
 inline bool CodedInputStream::ReadLittleEndian32(uint32* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
   if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) {
-#ifndef STARBOARD
     memcpy(value, buffer_, sizeof(*value));
-#else
-    SbMemoryCopy(value, buffer_, sizeof(*value));
-#endif  // STARBOARD
     Advance(sizeof(*value));
     return true;
   } else {
@@ -943,11 +931,7 @@
 inline bool CodedInputStream::ReadLittleEndian64(uint64* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
   if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) {
-#ifndef STARBOARD
     memcpy(value, buffer_, sizeof(*value));
-#else
-    SbMemoryCopy(value, buffer_, sizeof(*value));
-#endif  // STARBOARD
     Advance(sizeof(*value));
     return true;
   } else {
@@ -1125,12 +1109,8 @@
 inline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value,
                                                             uint8* target) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
-#ifndef STARBOARD
   memcpy(target, &value, sizeof(value));
 #else
-  SbMemoryCopy(target, &value, sizeof(value));
-#endif  // STARBOARD
-#else
   target[0] = static_cast<uint8>(value);
   target[1] = static_cast<uint8>(value >>  8);
   target[2] = static_cast<uint8>(value >> 16);
@@ -1142,12 +1122,8 @@
 inline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value,
                                                             uint8* target) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
-#ifndef STARBOARD
   memcpy(target, &value, sizeof(value));
 #else
-  SbMemoryCopy(target, &value, sizeof(value));
-#endif  // STARBOARD
-#else
   uint32 part0 = static_cast<uint32>(value);
   uint32 part1 = static_cast<uint32>(value >> 32);
 
diff --git a/src/third_party/protobuf/src/google/protobuf/io/coded_stream_inl.h b/src/third_party/protobuf/src/google/protobuf/io/coded_stream_inl.h
index 1443f4f..d95b06e 100644
--- a/src/third_party/protobuf/src/google/protobuf/io/coded_stream_inl.h
+++ b/src/third_party/protobuf/src/google/protobuf/io/coded_stream_inl.h
@@ -58,11 +58,7 @@
       // Oddly enough, memcpy() requires its first two args to be non-NULL even
       // if we copy 0 bytes.  So, we have ensured that z.first is non-NULL here.
       GOOGLE_DCHECK(z.first != NULL);
-#ifndef STARBOARD
       memcpy(z.first, buffer_, size);
-#else
-      SbMemoryCopy(z.first, buffer_, size);
-#endif  // STARBOARD
       Advance(size);
     }
     return true;
@@ -75,22 +71,14 @@
   int current_buffer_size;
   while ((current_buffer_size = BufferSize()) < size) {
     // Reading past end of buffer.  Copy what we have, then refresh.
-#ifndef STARBOARD
     memcpy(buffer, buffer_, current_buffer_size);
-#else
-    SbMemoryCopy(buffer, buffer_, current_buffer_size);
-#endif  // STARBOARD
     buffer = reinterpret_cast<uint8*>(buffer) + current_buffer_size;
     size -= current_buffer_size;
     Advance(current_buffer_size);
     if (!Refresh()) return false;
   }
 
-#ifndef STARBOARD
   memcpy(buffer, buffer_, size);
-#else
-  SbMemoryCopy(buffer, buffer_, size);
-#endif  // STARBOARD
   Advance(size);
 
   return true;
diff --git a/src/third_party/protobuf/src/google/protobuf/repeated_field.h b/src/third_party/protobuf/src/google/protobuf/repeated_field.h
index 8099d64..ca9f65d 100644
--- a/src/third_party/protobuf/src/google/protobuf/repeated_field.h
+++ b/src/third_party/protobuf/src/google/protobuf/repeated_field.h
@@ -1336,11 +1336,7 @@
 template <typename Element>
 struct ElementCopier<Element, true> {
   void operator()(Element* to, const Element* from, int array_size) {
-#ifndef STARBOARD
     memcpy(to, from, array_size * sizeof(Element));
-#else
-    SbMemoryCopy(to, from, array_size * sizeof(Element));
-#endif  // STARBOARD
   }
 };
 
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/common.cc b/src/third_party/protobuf/src/google/protobuf/stubs/common.cc
index 696f73c..660de2f 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/common.cc
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/common.cc
@@ -31,16 +31,8 @@
 // Author: kenton@google.com (Kenton Varda)
 
 #ifdef STARBOARD
-#ifdef INLINE_POEM_NAMESPACE
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#else   // INLINE_POEM_NAMESPACE
 #include <string.h>
 #include "starboard/common/string.h"
-#undef __builtin_strlen
-#define __builtin_strlen SbStringGetLength
-#undef strlen
-#define strlen SbStringGetLength
-#endif  // INLINE_POEM_NAMESPACE
 #endif  // STARBOARD
 
 #include <google/protobuf/stubs/common.h>
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/fastmem.h b/src/third_party/protobuf/src/google/protobuf/stubs/fastmem.h
index c88a172..1882bbd 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/fastmem.h
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/fastmem.h
@@ -69,11 +69,7 @@
 inline bool memeq(const char* a, const char* b, size_t n) {
   size_t n_rounded_down = n & ~static_cast<size_t>(7);
   if (GOOGLE_PREDICT_FALSE(n_rounded_down == 0)) {  // n <= 7
-#ifndef STARBOARD
     return memcmp(a, b, n) == 0;
-#else
-    return SbMemoryCompare(a, b, n) == 0;
-#endif  // STARBOARD
   }
   // n >= 8
   uint64 u = GOOGLE_UNALIGNED_LOAD64(a) ^ GOOGLE_UNALIGNED_LOAD64(b);
@@ -88,11 +84,7 @@
     // As of 2012, memcmp on x86-64 uses a big unrolled loop with SSE2
     // instructions, and while we could try to do something faster, it
     // doesn't seem worth pursuing.
-#ifndef STARBOARD
     return memcmp(a, b, n) == 0;
-#else
-    return SbMemoryCompare(a, b, n) == 0;
-#endif  // STARBOARD
   }
   for (; n >= 16; n -= 16) {
     uint64 x = GOOGLE_UNALIGNED_LOAD64(a) ^ GOOGLE_UNALIGNED_LOAD64(b);
@@ -109,11 +101,7 @@
 
 inline int fastmemcmp_inlined(const char *a, const char *b, size_t n) {
   if (n >= 64) {
-#ifndef STARBOARD
     return memcmp(a, b, n);
-#else
-    return SbMemoryCompare(a, b, n);
-#endif  // STARBOARD
   }
   const char* a_limit = a + n;
   while (a + sizeof(uint64) <= a_limit &&
@@ -140,7 +128,6 @@
 inline void memcpy_inlined(char *dst, const char *src, size_t size) {
   // Compiler inlines code with minimal amount of data movement when third
   // parameter of memcpy is a constant.
-#ifndef STARBOARD
   switch (size) {
     case  1: memcpy(dst, src, 1); break;
     case  2: memcpy(dst, src, 2); break;
@@ -160,27 +147,6 @@
     case 16: memcpy(dst, src, 16); break;
     default: memcpy(dst, src, size); break;
   }
-#else
-  switch (size) {
-    case  1: SbMemoryCopy(dst, src, 1); break;
-    case  2: SbMemoryCopy(dst, src, 2); break;
-    case  3: SbMemoryCopy(dst, src, 3); break;
-    case  4: SbMemoryCopy(dst, src, 4); break;
-    case  5: SbMemoryCopy(dst, src, 5); break;
-    case  6: SbMemoryCopy(dst, src, 6); break;
-    case  7: SbMemoryCopy(dst, src, 7); break;
-    case  8: SbMemoryCopy(dst, src, 8); break;
-    case  9: SbMemoryCopy(dst, src, 9); break;
-    case 10: SbMemoryCopy(dst, src, 10); break;
-    case 11: SbMemoryCopy(dst, src, 11); break;
-    case 12: SbMemoryCopy(dst, src, 12); break;
-    case 13: SbMemoryCopy(dst, src, 13); break;
-    case 14: SbMemoryCopy(dst, src, 14); break;
-    case 15: SbMemoryCopy(dst, src, 15); break;
-    case 16: SbMemoryCopy(dst, src, 16); break;
-    default: SbMemoryCopy(dst, src, size); break;
-  }
-#endif  // STARBOARD
 }
 
 }  // namespace internal
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/hash.h b/src/third_party/protobuf/src/google/protobuf/stubs/hash.h
index 2cf65be..12503f6 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/hash.h
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/hash.h
@@ -216,7 +216,7 @@
 #ifndef STARBOARD
     return strcmp(a, b) < 0;
 #else
-    return SbStringCompareAll(a, b) < 0;
+    return strcmp(a, b) < 0;
 #endif  // STARBOARD
   }
 };
@@ -260,7 +260,7 @@
 #ifndef STARBOARD
     return strcmp(a, b) < 0;
 #else
-    return SbStringCompareAll(a, b) < 0;
+    return strcmp(a, b) < 0;
 #endif // STARBOARD
   }
 };
@@ -448,7 +448,7 @@
 #ifndef STARBOARD
     return strcmp(a, b) == 0;
 #else
-    return SbStringCompareAll(a, b) == 0;
+    return strcmp(a, b) == 0;
 #endif  // STARBOARD
   }
 };
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/port.h b/src/third_party/protobuf/src/google/protobuf/stubs/port.h
index e732124..5c6c71d 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/port.h
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/port.h
@@ -276,56 +276,32 @@
 #else
 inline uint16 GOOGLE_UNALIGNED_LOAD16(const void *p) {
   uint16 t;
-#ifndef STARBOARD
   memcpy(&t, p, sizeof t);
-#else
-  SbMemoryCopy(&t, p, sizeof t);
-#endif  // STARBOARD
   return t;
 }
 
 inline uint32 GOOGLE_UNALIGNED_LOAD32(const void *p) {
   uint32 t;
-#ifndef STARBOARD
   memcpy(&t, p, sizeof t);
-#else
-  SbMemoryCopy(&t, p, sizeof t);
-#endif  // STARBOARD
   return t;
 }
 
 inline uint64 GOOGLE_UNALIGNED_LOAD64(const void *p) {
   uint64 t;
-#ifndef STARBOARD
   memcpy(&t, p, sizeof t);
-#else
-  SbMemoryCopy(&t, p, sizeof t);
-#endif  // STARBOARD
   return t;
 }
 
 inline void GOOGLE_UNALIGNED_STORE16(void *p, uint16 v) {
-#ifndef STARBOARD
   memcpy(p, &v, sizeof v);
-#else
-  SbMemoryCopy(p, &v, sizeof v);
-#endif  // STARBOARD
 }
 
 inline void GOOGLE_UNALIGNED_STORE32(void *p, uint32 v) {
-#ifndef STARBOARD
   memcpy(p, &v, sizeof v);
-#else
-  SbMemoryCopy(p, &v, sizeof v);
-#endif  // STARBOARD
 }
 
 inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) {
-#ifndef STARBOARD
   memcpy(p, &v, sizeof v);
-#else
-  SbMemoryCopy(p, &v, sizeof v);
-#endif  // STARBOARD
 }
 #endif
 
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h b/src/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h
index 4122238..fc50d12 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h
@@ -13,7 +13,3 @@
 // limitations under the License.
 
 #include "starboard/memory.h"
-
-#ifndef memset
-#define memset SbMemorySet
-#endif  // memset
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/stringpiece.h b/src/third_party/protobuf/src/google/protobuf/stubs/stringpiece.h
index 0f92cc6..d7d7e77 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/stringpiece.h
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/stringpiece.h
@@ -150,7 +150,6 @@
 #include <stddef.h>
 #include <string.h>
 #else
-#include "starboard/common/string.h"
 #include "starboard/memory.h"
 #endif  // STARBOARD
 
@@ -218,11 +217,7 @@
   StringPiece(const char* str)  // NOLINT(runtime/explicit)
       : ptr_(str), length_(0) {
     if (str != NULL) {
-#ifndef STARBOARD
       length_ = CheckedSsizeTFromSizeT(strlen(str));
-#else
-      length_ = CheckedSsizeTFromSizeT(SbStringGetLength(str));
-#endif  // defined(STARBOARD)
     }
   }
 
@@ -279,11 +274,7 @@
   void set(const char* str) {
     ptr_ = str;
     if (str != NULL)
-#ifndef STARBOARD
       length_ = CheckedSsizeTFromSizeT(strlen(str));
-#else
-      length_ = CheckedSsizeTFromSizeT(SbStringGetLength(str));
-#endif  // STARBOARD
     else
       length_ = 0;
   }
@@ -314,11 +305,7 @@
   int compare(StringPiece x) const {
     const stringpiece_ssize_type min_size =
         length_ < x.length_ ? length_ : x.length_;
-#ifndef STARBOARD
     int r = memcmp(ptr_, x.ptr_, min_size);
-#else
-    int r = SbMemoryCompare(ptr_, x.ptr_, min_size);
-#endif  // STARBOARD
     if (r < 0) return -1;
     if (r > 0) return 1;
     if (length_ < x.length_) return -1;
@@ -347,21 +334,12 @@
   void AppendToString(string* target) const;
 
   bool starts_with(StringPiece x) const {
-#ifndef STARBOARD
     return (length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0);
-#else
-    return (length_ >= x.length_) && (SbMemoryCompare(ptr_, x.ptr_, x.length_) == 0);
-#endif  // STARBOARD
   }
 
   bool ends_with(StringPiece x) const {
-#ifndef STARBOARD
     return ((length_ >= x.length_) &&
             (memcmp(ptr_ + (length_-x.length_), x.ptr_, x.length_) == 0));
-#else
-    return ((length_ >= x.length_) &&
-            (SbMemoryCompare(ptr_ + (length_-x.length_), x.ptr_, x.length_) == 0));
-#endif  // STARBOARD
   }
 
   // Checks whether StringPiece starts with x and if so advances the beginning
@@ -432,13 +410,8 @@
     return false;
   }
 
-#ifndef STARBOARD
   return x.data() == y.data() || len <= 0 ||
       memcmp(x.data(), y.data(), len) == 0;
-#else
-  return x.data() == y.data() || len <= 0 ||
-      SbMemoryCompare(x.data(), y.data(), len) == 0;
-#endif  // STARBOARD
 }
 
 inline bool operator!=(StringPiece x, StringPiece y) {
@@ -448,11 +421,7 @@
 inline bool operator<(StringPiece x, StringPiece y) {
   const stringpiece_ssize_type min_size =
       x.size() < y.size() ? x.size() : y.size();
-#ifndef STARBOARD
   const int r = memcmp(x.data(), y.data(), min_size);
-#else
-  const int r = SbMemoryCompare(x.data(), y.data(), min_size);
-#endif  // STARBOARD
   return (r < 0) || (r == 0 && x.size() < y.size());
 }
 
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/strutil.cc b/src/third_party/protobuf/src/google/protobuf/stubs/strutil.cc
index a4202b9..649ff96 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/strutil.cc
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/strutil.cc
@@ -30,12 +30,6 @@
 
 // from google3/strings/strutil.cc
 
-#ifdef STARBOARD
-#ifdef INLINE_POEM_NAMESPACE
-#include "starboard/client_porting/poem/string_leaks_poem.h"
-#endif  // INLINE_POEM_NAMESPACE
-#endif  // STARBOARD
-
 #ifndef STARBOARD
 
 #include <stdio.h>
@@ -44,11 +38,7 @@
 // platforms, and Starboard is not available there.  So we define these
 // "reverse poems" to move past this issue for host builds.  For why we don't
 // just use poems, see the comment in the #else clause.
-#define SbMemoryCopy memcpy
-#define SbMemoryMove memmove
-#define SbStringGetLength strlen
-#define SbStringCopyUnsafe strcpy
-#define PoemFindCharacterInString strchr
+
 #define SbStringFormatF snprintf
 #define SbStringFormatUnsafeF sprintf
 
@@ -59,21 +49,6 @@
 #include "starboard/common/string.h"
 #include "starboard/memory.h"
 
-#ifndef INLINE_POEM_NAMESPACE
-#undef __builtin_strlen
-#define __builtin_strlen SbStringGetLength
-#undef strlen
-#define strlen SbStringGetLength
-#endif  // INLINE_POEM_NAMESPACE
-
-// We avoid using poems here because a subsequent #include of math.h may
-// result, on some platforms, of the indirect inclusion of stdlib.h, which
-// will then conflict with our poem includes.
-#define POEM_NO_EMULATION
-// For access to PoemFindCharacterInString() as a replacement for strchr().
-#include "starboard/client_porting/poem/string_poem.h"
-#undef POEM_NO_EMULATION
-
 #endif  // STARBOARD
 
 #include <errno.h>
@@ -317,7 +292,7 @@
                                 string* result) {
   GOOGLE_CHECK(result != NULL);
   result->clear();
-  int delim_length = SbStringGetLength(delim);
+  int delim_length = strlen(delim);
 
   // Precompute resulting length so we can reserve() memory in one shot.
   int length = 0;
@@ -1273,7 +1248,7 @@
 void DelocalizeRadix(char* buffer) {
   // Fast check:  if the buffer has a normal decimal point, assume no
   // translation is needed.
-  if (PoemFindCharacterInString(buffer, '.') != NULL) return;
+  if (strchr(buffer, '.') != NULL) return;
 
   // Find the first unknown character.
   while (IsValidFloatChar(*buffer)) ++buffer;
@@ -1293,7 +1268,7 @@
     // extra bytes.
     char* target = buffer;
     do { ++buffer; } while (!IsValidFloatChar(*buffer) && *buffer != '\0');
-    SbMemoryMove(target, buffer, SbStringGetLength(buffer) + 1);
+    memmove(target, buffer, strlen(buffer) + 1);
   }
 }
 
@@ -1305,13 +1280,13 @@
   GOOGLE_COMPILE_ASSERT(DBL_DIG < 20, DBL_DIG_is_too_big);
 
   if (value == numeric_limits<double>::infinity()) {
-    SbStringCopyUnsafe(buffer, "inf");
+    strcpy(buffer, "inf");
     return buffer;
   } else if (value == -numeric_limits<double>::infinity()) {
-    SbStringCopyUnsafe(buffer, "-inf");
+    strcpy(buffer, "-inf");
     return buffer;
   } else if (MathLimits<double>::IsNaN(value)) {
-    SbStringCopyUnsafe(buffer, "nan");
+    strcpy(buffer, "nan");
     return buffer;
   }
 
@@ -1423,13 +1398,13 @@
   GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big);
 
   if (value == numeric_limits<double>::infinity()) {
-    SbStringCopyUnsafe(buffer, "inf");
+    strcpy(buffer, "inf");
     return buffer;
   } else if (value == -numeric_limits<double>::infinity()) {
-    SbStringCopyUnsafe(buffer, "-inf");
+    strcpy(buffer, "-inf");
     return buffer;
   } else if (MathLimits<float>::IsNaN(value)) {
-    SbStringCopyUnsafe(buffer, "nan");
+    strcpy(buffer, "nan");
     return buffer;
   }
 
@@ -1483,35 +1458,35 @@
 //    of a mix of raw C strings, C++ strings, and integer values.
 // ----------------------------------------------------------------------
 
-// Append is merely a version of SbMemoryCopy that returns the address of the byte
+// Append is merely a version of memcpy that returns the address of the byte
 // after the area just overwritten.  It comes in multiple flavors to minimize
 // call overhead.
 static char *Append1(char *out, const AlphaNum &x) {
-  SbMemoryCopy(out, x.data(), x.size());
+  memcpy(out, x.data(), x.size());
   return out + x.size();
 }
 
 static char *Append2(char *out, const AlphaNum &x1, const AlphaNum &x2) {
-  SbMemoryCopy(out, x1.data(), x1.size());
+  memcpy(out, x1.data(), x1.size());
   out += x1.size();
 
-  SbMemoryCopy(out, x2.data(), x2.size());
+  memcpy(out, x2.data(), x2.size());
   return out + x2.size();
 }
 
 static char *Append4(char *out,
                      const AlphaNum &x1, const AlphaNum &x2,
                      const AlphaNum &x3, const AlphaNum &x4) {
-  SbMemoryCopy(out, x1.data(), x1.size());
+  memcpy(out, x1.data(), x1.size());
   out += x1.size();
 
-  SbMemoryCopy(out, x2.data(), x2.size());
+  memcpy(out, x2.data(), x2.size());
   out += x2.size();
 
-  SbMemoryCopy(out, x3.data(), x3.size());
+  memcpy(out, x3.data(), x3.size());
   out += x3.size();
 
-  SbMemoryCopy(out, x4.data(), x4.size());
+  memcpy(out, x4.data(), x4.size());
   return out + x4.size();
 }
 
@@ -2317,7 +2292,7 @@
     len = 4;
   }
   tmp = ghtonl(tmp);
-  SbMemoryCopy(output, reinterpret_cast<const char*>(&tmp) + sizeof(tmp) - len, len);
+  memcpy(output, reinterpret_cast<const char*>(&tmp) + sizeof(tmp) - len, len);
   return len;
 }
 
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/strutil.h b/src/third_party/protobuf/src/google/protobuf/stubs/strutil.h
index 5e5ea15..a68a0d3 100644
--- a/src/third_party/protobuf/src/google/protobuf/stubs/strutil.h
+++ b/src/third_party/protobuf/src/google/protobuf/stubs/strutil.h
@@ -641,26 +641,14 @@
         piece_size_(FastUInt64ToBufferLeft(u64, digits) - &digits[0]) {}
 
   AlphaNum(float f)
-#ifndef STARBOARD
     : piece_data_(digits), piece_size_(strlen(FloatToBuffer(f, digits))) {}
-#else
-    : piece_data_(digits), piece_size_(SbStringGetLength(FloatToBuffer(f, digits))) {}
-#endif  // STARBOARD
   AlphaNum(double f)
-#ifndef STARBOARD
     : piece_data_(digits), piece_size_(strlen(DoubleToBuffer(f, digits))) {}
-#else
-    : piece_data_(digits), piece_size_(SbStringGetLength(DoubleToBuffer(f, digits))) {}
-#endif  // STARBOARD
 
   AlphaNum(Hex hex);
 
   AlphaNum(const char* c_str)
-#ifndef STARBOARD
       : piece_data_(c_str), piece_size_(strlen(c_str)) {}
-#else
-      : piece_data_(c_str), piece_size_(SbStringGetLength(c_str)) {}
-#endif  // STARBOARD
   // TODO: Add a string_ref constructor, eventually
   // AlphaNum(const StringPiece &pc) : piece(pc) {}
 
diff --git a/src/third_party/skia/include/private/GrTypesPriv.h b/src/third_party/skia/include/private/GrTypesPriv.h
index 43a129b..1758a85 100644
--- a/src/third_party/skia/include/private/GrTypesPriv.h
+++ b/src/third_party/skia/include/private/GrTypesPriv.h
@@ -1290,7 +1290,7 @@
 };
 
 #if GR_TEST_UTILS || defined(SK_ENABLE_DUMP_GPU)
-static constexpr onst char* GrBackendApiToStr(GrBackendApi api) {
+static constexpr const char* GrBackendApiToStr(GrBackendApi api) {
     switch (api) {
         case GrBackendApi::kMetal:  return "Metal";
         case GrBackendApi::kDawn:   return "Dawn";
diff --git a/src/third_party/skia/include/private/SkFloatingPoint.h b/src/third_party/skia/include/private/SkFloatingPoint.h
index 1196b67..f0ca4bb 100644
--- a/src/third_party/skia/include/private/SkFloatingPoint.h
+++ b/src/third_party/skia/include/private/SkFloatingPoint.h
@@ -228,14 +228,14 @@
 // IEEE defines how float divide behaves for non-finite values and zero-denoms, but C does not
 // so we have a helper that suppresses the possible undefined-behavior warnings.
 
-#if defined(__clang__) && (__clang_major__ * 1000 + __clang_minor__) >= 3007
+#ifdef __clang__
 __attribute__((no_sanitize("float-divide-by-zero")))
 #endif
 static inline float sk_ieee_float_divide(float numer, float denom) {
     return numer / denom;
 }
 
-#if defined(__clang__) && (__clang_major__ * 1000 + __clang_minor__) >= 3007
+#ifdef __clang__
 __attribute__((no_sanitize("float-divide-by-zero")))
 #endif
 static inline double sk_ieee_double_divide(double numer, double denom) {
diff --git a/src/third_party/skia/modules/skottie/src/text/RangeSelector.cpp b/src/third_party/skia/modules/skottie/src/text/RangeSelector.cpp
index 28fb50b..a9a705b 100644
--- a/src/third_party/skia/modules/skottie/src/text/RangeSelector.cpp
+++ b/src/third_party/skia/modules/skottie/src/text/RangeSelector.cpp
@@ -8,7 +8,6 @@
 #include "modules/skottie/src/text/RangeSelector.h"
 
 #include "include/core/SkCubicMap.h"
-#include "include/private/SkMacros.h"
 #include "modules/skottie/src/SkottieJson.h"
 #include "modules/skottie/src/SkottieValue.h"
 
diff --git a/src/third_party/skia/src/core/SkContourMeasure.cpp b/src/third_party/skia/src/core/SkContourMeasure.cpp
index e827cc9..c26667a 100644
--- a/src/third_party/skia/src/core/SkContourMeasure.cpp
+++ b/src/third_party/skia/src/core/SkContourMeasure.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "include/core/SkContourMeasure.h"
-
 #include "include/core/SkPath.h"
 #include "src/core/SkGeometry.h"
 #include "src/core/SkPathMeasurePriv.h"
diff --git a/src/third_party/skia/src/core/SkEnumerate.h b/src/third_party/skia/src/core/SkEnumerate.h
index 54fcc0d..801aa54 100644
--- a/src/third_party/skia/src/core/SkEnumerate.h
+++ b/src/third_party/skia/src/core/SkEnumerate.h
@@ -12,7 +12,6 @@
 #include <iterator>
 #include <tuple>
 
-#include "include/private/SkMacros.h"
 #include "include/private/SkTLogic.h"
 
 // SkEnumerate returns a tuple with an index and the value returned by the iterator. The index always
diff --git a/src/third_party/skia/src/core/SkGlyph.h b/src/third_party/skia/src/core/SkGlyph.h
index 6429c18..7a1318b 100644
--- a/src/third_party/skia/src/core/SkGlyph.h
+++ b/src/third_party/skia/src/core/SkGlyph.h
@@ -51,12 +51,12 @@
             : fID{glyphID} { }
 
     constexpr SkPackedGlyphID(SkGlyphID glyphID, SkFixed x, SkFixed y)
-            : fID{PackIDXY(glyphID, x, y)} {
+            : fID {PackIDXY(glyphID, x, y)} {
         SkASSERT(fID != kImpossibleID);
     }
 
     constexpr SkPackedGlyphID(SkGlyphID code, SkIPoint pt)
-        : SkPackedGlyphID(code, pt.fX, pt.fY) {}
+        : SkPackedGlyphID(code, pt.fX, pt.fY) { }
 
     constexpr SkPackedGlyphID() : fID{kImpossibleID} {}
 
diff --git a/src/third_party/skia/src/core/SkGlyphRun.cpp b/src/third_party/skia/src/core/SkGlyphRun.cpp
index 1e92b65..e85fb37 100644
--- a/src/third_party/skia/src/core/SkGlyphRun.cpp
+++ b/src/third_party/skia/src/core/SkGlyphRun.cpp
@@ -46,13 +46,13 @@
         : fGlyphRuns{glyphRunList}
         , fOriginalPaint{&paint}
         , fOriginalTextBlob{blob}
-        , fOrigin(origin) { }
+        , fOrigin{origin} { }
 
 SkGlyphRunList::SkGlyphRunList(const SkGlyphRun& glyphRun, const SkPaint& paint)
         : fGlyphRuns{SkSpan<const SkGlyphRun>{&glyphRun, 1}}
         , fOriginalPaint{&paint}
         , fOriginalTextBlob{nullptr}
-        , fOrigin(SkPoint::Make(0, 0)) {}
+        , fOrigin{SkPoint::Make(0, 0)} {}
 
 uint64_t SkGlyphRunList::uniqueID() const {
     return fOriginalTextBlob != nullptr ? fOriginalTextBlob->uniqueID()
diff --git a/src/third_party/skia/src/core/SkGlyphRunPainter.cpp b/src/third_party/skia/src/core/SkGlyphRunPainter.cpp
index 768bea7..cb63a0f 100644
--- a/src/third_party/skia/src/core/SkGlyphRunPainter.cpp
+++ b/src/third_party/skia/src/core/SkGlyphRunPainter.cpp
@@ -927,6 +927,6 @@
 
 SkGlyphPositionRoundingSpec::SkGlyphPositionRoundingSpec(bool isSubpixel,
                                                          SkAxisAlignment axisAlignment)
-        : halfAxisSampleFreq(HalfAxisSampleFreq(isSubpixel, axisAlignment))
-        , ignorePositionMask(IgnorePositionMask(isSubpixel, axisAlignment)) {
+        : halfAxisSampleFreq{HalfAxisSampleFreq(isSubpixel, axisAlignment)}
+        , ignorePositionMask{IgnorePositionMask(isSubpixel, axisAlignment)} {
 }
diff --git a/src/third_party/skia/src/core/SkGraphics.cpp b/src/third_party/skia/src/core/SkGraphics.cpp
index b0a4396..5db7daa 100644
--- a/src/third_party/skia/src/core/SkGraphics.cpp
+++ b/src/third_party/skia/src/core/SkGraphics.cpp
@@ -7,8 +7,6 @@
 
 #include "include/core/SkGraphics.h"
 
-#include <stdlib.h>
-
 #include "include/core/SkCanvas.h"
 #include "include/core/SkMath.h"
 #include "include/core/SkMatrix.h"
@@ -30,6 +28,7 @@
 #include "src/core/SkTypefaceCache.h"
 #include "src/utils/SkUTF.h"
 
+#include <stdlib.h>
 
 void SkGraphics::Init() {
     // SkGraphics::Init() must be thread-safe and idempotent.
diff --git a/src/third_party/skia/src/core/SkStream.cpp b/src/third_party/skia/src/core/SkStream.cpp
index 7280071..2850f20 100644
--- a/src/third_party/skia/src/core/SkStream.cpp
+++ b/src/third_party/skia/src/core/SkStream.cpp
@@ -904,7 +904,7 @@
     if (!stream->isValid()) {
         return nullptr;
     }
-    return std::unique_ptr<SkStreamAsset>(stream.release());
+    return stream;
 }
 
 // Declared in SkStreamPriv.h:
diff --git a/src/third_party/skia/src/core/SkStrike.cpp b/src/third_party/skia/src/core/SkStrike.cpp
index 995e9d9..1c444c8 100644
--- a/src/third_party/skia/src/core/SkStrike.cpp
+++ b/src/third_party/skia/src/core/SkStrike.cpp
@@ -23,7 +23,7 @@
     const SkFontMetrics& fontMetrics)
         : fDesc{desc}
         , fScalerContext{std::move(scaler)}
-        , fFontMetrics(fontMetrics)
+        , fFontMetrics{fontMetrics}
         , fRoundingSpec{fScalerContext->isSubpixel(),
                         fScalerContext->computeAxisAlignmentForHText()} {
     SkASSERT(fScalerContext != nullptr);
diff --git a/src/third_party/skia/src/core/SkVM.cpp b/src/third_party/skia/src/core/SkVM.cpp
index 867ecba..cd2bc3a 100644
--- a/src/third_party/skia/src/core/SkVM.cpp
+++ b/src/third_party/skia/src/core/SkVM.cpp
@@ -651,13 +651,13 @@
 
     // Common instruction building for 64-bit opcodes with an immediate argument.
     void Assembler::op(int opcode, int opcode_ext, GP64 dst, int imm) {
-        opcode |= 1;    // low bit set for 64-bit operands
-        opcode |= 128;  // top bit set for instructions with any immediate
+        opcode |= 0b0000'0001;   // low bit set for 64-bit operands
+        opcode |= 0b1000'0000;   // top bit set for instructions with any immediate
 
         int imm_bytes = 4;
         if (SkTFitsIn<int8_t>(imm)) {
             imm_bytes = 1;
-            opcode |= 2;  // second bit set for 8-bit immediate, else 32-bit.
+            opcode |= 0b0000'0010;  // second bit set for 8-bit immediate, else 32-bit.
         }
 
         this->byte(rex(1,0,0,dst>>3));
@@ -974,30 +974,30 @@
                   | (d  &  5_mask) <<  0);
     }
 
-    void Assembler::and16b(V d, V n, V m) { this->op(625, m, 7, n, d); }
-    void Assembler::orr16b(V d, V n, V m) { this->op(629, m, 7, n, d); }
-    void Assembler::eor16b(V d, V n, V m) { this->op(881, m, 7, n, d); }
-    void Assembler::bic16b(V d, V n, V m) { this->op(627, m, 7, n, d); }
-    void Assembler::bsl16b(V d, V n, V m) { this->op(883, m, 7, n, d); }
+    void Assembler::and16b(V d, V n, V m) { this->op(0b0'1'0'01110'00'1, m, 0b00011'1, n, d); }
+    void Assembler::orr16b(V d, V n, V m) { this->op(0b0'1'0'01110'10'1, m, 0b00011'1, n, d); }
+    void Assembler::eor16b(V d, V n, V m) { this->op(0b0'1'1'01110'00'1, m, 0b00011'1, n, d); }
+    void Assembler::bic16b(V d, V n, V m) { this->op(0b0'1'0'01110'01'1, m, 0b00011'1, n, d); }
+    void Assembler::bsl16b(V d, V n, V m) { this->op(0b0'1'1'01110'01'1, m, 0b00011'1, n, d); }
 
-    void Assembler::add4s(V d, V n, V m) { this->op(629, m, 33, n, d); }
-    void Assembler::sub4s(V d, V n, V m) { this->op(885, m, 33, n, d); }
-    void Assembler::mul4s(V d, V n, V m) { this->op(629, m, 39, n, d); }
+    void Assembler::add4s(V d, V n, V m) { this->op(0b0'1'0'01110'10'1, m, 0b10000'1, n, d); }
+    void Assembler::sub4s(V d, V n, V m) { this->op(0b0'1'1'01110'10'1, m, 0b10000'1, n, d); }
+    void Assembler::mul4s(V d, V n, V m) { this->op(0b0'1'0'01110'10'1, m, 0b10011'1, n, d); }
 
-    void Assembler::cmeq4s(V d, V n, V m) { this->op(885, m, 35, n, d); }
-    void Assembler::cmgt4s(V d, V n, V m) { this->op(629, m, 13, n, d); }
+    void Assembler::cmeq4s(V d, V n, V m) { this->op(0b0'1'1'01110'10'1, m, 0b10001'1, n, d); }
+    void Assembler::cmgt4s(V d, V n, V m) { this->op(0b0'1'0'01110'10'1, m, 0b0011'0'1, n, d); }
 
-    void Assembler::sub8h(V d, V n, V m) { this->op(883, m, 33, n, d); }
-    void Assembler::mul8h(V d, V n, V m) { this->op(627, m, 39, n, d); }
+    void Assembler::sub8h(V d, V n, V m) { this->op(0b0'1'1'01110'01'1, m, 0b10000'1, n, d); }
+    void Assembler::mul8h(V d, V n, V m) { this->op(0b0'1'0'01110'01'1, m, 0b10011'1, n, d); }
 
-    void Assembler::fadd4s(V d, V n, V m) { this->op(625, m, 53, n, d); }
-    void Assembler::fsub4s(V d, V n, V m) { this->op(629, m, 53, n, d); }
-    void Assembler::fmul4s(V d, V n, V m) { this->op(881, m, 55, n, d); }
-    void Assembler::fdiv4s(V d, V n, V m) { this->op(881, m, 63, n, d); }
+    void Assembler::fadd4s(V d, V n, V m) { this->op(0b0'1'0'01110'0'0'1, m, 0b11010'1, n, d); }
+    void Assembler::fsub4s(V d, V n, V m) { this->op(0b0'1'0'01110'1'0'1, m, 0b11010'1, n, d); }
+    void Assembler::fmul4s(V d, V n, V m) { this->op(0b0'1'1'01110'0'0'1, m, 0b11011'1, n, d); }
+    void Assembler::fdiv4s(V d, V n, V m) { this->op(0b0'1'1'01110'0'0'1, m, 0b11111'1, n, d); }
 
-    void Assembler::fmla4s(V d, V n, V m) { this->op(625, m, 51, n, d); }
+    void Assembler::fmla4s(V d, V n, V m) { this->op(0b0'1'0'01110'0'0'1, m, 0b11001'1, n, d); }
 
-    void Assembler::tbl(V d, V n, V m) { this->op(624, m, 0, n, d); }
+    void Assembler::tbl(V d, V n, V m) { this->op(0b0'1'001110'00'0, m, 0b0'00'0'00, n, d); }
 
     void Assembler::op(uint32_t op22, int imm, V n, V d) {
         this->word( (op22 & 22_mask) << 10
@@ -1006,57 +1006,87 @@
                   | (d    &  5_mask) <<  0);
     }
 
-    void Assembler::sli4s(V d, V n, int imm) { this->op(1820693, (imm & 31), n, d); }
-    void Assembler::shl4s(V d, V n, int imm) { this->op(1296405, (imm & 31), n, d); }
-    void Assembler::sshr4s(V d, V n, int imm) { this->op(1296385, (-imm & 31), n, d); }
-    void Assembler::ushr4s(V d, V n, int imm) { this->op(1820673, (-imm & 31), n, d); }
-    void Assembler::ushr8h(V d, V n, int imm) { this->op(1819649, (-imm & 15), n, d); }
+    void Assembler::sli4s(V d, V n, int imm) {
+        this->op(0b0'1'1'011110'0100'000'01010'1,    ( imm&31), n, d);
+    }
+    void Assembler::shl4s(V d, V n, int imm) {
+        this->op(0b0'1'0'011110'0100'000'01010'1,    ( imm&31), n, d);
+    }
+    void Assembler::sshr4s(V d, V n, int imm) {
+        this->op(0b0'1'0'011110'0100'000'00'0'0'0'1, (-imm&31), n, d);
+    }
+    void Assembler::ushr4s(V d, V n, int imm) {
+        this->op(0b0'1'1'011110'0100'000'00'0'0'0'1, (-imm&31), n, d);
+    }
+    void Assembler::ushr8h(V d, V n, int imm) {
+        this->op(0b0'1'1'011110'0010'000'00'0'0'0'1, (-imm&15), n, d);
+    }
 
-    void Assembler::scvtf4s(V d, V n) { this->op(1280118, n, d); }
-    void Assembler::fcvtzs4s(V d, V n) { this->op(1288302, n, d); }
+    void Assembler::scvtf4s (V d, V n) { this->op(0b0'1'0'01110'0'0'10000'11101'10, n,d); }
+    void Assembler::fcvtzs4s(V d, V n) { this->op(0b0'1'0'01110'1'0'10000'1101'1'10, n,d); }
 
-    void Assembler::xtns2h(V d, V n) { this->op(235594, n, d); }
-    void Assembler::xtnh2b(V d, V n) { this->op(231498, n, d); }
+    void Assembler::xtns2h(V d, V n) { this->op(0b0'0'0'01110'01'10000'10010'10, n,d); }
+    void Assembler::xtnh2b(V d, V n) { this->op(0b0'0'0'01110'00'10000'10010'10, n,d); }
 
-    void Assembler::uxtlb2h(V d, V n) { this->op(770601, n, d); }
-    void Assembler::uxtlh2s(V d, V n) { this->op(771113, n, d); }
+    void Assembler::uxtlb2h(V d, V n) { this->op(0b0'0'1'011110'0001'000'10100'1, n,d); }
+    void Assembler::uxtlh2s(V d, V n) { this->op(0b0'0'1'011110'0010'000'10100'1, n,d); }
 
-    void Assembler::ret(X n) { this->word(3512256 << 10 | (n & 5_mask) << 5); }
+    void Assembler::ret(X n) {
+        this->word(0b1101011'0'0'10'11111'0000'0'0 << 10
+                  | (n & 5_mask) << 5);
+    }
 
     void Assembler::add(X d, X n, int imm12) {
-        this->word(580 << 22 | (imm12 & 12_mask) << 10 | (n & 5_mask) << 5 | (d & 5_mask) << 0);
+        this->word(0b1'0'0'10001'00   << 22
+                  | (imm12 & 12_mask) << 10
+                  | (n     &  5_mask) <<  5
+                  | (d     &  5_mask) <<  0);
     }
     void Assembler::sub(X d, X n, int imm12) {
-        this->word(836 << 22 | (imm12 & 12_mask) << 10 | (n & 5_mask) << 5 | (d & 5_mask) << 0);
+        this->word( 0b1'1'0'10001'00  << 22
+                  | (imm12 & 12_mask) << 10
+                  | (n     &  5_mask) <<  5
+                  | (d     &  5_mask) <<  0);
     }
     void Assembler::subs(X d, X n, int imm12) {
-        this->word(964 << 22 | (imm12 & 12_mask) << 10 | (n & 5_mask) << 5 | (d & 5_mask) << 0);
+        this->word( 0b1'1'1'10001'00  << 22
+                  | (imm12 & 12_mask) << 10
+                  | (n     &  5_mask) <<  5
+                  | (d     &  5_mask) <<  0);
     }
 
     void Assembler::b(Condition cond, Label* l) {
         const int imm19 = this->disp19(l);
-        this->word(84 << 24 | (imm19 & 19_mask) << 5 | ((int)cond & 4_mask) << 0);
+        this->word( 0b0101010'0           << 24
+                  | (imm19     & 19_mask) <<  5
+                  | ((int)cond &  4_mask) <<  0);
     }
     void Assembler::cbz(X t, Label* l) {
         const int imm19 = this->disp19(l);
-        this->word(180 << 24 | (imm19 & 19_mask) << 5 | (t & 5_mask) << 0);
+        this->word( 0b1'011010'0      << 24
+                  | (imm19 & 19_mask) <<  5
+                  | (t     &  5_mask) <<  0);
     }
     void Assembler::cbnz(X t, Label* l) {
         const int imm19 = this->disp19(l);
-        this->word(181 << 24 | (imm19 & 19_mask) << 5 | (t & 5_mask) << 0);
+        this->word( 0b1'011010'1      << 24
+                  | (imm19 & 19_mask) <<  5
+                  | (t     &  5_mask) <<  0);
     }
 
-    void Assembler::ldrq(V dst, X src) { this->op(1011712, src, dst); }
-    void Assembler::ldrs(V dst, X src) { this->op(3100672, src, dst); }
-    void Assembler::ldrb(V dst, X src) { this->op(1003520, src, dst); }
+    void Assembler::ldrq(V dst, X src) { this->op(0b00'111'1'01'11'000000000000, src, dst); }
+    void Assembler::ldrs(V dst, X src) { this->op(0b10'111'1'01'01'000000000000, src, dst); }
+    void Assembler::ldrb(V dst, X src) { this->op(0b00'111'1'01'01'000000000000, src, dst); }
 
-    void Assembler::strq(V src, X dst) { this->op(1007616, dst, src); }
-    void Assembler::strs(V src, X dst) { this->op(3096576, dst, src); }
-    void Assembler::strb(V src, X dst) { this->op(999424, dst, src); }
+    void Assembler::strq(V src, X dst) { this->op(0b00'111'1'01'10'000000000000, dst, src); }
+    void Assembler::strs(V src, X dst) { this->op(0b10'111'1'01'00'000000000000, dst, src); }
+    void Assembler::strb(V src, X dst) { this->op(0b00'111'1'01'00'000000000000, dst, src); }
 
     void Assembler::ldrq(V dst, Label* l) {
         const int imm19 = this->disp19(l);
-        this->word(156 << 24 | (imm19 & 19_mask) << 5 | (dst & 5_mask) << 0);
+        this->word( 0b10'011'1'00     << 24
+                  | (imm19 & 19_mask) << 5
+                  | (dst   &  5_mask) << 0);
     }
 
     void Assembler::label(Label* l) {
diff --git a/src/third_party/skia/src/core/SkVMBlitter.cpp b/src/third_party/skia/src/core/SkVMBlitter.cpp
index 8084ce3..e8f4f09 100644
--- a/src/third_party/skia/src/core/SkVMBlitter.cpp
+++ b/src/third_party/skia/src/core/SkVMBlitter.cpp
@@ -130,8 +130,9 @@
         Color unpack_565(skvm::I32 bgr) {
             // N.B. kRGB_565_SkColorType is named confusingly;
             //      blue is in the low bits and red the high.
-            skvm::I32 r = extract(bgr, 11, splat(31)), g = extract(bgr, 5, splat(63)),
-                      b = extract(bgr, 0, splat(31));
+            skvm::I32 r = extract(bgr, 11, splat(0b011'111)),
+                      g = extract(bgr,  5, splat(0b111'111)),
+                      b = extract(bgr,  0, splat(0b011'111));
             return {
                 // Scale 565 up to 888.
                 bit_or(shl(r, 3), shr(r, 2)),
diff --git a/src/third_party/skia/src/gpu/GrFragmentProcessor.h b/src/third_party/skia/src/gpu/GrFragmentProcessor.h
index 6d8d771..21e27b8 100644
--- a/src/third_party/skia/src/gpu/GrFragmentProcessor.h
+++ b/src/third_party/skia/src/gpu/GrFragmentProcessor.h
@@ -466,7 +466,7 @@
 
 const GrFragmentProcessor::TextureSampler& GrFragmentProcessor::IthTextureSampler(int i) {
     SK_ABORT("Illegal texture sampler index");
-    static const TextureSampler kBogus{};
+    static const TextureSampler kBogus;
     return kBogus;
 }
 
diff --git a/src/third_party/skia/src/gpu/GrGlyph.h b/src/third_party/skia/src/gpu/GrGlyph.h
index 76490f4..96ea558 100644
--- a/src/third_party/skia/src/gpu/GrGlyph.h
+++ b/src/third_party/skia/src/gpu/GrGlyph.h
@@ -45,13 +45,13 @@
         return skGlyph.maskFormat() == SkMask::kSDF_Format
            ? GrGlyph::MaskStyle::kDistance_MaskStyle
            : GrGlyph::MaskStyle::kCoverage_MaskStyle;
-	}
+    }
 
     GrGlyph(const SkGlyph& skGlyph)
         : fPackedID{skGlyph.getPackedID()}
         , fMaskFormat{FormatFromSkGlyph(skGlyph.maskFormat())}
         , fMaskStyle{MaskStyleFromSkGlyph(skGlyph)}
-        , fBounds(GrIRect16::Make(skGlyph.iRect())) {}
+        , fBounds{GrIRect16::Make(skGlyph.iRect())} {}
 
 
     SkRect destRect(SkPoint origin) {
diff --git a/src/third_party/skia/src/gpu/GrPrimitiveProcessor.h b/src/third_party/skia/src/gpu/GrPrimitiveProcessor.h
index 2bcd01a..41f37a3 100644
--- a/src/third_party/skia/src/gpu/GrPrimitiveProcessor.h
+++ b/src/third_party/skia/src/gpu/GrPrimitiveProcessor.h
@@ -283,7 +283,7 @@
 
 const GrPrimitiveProcessor::TextureSampler& GrPrimitiveProcessor::IthTextureSampler(int i) {
     SK_ABORT("Illegal texture sampler index");
-    static const TextureSampler kBogus{};
+    static const TextureSampler kBogus;
     return kBogus;
 }
 
diff --git a/src/third_party/skia/src/lazy/SkDiscardableMemoryPool.cpp b/src/third_party/skia/src/lazy/SkDiscardableMemoryPool.cpp
index d9003ad..bf6df9f 100644
--- a/src/third_party/skia/src/lazy/SkDiscardableMemoryPool.cpp
+++ b/src/third_party/skia/src/lazy/SkDiscardableMemoryPool.cpp
@@ -173,7 +173,7 @@
     fList.addToHead(dm.get());
     fUsed += bytes;
     this->dumpDownTo(fBudget);
-    return std::unique_ptr<SkDiscardableMemory>(dm.release());
+    return dm;
 }
 
 void DiscardableMemoryPool::removeFromPool(PoolDiscardableMemory* dm) {
diff --git a/src/third_party/skia/src/utils/SkCanvasStateUtils.cpp b/src/third_party/skia/src/utils/SkCanvasStateUtils.cpp
index decd7cd..8e74cdd 100644
--- a/src/third_party/skia/src/utils/SkCanvasStateUtils.cpp
+++ b/src/third_party/skia/src/utils/SkCanvasStateUtils.cpp
@@ -305,7 +305,7 @@
                                                                   state_v1->layers[i].y));
     }
 
-    return std::unique_ptr<SkCanvas>(canvas.release());
+    return canvas;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/third_party/skia/third_party/skcms/skcms.cc b/src/third_party/skia/third_party/skcms/skcms.cc
index 76a027b..69e7654 100644
--- a/src/third_party/skia/third_party/skcms/skcms.cc
+++ b/src/third_party/skia/third_party/skcms/skcms.cc
@@ -1495,7 +1495,7 @@
     return m;
 }
 
-#if defined(__clang__) && (__clang_major__ * 1000 + __clang_minor__) >= 3007
+#if defined(__clang__)
     [[clang::no_sanitize("float-divide-by-zero")]]  // Checked for by classify() on the way out.
 #endif
 bool skcms_TransferFunction_invert(const skcms_TransferFunction* src, skcms_TransferFunction* dst) {
diff --git a/src/third_party/skia/third_party/skcms/src/Transform_inl.h b/src/third_party/skia/third_party/skcms/src/Transform_inl.h
index 837fc68..c4b3122 100644
--- a/src/third_party/skia/third_party/skcms/src/Transform_inl.h
+++ b/src/third_party/skia/third_party/skcms/src/Transform_inl.h
@@ -175,7 +175,7 @@
 #endif
 }
 
-#if defined(__clang__) && (__clang_major__ * 1000 + __clang_minor__) >= 3007
+#if defined(__clang__)
     // The -((127-15)<<10) underflows that side of the math when
     // we pass a denorm half float.  It's harmless... we'll take the 0 side anyway.
     __attribute__((no_sanitize("unsigned-integer-overflow")))
diff --git a/src/third_party/v8/METADATA b/src/third_party/v8/METADATA
index 9206324..607ff60 100644
--- a/src/third_party/v8/METADATA
+++ b/src/third_party/v8/METADATA
@@ -4,6 +4,7 @@
   "v8 is Google's JavaScript engine developed for The Chromium Project. Cobalt "
   "uses v8 as its primary JavaScript engine. v8 works closely with Cobalt's "
   "script interface and templated bindings code."
+  "Current V8 version: 8.8.278.8"
 third_party {
   url {
     type: LOCAL_SOURCE
@@ -13,7 +14,7 @@
     type: GIT
     value: "https://chromium.googlesource.com/v8/v8"
   }
-  version: "1e6ebba9def991e536159fa658bf5564c054733f"
+  version: "2dbcdc105b963ee2501c82139eef7e0603977ff0"
   last_upgrade_date {
     year: 2019
     month: 8
diff --git a/src/third_party/v8/src/api/api.cc b/src/third_party/v8/src/api/api.cc
index 44bfcdd..b9ccdc0 100644
--- a/src/third_party/v8/src/api/api.cc
+++ b/src/third_party/v8/src/api/api.cc
@@ -5342,7 +5342,7 @@
       for (int i = read_index; i < up_to; i++) char_mask |= read_start[i];
       if ((char_mask & 0x80) == 0) {
         int copy_length = up_to - read_index;
-        base::Memcpy(current_write, read_start + read_index, copy_length);
+        memcpy(current_write, read_start + read_index, copy_length);
         current_write += copy_length;
         read_index = up_to;
       } else {
@@ -7398,7 +7398,7 @@
       reinterpret_cast<uint8_t*>(AllocateUninitialized(new_length));
   if (new_data == nullptr) return nullptr;
   size_t bytes_to_copy = std::min(old_length, new_length);
-  base::Memcpy(new_data, data, bytes_to_copy);
+  memcpy(new_data, data, bytes_to_copy);
   if (new_length > bytes_to_copy) {
     memset(new_data + bytes_to_copy, 0, new_length - bytes_to_copy);
   }
@@ -7705,7 +7705,7 @@
                                              isolate);
       source = reinterpret_cast<char*>(typed_array->DataPtr());
     }
-    base::Memcpy(dest, source + byte_offset, bytes_to_copy);
+    memcpy(dest, source + byte_offset, bytes_to_copy);
   }
   return bytes_to_copy;
 }
diff --git a/src/third_party/v8/src/ast/ast-value-factory.cc b/src/third_party/v8/src/ast/ast-value-factory.cc
index 1f3b4dd..90d1c70 100644
--- a/src/third_party/v8/src/ast/ast-value-factory.cc
+++ b/src/third_party/v8/src/ast/ast-value-factory.cc
@@ -369,7 +369,7 @@
         // Copy literal contents for later comparison.
         int length = literal_bytes.length();
         byte* new_literal_bytes = zone()->NewArray<byte>(length);
-        base::Memcpy(new_literal_bytes, literal_bytes.begin(), length);
+        memcpy(new_literal_bytes, literal_bytes.begin(), length);
         AstRawString* new_string = zone()->New<AstRawString>(
             is_one_byte, Vector<const byte>(new_literal_bytes, length),
             hash_field);
diff --git a/src/third_party/v8/src/ast/ast.cc b/src/third_party/v8/src/ast/ast.cc
index 3483c8b..11e79ad 100644
--- a/src/third_party/v8/src/ast/ast.cc
+++ b/src/third_party/v8/src/ast/ast.cc
@@ -267,7 +267,7 @@
     }
   }
   std::unique_ptr<char[]> result(new char[result_vec.size() + 1]);
-  base::Memcpy(result.get(), result_vec.data(), result_vec.size());
+  memcpy(result.get(), result_vec.data(), result_vec.size());
   result[result_vec.size()] = '\0';
   return result;
 }
diff --git a/src/third_party/v8/src/base/cpu.cc b/src/third_party/v8/src/base/cpu.cc
index 18a7761..9be384d 100644
--- a/src/third_party/v8/src/base/cpu.cc
+++ b/src/third_party/v8/src/base/cpu.cc
@@ -313,7 +313,7 @@
     size_t len = q - p;
     char* result = new char[len + 1];
     if (result != nullptr) {
-      base::Memcpy(result, p, len);
+      memcpy(result, p, len);
       result[len] = '\0';
     }
     return result;
@@ -438,7 +438,7 @@
       is_fp64_mode_(false),
       has_non_stop_time_stamp_counter_(false),
       has_msa_(false) {
-  base::Memcpy(vendor_, "Unknown", 8);
+  memcpy(vendor_, "Unknown", 8);
 
 #if defined(STARBOARD)
   if (StarboardDetectCPU()) {
@@ -459,7 +459,7 @@
   __cpuid(cpu_info, 0);
   unsigned num_ids = cpu_info[0];
   std::swap(cpu_info[2], cpu_info[3]);
-  base::Memcpy(vendor_, cpu_info + 1, 12);
+  memcpy(vendor_, cpu_info + 1, 12);
   vendor_[12] = '\0';
 
   // Interpret CPU feature information.
diff --git a/src/third_party/v8/src/base/file-utils.cc b/src/third_party/v8/src/base/file-utils.cc
index 8b0ac1c..edfa9c1 100644
--- a/src/third_party/v8/src/base/file-utils.cc
+++ b/src/third_party/v8/src/base/file-utils.cc
@@ -26,8 +26,8 @@
   }
   size_t name_length = strlen(name);
   auto buffer = std::make_unique<char[]>(basename_start + name_length + 1);
-  if (basename_start > 0) base::Memcpy(buffer.get(), exec_path, basename_start);
-  base::Memcpy(buffer.get() + basename_start, name, name_length);
+  if (basename_start > 0) memcpy(buffer.get(), exec_path, basename_start);
+  memcpy(buffer.get() + basename_start, name, name_length);
   return buffer;
 }
 
diff --git a/src/third_party/v8/src/base/hashmap.h b/src/third_party/v8/src/base/hashmap.h
index f5b957e..3fd9bcc 100644
--- a/src/third_party/v8/src/base/hashmap.h
+++ b/src/third_party/v8/src/base/hashmap.h
@@ -202,7 +202,7 @@
   impl_.capacity_ = original->capacity();
   impl_.occupancy_ = original->occupancy();
   impl_.map_ = impl_.allocator().template NewArray<Entry>(capacity());
-  base::Memcpy(impl_.map_, original->impl_.map_, capacity() * sizeof(Entry));
+  memcpy(impl_.map_, original->impl_.map_, capacity() * sizeof(Entry));
 }
 
 template <typename Key, typename Value, typename MatchFun,
diff --git a/src/third_party/v8/src/base/macros.h b/src/third_party/v8/src/base/macros.h
index a70ee98..1fa3227 100644
--- a/src/third_party/v8/src/base/macros.h
+++ b/src/third_party/v8/src/base/macros.h
@@ -105,7 +105,7 @@
   static_assert(sizeof(Dest) == sizeof(Source),
                 "source and dest must be same size");
   Dest dest;
-  v8::base::Memcpy(&dest, &source, sizeof(dest));
+  memcpy(&dest, &source, sizeof(dest));
   return dest;
 }
 
diff --git a/src/third_party/v8/src/base/memory.h b/src/third_party/v8/src/base/memory.h
index 8da3991..db6a9ea 100644
--- a/src/third_party/v8/src/base/memory.h
+++ b/src/third_party/v8/src/base/memory.h
@@ -32,14 +32,14 @@
 static inline V ReadUnalignedValue(Address p) {
   ASSERT_TRIVIALLY_COPYABLE(V);
   V r;
-  base::Memcpy(&r, reinterpret_cast<void*>(p), sizeof(V));
+  memcpy(&r, reinterpret_cast<void*>(p), sizeof(V));
   return r;
 }
 
 template <typename V>
 static inline void WriteUnalignedValue(Address p, V value) {
   ASSERT_TRIVIALLY_COPYABLE(V);
-  base::Memcpy(reinterpret_cast<void*>(p), &value, sizeof(V));
+  memcpy(reinterpret_cast<void*>(p), &value, sizeof(V));
 }
 
 template <typename V>
diff --git a/src/third_party/v8/src/base/page-allocator.cc b/src/third_party/v8/src/base/page-allocator.cc
index 1dac872..2defe619 100644
--- a/src/third_party/v8/src/base/page-allocator.cc
+++ b/src/third_party/v8/src/base/page-allocator.cc
@@ -109,7 +109,7 @@
   void* ptr =
       base::OS::AllocateShared(size, base::OS::MemoryPermission::kReadWrite);
   CHECK_NOT_NULL(ptr);
-  base::Memcpy(ptr, original_address, size);
+  memcpy(ptr, original_address, size);
   bool success = base::OS::SetPermissions(
       ptr, size, base::OS::MemoryPermission::kReadWrite);
   CHECK(success);
diff --git a/src/third_party/v8/src/base/platform/platform-starboard.cc b/src/third_party/v8/src/base/platform/platform-starboard.cc
index 975efa5..561e378 100644
--- a/src/third_party/v8/src/base/platform/platform-starboard.cc
+++ b/src/third_party/v8/src/base/platform/platform-starboard.cc
@@ -357,7 +357,7 @@
 //
 
 void OS::StrNCpy(char* dest, int length, const char* src, size_t n) {
-  SbStringCopy(dest, src, n);
+  strncpy(dest, src, n);
 }
 
 // ----------------------------------------------------------------------------
diff --git a/src/third_party/v8/src/base/platform/wrappers.h b/src/third_party/v8/src/base/platform/wrappers.h
index 503306d..a67f2bf 100644
--- a/src/third_party/v8/src/base/platform/wrappers.h
+++ b/src/third_party/v8/src/base/platform/wrappers.h
@@ -58,7 +58,7 @@
 }
 
 inline void* Memcpy(void* dest, const void* source, size_t count) {
-  return SbMemoryCopy(dest, source, count);
+  return memcpy(dest, source, count);
 }
 
 inline FILE* Fopen(const char* filename, const char* mode) { return NULL; }
diff --git a/src/third_party/v8/src/base/small-vector.h b/src/third_party/v8/src/base/small-vector.h
index c337b90..58b67a3 100644
--- a/src/third_party/v8/src/base/small-vector.h
+++ b/src/third_party/v8/src/base/small-vector.h
@@ -34,7 +34,7 @@
   SmallVector(SmallVector&& other) V8_NOEXCEPT { *this = std::move(other); }
   SmallVector(std::initializer_list<T> init) {
     resize_no_init(init.size());
-    base::Memcpy(begin_, init.begin(), sizeof(T) * init.size());
+    memcpy(begin_, init.begin(), sizeof(T) * init.size());
   }
 
   ~SmallVector() {
@@ -50,7 +50,7 @@
       begin_ = reinterpret_cast<T*>(base::Malloc(sizeof(T) * other_size));
       end_of_storage_ = begin_ + other_size;
     }
-    base::Memcpy(begin_, other.begin_, sizeof(T) * other_size);
+    memcpy(begin_, other.begin_, sizeof(T) * other_size);
     end_ = begin_ + other_size;
     return *this;
   }
@@ -66,7 +66,7 @@
     } else {
       DCHECK_GE(capacity(), other.size());  // Sanity check.
       size_t other_size = other.size();
-      base::Memcpy(begin_, other.begin_, sizeof(T) * other_size);
+      memcpy(begin_, other.begin_, sizeof(T) * other_size);
       end_ = begin_ + other_size;
     }
     return *this;
@@ -154,7 +154,7 @@
         base::bits::RoundUpToPowerOfTwo(std::max(min_capacity, 2 * capacity()));
     T* new_storage =
         reinterpret_cast<T*>(base::Malloc(sizeof(T) * new_capacity));
-    base::Memcpy(new_storage, begin_, sizeof(T) * in_use);
+    memcpy(new_storage, begin_, sizeof(T) * in_use);
     if (is_big()) base::Free(begin_);
     begin_ = new_storage;
     end_ = new_storage + in_use;
diff --git a/src/third_party/v8/src/builtins/builtins-trace.cc b/src/third_party/v8/src/builtins/builtins-trace.cc
index ec2ad62..96a60e0 100644
--- a/src/third_party/v8/src/builtins/builtins-trace.cc
+++ b/src/third_party/v8/src/builtins/builtins-trace.cc
@@ -41,7 +41,7 @@
         // strings, the bytes we get from SeqOneByteString are not. buf_ is
         // guaranteed to be null terminated.
         DisallowHeapAllocation no_gc;
-        base::Memcpy(
+        memcpy(
             buf_, Handle<SeqOneByteString>::cast(string)->GetChars(no_gc), len);
       }
     } else {
diff --git a/src/third_party/v8/src/codegen/arm64/assembler-arm64.h b/src/third_party/v8/src/codegen/arm64/assembler-arm64.h
index 6bebb83..e685f88 100644
--- a/src/third_party/v8/src/codegen/arm64/assembler-arm64.h
+++ b/src/third_party/v8/src/codegen/arm64/assembler-arm64.h
@@ -2590,7 +2590,7 @@
     STATIC_ASSERT(sizeof(instruction) == kInstrSize);
     DCHECK_LE(pc_ + sizeof(instruction), buffer_start_ + buffer_->size());
 
-    base::Memcpy(pc_, &instruction, sizeof(instruction));
+    memcpy(pc_, &instruction, sizeof(instruction));
     pc_ += sizeof(instruction);
     CheckBuffer();
   }
@@ -2602,7 +2602,7 @@
 
     // TODO(all): Somehow register we have some data here. Then we can
     // disassemble it correctly.
-    base::Memcpy(pc_, data, size);
+    memcpy(pc_, data, size);
     pc_ += size;
     CheckBuffer();
   }
diff --git a/src/third_party/v8/src/codegen/arm64/macro-assembler-arm64.cc b/src/third_party/v8/src/codegen/arm64/macro-assembler-arm64.cc
index c27827d..3aac779 100644
--- a/src/third_party/v8/src/codegen/arm64/macro-assembler-arm64.cc
+++ b/src/third_party/v8/src/codegen/arm64/macro-assembler-arm64.cc
@@ -373,7 +373,7 @@
   DCHECK(is_uint32(imm));
 
   uint8_t bytes[sizeof(imm)];
-  base::Memcpy(bytes, &imm, sizeof(imm));
+  memcpy(bytes, &imm, sizeof(imm));
 
   // All bytes are either 0x00 or 0xFF.
   {
diff --git a/src/third_party/v8/src/codegen/external-reference.cc b/src/third_party/v8/src/codegen/external-reference.cc
index ac04a25..ecb5dbc 100644
--- a/src/third_party/v8/src/codegen/external-reference.cc
+++ b/src/third_party/v8/src/codegen/external-reference.cc
@@ -611,7 +611,7 @@
 FUNCTION_REFERENCE(libc_memchr_function, libc_memchr)
 
 void* libc_memcpy(void* dest, const void* src, size_t n) {
-  return base::Memcpy(dest, src, n);
+  return memcpy(dest, src, n);
 }
 
 FUNCTION_REFERENCE(libc_memcpy_function, libc_memcpy)
diff --git a/src/third_party/v8/src/codegen/optimized-compilation-info.cc b/src/third_party/v8/src/codegen/optimized-compilation-info.cc
index 6df0836..98bfcd5 100644
--- a/src/third_party/v8/src/codegen/optimized-compilation-info.cc
+++ b/src/third_party/v8/src/codegen/optimized-compilation-info.cc
@@ -155,7 +155,7 @@
   Vector<const char> name_vec = debug_name_;
   if (name_vec.empty()) name_vec = ArrayVector("unknown");
   std::unique_ptr<char[]> name(new char[name_vec.length() + 1]);
-  base::Memcpy(name.get(), name_vec.begin(), name_vec.length());
+  memcpy(name.get(), name_vec.begin(), name_vec.length());
   name[name_vec.length()] = '\0';
   return name;
 }
diff --git a/src/third_party/v8/src/codegen/x64/assembler-x64.cc b/src/third_party/v8/src/codegen/x64/assembler-x64.cc
index 1cdacab..ac4b5e3 100644
--- a/src/third_party/v8/src/codegen/x64/assembler-x64.cc
+++ b/src/third_party/v8/src/codegen/x64/assembler-x64.cc
@@ -2004,7 +2004,7 @@
     EnsureSpace ensure_space(this);
     int nop_bytes = std::min(n, 9);
     const char* sequence = kNopSequences + kNopOffsets[nop_bytes];
-    base::Memcpy(pc_, sequence, nop_bytes);
+    memcpy(pc_, sequence, nop_bytes);
     pc_ += nop_bytes;
     n -= nop_bytes;
   } while (n);
diff --git a/src/third_party/v8/src/compiler/backend/arm/instruction-selector-arm.cc b/src/third_party/v8/src/compiler/backend/arm/instruction-selector-arm.cc
index 87938e3..f310349 100644
--- a/src/third_party/v8/src/compiler/backend/arm/instruction-selector-arm.cc
+++ b/src/third_party/v8/src/compiler/backend/arm/instruction-selector-arm.cc
@@ -2658,7 +2658,7 @@
 void InstructionSelector::VisitS128Const(Node* node) {
   ArmOperandGenerator g(this);
   uint32_t val[kSimd128Size / sizeof(uint32_t)];
-  base::Memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
+  memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
   // If all bytes are zeros, avoid emitting code for generic constants.
   bool all_zeros = !(val[0] || val[1] || val[2] || val[3]);
   bool all_ones = val[0] == UINT32_MAX && val[1] == UINT32_MAX &&
diff --git a/src/third_party/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc b/src/third_party/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
index 86909b7..e11b9fd 100644
--- a/src/third_party/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
+++ b/src/third_party/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
@@ -3434,7 +3434,7 @@
   static const int kUint32Immediates = 4;
   uint32_t val[kUint32Immediates];
   STATIC_ASSERT(sizeof(val) == kSimd128Size);
-  base::Memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
+  memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
   // If all bytes are zeros, avoid emitting code for generic constants
   bool all_zeros = !(val[0] || val[1] || val[2] || val[3]);
   InstructionOperand dst = g.DefineAsRegister(node);
diff --git a/src/third_party/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc b/src/third_party/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
index 8e2d244..d8f2fa6 100644
--- a/src/third_party/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
+++ b/src/third_party/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
@@ -2180,7 +2180,7 @@
   IA32OperandGenerator g(this);
   static const int kUint32Immediates = kSimd128Size / sizeof(uint32_t);
   uint32_t val[kUint32Immediates];
-  base::Memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
+  memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
   // If all bytes are zeros or ones, avoid emitting code for generic constants
   bool all_zeros = !(val[0] || val[1] || val[2] || val[3]);
   bool all_ones = val[0] == UINT32_MAX && val[1] == UINT32_MAX &&
diff --git a/src/third_party/v8/src/compiler/backend/instruction-selector.cc b/src/third_party/v8/src/compiler/backend/instruction-selector.cc
index ce04e7b..706a9b2 100644
--- a/src/third_party/v8/src/compiler/backend/instruction-selector.cc
+++ b/src/third_party/v8/src/compiler/backend/instruction-selector.cc
@@ -3317,7 +3317,7 @@
 void InstructionSelector::CanonicalizeShuffle(Node* node, uint8_t* shuffle,
                                               bool* is_swizzle) {
   // Get raw shuffle indices.
-  base::Memcpy(shuffle, S128ImmediateParameterOf(node->op()).data(),
+  memcpy(shuffle, S128ImmediateParameterOf(node->op()).data(),
                kSimd128Size);
   bool needs_swap;
   bool inputs_equal = GetVirtualRegister(node->InputAt(0)) ==
diff --git a/src/third_party/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc b/src/third_party/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
index 7e28a44..a4e8b1f 100644
--- a/src/third_party/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
+++ b/src/third_party/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
@@ -2936,7 +2936,7 @@
   Mips64OperandGenerator g(this);
   static const int kUint32Immediates = kSimd128Size / sizeof(uint32_t);
   uint32_t val[kUint32Immediates];
-  base::Memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
+  memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
   // If all bytes are zeros or ones, avoid emitting code for generic constants
   bool all_zeros = !(val[0] || val[1] || val[2] || val[3]);
   bool all_ones = val[0] == UINT32_MAX && val[1] == UINT32_MAX &&
diff --git a/src/third_party/v8/src/compiler/backend/s390/instruction-selector-s390.cc b/src/third_party/v8/src/compiler/backend/s390/instruction-selector-s390.cc
index 07f6261..c3c0cff 100644
--- a/src/third_party/v8/src/compiler/backend/s390/instruction-selector-s390.cc
+++ b/src/third_party/v8/src/compiler/backend/s390/instruction-selector-s390.cc
@@ -2850,7 +2850,7 @@
 void InstructionSelector::VisitS128Const(Node* node) {
   S390OperandGenerator g(this);
   uint32_t val[kSimd128Size / sizeof(uint32_t)];
-  base::Memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
+  memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
   // If all bytes are zeros, avoid emitting code for generic constants.
   bool all_zeros = !(val[0] || val[1] || val[2] || val[3]);
   bool all_ones = val[0] == UINT32_MAX && val[1] == UINT32_MAX &&
diff --git a/src/third_party/v8/src/compiler/backend/x64/instruction-selector-x64.cc b/src/third_party/v8/src/compiler/backend/x64/instruction-selector-x64.cc
index 1bcac2f..95461247 100644
--- a/src/third_party/v8/src/compiler/backend/x64/instruction-selector-x64.cc
+++ b/src/third_party/v8/src/compiler/backend/x64/instruction-selector-x64.cc
@@ -2945,7 +2945,7 @@
   X64OperandGenerator g(this);
   static const int kUint32Immediates = kSimd128Size / sizeof(uint32_t);
   uint32_t val[kUint32Immediates];
-  base::Memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
+  memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
   // If all bytes are zeros or ones, avoid emitting code for generic constants
   bool all_zeros = !(val[0] || val[1] || val[2] || val[3]);
   bool all_ones = val[0] == UINT32_MAX && val[1] == UINT32_MAX &&
diff --git a/src/third_party/v8/src/compiler/bytecode-graph-builder.cc b/src/third_party/v8/src/compiler/bytecode-graph-builder.cc
index 47f9787..12abe01 100644
--- a/src/third_party/v8/src/compiler/bytecode-graph-builder.cc
+++ b/src/third_party/v8/src/compiler/bytecode-graph-builder.cc
@@ -4366,7 +4366,7 @@
     if (has_effect) ++input_count_with_deps;
     Node** buffer = EnsureInputBufferSize(input_count_with_deps);
     if (value_input_count > 0) {
-      base::Memcpy(buffer, value_inputs,
+      memcpy(buffer, value_inputs,
                    kSystemPointerSize * value_input_count);
     }
     Node** current_input = buffer + value_input_count;
diff --git a/src/third_party/v8/src/compiler/graph-visualizer.cc b/src/third_party/v8/src/compiler/graph-visualizer.cc
index 6f403b6..3d8bf1b 100644
--- a/src/third_party/v8/src/compiler/graph-visualizer.cc
+++ b/src/third_party/v8/src/compiler/graph-visualizer.cc
@@ -259,7 +259,7 @@
   }
 
   char* buffer = new char[full_filename.length() + 1];
-  base::Memcpy(buffer, full_filename.begin(), full_filename.length());
+  memcpy(buffer, full_filename.begin(), full_filename.length());
   buffer[full_filename.length()] = '\0';
   return std::unique_ptr<char[]>(buffer);
 }
diff --git a/src/third_party/v8/src/compiler/simd-scalar-lowering.cc b/src/third_party/v8/src/compiler/simd-scalar-lowering.cc
index f8362ba..a1d1128e 100644
--- a/src/third_party/v8/src/compiler/simd-scalar-lowering.cc
+++ b/src/third_party/v8/src/compiler/simd-scalar-lowering.cc
@@ -1291,7 +1291,7 @@
         }
         case SimdType::kInt16x8: {
           int16_t val[kNumLanes16];
-          base::Memcpy(val, params.data(), kSimd128Size);
+          memcpy(val, params.data(), kSimd128Size);
           for (int i = 0; i < num_lanes; ++i) {
             rep_node[i] = mcgraph_->Int32Constant(static_cast<int32_t>(
                 base::ReadLittleEndianValue<int16_t>(&val[i])));
@@ -1300,7 +1300,7 @@
         }
         case SimdType::kInt32x4: {
           uint32_t val[kNumLanes32];
-          base::Memcpy(val, params.data(), kSimd128Size);
+          memcpy(val, params.data(), kSimd128Size);
           for (int i = 0; i < num_lanes; ++i) {
             rep_node[i] = mcgraph_->Int32Constant(
                 base::ReadLittleEndianValue<uint32_t>(&val[i]));
@@ -1309,7 +1309,7 @@
         }
         case SimdType::kInt64x2: {
           uint64_t val[kNumLanes64];
-          base::Memcpy(val, params.data(), kSimd128Size);
+          memcpy(val, params.data(), kSimd128Size);
           for (int i = 0; i < num_lanes; ++i) {
             rep_node[i] = mcgraph_->Int64Constant(
                 base::ReadLittleEndianValue<uint64_t>(&val[i]));
@@ -1318,7 +1318,7 @@
         }
         case SimdType::kFloat32x4: {
           float val[kNumLanes32];
-          base::Memcpy(val, params.data(), kSimd128Size);
+          memcpy(val, params.data(), kSimd128Size);
           for (int i = 0; i < num_lanes; ++i) {
             rep_node[i] = mcgraph_->Float32Constant(
                 base::ReadLittleEndianValue<float>(&val[i]));
@@ -1327,7 +1327,7 @@
         }
         case SimdType::kFloat64x2: {
           double val[kNumLanes64];
-          base::Memcpy(val, params.data(), kSimd128Size);
+          memcpy(val, params.data(), kSimd128Size);
           for (int i = 0; i < num_lanes; ++i) {
             rep_node[i] = mcgraph_->Float64Constant(
                 base::ReadLittleEndianValue<double>(&val[i]));
diff --git a/src/third_party/v8/src/compiler/wasm-compiler.cc b/src/third_party/v8/src/compiler/wasm-compiler.cc
index 47231a3..c476d15 100644
--- a/src/third_party/v8/src/compiler/wasm-compiler.cc
+++ b/src/third_party/v8/src/compiler/wasm-compiler.cc
@@ -1115,7 +1115,7 @@
 
   buf[0] = mcgraph()->Int32Constant(0);
   if (count > 0) {
-    base::Memcpy(buf.data() + 1, vals.begin(), sizeof(void*) * count);
+    memcpy(buf.data() + 1, vals.begin(), sizeof(void*) * count);
   }
   buf[count + 1] = effect();
   buf[count + 2] = control();
@@ -2648,7 +2648,7 @@
   // Make room for the instance_node parameter at index 1, just after code.
   inputs[0] = args[0];  // code
   inputs[1] = instance_node;
-  if (params > 0) base::Memcpy(&inputs[2], &args[1], params * sizeof(Node*));
+  if (params > 0) memcpy(&inputs[2], &args[1], params * sizeof(Node*));
 
   // Add effect and control inputs.
   inputs[params + 2] = effect();
@@ -7233,7 +7233,7 @@
   constexpr size_t kMaxNameLen = 128;
   constexpr size_t kNamePrefixLen = 11;
   auto name_buffer = std::unique_ptr<char[]>(new char[kMaxNameLen]);
-  base::Memcpy(name_buffer.get(), "js-to-wasm:", kNamePrefixLen);
+  memcpy(name_buffer.get(), "js-to-wasm:", kNamePrefixLen);
   PrintSignature(VectorOf(name_buffer.get(), kMaxNameLen) + kNamePrefixLen,
                  sig);
 
@@ -7611,7 +7611,7 @@
   constexpr size_t kMaxNameLen = 128;
   constexpr size_t kNamePrefixLen = 11;
   auto name_buffer = std::unique_ptr<char[]>(new char[kMaxNameLen]);
-  base::Memcpy(name_buffer.get(), "wasm-to-js:", kNamePrefixLen);
+  memcpy(name_buffer.get(), "wasm-to-js:", kNamePrefixLen);
   PrintSignature(VectorOf(name_buffer.get(), kMaxNameLen) + kNamePrefixLen,
                  sig);
 
@@ -7663,7 +7663,7 @@
   constexpr size_t kMaxNameLen = 128;
   constexpr size_t kNamePrefixLen = 9;
   auto name_buffer = std::unique_ptr<char[]>(new char[kMaxNameLen]);
-  base::Memcpy(name_buffer.get(), "js-to-js:", kNamePrefixLen);
+  memcpy(name_buffer.get(), "js-to-js:", kNamePrefixLen);
   PrintSignature(VectorOf(name_buffer.get(), kMaxNameLen) + kNamePrefixLen,
                  sig);
 
@@ -7718,7 +7718,7 @@
   constexpr size_t kMaxNameLen = 128;
   constexpr size_t kNamePrefixLen = 13;
   auto name_buffer = std::unique_ptr<char[]>(new char[kMaxNameLen]);
-  base::Memcpy(name_buffer.get(), "c-wasm-entry:", kNamePrefixLen);
+  memcpy(name_buffer.get(), "c-wasm-entry:", kNamePrefixLen);
   PrintSignature(VectorOf(name_buffer.get(), kMaxNameLen) + kNamePrefixLen,
                  sig);
 
@@ -7820,7 +7820,7 @@
   DCHECK(name_len > 0 && name_len < name_vector.length());
 
   char* index_name = zone->NewArray<char>(name_len);
-  base::Memcpy(index_name, name_vector.begin(), name_len);
+  memcpy(index_name, name_vector.begin(), name_len);
   return Vector<const char>(index_name, name_len);
 }
 
diff --git a/src/third_party/v8/src/d8/d8-posix.cc b/src/third_party/v8/src/d8/d8-posix.cc
index 010107e..a9a9fcd 100644
--- a/src/third_party/v8/src/d8/d8-posix.cc
+++ b/src/third_party/v8/src/d8/d8-posix.cc
@@ -317,7 +317,7 @@
               .ToLocalChecked();
       accumulator = String::Concat(isolate, accumulator, addition);
       fullness = bytes_read + fullness - length;
-      base::Memcpy(buffer, buffer + length, fullness);
+      memcpy(buffer, buffer + length, fullness);
     }
   } while (bytes_read != 0);
   return accumulator;
diff --git a/src/third_party/v8/src/d8/d8.cc b/src/third_party/v8/src/d8/d8.cc
index 24d837c..2b6f6f7 100644
--- a/src/third_party/v8/src/d8/d8.cc
+++ b/src/third_party/v8/src/d8/d8.cc
@@ -488,7 +488,7 @@
   if (entry != cached_code_map_.end() && entry->second) {
     int length = entry->second->length;
     uint8_t* cache = new uint8_t[length];
-    base::Memcpy(cache, entry->second->data, length);
+    memcpy(cache, entry->second->data, length);
     ScriptCompiler::CachedData* cached_data = new ScriptCompiler::CachedData(
         cache, length, ScriptCompiler::CachedData::BufferOwned);
     return cached_data;
@@ -505,7 +505,7 @@
   DCHECK(*key);
   int length = cache_data->length;
   uint8_t* cache = new uint8_t[length];
-  base::Memcpy(cache, cache_data->data, length);
+  memcpy(cache, cache_data->data, length);
   cached_code_map_[*key] = std::unique_ptr<ScriptCompiler::CachedData>(
       new ScriptCompiler::CachedData(cache, length,
                                      ScriptCompiler::CachedData::BufferOwned));
diff --git a/src/third_party/v8/src/debug/wasm/gdb-server/transport.cc b/src/third_party/v8/src/debug/wasm/gdb-server/transport.cc
index 79ed63a..9806a72 100644
--- a/src/third_party/v8/src/debug/wasm/gdb-server/transport.cc
+++ b/src/third_party/v8/src/debug/wasm/gdb-server/transport.cc
@@ -119,7 +119,7 @@
 
 void Transport::CopyFromBuffer(char** dst, int32_t* len) {
   int32_t copy_bytes = std::min(*len, size_ - pos_);
-  base::Memcpy(*dst, buf_.get() + pos_, copy_bytes);
+  memcpy(*dst, buf_.get() + pos_, copy_bytes);
   pos_ += copy_bytes;
   *len -= copy_bytes;
   *dst += copy_bytes;
diff --git a/src/third_party/v8/src/debug/wasm/gdb-server/wasm-module-debug.cc b/src/third_party/v8/src/debug/wasm/gdb-server/wasm-module-debug.cc
index 23d216f..50b9d8d 100644
--- a/src/third_party/v8/src/debug/wasm/gdb-server/wasm-module-debug.cc
+++ b/src/third_party/v8/src/debug/wasm/gdb-server/wasm-module-debug.cc
@@ -294,11 +294,11 @@
     uint8_t* mem_start = instance->memory_start();
     size_t mem_size = instance->memory_size();
     if (static_cast<uint64_t>(offset) + size <= mem_size) {
-      base::Memcpy(buffer, mem_start + offset, size);
+      memcpy(buffer, mem_start + offset, size);
       bytes_read = size;
     } else if (offset < mem_size) {
       bytes_read = static_cast<uint32_t>(mem_size) - offset;
-      base::Memcpy(buffer, mem_start + offset, bytes_read);
+      memcpy(buffer, mem_start + offset, bytes_read);
     }
   }
   return bytes_read;
@@ -318,7 +318,7 @@
     if (offset < wire_bytes.length()) {
       uint32_t module_size = static_cast<uint32_t>(wire_bytes.length());
       bytes_read = module_size - offset >= size ? size : module_size - offset;
-      base::Memcpy(buffer, wire_bytes.start() + offset, bytes_read);
+      memcpy(buffer, wire_bytes.start() + offset, bytes_read);
     }
   }
   return bytes_read;
@@ -351,7 +351,7 @@
                 uint32_t* size) {
   *size = sizeof(value);
   if (*size > buffer_size) return false;
-  base::Memcpy(buffer, &value, *size);
+  memcpy(buffer, &value, *size);
   return true;
 }
 
diff --git a/src/third_party/v8/src/diagnostics/gdb-jit.cc b/src/third_party/v8/src/diagnostics/gdb-jit.cc
index 2ce5b31..1d4a561 100644
--- a/src/third_party/v8/src/diagnostics/gdb-jit.cc
+++ b/src/third_party/v8/src/diagnostics/gdb-jit.cc
@@ -629,7 +629,7 @@
 #else
 #error Unsupported target architecture.
 #endif
-    base::Memcpy(header->ident, ident, 16);
+    memcpy(header->ident, ident, 16);
     header->type = 1;
 #if V8_TARGET_ARCH_IA32
     header->machine = 3;
diff --git a/src/third_party/v8/src/diagnostics/unwinding-info-win64.cc b/src/third_party/v8/src/diagnostics/unwinding-info-win64.cc
index c3f77e2..695e5ef 100644
--- a/src/third_party/v8/src/diagnostics/unwinding-info-win64.cc
+++ b/src/third_party/v8/src/diagnostics/unwinding-info-win64.cc
@@ -171,7 +171,7 @@
   masm.movq(rax, reinterpret_cast<uint64_t>(&CRASH_HANDLER_FUNCTION_NAME));
   masm.jmp(rax);
   DCHECK_LE(masm.instruction_size(), sizeof(record->exception_thunk));
-  base::Memcpy(&record->exception_thunk[0], masm.buffer_start(),
+  memcpy(&record->exception_thunk[0], masm.buffer_start(),
                masm.instruction_size());
 }
 
@@ -449,7 +449,7 @@
            Operand(reinterpret_cast<uint64_t>(&CRASH_HANDLER_FUNCTION_NAME)));
   masm.Br(x16);
   DCHECK_LE(masm.instruction_size(), sizeof(record->exception_thunk));
-  base::Memcpy(&record->exception_thunk[0], masm.buffer_start(),
+  memcpy(&record->exception_thunk[0], masm.buffer_start(),
                masm.instruction_size());
 }
 
diff --git a/src/third_party/v8/src/execution/arm/simulator-arm.cc b/src/third_party/v8/src/execution/arm/simulator-arm.cc
index f8e25e4..f041f3d 100644
--- a/src/third_party/v8/src/execution/arm/simulator-arm.cc
+++ b/src/third_party/v8/src/execution/arm/simulator-arm.cc
@@ -634,7 +634,7 @@
                        cache_page->CachedData(offset), kInstrSize));
   } else {
     // Cache miss.  Load memory into the cache.
-    base::Memcpy(cached_line, line, CachePage::kLineLength);
+    memcpy(cached_line, line, CachePage::kLineLength);
     *cache_valid_byte = CachePage::LINE_VALID;
   }
 }
@@ -739,14 +739,14 @@
   // Read the bits from the unsigned integer register_[] array
   // into the double precision floating point value and return it.
   char buffer[2 * sizeof(vfp_registers_[0])];
-  base::Memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
-  base::Memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
+  memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
+  memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
   return (dm_val);
 }
 
 void Simulator::set_register_pair_from_double(int reg, double* value) {
   DCHECK((reg >= 0) && (reg < num_registers) && ((reg % 2) == 0));
-  base::Memcpy(registers_ + reg, value, sizeof(*value));
+  memcpy(registers_ + reg, value, sizeof(*value));
 }
 
 void Simulator::set_dw_register(int dreg, const int* dbl) {
@@ -757,22 +757,22 @@
 
 void Simulator::get_d_register(int dreg, uint64_t* value) {
   DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
-  base::Memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value));
+  memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value));
 }
 
 void Simulator::set_d_register(int dreg, const uint64_t* value) {
   DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
-  base::Memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value));
+  memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value));
 }
 
 void Simulator::get_d_register(int dreg, uint32_t* value) {
   DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
-  base::Memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value) * 2);
+  memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value) * 2);
 }
 
 void Simulator::set_d_register(int dreg, const uint32_t* value) {
   DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
-  base::Memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value) * 2);
+  memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value) * 2);
 }
 
 template <typename T, int SIZE>
@@ -780,7 +780,7 @@
   DCHECK(SIZE == kSimd128Size || SIZE == kDoubleSize);
   DCHECK_LE(0, reg);
   DCHECK_GT(SIZE == kSimd128Size ? num_q_registers : num_d_registers, reg);
-  base::Memcpy(value, vfp_registers_ + reg * (SIZE / 4), SIZE);
+  memcpy(value, vfp_registers_ + reg * (SIZE / 4), SIZE);
 }
 
 template <typename T, int SIZE>
@@ -788,7 +788,7 @@
   DCHECK(SIZE == kSimd128Size || SIZE == kDoubleSize);
   DCHECK_LE(0, reg);
   DCHECK_GT(SIZE == kSimd128Size ? num_q_registers : num_d_registers, reg);
-  base::Memcpy(vfp_registers_ + reg * (SIZE / 4), value, SIZE);
+  memcpy(vfp_registers_ + reg * (SIZE / 4), value, SIZE);
 }
 
 // Raw access to the PC register.
@@ -824,7 +824,7 @@
   if (register_size == 2)
     DCHECK(reg_index < DwVfpRegister::SupportedRegisterCount());
 
-  base::Memcpy(&vfp_registers_[reg_index * register_size], &value, bytes);
+  memcpy(&vfp_registers_[reg_index * register_size], &value, bytes);
 }
 
 template <class ReturnType, int register_size>
@@ -837,7 +837,7 @@
     DCHECK(reg_index < DwVfpRegister::SupportedRegisterCount());
 
   ReturnType value;
-  base::Memcpy(&value, &vfp_registers_[register_size * reg_index], bytes);
+  memcpy(&value, &vfp_registers_[register_size * reg_index], bytes);
   return value;
 }
 
@@ -891,14 +891,14 @@
 void Simulator::SetFpResult(const double& result) {
   if (use_eabi_hardfloat()) {
     char buffer[2 * sizeof(vfp_registers_[0])];
-    base::Memcpy(buffer, &result, sizeof(buffer));
+    memcpy(buffer, &result, sizeof(buffer));
     // Copy result to d0.
-    base::Memcpy(vfp_registers_, buffer, sizeof(buffer));
+    memcpy(vfp_registers_, buffer, sizeof(buffer));
   } else {
     char buffer[2 * sizeof(registers_[0])];
-    base::Memcpy(buffer, &result, sizeof(buffer));
+    memcpy(buffer, &result, sizeof(buffer));
     // Copy result to r0 and r1.
-    base::Memcpy(registers_, buffer, sizeof(buffer));
+    memcpy(registers_, buffer, sizeof(buffer));
   }
 }
 
@@ -3417,7 +3417,7 @@
       if ((opc1_opc2 & 0xB) == 0) {
         // NeonS32 / NeonU32
         int32_t int_data[2];
-        base::Memcpy(int_data, &data, sizeof(int_data));
+        memcpy(int_data, &data, sizeof(int_data));
         set_register(rt, int_data[instr->Bit(21)]);
       } else {
         uint64_t data;
@@ -4083,7 +4083,7 @@
       // Set all bytes of register.
       std::fill_n(imms, kSimd128Size, imm);
       uint64_t imm64;
-      base::Memcpy(&imm64, imms, 8);
+      memcpy(&imm64, imms, 8);
       for (int r = 0; r < regs; r++) {
         simulator->set_d_register(vd + r, &imm64);
       }
@@ -4266,9 +4266,9 @@
   // underlying datatype easily.
   uint64_t tmp;
   simulator->get_d_register(Vn, &tmp);
-  base::Memcpy(src1, &tmp, sizeof(tmp));
+  memcpy(src1, &tmp, sizeof(tmp));
   simulator->get_d_register(Vm, &tmp);
-  base::Memcpy(src2, &tmp, sizeof(tmp));
+  memcpy(src2, &tmp, sizeof(tmp));
 
   for (int i = 0; i < kElems; i++) {
     dst[i] = WideType{src1[i]} * WideType{src2[i]};
@@ -6119,7 +6119,7 @@
     entry_stack &= -base::OS::ActivationFrameAlignment();
   }
   // Store remaining arguments on stack, from low to high memory.
-  base::Memcpy(reinterpret_cast<intptr_t*>(entry_stack),
+  memcpy(reinterpret_cast<intptr_t*>(entry_stack),
                arguments + reg_arg_count,
                (argument_count - reg_arg_count) * sizeof(*arguments));
   set_register(sp, entry_stack);
diff --git a/src/third_party/v8/src/execution/arm64/simulator-arm64.cc b/src/third_party/v8/src/execution/arm64/simulator-arm64.cc
index cca6e0d..aaf76a8 100644
--- a/src/third_party/v8/src/execution/arm64/simulator-arm64.cc
+++ b/src/third_party/v8/src/execution/arm64/simulator-arm64.cc
@@ -143,7 +143,7 @@
   char* stack = reinterpret_cast<char*>(entry_stack);
   std::vector<int64_t>::const_iterator it;
   for (it = stack_args.begin(); it != stack_args.end(); it++) {
-    base::Memcpy(stack, &(*it), sizeof(*it));
+    memcpy(stack, &(*it), sizeof(*it));
     stack += sizeof(*it);
   }
 
@@ -266,9 +266,9 @@
   DCHECK(sizeof(uintptr_t) < 2 * kXRegSize);
   intptr_t new_sp = sp() - 2 * kXRegSize;
   uintptr_t* alignment_slot = reinterpret_cast<uintptr_t*>(new_sp + kXRegSize);
-  base::Memcpy(alignment_slot, &kSlotsZapValue, kSystemPointerSize);
+  memcpy(alignment_slot, &kSlotsZapValue, kSystemPointerSize);
   uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(new_sp);
-  base::Memcpy(stack_slot, &address, kSystemPointerSize);
+  memcpy(stack_slot, &address, kSystemPointerSize);
   set_sp(new_sp);
   return new_sp;
 }
@@ -3594,9 +3594,9 @@
         uint32_t code;
         uint32_t parameters;
 
-        base::Memcpy(&code, pc_->InstructionAtOffset(kDebugCodeOffset),
+        memcpy(&code, pc_->InstructionAtOffset(kDebugCodeOffset),
                      sizeof(code));
-        base::Memcpy(&parameters, pc_->InstructionAtOffset(kDebugParamsOffset),
+        memcpy(&parameters, pc_->InstructionAtOffset(kDebugParamsOffset),
                      sizeof(parameters));
         char const* message = reinterpret_cast<char const*>(
             pc_->InstructionAtOffset(kDebugMessageOffset));
@@ -5816,8 +5816,8 @@
   uint32_t arg_count;
   uint32_t arg_pattern_list;
   STATIC_ASSERT(sizeof(*instr) == 1);
-  base::Memcpy(&arg_count, instr + kPrintfArgCountOffset, sizeof(arg_count));
-  base::Memcpy(&arg_pattern_list, instr + kPrintfArgPatternListOffset,
+  memcpy(&arg_count, instr + kPrintfArgCountOffset, sizeof(arg_count));
+  memcpy(&arg_pattern_list, instr + kPrintfArgPatternListOffset,
                sizeof(arg_pattern_list));
 
   DCHECK_LE(arg_count, kPrintfMaxArgCount);
diff --git a/src/third_party/v8/src/execution/arm64/simulator-arm64.h b/src/third_party/v8/src/execution/arm64/simulator-arm64.h
index 6098a74..93fb59a 100644
--- a/src/third_party/v8/src/execution/arm64/simulator-arm64.h
+++ b/src/third_party/v8/src/execution/arm64/simulator-arm64.h
@@ -251,7 +251,7 @@
     DCHECK((sizeof(value) == 1) || (sizeof(value) == 2) ||
            (sizeof(value) == 4) || (sizeof(value) == 8) ||
            (sizeof(value) == 16));
-    base::Memcpy(&value, reinterpret_cast<const char*>(address), sizeof(value));
+    memcpy(&value, reinterpret_cast<const char*>(address), sizeof(value));
     return value;
   }
 
@@ -261,7 +261,7 @@
     DCHECK((sizeof(value) == 1) || (sizeof(value) == 2) ||
            (sizeof(value) == 4) || (sizeof(value) == 8) ||
            (sizeof(value) == 16));
-    base::Memcpy(reinterpret_cast<char*>(address), &value, sizeof(value));
+    memcpy(reinterpret_cast<char*>(address), &value, sizeof(value));
   }
 };
 
@@ -327,7 +327,7 @@
       // All AArch64 registers are zero-extending.
       memset(value_ + sizeof(new_value), 0, kSizeInBytes - sizeof(new_value));
     }
-    base::Memcpy(&value_, &new_value, sizeof(T));
+    memcpy(&value_, &new_value, sizeof(T));
     NotifyRegisterWrite();
   }
 
@@ -340,7 +340,7 @@
     DCHECK_GE(lane, 0);
     DCHECK_LE(sizeof(new_value) + (lane * sizeof(new_value)),
               static_cast<unsigned>(kSizeInBytes));
-    base::Memcpy(&value_[lane * sizeof(new_value)], &new_value,
+    memcpy(&value_[lane * sizeof(new_value)], &new_value,
                  sizeof(new_value));
     NotifyRegisterWrite();
   }
@@ -351,7 +351,7 @@
     DCHECK_GE(lane, 0);
     DCHECK_LE(sizeof(result) + (lane * sizeof(result)),
               static_cast<unsigned>(kSizeInBytes));
-    base::Memcpy(&result, &value_[lane * sizeof(result)], sizeof(result));
+    memcpy(&result, &value_[lane * sizeof(result)], sizeof(result));
     return result;
   }
 
@@ -439,7 +439,7 @@
   int64_t IntLeftJustified(VectorFormat vform, int index) const {
     uint64_t value = UintLeftJustified(vform, index);
     int64_t result;
-    base::Memcpy(&result, &value, sizeof(result));
+    memcpy(&result, &value, sizeof(result));
     return result;
   }
 
@@ -675,13 +675,13 @@
     explicit CallArgument(T argument) {
       bits_ = 0;
       DCHECK(sizeof(argument) <= sizeof(bits_));
-      base::Memcpy(&bits_, &argument, sizeof(argument));
+      memcpy(&bits_, &argument, sizeof(argument));
       type_ = X_ARG;
     }
 
     explicit CallArgument(double argument) {
       DCHECK(sizeof(argument) == sizeof(bits_));
-      base::Memcpy(&bits_, &argument, sizeof(argument));
+      memcpy(&bits_, &argument, sizeof(argument));
       type_ = D_ARG;
     }
 
@@ -692,10 +692,10 @@
       // Make the D register a NaN to try to trap errors if the callee expects a
       // double. If it expects a float, the callee should ignore the top word.
       DCHECK(sizeof(kFP64SignallingNaN) == sizeof(bits_));
-      base::Memcpy(&bits_, &kFP64SignallingNaN, sizeof(kFP64SignallingNaN));
+      memcpy(&bits_, &kFP64SignallingNaN, sizeof(kFP64SignallingNaN));
       // Write the float payload to the S register.
       DCHECK(sizeof(argument) <= sizeof(bits_));
-      base::Memcpy(&bits_, &argument, sizeof(argument));
+      memcpy(&bits_, &argument, sizeof(argument));
       type_ = D_ARG;
     }
 
@@ -758,7 +758,7 @@
   template <typename T>
   void set_pc(T new_pc) {
     DCHECK(sizeof(T) == sizeof(pc_));
-    base::Memcpy(&pc_, &new_pc, sizeof(T));
+    memcpy(&pc_, &new_pc, sizeof(T));
     pc_modified_ = true;
   }
   Instruction* pc() { return pc_; }
@@ -1050,7 +1050,7 @@
     static_assert(sizeof(result) <= sizeof(raw),
                   "Template type must be <= 64 bits.");
     // Copy the result and truncate to fit. This assumes a little-endian host.
-    base::Memcpy(&result, &raw, sizeof(result));
+    memcpy(&result, &raw, sizeof(result));
     return result;
   }
 
@@ -1505,7 +1505,7 @@
     STATIC_ASSERT((sizeof(value) == 1) || (sizeof(value) == 2) ||
                   (sizeof(value) == 4) || (sizeof(value) == 8) ||
                   (sizeof(value) == 16));
-    base::Memcpy(&value, reinterpret_cast<const void*>(address), sizeof(value));
+    memcpy(&value, reinterpret_cast<const void*>(address), sizeof(value));
     return value;
   }
 
@@ -1515,7 +1515,7 @@
     STATIC_ASSERT((sizeof(value) == 1) || (sizeof(value) == 2) ||
                   (sizeof(value) == 4) || (sizeof(value) == 8) ||
                   (sizeof(value) == 16));
-    base::Memcpy(reinterpret_cast<void*>(address), &value, sizeof(value));
+    memcpy(reinterpret_cast<void*>(address), &value, sizeof(value));
   }
 
   template <typename T>
diff --git a/src/third_party/v8/src/execution/frames.cc b/src/third_party/v8/src/execution/frames.cc
index 9eba6a5..ea964e4 100644
--- a/src/third_party/v8/src/execution/frames.cc
+++ b/src/third_party/v8/src/execution/frames.cc
@@ -1818,7 +1818,7 @@
   const int kMaxPrintedFunctionName = 64;
   char func_name[kMaxPrintedFunctionName + 1];
   int func_name_len = std::min(kMaxPrintedFunctionName, raw_func_name.length());
-  base::Memcpy(func_name, raw_func_name.begin(), func_name_len);
+  memcpy(func_name, raw_func_name.begin(), func_name_len);
   func_name[func_name_len] = '\0';
   int pos = position();
   const wasm::WasmModule* module = wasm_instance().module_object().module();
diff --git a/src/third_party/v8/src/execution/mips/simulator-mips.cc b/src/third_party/v8/src/execution/mips/simulator-mips.cc
index d4cd203..28f996c 100644
--- a/src/third_party/v8/src/execution/mips/simulator-mips.cc
+++ b/src/third_party/v8/src/execution/mips/simulator-mips.cc
@@ -850,7 +850,7 @@
                        cache_page->CachedData(offset), kInstrSize));
   } else {
     // Cache miss.  Load memory into the cache.
-    base::Memcpy(cached_line, line, CachePage::kLineLength);
+    memcpy(cached_line, line, CachePage::kLineLength);
     *cache_valid_byte = CachePage::LINE_VALID;
   }
 }
@@ -990,8 +990,8 @@
   // Read the bits from the unsigned integer register_[] array
   // into the double precision floating point value and return it.
   char buffer[2 * sizeof(registers_[0])];
-  base::Memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
-  base::Memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
+  memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
+  memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
   return (dm_val);
 }
 
@@ -1044,13 +1044,13 @@
 template <typename T>
 void Simulator::get_msa_register(int wreg, T* value) {
   DCHECK((wreg >= 0) && (wreg < kNumMSARegisters));
-  base::Memcpy(value, FPUregisters_ + wreg * 2, kSimd128Size);
+  memcpy(value, FPUregisters_ + wreg * 2, kSimd128Size);
 }
 
 template <typename T>
 void Simulator::set_msa_register(int wreg, const T* value) {
   DCHECK((wreg >= 0) && (wreg < kNumMSARegisters));
-  base::Memcpy(FPUregisters_ + wreg * 2, value, kSimd128Size);
+  memcpy(FPUregisters_ + wreg * 2, value, kSimd128Size);
 }
 
 // Runtime FP routines take up to two double arguments and zero
@@ -1071,14 +1071,14 @@
     // Registers a0 and a1 -> x.
     reg_buffer[0] = get_register(a0);
     reg_buffer[1] = get_register(a1);
-    base::Memcpy(x, buffer, sizeof(buffer));
+    memcpy(x, buffer, sizeof(buffer));
     // Registers a2 and a3 -> y.
     reg_buffer[0] = get_register(a2);
     reg_buffer[1] = get_register(a3);
-    base::Memcpy(y, buffer, sizeof(buffer));
+    memcpy(y, buffer, sizeof(buffer));
     // Register 2 -> z.
     reg_buffer[0] = get_register(a2);
-    base::Memcpy(z, buffer, sizeof(*z));
+    memcpy(z, buffer, sizeof(*z));
   }
 }
 
@@ -1089,7 +1089,7 @@
   } else {
     char buffer[2 * sizeof(registers_[0])];
     int32_t* reg_buffer = reinterpret_cast<int32_t*>(buffer);
-    base::Memcpy(buffer, &result, sizeof(buffer));
+    memcpy(buffer, &result, sizeof(buffer));
     // Copy result to v0 and v1.
     set_register(v0, reg_buffer[0]);
     set_register(v1, reg_buffer[1]);
@@ -1656,7 +1656,7 @@
       float f[4];
       double df[2];
     } v;
-    base::Memcpy(v.b, value, kSimd128Size);
+    memcpy(v.b, value, kSimd128Size);
     switch (t) {
       case BYTE:
         SNPrintF(trace_buf_,
@@ -1709,7 +1709,7 @@
       float f[kMSALanesWord];
       double df[kMSALanesDword];
     } v;
-    base::Memcpy(v.b, value, kMSALanesByte);
+    memcpy(v.b, value, kMSALanesByte);
 
     if (std::is_same<T, int32_t>::value) {
       SNPrintF(trace_buf_,
@@ -7031,7 +7031,7 @@
   }
   // Store remaining arguments on stack, from low to high memory.
   intptr_t* stack_argument = reinterpret_cast<intptr_t*>(entry_stack);
-  base::Memcpy(stack_argument + kCArgSlotCount, arguments + reg_arg_count,
+  memcpy(stack_argument + kCArgSlotCount, arguments + reg_arg_count,
                (argument_count - reg_arg_count) * sizeof(*arguments));
   set_register(sp, entry_stack);
 
@@ -7051,9 +7051,9 @@
   } else {
     int buffer[2];
     DCHECK(sizeof(buffer[0]) * 2 == sizeof(d0));
-    base::Memcpy(buffer, &d0, sizeof(d0));
+    memcpy(buffer, &d0, sizeof(d0));
     set_dw_register(a0, buffer);
-    base::Memcpy(buffer, &d1, sizeof(d1));
+    memcpy(buffer, &d1, sizeof(d1));
     set_dw_register(a2, buffer);
   }
   CallInternal(entry);
diff --git a/src/third_party/v8/src/execution/mips64/simulator-mips64.cc b/src/third_party/v8/src/execution/mips64/simulator-mips64.cc
index 0f52ea7..b11680e 100644
--- a/src/third_party/v8/src/execution/mips64/simulator-mips64.cc
+++ b/src/third_party/v8/src/execution/mips64/simulator-mips64.cc
@@ -791,7 +791,7 @@
                        cache_page->CachedData(offset), kInstrSize));
   } else {
     // Cache miss.  Load memory into the cache.
-    base::Memcpy(cached_line, line, CachePage::kLineLength);
+    memcpy(cached_line, line, CachePage::kLineLength);
     *cache_valid_byte = CachePage::LINE_VALID;
   }
 }
@@ -932,8 +932,8 @@
   // Read the bits from the unsigned integer register_[] array
   // into the double precision floating point value and return it.
   char buffer[sizeof(registers_[0])];
-  base::Memcpy(buffer, &registers_[reg], sizeof(registers_[0]));
-  base::Memcpy(&dm_val, buffer, sizeof(registers_[0]));
+  memcpy(buffer, &registers_[reg], sizeof(registers_[0]));
+  memcpy(&dm_val, buffer, sizeof(registers_[0]));
   return (dm_val);
 }
 
@@ -970,13 +970,13 @@
 template <typename T>
 void Simulator::get_msa_register(int wreg, T* value) {
   DCHECK((wreg >= 0) && (wreg < kNumMSARegisters));
-  base::Memcpy(value, FPUregisters_ + wreg * 2, kSimd128Size);
+  memcpy(value, FPUregisters_ + wreg * 2, kSimd128Size);
 }
 
 template <typename T>
 void Simulator::set_msa_register(int wreg, const T* value) {
   DCHECK((wreg >= 0) && (wreg < kNumMSARegisters));
-  base::Memcpy(FPUregisters_ + wreg * 2, value, kSimd128Size);
+  memcpy(FPUregisters_ + wreg * 2, value, kSimd128Size);
 }
 
 // Runtime FP routines take up to two double arguments and zero
@@ -998,14 +998,14 @@
     // Registers a0 and a1 -> x.
     reg_buffer[0] = get_register(a0);
     reg_buffer[1] = get_register(a1);
-    base::Memcpy(x, buffer, sizeof(buffer));
+    memcpy(x, buffer, sizeof(buffer));
     // Registers a2 and a3 -> y.
     reg_buffer[0] = get_register(a2);
     reg_buffer[1] = get_register(a3);
-    base::Memcpy(y, buffer, sizeof(buffer));
+    memcpy(y, buffer, sizeof(buffer));
     // Register 2 -> z.
     reg_buffer[0] = get_register(a2);
-    base::Memcpy(z, buffer, sizeof(*z));
+    memcpy(z, buffer, sizeof(*z));
   }
 }
 
@@ -1016,7 +1016,7 @@
   } else {
     char buffer[2 * sizeof(registers_[0])];
     int64_t* reg_buffer = reinterpret_cast<int64_t*>(buffer);
-    base::Memcpy(buffer, &result, sizeof(buffer));
+    memcpy(buffer, &result, sizeof(buffer));
     // Copy result to v0 and v1.
     set_register(v0, reg_buffer[0]);
     set_register(v1, reg_buffer[1]);
@@ -1593,7 +1593,7 @@
       float f[4];
       double df[2];
     } v;
-    base::Memcpy(v.b, value, kSimd128Size);
+    memcpy(v.b, value, kSimd128Size);
     switch (t) {
       case BYTE:
         SNPrintF(trace_buf_,
@@ -1646,7 +1646,7 @@
       float f[kMSALanesWord];
       double df[kMSALanesDword];
     } v;
-    base::Memcpy(v.b, value, kMSALanesByte);
+    memcpy(v.b, value, kMSALanesByte);
 
     if (std::is_same<T, int32_t>::value) {
       SNPrintF(trace_buf_,
@@ -7450,7 +7450,7 @@
   }
   // Store remaining arguments on stack, from low to high memory.
   intptr_t* stack_argument = reinterpret_cast<intptr_t*>(entry_stack);
-  base::Memcpy(stack_argument + kCArgSlotCount, arguments + reg_arg_count,
+  memcpy(stack_argument + kCArgSlotCount, arguments + reg_arg_count,
                stack_args_count * sizeof(*arguments));
   set_register(sp, entry_stack);
 
@@ -7471,9 +7471,9 @@
   } else {
     int buffer[2];
     DCHECK(sizeof(buffer[0]) * 2 == sizeof(d0));
-    base::Memcpy(buffer, &d0, sizeof(d0));
+    memcpy(buffer, &d0, sizeof(d0));
     set_dw_register(a0, buffer);
-    base::Memcpy(buffer, &d1, sizeof(d1));
+    memcpy(buffer, &d1, sizeof(d1));
     set_dw_register(a2, buffer);
   }
   CallInternal(entry);
diff --git a/src/third_party/v8/src/execution/ppc/simulator-ppc.cc b/src/third_party/v8/src/execution/ppc/simulator-ppc.cc
index 50a47de..893001d 100644
--- a/src/third_party/v8/src/execution/ppc/simulator-ppc.cc
+++ b/src/third_party/v8/src/execution/ppc/simulator-ppc.cc
@@ -715,7 +715,7 @@
                        cache_page->CachedData(offset), kInstrSize));
   } else {
     // Cache miss.  Load memory into the cache.
-    base::Memcpy(cached_line, line, CachePage::kLineLength);
+    memcpy(cached_line, line, CachePage::kLineLength);
     *cache_valid_byte = CachePage::LINE_VALID;
   }
 }
@@ -801,8 +801,8 @@
   // Read the bits from the unsigned integer register_[] array
   // into the double precision floating point value and return it.
   char buffer[sizeof(fp_registers_[0])];
-  base::Memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
-  base::Memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
+  memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
+  memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
 #endif
   return (dm_val);
 }
@@ -1194,7 +1194,7 @@
             set_register(r3, x);
             set_register(r4, y);
           } else {
-            base::Memcpy(reinterpret_cast<void*>(result_buffer), &result,
+            memcpy(reinterpret_cast<void*>(result_buffer), &result,
                          sizeof(ObjectPair));
             set_register(r3, result_buffer);
           }
@@ -3926,7 +3926,7 @@
   // +2 is a hack for the LR slot + old SP on PPC
   intptr_t* stack_argument =
       reinterpret_cast<intptr_t*>(entry_stack) + kStackFrameExtraParamSlot;
-  base::Memcpy(stack_argument, arguments + reg_arg_count,
+  memcpy(stack_argument, arguments + reg_arg_count,
                stack_arg_count * sizeof(*arguments));
   set_register(sp, entry_stack);
 
diff --git a/src/third_party/v8/src/execution/ppc/simulator-ppc.h b/src/third_party/v8/src/execution/ppc/simulator-ppc.h
index 83b6109..16d443a 100644
--- a/src/third_party/v8/src/execution/ppc/simulator-ppc.h
+++ b/src/third_party/v8/src/execution/ppc/simulator-ppc.h
@@ -253,7 +253,7 @@
   template <typename T>
   inline void Read(uintptr_t address, T* value) {
     base::MutexGuard lock_guard(&GlobalMonitor::Get()->mutex);
-    base::Memcpy(value, reinterpret_cast<const char*>(address), sizeof(T));
+    memcpy(value, reinterpret_cast<const char*>(address), sizeof(T));
   }
 
   template <typename T>
@@ -262,7 +262,7 @@
     GlobalMonitor::Get()->NotifyLoadExcl(
         address, static_cast<TransactionSize>(sizeof(T)),
         isolate_->thread_id());
-    base::Memcpy(value, reinterpret_cast<const char*>(address), sizeof(T));
+    memcpy(value, reinterpret_cast<const char*>(address), sizeof(T));
   }
 
   template <typename T>
@@ -271,7 +271,7 @@
     GlobalMonitor::Get()->NotifyStore(address,
                                       static_cast<TransactionSize>(sizeof(T)),
                                       isolate_->thread_id());
-    base::Memcpy(reinterpret_cast<char*>(address), &value, sizeof(T));
+    memcpy(reinterpret_cast<char*>(address), &value, sizeof(T));
   }
 
   template <typename T>
@@ -280,7 +280,7 @@
     if (GlobalMonitor::Get()->NotifyStoreExcl(
             address, static_cast<TransactionSize>(sizeof(T)),
             isolate_->thread_id())) {
-      base::Memcpy(reinterpret_cast<char*>(address), &value, sizeof(T));
+      memcpy(reinterpret_cast<char*>(address), &value, sizeof(T));
       return 0;
     } else {
       return 1;
diff --git a/src/third_party/v8/src/execution/s390/simulator-s390.cc b/src/third_party/v8/src/execution/s390/simulator-s390.cc
index 0485422..9346717 100644
--- a/src/third_party/v8/src/execution/s390/simulator-s390.cc
+++ b/src/third_party/v8/src/execution/s390/simulator-s390.cc
@@ -735,7 +735,7 @@
              0);
   } else {
     // Cache miss.  Load memory into the cache.
-    base::Memcpy(cached_line, line, CachePage::kLineLength);
+    memcpy(cached_line, line, CachePage::kLineLength);
     *cache_valid_byte = CachePage::LINE_VALID;
   }
 }
@@ -1675,8 +1675,8 @@
   // Read the bits from the unsigned integer register_[] array
   // into the double precision floating point value and return it.
   char buffer[sizeof(fp_registers_[0])];
-  base::Memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
-  base::Memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
+  memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
+  memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
 #endif
   return (dm_val);
 }
@@ -2143,7 +2143,7 @@
             set_register(r2, x);
             set_register(r3, y);
           } else {
-            base::Memcpy(reinterpret_cast<void*>(result_buffer), &result,
+            memcpy(reinterpret_cast<void*>(result_buffer), &result,
                          sizeof(ObjectPair));
             set_register(r2, result_buffer);
           }
@@ -2573,7 +2573,7 @@
   // Store remaining arguments on stack, from low to high memory.
   intptr_t* stack_argument =
       reinterpret_cast<intptr_t*>(entry_stack + kCalleeRegisterSaveAreaSize);
-  base::Memcpy(stack_argument, arguments + reg_arg_count,
+  memcpy(stack_argument, arguments + reg_arg_count,
                stack_arg_count * sizeof(*arguments));
   set_register(sp, entry_stack);
 
@@ -3034,7 +3034,7 @@
   const int size_by_byte = 1 << m4;
   int8_t* src = get_simd_register(r3).int8 + index * size_by_byte;
   set_register(r1, 0);
-  base::Memcpy(&get_register(r1), src, size_by_byte);
+  memcpy(&get_register(r1), src, size_by_byte);
   return length;
 }
 
@@ -3045,7 +3045,7 @@
   int64_t index = b2_val + d2;
   const int size_by_byte = 1 << m4;
   int8_t* dst = get_simd_register(r1).int8 + index * size_by_byte;
-  base::Memcpy(dst, &get_register(r3), size_by_byte);
+  memcpy(dst, &get_register(r3), size_by_byte);
   return length;
 }
 
@@ -3065,7 +3065,7 @@
   int8_t* src = get_simd_register(r3).int8;
   int8_t* dst = get_simd_register(r1).int8;
   for (int i = 0; i < kSimd128Size; i += size_by_byte) {
-    base::Memcpy(dst + i, src + i2 * size_by_byte, size_by_byte);
+    memcpy(dst + i, src + i2 * size_by_byte, size_by_byte);
   }
   return length;
 }
@@ -3079,7 +3079,7 @@
   int8_t* src = reinterpret_cast<int8_t*>(addr);
   set_simd_register(r1, fp_zero);
   for (int i = 0; i < kSimd128Size; i += size_by_byte) {
-    base::Memcpy(dst + i, src, size_by_byte);
+    memcpy(dst + i, src, size_by_byte);
   }
   return length;
 }
@@ -3092,7 +3092,7 @@
   uint64_t immediate = static_cast<uint64_t>(i2);
   set_simd_register(r1, fp_zero);
   for (int i = 0; i < kSimd128Size; i += size_by_byte) {
-    base::Memcpy(dst + i, &immediate, size_by_byte);
+    memcpy(dst + i, &immediate, size_by_byte);
   }
   return length;
 }
@@ -3136,7 +3136,7 @@
     T& src1_val = *reinterpret_cast<T*>(src1_ptr + i);
     T& src2_val = *reinterpret_cast<T*>(src2_ptr + i);
     dst_val = op(src1_val, src2_val);
-    base::Memcpy(dst_ptr + i, &dst_val, sizeof(T));
+    memcpy(dst_ptr + i, &dst_val, sizeof(T));
   }
 }
 
@@ -3262,7 +3262,7 @@
     value += *(reinterpret_cast<S*>(src1) + i);
     if ((i + 1) % (sizeof(D) / sizeof(S)) == 0) {
       value += *(reinterpret_cast<S*>(src2) + i);
-      base::Memcpy(reinterpret_cast<D*>(dst) + i / (sizeof(D) / sizeof(S)),
+      memcpy(reinterpret_cast<D*>(dst) + i / (sizeof(D) / sizeof(S)),
                    &value, sizeof(D));
       value = 0;
     }
@@ -3320,14 +3320,14 @@
       src = reinterpret_cast<S*>(src2);
       count = 0;
     }
-    base::Memcpy(&value, src + count, sizeof(S));
+    memcpy(&value, src + count, sizeof(S));
     if (saturate) {
       if (value > max)
         value = max;
       else if (value < min)
         value = min;
     }
-    base::Memcpy(reinterpret_cast<D*>(dst) + i, &value, sizeof(D));
+    memcpy(reinterpret_cast<D*>(dst) + i, &value, sizeof(D));
   }
 }
 
@@ -3412,7 +3412,7 @@
   D value = 0;
   for (size_t i = 0; i < kItemCount; i++) {
     value = *(reinterpret_cast<S*>(src) + i + kItemCount);
-    base::Memcpy(reinterpret_cast<D*>(dst) + i, &value, sizeof(D));
+    memcpy(reinterpret_cast<D*>(dst) + i, &value, sizeof(D));
   }
 }
 
@@ -3473,7 +3473,7 @@
     temps[i] = static_cast<D>(*(reinterpret_cast<S*>(src) + i));
   }
   for (size_t i = 0; i < kItemCount; i++) {
-    base::Memcpy(reinterpret_cast<D*>(dst) + i, &temps[i], sizeof(D));
+    memcpy(reinterpret_cast<D*>(dst) + i, &temps[i], sizeof(D));
   }
 }
 
@@ -3710,7 +3710,7 @@
     T& src_val = *reinterpret_cast<T*>(src_ptr + i);
     T& dst_val = *reinterpret_cast<T*>(dst_ptr + i);
     dst_val = -(uint64_t)src_val;
-    base::Memcpy(dst_ptr + i, &dst_val, sizeof(T));
+    memcpy(dst_ptr + i, &dst_val, sizeof(T));
   }
 }
 
@@ -3815,7 +3815,7 @@
     T& dst_val = *reinterpret_cast<T*>(dst_ptr + i);
     T& src_val = *reinterpret_cast<T*>(src_ptr + i);
     dst_val = op(src_val, shift);
-    base::Memcpy(dst_ptr + i, &dst_val, sizeof(T));
+    memcpy(dst_ptr + i, &dst_val, sizeof(T));
   }
 }
 
@@ -4073,7 +4073,7 @@
     T src1_val = *(src1_ptr + i);
     T src2_val = *(src2_ptr + i);
     T value = op(src1_val, src2_val, mode);
-    base::Memcpy(dst_ptr + i, &value, sizeof(T));
+    memcpy(dst_ptr + i, &value, sizeof(T));
   }
 }
 
@@ -4147,7 +4147,7 @@
     S src1_val = *(src1_ptr + i);
     S src2_val = *(src2_ptr + i);
     D value = op(src1_val, src2_val);
-    base::Memcpy(dst_ptr + i, &value, sizeof(D));
+    memcpy(dst_ptr + i, &value, sizeof(D));
   }
 }
 
@@ -4216,33 +4216,33 @@
     case 0:
       if (m4 == 8) {
         T value = -(*src_ptr);
-        base::Memcpy(dst_ptr, &value, sizeof(T));
+        memcpy(dst_ptr, &value, sizeof(T));
       } else {
         for (size_t i = 0; i < kSimd128Size / sizeof(T); i++) {
           T value = -(*(src_ptr + i));
-          base::Memcpy(dst_ptr + i, &value, sizeof(T));
+          memcpy(dst_ptr + i, &value, sizeof(T));
         }
       }
       break;
     case 1:
       if (m4 == 8) {
         T value = -abs(*src_ptr);
-        base::Memcpy(dst_ptr, &value, sizeof(T));
+        memcpy(dst_ptr, &value, sizeof(T));
       } else {
         for (size_t i = 0; i < kSimd128Size / sizeof(T); i++) {
           T value = -abs(*(src_ptr + i));
-          base::Memcpy(dst_ptr + i, &value, sizeof(T));
+          memcpy(dst_ptr + i, &value, sizeof(T));
         }
       }
       break;
     case 2:
       if (m4 == 8) {
         T value = abs(*src_ptr);
-        base::Memcpy(dst_ptr, &value, sizeof(T));
+        memcpy(dst_ptr, &value, sizeof(T));
       } else {
         for (size_t i = 0; i < kSimd128Size / sizeof(T); i++) {
           T value = abs(*(src_ptr + i));
-          base::Memcpy(dst_ptr + i, &value, sizeof(T));
+          memcpy(dst_ptr + i, &value, sizeof(T));
         }
       }
       break;
@@ -4279,7 +4279,7 @@
   T* src_ptr = reinterpret_cast<T*>(src);
   for (size_t i = 0; i < kSimd128Size / sizeof(T); i++) {
     T value = sqrt(*(src_ptr + i));
-    base::Memcpy(dst_ptr + i, &value, sizeof(T));
+    memcpy(dst_ptr + i, &value, sizeof(T));
   }
 }
 
diff --git a/src/third_party/v8/src/heap/heap.cc b/src/third_party/v8/src/heap/heap.cc
index 6b6f647..77d673a 100644
--- a/src/third_party/v8/src/heap/heap.cc
+++ b/src/third_party/v8/src/heap/heap.cc
@@ -4656,12 +4656,12 @@
 void Heap::AddToRingBuffer(const char* string) {
   size_t first_part =
       Min(strlen(string), kTraceRingBufferSize - ring_buffer_end_);
-  base::Memcpy(trace_ring_buffer_ + ring_buffer_end_, string, first_part);
+  memcpy(trace_ring_buffer_ + ring_buffer_end_, string, first_part);
   ring_buffer_end_ += first_part;
   if (first_part < strlen(string)) {
     ring_buffer_full_ = true;
     size_t second_part = strlen(string) - first_part;
-    base::Memcpy(trace_ring_buffer_, string + first_part, second_part);
+    memcpy(trace_ring_buffer_, string + first_part, second_part);
     ring_buffer_end_ = second_part;
   }
 }
@@ -4671,9 +4671,9 @@
   size_t copied = 0;
   if (ring_buffer_full_) {
     copied = kTraceRingBufferSize - ring_buffer_end_;
-    base::Memcpy(buffer, trace_ring_buffer_ + ring_buffer_end_, copied);
+    memcpy(buffer, trace_ring_buffer_ + ring_buffer_end_, copied);
   }
-  base::Memcpy(buffer + copied, trace_ring_buffer_, ring_buffer_end_);
+  memcpy(buffer + copied, trace_ring_buffer_, ring_buffer_end_);
 }
 
 void Heap::ConfigureHeapDefault() {
diff --git a/src/third_party/v8/src/libplatform/tracing/trace-object.cc b/src/third_party/v8/src/libplatform/tracing/trace-object.cc
index 3378003..0aec826 100644
--- a/src/third_party/v8/src/libplatform/tracing/trace-object.cc
+++ b/src/third_party/v8/src/libplatform/tracing/trace-object.cc
@@ -25,7 +25,7 @@
                                                const char** member) {
   if (*member == nullptr) return;
   size_t length = strlen(*member) + 1;
-  base::Memcpy(*buffer, *member, length);
+  memcpy(*buffer, *member, length);
   *member = *buffer;
   *buffer += length;
 }
diff --git a/src/third_party/v8/src/numbers/conversions-inl.h b/src/third_party/v8/src/numbers/conversions-inl.h
index 2e1823e..43421e3 100644
--- a/src/third_party/v8/src/numbers/conversions-inl.h
+++ b/src/third_party/v8/src/numbers/conversions-inl.h
@@ -51,7 +51,7 @@
         reinterpret_cast<void*>(reinterpret_cast<Address>(&x) + kInt32Size);
 #endif
     // Copy least significant 32 bits of mantissa.
-    base::Memcpy(&result, mantissa_ptr, sizeof(result));
+    memcpy(&result, mantissa_ptr, sizeof(result));
     return negative ? ~result + 1 : result;
   }
   // Large number (outside uint32 range), Infinity or NaN.
diff --git a/src/third_party/v8/src/numbers/conversions.cc b/src/third_party/v8/src/numbers/conversions.cc
index 1081a3d..f83f19e 100644
--- a/src/third_party/v8/src/numbers/conversions.cc
+++ b/src/third_party/v8/src/numbers/conversions.cc
@@ -1348,7 +1348,7 @@
   DCHECK_LE(0, integer_cursor);
   // Allocate new string as return value.
   char* result = NewArray<char>(fraction_cursor - integer_cursor);
-  base::Memcpy(result, buffer + integer_cursor,
+  memcpy(result, buffer + integer_cursor,
                fraction_cursor - integer_cursor);
   return result;
 }
diff --git a/src/third_party/v8/src/objects/backing-store.cc b/src/third_party/v8/src/objects/backing-store.cc
index fd04433..53e3837 100644
--- a/src/third_party/v8/src/objects/backing-store.cc
+++ b/src/third_party/v8/src/objects/backing-store.cc
@@ -465,7 +465,7 @@
     // If the allocation was successful, then the new buffer must be at least
     // as big as the old one.
     DCHECK_GE(new_pages * wasm::kWasmPageSize, byte_length_);
-    base::Memcpy(new_backing_store->buffer_start(), buffer_start_,
+    memcpy(new_backing_store->buffer_start(), buffer_start_,
                  byte_length_);
   }
 
diff --git a/src/third_party/v8/src/objects/bigint.cc b/src/third_party/v8/src/objects/bigint.cc
index d1345cb..f2cd964 100644
--- a/src/third_party/v8/src/objects/bigint.cc
+++ b/src/third_party/v8/src/objects/bigint.cc
@@ -362,7 +362,7 @@
   int length = source->length();
   // Allocating a BigInt of the same length as an existing BigInt cannot throw.
   Handle<MutableBigInt> result = New(isolate, length).ToHandleChecked();
-  base::Memcpy(
+  memcpy(
       reinterpret_cast<void*>(result->address() + BigIntBase::kHeaderSize),
       reinterpret_cast<void*>(source->address() + BigIntBase::kHeaderSize),
       BigInt::SizeFor(length) - BigIntBase::kHeaderSize);
@@ -2007,7 +2007,7 @@
       reinterpret_cast<void*>(ptr() + kDigitsOffset - kHeapObjectTag);
 #if defined(V8_TARGET_LITTLE_ENDIAN)
   int bytelength = length() * kDigitSize;
-  base::Memcpy(storage, digits, bytelength);
+  memcpy(storage, digits, bytelength);
 #elif defined(V8_TARGET_BIG_ENDIAN)
   digit_t* digit_storage = reinterpret_cast<digit_t*>(storage);
   const digit_t* digit = reinterpret_cast<const digit_t*>(digits);
@@ -2033,7 +2033,7 @@
   void* digits =
       reinterpret_cast<void*>(result->ptr() + kDigitsOffset - kHeapObjectTag);
 #if defined(V8_TARGET_LITTLE_ENDIAN)
-  base::Memcpy(digits, digits_storage.begin(), bytelength);
+  memcpy(digits, digits_storage.begin(), bytelength);
   void* padding_start =
       reinterpret_cast<void*>(reinterpret_cast<Address>(digits) + bytelength);
   memset(padding_start, 0, length * kDigitSize - bytelength);
diff --git a/src/third_party/v8/src/objects/fixed-array-inl.h b/src/third_party/v8/src/objects/fixed-array-inl.h
index ab2bc53..c4eafe1 100644
--- a/src/third_party/v8/src/objects/fixed-array-inl.h
+++ b/src/third_party/v8/src/objects/fixed-array-inl.h
@@ -530,14 +530,14 @@
   DCHECK(index >= 0 && length >= 0 && length <= kMaxInt - index &&
          index + length <= this->length());
   Address dst_addr = field_address(kHeaderSize + index * kCharSize);
-  base::Memcpy(reinterpret_cast<void*>(dst_addr), buffer, length);
+  memcpy(reinterpret_cast<void*>(dst_addr), buffer, length);
 }
 
 void ByteArray::copy_out(int index, byte* buffer, int length) {
   DCHECK(index >= 0 && length >= 0 && length <= kMaxInt - index &&
          index + length <= this->length());
   Address src_addr = field_address(kHeaderSize + index * kCharSize);
-  base::Memcpy(buffer, reinterpret_cast<void*>(src_addr), length);
+  memcpy(buffer, reinterpret_cast<void*>(src_addr), length);
 }
 
 int ByteArray::get_int(int index) const {
diff --git a/src/third_party/v8/src/objects/js-array-buffer.cc b/src/third_party/v8/src/objects/js-array-buffer.cc
index 9a7348b..15477ac 100644
--- a/src/third_party/v8/src/objects/js-array-buffer.cc
+++ b/src/third_party/v8/src/objects/js-array-buffer.cc
@@ -175,7 +175,7 @@
 
   // Copy the elements into the backing store of the array buffer.
   if (byte_length > 0) {
-    base::Memcpy(backing_store->buffer_start(), self->DataPtr(), byte_length);
+    memcpy(backing_store->buffer_start(), self->DataPtr(), byte_length);
   }
 
   // Attach the backing store to the array buffer.
diff --git a/src/third_party/v8/src/objects/layout-descriptor.cc b/src/third_party/v8/src/objects/layout-descriptor.cc
index c9c1244..680f8d3 100644
--- a/src/third_party/v8/src/objects/layout-descriptor.cc
+++ b/src/third_party/v8/src/objects/layout-descriptor.cc
@@ -102,7 +102,7 @@
   DCHECK(new_layout_descriptor->IsSlowLayout());
 
   if (layout_descriptor->IsSlowLayout()) {
-    base::Memcpy(new_layout_descriptor->GetDataStartAddress(),
+    memcpy(new_layout_descriptor->GetDataStartAddress(),
                  layout_descriptor->GetDataStartAddress(),
                  layout_descriptor->DataSize());
     return new_layout_descriptor;
diff --git a/src/third_party/v8/src/objects/shared-function-info-inl.h b/src/third_party/v8/src/objects/shared-function-info-inl.h
index 75dfd95..70ef90d 100644
--- a/src/third_party/v8/src/objects/shared-function-info-inl.h
+++ b/src/third_party/v8/src/objects/shared-function-info-inl.h
@@ -60,7 +60,7 @@
   DCHECK(index >= 0 && length >= 0 && length <= kMaxInt - index &&
          index + length <= this->data_length());
   Address dst_addr = field_address(kDataStartOffset + index * kByteSize);
-  base::Memcpy(reinterpret_cast<void*>(dst_addr), buffer, length);
+  memcpy(reinterpret_cast<void*>(dst_addr), buffer, length);
 }
 
 PreparseData PreparseData::get_child(int index) const {
diff --git a/src/third_party/v8/src/objects/value-serializer.cc b/src/third_party/v8/src/objects/value-serializer.cc
index e5c53b4..d5119cf 100644
--- a/src/third_party/v8/src/objects/value-serializer.cc
+++ b/src/third_party/v8/src/objects/value-serializer.cc
@@ -327,7 +327,7 @@
 void ValueSerializer::WriteRawBytes(const void* source, size_t length) {
   uint8_t* dest;
   if (ReserveRawBytes(length).To(&dest) && length > 0) {
-    base::Memcpy(dest, source, length);
+    memcpy(dest, source, length);
   }
 }
 
@@ -1177,7 +1177,7 @@
   // Warning: this uses host endianness.
   if (position_ > end_ - sizeof(double)) return Nothing<double>();
   double value;
-  base::Memcpy(&value, position_, sizeof(double));
+  memcpy(&value, position_, sizeof(double));
   position_ += sizeof(double);
   if (std::isnan(value)) value = std::numeric_limits<double>::quiet_NaN();
   return Just(value);
@@ -1414,7 +1414,7 @@
   // Copy the bytes directly into the new string.
   // Warning: this uses host endianness.
   DisallowHeapAllocation no_gc;
-  base::Memcpy(string->GetChars(no_gc), bytes.begin(), bytes.length());
+  memcpy(string->GetChars(no_gc), bytes.begin(), bytes.length());
   return string;
 }
 
@@ -1772,7 +1772,7 @@
   if (!result.ToHandle(&array_buffer)) return result;
 
   if (byte_length > 0) {
-    base::Memcpy(array_buffer->backing_store(), position_, byte_length);
+    memcpy(array_buffer->backing_store(), position_, byte_length);
   }
   position_ += byte_length;
   AddObjectWithID(id, array_buffer);
diff --git a/src/third_party/v8/src/parsing/preparse-data.cc b/src/third_party/v8/src/parsing/preparse-data.cc
index 30cf1ae..0ce29fa 100644
--- a/src/third_party/v8/src/parsing/preparse-data.cc
+++ b/src/third_party/v8/src/parsing/preparse-data.cc
@@ -134,7 +134,7 @@
 
 void PreparseDataBuilder::ByteData::Finalize(Zone* zone) {
   uint8_t* raw_zone_data = zone->NewArray<uint8_t, RawPreparseData>(index_);
-  base::Memcpy(raw_zone_data, byte_data_->data(), index_);
+  memcpy(raw_zone_data, byte_data_->data(), index_);
   byte_data_->resize(0);
   zone_byte_data_ = Vector<uint8_t>(raw_zone_data, index_);
 #ifdef DEBUG
diff --git a/src/third_party/v8/src/parsing/scanner.cc b/src/third_party/v8/src/parsing/scanner.cc
index c835c8d..7c0838f 100644
--- a/src/third_party/v8/src/parsing/scanner.cc
+++ b/src/third_party/v8/src/parsing/scanner.cc
@@ -1051,7 +1051,7 @@
   Vector<const uint8_t> vector = literal_one_byte_string();
   int length = vector.length();
   char* buffer = zone->NewArray<char>(length + 1);
-  base::Memcpy(buffer, vector.begin(), length);
+  memcpy(buffer, vector.begin(), length);
   buffer[length] = '\0';
   return buffer;
 }
diff --git a/src/third_party/v8/src/runtime/runtime.cc b/src/third_party/v8/src/runtime/runtime.cc
index f5d9b06..e2e7ab4 100644
--- a/src/third_party/v8/src/runtime/runtime.cc
+++ b/src/third_party/v8/src/runtime/runtime.cc
@@ -257,7 +257,7 @@
   if (!isolate->runtime_state()->redirected_intrinsic_functions()) {
     size_t function_count = arraysize(kIntrinsicFunctions);
     Function* redirected_functions = new Function[function_count];
-    base::Memcpy(redirected_functions, kIntrinsicFunctions,
+    memcpy(redirected_functions, kIntrinsicFunctions,
                  sizeof(kIntrinsicFunctions));
     for (size_t i = 0; i < function_count; i++) {
       ExternalReference redirected_entry =
diff --git a/src/third_party/v8/src/snapshot/deserializer.cc b/src/third_party/v8/src/snapshot/deserializer.cc
index b18a37b..8f4b8a8 100644
--- a/src/third_party/v8/src/snapshot/deserializer.cc
+++ b/src/third_party/v8/src/snapshot/deserializer.cc
@@ -192,7 +192,7 @@
 template <typename TSlot>
 int Deserializer::WriteAddress(TSlot dest, Address value) {
   DCHECK(!next_reference_is_weak_);
-  base::Memcpy(dest.ToVoidPtr(), &value, kSystemPointerSize);
+  memcpy(dest.ToVoidPtr(), &value, kSystemPointerSize);
   STATIC_ASSERT(IsAligned(kSystemPointerSize, TSlot::kSlotDataSize));
   return (kSystemPointerSize / TSlot::kSlotDataSize);
 }
diff --git a/src/third_party/v8/src/snapshot/embedded/platform-embedded-file-writer-base.cc b/src/third_party/v8/src/snapshot/embedded/platform-embedded-file-writer-base.cc
index a3db24d..1eb0bed 100644
--- a/src/third_party/v8/src/snapshot/embedded/platform-embedded-file-writer-base.cc
+++ b/src/third_party/v8/src/snapshot/embedded/platform-embedded-file-writer-base.cc
@@ -60,11 +60,11 @@
       break;
     case 16:
 #ifdef V8_TARGET_BIG_ENDIAN
-      base::Memcpy(&high, data, kHalfSize);
-      base::Memcpy(&low, data + kHalfSize, kHalfSize);
+      memcpy(&high, data, kHalfSize);
+      memcpy(&low, data + kHalfSize, kHalfSize);
 #else
-      base::Memcpy(&high, data + kHalfSize, kHalfSize);
-      base::Memcpy(&low, data, kHalfSize);
+      memcpy(&high, data + kHalfSize, kHalfSize);
+      memcpy(&low, data, kHalfSize);
 #endif  // V8_TARGET_BIG_ENDIAN
       break;
     default:
diff --git a/src/third_party/v8/src/snapshot/snapshot-source-sink.h b/src/third_party/v8/src/snapshot/snapshot-source-sink.h
index fc61453..964b049 100644
--- a/src/third_party/v8/src/snapshot/snapshot-source-sink.h
+++ b/src/third_party/v8/src/snapshot/snapshot-source-sink.h
@@ -52,7 +52,7 @@
   void Advance(int by) { position_ += by; }
 
   void CopyRaw(void* to, int number_of_bytes) {
-    base::Memcpy(to, data_ + position_, number_of_bytes);
+    memcpy(to, data_ + position_, number_of_bytes);
     position_ += number_of_bytes;
   }
 
@@ -62,7 +62,7 @@
     for (base::AtomicWord* p = start; p < end;
          ++p, position_ += sizeof(base::AtomicWord)) {
       base::AtomicWord val;
-      base::Memcpy(&val, data_ + position_, sizeof(base::AtomicWord));
+      memcpy(&val, data_ + position_, sizeof(base::AtomicWord));
       base::Relaxed_Store(p, val);
     }
   }
@@ -74,7 +74,7 @@
     for (AtomicTagged_t* p = start; p < end;
          ++p, position_ += sizeof(AtomicTagged_t)) {
       AtomicTagged_t val;
-      base::Memcpy(&val, data_ + position_, sizeof(AtomicTagged_t));
+      memcpy(&val, data_ + position_, sizeof(AtomicTagged_t));
       base::Relaxed_Store(p, val);
     }
   }
diff --git a/src/third_party/v8/src/tracing/trace-event.h b/src/third_party/v8/src/tracing/trace-event.h
index c2fe388..22e7fee 100644
--- a/src/third_party/v8/src/tracing/trace-event.h
+++ b/src/third_party/v8/src/tracing/trace-event.h
@@ -435,7 +435,7 @@
     *type = value_type_id;                                                  \
     *value = 0;                                                             \
     STATIC_ASSERT(sizeof(arg) <= sizeof(*value));                           \
-    base::Memcpy(value, &arg, sizeof(arg));                                 \
+    memcpy(value, &arg, sizeof(arg));                                 \
   }
 INTERNAL_DECLARE_SET_TRACE_VALUE(double, TRACE_VALUE_TYPE_DOUBLE)
 INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, TRACE_VALUE_TYPE_POINTER)
diff --git a/src/third_party/v8/src/utils/memcopy.h b/src/third_party/v8/src/utils/memcopy.h
index 5f51625..b3648ed 100644
--- a/src/third_party/v8/src/utils/memcopy.h
+++ b/src/third_party/v8/src/utils/memcopy.h
@@ -45,7 +45,7 @@
 V8_EXPORT_PRIVATE extern MemCopyUint8Function memcopy_uint8_function;
 V8_INLINE void MemCopyUint8Wrapper(uint8_t* dest, const uint8_t* src,
                                    size_t chars) {
-  base::Memcpy(dest, src, chars);
+  memcpy(dest, src, chars);
 }
 // For values < 16, the assembler function is slower than the inlined C code.
 const size_t kMinComplexMemCopy = 16;
@@ -66,7 +66,7 @@
 V8_EXPORT_PRIVATE extern MemCopyUint8Function memcopy_uint8_function;
 V8_INLINE void MemCopyUint8Wrapper(uint8_t* dest, const uint8_t* src,
                                    size_t chars) {
-  base::Memcpy(dest, src, chars);
+  memcpy(dest, src, chars);
 }
 // For values < 16, the assembler function is slower than the inlined C code.
 const size_t kMinComplexMemCopy = 16;
@@ -87,7 +87,7 @@
   switch (size) {
 #define CASE(N)                 \
   case N:                       \
-    base::Memcpy(dest, src, N); \
+    memcpy(dest, src, N); \
     return;
     CASE(1)
     CASE(2)
@@ -107,7 +107,7 @@
     CASE(16)
 #undef CASE
     default:
-      base::Memcpy(dest, src, size);
+      memcpy(dest, src, size);
       return;
   }
 }
diff --git a/src/third_party/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h b/src/third_party/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h
index e804c4f..2f450f7 100644
--- a/src/third_party/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h
+++ b/src/third_party/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h
@@ -3531,7 +3531,7 @@
 void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
                                        const uint8_t imms[16]) {
   uint64_t vals[2];
-  base::Memcpy(vals, imms, sizeof(vals));
+  memcpy(vals, imms, sizeof(vals));
   vmov(dst.low_fp(), Double(vals[0]));
   vmov(dst.high_fp(), Double(vals[1]));
 }
diff --git a/src/third_party/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h b/src/third_party/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h
index cfd342c..eb3c74a 100644
--- a/src/third_party/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h
+++ b/src/third_party/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h
@@ -2533,7 +2533,7 @@
 void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
                                        const uint8_t imms[16]) {
   uint64_t vals[2];
-  base::Memcpy(vals, imms, sizeof(vals));
+  memcpy(vals, imms, sizeof(vals));
   Movi(dst.fp().V16B(), vals[1], vals[0]);
 }
 
diff --git a/src/third_party/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h b/src/third_party/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h
index d1ff553..86ded4d 100644
--- a/src/third_party/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h
+++ b/src/third_party/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h
@@ -3014,7 +3014,7 @@
 void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
                                        const uint8_t imms[16]) {
   uint64_t vals[2];
-  base::Memcpy(vals, imms, sizeof(vals));
+  memcpy(vals, imms, sizeof(vals));
   TurboAssembler::Move(dst.fp(), vals[0]);
 
   uint64_t high = vals[1];
diff --git a/src/third_party/v8/src/wasm/baseline/liftoff-compiler.cc b/src/third_party/v8/src/wasm/baseline/liftoff-compiler.cc
index 1f34945..39b2956 100644
--- a/src/third_party/v8/src/wasm/baseline/liftoff-compiler.cc
+++ b/src/third_party/v8/src/wasm/baseline/liftoff-compiler.cc
@@ -3047,7 +3047,7 @@
     LiftoffRegister dst = __ GetUnusedRegister(result_rc, {lhs, rhs}, {});
 
     uint8_t shuffle[kSimd128Size];
-    base::Memcpy(shuffle, imm.value, sizeof(shuffle));
+    memcpy(shuffle, imm.value, sizeof(shuffle));
     bool is_swizzle;
     bool needs_swap;
     wasm::SimdShuffle::CanonicalizeShuffle(lhs == rhs, shuffle, &needs_swap,
diff --git a/src/third_party/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h b/src/third_party/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h
index aefc26b..3eb2d28 100644
--- a/src/third_party/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h
+++ b/src/third_party/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h
@@ -1755,7 +1755,7 @@
                                        const uint8_t imms[16]) {
   MSARegister dst_msa = dst.fp().toW();
   uint64_t vals[2];
-  base::Memcpy(vals, imms, sizeof(vals));
+  memcpy(vals, imms, sizeof(vals));
   li(kScratchReg, vals[0]);
   insert_d(dst_msa, 0, kScratchReg);
   li(kScratchReg, vals[1]);
diff --git a/src/third_party/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h b/src/third_party/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
index d180906..e985e1f 100644
--- a/src/third_party/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
+++ b/src/third_party/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
@@ -2637,7 +2637,7 @@
 void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
                                        const uint8_t imms[16]) {
   uint64_t vals[2];
-  base::Memcpy(vals, imms, sizeof(vals));
+  memcpy(vals, imms, sizeof(vals));
   TurboAssembler::Move(dst.fp(), vals[0]);
   movq(kScratchRegister, vals[1]);
   Pinsrq(dst.fp(), kScratchRegister, uint8_t{1});
diff --git a/src/third_party/v8/src/wasm/c-api.cc b/src/third_party/v8/src/wasm/c-api.cc
index 1049f39..e9983bb 100644
--- a/src/third_party/v8/src/wasm/c-api.cc
+++ b/src/third_party/v8/src/wasm/c-api.cc
@@ -2220,7 +2220,7 @@
                              const wasm_##name##_t data[]) {            \
     auto v2 = wasm::vec<Name>::make_uninitialized(size);                \
     if (v2.size() != 0) {                                               \
-      v8::base::Memcpy(v2.get(), data, size * sizeof(wasm_##name##_t)); \
+      memcpy(v2.get(), data, size * sizeof(wasm_##name##_t));           \
     }                                                                   \
     *out = release_##name##_vec(std::move(v2));                         \
   }                                                                     \
diff --git a/src/third_party/v8/src/wasm/function-body-decoder-impl.h b/src/third_party/v8/src/wasm/function-body-decoder-impl.h
index 3bac743..d67f1e3 100644
--- a/src/third_party/v8/src/wasm/function-body-decoder-impl.h
+++ b/src/third_party/v8/src/wasm/function-body-decoder-impl.h
@@ -400,7 +400,7 @@
     // returns a float would potentially flip NaN bits per C++ semantics, so we
     // have to inline the memcpy call directly.
     uint32_t tmp = decoder->read_u32<validate>(pc, "immf32");
-    base::Memcpy(&value, &tmp, sizeof(value));
+    memcpy(&value, &tmp, sizeof(value));
   }
 };
 
@@ -411,7 +411,7 @@
   inline ImmF64Immediate(Decoder* decoder, const byte* pc) {
     // Avoid bit_cast because it might not preserve the signalling bit of a NaN.
     uint64_t tmp = decoder->read_u64<validate>(pc, "immf64");
-    base::Memcpy(&value, &tmp, sizeof(value));
+    memcpy(&value, &tmp, sizeof(value));
   }
 };
 
diff --git a/src/third_party/v8/src/wasm/local-decl-encoder.cc b/src/third_party/v8/src/wasm/local-decl-encoder.cc
index 8130cbb..a396194 100644
--- a/src/third_party/v8/src/wasm/local-decl-encoder.cc
+++ b/src/third_party/v8/src/wasm/local-decl-encoder.cc
@@ -21,7 +21,7 @@
   byte* buffer = zone->NewArray<byte, LocalDeclEncoderBuffer>(Size() + size);
   size_t pos = Emit(buffer);
   if (size > 0) {
-    base::Memcpy(buffer + pos, *start, size);
+    memcpy(buffer + pos, *start, size);
   }
   pos += size;
   *start = buffer;
diff --git a/src/third_party/v8/src/wasm/module-instantiate.cc b/src/third_party/v8/src/wasm/module-instantiate.cc
index 09e3f89..361d481 100644
--- a/src/third_party/v8/src/wasm/module-instantiate.cc
+++ b/src/third_party/v8/src/wasm/module-instantiate.cc
@@ -886,7 +886,7 @@
                                         instance->memory_size()));
       byte* dest = instance->memory_start() + dest_offset;
       const byte* src = wire_bytes.begin() + segment.source.offset();
-      base::Memcpy(dest, src, size);
+      memcpy(dest, src, size);
     }
   }
 }
@@ -1676,7 +1676,7 @@
           size_t size = (global.type == kWasmI64 || global.type == kWasmF64)
                             ? sizeof(double)
                             : sizeof(int32_t);
-          base::Memcpy(raw_buffer_ptr(untagged_globals_, new_offset),
+          memcpy(raw_buffer_ptr(untagged_globals_, new_offset),
                        raw_buffer_ptr(untagged_globals_, old_offset), size);
         }
         break;
diff --git a/src/third_party/v8/src/wasm/streaming-decoder.cc b/src/third_party/v8/src/wasm/streaming-decoder.cc
index a2806f6..f25dd0e 100644
--- a/src/third_party/v8/src/wasm/streaming-decoder.cc
+++ b/src/third_party/v8/src/wasm/streaming-decoder.cc
@@ -63,7 +63,7 @@
               1 + length_bytes.length() + payload_length)),
           payload_offset_(1 + length_bytes.length()) {
       bytes_.start()[0] = id;
-      base::Memcpy(bytes_.start() + 1, &length_bytes.first(),
+      memcpy(bytes_.start() + 1, &length_bytes.first(),
                    length_bytes.length());
     }
 
@@ -254,7 +254,7 @@
   Vector<uint8_t> remaining_buf = buffer() + offset();
   size_t num_bytes = std::min(bytes.size(), remaining_buf.size());
   TRACE_STREAMING("ReadBytes(%zu bytes)\n", num_bytes);
-  base::Memcpy(remaining_buf.begin(), &bytes.first(), num_bytes);
+  memcpy(remaining_buf.begin(), &bytes.first(), num_bytes);
   set_offset(offset() + num_bytes);
   return num_bytes;
 }
@@ -290,12 +290,12 @@
 #define BYTES(x) (x & 0xFF), (x >> 8) & 0xFF, (x >> 16) & 0xFF, (x >> 24) & 0xFF
     uint8_t module_header[]{BYTES(kWasmMagic), BYTES(kWasmVersion)};
 #undef BYTES
-    base::Memcpy(cursor, module_header, arraysize(module_header));
+    memcpy(cursor, module_header, arraysize(module_header));
     cursor += arraysize(module_header);
   }
   for (const auto& buffer : section_buffers_) {
     DCHECK_LE(cursor - bytes.start() + buffer->length(), total_size_);
-    base::Memcpy(cursor, buffer->bytes().begin(), buffer->length());
+    memcpy(cursor, buffer->bytes().begin(), buffer->length());
     cursor += buffer->length();
   }
   processor_->OnFinishedStream(std::move(bytes));
@@ -514,7 +514,7 @@
   Vector<uint8_t> remaining_buf = buf + offset();
   size_t new_bytes = std::min(bytes.size(), remaining_buf.size());
   TRACE_STREAMING("ReadBytes of a VarInt\n");
-  base::Memcpy(remaining_buf.begin(), &bytes.first(), new_bytes);
+  memcpy(remaining_buf.begin(), &bytes.first(), new_bytes);
   buf.Truncate(offset() + new_bytes);
   Decoder decoder(buf,
                   streaming->module_offset() - static_cast<uint32_t>(offset()));
@@ -628,7 +628,7 @@
   if (payload_buf.size() < bytes_consumed_) {
     return streaming->Error("invalid code section length");
   }
-  base::Memcpy(payload_buf.begin(), buffer().begin(), bytes_consumed_);
+  memcpy(payload_buf.begin(), buffer().begin(), bytes_consumed_);
 
   // {value} is the number of functions.
   if (value_ == 0) {
@@ -659,7 +659,7 @@
   if (fun_length_buffer.size() < bytes_consumed_) {
     return streaming->Error("read past code section end");
   }
-  base::Memcpy(fun_length_buffer.begin(), buffer().begin(), bytes_consumed_);
+  memcpy(fun_length_buffer.begin(), buffer().begin(), bytes_consumed_);
 
   // {value} is the length of the function.
   if (value_ == 0) return streaming->Error("invalid function length (0)");
diff --git a/src/third_party/v8/src/wasm/wasm-code-manager.cc b/src/third_party/v8/src/wasm/wasm-code-manager.cc
index a637857..83be91d 100644
--- a/src/third_party/v8/src/wasm/wasm-code-manager.cc
+++ b/src/third_party/v8/src/wasm/wasm-code-manager.cc
@@ -186,7 +186,7 @@
   byte* ptr = new byte[total_size];
   for (auto& vec : vectors) {
     if (vec.empty()) continue;  // Avoid nullptr in {memcpy}.
-    base::Memcpy(ptr, vec.begin(), vec.size());
+    memcpy(ptr, vec.begin(), vec.size());
     ptr += vec.size();
   }
   return std::unique_ptr<const byte[]>(ptr);
@@ -840,7 +840,7 @@
   DCHECK_LE(module_->num_declared_functions, max_functions);
   auto new_table = std::make_unique<WasmCode*[]>(max_functions);
   if (module_->num_declared_functions > 0) {
-    base::Memcpy(new_table.get(), code_table_.get(),
+    memcpy(new_table.get(), code_table_.get(),
                  module_->num_declared_functions * sizeof(WasmCode*));
   }
   code_table_ = std::move(new_table);
@@ -918,7 +918,7 @@
 
   Vector<uint8_t> dst_code_bytes =
       code_allocator_.AllocateForCode(this, instructions.size());
-  base::Memcpy(dst_code_bytes.begin(), instructions.begin(),
+  memcpy(dst_code_bytes.begin(), instructions.begin(),
                instructions.size());
 
   // Apply the relocation delta by iterating over the RelocInfo.
@@ -1044,7 +1044,7 @@
   const int instr_size = desc.instr_size;
 
   CODE_SPACE_WRITE_SCOPE
-  base::Memcpy(dst_code_bytes.begin(), desc.buffer,
+  memcpy(dst_code_bytes.begin(), desc.buffer,
                static_cast<size_t>(desc.instr_size));
 
   // Apply the relocation delta by iterating over the RelocInfo.
@@ -1191,7 +1191,7 @@
   Vector<uint8_t> dst_code_bytes =
       code_allocator_.AllocateForCode(this, instructions.size());
   UpdateCodeSize(dst_code_bytes.size(), tier, kNoDebugging);
-  base::Memcpy(dst_code_bytes.begin(), instructions.begin(),
+  memcpy(dst_code_bytes.begin(), instructions.begin(),
                instructions.size());
 
   std::unique_ptr<WasmCode> code{new WasmCode{
diff --git a/src/third_party/v8/src/wasm/wasm-debug-evaluate.cc b/src/third_party/v8/src/wasm/wasm-debug-evaluate.cc
index 909cb37..f4a4deb 100644
--- a/src/third_party/v8/src/wasm/wasm-debug-evaluate.cc
+++ b/src/third_party/v8/src/wasm/wasm-debug-evaluate.cc
@@ -229,7 +229,7 @@
                               evaluator_->memory_size(), &thrower)) {
       return;
     }
-    base::Memcpy(&evaluator_->memory_start()[result_offset], &val, sizeof(T));
+    memcpy(&evaluator_->memory_start()[result_offset], &val, sizeof(T));
   }
 
   void WriteResult(const WasmValue& result, uint32_t result_offset) {
diff --git a/src/third_party/v8/src/wasm/wasm-debug.cc b/src/third_party/v8/src/wasm/wasm-debug.cc
index ce3bc13..36ced71 100644
--- a/src/third_party/v8/src/wasm/wasm-debug.cc
+++ b/src/third_party/v8/src/wasm/wasm-debug.cc
@@ -58,31 +58,31 @@
     case ValueType::kI32: {
       int32_t val = value.to_i32();
       bytes = isolate->factory()->NewByteArray(sizeof(val));
-      base::Memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
+      memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
       break;
     }
     case ValueType::kI64: {
       int64_t val = value.to_i64();
       bytes = isolate->factory()->NewByteArray(sizeof(val));
-      base::Memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
+      memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
       break;
     }
     case ValueType::kF32: {
       float val = value.to_f32();
       bytes = isolate->factory()->NewByteArray(sizeof(val));
-      base::Memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
+      memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
       break;
     }
     case ValueType::kF64: {
       double val = value.to_f64();
       bytes = isolate->factory()->NewByteArray(sizeof(val));
-      base::Memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
+      memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
       break;
     }
     case ValueType::kS128: {
       Simd128 s128 = value.to_s128();
       bytes = isolate->factory()->NewByteArray(kSimd128Size);
-      base::Memcpy(bytes->GetDataStartAddress(), s128.bytes(), kSimd128Size);
+      memcpy(bytes->GetDataStartAddress(), s128.bytes(), kSimd128Size);
       break;
     }
     case ValueType::kOptRef: {
diff --git a/src/third_party/v8/src/wasm/wasm-engine.cc b/src/third_party/v8/src/wasm/wasm-engine.cc
index 78fc7d6..9649789 100644
--- a/src/third_party/v8/src/wasm/wasm-engine.cc
+++ b/src/third_party/v8/src/wasm/wasm-engine.cc
@@ -597,7 +597,7 @@
     if (is_shared) {
       // Make a copy of the wire bytes to avoid concurrent modification.
       std::unique_ptr<uint8_t[]> copy(new uint8_t[bytes.length()]);
-      base::Memcpy(copy.get(), bytes.start(), bytes.length());
+      memcpy(copy.get(), bytes.start(), bytes.length());
       ModuleWireBytes bytes_copy(copy.get(), copy.get() + bytes.length());
       module_object = SyncCompile(isolate, enabled, &thrower, bytes_copy);
     } else {
@@ -625,7 +625,7 @@
   // Make a copy of the wire bytes in case the user program changes them
   // during asynchronous compilation.
   std::unique_ptr<byte[]> copy(new byte[bytes.length()]);
-  base::Memcpy(copy.get(), bytes.start(), bytes.length());
+  memcpy(copy.get(), bytes.start(), bytes.length());
 
   AsyncCompileJob* job =
       CreateAsyncCompileJob(isolate, enabled, std::move(copy), bytes.length(),
diff --git a/src/third_party/v8/src/wasm/wasm-js.cc b/src/third_party/v8/src/wasm/wasm-js.cc
index 33d751b..91a49ee 100644
--- a/src/third_party/v8/src/wasm/wasm-js.cc
+++ b/src/third_party/v8/src/wasm/wasm-js.cc
@@ -638,7 +638,7 @@
   if (is_shared) {
     // Make a copy of the wire bytes to avoid concurrent modification.
     std::unique_ptr<uint8_t[]> copy(new uint8_t[bytes.length()]);
-    base::Memcpy(copy.get(), bytes.start(), bytes.length());
+    memcpy(copy.get(), bytes.start(), bytes.length());
     i::wasm::ModuleWireBytes bytes_copy(copy.get(),
                                         copy.get() + bytes.length());
     validated = i_isolate->wasm_engine()->SyncValidate(
@@ -681,7 +681,7 @@
   if (is_shared) {
     // Make a copy of the wire bytes to avoid concurrent modification.
     std::unique_ptr<uint8_t[]> copy(new uint8_t[bytes.length()]);
-    base::Memcpy(copy.get(), bytes.start(), bytes.length());
+    memcpy(copy.get(), bytes.start(), bytes.length());
     i::wasm::ModuleWireBytes bytes_copy(copy.get(),
                                         copy.get() + bytes.length());
     module_obj = i_isolate->wasm_engine()->SyncCompile(
@@ -2550,7 +2550,7 @@
             "failed to allocate backing store");
       }
 
-      base::Memcpy(buffer->allocation_base(), s128.bytes(),
+      memcpy(buffer->allocation_base(), s128.bytes(),
                    buffer->byte_length());
       return isolate->factory()->NewJSTypedArray(kExternalUint8Array, buffer, 0,
                                                  buffer->byte_length());
diff --git a/src/third_party/v8/src/wasm/wasm-module-builder.h b/src/third_party/v8/src/wasm/wasm-module-builder.h
index 76bf189..7f4c95b 100644
--- a/src/third_party/v8/src/wasm/wasm-module-builder.h
+++ b/src/third_party/v8/src/wasm/wasm-module-builder.h
@@ -89,7 +89,7 @@
   void write(const byte* data, size_t size) {
     if (size == 0) return;
     EnsureSpace(size);
-    base::Memcpy(pos_, data, size);
+    memcpy(pos_, data, size);
     pos_ += size;
   }
 
@@ -135,7 +135,7 @@
     if ((pos_ + size) > end_) {
       size_t new_size = size + (end_ - buffer_) * 2;
       byte* new_buffer = zone_->NewArray<byte, Buffer>(new_size);
-      base::Memcpy(new_buffer, buffer_, (pos_ - buffer_));
+      memcpy(new_buffer, buffer_, (pos_ - buffer_));
       pos_ = new_buffer + (pos_ - buffer_);
       buffer_ = new_buffer;
       end_ = new_buffer + new_size;
diff --git a/src/third_party/v8/src/wasm/wasm-module.cc b/src/third_party/v8/src/wasm/wasm-module.cc
index 2b1c3f5..52305b1 100644
--- a/src/third_party/v8/src/wasm/wasm-module.cc
+++ b/src/third_party/v8/src/wasm/wasm-module.cc
@@ -569,7 +569,7 @@
       thrower->RangeError("out of memory allocating custom section data");
       return Handle<JSArray>();
     }
-    base::Memcpy(array_buffer->backing_store(),
+    memcpy(array_buffer->backing_store(),
                  wire_bytes.begin() + section.payload.offset(),
                  section.payload.length());
 
diff --git a/src/third_party/v8/src/wasm/wasm-module.h b/src/third_party/v8/src/wasm/wasm-module.h
index 3a6cb6f..e86b3de 100644
--- a/src/third_party/v8/src/wasm/wasm-module.h
+++ b/src/third_party/v8/src/wasm/wasm-module.h
@@ -513,7 +513,7 @@
   TruncatedUserString(const char* start, size_t len)
       : start_(start), length_(std::min(kMaxLen, static_cast<int>(len))) {
     if (len > static_cast<size_t>(kMaxLen)) {
-      base::Memcpy(buffer_, start, kMaxLen - 3);
+      memcpy(buffer_, start, kMaxLen - 3);
       memset(buffer_ + kMaxLen - 3, '.', 3);
       start_ = buffer_;
     }
diff --git a/src/third_party/v8/src/wasm/wasm-opcodes.h b/src/third_party/v8/src/wasm/wasm-opcodes.h
index 42fceb7..139ea7b 100644
--- a/src/third_party/v8/src/wasm/wasm-opcodes.h
+++ b/src/third_party/v8/src/wasm/wasm-opcodes.h
@@ -819,7 +819,7 @@
     immediate_.f64_const = v;
   }
   explicit WasmInitExpr(uint8_t v[kSimd128Size]) : kind_(kS128Const) {
-    base::Memcpy(immediate_.s128_const.data(), v, kSimd128Size);
+    memcpy(immediate_.s128_const.data(), v, kSimd128Size);
   }
 
   MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(WasmInitExpr);
diff --git a/src/third_party/v8/src/wasm/wasm-serialization.cc b/src/third_party/v8/src/wasm/wasm-serialization.cc
index d518d0f..d2dde77 100644
--- a/src/third_party/v8/src/wasm/wasm-serialization.cc
+++ b/src/third_party/v8/src/wasm/wasm-serialization.cc
@@ -58,7 +58,7 @@
   void WriteVector(const Vector<const byte> v) {
     DCHECK_GE(current_size(), v.size());
     if (v.size() > 0) {
-      base::Memcpy(current_location(), v.begin(), v.size());
+      memcpy(current_location(), v.begin(), v.size());
       pos_ += v.size();
     }
     if (FLAG_trace_wasm_serialization) {
@@ -382,7 +382,7 @@
     code_start = aligned_buffer.get();
   }
 #endif
-  base::Memcpy(code_start, code->instructions().begin(), code_size);
+  memcpy(code_start, code->instructions().begin(), code_size);
   // Relocate the code.
   int mask = RelocInfo::ModeMask(RelocInfo::WASM_CALL) |
              RelocInfo::ModeMask(RelocInfo::WASM_STUB_CALL) |
@@ -429,7 +429,7 @@
   }
   // If we copied to an aligned buffer, copy code into serialized buffer.
   if (code_start != serialized_code_start) {
-    base::Memcpy(serialized_code_start, code_start, code_size);
+    memcpy(serialized_code_start, code_start, code_size);
   }
   return true;
 }
diff --git a/src/third_party/v8/src/zone/zone-list-inl.h b/src/third_party/v8/src/zone/zone-list-inl.h
index b8e4d92..2c0aa4f 100644
--- a/src/third_party/v8/src/zone/zone-list-inl.h
+++ b/src/third_party/v8/src/zone/zone-list-inl.h
@@ -36,7 +36,7 @@
   int result_length = length_ + length;
   if (capacity_ < result_length) Resize(result_length, zone);
   if (std::is_trivially_copyable<T>::value) {
-    base::Memcpy(&data_[length_], other.begin(), sizeof(T) * length);
+    memcpy(&data_[length_], other.begin(), sizeof(T) * length);
   } else {
     std::copy(other.begin(), other.end(), &data_[length_]);
   }
diff --git a/src/third_party/woff2/src/buffer.h b/src/third_party/woff2/src/buffer.h
index 4d8554c..4e1752c 100644
--- a/src/third_party/woff2/src/buffer.h
+++ b/src/third_party/woff2/src/buffer.h
@@ -39,13 +39,8 @@
 #define woff2_htons(x) htons (x)
 #endif
 
-#if !defined(STARBOARD)
 #include <cstring>
 #define MEMCPY_BUFFER std::memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_BUFFER SbMemoryCopy
-#endif
 
 #include <cstdio>
 #include <cstdlib>
diff --git a/src/third_party/woff2/src/store_bytes.h b/src/third_party/woff2/src/store_bytes.h
index 2e23d43..a3fbb22 100644
--- a/src/third_party/woff2/src/store_bytes.h
+++ b/src/third_party/woff2/src/store_bytes.h
@@ -13,13 +13,8 @@
 #include <inttypes.h>
 #include <stddef.h>
 
-#if !defined(STARBOARD)
 #include <cstring>
 #define MEMCPY_STORE_BYTES memcpy
-#else
-#include "starboard/memory.h"
-#define MEMCPY_STORE_BYTES SbMemoryCopy
-#endif
 
 #include "./port.h"
 
diff --git a/src/third_party/zlib/BUILD.gn b/src/third_party/zlib/BUILD.gn
index 6ff84b9..abcbcb4 100644
--- a/src/third_party/zlib/BUILD.gn
+++ b/src/third_party/zlib/BUILD.gn
@@ -98,7 +98,7 @@
     if (!is_ios) {
       include_dirs = [ "." ]
 
-      if (is_android) {
+      if (!is_starboard && is_android) {
         import("//build/config/android/config.gni")
         if (defined(android_ndk_root) && android_ndk_root != "") {
           deps = [
@@ -131,6 +131,9 @@
       configs -= [ "//starboard/build/config:size" ]
       configs += [ "//starboard/build/config:speed" ]
     }
+    if (is_starboard) {
+      deps = [ "//starboard:starboard_headers_only" ]
+    }
 
     public_configs = [ ":zlib_arm_crc32_config" ]
   }
diff --git a/src/third_party/zlib/zutil.h b/src/third_party/zlib/zutil.h
index 6a92066..83af562 100644
--- a/src/third_party/zlib/zutil.h
+++ b/src/third_party/zlib/zutil.h
@@ -27,6 +27,7 @@
 
 #if defined(STARBOARD)
 #  include "starboard/memory.h"
+#  include <string.h>
 #elif defined(STDC) && !defined(Z_SOLO)
 #  if !(defined(_WIN32_WCE) && defined(_MSC_VER))
 #    include <stddef.h>
@@ -249,9 +250,9 @@
 #    define zmemcmp _fmemcmp
 #    define zmemzero(dest, len) _fmemset(dest, 0, len)
 #  elif defined(STARBOARD)
-#    define zmemcpy SbMemoryCopy
-#    define zmemcmp(a, b) SbMemoryCompare((a), (b), kSbInt32Max)
-#    define zmemzero(dest, len) SbMemorySet(dest, 0, len)
+#    define zmemcpy memcpy
+#    define zmemcmp(a, b) memcmp((a), (b), kSbInt32Max)
+#    define zmemzero(dest, len) memset(dest, 0, len)
 #  else
 #    define zmemcpy memcpy
 #    define zmemcmp memcmp
diff --git a/src/url/gurl_unittest.cc b/src/url/gurl_unittest.cc
index 03fdbd9..3ad7a2d 100644
--- a/src/url/gurl_unittest.cc
+++ b/src/url/gurl_unittest.cc
@@ -23,7 +23,7 @@
   if (str) {
     Component comp;
     if (str[0])
-      comp.len = static_cast<int>(SbStringGetLength(str));
+      comp.len = static_cast<int>(strlen(str));
     (replacements->*func)(str, comp);
   }
 }
diff --git a/src/url/url_canon.h b/src/url/url_canon.h
index 84419ce..ee34804 100644
--- a/src/url/url_canon.h
+++ b/src/url/url_canon.h
@@ -165,7 +165,7 @@
 
   void Resize(int sz) override {
     T* new_buf = new T[sz];
-    SbMemoryCopy(new_buf, this->buffer_,
+    memcpy(new_buf, this->buffer_,
                  sizeof(T) * (this->cur_len_ < sz ? this->cur_len_ : sz));
     if (this->buffer_ != fixed_buffer_)
       delete[] this->buffer_;
diff --git a/src/url/url_canon_icu.cc b/src/url/url_canon_icu.cc
index edf0ecb..a87235b 100644
--- a/src/url/url_canon_icu.cc
+++ b/src/url/url_canon_icu.cc
@@ -41,7 +41,7 @@
     DCHECK(code_point < 0x110000);
     char number[8];  // Max Unicode code point is 7 digits.
     _itoa_s(code_point, number, 10);
-    int number_len = static_cast<int>(SbStringGetLength(number));
+    int number_len = static_cast<int>(strlen(number));
     ucnv_cbFromUWriteBytes(from_args, number, number_len, 0, err);
 
     const static int postfix_len = 3;
diff --git a/src/url/url_canon_icu_unittest.cc b/src/url/url_canon_icu_unittest.cc
index 8cddbea..34a2142 100644
--- a/src/url/url_canon_icu_unittest.cc
+++ b/src/url/url_canon_icu_unittest.cc
@@ -124,7 +124,7 @@
     ICUCharsetConverter converter(conv.converter());
 
     if (query_cases[i].input8) {
-      int len = static_cast<int>(SbStringGetLength(query_cases[i].input8));
+      int len = static_cast<int>(strlen(query_cases[i].input8));
       Component in_comp(0, len);
       std::string out_str;
 
diff --git a/src/url/url_canon_unittest.cc b/src/url/url_canon_unittest.cc
index 329df13..f6c3c12 100644
--- a/src/url/url_canon_unittest.cc
+++ b/src/url/url_canon_unittest.cc
@@ -97,7 +97,7 @@
   if (str && str[0] == kDeleteComp[0]) {
     (rep->*clear)();
   } else if (str) {
-    (rep->*set)(str, Component(0, static_cast<int>(SbStringGetLength(str))));
+    (rep->*set)(str, Component(0, static_cast<int>(strlen(str))));
   }
 }
 
@@ -184,7 +184,7 @@
       out_str.clear();
       StdStringCanonOutput output(&out_str);
 
-      int input_len = static_cast<int>(SbStringGetLength(utf_cases[i].input8));
+      int input_len = static_cast<int>(strlen(utf_cases[i].input8));
       bool success = true;
       for (int ch = 0; ch < input_len; ch++) {
         success &= AppendUTF8EscapedChar(utf_cases[i].input8, &ch, input_len,
@@ -251,7 +251,7 @@
   std::string out_str;
 
   for (size_t i = 0; i < arraysize(scheme_cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(scheme_cases[i].input));
+    int url_len = static_cast<int>(strlen(scheme_cases[i].input));
     Component in_comp(0, url_len);
     Component out_comp;
 
@@ -518,7 +518,7 @@
   for (size_t i = 0; i < arraysize(host_cases); i++) {
     // Narrow version.
     if (host_cases[i].input8) {
-      int host_len = static_cast<int>(SbStringGetLength(host_cases[i].input8));
+      int host_len = static_cast<int>(strlen(host_cases[i].input8));
       Component in_comp(0, host_len);
       Component out_comp;
 
@@ -566,7 +566,7 @@
   for (size_t i = 0; i < arraysize(host_cases); i++) {
     // Narrow version.
     if (host_cases[i].input8) {
-      int host_len = static_cast<int>(SbStringGetLength(host_cases[i].input8));
+      int host_len = static_cast<int>(strlen(host_cases[i].input8));
       Component in_comp(0, host_len);
 
       out_str.clear();
@@ -696,7 +696,7 @@
   for (size_t i = 0; i < arraysize(cases); i++) {
     // 8-bit version.
     Component component(0,
-                        static_cast<int>(SbStringGetLength(cases[i].input8)));
+                        static_cast<int>(strlen(cases[i].input8)));
 
     std::string out_str1;
     StdStringCanonOutput output1(&out_str1);
@@ -851,7 +851,7 @@
   for (size_t i = 0; i < arraysize(cases); i++) {
     // 8-bit version.
     Component component(0,
-                        static_cast<int>(SbStringGetLength(cases[i].input8)));
+                        static_cast<int>(strlen(cases[i].input8)));
 
     std::string out_str1;
     StdStringCanonOutput output1(&out_str1);
@@ -976,7 +976,7 @@
   };
 
   for (size_t i = 0; i < arraysize(user_info_cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(user_info_cases[i].input));
+    int url_len = static_cast<int>(strlen(user_info_cases[i].input));
     Parsed parsed;
     ParseStandardURL(user_info_cases[i].input, url_len, &parsed);
     Component out_user, out_pass;
@@ -1045,7 +1045,7 @@
   };
 
   for (size_t i = 0; i < arraysize(port_cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(port_cases[i].input));
+    int url_len = static_cast<int>(strlen(port_cases[i].input));
     Component in_comp(0, url_len);
     Component out_comp;
     std::string out_str;
@@ -1169,7 +1169,7 @@
 
   for (size_t i = 0; i < arraysize(path_cases); i++) {
     if (path_cases[i].input8) {
-      int len = static_cast<int>(SbStringGetLength(path_cases[i].input8));
+      int len = static_cast<int>(strlen(path_cases[i].input8));
       Component in_comp(0, len);
       Component out_comp;
       std::string out_str;
@@ -1248,7 +1248,7 @@
     Component out_comp;
 
     if (query_cases[i].input8) {
-      int len = static_cast<int>(SbStringGetLength(query_cases[i].input8));
+      int len = static_cast<int>(strlen(query_cases[i].input8));
       Component in_comp(0, len);
       std::string out_str;
 
@@ -1319,7 +1319,7 @@
   for (size_t i = 0; i < arraysize(ref_cases); i++) {
     // 8-bit input
     if (ref_cases[i].input8) {
-      int len = static_cast<int>(SbStringGetLength(ref_cases[i].input8));
+      int len = static_cast<int>(strlen(ref_cases[i].input8));
       Component in_comp(0, len);
       Component out_comp;
 
@@ -1429,7 +1429,7 @@
   };
 
   for (size_t i = 0; i < arraysize(cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(cases[i].input));
+    int url_len = static_cast<int>(strlen(cases[i].input));
     Parsed parsed;
     ParseStandardURL(cases[i].input, url_len, &parsed);
 
@@ -1463,7 +1463,7 @@
 
   for (size_t i = 0; i < arraysize(replace_cases); i++) {
     const ReplaceCase& cur = replace_cases[i];
-    int base_len = static_cast<int>(SbStringGetLength(cur.base));
+    int base_len = static_cast<int>(strlen(cur.base));
     Parsed parsed;
     ParseStandardURL(cur.base, base_len, &parsed);
 
@@ -1495,7 +1495,7 @@
   // The path pointer should be ignored if the address is invalid.
   {
     const char src[] = "http://www.google.com/here_is_the_path";
-    int src_len = static_cast<int>(SbStringGetLength(src));
+    int src_len = static_cast<int>(strlen(src));
 
     Parsed parsed;
     ParseStandardURL(src, src_len, &parsed);
@@ -1546,7 +1546,7 @@
 
   for (size_t i = 0; i < arraysize(replace_cases); i++) {
     const ReplaceCase& cur = replace_cases[i];
-    int base_len = static_cast<int>(SbStringGetLength(cur.base));
+    int base_len = static_cast<int>(strlen(cur.base));
     Parsed parsed;
     ParseFileURL(cur.base, base_len, &parsed);
 
@@ -1611,7 +1611,7 @@
 
   for (size_t i = 0; i < arraysize(replace_cases); i++) {
     const ReplaceCase& cur = replace_cases[i];
-    int base_len = static_cast<int>(SbStringGetLength(cur.base));
+    int base_len = static_cast<int>(strlen(cur.base));
     Parsed parsed;
     ParseFileSystemURL(cur.base, base_len, &parsed);
 
@@ -1650,7 +1650,7 @@
 
   for (size_t i = 0; i < arraysize(replace_cases); i++) {
     const ReplaceCase& cur = replace_cases[i];
-    int base_len = static_cast<int>(SbStringGetLength(cur.base));
+    int base_len = static_cast<int>(strlen(cur.base));
     Parsed parsed;
     ParsePathURL(cur.base, base_len, false, &parsed);
 
@@ -1701,7 +1701,7 @@
 
   for (size_t i = 0; i < arraysize(replace_cases); i++) {
     const ReplaceCase& cur = replace_cases[i];
-    int base_len = static_cast<int>(SbStringGetLength(cur.base));
+    int base_len = static_cast<int>(strlen(cur.base));
     Parsed parsed;
     ParseMailtoURL(cur.base, base_len, &parsed);
 
@@ -1805,7 +1805,7 @@
   };
 
   for (size_t i = 0; i < arraysize(cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(cases[i].input));
+    int url_len = static_cast<int>(strlen(cases[i].input));
     Parsed parsed;
     ParseFileURL(cases[i].input, url_len, &parsed);
 
@@ -1848,7 +1848,7 @@
   };
 
   for (size_t i = 0; i < arraysize(cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(cases[i].input));
+    int url_len = static_cast<int>(strlen(cases[i].input));
     Parsed parsed;
     ParseFileSystemURL(cases[i].input, url_len, &parsed);
 
@@ -1883,7 +1883,7 @@
   };
 
   for (size_t i = 0; i < arraysize(path_cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(path_cases[i].input));
+    int url_len = static_cast<int>(strlen(path_cases[i].input));
     Parsed parsed;
     ParsePathURL(path_cases[i].input, url_len, true, &parsed);
 
@@ -1968,7 +1968,7 @@
   Parsed out_parsed;
 
   for (size_t i = 0; i < arraysize(cases); i++) {
-    int url_len = static_cast<int>(SbStringGetLength(cases[i].input));
+    int url_len = static_cast<int>(strlen(cases[i].input));
     if (i == 0) {
       // The first test case purposely has a '\0' in it -- don't count it
       // as the string terminator.
@@ -2004,35 +2004,35 @@
   // null-terminated. We also allocate one byte more than what we tell
   // _itoa_s about, and ensure that the extra byte is untouched.
   char buf[6];
-  SbMemorySet(buf, 0xff, sizeof(buf));
+  memset(buf, 0xff, sizeof(buf));
   EXPECT_EQ(0, _itoa_s(12, buf, sizeof(buf) - 1, 10));
   EXPECT_STREQ("12", buf);
   EXPECT_EQ('\xFF', buf[3]);
 
   // Test the edge cases - exactly the buffer size and one over
-  SbMemorySet(buf, 0xff, sizeof(buf));
+  memset(buf, 0xff, sizeof(buf));
   EXPECT_EQ(0, _itoa_s(1234, buf, sizeof(buf) - 1, 10));
   EXPECT_STREQ("1234", buf);
   EXPECT_EQ('\xFF', buf[5]);
 
-  SbMemorySet(buf, 0xff, sizeof(buf));
+  memset(buf, 0xff, sizeof(buf));
   EXPECT_EQ(EINVAL, _itoa_s(12345, buf, sizeof(buf) - 1, 10));
   EXPECT_EQ('\xFF', buf[5]);  // should never write to this location
 
   // Test the template overload (note that this will see the full buffer)
-  SbMemorySet(buf, 0xff, sizeof(buf));
+  memset(buf, 0xff, sizeof(buf));
   EXPECT_EQ(0, _itoa_s(12, buf, 10));
   EXPECT_STREQ("12", buf);
   EXPECT_EQ('\xFF', buf[3]);
 
-  SbMemorySet(buf, 0xff, sizeof(buf));
+  memset(buf, 0xff, sizeof(buf));
   EXPECT_EQ(0, _itoa_s(12345, buf, 10));
   EXPECT_STREQ("12345", buf);
 
   EXPECT_EQ(EINVAL, _itoa_s(123456, buf, 10));
 
   // Test that radix 16 is supported.
-  SbMemorySet(buf, 0xff, sizeof(buf));
+  memset(buf, 0xff, sizeof(buf));
   EXPECT_EQ(0, _itoa_s(1234, buf, sizeof(buf) - 1, 16));
   EXPECT_STREQ("4d2", buf);
   EXPECT_EQ('\xFF', buf[5]);
@@ -2045,7 +2045,7 @@
   base::char16 buf[6];
   const char fill_mem = 0xff;
   const base::char16 fill_char = 0xffff;
-  SbMemorySet(buf, fill_mem, sizeof(buf));
+  memset(buf, fill_mem, sizeof(buf));
   EXPECT_EQ(0, _itow_s(12, buf, sizeof(buf) / 2 - 1, 10));
   EXPECT_EQ(base::UTF8ToUTF16("12"), base::string16(buf));
   EXPECT_EQ(fill_char, buf[3]);
@@ -2055,18 +2055,18 @@
   EXPECT_EQ(base::UTF8ToUTF16("1234"), base::string16(buf));
   EXPECT_EQ(fill_char, buf[5]);
 
-  SbMemorySet(buf, fill_mem, sizeof(buf));
+  memset(buf, fill_mem, sizeof(buf));
   EXPECT_EQ(EINVAL, _itow_s(12345, buf, sizeof(buf) / 2 - 1, 10));
   EXPECT_EQ(fill_char, buf[5]);  // should never write to this location
 
   // Test the template overload (note that this will see the full buffer)
-  SbMemorySet(buf, fill_mem, sizeof(buf));
+  memset(buf, fill_mem, sizeof(buf));
   EXPECT_EQ(0, _itow_s(12, buf, 10));
   EXPECT_EQ(base::UTF8ToUTF16("12"),
             base::string16(buf));
   EXPECT_EQ(fill_char, buf[3]);
 
-  SbMemorySet(buf, fill_mem, sizeof(buf));
+  memset(buf, fill_mem, sizeof(buf));
   EXPECT_EQ(0, _itow_s(12345, buf, 10));
   EXPECT_EQ(base::UTF8ToUTF16("12345"), base::string16(buf));
 
@@ -2237,7 +2237,7 @@
     const RelativeCase& cur_case = rel_cases[i];
 
     Parsed parsed;
-    int base_len = static_cast<int>(SbStringGetLength(cur_case.base));
+    int base_len = static_cast<int>(strlen(cur_case.base));
     if (cur_case.is_base_file)
       ParseFileURL(cur_case.base, base_len, &parsed);
     else if (cur_case.is_base_hier)
@@ -2246,7 +2246,7 @@
       ParsePathURL(cur_case.base, base_len, false, &parsed);
 
     // First see if it is relative.
-    int test_len = static_cast<int>(SbStringGetLength(cur_case.test));
+    int test_len = static_cast<int>(strlen(cur_case.test));
     bool is_relative;
     Component relative_component;
     bool succeed_is_rel = IsRelativeURL(
@@ -2293,7 +2293,7 @@
 // were still kept to the old buffer that was removed.
 TEST(URLCanonTest, ReplacementOverflow) {
   const char src[] = "file:///C:/foo/bar";
-  int src_len = static_cast<int>(SbStringGetLength(src));
+  int src_len = static_cast<int>(strlen(src));
   Parsed parsed;
   ParseFileURL(src, src_len, &parsed);
 
@@ -2349,7 +2349,7 @@
     SCOPED_TRACE(test_case.scheme);
     EXPECT_EQ(test_case.expected_port,
               DefaultPortForScheme(test_case.scheme,
-                                   SbStringGetLength(test_case.scheme)));
+                                   strlen(test_case.scheme)));
   }
 }
 
diff --git a/src/url/url_parse_unittest.cc b/src/url/url_parse_unittest.cc
index 914eba3..a6a6ab7 100644
--- a/src/url/url_parse_unittest.cc
+++ b/src/url/url_parse_unittest.cc
@@ -108,7 +108,7 @@
   if (component.len < 0)
     return false;  // Reference is not NULL but we don't have anything
 
-  if (SbStringGetLength(reference) != static_cast<size_t>(component.len))
+  if (strlen(reference) != static_cast<size_t>(component.len))
     return false;  // Lengths don't match
 
   // Now check the actual characters.
@@ -142,7 +142,7 @@
     "http:",
   };
   for (size_t i = 0; i < arraysize(length_cases); i++) {
-    int true_length = static_cast<int>(SbStringGetLength(length_cases[i]));
+    int true_length = static_cast<int>(strlen(length_cases[i]));
 
     Parsed parsed;
     ParseStandardURL(length_cases[i], true_length, &parsed);
@@ -201,7 +201,7 @@
     {"file:///c:/foo", Parsed::PATH, true, 7},
   };
   for (size_t i = 0; i < arraysize(count_cases); i++) {
-    int length = static_cast<int>(SbStringGetLength(count_cases[i].url));
+    int length = static_cast<int>(strlen(count_cases[i].url));
 
     // Simple test to distinguish file and standard URLs.
     Parsed parsed;
@@ -320,7 +320,7 @@
   Parsed parsed;
   for (size_t i = 0; i < arraysize(cases); i++) {
     const char* url = cases[i].input;
-    ParseStandardURL(url, static_cast<int>(SbStringGetLength(url)), &parsed);
+    ParseStandardURL(url, static_cast<int>(strlen(url)), &parsed);
     int port = ParsePort(url, parsed.port);
 
     EXPECT_TRUE(ComponentMatches(url, cases[i].scheme, parsed.scheme));
@@ -355,7 +355,7 @@
   Parsed parsed;
   for (size_t i = 0; i < arraysize(path_cases); i++) {
     const char* url = path_cases[i].input;
-    ParsePathURL(url, static_cast<int>(SbStringGetLength(url)), false, &parsed);
+    ParsePathURL(url, static_cast<int>(strlen(url)), false, &parsed);
 
     EXPECT_TRUE(ComponentMatches(url, path_cases[i].scheme, parsed.scheme))
         << i;
@@ -454,7 +454,7 @@
   Parsed parsed;
   for (size_t i = 0; i < arraysize(file_cases); i++) {
     const char* url = file_cases[i].input;
-    ParseFileURL(url, static_cast<int>(SbStringGetLength(url)), &parsed);
+    ParseFileURL(url, static_cast<int>(strlen(url)), &parsed);
     int port = ParsePort(url, parsed.port);
 
     EXPECT_TRUE(ComponentMatches(url, file_cases[i].scheme, parsed.scheme))
@@ -515,7 +515,7 @@
 
   for (size_t i = 0; i < arraysize(file_cases); i++) {
     const char* url = file_cases[i].input;
-    int len = static_cast<int>(SbStringGetLength(url));
+    int len = static_cast<int>(strlen(url));
 
     Parsed parsed;
     ParseStandardURL(url, len, &parsed);
@@ -535,7 +535,7 @@
                            const char* expected_key,
                            const char* expected_value) {
   Parsed parsed;
-  ParseStandardURL(url, static_cast<int>(SbStringGetLength(url)), &parsed);
+  ParseStandardURL(url, static_cast<int>(strlen(url)), &parsed);
 
   Component query = parsed.query;
 
@@ -623,7 +623,7 @@
   Parsed parsed;
   for (size_t i = 0; i < arraysize(mailto_cases); ++i) {
     const char* url = mailto_cases[i].input;
-    ParseMailtoURL(url, static_cast<int>(SbStringGetLength(url)), &parsed);
+    ParseMailtoURL(url, static_cast<int>(strlen(url)), &parsed);
     int port = ParsePort(url, parsed.port);
 
     EXPECT_TRUE(ComponentMatches(url, mailto_cases[i].scheme, parsed.scheme));
@@ -656,7 +656,7 @@
   for (size_t i = 0; i < arraysize(filesystem_cases); i++) {
     const FileSystemURLParseCase* parsecase = &filesystem_cases[i];
     const char* url = parsecase->input;
-    ParseFileSystemURL(url, static_cast<int>(SbStringGetLength(url)), &parsed);
+    ParseFileSystemURL(url, static_cast<int>(strlen(url)), &parsed);
 
     EXPECT_TRUE(ComponentMatches(url, "filesystem", parsed.scheme));
     EXPECT_EQ(!parsecase->inner_scheme, !parsed.inner_parsed());
diff --git a/src/url/url_util.cc b/src/url/url_util.cc
index dbd8603..9b2f2fb 100644
--- a/src/url/url_util.cc
+++ b/src/url/url_util.cc
@@ -472,7 +472,7 @@
   DCHECK(!scheme_registries_locked)
       << "Trying to add a scheme after the lists have been locked.";
 
-  size_t scheme_len = SbStringGetLength(new_scheme);
+  size_t scheme_len = strlen(new_scheme);
   if (scheme_len == 0)
     return;
 
@@ -494,7 +494,7 @@
   DCHECK(!scheme_registries_locked)
       << "Trying to add a scheme after the lists have been locked.";
 
-  size_t scheme_len = SbStringGetLength(new_scheme);
+  size_t scheme_len = strlen(new_scheme);
   if (scheme_len == 0)
     return;
 
@@ -503,7 +503,7 @@
   // schemes. This pointer will be leaked on shutdown.
   char* dup_scheme = new char[scheme_len + 1];
   ANNOTATE_LEAKING_OBJECT_PTR(dup_scheme);
-  SbMemoryCopy(dup_scheme, new_scheme, scheme_len + 1);
+  memcpy(dup_scheme, new_scheme, scheme_len + 1);
 
   SchemeWithType scheme_with_type;
   scheme_with_type.scheme = dup_scheme;
diff --git a/src/url/url_util_unittest.cc b/src/url/url_util_unittest.cc
index f4441b2..e3a3789 100644
--- a/src/url/url_util_unittest.cc
+++ b/src/url/url_util_unittest.cc
@@ -32,29 +32,29 @@
   // Simple case where the scheme is found and matches.
   const char kStr1[] = "http://www.com/";
   EXPECT_TRUE(FindAndCompareScheme(
-      kStr1, static_cast<int>(SbStringGetLength(kStr1)), "http", NULL));
+      kStr1, static_cast<int>(strlen(kStr1)), "http", NULL));
   EXPECT_TRUE(FindAndCompareScheme(kStr1,
-                                   static_cast<int>(SbStringGetLength(kStr1)),
+                                   static_cast<int>(strlen(kStr1)),
                                    "http", &found_scheme));
   EXPECT_TRUE(found_scheme == Component(0, 4));
 
   // A case where the scheme is found and doesn't match.
   EXPECT_FALSE(FindAndCompareScheme(kStr1,
-                                    static_cast<int>(SbStringGetLength(kStr1)),
+                                    static_cast<int>(strlen(kStr1)),
                                     "https", &found_scheme));
   EXPECT_TRUE(found_scheme == Component(0, 4));
 
   // A case where there is no scheme.
   const char kStr2[] = "httpfoobar";
   EXPECT_FALSE(FindAndCompareScheme(kStr2,
-                                    static_cast<int>(SbStringGetLength(kStr2)),
+                                    static_cast<int>(strlen(kStr2)),
                                     "http", &found_scheme));
   EXPECT_TRUE(found_scheme == Component());
 
   // When there is an empty scheme, it should match the empty scheme.
   const char kStr3[] = ":foo.com/";
   EXPECT_TRUE(FindAndCompareScheme(
-      kStr3, static_cast<int>(SbStringGetLength(kStr3)), "", &found_scheme));
+      kStr3, static_cast<int>(strlen(kStr3)), "", &found_scheme));
   EXPECT_TRUE(found_scheme == Component(0, 0));
 
   // But when there is no scheme, it should fail.
@@ -65,7 +65,7 @@
   // before comparison.
   const char whtspc_str[] = " \r\n\tjav\ra\nscri\tpt:alert(1)";
   EXPECT_TRUE(FindAndCompareScheme(
-      whtspc_str, static_cast<int>(SbStringGetLength(whtspc_str)), "javascript",
+      whtspc_str, static_cast<int>(strlen(whtspc_str)), "javascript",
       &found_scheme));
   EXPECT_TRUE(found_scheme == Component(1, 10));
 
@@ -73,7 +73,7 @@
   // middle.
   const char ctrl_str[] = "\02jav\02scr\03ipt:alert(1)";
   EXPECT_FALSE(FindAndCompareScheme(
-      ctrl_str, static_cast<int>(SbStringGetLength(ctrl_str)), "javascript",
+      ctrl_str, static_cast<int>(strlen(ctrl_str)), "javascript",
       &found_scheme));
   EXPECT_TRUE(found_scheme == Component(1, 11));
 }
@@ -81,30 +81,30 @@
 TEST_F(URLUtilTest, IsStandard) {
   const char kHTTPScheme[] = "http";
   EXPECT_TRUE(
-      IsStandard(kHTTPScheme, Component(0, SbStringGetLength(kHTTPScheme))));
+      IsStandard(kHTTPScheme, Component(0, strlen(kHTTPScheme))));
 
   const char kFooScheme[] = "foo";
   EXPECT_FALSE(
-      IsStandard(kFooScheme, Component(0, SbStringGetLength(kFooScheme))));
+      IsStandard(kFooScheme, Component(0, strlen(kFooScheme))));
 }
 
 TEST_F(URLUtilTest, IsReferrerScheme) {
   const char kHTTPScheme[] = "http";
   EXPECT_TRUE(IsReferrerScheme(kHTTPScheme,
-                               Component(0, SbStringGetLength(kHTTPScheme))));
+                               Component(0, strlen(kHTTPScheme))));
 
   const char kFooScheme[] = "foo";
   EXPECT_FALSE(IsReferrerScheme(kFooScheme,
-                                Component(0, SbStringGetLength(kFooScheme))));
+                                Component(0, strlen(kFooScheme))));
 }
 
 TEST_F(URLUtilTest, AddReferrerScheme) {
   const char kFooScheme[] = "foo";
   EXPECT_FALSE(IsReferrerScheme(kFooScheme,
-                                Component(0, SbStringGetLength(kFooScheme))));
+                                Component(0, strlen(kFooScheme))));
   AddReferrerScheme(kFooScheme, url::SCHEME_WITH_HOST);
   EXPECT_TRUE(IsReferrerScheme(kFooScheme,
-                               Component(0, SbStringGetLength(kFooScheme))));
+                               Component(0, strlen(kFooScheme))));
 }
 
 TEST_F(URLUtilTest, GetStandardSchemeType) {
@@ -113,20 +113,20 @@
   const char kHTTPScheme[] = "http";
   scheme_type = url::SCHEME_WITHOUT_AUTHORITY;
   EXPECT_TRUE(GetStandardSchemeType(
-      kHTTPScheme, Component(0, SbStringGetLength(kHTTPScheme)), &scheme_type));
+      kHTTPScheme, Component(0, strlen(kHTTPScheme)), &scheme_type));
   EXPECT_EQ(url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, scheme_type);
 
   const char kFilesystemScheme[] = "filesystem";
   scheme_type = url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION;
   EXPECT_TRUE(GetStandardSchemeType(
-      kFilesystemScheme, Component(0, SbStringGetLength(kFilesystemScheme)),
+      kFilesystemScheme, Component(0, strlen(kFilesystemScheme)),
       &scheme_type));
   EXPECT_EQ(url::SCHEME_WITHOUT_AUTHORITY, scheme_type);
 
   const char kFooScheme[] = "foo";
   scheme_type = url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION;
   EXPECT_FALSE(GetStandardSchemeType(
-      kFooScheme, Component(0, SbStringGetLength(kFooScheme)), &scheme_type));
+      kFooScheme, Component(0, strlen(kFooScheme)), &scheme_type));
 }
 
 TEST_F(URLUtilTest, ReplaceComponents) {
@@ -156,11 +156,11 @@
   // Make sure the input is canonicalized.
   RawCanonOutput<32> original;
   Parsed original_parsed;
-  Canonicalize(base_url, SbStringGetLength(base_url), true, NULL, &original,
+  Canonicalize(base_url, strlen(base_url), true, NULL, &original,
                &original_parsed);
 
   Replacements<char> replacements;
-  replacements.SetScheme(scheme, Component(0, SbStringGetLength(scheme)));
+  replacements.SetScheme(scheme, Component(0, strlen(scheme)));
 
   std::string output_string;
   StdStringCanonOutput output(&output_string);
@@ -237,7 +237,7 @@
     RawCanonOutputT<base::char16> output;
     EXPECT_EQ(
         decode_cases[i].result,
-        DecodeURLEscapeSequences(input, SbStringGetLength(input), &output));
+        DecodeURLEscapeSequences(input, strlen(input), &output));
     EXPECT_EQ(decode_cases[i].output,
               base::UTF16ToUTF8(base::string16(output.data(),
                                                output.length())));
@@ -246,7 +246,7 @@
   // Our decode should decode %00
   const char zero_input[] = "%00";
   RawCanonOutputT<base::char16> zero_output;
-  DecodeURLEscapeSequences(zero_input, SbStringGetLength(zero_input),
+  DecodeURLEscapeSequences(zero_input, strlen(zero_input),
                            &zero_output);
   EXPECT_NE("%00", base::UTF16ToUTF8(
       base::string16(zero_output.data(), zero_output.length())));
@@ -260,7 +260,7 @@
     EXPECT_EQ(
         DecodeURLResult::kIsomorphic,
         DecodeURLEscapeSequences(
-            invalid_input, SbStringGetLength(invalid_input), &invalid_output));
+            invalid_input, strlen(invalid_input), &invalid_output));
     EXPECT_EQ(base::string16(invalid_expected),
               base::string16(invalid_output.data(), invalid_output.length()));
   }
@@ -272,7 +272,7 @@
     EXPECT_EQ(
         DecodeURLResult::kIsomorphic,
         DecodeURLEscapeSequences(
-            invalid_input, SbStringGetLength(invalid_input), &invalid_output));
+            invalid_input, strlen(invalid_input), &invalid_output));
     EXPECT_EQ(base::string16(invalid_expected),
               base::string16(invalid_output.data(), invalid_output.length()));
   }
@@ -305,7 +305,7 @@
   for (size_t i = 0; i < arraysize(encode_cases); i++) {
     const char* input = encode_cases[i].input;
     RawCanonOutputT<char> buffer;
-    EncodeURIComponent(input, SbStringGetLength(input), &buffer);
+    EncodeURIComponent(input, strlen(input), &buffer);
     std::string output(buffer.data(), buffer.length());
     EXPECT_EQ(encode_cases[i].output, output);
   }
@@ -382,15 +382,15 @@
   for (size_t i = 0; i < arraysize(resolve_non_standard_cases); i++) {
     const ResolveRelativeCase& test_data = resolve_non_standard_cases[i];
     Parsed base_parsed;
-    ParsePathURL(test_data.base, SbStringGetLength(test_data.base), false,
+    ParsePathURL(test_data.base, strlen(test_data.base), false,
                  &base_parsed);
 
     std::string resolved;
     StdStringCanonOutput output(&resolved);
     Parsed resolved_parsed;
     bool valid = ResolveRelative(
-        test_data.base, SbStringGetLength(test_data.base), base_parsed,
-        test_data.rel, SbStringGetLength(test_data.rel), NULL, &output,
+        test_data.base, strlen(test_data.base), base_parsed,
+        test_data.rel, strlen(test_data.rel), NULL, &output,
         &resolved_parsed);
     output.Complete();
 
@@ -407,15 +407,15 @@
   const char* rel = "any#body";
 
   Parsed base_parsed;
-  ParsePathURL(base, SbStringGetLength(base), false, &base_parsed);
+  ParsePathURL(base, strlen(base), false, &base_parsed);
 
   std::string resolved;
   StdStringCanonOutput output(&resolved);
   Parsed resolved_parsed;
 
   bool valid =
-      ResolveRelative(base, SbStringGetLength(base), base_parsed, rel,
-                      SbStringGetLength(rel), NULL, &output, &resolved_parsed);
+      ResolveRelative(base, strlen(base), base_parsed, rel,
+                      strlen(rel), NULL, &output, &resolved_parsed);
   EXPECT_TRUE(valid);
   EXPECT_FALSE(resolved_parsed.ref.is_valid());
 }
@@ -451,14 +451,14 @@
   for (const auto& test : cases) {
     SCOPED_TRACE(::testing::Message() << test.base << ", " << test.rel);
     Parsed base_parsed;
-    ParseStandardURL(test.base, SbStringGetLength(test.base), &base_parsed);
+    ParseStandardURL(test.base, strlen(test.base), &base_parsed);
 
     std::string resolved;
     StdStringCanonOutput output(&resolved);
     Parsed resolved_parsed;
     bool valid = ResolveRelative(
-        test.base, SbStringGetLength(test.base), base_parsed, test.rel,
-        SbStringGetLength(test.rel), NULL, &output, &resolved_parsed);
+        test.base, strlen(test.base), base_parsed, test.rel,
+        strlen(test.rel), NULL, &output, &resolved_parsed);
     ASSERT_TRUE(valid);
     output.Complete();
 
