Import Cobalt 22.master.0.303007

Includes the following patches:
  https://cobalt-review.googlesource.com/c/cobalt/+/5870
    by g.jiang@samsung.com
  https://cobalt-review.googlesource.com/c/cobalt/+/6078
    by zj.huang@samsung.corp-partner.google.com
  https://cobalt-review.googlesource.com/c/cobalt/+/6110
    by zj.huang@samsung.corp-partner.google.com
  https://cobalt-review.googlesource.com/c/cobalt/+/6085
    by xnicole.chen@samsung.com
  https://cobalt-review.googlesource.com/c/cobalt/+/6079
    by zj.huang@samsung.corp-partner.google.com
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();